@wise/dynamic-flow-client 5.28.0 → 5.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. package/build/tsconfig.types.tsbuildinfo +1 -1
  2. package/package.json +1 -1
  3. package/build/DynamicFlowCore.js +0 -5
  4. package/build/common/capabilities/getHttpClientWithCapabilities.js +0 -41
  5. package/build/common/capabilities/getHttpClientWithCapabilities.test.js +0 -106
  6. package/build/common/capabilities/index.js +0 -1
  7. package/build/common/errorBoundary/ErrorBoundary.js +0 -26
  8. package/build/common/errorBoundary/ErrorBoundary.test.js +0 -29
  9. package/build/common/errorBoundary/ErrorBoundaryAlert.js +0 -11
  10. package/build/common/makeHttpClient/api-utils.js +0 -3
  11. package/build/common/makeHttpClient/index.js +0 -1
  12. package/build/common/makeHttpClient/makeHttpClient.js +0 -10
  13. package/build/common/makeHttpClient/makeHttpClient.test.js +0 -186
  14. package/build/common/messages/download.messages.js +0 -18
  15. package/build/common/messages/external-confirmation.messages.js +0 -23
  16. package/build/common/messages/file-upload.messages.js +0 -13
  17. package/build/common/messages/generic-error.messages.js +0 -18
  18. package/build/common/messages/help.messages.js +0 -8
  19. package/build/common/messages/multi-file-upload.messages.js +0 -18
  20. package/build/common/messages/multi-select.messages.js +0 -8
  21. package/build/common/messages/paragraph.messages.js +0 -13
  22. package/build/common/messages/repeatable.messages.js +0 -23
  23. package/build/common/messages/search.messages.js +0 -8
  24. package/build/common/messages/validation.array.messages.js +0 -13
  25. package/build/common/messages/validation.messages.js +0 -53
  26. package/build/controller/FlowController.js +0 -400
  27. package/build/controller/executeDownload.js +0 -86
  28. package/build/controller/executePoll.js +0 -65
  29. package/build/controller/executeRefresh.js +0 -45
  30. package/build/controller/executeRequest.js +0 -93
  31. package/build/controller/executeSubflow.js +0 -71
  32. package/build/controller/executeSubmission.js +0 -68
  33. package/build/controller/getErrorMessage.js +0 -7
  34. package/build/controller/getFilenameFromContentDisposition.js +0 -47
  35. package/build/controller/getFilenameFromContentDisposition.test.js +0 -47
  36. package/build/controller/getRequestAbortController.js +0 -13
  37. package/build/controller/getResponseType.js +0 -35
  38. package/build/controller/getSafeHttpClient.js +0 -8
  39. package/build/controller/getStepCounter.js +0 -16
  40. package/build/controller/handleErrorResponse.js +0 -26
  41. package/build/controller/makeSafeHttpClient.js +0 -8
  42. package/build/controller/response-utils.js +0 -72
  43. package/build/controller/response-utils.test.js +0 -52
  44. package/build/domain/components/AlertComponent.js +0 -2
  45. package/build/domain/components/AllOfComponent.js +0 -47
  46. package/build/domain/components/BooleanInputComponent.js +0 -48
  47. package/build/domain/components/BoxComponent.js +0 -12
  48. package/build/domain/components/ButtonComponent.js +0 -2
  49. package/build/domain/components/ColumnsComponent.js +0 -12
  50. package/build/domain/components/ConstComponent.js +0 -20
  51. package/build/domain/components/ContainerComponent.js +0 -12
  52. package/build/domain/components/DateInputComponent.js +0 -73
  53. package/build/domain/components/DecisionComponent.js +0 -2
  54. package/build/domain/components/DividerComponent.js +0 -2
  55. package/build/domain/components/FormComponent.js +0 -12
  56. package/build/domain/components/FormattedValueComponent.js +0 -47
  57. package/build/domain/components/HeadingComponent.js +0 -2
  58. package/build/domain/components/ImageComponent.js +0 -2
  59. package/build/domain/components/InstructionsComponent.js +0 -2
  60. package/build/domain/components/IntegerInputComponent.js +0 -75
  61. package/build/domain/components/ListComponent.js +0 -2
  62. package/build/domain/components/LoadingIndicatorComponent.js +0 -2
  63. package/build/domain/components/MarkdownComponent.js +0 -2
  64. package/build/domain/components/MediaComponent.js +0 -2
  65. package/build/domain/components/ModalComponent.js +0 -20
  66. package/build/domain/components/ModalLayoutComponent.js +0 -12
  67. package/build/domain/components/MoneyInputComponent.js +0 -56
  68. package/build/domain/components/MultiSelectInputComponent.js +0 -86
  69. package/build/domain/components/MultiUploadInputComponent.js +0 -86
  70. package/build/domain/components/NumberInputComponent.js +0 -74
  71. package/build/domain/components/ObjectComponent.js +0 -54
  72. package/build/domain/components/ParagraphComponent.js +0 -2
  73. package/build/domain/components/PersistAsyncComponent.js +0 -96
  74. package/build/domain/components/ProgressComponent.js +0 -2
  75. package/build/domain/components/RepeatableComponent.js +0 -106
  76. package/build/domain/components/ReviewComponent.js +0 -2
  77. package/build/domain/components/RootDomainComponent.js +0 -193
  78. package/build/domain/components/SectionComponent.js +0 -12
  79. package/build/domain/components/SelectInputComponent.js +0 -96
  80. package/build/domain/components/StatusListComponent.js +0 -2
  81. package/build/domain/components/SubflowComponent.js +0 -19
  82. package/build/domain/components/TabsComponent.js +0 -2
  83. package/build/domain/components/TextInputComponent.js +0 -77
  84. package/build/domain/components/TupleComponent.js +0 -48
  85. package/build/domain/components/UpdatableComponent.js +0 -46
  86. package/build/domain/components/UploadInputComponent.js +0 -78
  87. package/build/domain/components/UpsellComponent.js +0 -26
  88. package/build/domain/components/collectionComponent/CollectionComponent.js +0 -174
  89. package/build/domain/components/collectionComponent/CollectionComponent.test.js +0 -286
  90. package/build/domain/components/collectionComponent/types.js +0 -1
  91. package/build/domain/components/searchComponent/SearchComponent.js +0 -91
  92. package/build/domain/components/searchComponent/SearchComponent.test.js +0 -190
  93. package/build/domain/components/step/ExternalConfirmationComponent.js +0 -27
  94. package/build/domain/components/step/StepDomainComponent.js +0 -153
  95. package/build/domain/components/step/ToolbarComponent.js +0 -1
  96. package/build/domain/components/utils/component-utils.js +0 -12
  97. package/build/domain/components/utils/debounce.js +0 -34
  98. package/build/domain/components/utils/debounce.test.js +0 -67
  99. package/build/domain/components/utils/file-utils.js +0 -21
  100. package/build/domain/components/utils/file-utils.test.js +0 -27
  101. package/build/domain/components/utils/getRandomId.js +0 -1
  102. package/build/domain/components/utils/isExactLocalValueMatch.js +0 -14
  103. package/build/domain/components/utils/isOrWasValid.js +0 -5
  104. package/build/domain/components/utils/isPartialModelMatch.js +0 -18
  105. package/build/domain/components/utils/isPartialModelMatch.test.js +0 -74
  106. package/build/domain/features/collection/getPerformCollectionQuery.js +0 -80
  107. package/build/domain/features/collection/getPerformCollectionQuery.test.js +0 -223
  108. package/build/domain/features/delay/getStepDelays.js +0 -37
  109. package/build/domain/features/delay/getStepDelays.test.js +0 -69
  110. package/build/domain/features/domain-event-bus/DomainEventBus.js +0 -24
  111. package/build/domain/features/domain-event-bus/index.js +0 -1
  112. package/build/domain/features/domain-event-bus/types.js +0 -1
  113. package/build/domain/features/eventNames.js +0 -41
  114. package/build/domain/features/events.js +0 -5
  115. package/build/domain/features/persistAsync/getComponentMultiPersistAsync.js +0 -50
  116. package/build/domain/features/persistAsync/getInitialPersistedState.js +0 -7
  117. package/build/domain/features/persistAsync/getPerformPersistAsync.js +0 -43
  118. package/build/domain/features/persistAsync/getPerformPersistAsync.test.js +0 -139
  119. package/build/domain/features/polling/getStepPolling.js +0 -50
  120. package/build/domain/features/polling/getStepPolling.test.js +0 -115
  121. package/build/domain/features/prefetch/getStepPrefetch.js +0 -56
  122. package/build/domain/features/prefetch/request-cache.js +0 -49
  123. package/build/domain/features/prefetch/request-cache.test.js +0 -70
  124. package/build/domain/features/refreshAfter/getStepRefreshAfter.js +0 -24
  125. package/build/domain/features/refreshAfter/getStepRefreshAfter.test.js +0 -40
  126. package/build/domain/features/schema-on-change/getDebouncedSchemaOnChange.js +0 -50
  127. package/build/domain/features/schema-on-change/getSchemaOnChange.js +0 -38
  128. package/build/domain/features/search/getPerformSearchFunction.js +0 -75
  129. package/build/domain/features/search/getPerformSearchFunction.test.js +0 -301
  130. package/build/domain/features/summary/summary-utils.js +0 -37
  131. package/build/domain/features/summary/summary-utils.test.js +0 -125
  132. package/build/domain/features/updatable/getPerformUpdateQuery.js +0 -52
  133. package/build/domain/features/utils/http-utils.js +0 -21
  134. package/build/domain/features/utils/response-utils.js +0 -9
  135. package/build/domain/features/validation/date-availability.js +0 -54
  136. package/build/domain/features/validation/date-availability.test.js +0 -54
  137. package/build/domain/features/validation/getPatternRegExp.js +0 -25
  138. package/build/domain/features/validation/spec-utils.js +0 -23
  139. package/build/domain/features/validation/validation-functions.js +0 -6
  140. package/build/domain/features/validation/validation-functions.test.js +0 -108
  141. package/build/domain/features/validation/value-checks.js +0 -130
  142. package/build/domain/features/validation/value-checks.test.js +0 -297
  143. package/build/domain/features/validationAsync/getComponentValidationAsync.js +0 -57
  144. package/build/domain/features/validationAsync/getComponentValidationAsync.test.js +0 -67
  145. package/build/domain/features/validationAsync/getInitialValidationAsyncState.js +0 -6
  146. package/build/domain/features/validationAsync/getPerformValidationAsync.js +0 -46
  147. package/build/domain/features/validationAsync/getPerformValidationAsync.test.js +0 -162
  148. package/build/domain/handlers/dismissHandler.js +0 -11
  149. package/build/domain/mappers/layout/alertLayoutToComponent.js +0 -18
  150. package/build/domain/mappers/layout/boxLayoutToComponent.js +0 -13
  151. package/build/domain/mappers/layout/buttonLayoutToComponent.js +0 -77
  152. package/build/domain/mappers/layout/collectionLayoutToComponent.js +0 -49
  153. package/build/domain/mappers/layout/columnsLayoutToComponent.js +0 -13
  154. package/build/domain/mappers/layout/decisionLayoutToComponent.js +0 -24
  155. package/build/domain/mappers/layout/deprecatedListLayoutToComponent.js +0 -30
  156. package/build/domain/mappers/layout/dividerLayoutToComponent.js +0 -2
  157. package/build/domain/mappers/layout/formLayoutToComponent.js +0 -19
  158. package/build/domain/mappers/layout/headingLayoutToComponent.js +0 -12
  159. package/build/domain/mappers/layout/imageLayoutToComponent.js +0 -17
  160. package/build/domain/mappers/layout/infoLayoutToComponent.js +0 -12
  161. package/build/domain/mappers/layout/instructionsLayoutToComponent.js +0 -12
  162. package/build/domain/mappers/layout/listLayoutToComponent.js +0 -39
  163. package/build/domain/mappers/layout/loadingIndicatorLayoutToComponent.js +0 -9
  164. package/build/domain/mappers/layout/markdownLayoutToComponent.js +0 -12
  165. package/build/domain/mappers/layout/mediaLayoutToComponent.js +0 -12
  166. package/build/domain/mappers/layout/modalLayoutToComponent.js +0 -17
  167. package/build/domain/mappers/layout/modalToComponent.js +0 -8
  168. package/build/domain/mappers/layout/paragraphLayoutToComponent.js +0 -12
  169. package/build/domain/mappers/layout/progressLayoutToComponent.js +0 -15
  170. package/build/domain/mappers/layout/reviewLayoutToComponent.js +0 -49
  171. package/build/domain/mappers/layout/searchLayoutToComponent.js +0 -44
  172. package/build/domain/mappers/layout/sectionLayoutToComponent.js +0 -16
  173. package/build/domain/mappers/layout/statusListLayoutToComponent.js +0 -15
  174. package/build/domain/mappers/layout/tabsLayoutToComponent.js +0 -16
  175. package/build/domain/mappers/layout/updatableLayoutToComponent.js +0 -39
  176. package/build/domain/mappers/layout/upsellLayoutToComponent.js +0 -18
  177. package/build/domain/mappers/mapLayoutToComponent.js +0 -87
  178. package/build/domain/mappers/mapSchemaToComponent.js +0 -65
  179. package/build/domain/mappers/mapSchemaToComponent.test.js +0 -116
  180. package/build/domain/mappers/mapStepSchemas.js +0 -14
  181. package/build/domain/mappers/mapStepToComponent.js +0 -145
  182. package/build/domain/mappers/mapStepToComponent.test.js +0 -319
  183. package/build/domain/mappers/mapToolbarToComponent.js +0 -15
  184. package/build/domain/mappers/schema/allOfSchemaToComponent.js +0 -17
  185. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToComponent.js +0 -26
  186. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToMultiSelectComponent.js +0 -56
  187. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToMultiUploadComponent.js +0 -66
  188. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToRepeatableComponent.js +0 -58
  189. package/build/domain/mappers/schema/arraySchemaToComponent/arraySchemaToTupleComponent.js +0 -18
  190. package/build/domain/mappers/schema/blobSchemaToComponent.js +0 -15
  191. package/build/domain/mappers/schema/booleanSchemaToComponent.js +0 -29
  192. package/build/domain/mappers/schema/constSchemaToComponent.js +0 -23
  193. package/build/domain/mappers/schema/dateSchemaToComponent.js +0 -56
  194. package/build/domain/mappers/schema/dateSchemaToComponent.test.js +0 -112
  195. package/build/domain/mappers/schema/integerSchemaToComponent.js +0 -28
  196. package/build/domain/mappers/schema/numberSchemaToComponent.js +0 -26
  197. package/build/domain/mappers/schema/objectSchemaToComponent/assertDisplayOrder.js +0 -23
  198. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToFormattedValueComponent.js +0 -9
  199. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToMoneyInputComponent.js +0 -119
  200. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToMoneyInputComponent.test.js +0 -97
  201. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToObjectComponent.js +0 -32
  202. package/build/domain/mappers/schema/objectSchemaToComponent/objectSchemaToObjectComponent.test.js +0 -99
  203. package/build/domain/mappers/schema/oneOfSchemaToComponent/oneOfSchemaToComponent.js +0 -67
  204. package/build/domain/mappers/schema/oneOfSchemaToComponent/oneOfSchemaToComponent.test.js +0 -225
  205. package/build/domain/mappers/schema/persistAsyncSchemaToComponent.js +0 -29
  206. package/build/domain/mappers/schema/stringSchemaToComponent/stringSchemaToComponent.js +0 -18
  207. package/build/domain/mappers/schema/stringSchemaToComponent/stringSchemaToComponent.test.js +0 -133
  208. package/build/domain/mappers/schema/stringSchemaToComponent/stringSchemaToTextInputComponent.js +0 -38
  209. package/build/domain/mappers/schema/stringSchemaToComponent/stringSchemaToUploadInputComponent.js +0 -28
  210. package/build/domain/mappers/schema/tests/test-utils.js +0 -16
  211. package/build/domain/mappers/schema/types.js +0 -1
  212. package/build/domain/mappers/schema/utils/getPerformPersistAsyncFn.js +0 -19
  213. package/build/domain/mappers/schema/utils/getValidationAsyncInitialState.js +0 -23
  214. package/build/domain/mappers/schema/utils/mapCommonSchemaProps.js +0 -16
  215. package/build/domain/mappers/types.js +0 -1
  216. package/build/domain/mappers/utils/FeatureFlags.js +0 -22
  217. package/build/domain/mappers/utils/behavior-utils.js +0 -52
  218. package/build/domain/mappers/utils/call-to-action-utils.js +0 -24
  219. package/build/domain/mappers/utils/getAutocompleteString.js +0 -76
  220. package/build/domain/mappers/utils/getAutocompleteString.test.js +0 -21
  221. package/build/domain/mappers/utils/getHrefWithTracking.js +0 -16
  222. package/build/domain/mappers/utils/groupLayoutByPinned.js +0 -38
  223. package/build/domain/mappers/utils/groupLayoutByPinned.test.js +0 -166
  224. package/build/domain/mappers/utils/image.js +0 -6
  225. package/build/domain/mappers/utils/layout-utils.js +0 -11
  226. package/build/domain/mappers/utils/legacy-utils.js +0 -49
  227. package/build/domain/mappers/utils/media-utils.js +0 -14
  228. package/build/domain/mappers/utils/suggestions-utils.js +0 -26
  229. package/build/domain/mappers/utils/suggestions-utils.test.js +0 -36
  230. package/build/domain/mappers/utils/tags-utils.js +0 -1
  231. package/build/domain/mappers/utils/utils.js +0 -45
  232. package/build/domain/types.js +0 -1
  233. package/build/i18n/index.js +0 -40
  234. package/build/index.js +0 -9
  235. package/build/renderers/CoreContainerRenderer.js +0 -5
  236. package/build/renderers/CoreRootRenderer.js +0 -12
  237. package/build/renderers/EmptyLoadingStateRenderer.js +0 -5
  238. package/build/renderers/getRenderFunction.js +0 -24
  239. package/build/renderers/getSchemaErrorMessageFunction.js +0 -111
  240. package/build/renderers/mappers/alertComponentToProps.js +0 -3
  241. package/build/renderers/mappers/allOfComponentToProps.js +0 -6
  242. package/build/renderers/mappers/booleanInputComponentToProps.js +0 -3
  243. package/build/renderers/mappers/boxComponentToProps.js +0 -13
  244. package/build/renderers/mappers/buttonComponentToProps.js +0 -4
  245. package/build/renderers/mappers/collectionComponentToProps.js +0 -11
  246. package/build/renderers/mappers/columnsComponentToProps.js +0 -8
  247. package/build/renderers/mappers/componentToRendererProps.js +0 -168
  248. package/build/renderers/mappers/constComponentToProps.js +0 -5
  249. package/build/renderers/mappers/containerComponentToProps.js +0 -8
  250. package/build/renderers/mappers/dateInputComponentToProps.js +0 -3
  251. package/build/renderers/mappers/decisionComponentToProps.js +0 -16
  252. package/build/renderers/mappers/dividerComponentToProps.js +0 -2
  253. package/build/renderers/mappers/externalComponentToProps.js +0 -4
  254. package/build/renderers/mappers/formComponentToProps.js +0 -8
  255. package/build/renderers/mappers/formattedValueComponentToProps.js +0 -5
  256. package/build/renderers/mappers/headingComponentToProps.js +0 -2
  257. package/build/renderers/mappers/hiddenComponentToProps.js +0 -1
  258. package/build/renderers/mappers/imageComponentToProps.js +0 -2
  259. package/build/renderers/mappers/instructionsComponentToProps.js +0 -2
  260. package/build/renderers/mappers/integerInputComponentToProps.js +0 -3
  261. package/build/renderers/mappers/listComponentToProps.js +0 -3
  262. package/build/renderers/mappers/loadingIndicatorComponentToProps.js +0 -2
  263. package/build/renderers/mappers/markdownComponentToProps.js +0 -2
  264. package/build/renderers/mappers/mediaComponentToProps.js +0 -2
  265. package/build/renderers/mappers/modalComponentToProps.js +0 -8
  266. package/build/renderers/mappers/modalLayoutComponentToProps.js +0 -13
  267. package/build/renderers/mappers/moneyInputComponentToProps.js +0 -36
  268. package/build/renderers/mappers/multiSelectComponentToProps.js +0 -19
  269. package/build/renderers/mappers/multiUploadInputComponentToProps.js +0 -7
  270. package/build/renderers/mappers/numberInputComponentToProps.js +0 -3
  271. package/build/renderers/mappers/objectComponentToProps.js +0 -8
  272. package/build/renderers/mappers/paragraphComponentToProps.js +0 -2
  273. package/build/renderers/mappers/persistAsyncComponentToProps.js +0 -7
  274. package/build/renderers/mappers/progressComponentToProps.js +0 -2
  275. package/build/renderers/mappers/repeatableComponentToProps.js +0 -22
  276. package/build/renderers/mappers/reviewComponentToProps.js +0 -3
  277. package/build/renderers/mappers/rootComponentToProps.js +0 -20
  278. package/build/renderers/mappers/searchComponentToProps.js +0 -45
  279. package/build/renderers/mappers/sectionComponentToProps.js +0 -7
  280. package/build/renderers/mappers/selectInputComponentToProps.js +0 -34
  281. package/build/renderers/mappers/statusListComponentToProps.js +0 -3
  282. package/build/renderers/mappers/subflowComponentToRendererProps.js +0 -26
  283. package/build/renderers/mappers/tabsComponentToProps.js +0 -14
  284. package/build/renderers/mappers/textInputComponentToProps.js +0 -3
  285. package/build/renderers/mappers/tupleComponentToProps.js +0 -8
  286. package/build/renderers/mappers/updatableComponentToProps.js +0 -6
  287. package/build/renderers/mappers/uploadInputComponentToProps.js +0 -5
  288. package/build/renderers/mappers/upsellComponentToProps.js +0 -3
  289. package/build/renderers/mappers/utils/getValidationState.js +0 -12
  290. package/build/renderers/mappers/utils/inputComponentToProps.js +0 -17
  291. package/build/renderers/mappers/utils/mapCallToAction.js +0 -23
  292. package/build/renderers/mappers/utils/mapErrorsToValidationState.js +0 -9
  293. package/build/renderers/mappers/utils/mapRendererLoadingState.js +0 -1
  294. package/build/renderers/mappers/utils/pick.js +0 -8
  295. package/build/renderers/mappers/utils/selectInputOptionsToProps.js +0 -11
  296. package/build/renderers/stepComponentToProps.js +0 -32
  297. package/build/renderers/subflow/getDynamicSubflowRenderer.js +0 -13
  298. package/build/renderers/subflow/getNativeSubflowRenderer.js +0 -26
  299. package/build/renderers/utils.js +0 -72
  300. package/build/renderers/utils.test.js +0 -70
  301. package/build/stories/dev-tools/ContainerQueries.story.js +0 -66
  302. package/build/stories/dev-tools/Debugger.story.js +0 -107
  303. package/build/stories/dev-tools/FixtureSelect.story.js +0 -23
  304. package/build/stories/dev-tools/TestServer.story.js +0 -118
  305. package/build/stories/examples/NativeFlow.story.js +0 -80
  306. package/build/stories/examples/Recipients.story.js +0 -568
  307. package/build/stories/spec/behavior/Copy.story.js +0 -71
  308. package/build/stories/spec/behavior/Download.story.js +0 -254
  309. package/build/stories/spec/behavior/DynamicSubflow.story.js +0 -272
  310. package/build/stories/spec/behavior/Link.story.js +0 -40
  311. package/build/stories/spec/behavior/Modal.story.js +0 -79
  312. package/build/stories/spec/behavior/NativeSubflow.story.js +0 -249
  313. package/build/stories/spec/layouts/Alert.story.js +0 -107
  314. package/build/stories/spec/layouts/Box.Container-Widths.3-sizes.story.js +0 -59
  315. package/build/stories/spec/layouts/Box.Container-Widths.story.js +0 -57
  316. package/build/stories/spec/layouts/Box.Viewport-Widths.story.js +0 -64
  317. package/build/stories/spec/layouts/Collection.story.js +0 -294
  318. package/build/stories/spec/layouts/Decision.story.js +0 -241
  319. package/build/stories/spec/layouts/Image.Illustrations.Animated.story.js +0 -37
  320. package/build/stories/spec/layouts/Image.Sizes.story.js +0 -58
  321. package/build/stories/spec/layouts/Modal.story.js +0 -81
  322. package/build/stories/spec/layouts/Search.story.js +0 -325
  323. package/build/stories/spec/layouts/Updatable.story.js +0 -135
  324. package/build/stories/spec/layouts/Upsell.story.js +0 -55
  325. package/build/stories/spec/layouts/button/Button.story.js +0 -111
  326. package/build/stories/spec/layouts/button/PinnedButton.story.js +0 -81
  327. package/build/stories/spec/response/ActionResponse.story.js +0 -66
  328. package/build/stories/spec/schemas/InlineAlert.story.js +0 -134
  329. package/build/stories/spec/schemas/MultiSelect.story.js +0 -206
  330. package/build/stories/spec/schemas/Upload.story.js +0 -168
  331. package/build/stories/spec/schemas/const/ConstLayout.story.js +0 -159
  332. package/build/stories/spec/schemas/const/ObjectConst.story.js +0 -94
  333. package/build/stories/spec/schemas/date/DateSchema.story.js +0 -59
  334. package/build/stories/spec/schemas/features/PersistAsync.story.js +0 -230
  335. package/build/stories/spec/schemas/features/ValidationAsync.story.js +0 -137
  336. package/build/stories/spec/schemas/object/FormattedValue.story.js +0 -92
  337. package/build/stories/spec/schemas/object/MoneyInput.story.js +0 -240
  338. package/build/stories/spec/schemas/oneOf/OneOfInitialisation.story.js +0 -55
  339. package/build/stories/spec/schemas/oneOf/OneOfWithSingleOption.story.js +0 -114
  340. package/build/stories/spec/step/Controls.story.js +0 -110
  341. package/build/stories/spec/step/DFModal.story.js +0 -58
  342. package/build/stories/spec/step/Footer.story.js +0 -90
  343. package/build/stories/spec/step/Navigation.story.js +0 -46
  344. package/build/stories/spec/step/ScrollToBottom.story.js +0 -103
  345. package/build/stories/spec/step/Tags.story.js +0 -39
  346. package/build/stories/spec/step/ToolBar.story.js +0 -60
  347. package/build/stories/spec/step/features/ErrorHandling.story.js +0 -92
  348. package/build/stories/spec/step/features/External.story.js +0 -91
  349. package/build/stories/spec/step/features/LongFormError.story.js +0 -88
  350. package/build/stories/spec/step/features/Polling.story.js +0 -108
  351. package/build/stories/spec/step/features/RefreshAfter.story.js +0 -92
  352. package/build/stories/spec/step/features/refresh/Refresh.story.js +0 -260
  353. package/build/stories/spec/step/features/refresh/RefreshWithPersistAsync.story.js +0 -958
  354. package/build/stories/types.js +0 -1
  355. package/build/stories/utils/fixtureHttpClient.js +0 -70
  356. package/build/stories/utils/getBasicStep.js +0 -223
  357. package/build/stories/utils/mockSearchHandler.js +0 -71
  358. package/build/stories/utils/render-utils.js +0 -59
  359. package/build/stories/visual-tests/layouts/NotUsingListItem.story.js +0 -17
  360. package/build/test-utils/DynamicFlowWise.js +0 -41
  361. package/build/test-utils/DynamicFlowWiseModal.js +0 -34
  362. package/build/test-utils/NeptuneProviders.js +0 -11
  363. package/build/test-utils/component-utils.js +0 -5
  364. package/build/test-utils/dummy-native-subflows-handlers/dummySubflowHandlers.js +0 -45
  365. package/build/test-utils/dummy-native-subflows-handlers/geolocationSubflowHandler.js +0 -30
  366. package/build/test-utils/dummy-native-subflows-handlers/index.js +0 -9
  367. package/build/test-utils/dummy-native-subflows-handlers/notificationPermissionSubflowHandler.js +0 -17
  368. package/build/test-utils/fetch-utils.js +0 -47
  369. package/build/test-utils/getMergedTestRenderers.js +0 -36
  370. package/build/test-utils/getRandomId.js +0 -1
  371. package/build/test-utils/index.js +0 -3
  372. package/build/test-utils/mockIntersectionObserver.js +0 -23
  373. package/build/test-utils/openLinkInNewTab.js +0 -15
  374. package/build/test-utils/rtl-utils.js +0 -7
  375. package/build/test-utils/step-utils.js +0 -6
  376. package/build/test-utils/useSnackBar.js +0 -4
  377. package/build/test-utils/wait.js +0 -3
  378. package/build/tests/AlertLayout.test.js +0 -228
  379. package/build/tests/ArrayTuple.test.js +0 -118
  380. package/build/tests/ButtonLayout.test.js +0 -356
  381. package/build/tests/CollectionLayout.test.js +0 -516
  382. package/build/tests/ConstLayout.test.js +0 -95
  383. package/build/tests/DateInput.test.js +0 -190
  384. package/build/tests/DateSchema.test.js +0 -84
  385. package/build/tests/DecisionLayout.test.js +0 -146
  386. package/build/tests/DelayBehavior.test.js +0 -186
  387. package/build/tests/Download.test.js +0 -201
  388. package/build/tests/DynamicFlow.test.js +0 -147
  389. package/build/tests/External.test.js +0 -169
  390. package/build/tests/Flow.test.js +0 -328
  391. package/build/tests/FormLayout.test.js +0 -28
  392. package/build/tests/FormattedValue.test.js +0 -107
  393. package/build/tests/ImageRenderer.test.js +0 -78
  394. package/build/tests/InitialAction.test.js +0 -235
  395. package/build/tests/InitialStep.test.js +0 -168
  396. package/build/tests/InstructionsLayout.test.js +0 -45
  397. package/build/tests/ListLayout.test.js +0 -165
  398. package/build/tests/Logging.test.js +0 -53
  399. package/build/tests/ModalBehavior.test.js +0 -149
  400. package/build/tests/MoneyInput.test.js +0 -313
  401. package/build/tests/MultiUpload.test.js +0 -293
  402. package/build/tests/NativeBack.test.js +0 -267
  403. package/build/tests/NoOp.test.js +0 -194
  404. package/build/tests/OnLoad.test.js +0 -153
  405. package/build/tests/OneOfInitialisation.test.js +0 -571
  406. package/build/tests/PersistAsync.test.js +0 -687
  407. package/build/tests/Polling.test.js +0 -708
  408. package/build/tests/Prefetching.test.js +0 -229
  409. package/build/tests/RefreshAfter.test.js +0 -63
  410. package/build/tests/RefreshOnChange.ResponseHandling.test.js +0 -199
  411. package/build/tests/RefreshOnChange.test.js +0 -233
  412. package/build/tests/RefreshOnChange.with.Segmented.test.js +0 -351
  413. package/build/tests/RefreshOnChange.with.Tabs.test.js +0 -359
  414. package/build/tests/RefreshOnChangePreserve.test.js +0 -221
  415. package/build/tests/RendererProps.test.js +0 -372
  416. package/build/tests/Repeatable.test.js +0 -104
  417. package/build/tests/Rerendering.test.js +0 -67
  418. package/build/tests/ReviewLayout.test.js +0 -271
  419. package/build/tests/SchemaOnChange.test.js +0 -133
  420. package/build/tests/SchemaReferences.test.js +0 -88
  421. package/build/tests/ScrollToBottom.test.js +0 -101
  422. package/build/tests/ScrollToError.test.js +0 -359
  423. package/build/tests/ScrollToTop.test.js +0 -95
  424. package/build/tests/SegmentedControl.test.js +0 -49
  425. package/build/tests/SingleFileUpload.test.js +0 -168
  426. package/build/tests/StatusList.test.js +0 -85
  427. package/build/tests/Subflow.dynamic.test.js +0 -887
  428. package/build/tests/Subflow.native.test.js +0 -448
  429. package/build/tests/Submission.Const.test.js +0 -70
  430. package/build/tests/Submission.ResponseHandling.test.js +0 -557
  431. package/build/tests/Submission.merging.test.js +0 -202
  432. package/build/tests/Submission.test.js +0 -821
  433. package/build/tests/Tags.test.js +0 -466
  434. package/build/tests/UpdatableLayout.test.js +0 -343
  435. package/build/tests/Upsell.test.js +0 -154
  436. package/build/tests/ValidationAsync.test.js +0 -295
  437. package/build/tests/behavior/events.test.js +0 -348
  438. package/build/tests/legacy/Actions.test.js +0 -158
  439. package/build/tests/legacy/BackButton.test.js +0 -114
  440. package/build/tests/legacy/HiddenSchemas.test.js +0 -250
  441. package/build/tests/legacy/MultiSelect.test.js +0 -546
  442. package/build/tests/legacy/MultipleFileUploadSchema.test.js +0 -350
  443. package/build/tests/legacy/PersistAsync.blob-schema.test.js +0 -224
  444. package/build/tests/legacy/PersistAsync.string-schema.test.js +0 -211
  445. package/build/tests/legacy/RefreshStepOnChange.debouncing.test.js +0 -209
  446. package/build/tests/legacy/RefreshStepOnChange.test.js +0 -421
  447. package/build/tests/legacy/Search.test.js +0 -439
  448. package/build/tests/renderers/InlineAlertInSchemas.test.js +0 -82
  449. package/build/tests/renderers/MediaRenderer.test.js +0 -74
  450. package/build/tests/renderers/MultiSelectInputRendererProps.test.js +0 -58
  451. package/build/tests/renderers/SelectInputRendererProps.test.js +0 -43
  452. package/build/tests/renderers/TextInputRenderer.test.js +0 -48
  453. package/build/types.js +0 -1
  454. package/build/useDynamicFlow.js +0 -110
  455. package/build/useDynamicFlowModal.js +0 -58
  456. package/build/utils/analyse-step.js +0 -14
  457. package/build/utils/component-utils.js +0 -8
  458. package/build/utils/component-utils.test.js +0 -113
  459. package/build/utils/getScrollToTop.js +0 -12
  460. package/build/utils/normalise-flow-id.js +0 -1
  461. package/build/utils/normalise-flow-id.test.js +0 -24
  462. package/build/utils/recursiveMerge.js +0 -40
  463. package/build/utils/recursiveMerge.test.js +0 -93
  464. package/build/utils/safe-parse-link.js +0 -14
  465. package/build/utils/safe-parse-link.test.js +0 -19
  466. package/build/utils/type-utils.js +0 -22
  467. package/build/utils/type-validators.js +0 -11
  468. package/build/utils/type-validators.test.js +0 -180
  469. package/build/utils/useStableCallback.js +0 -15
