@webiny/app-website-builder-workflows 0.0.0-unstable.0156a4c312

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 (402) hide show
  1. package/Components/ContentReviews/WbContentReviews.d.ts +2 -0
  2. package/Components/ContentReviews/WbContentReviews.js +41 -0
  3. package/Components/ContentReviews/WbContentReviews.js.map +1 -0
  4. package/Components/ContentReviews/WbContentReviews.smoke.test.d.ts +1 -0
  5. package/Components/ContentReviews/WbContentReviews.smoke.test.js +59 -0
  6. package/Components/ContentReviews/WbContentReviews.smoke.test.js.map +1 -0
  7. package/Components/ContentReviews/WbContentReviews.test.d.ts +1 -0
  8. package/Components/ContentReviews/WbContentReviews.test.js +80 -0
  9. package/Components/ContentReviews/WbContentReviews.test.js.map +1 -0
  10. package/Components/ContentReviews/WbContentReviewsSidebarItem.d.ts +2 -0
  11. package/Components/ContentReviews/WbContentReviewsSidebarItem.js +18 -0
  12. package/Components/ContentReviews/WbContentReviewsSidebarItem.js.map +1 -0
  13. package/Components/ContentReviews/WbContentReviewsSidebarItem.test.d.ts +1 -0
  14. package/Components/ContentReviews/WbContentReviewsSidebarItem.test.js +67 -0
  15. package/Components/ContentReviews/WbContentReviewsSidebarItem.test.js.map +1 -0
  16. package/Components/PageEditor/DisabledPublishButton.d.ts +6 -0
  17. package/Components/PageEditor/DisabledPublishButton.js +17 -0
  18. package/Components/PageEditor/DisabledPublishButton.js.map +1 -0
  19. package/Components/PageEditor/DisabledPublishButton.test.d.ts +1 -0
  20. package/Components/PageEditor/DisabledPublishButton.test.js +67 -0
  21. package/Components/PageEditor/DisabledPublishButton.test.js.map +1 -0
  22. package/Components/PageEditor/PageBasePublishDecorator.d.ts +2 -0
  23. package/Components/PageEditor/PageBasePublishDecorator.js +23 -0
  24. package/Components/PageEditor/PageBasePublishDecorator.js.map +1 -0
  25. package/Components/PageEditor/PageEditorAutoSave.d.ts +2 -0
  26. package/Components/PageEditor/PageEditorAutoSave.js +23 -0
  27. package/Components/PageEditor/PageEditorAutoSave.js.map +1 -0
  28. package/Components/PageEditor/PageEditorAutoSave.test.d.ts +1 -0
  29. package/Components/PageEditor/PageEditorAutoSave.test.js +111 -0
  30. package/Components/PageEditor/PageEditorAutoSave.test.js.map +1 -0
  31. package/Components/PageEditor/PageEditorConfig.d.ts +2 -0
  32. package/Components/PageEditor/PageEditorConfig.js +13 -0
  33. package/Components/PageEditor/PageEditorConfig.js.map +1 -0
  34. package/Components/PageEditor/PageEditorLayout.d.ts +2 -0
  35. package/Components/PageEditor/PageEditorLayout.js +10 -0
  36. package/Components/PageEditor/PageEditorLayout.js.map +1 -0
  37. package/Components/PageEditor/PageEditorLayout.test.d.ts +1 -0
  38. package/Components/PageEditor/PageEditorLayout.test.js +121 -0
  39. package/Components/PageEditor/PageEditorLayout.test.js.map +1 -0
  40. package/Components/PageEditor/PageEditorTopBar.d.ts +2 -0
  41. package/Components/PageEditor/PageEditorTopBar.js +10 -0
  42. package/Components/PageEditor/PageEditorTopBar.js.map +1 -0
  43. package/Components/PageEditor/PageEditorTopBar.test.d.ts +1 -0
  44. package/Components/PageEditor/PageEditorTopBar.test.js +175 -0
  45. package/Components/PageEditor/PageEditorTopBar.test.js.map +1 -0
  46. package/Components/PageEditor/PageNewRevisionDecorator.d.ts +2 -0
  47. package/Components/PageEditor/PageNewRevisionDecorator.js +24 -0
  48. package/Components/PageEditor/PageNewRevisionDecorator.js.map +1 -0
  49. package/Components/PageEditor/PageNewRevisionDecorator.test.d.ts +1 -0
  50. package/Components/PageEditor/PageNewRevisionDecorator.test.js +107 -0
  51. package/Components/PageEditor/PageNewRevisionDecorator.test.js.map +1 -0
  52. package/Components/PageEditor/PageReadOnlySync.d.ts +3 -0
  53. package/Components/PageEditor/PageReadOnlySync.js +23 -0
  54. package/Components/PageEditor/PageReadOnlySync.js.map +1 -0
  55. package/Components/PageEditor/PageReviewBar.d.ts +4 -0
  56. package/Components/PageEditor/PageReviewBar.js +93 -0
  57. package/Components/PageEditor/PageReviewBar.js.map +1 -0
  58. package/Components/PageEditor/PageReviewBar.test.d.ts +1 -0
  59. package/Components/PageEditor/PageReviewBar.test.js +135 -0
  60. package/Components/PageEditor/PageReviewBar.test.js.map +1 -0
  61. package/Components/PageEditor/PageReviewPublishAction.d.ts +2 -0
  62. package/Components/PageEditor/PageReviewPublishAction.js +15 -0
  63. package/Components/PageEditor/PageReviewPublishAction.js.map +1 -0
  64. package/Components/PageEditor/PageReviewPublishButton.d.ts +4 -0
  65. package/Components/PageEditor/PageReviewPublishButton.js +23 -0
  66. package/Components/PageEditor/PageReviewPublishButton.js.map +1 -0
  67. package/Components/PageEditor/PageScheduleDecorator.d.ts +2 -0
  68. package/Components/PageEditor/PageScheduleDecorator.js +23 -0
  69. package/Components/PageEditor/PageScheduleDecorator.js.map +1 -0
  70. package/Components/PageEditor/PageScheduleDecorator.test.d.ts +1 -0
  71. package/Components/PageEditor/PageScheduleDecorator.test.js +75 -0
  72. package/Components/PageEditor/PageScheduleDecorator.test.js.map +1 -0
  73. package/Components/PageEditor/getPageReadOnlyReason.d.ts +4 -0
  74. package/Components/PageEditor/getPageReadOnlyReason.js +20 -0
  75. package/Components/PageEditor/getPageReadOnlyReason.js.map +1 -0
  76. package/Components/PageEditor/getPageReadOnlyReason.test.d.ts +1 -0
  77. package/Components/PageEditor/getPageReadOnlyReason.test.js +122 -0
  78. package/Components/PageEditor/getPageReadOnlyReason.test.js.map +1 -0
  79. package/Components/PageEditor/getPageReviewContext.d.ts +9 -0
  80. package/Components/PageEditor/getPageReviewContext.js +13 -0
  81. package/Components/PageEditor/getPageReviewContext.js.map +1 -0
  82. package/Components/PageEditor/getPageReviewContext.test.d.ts +1 -0
  83. package/Components/PageEditor/getPageReviewContext.test.js +42 -0
  84. package/Components/PageEditor/getPageReviewContext.test.js.map +1 -0
  85. package/Components/PageEditor/pageEditorDocument.d.ts +17 -0
  86. package/Components/PageEditor/pageEditorDocument.js +0 -0
  87. package/Components/PageEditor/pageReviewMatrix.test.d.ts +1 -0
  88. package/Components/PageEditor/pageReviewMatrix.test.js +223 -0
  89. package/Components/PageEditor/pageReviewMatrix.test.js.map +1 -0
  90. package/Components/PageEditor/publishMatrix.test.d.ts +1 -0
  91. package/Components/PageEditor/publishMatrix.test.js +313 -0
  92. package/Components/PageEditor/publishMatrix.test.js.map +1 -0
  93. package/Components/PagesList/PageListReviewGatedActions.d.ts +2 -0
  94. package/Components/PagesList/PageListReviewGatedActions.js +27 -0
  95. package/Components/PagesList/PageListReviewGatedActions.js.map +1 -0
  96. package/Components/PagesList/PageListReviewGatedActions.test.d.ts +1 -0
  97. package/Components/PagesList/PageListReviewGatedActions.test.js +94 -0
  98. package/Components/PagesList/PageListReviewGatedActions.test.js.map +1 -0
  99. package/Components/PagesList/PagesList.d.ts +2 -0
  100. package/Components/PagesList/PagesList.js +8 -0
  101. package/Components/PagesList/PagesList.js.map +1 -0
  102. package/Components/PagesList/PagesList.test.d.ts +1 -0
  103. package/Components/PagesList/PagesList.test.js +47 -0
  104. package/Components/PagesList/PagesList.test.js.map +1 -0
  105. package/Components/PagesList/index.d.ts +1 -0
  106. package/Components/PagesList/index.js +1 -0
  107. package/Components/index.d.ts +2 -0
  108. package/Components/index.js +2 -0
  109. package/LICENSE +21 -0
  110. package/README.md +11 -0
  111. package/Routes/WebsiteBuilderWorkflowsMenu.d.ts +2 -0
  112. package/Routes/WebsiteBuilderWorkflowsMenu.js +23 -0
  113. package/Routes/WebsiteBuilderWorkflowsMenu.js.map +1 -0
  114. package/Routes/WebsiteBuilderWorkflowsMenu.test.d.ts +1 -0
  115. package/Routes/WebsiteBuilderWorkflowsMenu.test.js +141 -0
  116. package/Routes/WebsiteBuilderWorkflowsMenu.test.js.map +1 -0
  117. package/Routes/index.d.ts +1 -0
  118. package/Routes/index.js +1 -0
  119. package/constants.d.ts +1 -0
  120. package/constants.js +4 -0
  121. package/constants.js.map +1 -0
  122. package/editorGlue.wiring.test.d.ts +1 -0
  123. package/editorGlue.wiring.test.js +128 -0
  124. package/editorGlue.wiring.test.js.map +1 -0
  125. package/features/cache/WbReviewCacheSyncHandler.d.ts +8 -0
  126. package/features/cache/WbReviewCacheSyncHandler.js +14 -0
  127. package/features/cache/WbReviewCacheSyncHandler.js.map +1 -0
  128. package/features/cache/WbReviewPageCacheWriter.d.ts +17 -0
  129. package/features/cache/WbReviewPageCacheWriter.js +39 -0
  130. package/features/cache/WbReviewPageCacheWriter.js.map +1 -0
  131. package/features/cache/WbReviewPageCacheWriter.test.d.ts +1 -0
  132. package/features/cache/WbReviewPageCacheWriter.test.js +115 -0
  133. package/features/cache/WbReviewPageCacheWriter.test.js.map +1 -0
  134. package/features/cache/abstractions.d.ts +5 -0
  135. package/features/cache/abstractions.js +5 -0
  136. package/features/cache/abstractions.js.map +1 -0
  137. package/features/cache/feature.d.ts +1 -0
  138. package/features/cache/feature.js +13 -0
  139. package/features/cache/feature.js.map +1 -0
  140. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.d.ts +25 -0
  141. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.js +112 -0
  142. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.js.map +1 -0
  143. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.test.d.ts +1 -0
  144. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.test.js +632 -0
  145. package/features/editorGateway/WbWorkflowEditorGateway/WbWorkflowEditorGateway.test.js.map +1 -0
  146. package/features/editorGateway/feature.d.ts +1 -0
  147. package/features/editorGateway/feature.js +11 -0
  148. package/features/editorGateway/feature.js.map +1 -0
  149. package/features/editorGateway/feature.test.d.ts +1 -0
  150. package/features/editorGateway/feature.test.js +244 -0
  151. package/features/editorGateway/feature.test.js.map +1 -0
  152. package/features/editorGateway/graphql/deleteWebsiteBuilderPageWorkflow.d.ts +1 -0
  153. package/features/editorGateway/graphql/deleteWebsiteBuilderPageWorkflow.js +19 -0
  154. package/features/editorGateway/graphql/deleteWebsiteBuilderPageWorkflow.js.map +1 -0
  155. package/features/editorGateway/graphql/getWebsiteBuilderPageWorkflow.d.ts +1 -0
  156. package/features/editorGateway/graphql/getWebsiteBuilderPageWorkflow.js +19 -0
  157. package/features/editorGateway/graphql/getWebsiteBuilderPageWorkflow.js.map +1 -0
  158. package/features/editorGateway/graphql/inspectWebsiteBuilderPageRouting.d.ts +1 -0
  159. package/features/editorGateway/graphql/inspectWebsiteBuilderPageRouting.js +19 -0
  160. package/features/editorGateway/graphql/inspectWebsiteBuilderPageRouting.js.map +1 -0
  161. package/features/editorGateway/graphql/listWebsiteBuilderPageWorkflowNames.d.ts +1 -0
  162. package/features/editorGateway/graphql/listWebsiteBuilderPageWorkflowNames.js +23 -0
  163. package/features/editorGateway/graphql/listWebsiteBuilderPageWorkflowNames.js.map +1 -0
  164. package/features/editorGateway/graphql/storeWebsiteBuilderPageWorkflow.d.ts +1 -0
  165. package/features/editorGateway/graphql/storeWebsiteBuilderPageWorkflow.js +19 -0
  166. package/features/editorGateway/graphql/storeWebsiteBuilderPageWorkflow.js.map +1 -0
  167. package/features/editorGateway/graphql/websiteBuilderPageFolderExists.d.ts +1 -0
  168. package/features/editorGateway/graphql/websiteBuilderPageFolderExists.js +16 -0
  169. package/features/editorGateway/graphql/websiteBuilderPageFolderExists.js.map +1 -0
  170. package/features/editorMounting/WbWorkflowEditorAppAdapter.d.ts +21 -0
  171. package/features/editorMounting/WbWorkflowEditorAppAdapter.js +45 -0
  172. package/features/editorMounting/WbWorkflowEditorAppAdapter.js.map +1 -0
  173. package/features/editorMounting/WbWorkflowEditorAppAdapter.test.d.ts +1 -0
  174. package/features/editorMounting/WbWorkflowEditorAppAdapter.test.js +115 -0
  175. package/features/editorMounting/WbWorkflowEditorAppAdapter.test.js.map +1 -0
  176. package/features/editorMounting/abstractions.d.ts +5 -0
  177. package/features/editorMounting/abstractions.js +5 -0
  178. package/features/editorMounting/abstractions.js.map +1 -0
  179. package/features/editorMounting/feature.d.ts +3 -0
  180. package/features/editorMounting/feature.js +19 -0
  181. package/features/editorMounting/feature.js.map +1 -0
  182. package/features/editorMounting/feature.test.d.ts +1 -0
  183. package/features/editorMounting/feature.test.js +93 -0
  184. package/features/editorMounting/feature.test.js.map +1 -0
  185. package/features/editorReview/WbPageContentReloader.d.ts +12 -0
  186. package/features/editorReview/WbPageContentReloader.js +40 -0
  187. package/features/editorReview/WbPageContentReloader.js.map +1 -0
  188. package/features/editorReview/WbPageContentReloader.test.d.ts +1 -0
  189. package/features/editorReview/WbPageContentReloader.test.js +222 -0
  190. package/features/editorReview/WbPageContentReloader.test.js.map +1 -0
  191. package/features/editorReview/WbPageReview.d.ts +8 -0
  192. package/features/editorReview/WbPageReview.js +14 -0
  193. package/features/editorReview/WbPageReview.js.map +1 -0
  194. package/features/editorReview/WbPageUnsavedChanges.d.ts +8 -0
  195. package/features/editorReview/WbPageUnsavedChanges.js +12 -0
  196. package/features/editorReview/WbPageUnsavedChanges.js.map +1 -0
  197. package/features/editorReview/WbPageUnsavedChanges.test.d.ts +1 -0
  198. package/features/editorReview/WbPageUnsavedChanges.test.js +33 -0
  199. package/features/editorReview/WbPageUnsavedChanges.test.js.map +1 -0
  200. package/features/editorReview/abstractions.d.ts +5 -0
  201. package/features/editorReview/abstractions.js +5 -0
  202. package/features/editorReview/abstractions.js.map +1 -0
  203. package/features/editorReview/feature.d.ts +3 -0
  204. package/features/editorReview/feature.js +17 -0
  205. package/features/editorReview/feature.js.map +1 -0
  206. package/features/gateway/WbReviewChangeMessageHandler.d.ts +8 -0
  207. package/features/gateway/WbReviewChangeMessageHandler.js +16 -0
  208. package/features/gateway/WbReviewChangeMessageHandler.js.map +1 -0
  209. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.d.ts +13 -0
  210. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.js +35 -0
  211. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.js.map +1 -0
  212. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.test.d.ts +1 -0
  213. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.test.js +47 -0
  214. package/features/gateway/WbReviewContentAdapter/WbReviewContentAdapter.test.js.map +1 -0
  215. package/features/gateway/WbReviewContentAdapter/abstractions.d.ts +5 -0
  216. package/features/gateway/WbReviewContentAdapter/abstractions.js +5 -0
  217. package/features/gateway/WbReviewContentAdapter/abstractions.js.map +1 -0
  218. package/features/gateway/WbReviewGateway/WbReviewGateway.d.ts +51 -0
  219. package/features/gateway/WbReviewGateway/WbReviewGateway.js +216 -0
  220. package/features/gateway/WbReviewGateway/WbReviewGateway.js.map +1 -0
  221. package/features/gateway/WbReviewGateway/WbReviewGateway.test.d.ts +1 -0
  222. package/features/gateway/WbReviewGateway/WbReviewGateway.test.js +647 -0
  223. package/features/gateway/WbReviewGateway/WbReviewGateway.test.js.map +1 -0
  224. package/features/gateway/WbReviewNotificationHandler.d.ts +8 -0
  225. package/features/gateway/WbReviewNotificationHandler.js +16 -0
  226. package/features/gateway/WbReviewNotificationHandler.js.map +1 -0
  227. package/features/gateway/WbReviewRowProvider/WbReviewRowProvider.d.ts +8 -0
  228. package/features/gateway/WbReviewRowProvider/WbReviewRowProvider.js +14 -0
  229. package/features/gateway/WbReviewRowProvider/WbReviewRowProvider.js.map +1 -0
  230. package/features/gateway/WbReviewRowProvider/abstractions.d.ts +5 -0
  231. package/features/gateway/WbReviewRowProvider/abstractions.js +5 -0
  232. package/features/gateway/WbReviewRowProvider/abstractions.js.map +1 -0
  233. package/features/gateway/assertWbPageNamespace.d.ts +1 -0
  234. package/features/gateway/assertWbPageNamespace.js +7 -0
  235. package/features/gateway/assertWbPageNamespace.js.map +1 -0
  236. package/features/gateway/contentReviewsBindings.test.d.ts +1 -0
  237. package/features/gateway/contentReviewsBindings.test.js +159 -0
  238. package/features/gateway/contentReviewsBindings.test.js.map +1 -0
  239. package/features/gateway/feature.d.ts +4 -0
  240. package/features/gateway/feature.js +27 -0
  241. package/features/gateway/feature.js.map +1 -0
  242. package/features/gateway/feature.test.d.ts +1 -0
  243. package/features/gateway/feature.test.js +85 -0
  244. package/features/gateway/feature.test.js.map +1 -0
  245. package/features/gateway/graphql/WbOperationResponse.d.ts +3 -0
  246. package/features/gateway/graphql/WbOperationResponse.js +0 -0
  247. package/features/gateway/graphql/approveWebsiteBuilderPageReviewStep.d.ts +1 -0
  248. package/features/gateway/graphql/approveWebsiteBuilderPageReviewStep.js +22 -0
  249. package/features/gateway/graphql/approveWebsiteBuilderPageReviewStep.js.map +1 -0
  250. package/features/gateway/graphql/cancelWebsiteBuilderPageReview.d.ts +1 -0
  251. package/features/gateway/graphql/cancelWebsiteBuilderPageReview.js +18 -0
  252. package/features/gateway/graphql/cancelWebsiteBuilderPageReview.js.map +1 -0
  253. package/features/gateway/graphql/cancelWebsiteBuilderPageReviewsForDelete.d.ts +1 -0
  254. package/features/gateway/graphql/cancelWebsiteBuilderPageReviewsForDelete.js +26 -0
  255. package/features/gateway/graphql/cancelWebsiteBuilderPageReviewsForDelete.js.map +1 -0
  256. package/features/gateway/graphql/getWebsiteBuilderPageReview.d.ts +1 -0
  257. package/features/gateway/graphql/getWebsiteBuilderPageReview.js +18 -0
  258. package/features/gateway/graphql/getWebsiteBuilderPageReview.js.map +1 -0
  259. package/features/gateway/graphql/getWebsiteBuilderPageReviewStepRun.d.ts +1 -0
  260. package/features/gateway/graphql/getWebsiteBuilderPageReviewStepRun.js +18 -0
  261. package/features/gateway/graphql/getWebsiteBuilderPageReviewStepRun.js.map +1 -0
  262. package/features/gateway/graphql/getWebsiteBuilderPageTargetReview.d.ts +1 -0
  263. package/features/gateway/graphql/getWebsiteBuilderPageTargetReview.js +18 -0
  264. package/features/gateway/graphql/getWebsiteBuilderPageTargetReview.js.map +1 -0
  265. package/features/gateway/graphql/listWebsiteBuilderPageReviewStepCandidates.d.ts +1 -0
  266. package/features/gateway/graphql/listWebsiteBuilderPageReviewStepCandidates.js +18 -0
  267. package/features/gateway/graphql/listWebsiteBuilderPageReviewStepCandidates.js.map +1 -0
  268. package/features/gateway/graphql/listWebsiteBuilderPageReviews.d.ts +1 -0
  269. package/features/gateway/graphql/listWebsiteBuilderPageReviews.js +34 -0
  270. package/features/gateway/graphql/listWebsiteBuilderPageReviews.js.map +1 -0
  271. package/features/gateway/graphql/listWebsiteBuilderPageStepCandidates.d.ts +1 -0
  272. package/features/gateway/graphql/listWebsiteBuilderPageStepCandidates.js +22 -0
  273. package/features/gateway/graphql/listWebsiteBuilderPageStepCandidates.js.map +1 -0
  274. package/features/gateway/graphql/listWebsiteBuilderPageWorkflows.d.ts +1 -0
  275. package/features/gateway/graphql/listWebsiteBuilderPageWorkflows.js +18 -0
  276. package/features/gateway/graphql/listWebsiteBuilderPageWorkflows.js.map +1 -0
  277. package/features/gateway/graphql/reassignWebsiteBuilderPageReviewStep.d.ts +1 -0
  278. package/features/gateway/graphql/reassignWebsiteBuilderPageReviewStep.js +22 -0
  279. package/features/gateway/graphql/reassignWebsiteBuilderPageReviewStep.js.map +1 -0
  280. package/features/gateway/graphql/rejectWebsiteBuilderPageReviewStep.d.ts +1 -0
  281. package/features/gateway/graphql/rejectWebsiteBuilderPageReviewStep.js +22 -0
  282. package/features/gateway/graphql/rejectWebsiteBuilderPageReviewStep.js.map +1 -0
  283. package/features/gateway/graphql/requestWebsiteBuilderPageReview.d.ts +1 -0
  284. package/features/gateway/graphql/requestWebsiteBuilderPageReview.js +26 -0
  285. package/features/gateway/graphql/requestWebsiteBuilderPageReview.js.map +1 -0
  286. package/features/gateway/graphql/restartWebsiteBuilderPageReviewStep.d.ts +1 -0
  287. package/features/gateway/graphql/restartWebsiteBuilderPageReviewStep.js +18 -0
  288. package/features/gateway/graphql/restartWebsiteBuilderPageReviewStep.js.map +1 -0
  289. package/features/gateway/graphql/startWebsiteBuilderPageReviewStep.d.ts +1 -0
  290. package/features/gateway/graphql/startWebsiteBuilderPageReviewStep.js +18 -0
  291. package/features/gateway/graphql/startWebsiteBuilderPageReviewStep.js.map +1 -0
  292. package/features/gateway/graphql/takeOverWebsiteBuilderPageReviewStep.d.ts +1 -0
  293. package/features/gateway/graphql/takeOverWebsiteBuilderPageReviewStep.js +26 -0
  294. package/features/gateway/graphql/takeOverWebsiteBuilderPageReviewStep.js.map +1 -0
  295. package/features/trash/BulkDeletePresenterReviewDecorator.d.ts +14 -0
  296. package/features/trash/BulkDeletePresenterReviewDecorator.js +27 -0
  297. package/features/trash/BulkDeletePresenterReviewDecorator.js.map +1 -0
  298. package/features/trash/BulkDeletePresenterReviewDecorator.test.d.ts +1 -0
  299. package/features/trash/BulkDeletePresenterReviewDecorator.test.js +234 -0
  300. package/features/trash/BulkDeletePresenterReviewDecorator.test.js.map +1 -0
  301. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.d.ts +13 -0
  302. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.js +23 -0
  303. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.js.map +1 -0
  304. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.test.d.ts +1 -0
  305. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.test.js +114 -0
  306. package/features/trash/DeletePageRevisionUseCaseReviewDecorator.test.js.map +1 -0
  307. package/features/trash/DeletePageUseCaseReviewDecorator.d.ts +13 -0
  308. package/features/trash/DeletePageUseCaseReviewDecorator.js +23 -0
  309. package/features/trash/DeletePageUseCaseReviewDecorator.js.map +1 -0
  310. package/features/trash/DeletePageUseCaseReviewDecorator.test.d.ts +1 -0
  311. package/features/trash/DeletePageUseCaseReviewDecorator.test.js +134 -0
  312. package/features/trash/DeletePageUseCaseReviewDecorator.test.js.map +1 -0
  313. package/features/trash/feature.d.ts +1 -0
  314. package/features/trash/feature.js +15 -0
  315. package/features/trash/feature.js.map +1 -0
  316. package/features/trash/feature.test.d.ts +1 -0
  317. package/features/trash/feature.test.js +183 -0
  318. package/features/trash/feature.test.js.map +1 -0
  319. package/hooks/usePage.d.ts +5 -0
  320. package/hooks/usePage.js +15 -0
  321. package/hooks/usePage.js.map +1 -0
  322. package/hooks/usePage.test.d.ts +1 -0
  323. package/hooks/usePage.test.js +49 -0
  324. package/hooks/usePage.test.js.map +1 -0
  325. package/index.d.ts +2 -0
  326. package/index.js +40 -0
  327. package/index.js.map +1 -0
  328. package/index.mount.test.d.ts +1 -0
  329. package/index.mount.test.js +50 -0
  330. package/index.mount.test.js.map +1 -0
  331. package/index.test.d.ts +1 -0
  332. package/index.test.js +523 -0
  333. package/index.test.js.map +1 -0
  334. package/package.json +54 -0
  335. package/pageListChangeStatus.wiring.test.d.ts +1 -0
  336. package/pageListChangeStatus.wiring.test.js +175 -0
  337. package/pageListChangeStatus.wiring.test.js.map +1 -0
  338. package/pageListGlue.wiring.test.d.ts +1 -0
  339. package/pageListGlue.wiring.test.js +220 -0
  340. package/pageListGlue.wiring.test.js.map +1 -0
  341. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.d.ts +8 -0
  342. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.js +16 -0
  343. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.js.map +1 -0
  344. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.test.d.ts +1 -0
  345. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.test.js +19 -0
  346. package/presentation/page/PageGet/WbReviewGetPageFieldSelection.test.js.map +1 -0
  347. package/presentation/page/PageGet/feature.d.ts +1 -0
  348. package/presentation/page/PageGet/feature.js +11 -0
  349. package/presentation/page/PageGet/feature.js.map +1 -0
  350. package/presentation/page/PageList/WbReviewListPagesFieldSelection.d.ts +8 -0
  351. package/presentation/page/PageList/WbReviewListPagesFieldSelection.js +16 -0
  352. package/presentation/page/PageList/WbReviewListPagesFieldSelection.js.map +1 -0
  353. package/presentation/page/PageList/WbReviewListPagesFieldSelection.test.d.ts +1 -0
  354. package/presentation/page/PageList/WbReviewListPagesFieldSelection.test.js +19 -0
  355. package/presentation/page/PageList/WbReviewListPagesFieldSelection.test.js.map +1 -0
  356. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.d.ts +12 -0
  357. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.js +24 -0
  358. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.js.map +1 -0
  359. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.test.d.ts +1 -0
  360. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.test.js +70 -0
  361. package/presentation/page/PageList/WbReviewTableRowMapperDecorator.test.js.map +1 -0
  362. package/presentation/page/PageList/feature.d.ts +1 -0
  363. package/presentation/page/PageList/feature.js +13 -0
  364. package/presentation/page/PageList/feature.js.map +1 -0
  365. package/presentation/page/RevisionList/RevisionListPresenterDecorator.d.ts +15 -0
  366. package/presentation/page/RevisionList/RevisionListPresenterDecorator.js +36 -0
  367. package/presentation/page/RevisionList/RevisionListPresenterDecorator.js.map +1 -0
  368. package/presentation/page/RevisionList/RevisionListPresenterDecorator.test.d.ts +1 -0
  369. package/presentation/page/RevisionList/RevisionListPresenterDecorator.test.js +119 -0
  370. package/presentation/page/RevisionList/RevisionListPresenterDecorator.test.js.map +1 -0
  371. package/presentation/page/RevisionList/feature.d.ts +1 -0
  372. package/presentation/page/RevisionList/feature.js +11 -0
  373. package/presentation/page/RevisionList/feature.js.map +1 -0
  374. package/presentation/page/wbReviewPageSelection.d.ts +1 -0
  375. package/presentation/page/wbReviewPageSelection.js +9 -0
  376. package/presentation/page/wbReviewPageSelection.js.map +1 -0
  377. package/publishAutosave.wiring.test.d.ts +1 -0
  378. package/publishAutosave.wiring.test.js +162 -0
  379. package/publishAutosave.wiring.test.js.map +1 -0
  380. package/routes.d.ts +9 -0
  381. package/routes.js +19 -0
  382. package/routes.js.map +1 -0
  383. package/testing/WbEditorHarness.d.ts +11 -0
  384. package/testing/WbEditorHarness.js +22 -0
  385. package/testing/WbEditorHarness.js.map +1 -0
  386. package/testing/createFakeSession.d.ts +9 -0
  387. package/testing/createFakeSession.js +29 -0
  388. package/testing/createFakeSession.js.map +1 -0
  389. package/testing/createFakeVm.d.ts +3 -0
  390. package/testing/createFakeVm.js +51 -0
  391. package/testing/createFakeVm.js.map +1 -0
  392. package/testing/createFolder.d.ts +2 -0
  393. package/testing/createFolder.js +13 -0
  394. package/testing/createFolder.js.map +1 -0
  395. package/testing/createPageEditor.d.ts +4 -0
  396. package/testing/createPageEditor.js +26 -0
  397. package/testing/createPageEditor.js.map +1 -0
  398. package/testing/registerPageContent.d.ts +20 -0
  399. package/testing/registerPageContent.js +28 -0
  400. package/testing/registerPageContent.js.map +1 -0
  401. package/types.d.ts +9 -0
  402. package/types.js +0 -0