@@ -1,687 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
3
- import { act, screen, waitFor } from '@testing-library/react';
4
- import { userEvent } from '@testing-library/user-event';
5
- import { renderWithProviders } from '../test-utils';
6
- import DynamicFlowWise from '../test-utils/DynamicFlowWise';
7
- import { abortableDelay, respondWith, respondWithDelay } from '../test-utils/fetch-utils';
8
- import { vi } from 'vitest';
9
- const user = userEvent.setup({ advanceTimers: vi.advanceTimersByTime });
10
- describe('Persist Async', () => {
11
- const submitButtonComponent = {
12
- type: 'button',
13
- title: 'Submit',
14
- behavior: { type: 'action', action: { url: '/submit' } },
15
- };
16
- const getStepWithPersisAsync = (childSchema) => ({
17
- id: 'step-1',
18
- title: 'Persist Async Step',
19
- schemas: [
20
- {
21
- $id: '#persist-async-schema',
22
- type: 'object',
23
- displayOrder: ['token'],
24
- properties: {
25
- token: {
26
- type: 'string',
27
- persistAsync: {
28
- idProperty: 'id',
29
- url: '/persist-async',
30
- method: 'POST',
31
- param: 'value',
32
- schema: childSchema,
33
- },
34
- },
35
- },
36
- },
37
- ],
38
- layout: [{ type: 'form', schemaId: '#persist-async-schema' }, submitButtonComponent],
39
- });
40
- const getStepWithPersistAsyncNoObject = (childSchema) => ({
41
- id: 'step-1',
42
- title: 'Persist Async Step',
43
- schemas: [
44
- {
45
- $id: '#persist-async-schema',
46
- type: 'string',
47
- persistAsync: {
48
- idProperty: 'id',
49
- url: '/persist-async',
50
- method: 'POST',
51
- param: 'value',
52
- schema: childSchema,
53
- },
54
- },
55
- ],
56
- layout: [{ type: 'form', schemaId: '#persist-async-schema' }, submitButtonComponent],
57
- });
58
- const renderDF = (httpClient, initialStep, onError = vi.fn()) => renderWithProviders(_jsx(DynamicFlowWise, { flowId: "persist-async-test-flow", httpClient: httpClient, initialStep: initialStep, onError: onError, onCompletion: () => { } }));
59
- describe('with a string schema', () => {
60
- const getStepWithStringSchema = () => getStepWithPersisAsync({ type: 'string', title: 'Credit Card Number' });
61
- describe('initialisation', () => {
62
- it('should submit the model if provided', async () => {
63
- const step = Object.assign(Object.assign({}, getStepWithStringSchema()), { model: { token: 'card-token-from-step-model' } });
64
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
65
- renderDF(mockHttpClient, step);
66
- const submitButton = screen.getByRole('button', { name: 'Submit' });
67
- await user.click(submitButton);
68
- await waitFor(() => {
69
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
70
- body: JSON.stringify({ token: 'card-token-from-step-model' }),
71
- }));
72
- });
73
- });
74
- });
75
- describe('after a refresh', () => {
76
- const getStepWithStringSchemaAndRefresh = () => {
77
- const step = getStepWithStringSchema();
78
- step.refreshUrl = '/refresh';
79
- const objectSchema = step.schemas[0];
80
- objectSchema.displayOrder = ['token', 'tnc'];
81
- objectSchema.properties.tnc = {
82
- type: 'boolean',
83
- title: 'I agree to the terms and conditions',
84
- refreshStepOnChange: true,
85
- };
86
- return step;
87
- };
88
- it('should preserve the local value', async () => {
89
- const initialStep = getStepWithStringSchemaAndRefresh();
90
- const refreshedStep = Object.assign(Object.assign({}, initialStep), { model: { token: 'card-token-from-refresh', tnc: true } });
91
- const mockHttpClient = vi.fn(async (input) => {
92
- switch (input) {
93
- case '/persist-async':
94
- return respondWith({ id: '##SOME-TOKEN##' }, { status: 200 });
95
- case '/submit':
96
- return respondWith({ success: true }, { headers: { 'X-Df-Response-Type': 'exit' } });
97
- case '/refresh':
98
- return respondWith(refreshedStep);
99
- default:
100
- return new Response(null, { status: 404 });
101
- }
102
- });
103
- renderDF(mockHttpClient, initialStep);
104
- const input = screen.getByRole('textbox', { name: 'Credit Card Number' });
105
- await user.type(input, '1111-1111-1111-1111');
106
- await user.tab();
107
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
108
- // click the checkbox
109
- const checkbox = screen.getByRole('checkbox', {
110
- name: 'I agree to the terms and conditions',
111
- });
112
- await user.click(checkbox);
113
- expect(mockHttpClient).toHaveBeenCalledTimes(2);
114
- const submitButton = screen.getByRole('button', { name: 'Submit' });
115
- await user.click(submitButton);
116
- await waitFor(() => {
117
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
118
- body: JSON.stringify({ token: 'card-token-from-refresh', tnc: true }),
119
- }));
120
- });
121
- expect(screen.getByRole('textbox', { name: 'Credit Card Number' })).toHaveValue('1111-1111-1111-1111');
122
- });
123
- });
124
- describe('retriggering', () => {
125
- it('should perform two persist asyncs if called with different values', async () => {
126
- const mockHttpClient = vi
127
- .fn()
128
- .mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }, { status: 200 }));
129
- renderDF(mockHttpClient, getStepWithStringSchema());
130
- const input = screen.getByRole('textbox', { name: 'Credit Card Number' });
131
- await user.type(input, '1111-1111-1111-1111');
132
- await user.tab();
133
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
134
- await user.clear(input);
135
- await user.type(input, '9999-9999-9999-9999');
136
- await user.tab();
137
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(2));
138
- });
139
- it('should not perform a persist async if called with the same value twice', async () => {
140
- const mockHttpClient = vi
141
- .fn()
142
- .mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }, { status: 200 }));
143
- renderDF(mockHttpClient, getStepWithStringSchema());
144
- const input = screen.getByRole('textbox', { name: 'Credit Card Number' });
145
- await user.type(input, '1111-1111-1111-1111');
146
- await user.tab();
147
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
148
- await user.clear(input);
149
- await user.type(input, '1111-1111-1111-1111');
150
- await user.tab();
151
- await act(async () => vi.advanceTimersByTimeAsync(100));
152
- expect(mockHttpClient).toHaveBeenCalledTimes(1);
153
- });
154
- it('should ignore previous responses if a second persist has been triggered', async () => {
155
- const mockHttpClient = vi.fn(async (input, init) => {
156
- var _a;
157
- switch (input) {
158
- case '/persist-async': {
159
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
160
- const requestBodyValue = (_a = JSON.parse(init === null || init === void 0 ? void 0 : init.body)) === null || _a === void 0 ? void 0 : _a.value;
161
- switch (requestBodyValue) {
162
- case '1111-1111-1111-1111':
163
- return abortableDelay(200, init === null || init === void 0 ? void 0 : init.signal).then(async () => respondWith({ id: `id-0001` }));
164
- case '2222-2222-2222-2222':
165
- return abortableDelay(10, init === null || init === void 0 ? void 0 : init.signal).then(async () => respondWith({ id: `id-0002` }));
166
- }
167
- break;
168
- }
169
- case '/submit':
170
- return respondWith({ success: true });
171
- default:
172
- return new Response(null, { status: 404 });
173
- }
174
- });
175
- renderDF(mockHttpClient, getStepWithStringSchema());
176
- const input = screen.getByRole('textbox', { name: 'Credit Card Number' });
177
- await user.type(input, '1111-1111-1111-1111');
178
- await user.tab();
179
- await user.clear(input);
180
- await user.type(input, '2222-2222-2222-2222');
181
- const submitButton = screen.getByRole('button', { name: 'Submit' });
182
- await user.click(submitButton);
183
- await waitFor(() => {
184
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
185
- body: JSON.stringify({ token: 'id-0002' }),
186
- }));
187
- });
188
- });
189
- });
190
- describe('clearing submittable value', () => {
191
- it('should clear persisted value if value is cleared', async () => {
192
- const mockHttpClient = vi
193
- .fn()
194
- .mockResolvedValue(respondWith({ id: '123456' }, { status: 200 }));
195
- renderDF(mockHttpClient, getStepWithStringSchema());
196
- const input = screen.getByRole('textbox', { name: 'Credit Card Number' });
197
- await user.type(input, '1111-1111-1111-1111');
198
- await user.tab();
199
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
200
- await user.clear(input);
201
- const submitButton = screen.getByRole('button', { name: 'Submit' });
202
- await user.click(submitButton);
203
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
204
- body: JSON.stringify({}),
205
- }));
206
- });
207
- });
208
- describe('error handling', () => {
209
- it('should set component errors if persist async fails (server error message)', async () => {
210
- const mockHttpClient = vi
211
- .fn()
212
- .mockResolvedValue(respondWith({ validation: { value: 'Server-side error' } }, { status: 422 }));
213
- renderDF(mockHttpClient, getStepWithStringSchema());
214
- const input = screen.getByRole('textbox', { name: 'Credit Card Number' });
215
- await user.type(input, '1111-1111-1111-1111');
216
- await user.tab();
217
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
218
- expect(screen.getByText('Server-side error')).toBeInTheDocument();
219
- });
220
- it('should set component errors if persist async fails (server error message) (schema not wrapped in object)', async () => {
221
- const mockHttpClient = vi
222
- .fn()
223
- .mockResolvedValue(respondWith({ validation: { value: 'Server-side error' } }, { status: 422 }));
224
- const step = getStepWithPersistAsyncNoObject({
225
- type: 'string',
226
- title: 'Credit Card Number',
227
- });
228
- renderDF(mockHttpClient, step);
229
- const input = screen.getByRole('textbox', { name: 'Credit Card Number' });
230
- await user.type(input, '1111-1111-1111-1111');
231
- await user.tab();
232
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
233
- expect(screen.getByText('Server-side error')).toBeInTheDocument();
234
- });
235
- test.each([
236
- ['null, 404', new Response(null, { status: 404 })],
237
- ['wrong, 200', new Response(JSON.stringify({ wrongId: 'wishful-token' }), { status: 200 })],
238
- ])('should set component errors if persist async fails with %s (fallback error message)', async (_, mockedResponse) => {
239
- const mockHttpClient = vi.fn().mockResolvedValue(mockedResponse);
240
- renderDF(mockHttpClient, getStepWithStringSchema());
241
- const input = screen.getByRole('textbox', { name: 'Credit Card Number' });
242
- await user.type(input, '1111-1111-1111-1111');
243
- await user.tab();
244
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
245
- expect(screen.getByText('Something went wrong.')).toBeInTheDocument();
246
- });
247
- });
248
- });
249
- describe('with a string (format: date) schema', () => {
250
- const getStepWithDateStringSchema = () => getStepWithPersisAsync({ type: 'string', format: 'date', title: 'Date of Birth' });
251
- /**
252
- * Selects 02 January 1999
253
- */
254
- const userInputDate = async () => {
255
- const dayInput = screen.getByRole('textbox', { name: 'Day' });
256
- await user.type(dayInput, '02');
257
- const monthSelect = screen.getAllByText(/month/i)[1];
258
- await user.click(monthSelect);
259
- await user.click(screen.getByRole('option', { name: 'January' }));
260
- await user.keyboard('{Escape}');
261
- const yearInput = await screen.findByRole('textbox', { name: 'Year' });
262
- await user.type(yearInput, '1999');
263
- };
264
- it('should submit the persisted token on submit', async () => {
265
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
266
- renderDF(mockHttpClient, getStepWithDateStringSchema());
267
- await userInputDate();
268
- await user.tab();
269
- expect(mockHttpClient).toHaveBeenCalledTimes(1);
270
- const submitButton = screen.getByRole('button', { name: 'Submit' });
271
- await user.click(submitButton);
272
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
273
- body: JSON.stringify({ token: '##SOME-TOKEN##' }),
274
- }));
275
- });
276
- it('should display server-side validation errors', async () => {
277
- const mockHttpClient = vi
278
- .fn()
279
- .mockResolvedValue(respondWith({ validation: { value: 'Server-side error' } }, { status: 422 }));
280
- renderDF(mockHttpClient, getStepWithDateStringSchema());
281
- await userInputDate();
282
- expect(screen.getByText('Server-side error')).toBeInTheDocument();
283
- });
284
- });
285
- describe('with a boolean schema', () => {
286
- const getStepWithBooleanSchema = () => getStepWithPersisAsync({ type: 'boolean', title: 'Accept Terms and Conditions' });
287
- it('should submit the persisted token on submit', async () => {
288
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
289
- renderDF(mockHttpClient, getStepWithBooleanSchema());
290
- const checkbox = screen.getByRole('checkbox', { name: 'Accept Terms and Conditions' });
291
- await user.click(checkbox);
292
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
293
- const submitButton = screen.getByRole('button', { name: 'Submit' });
294
- await user.click(submitButton);
295
- await waitFor(() => {
296
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
297
- body: JSON.stringify({ token: '##SOME-TOKEN##' }),
298
- }));
299
- });
300
- });
301
- });
302
- describe('with an integer schema', () => {
303
- const getStepWithIntegerSchema = () => getStepWithPersisAsync({ type: 'integer', title: 'Enter your age' });
304
- it('should submit the persisted token on submit', async () => {
305
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
306
- renderDF(mockHttpClient, getStepWithIntegerSchema());
307
- const input = screen.getByRole('spinbutton', { name: 'Enter your age' });
308
- await user.type(input, '30');
309
- await user.tab();
310
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
311
- const submitButton = screen.getByRole('button', { name: 'Submit' });
312
- await user.click(submitButton);
313
- await waitFor(() => {
314
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
315
- body: JSON.stringify({ token: '##SOME-TOKEN##' }),
316
- }));
317
- });
318
- });
319
- it('should display server-side validation errors', async () => {
320
- const mockHttpClient = vi
321
- .fn()
322
- .mockResolvedValue(respondWith({ validation: { value: 'Server-side error' } }, { status: 422 }));
323
- renderDF(mockHttpClient, getStepWithIntegerSchema());
324
- const input = screen.getByRole('spinbutton', { name: 'Enter your age' });
325
- await user.type(input, '30');
326
- await user.tab();
327
- await waitFor(() => {
328
- expect(screen.getByText('Server-side error')).toBeInTheDocument();
329
- });
330
- });
331
- });
332
- describe('with a number schema', () => {
333
- const getStepWithNumberSchema = () => getStepWithPersisAsync({ type: 'number', title: 'Enter an amount' });
334
- it('should submit the persisted token on submit', async () => {
335
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
336
- renderDF(mockHttpClient, getStepWithNumberSchema());
337
- const input = screen.getByRole('spinbutton', { name: 'Enter an amount' });
338
- await user.type(input, '99.99');
339
- await user.tab();
340
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
341
- const submitButton = screen.getByRole('button', { name: 'Submit' });
342
- await user.click(submitButton);
343
- await waitFor(() => {
344
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
345
- body: JSON.stringify({ token: '##SOME-TOKEN##' }),
346
- }));
347
- });
348
- });
349
- it('should display server-side validation errors', async () => {
350
- const mockHttpClient = vi
351
- .fn()
352
- .mockResolvedValue(respondWith({ validation: { value: 'Server-side error' } }, { status: 422 }));
353
- renderDF(mockHttpClient, getStepWithNumberSchema());
354
- const input = screen.getByRole('spinbutton', { name: 'Enter an amount' });
355
- await user.type(input, '99.99');
356
- await user.tab();
357
- await waitFor(() => {
358
- expect(screen.getByText('Server-side error')).toBeInTheDocument();
359
- });
360
- });
361
- });
362
- describe('with a const schema', () => {
363
- const getStepWithConstSchema = () => getStepWithPersisAsync({ const: 'fixed-value' });
364
- it('should submit the persisted token on submit', async () => {
365
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
366
- renderDF(mockHttpClient, getStepWithConstSchema());
367
- const submitButton = screen.getByRole('button', { name: 'Submit' });
368
- await user.click(submitButton);
369
- await waitFor(() => {
370
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
371
- body: JSON.stringify({ token: '##SOME-TOKEN##' }),
372
- }));
373
- });
374
- });
375
- });
376
- describe('with file upload schemas', () => {
377
- describe('with a blob schema', () => {
378
- const getStepWithBlobSchema = () => getStepWithPersisAsync({ type: 'blob', title: 'File Upload' });
379
- it('should submit the persisted token on submit', async () => {
380
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
381
- renderDF(mockHttpClient, getStepWithBlobSchema());
382
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo'], 'foo.png', { type: 'image/png' }));
383
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
384
- const submitButton = screen.getByRole('button', { name: 'Submit' });
385
- await user.click(submitButton);
386
- await waitFor(() => {
387
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
388
- body: JSON.stringify({ token: '##SOME-TOKEN##' }),
389
- }));
390
- });
391
- });
392
- it('should display server-side validation errors', async () => {
393
- const mockHttpClient = vi
394
- .fn()
395
- .mockResolvedValue(respondWith({ validation: { value: 'Server-side error' } }, { status: 422 }));
396
- renderDF(mockHttpClient, getStepWithBlobSchema());
397
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo'], 'foo.png', { type: 'image/png' }));
398
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
399
- expect(screen.getByText('Server-side error')).toBeInTheDocument();
400
- expect(screen.queryByText('Uploaded')).not.toBeInTheDocument();
401
- });
402
- test.each([
403
- ['null, 404', new Response(null, { status: 404 })],
404
- ['wrong, 200', new Response(JSON.stringify({ wrongId: 'wishful-token' }), { status: 200 })],
405
- ])('should display generic validation error when response is: %s', async (_, mockedResponse) => {
406
- const mockHttpClient = vi.fn().mockResolvedValue(mockedResponse);
407
- renderDF(mockHttpClient, getStepWithBlobSchema());
408
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo'], 'foo.png', { type: 'image/png' }));
409
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
410
- expect(screen.getByText('Something went wrong.')).toBeInTheDocument();
411
- expect(screen.queryByText('Uploaded')).not.toBeInTheDocument();
412
- });
413
- it('should display a loading indication while persisting', async () => {
414
- const mockHttpClient = vi
415
- .fn()
416
- .mockResolvedValue(respondWithDelay({ id: '##SOME-TOKEN##' }, 1000));
417
- renderDF(mockHttpClient, getStepWithBlobSchema());
418
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo'], 'foo.png', { type: 'image/png' }));
419
- expect(mockHttpClient).toHaveBeenCalledTimes(1);
420
- expect(screen.getByText('Uploading...')).toBeInTheDocument();
421
- await act(async () => vi.advanceTimersByTimeAsync(1000));
422
- expect(screen.getByText('Uploaded')).toBeInTheDocument();
423
- expect(screen.queryByText('Uploading...')).not.toBeInTheDocument();
424
- });
425
- it('should display the "required" validation error after clearing a failed upload and attempting to submit', async () => {
426
- const mockHttpClient = vi.fn().mockResolvedValue(new Response(null, { status: 404 }));
427
- const step = getStepWithBlobSchema();
428
- step.schemas[0].required = ['token'];
429
- renderDF(mockHttpClient, step);
430
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo'], 'foo.png', { type: 'image/png' }));
431
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
432
- const removeButton = screen.getByRole('button', { name: /Remove file/i });
433
- await user.click(removeButton);
434
- const submitButton = screen.getByRole('button', { name: 'Submit' });
435
- await user.click(submitButton);
436
- await waitFor(() => {
437
- expect(screen.getByText('Please fill out this field.')).toBeInTheDocument();
438
- });
439
- });
440
- });
441
- describe('with a base64 encoded string schema', () => {
442
- const getStepWithBase64Schema = () => getStepWithPersisAsync({
443
- type: 'string',
444
- format: 'base64url',
445
- title: 'File Upload (Base64)',
446
- });
447
- it('should submit the persisted token on submit', async () => {
448
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
449
- renderDF(mockHttpClient, getStepWithBase64Schema());
450
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo'], 'foo.png', { type: 'image/png' }));
451
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
452
- const submitButton = screen.getByRole('button', { name: 'Submit' });
453
- await user.click(submitButton);
454
- await waitFor(() => {
455
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
456
- body: JSON.stringify({ token: '##SOME-TOKEN##' }),
457
- }));
458
- });
459
- });
460
- it('should display server-side validation errors', async () => {
461
- const mockHttpClient = vi
462
- .fn()
463
- .mockResolvedValue(respondWith({ validation: { value: 'Server-side error' } }, { status: 422 }));
464
- renderDF(mockHttpClient, getStepWithBase64Schema());
465
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo'], 'foo.png', { type: 'image/png' }));
466
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
467
- expect(screen.getByText('Server-side error')).toBeInTheDocument();
468
- });
469
- });
470
- });
471
- describe('with a multi-upload schema', () => {
472
- describe('with a blob schema', () => {
473
- const getStepWithMultiUploadBlobSchema = () => ({
474
- id: 'step-id',
475
- title: 'Blob Upload (Multiple, Persist Async)',
476
- schemas: [
477
- {
478
- type: 'array',
479
- $id: '#schema',
480
- title: 'Upload label',
481
- maxItems: 5,
482
- addItemTitle: 'Add',
483
- editItemTitle: 'Edit',
484
- summary: {
485
- defaultTitle: 'File',
486
- defaultDescription: 'Click to edit or remove',
487
- defaultIcon: { name: 'document' },
488
- },
489
- items: {
490
- $id: '#id',
491
- type: 'string',
492
- persistAsync: {
493
- method: 'POST',
494
- url: '/persist-async',
495
- param: 'value',
496
- idProperty: 'id',
497
- schema: {
498
- type: 'blob',
499
- source: 'file',
500
- title: 'Upload label',
501
- description: 'PNG, JPG, or PDF, less than 5mb',
502
- accepts: ['image/png', 'image/jpg', 'application/pdf'],
503
- maxSize: 5242000,
504
- validationMessages: {
505
- maxSize: 'Your file is too large',
506
- },
507
- },
508
- },
509
- },
510
- },
511
- ],
512
- layout: [{ type: 'form', schemaId: '#schema' }, submitButtonComponent],
513
- });
514
- it('should submit the persisted tokens on submit', async () => {
515
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
516
- renderDF(mockHttpClient, getStepWithMultiUploadBlobSchema());
517
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo1'], 'foo1.png', { type: 'image/png' }));
518
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
519
- const submitButton = screen.getByRole('button', { name: 'Submit' });
520
- await user.click(submitButton);
521
- await waitFor(() => {
522
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
523
- body: JSON.stringify(['##SOME-TOKEN##']),
524
- }));
525
- });
526
- });
527
- it('should display server-side validation errors', async () => {
528
- const mockHttpClient = vi
529
- .fn()
530
- .mockResolvedValue(respondWith({ validation: { value: 'Server-side error' } }, { status: 422 }));
531
- renderDF(mockHttpClient, getStepWithMultiUploadBlobSchema());
532
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo1'], 'foo1.png', { type: 'image/png' }));
533
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
534
- expect(screen.getByText('Server-side error')).toBeInTheDocument();
535
- });
536
- });
537
- describe('with a base64 encoded string schema', () => {
538
- const getStepWithMultiUploadBase64Schema = () => ({
539
- id: 'step-id',
540
- title: 'Base64 Upload (Multiple, Persist Async)',
541
- schemas: [
542
- {
543
- $id: '#schema',
544
- type: 'array',
545
- title: 'Upload label',
546
- maxItems: 5,
547
- addItemTitle: 'Add',
548
- editItemTitle: 'Edit',
549
- summary: {
550
- defaultTitle: 'File',
551
- defaultDescription: 'Click to edit or remove',
552
- defaultIcon: { name: 'document' },
553
- },
554
- items: {
555
- $id: '#id',
556
- type: 'string',
557
- persistAsync: {
558
- method: 'POST',
559
- url: '/persist-async',
560
- param: 'value',
561
- idProperty: 'id',
562
- schema: {
563
- type: 'string',
564
- format: 'base64url',
565
- title: 'Upload label',
566
- description: 'PNG, JPG, or PDF, less than 5mb',
567
- accepts: ['image/png', 'image/jpg', 'application/pdf'],
568
- maxSize: 5242000,
569
- validationMessages: {
570
- maxSize: 'Your file is too large',
571
- },
572
- },
573
- },
574
- },
575
- },
576
- ],
577
- layout: [{ type: 'form', schemaId: '#schema' }, submitButtonComponent],
578
- });
579
- it('should submit the persisted tokens on submit', async () => {
580
- const mockHttpClient = vi.fn().mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }));
581
- renderDF(mockHttpClient, getStepWithMultiUploadBase64Schema());
582
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo1'], 'foo1.png', { type: 'image/png' }));
583
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
584
- const submitButton = screen.getByRole('button', { name: 'Submit' });
585
- await user.click(submitButton);
586
- await waitFor(() => {
587
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
588
- body: JSON.stringify(['##SOME-TOKEN##']),
589
- }));
590
- });
591
- });
592
- it('should display server-side validation errors', async () => {
593
- const mockHttpClient = vi
594
- .fn()
595
- .mockResolvedValue(respondWith({ validation: { value: 'Server-side error' } }, { status: 422 }));
596
- renderDF(mockHttpClient, getStepWithMultiUploadBase64Schema());
597
- await user.upload(screen.getByTestId('uploadInput'), new File(['foo1'], 'foo1.png', { type: 'image/png' }));
598
- await waitFor(() => expect(mockHttpClient).toHaveBeenCalledTimes(1));
599
- expect(screen.getByText('Server-side error')).toBeInTheDocument();
600
- });
601
- });
602
- });
603
- describe('with an unsupported schema type (ObjectSchema)', () => {
604
- const getStepWithObjectSchema = () => ({
605
- id: 'step-1',
606
- title: 'Persist Async Step',
607
- schemas: [
608
- {
609
- $id: '#persist-async-schema',
610
- type: 'object',
611
- displayOrder: ['token'],
612
- properties: {
613
- token: {
614
- type: 'string',
615
- persistAsync: {
616
- idProperty: 'id',
617
- url: '/persist-async',
618
- method: 'POST',
619
- param: 'value',
620
- schema: {
621
- type: 'object',
622
- title: 'Enter your address',
623
- displayOrder: ['street', 'city'],
624
- properties: {
625
- street: {
626
- type: 'string',
627
- title: 'Street',
628
- },
629
- city: {
630
- type: 'string',
631
- title: 'City',
632
- },
633
- },
634
- },
635
- },
636
- },
637
- },
638
- },
639
- ],
640
- layout: [
641
- {
642
- type: 'form',
643
- schemaId: '#persist-async-schema',
644
- },
645
- {
646
- type: 'button',
647
- title: 'Submit',
648
- behavior: {
649
- type: 'action',
650
- action: { url: '/submit' },
651
- },
652
- },
653
- ],
654
- });
655
- it(`renders the step`, async () => {
656
- const mockHttpClient = vi
657
- .fn()
658
- .mockResolvedValue(respondWith({ id: '##SOME-TOKEN##' }, { status: 200 }));
659
- renderDF(mockHttpClient, getStepWithObjectSchema());
660
- expect(screen.getByText('Enter your address')).toBeInTheDocument();
661
- });
662
- it('submits the user input on submission', async () => {
663
- const mockHttpClient = vi.fn(async (input) => {
664
- switch (input) {
665
- case '/persist-async':
666
- return respondWith({ id: '##SOME-TOKEN##' }, { status: 200 });
667
- case '/submit':
668
- return respondWith({ success: true }, { headers: { 'X-Df-Response-Type': 'exit' } });
669
- default:
670
- return new Response(null, { status: 404 });
671
- }
672
- });
673
- const onError = vi.fn();
674
- renderDF(mockHttpClient, getStepWithObjectSchema(), onError);
675
- expect(screen.getByText('Enter your address')).toBeInTheDocument();
676
- const streetInput = screen.getByRole('textbox', { name: 'Street' });
677
- await user.type(streetInput, '123 Main St');
678
- const cityInput = screen.getByRole('textbox', { name: 'City' });
679
- await user.type(cityInput, 'Springfield');
680
- const submitButton = screen.getByRole('button', { name: 'Submit' });
681
- await user.click(submitButton);
682
- expect(mockHttpClient).toHaveBeenLastCalledWith('/submit', expect.objectContaining({
683
- body: JSON.stringify({ token: { street: '123 Main St', city: 'Springfield' } }),
684
- }));
685
- });
686
- });
687
- });