@@ -0,0 +1,45 @@
1
+ import react from "react";
2
+ import { Icon } from "@webiny/admin-ui";
3
+ import { ROOT_FOLDER } from "@webiny/app-aco/constants.js";
4
+ import { ListFoldersGateway } from "@webiny/app-aco/features/folders/listFolders/abstractions.js";
5
+ import { WB_PAGE_APP } from "@webiny/app-website-builder/constants.js";
6
+ import { buildAppFolders } from "@webiny/app-workflows/editor/folders/buildAppFolders.js";
7
+ import { ReactComponent } from "@webiny/icons/web.svg";
8
+ import { WbReviewContentAdapter } from "../gateway/WbReviewContentAdapter/abstractions.js";
9
+ import { WbWorkflowEditorAppAdapter } from "./abstractions.js";
10
+ class WbWorkflowEditorAppAdapterImpl {
11
+ constructor(contentAdapter, listFoldersGateway){
12
+ this.contentAdapter = contentAdapter;
13
+ this.listFoldersGateway = listFoldersGateway;
14
+ this.appKind = "wb";
15
+ this.panelLabel = "Website Builder";
16
+ this.appliesToLabel = "Website Builder";
17
+ }
18
+ async init() {}
19
+ renderModelIcon() {
20
+ return /*#__PURE__*/ react.createElement(Icon, {
21
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
22
+ label: "Pages",
23
+ size: "sm",
24
+ color: "neutral-light"
25
+ });
26
+ }
27
+ getFolderType() {
28
+ return WB_PAGE_APP;
29
+ }
30
+ async listFolders() {
31
+ const type = this.getFolderType();
32
+ const folders = await this.listFoldersGateway.execute(type);
33
+ return buildAppFolders(folders, ROOT_FOLDER);
34
+ }
35
+ }
36
+ const WbWorkflowEditorAppAdapter_WbWorkflowEditorAppAdapter = WbWorkflowEditorAppAdapter.createImplementation({
37
+ implementation: WbWorkflowEditorAppAdapterImpl,
38
+ dependencies: [
39
+ WbReviewContentAdapter,
40
+ ListFoldersGateway
41
+ ]
42
+ });
43
+ export { WbWorkflowEditorAppAdapter_WbWorkflowEditorAppAdapter as WbWorkflowEditorAppAdapter };
44
+
45
+ //# sourceMappingURL=WbWorkflowEditorAppAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/editorMounting/WbWorkflowEditorAppAdapter.js","sources":["../../../src/features/editorMounting/WbWorkflowEditorAppAdapter.tsx"],"sourcesContent":["import React from \"react\";\nimport { Icon } from \"@webiny/admin-ui\";\nimport { ROOT_FOLDER } from \"@webiny/app-aco/constants.js\";\nimport { ListFoldersGateway } from \"@webiny/app-aco/features/folders/listFolders/abstractions.js\";\nimport { WB_PAGE_APP as WB_PAGE_FOLDER_TYPE } from \"@webiny/app-website-builder/constants.js\";\nimport type { AppFolder } from \"@webiny/app-workflows/editor/WorkflowEditorAppAdapter.js\";\nimport { buildAppFolders } from \"@webiny/app-workflows/editor/folders/buildAppFolders.js\";\nimport { ReactComponent as PagesIcon } from \"@webiny/icons/web.svg\";\nimport { WbReviewContentAdapter } from \"~/features/gateway/WbReviewContentAdapter/abstractions.js\";\nimport { WbWorkflowEditorAppAdapter as AdapterAbstraction } from \"./abstractions.js\";\n\n/*\n * The Website Builder knowledge of the shared editor view (R280): one model, Pages, so there is no\n * list to load and one fixed icon. The folders are the page folders, type `wb:page`, whatever the\n * model id (R292).\n */\nclass WbWorkflowEditorAppAdapterImpl implements AdapterAbstraction.Interface {\n public readonly appKind = \"wb\";\n public readonly panelLabel = \"Website Builder\";\n public readonly appliesToLabel = \"Website Builder\";\n\n constructor(\n public readonly contentAdapter: WbReviewContentAdapter.Interface,\n private listFoldersGateway: ListFoldersGateway.Interface\n ) {}\n\n async init(): Promise<void> {\n // Pages need nothing loaded.\n }\n\n renderModelIcon(): React.ReactNode {\n return <Icon icon={<PagesIcon />} label=\"Pages\" size=\"sm\" color=\"neutral-light\" />;\n }\n\n getFolderType(): string {\n return WB_PAGE_FOLDER_TYPE;\n }\n\n async listFolders(): Promise<AppFolder[]> {\n const type = this.getFolderType();\n const folders = await this.listFoldersGateway.execute(type);\n\n return buildAppFolders(folders, ROOT_FOLDER);\n }\n}\n\nexport const WbWorkflowEditorAppAdapter = AdapterAbstraction.createImplementation({\n implementation: WbWorkflowEditorAppAdapterImpl,\n dependencies: [WbReviewContentAdapter, ListFoldersGateway]\n});\n"],"names":["WbWorkflowEditorAppAdapterImpl","contentAdapter","listFoldersGateway","Icon","PagesIcon","WB_PAGE_FOLDER_TYPE","type","folders","buildAppFolders","ROOT_FOLDER","WbWorkflowEditorAppAdapter","AdapterAbstraction","WbReviewContentAdapter","ListFoldersGateway"],"mappings":";;;;;;;;;AAgBA,MAAMA;IAKF,YACoBC,cAAgD,EACxDC,kBAAgD,CAC1D;aAFkBD,cAAc,GAAdA;aACRC,kBAAkB,GAAlBA;aANI,OAAO,GAAG;aACV,UAAU,GAAG;aACb,cAAc,GAAG;IAK9B;IAEH,MAAM,OAAsB,CAE5B;IAEA,kBAAmC;QAC/B,OAAO,WAAP,GAAO,oBAACC,MAAIA;YAAC,oBAAM,oBAACC,gBAASA;YAAK,OAAM;YAAQ,MAAK;YAAK,OAAM;;IACpE;IAEA,gBAAwB;QACpB,OAAOC;IACX;IAEA,MAAM,cAAoC;QACtC,MAAMC,OAAO,IAAI,CAAC,aAAa;QAC/B,MAAMC,UAAU,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACD;QAEtD,OAAOE,gBAAgBD,SAASE;IACpC;AACJ;AAEO,MAAMC,wDAA6BC,2BAAAA,oBAAuC,CAAC;IAC9E,gBAAgBX;IAChB,cAAc;QAACY;QAAwBC;KAAmB;AAC9D"}
@@ -0,0 +1,115 @@
1
+ import react from "react";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { Container } from "@webiny/di";
4
+ import { ROOT_FOLDER } from "@webiny/app-aco/constants.js";
5
+ import { RootFolder } from "@webiny/app-aco/domain/folder/RootFolder.js";
6
+ import { ListFoldersGateway } from "@webiny/app-aco/features/folders/listFolders/abstractions.js";
7
+ import { createFakeContentAdapter } from "@webiny/app-workflows/editor/testing/fakeReviewContentAdapter.js";
8
+ import { WbReviewContentAdapter } from "../gateway/WbReviewContentAdapter/abstractions.js";
9
+ import { createFolder } from "../../testing/createFolder.js";
10
+ import { WbWorkflowEditorAppAdapter } from "./abstractions.js";
11
+ import { WbWorkflowEditorAppAdapter as external_WbWorkflowEditorAppAdapter_js_WbWorkflowEditorAppAdapter } from "./WbWorkflowEditorAppAdapter.js";
12
+ const contentAdapter = createFakeContentAdapter();
13
+ const createAdapterWithGateway = (folders = [])=>{
14
+ const container = new Container();
15
+ const rootFolder = RootFolder.create();
16
+ const listFoldersExecute = vi.fn().mockResolvedValue([
17
+ rootFolder,
18
+ ...folders
19
+ ]);
20
+ container.registerInstance(ListFoldersGateway, {
21
+ execute: listFoldersExecute
22
+ });
23
+ container.registerInstance(WbReviewContentAdapter, contentAdapter);
24
+ container.register(external_WbWorkflowEditorAppAdapter_js_WbWorkflowEditorAppAdapter);
25
+ const adapter = container.resolve(WbWorkflowEditorAppAdapter);
26
+ return {
27
+ adapter,
28
+ listFoldersExecute
29
+ };
30
+ };
31
+ const createAdapter = ()=>createAdapterWithGateway().adapter;
32
+ describe("WbWorkflowEditorAppAdapter", ()=>{
33
+ it("describes the Website Builder app", ()=>{
34
+ const adapter = createAdapter();
35
+ expect(adapter.appKind).toBe("wb");
36
+ expect(adapter.panelLabel).toBe("Website Builder");
37
+ expect(adapter.appliesToLabel).toBe("Website Builder");
38
+ expect(adapter.contentAdapter).toBe(contentAdapter);
39
+ });
40
+ it("loads nothing on init", async ()=>{
41
+ const adapter = createAdapter();
42
+ await expect(adapter.init()).resolves.toBeUndefined();
43
+ });
44
+ it("renders the Pages icon for any model id", ()=>{
45
+ const adapter = createAdapter();
46
+ const node = adapter.renderModelIcon("wb.page");
47
+ if (!/*#__PURE__*/ react.isValidElement(node)) throw new Error("The model icon is not an element.");
48
+ expect(node.props.label).toBe("Pages");
49
+ });
50
+ describe("folders (R292)", ()=>{
51
+ it("names the page folder type wb:page whatever the model id", ()=>{
52
+ const adapter = createAdapter();
53
+ expect(adapter.getFolderType(null)).toBe("wb:page");
54
+ expect(adapter.getFolderType("page")).toBe("wb:page");
55
+ expect(adapter.getFolderType("anything")).toBe("wb:page");
56
+ });
57
+ it("lists the page folders with the type wb:page, root excluded, and the title paths", async ()=>{
58
+ const { adapter, listFoldersExecute } = createAdapterWithGateway([
59
+ createFolder("folder-a", "Landing pages", ROOT_FOLDER),
60
+ createFolder("folder-b", "Autumn", "folder-a"),
61
+ createFolder("folder-c", "Blog", ROOT_FOLDER)
62
+ ]);
63
+ const folders = await adapter.listFolders("page");
64
+ expect(listFoldersExecute).toHaveBeenCalledTimes(1);
65
+ expect(listFoldersExecute).toHaveBeenCalledWith("wb:page");
66
+ expect(folders).toEqual([
67
+ {
68
+ id: "folder-a",
69
+ path: "/Landing pages"
70
+ },
71
+ {
72
+ id: "folder-b",
73
+ path: "/Landing pages/Autumn"
74
+ },
75
+ {
76
+ id: "folder-c",
77
+ path: "/Blog"
78
+ }
79
+ ]);
80
+ });
81
+ it("ignores the model id, also null", async ()=>{
82
+ const { adapter, listFoldersExecute } = createAdapterWithGateway();
83
+ await adapter.listFolders(null);
84
+ await adapter.listFolders("anything");
85
+ expect(listFoldersExecute.mock.calls).toEqual([
86
+ [
87
+ "wb:page"
88
+ ],
89
+ [
90
+ "wb:page"
91
+ ]
92
+ ]);
93
+ });
94
+ it("passes a permission-filtered list through: a child of a hidden folder starts at its own title", async ()=>{
95
+ const { adapter } = createAdapterWithGateway([
96
+ createFolder("folder-b", "Autumn", "folder-hidden")
97
+ ]);
98
+ const folders = await adapter.listFolders("page");
99
+ expect(folders).toEqual([
100
+ {
101
+ id: "folder-b",
102
+ path: "/Autumn"
103
+ }
104
+ ]);
105
+ });
106
+ it("rejects when the folders cannot be loaded", async ()=>{
107
+ const { adapter, listFoldersExecute } = createAdapterWithGateway();
108
+ const failure = new Error("Could not fetch folders");
109
+ listFoldersExecute.mockRejectedValue(failure);
110
+ await expect(adapter.listFolders("page")).rejects.toBe(failure);
111
+ });
112
+ });
113
+ });
114
+
115
+ //# sourceMappingURL=WbWorkflowEditorAppAdapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/editorMounting/WbWorkflowEditorAppAdapter.test.js","sources":["../../../src/features/editorMounting/WbWorkflowEditorAppAdapter.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { ROOT_FOLDER } from \"@webiny/app-aco/constants.js\";\nimport type { FolderDto } from \"@webiny/app-aco/domain/folder/FolderDto.js\";\nimport { RootFolder } from \"@webiny/app-aco/domain/folder/RootFolder.js\";\nimport { ListFoldersGateway } from \"@webiny/app-aco/features/folders/listFolders/abstractions.js\";\nimport { createFakeContentAdapter } from \"@webiny/app-workflows/editor/testing/fakeReviewContentAdapter.js\";\nimport { WbReviewContentAdapter } from \"~/features/gateway/WbReviewContentAdapter/abstractions.js\";\nimport { createFolder } from \"~/testing/createFolder.js\";\nimport { WbWorkflowEditorAppAdapter as AdapterAbstraction } from \"./abstractions.js\";\nimport { WbWorkflowEditorAppAdapter } from \"./WbWorkflowEditorAppAdapter.js\";\n\ninterface RenderedIconProps {\n label: string;\n}\n\nconst contentAdapter = createFakeContentAdapter();\n\nconst createAdapterWithGateway = (folders: FolderDto[] = []) => {\n const container = new Container();\n // Mirrors the gateway of app-aco: the virtual root row comes first.\n const rootFolder = RootFolder.create();\n const listFoldersExecute = vi\n .fn<ListFoldersGateway.Interface[\"execute\"]>()\n .mockResolvedValue([rootFolder, ...folders]);\n container.registerInstance(ListFoldersGateway, { execute: listFoldersExecute });\n container.registerInstance(WbReviewContentAdapter, contentAdapter);\n container.register(WbWorkflowEditorAppAdapter);\n const adapter = container.resolve(AdapterAbstraction);\n\n return { adapter, listFoldersExecute };\n};\n\nconst createAdapter = () => {\n return createAdapterWithGateway().adapter;\n};\n\ndescribe(\"WbWorkflowEditorAppAdapter\", () => {\n it(\"describes the Website Builder app\", () => {\n const adapter = createAdapter();\n\n expect(adapter.appKind).toBe(\"wb\");\n expect(adapter.panelLabel).toBe(\"Website Builder\");\n expect(adapter.appliesToLabel).toBe(\"Website Builder\");\n expect(adapter.contentAdapter).toBe(contentAdapter);\n });\n\n it(\"loads nothing on init\", async () => {\n const adapter = createAdapter();\n\n await expect(adapter.init()).resolves.toBeUndefined();\n });\n\n it(\"renders the Pages icon for any model id\", () => {\n const adapter = createAdapter();\n\n const node = adapter.renderModelIcon(\"wb.page\");\n\n if (!React.isValidElement<RenderedIconProps>(node)) {\n throw new Error(\"The model icon is not an element.\");\n }\n expect(node.props.label).toBe(\"Pages\");\n });\n\n describe(\"folders (R292)\", () => {\n it(\"names the page folder type wb:page whatever the model id\", () => {\n const adapter = createAdapter();\n\n expect(adapter.getFolderType(null)).toBe(\"wb:page\");\n expect(adapter.getFolderType(\"page\")).toBe(\"wb:page\");\n expect(adapter.getFolderType(\"anything\")).toBe(\"wb:page\");\n });\n\n it(\"lists the page folders with the type wb:page, root excluded, and the title paths\", async () => {\n const { adapter, listFoldersExecute } = createAdapterWithGateway([\n createFolder(\"folder-a\", \"Landing pages\", ROOT_FOLDER),\n createFolder(\"folder-b\", \"Autumn\", \"folder-a\"),\n createFolder(\"folder-c\", \"Blog\", ROOT_FOLDER)\n ]);\n\n const folders = await adapter.listFolders(\"page\");\n\n expect(listFoldersExecute).toHaveBeenCalledTimes(1);\n expect(listFoldersExecute).toHaveBeenCalledWith(\"wb:page\");\n expect(folders).toEqual([\n { id: \"folder-a\", path: \"/Landing pages\" },\n { id: \"folder-b\", path: \"/Landing pages/Autumn\" },\n { id: \"folder-c\", path: \"/Blog\" }\n ]);\n });\n\n it(\"ignores the model id, also null\", async () => {\n const { adapter, listFoldersExecute } = createAdapterWithGateway();\n\n await adapter.listFolders(null);\n await adapter.listFolders(\"anything\");\n\n expect(listFoldersExecute.mock.calls).toEqual([[\"wb:page\"], [\"wb:page\"]]);\n });\n\n it(\"passes a permission-filtered list through: a child of a hidden folder starts at its own title\", async () => {\n const { adapter } = createAdapterWithGateway([\n createFolder(\"folder-b\", \"Autumn\", \"folder-hidden\")\n ]);\n\n const folders = await adapter.listFolders(\"page\");\n\n expect(folders).toEqual([{ id: \"folder-b\", path: \"/Autumn\" }]);\n });\n\n it(\"rejects when the folders cannot be loaded\", async () => {\n const { adapter, listFoldersExecute } = createAdapterWithGateway();\n const failure = new Error(\"Could not fetch folders\");\n listFoldersExecute.mockRejectedValue(failure);\n\n await expect(adapter.listFolders(\"page\")).rejects.toBe(failure);\n });\n });\n});\n"],"names":["contentAdapter","createFakeContentAdapter","createAdapterWithGateway","folders","container","Container","rootFolder","RootFolder","listFoldersExecute","vi","ListFoldersGateway","WbReviewContentAdapter","WbWorkflowEditorAppAdapter","adapter","AdapterAbstraction","createAdapter","describe","it","expect","node","React","Error","createFolder","ROOT_FOLDER","failure"],"mappings":";;;;;;;;;;;AAoBA,MAAMA,iBAAiBC;AAEvB,MAAMC,2BAA2B,CAACC,UAAuB,EAAE;IACvD,MAAMC,YAAY,IAAIC;IAEtB,MAAMC,aAAaC,WAAW,MAAM;IACpC,MAAMC,qBAAqBC,GAAAA,EACpB,GACF,iBAAiB,CAAC;QAACH;WAAeH;KAAQ;IAC/CC,UAAU,gBAAgB,CAACM,oBAAoB;QAAE,SAASF;IAAmB;IAC7EJ,UAAU,gBAAgB,CAACO,wBAAwBX;IACnDI,UAAU,QAAQ,CAACQ;IACnB,MAAMC,UAAUT,UAAU,OAAO,CAACU;IAElC,OAAO;QAAED;QAASL;IAAmB;AACzC;AAEA,MAAMO,gBAAgB,IACXb,2BAA2B,OAAO;AAG7Cc,SAAS,8BAA8B;IACnCC,GAAG,qCAAqC;QACpC,MAAMJ,UAAUE;QAEhBG,OAAOL,QAAQ,OAAO,EAAE,IAAI,CAAC;QAC7BK,OAAOL,QAAQ,UAAU,EAAE,IAAI,CAAC;QAChCK,OAAOL,QAAQ,cAAc,EAAE,IAAI,CAAC;QACpCK,OAAOL,QAAQ,cAAc,EAAE,IAAI,CAACb;IACxC;IAEAiB,GAAG,yBAAyB;QACxB,MAAMJ,UAAUE;QAEhB,MAAMG,OAAOL,QAAQ,IAAI,IAAI,QAAQ,CAAC,aAAa;IACvD;IAEAI,GAAG,2CAA2C;QAC1C,MAAMJ,UAAUE;QAEhB,MAAMI,OAAON,QAAQ,eAAe,CAAC;QAErC,IAAI,CAAC,WAAD,GAACO,MAAAA,cAAoB,CAAoBD,OACzC,MAAM,IAAIE,MAAM;QAEpBH,OAAOC,KAAK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;IAClC;IAEAH,SAAS,kBAAkB;QACvBC,GAAG,4DAA4D;YAC3D,MAAMJ,UAAUE;YAEhBG,OAAOL,QAAQ,aAAa,CAAC,OAAO,IAAI,CAAC;YACzCK,OAAOL,QAAQ,aAAa,CAAC,SAAS,IAAI,CAAC;YAC3CK,OAAOL,QAAQ,aAAa,CAAC,aAAa,IAAI,CAAC;QACnD;QAEAI,GAAG,oFAAoF;YACnF,MAAM,EAAEJ,OAAO,EAAEL,kBAAkB,EAAE,GAAGN,yBAAyB;gBAC7DoB,aAAa,YAAY,iBAAiBC;gBAC1CD,aAAa,YAAY,UAAU;gBACnCA,aAAa,YAAY,QAAQC;aACpC;YAED,MAAMpB,UAAU,MAAMU,QAAQ,WAAW,CAAC;YAE1CK,OAAOV,oBAAoB,qBAAqB,CAAC;YACjDU,OAAOV,oBAAoB,oBAAoB,CAAC;YAChDU,OAAOf,SAAS,OAAO,CAAC;gBACpB;oBAAE,IAAI;oBAAY,MAAM;gBAAiB;gBACzC;oBAAE,IAAI;oBAAY,MAAM;gBAAwB;gBAChD;oBAAE,IAAI;oBAAY,MAAM;gBAAQ;aACnC;QACL;QAEAc,GAAG,mCAAmC;YAClC,MAAM,EAAEJ,OAAO,EAAEL,kBAAkB,EAAE,GAAGN;YAExC,MAAMW,QAAQ,WAAW,CAAC;YAC1B,MAAMA,QAAQ,WAAW,CAAC;YAE1BK,OAAOV,mBAAmB,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAC;oBAAC;iBAAU;gBAAE;oBAAC;iBAAU;aAAC;QAC5E;QAEAS,GAAG,iGAAiG;YAChG,MAAM,EAAEJ,OAAO,EAAE,GAAGX,yBAAyB;gBACzCoB,aAAa,YAAY,UAAU;aACtC;YAED,MAAMnB,UAAU,MAAMU,QAAQ,WAAW,CAAC;YAE1CK,OAAOf,SAAS,OAAO,CAAC;gBAAC;oBAAE,IAAI;oBAAY,MAAM;gBAAU;aAAE;QACjE;QAEAc,GAAG,6CAA6C;YAC5C,MAAM,EAAEJ,OAAO,EAAEL,kBAAkB,EAAE,GAAGN;YACxC,MAAMsB,UAAU,IAAIH,MAAM;YAC1Bb,mBAAmB,iBAAiB,CAACgB;YAErC,MAAMN,OAAOL,QAAQ,WAAW,CAAC,SAAS,OAAO,CAAC,IAAI,CAACW;QAC3D;IACJ;AACJ"}
@@ -0,0 +1,5 @@
1
+ import type { WorkflowEditorAppAdapter } from "@webiny/app-workflows/editor/WorkflowEditorAppAdapter.js";
2
+ export declare const WbWorkflowEditorAppAdapter: import("@webiny/di").Abstraction<WorkflowEditorAppAdapter>;
3
+ export declare namespace WbWorkflowEditorAppAdapter {
4
+ type Interface = WorkflowEditorAppAdapter;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ const WbWorkflowEditorAppAdapter = createAbstraction("WebsiteBuilder/Workflows/EditorAppAdapter");
3
+ export { WbWorkflowEditorAppAdapter };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/editorMounting/abstractions.js","sources":["../../../src/features/editorMounting/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { WorkflowEditorAppAdapter } from \"@webiny/app-workflows/editor/WorkflowEditorAppAdapter.js\";\n\nexport const WbWorkflowEditorAppAdapter = createAbstraction<WorkflowEditorAppAdapter>(\n \"WebsiteBuilder/Workflows/EditorAppAdapter\"\n);\n\nexport namespace WbWorkflowEditorAppAdapter {\n export type Interface = WorkflowEditorAppAdapter;\n}\n"],"names":["WbWorkflowEditorAppAdapter","createAbstraction"],"mappings":";AAGO,MAAMA,6BAA6BC,kBACtC"}
@@ -0,0 +1,3 @@
1
+ export declare const WbWorkflowEditorMountingFeature: import("@webiny/feature/admin").FeatureDefinition<{
2
+ app: import("@webiny/app-workflows/editor/WorkflowEditorAppAdapter.js").WorkflowEditorAppAdapter;
3
+ }, []>;
@@ -0,0 +1,19 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { ListFoldersGqlGateway } from "@webiny/app-aco/features/folders/listFolders/ListFoldersGqlGateway.js";
3
+ import { WbWorkflowEditorAppAdapter } from "./abstractions.js";
4
+ import { WbWorkflowEditorAppAdapter as external_WbWorkflowEditorAppAdapter_js_WbWorkflowEditorAppAdapter } from "./WbWorkflowEditorAppAdapter.js";
5
+ const WbWorkflowEditorMountingFeature = createFeature({
6
+ name: "WebsiteBuilderWorkflows/EditorMounting",
7
+ register (container) {
8
+ container.register(ListFoldersGqlGateway);
9
+ container.register(external_WbWorkflowEditorAppAdapter_js_WbWorkflowEditorAppAdapter).inSingletonScope();
10
+ },
11
+ resolve (container) {
12
+ return {
13
+ app: container.resolve(WbWorkflowEditorAppAdapter)
14
+ };
15
+ }
16
+ });
17
+ export { WbWorkflowEditorMountingFeature };
18
+
19
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/editorMounting/feature.js","sources":["../../../src/features/editorMounting/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { ListFoldersGqlGateway } from \"@webiny/app-aco/features/folders/listFolders/ListFoldersGqlGateway.js\";\nimport { WbWorkflowEditorAppAdapter as AdapterAbstraction } from \"./abstractions.js\";\nimport { WbWorkflowEditorAppAdapter } from \"./WbWorkflowEditorAppAdapter.js\";\n\n/*\n * Resolves only the app adapter: the mounting component renders in the plugin pass, where nothing\n * may resolve a use case (R349, R354).\n */\nexport const WbWorkflowEditorMountingFeature = createFeature({\n name: \"WebsiteBuilderWorkflows/EditorMounting\",\n register(container) {\n // The adapter lists the page folders through app-aco's gateway (R292). The CMS registers\n // the same implementation; the last registration wins and they are alike.\n container.register(ListFoldersGqlGateway);\n container.register(WbWorkflowEditorAppAdapter).inSingletonScope();\n },\n resolve(container) {\n return {\n app: container.resolve(AdapterAbstraction)\n };\n }\n});\n"],"names":["WbWorkflowEditorMountingFeature","createFeature","container","ListFoldersGqlGateway","WbWorkflowEditorAppAdapter","AdapterAbstraction"],"mappings":";;;;AASO,MAAMA,kCAAkCC,cAAc;IACzD,MAAM;IACN,UAASC,SAAS;QAGdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE,mEAA4B,gBAAgB;IACnE;IACA,SAAQF,SAAS;QACb,OAAO;YACH,KAAKA,UAAU,OAAO,CAACG;QAC3B;IACJ;AACJ"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,93 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { Container } from "@webiny/di";
3
+ import { MainGraphQLClient } from "@webiny/app/features/mainGraphQLClient/abstractions.js";
4
+ import { FolderModelProvider } from "@webiny/app-aco/features/folders/abstractions.js";
5
+ import { createFakeContentAdapter } from "@webiny/app-workflows/editor/testing/fakeReviewContentAdapter.js";
6
+ import { WbReviewContentAdapter } from "../gateway/WbReviewContentAdapter/abstractions.js";
7
+ import { createFolder } from "../../testing/createFolder.js";
8
+ import { WbWorkflowEditorAppAdapter } from "./abstractions.js";
9
+ import { WbWorkflowEditorMountingFeature } from "./feature.js";
10
+ const contentAdapter = createFakeContentAdapter();
11
+ const createContainer = ()=>{
12
+ const client = {
13
+ execute: vi.fn()
14
+ };
15
+ const folderModelProvider = {
16
+ getModel: vi.fn().mockRejectedValue(new Error("The folder model is not needed here.")),
17
+ getGraphQLSelection: vi.fn().mockResolvedValue("{ id title parentId }")
18
+ };
19
+ const container = new Container();
20
+ container.registerInstance(MainGraphQLClient, client);
21
+ container.registerInstance(FolderModelProvider, folderModelProvider);
22
+ container.registerInstance(WbReviewContentAdapter, contentAdapter);
23
+ WbWorkflowEditorMountingFeature.register(container);
24
+ return {
25
+ container,
26
+ client
27
+ };
28
+ };
29
+ describe("WbWorkflowEditorMountingFeature", ()=>{
30
+ it("resolves only the app adapter for the view: no use case in the plugin pass (R349, R354)", ()=>{
31
+ const { container } = createContainer();
32
+ const resolved = WbWorkflowEditorMountingFeature.resolve(container);
33
+ expect(Object.keys(resolved)).toEqual([
34
+ "app"
35
+ ]);
36
+ expect(resolved.app.appKind).toBe("wb");
37
+ expect(resolved.app.contentAdapter).toBe(contentAdapter);
38
+ });
39
+ it("registers the app-aco folder gateway so the adapter lists the folders", async ()=>{
40
+ const { container, client } = createContainer();
41
+ client.execute.mockResolvedValue({
42
+ aco: {
43
+ listFolders: {
44
+ data: [
45
+ createFolder("folder-a", "Landing pages", "root"),
46
+ createFolder("folder-b", "Autumn", "folder-a")
47
+ ],
48
+ error: null
49
+ }
50
+ }
51
+ });
52
+ const { app } = WbWorkflowEditorMountingFeature.resolve(container);
53
+ const folders = await app.listFolders("page");
54
+ expect(folders).toEqual([
55
+ {
56
+ id: "folder-a",
57
+ path: "/Landing pages"
58
+ },
59
+ {
60
+ id: "folder-b",
61
+ path: "/Landing pages/Autumn"
62
+ }
63
+ ]);
64
+ expect(client.execute).toHaveBeenCalledTimes(1);
65
+ expect(client.execute.mock.calls[0][0].variables).toEqual({
66
+ type: "wb:page",
67
+ limit: 10000
68
+ });
69
+ });
70
+ it("rejects when the folder query returns no data", async ()=>{
71
+ const { container, client } = createContainer();
72
+ client.execute.mockResolvedValue({
73
+ aco: {
74
+ listFolders: {
75
+ data: null,
76
+ error: {
77
+ message: "Not allowed."
78
+ }
79
+ }
80
+ }
81
+ });
82
+ const { app } = WbWorkflowEditorMountingFeature.resolve(container);
83
+ await expect(app.listFolders("page")).rejects.toThrow("Not allowed.");
84
+ });
85
+ it("registers the adapter as a singleton", ()=>{
86
+ const { container } = createContainer();
87
+ const first = container.resolve(WbWorkflowEditorAppAdapter);
88
+ const second = container.resolve(WbWorkflowEditorAppAdapter);
89
+ expect(first).toBe(second);
90
+ });
91
+ });
92
+
93
+ //# sourceMappingURL=feature.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/editorMounting/feature.test.js","sources":["../../../src/features/editorMounting/feature.test.ts"],"sourcesContent":["import { describe } from \"vitest\";\nimport { expect } from \"vitest\";\nimport { it } from \"vitest\";\nimport { vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient/abstractions.js\";\nimport { FolderModelProvider } from \"@webiny/app-aco/features/folders/abstractions.js\";\nimport { createFakeContentAdapter } from \"@webiny/app-workflows/editor/testing/fakeReviewContentAdapter.js\";\nimport { WbReviewContentAdapter } from \"~/features/gateway/WbReviewContentAdapter/abstractions.js\";\nimport { createFolder } from \"~/testing/createFolder.js\";\nimport { WbWorkflowEditorAppAdapter } from \"./abstractions.js\";\nimport { WbWorkflowEditorMountingFeature } from \"./feature.js\";\n\nconst contentAdapter = createFakeContentAdapter();\n\nconst createContainer = () => {\n const client = { execute: vi.fn() };\n const folderModelProvider = {\n getModel: vi.fn().mockRejectedValue(new Error(\"The folder model is not needed here.\")),\n getGraphQLSelection: vi.fn().mockResolvedValue(\"{ id title parentId }\")\n };\n const container = new Container();\n container.registerInstance(MainGraphQLClient, client);\n container.registerInstance(FolderModelProvider, folderModelProvider);\n container.registerInstance(WbReviewContentAdapter, contentAdapter);\n WbWorkflowEditorMountingFeature.register(container);\n\n return { container, client };\n};\n\ndescribe(\"WbWorkflowEditorMountingFeature\", () => {\n it(\"resolves only the app adapter for the view: no use case in the plugin pass (R349, R354)\", () => {\n const { container } = createContainer();\n\n const resolved = WbWorkflowEditorMountingFeature.resolve(container);\n\n expect(Object.keys(resolved)).toEqual([\"app\"]);\n expect(resolved.app.appKind).toBe(\"wb\");\n expect(resolved.app.contentAdapter).toBe(contentAdapter);\n });\n\n it(\"registers the app-aco folder gateway so the adapter lists the folders\", async () => {\n const { container, client } = createContainer();\n client.execute.mockResolvedValue({\n aco: {\n listFolders: {\n data: [\n createFolder(\"folder-a\", \"Landing pages\", \"root\"),\n createFolder(\"folder-b\", \"Autumn\", \"folder-a\")\n ],\n error: null\n }\n }\n });\n const { app } = WbWorkflowEditorMountingFeature.resolve(container);\n\n const folders = await app.listFolders(\"page\");\n\n expect(folders).toEqual([\n { id: \"folder-a\", path: \"/Landing pages\" },\n { id: \"folder-b\", path: \"/Landing pages/Autumn\" }\n ]);\n expect(client.execute).toHaveBeenCalledTimes(1);\n expect(client.execute.mock.calls[0][0].variables).toEqual({\n type: \"wb:page\",\n limit: 10000\n });\n });\n\n it(\"rejects when the folder query returns no data\", async () => {\n const { container, client } = createContainer();\n client.execute.mockResolvedValue({\n aco: { listFolders: { data: null, error: { message: \"Not allowed.\" } } }\n });\n const { app } = WbWorkflowEditorMountingFeature.resolve(container);\n\n await expect(app.listFolders(\"page\")).rejects.toThrow(\"Not allowed.\");\n });\n\n it(\"registers the adapter as a singleton\", () => {\n const { container } = createContainer();\n\n const first = container.resolve(WbWorkflowEditorAppAdapter);\n const second = container.resolve(WbWorkflowEditorAppAdapter);\n\n expect(first).toBe(second);\n });\n});\n"],"names":["contentAdapter","createFakeContentAdapter","createContainer","client","vi","folderModelProvider","Error","container","Container","MainGraphQLClient","FolderModelProvider","WbReviewContentAdapter","WbWorkflowEditorMountingFeature","describe","it","resolved","expect","Object","createFolder","app","folders","first","WbWorkflowEditorAppAdapter","second"],"mappings":";;;;;;;;;AAaA,MAAMA,iBAAiBC;AAEvB,MAAMC,kBAAkB;IACpB,MAAMC,SAAS;QAAE,SAASC,GAAG,EAAE;IAAG;IAClC,MAAMC,sBAAsB;QACxB,UAAUD,GAAG,EAAE,GAAG,iBAAiB,CAAC,IAAIE,MAAM;QAC9C,qBAAqBF,GAAG,EAAE,GAAG,iBAAiB,CAAC;IACnD;IACA,MAAMG,YAAY,IAAIC;IACtBD,UAAU,gBAAgB,CAACE,mBAAmBN;IAC9CI,UAAU,gBAAgB,CAACG,qBAAqBL;IAChDE,UAAU,gBAAgB,CAACI,wBAAwBX;IACnDY,gCAAgC,QAAQ,CAACL;IAEzC,OAAO;QAAEA;QAAWJ;IAAO;AAC/B;AAEAU,SAAS,mCAAmC;IACxCC,GAAG,2FAA2F;QAC1F,MAAM,EAAEP,SAAS,EAAE,GAAGL;QAEtB,MAAMa,WAAWH,gCAAgC,OAAO,CAACL;QAEzDS,OAAOC,OAAO,IAAI,CAACF,WAAW,OAAO,CAAC;YAAC;SAAM;QAC7CC,OAAOD,SAAS,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;QAClCC,OAAOD,SAAS,GAAG,CAAC,cAAc,EAAE,IAAI,CAACf;IAC7C;IAEAc,GAAG,yEAAyE;QACxE,MAAM,EAAEP,SAAS,EAAEJ,MAAM,EAAE,GAAGD;QAC9BC,OAAO,OAAO,CAAC,iBAAiB,CAAC;YAC7B,KAAK;gBACD,aAAa;oBACT,MAAM;wBACFe,aAAa,YAAY,iBAAiB;wBAC1CA,aAAa,YAAY,UAAU;qBACtC;oBACD,OAAO;gBACX;YACJ;QACJ;QACA,MAAM,EAAEC,GAAG,EAAE,GAAGP,gCAAgC,OAAO,CAACL;QAExD,MAAMa,UAAU,MAAMD,IAAI,WAAW,CAAC;QAEtCH,OAAOI,SAAS,OAAO,CAAC;YACpB;gBAAE,IAAI;gBAAY,MAAM;YAAiB;YACzC;gBAAE,IAAI;gBAAY,MAAM;YAAwB;SACnD;QACDJ,OAAOb,OAAO,OAAO,EAAE,qBAAqB,CAAC;QAC7Ca,OAAOb,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;YACtD,MAAM;YACN,OAAO;QACX;IACJ;IAEAW,GAAG,iDAAiD;QAChD,MAAM,EAAEP,SAAS,EAAEJ,MAAM,EAAE,GAAGD;QAC9BC,OAAO,OAAO,CAAC,iBAAiB,CAAC;YAC7B,KAAK;gBAAE,aAAa;oBAAE,MAAM;oBAAM,OAAO;wBAAE,SAAS;oBAAe;gBAAE;YAAE;QAC3E;QACA,MAAM,EAAEgB,GAAG,EAAE,GAAGP,gCAAgC,OAAO,CAACL;QAExD,MAAMS,OAAOG,IAAI,WAAW,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC;IAC1D;IAEAL,GAAG,wCAAwC;QACvC,MAAM,EAAEP,SAAS,EAAE,GAAGL;QAEtB,MAAMmB,QAAQd,UAAU,OAAO,CAACe;QAChC,MAAMC,SAAShB,UAAU,OAAO,CAACe;QAEjCN,OAAOK,OAAO,IAAI,CAACE;IACvB;AACJ"}
@@ -0,0 +1,12 @@
1
+ import type { Editor } from "@webiny/app-website-builder/editorSdk/Editor.js";
2
+ import type { GetPageUseCase } from "@webiny/app-website-builder/features/pages/getPage/abstractions.js";
3
+ import type { FullPageCache } from "@webiny/app-website-builder/features/pages/shared/abstractions.js";
4
+ import type { IReviewContentReloader } from "@webiny/app-workflows/review/content/IReviewContentReloader.js";
5
+ import type { IPageEditorDocument } from "../../Components/PageEditor/pageEditorDocument.js";
6
+ export declare class WbPageContentReloader implements IReviewContentReloader {
7
+ private readonly editor;
8
+ private readonly cache;
9
+ private readonly getPage;
10
+ constructor(editor: Editor<IPageEditorDocument>, cache: FullPageCache.Interface, getPage: GetPageUseCase.Interface);
11
+ reload(): Promise<boolean>;
12
+ }
@@ -0,0 +1,40 @@
1
+ import { pageToEditorDocument } from "@webiny/app-website-builder/presentation/pages/PageEditor/pageDocument.js";
2
+ class WbPageContentReloader {
3
+ constructor(editor, cache, getPage){
4
+ this.editor = editor;
5
+ this.cache = cache;
6
+ this.getPage = getPage;
7
+ }
8
+ async reload() {
9
+ const document = this.editor.getDocumentState().read();
10
+ const pageId = document.id;
11
+ let loadedSavedOn = document.savedOn;
12
+ let loadedModifiedOn = document.modifiedOn ?? "";
13
+ const cached = this.cache.getItem((item)=>item.id === pageId);
14
+ if (cached) {
15
+ loadedSavedOn = cached.savedOn;
16
+ loadedModifiedOn = cached.modifiedOn;
17
+ }
18
+ this.cache.removeItems((item)=>item.id === pageId);
19
+ const page = await this.getPage.execute({
20
+ id: pageId
21
+ });
22
+ const sameSavedOn = page.savedOn === loadedSavedOn;
23
+ const sameModifiedOn = page.modifiedOn === loadedModifiedOn;
24
+ if (sameSavedOn && sameModifiedOn) return false;
25
+ const next = pageToEditorDocument(page);
26
+ this.editor.updateDocument((state)=>{
27
+ state.properties = next.properties;
28
+ state.bindings = next.bindings;
29
+ state.elements = next.elements;
30
+ state.metadata = next.metadata;
31
+ state.extensions = next.extensions;
32
+ state.savedOn = page.savedOn;
33
+ state.modifiedOn = page.modifiedOn;
34
+ });
35
+ return true;
36
+ }
37
+ }
38
+ export { WbPageContentReloader };
39
+
40
+ //# sourceMappingURL=WbPageContentReloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/editorReview/WbPageContentReloader.js","sources":["../../../src/features/editorReview/WbPageContentReloader.ts"],"sourcesContent":["import type { Editor } from \"@webiny/app-website-builder/editorSdk/Editor.js\";\nimport type { GetPageUseCase } from \"@webiny/app-website-builder/features/pages/getPage/abstractions.js\";\nimport type { FullPageCache } from \"@webiny/app-website-builder/features/pages/shared/abstractions.js\";\nimport { pageToEditorDocument } from \"@webiny/app-website-builder/presentation/pages/PageEditor/pageDocument.js\";\nimport type { IReviewContentReloader } from \"@webiny/app-workflows/review/content/IReviewContentReloader.js\";\nimport type { IPageEditorDocument } from \"~/Components/PageEditor/pageEditorDocument.js\";\n\n/*\n * Reloads the page a review is tracking after an AI or automation step may have changed it\n * (R262). The page editor cannot be dirty during a review (autosave is off), so only the revision\n * timestamps decide. `GetPageRepository` returns the `FullPageCache` entry first (A96), so the\n * page is evicted before it is read. The editor is updated in place; the review presenter is never\n * initialised again. `true` means the reloaded page differs from the loaded one.\n */\nexport class WbPageContentReloader implements IReviewContentReloader {\n constructor(\n private readonly editor: Editor<IPageEditorDocument>,\n private readonly cache: FullPageCache.Interface,\n private readonly getPage: GetPageUseCase.Interface\n ) {}\n\n async reload(): Promise<boolean> {\n const document = this.editor.getDocumentState().read();\n const pageId = document.id;\n\n // The cached page is the newest state the client knows (autosave and publish keep it\n // current); the document is the fallback.\n let loadedSavedOn = document.savedOn;\n let loadedModifiedOn = document.modifiedOn ?? \"\";\n const cached = this.cache.getItem(item => item.id === pageId);\n\n if (cached) {\n loadedSavedOn = cached.savedOn;\n loadedModifiedOn = cached.modifiedOn;\n }\n\n this.cache.removeItems(item => item.id === pageId);\n\n const page = await this.getPage.execute({ id: pageId });\n\n const sameSavedOn = page.savedOn === loadedSavedOn;\n const sameModifiedOn = page.modifiedOn === loadedModifiedOn;\n\n if (sameSavedOn && sameModifiedOn) {\n return false;\n }\n\n const next = pageToEditorDocument(page);\n\n this.editor.updateDocument(state => {\n state.properties = next.properties;\n state.bindings = next.bindings;\n state.elements = next.elements;\n state.metadata = next.metadata;\n state.extensions = next.extensions;\n state.savedOn = page.savedOn;\n state.modifiedOn = page.modifiedOn;\n });\n\n return true;\n }\n}\n"],"names":["WbPageContentReloader","editor","cache","getPage","document","pageId","loadedSavedOn","loadedModifiedOn","cached","item","page","sameSavedOn","sameModifiedOn","next","pageToEditorDocument","state"],"mappings":";AAcO,MAAMA;IACT,YACqBC,MAAmC,EACnCC,KAA8B,EAC9BC,OAAiC,CACpD;aAHmBF,MAAM,GAANA;aACAC,KAAK,GAALA;aACAC,OAAO,GAAPA;IAClB;IAEH,MAAM,SAA2B;QAC7B,MAAMC,WAAW,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI;QACpD,MAAMC,SAASD,SAAS,EAAE;QAI1B,IAAIE,gBAAgBF,SAAS,OAAO;QACpC,IAAIG,mBAAmBH,SAAS,UAAU,IAAI;QAC9C,MAAMI,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAACC,CAAAA,OAAQA,KAAK,EAAE,KAAKJ;QAEtD,IAAIG,QAAQ;YACRF,gBAAgBE,OAAO,OAAO;YAC9BD,mBAAmBC,OAAO,UAAU;QACxC;QAEA,IAAI,CAAC,KAAK,CAAC,WAAW,CAACC,CAAAA,OAAQA,KAAK,EAAE,KAAKJ;QAE3C,MAAMK,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,IAAIL;QAAO;QAErD,MAAMM,cAAcD,KAAK,OAAO,KAAKJ;QACrC,MAAMM,iBAAiBF,KAAK,UAAU,KAAKH;QAE3C,IAAII,eAAeC,gBACf,OAAO;QAGX,MAAMC,OAAOC,qBAAqBJ;QAElC,IAAI,CAAC,MAAM,CAAC,cAAc,CAACK,CAAAA;YACvBA,MAAM,UAAU,GAAGF,KAAK,UAAU;YAClCE,MAAM,QAAQ,GAAGF,KAAK,QAAQ;YAC9BE,MAAM,QAAQ,GAAGF,KAAK,QAAQ;YAC9BE,MAAM,QAAQ,GAAGF,KAAK,QAAQ;YAC9BE,MAAM,UAAU,GAAGF,KAAK,UAAU;YAClCE,MAAM,OAAO,GAAGL,KAAK,OAAO;YAC5BK,MAAM,UAAU,GAAGL,KAAK,UAAU;QACtC;QAEA,OAAO;IACX;AACJ"}
@@ -0,0 +1,222 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { ListCache } from "@webiny/app-admin/features/listCache/index.js";
3
+ import { Page } from "@webiny/app-website-builder/domain/Page/index.js";
4
+ import { Editor } from "@webiny/app-website-builder/editorSdk/Editor.js";
5
+ import { WbPageStatus } from "@webiny/app-website-builder/constants.js";
6
+ import { WbPageContentReloader } from "./WbPageContentReloader.js";
7
+ const PAGE_ID = "page-1#0001";
8
+ const SAVED = "2026-10-17T10:00:00.000Z";
9
+ const SAVED_LATER = "2026-10-17T11:00:00.000Z";
10
+ const MODIFIED = "2026-10-17T10:30:00.000Z";
11
+ const MODIFIED_LATER = "2026-10-17T11:30:00.000Z";
12
+ const ROOT = {
13
+ type: "Webiny/Element",
14
+ id: "root",
15
+ component: {
16
+ name: "Webiny/Box"
17
+ }
18
+ };
19
+ const HERO = {
20
+ type: "Webiny/Element",
21
+ id: "hero",
22
+ component: {
23
+ name: "Webiny/Heading"
24
+ },
25
+ parent: {
26
+ id: "root",
27
+ slot: "children"
28
+ }
29
+ };
30
+ const OLD_ELEMENTS = {
31
+ root: ROOT
32
+ };
33
+ const NEW_ELEMENTS = {
34
+ root: ROOT,
35
+ hero: HERO
36
+ };
37
+ const NEW_PROPERTIES = {
38
+ title: "Home (rewritten)"
39
+ };
40
+ const NEW_BINDINGS = {
41
+ hero: {
42
+ inputs: {
43
+ text: {
44
+ static: "Welcome"
45
+ }
46
+ }
47
+ }
48
+ };
49
+ const NEW_METADATA = {
50
+ seo: {
51
+ title: "Home SEO"
52
+ }
53
+ };
54
+ const NEW_EXTENSIONS = {
55
+ tracking: {
56
+ enabled: true
57
+ }
58
+ };
59
+ function createPage(overrides = {}) {
60
+ return Page.create({
61
+ id: PAGE_ID,
62
+ entryId: "page-1",
63
+ status: WbPageStatus.Draft,
64
+ properties: {
65
+ title: "Home"
66
+ },
67
+ elements: OLD_ELEMENTS,
68
+ savedOn: SAVED,
69
+ modifiedOn: MODIFIED,
70
+ ...overrides
71
+ });
72
+ }
73
+ function createEditor(overrides = {}) {
74
+ const document = {
75
+ id: PAGE_ID,
76
+ status: WbPageStatus.Draft,
77
+ version: 1,
78
+ state: {},
79
+ properties: {
80
+ title: "Home"
81
+ },
82
+ extensions: {},
83
+ metadata: {},
84
+ bindings: {},
85
+ elements: OLD_ELEMENTS,
86
+ savedOn: SAVED,
87
+ modifiedOn: MODIFIED,
88
+ ...overrides
89
+ };
90
+ return new Editor(document, {
91
+ isReadOnly: true
92
+ });
93
+ }
94
+ describe("WbPageContentReloader", ()=>{
95
+ let cache;
96
+ let editor;
97
+ let getPage;
98
+ let reloader;
99
+ let cachedWhenRead;
100
+ beforeEach(()=>{
101
+ cache = new ListCache("id");
102
+ cache.addItems([
103
+ createPage(),
104
+ createPage({
105
+ id: "page-2#0001",
106
+ entryId: "page-2"
107
+ })
108
+ ]);
109
+ editor = createEditor();
110
+ cachedWhenRead = void 0;
111
+ getPage = {
112
+ execute: vi.fn(async (_params)=>{
113
+ cachedWhenRead = cache.getItem((page)=>page.id === PAGE_ID);
114
+ return createPage({
115
+ savedOn: SAVED_LATER,
116
+ elements: NEW_ELEMENTS,
117
+ properties: NEW_PROPERTIES,
118
+ bindings: NEW_BINDINGS,
119
+ metadata: NEW_METADATA,
120
+ extensions: NEW_EXTENSIONS
121
+ });
122
+ })
123
+ };
124
+ reloader = new WbPageContentReloader(editor, cache, getPage);
125
+ });
126
+ it("evicts the page from the full page cache before it reads it (A96)", async ()=>{
127
+ await reloader.reload();
128
+ expect(getPage.execute).toHaveBeenCalledTimes(1);
129
+ expect(getPage.execute).toHaveBeenCalledWith({
130
+ id: PAGE_ID
131
+ });
132
+ expect(cachedWhenRead).toBeUndefined();
133
+ });
134
+ it("keeps the other cached pages", async ()=>{
135
+ await reloader.reload();
136
+ const other = cache.getItem((page)=>"page-2#0001" === page.id);
137
+ expect(other).toEqual(createPage({
138
+ id: "page-2#0001",
139
+ entryId: "page-2"
140
+ }));
141
+ });
142
+ it("applies the reloaded content with updateDocument and returns true when savedOn changed", async ()=>{
143
+ const changed = await reloader.reload();
144
+ expect(changed).toBe(true);
145
+ const document = editor.getDocumentState().read();
146
+ expect(document.elements).toEqual(NEW_ELEMENTS);
147
+ expect(document.properties).toEqual(NEW_PROPERTIES);
148
+ expect(document.bindings).toEqual(NEW_BINDINGS);
149
+ expect(document.metadata).toEqual(NEW_METADATA);
150
+ expect(document.extensions).toEqual(NEW_EXTENSIONS);
151
+ expect(document.savedOn).toBe(SAVED_LATER);
152
+ expect(document.modifiedOn).toBe(MODIFIED);
153
+ expect(document.id).toBe(PAGE_ID);
154
+ expect(document.status).toBe(WbPageStatus.Draft);
155
+ });
156
+ it("applies the document through updateDocument once and never writes the page back", async ()=>{
157
+ const updateDocument = vi.spyOn(editor, "updateDocument");
158
+ await reloader.reload();
159
+ expect(updateDocument).toHaveBeenCalledTimes(1);
160
+ expect(getPage.execute).toHaveBeenCalledTimes(1);
161
+ expect(cache.getItem((page)=>page.id === PAGE_ID)).toBeUndefined();
162
+ expect(cache.getItems()).toHaveLength(1);
163
+ });
164
+ it("returns true when only modifiedOn changed", async ()=>{
165
+ getPage.execute.mockImplementation(async ()=>createPage({
166
+ modifiedOn: MODIFIED_LATER,
167
+ elements: NEW_ELEMENTS
168
+ }));
169
+ const changed = await reloader.reload();
170
+ expect(changed).toBe(true);
171
+ expect(editor.getDocumentState().read().modifiedOn).toBe(MODIFIED_LATER);
172
+ });
173
+ it("returns false and leaves the editor alone when the timestamps are the same", async ()=>{
174
+ getPage.execute.mockImplementation(async ()=>createPage({
175
+ elements: NEW_ELEMENTS
176
+ }));
177
+ const changed = await reloader.reload();
178
+ expect(changed).toBe(false);
179
+ expect(editor.getDocumentState().read().elements).toEqual(OLD_ELEMENTS);
180
+ });
181
+ it("compares with the cached page when it is cached, not with the stale document", async ()=>{
182
+ cache.removeItems((page)=>page.id === PAGE_ID);
183
+ cache.addItems([
184
+ createPage({
185
+ savedOn: SAVED_LATER
186
+ })
187
+ ]);
188
+ getPage.execute.mockImplementation(async ()=>createPage({
189
+ savedOn: SAVED_LATER,
190
+ elements: NEW_ELEMENTS
191
+ }));
192
+ const changed = await reloader.reload();
193
+ expect(changed).toBe(false);
194
+ expect(editor.getDocumentState().read().elements).toEqual(OLD_ELEMENTS);
195
+ });
196
+ it("compares with the editor document when the page is not cached", async ()=>{
197
+ cache.clear();
198
+ const changed = await reloader.reload();
199
+ expect(changed).toBe(true);
200
+ });
201
+ it("treats a missing modifiedOn of the document like the empty string Page.create uses", async ()=>{
202
+ cache.clear();
203
+ editor = createEditor({
204
+ modifiedOn: null
205
+ });
206
+ reloader = new WbPageContentReloader(editor, cache, getPage);
207
+ getPage.execute.mockImplementation(async ()=>createPage({
208
+ modifiedOn: ""
209
+ }));
210
+ const changed = await reloader.reload();
211
+ expect(changed).toBe(false);
212
+ });
213
+ it("lets a failed read reject and leaves the editor alone", async ()=>{
214
+ const failure = new Error("Network down");
215
+ getPage.execute.mockRejectedValue(failure);
216
+ const error = await reloader.reload().catch((e)=>e);
217
+ expect(error).toBe(failure);
218
+ expect(editor.getDocumentState().read().elements).toEqual(OLD_ELEMENTS);
219
+ });
220
+ });
221
+
222
+ //# sourceMappingURL=WbPageContentReloader.test.js.map