@strapi/review-workflows 5.12.1 → 5.12.2

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 (327) hide show
  1. package/dist/admin/{chunks/index-DcEF47R4.mjs → assets/balloon.png.js} +3 -1078
  2. package/dist/admin/assets/balloon.png.js.map +1 -0
  3. package/dist/admin/{chunks/index-CzdEqFOm.js → assets/balloon.png.mjs} +2 -1113
  4. package/dist/admin/assets/balloon.png.mjs.map +1 -0
  5. package/dist/admin/assets/purchase-page-illustration-dark.svg.js +6 -0
  6. package/dist/admin/assets/purchase-page-illustration-dark.svg.js.map +1 -0
  7. package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs +4 -0
  8. package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs.map +1 -0
  9. package/dist/admin/{chunks/purchase-review-workflows-4n0KXAeo.mjs → assets/purchase-page-illustration-light.svg.js} +3 -197
  10. package/dist/admin/assets/purchase-page-illustration-light.svg.js.map +1 -0
  11. package/dist/admin/{chunks/purchase-review-workflows-BDLncDcz.js → assets/purchase-page-illustration-light.svg.mjs} +2 -200
  12. package/dist/admin/assets/purchase-page-illustration-light.svg.mjs.map +1 -0
  13. package/dist/admin/components/LimitsModal.js +122 -0
  14. package/dist/admin/components/LimitsModal.js.map +1 -0
  15. package/dist/admin/components/LimitsModal.mjs +120 -0
  16. package/dist/admin/components/LimitsModal.mjs.map +1 -0
  17. package/dist/admin/constants.js +18 -0
  18. package/dist/admin/constants.js.map +1 -0
  19. package/dist/admin/constants.mjs +12 -0
  20. package/dist/admin/constants.mjs.map +1 -0
  21. package/dist/admin/index.js +87 -13
  22. package/dist/admin/index.js.map +1 -1
  23. package/dist/admin/index.mjs +88 -12
  24. package/dist/admin/index.mjs.map +1 -1
  25. package/dist/admin/modules/hooks.js +8 -0
  26. package/dist/admin/modules/hooks.js.map +1 -0
  27. package/dist/admin/modules/hooks.mjs +6 -0
  28. package/dist/admin/modules/hooks.mjs.map +1 -0
  29. package/dist/admin/{chunks/router-ChVwf8TN.js → router.js} +3 -3
  30. package/dist/admin/router.js.map +1 -0
  31. package/dist/admin/{chunks/router-D-YCUzYy.mjs → router.mjs} +3 -3
  32. package/dist/admin/router.mjs.map +1 -0
  33. package/dist/admin/routes/content-manager/model/components/TableColumns.js +44 -0
  34. package/dist/admin/routes/content-manager/model/components/TableColumns.js.map +1 -0
  35. package/dist/admin/routes/content-manager/model/components/TableColumns.mjs +41 -0
  36. package/dist/admin/routes/content-manager/model/components/TableColumns.mjs.map +1 -0
  37. package/dist/admin/routes/content-manager/model/constants.js +60 -0
  38. package/dist/admin/routes/content-manager/model/constants.js.map +1 -0
  39. package/dist/admin/routes/content-manager/model/constants.mjs +58 -0
  40. package/dist/admin/routes/content-manager/model/constants.mjs.map +1 -0
  41. package/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.js +169 -0
  42. package/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.js.map +1 -0
  43. package/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.mjs +148 -0
  44. package/dist/admin/routes/content-manager/model/id/components/AssigneeSelect.mjs.map +1 -0
  45. package/dist/admin/routes/content-manager/model/id/components/Header.js +31 -0
  46. package/dist/admin/routes/content-manager/model/id/components/Header.js.map +1 -0
  47. package/dist/admin/routes/content-manager/model/id/components/Header.mjs +29 -0
  48. package/dist/admin/routes/content-manager/model/id/components/Header.mjs.map +1 -0
  49. package/dist/admin/routes/content-manager/model/id/components/Panel.js +39 -0
  50. package/dist/admin/routes/content-manager/model/id/components/Panel.js.map +1 -0
  51. package/dist/admin/routes/content-manager/model/id/components/Panel.mjs +37 -0
  52. package/dist/admin/routes/content-manager/model/id/components/Panel.mjs.map +1 -0
  53. package/dist/admin/routes/content-manager/model/id/components/StageSelect.js +329 -0
  54. package/dist/admin/routes/content-manager/model/id/components/StageSelect.js.map +1 -0
  55. package/dist/admin/routes/content-manager/model/id/components/StageSelect.mjs +308 -0
  56. package/dist/admin/routes/content-manager/model/id/components/StageSelect.mjs.map +1 -0
  57. package/dist/admin/routes/content-manager/model/id/components/constants.js +8 -0
  58. package/dist/admin/routes/content-manager/model/id/components/constants.js.map +1 -0
  59. package/dist/admin/routes/content-manager/model/id/components/constants.mjs +5 -0
  60. package/dist/admin/routes/content-manager/model/id/components/constants.mjs.map +1 -0
  61. package/dist/admin/routes/purchase-review-workflows.js +194 -0
  62. package/dist/admin/routes/purchase-review-workflows.js.map +1 -0
  63. package/dist/admin/routes/purchase-review-workflows.mjs +192 -0
  64. package/dist/admin/routes/purchase-review-workflows.mjs.map +1 -0
  65. package/dist/admin/routes/settings/components/AddStage.js +51 -0
  66. package/dist/admin/routes/settings/components/AddStage.js.map +1 -0
  67. package/dist/admin/routes/settings/components/AddStage.mjs +49 -0
  68. package/dist/admin/routes/settings/components/AddStage.mjs.map +1 -0
  69. package/dist/admin/routes/settings/components/Layout.js +86 -0
  70. package/dist/admin/routes/settings/components/Layout.js.map +1 -0
  71. package/dist/admin/routes/settings/components/Layout.mjs +82 -0
  72. package/dist/admin/routes/settings/components/Layout.mjs.map +1 -0
  73. package/dist/admin/routes/settings/components/StageDragPreview.js +40 -0
  74. package/dist/admin/routes/settings/components/StageDragPreview.js.map +1 -0
  75. package/dist/admin/routes/settings/components/StageDragPreview.mjs +38 -0
  76. package/dist/admin/routes/settings/components/StageDragPreview.mjs.map +1 -0
  77. package/dist/admin/routes/settings/components/Stages.js +593 -0
  78. package/dist/admin/routes/settings/components/Stages.js.map +1 -0
  79. package/dist/admin/routes/settings/components/Stages.mjs +572 -0
  80. package/dist/admin/routes/settings/components/Stages.mjs.map +1 -0
  81. package/dist/admin/routes/settings/components/WorkflowAttributes.js +203 -0
  82. package/dist/admin/routes/settings/components/WorkflowAttributes.js.map +1 -0
  83. package/dist/admin/routes/settings/components/WorkflowAttributes.mjs +201 -0
  84. package/dist/admin/routes/settings/components/WorkflowAttributes.mjs.map +1 -0
  85. package/dist/admin/routes/settings/constants.js +8 -0
  86. package/dist/admin/routes/settings/constants.js.map +1 -0
  87. package/dist/admin/routes/settings/constants.mjs +6 -0
  88. package/dist/admin/routes/settings/constants.mjs.map +1 -0
  89. package/dist/admin/routes/settings/hooks/useDragAndDrop.js +193 -0
  90. package/dist/admin/routes/settings/hooks/useDragAndDrop.js.map +1 -0
  91. package/dist/admin/routes/settings/hooks/useDragAndDrop.mjs +170 -0
  92. package/dist/admin/routes/settings/hooks/useDragAndDrop.mjs.map +1 -0
  93. package/dist/admin/routes/settings/hooks/useKeyboardDragAndDrop.js +94 -0
  94. package/dist/admin/routes/settings/hooks/useKeyboardDragAndDrop.js.map +1 -0
  95. package/dist/admin/routes/settings/hooks/useKeyboardDragAndDrop.mjs +73 -0
  96. package/dist/admin/routes/settings/hooks/useKeyboardDragAndDrop.mjs.map +1 -0
  97. package/dist/admin/{chunks/Layout-C4ri_ldC.js → routes/settings/hooks/useReviewWorkflows.js} +6 -121
  98. package/dist/admin/routes/settings/hooks/useReviewWorkflows.js.map +1 -0
  99. package/dist/admin/{chunks/Layout-CF497D6H.mjs → routes/settings/hooks/useReviewWorkflows.mjs} +4 -115
  100. package/dist/admin/routes/settings/hooks/useReviewWorkflows.mjs.map +1 -0
  101. package/dist/admin/routes/settings/id.js +404 -0
  102. package/dist/admin/routes/settings/id.js.map +1 -0
  103. package/dist/admin/routes/settings/id.mjs +382 -0
  104. package/dist/admin/routes/settings/id.mjs.map +1 -0
  105. package/dist/admin/{chunks/index-CCx4kT-t.js → routes/settings/index.js} +15 -15
  106. package/dist/admin/routes/settings/index.js.map +1 -0
  107. package/dist/admin/{chunks/index-iChY7MsG.mjs → routes/settings/index.mjs} +7 -7
  108. package/dist/admin/routes/settings/index.mjs.map +1 -0
  109. package/dist/admin/services/admin.js +23 -0
  110. package/dist/admin/services/admin.js.map +1 -0
  111. package/dist/admin/services/admin.mjs +21 -0
  112. package/dist/admin/services/admin.mjs.map +1 -0
  113. package/dist/admin/services/api.js +15 -0
  114. package/dist/admin/services/api.js.map +1 -0
  115. package/dist/admin/services/api.mjs +13 -0
  116. package/dist/admin/services/api.mjs.map +1 -0
  117. package/dist/admin/services/content-manager.js +101 -0
  118. package/dist/admin/services/content-manager.js.map +1 -0
  119. package/dist/admin/services/content-manager.mjs +96 -0
  120. package/dist/admin/services/content-manager.mjs.map +1 -0
  121. package/dist/admin/services/settings.js +123 -0
  122. package/dist/admin/services/settings.js.map +1 -0
  123. package/dist/admin/services/settings.mjs +118 -0
  124. package/dist/admin/services/settings.mjs.map +1 -0
  125. package/dist/admin/{chunks/en-BNGiWajd.js → translations/en.json.js} +2 -2
  126. package/dist/admin/translations/en.json.js.map +1 -0
  127. package/dist/admin/{chunks/en-BrZXFtVv.mjs → translations/en.json.mjs} +1 -1
  128. package/dist/admin/translations/en.json.mjs.map +1 -0
  129. package/dist/admin/{chunks/uk-CbRUr1I7.js → translations/uk.json.js} +2 -2
  130. package/dist/admin/translations/uk.json.js.map +1 -0
  131. package/dist/admin/{chunks/uk-DLlzEBUF.mjs → translations/uk.json.mjs} +1 -1
  132. package/dist/admin/translations/uk.json.mjs.map +1 -0
  133. package/dist/admin/utils/api.js +22 -0
  134. package/dist/admin/utils/api.js.map +1 -0
  135. package/dist/admin/utils/api.mjs +19 -0
  136. package/dist/admin/utils/api.mjs.map +1 -0
  137. package/dist/admin/utils/cm-hooks.js +23 -0
  138. package/dist/admin/utils/cm-hooks.js.map +1 -0
  139. package/dist/admin/utils/cm-hooks.mjs +21 -0
  140. package/dist/admin/utils/cm-hooks.mjs.map +1 -0
  141. package/dist/admin/utils/colors.js +50 -0
  142. package/dist/admin/utils/colors.js.map +1 -0
  143. package/dist/admin/utils/colors.mjs +47 -0
  144. package/dist/admin/utils/colors.mjs.map +1 -0
  145. package/dist/admin/utils/translations.js +11 -0
  146. package/dist/admin/utils/translations.js.map +1 -0
  147. package/dist/admin/utils/translations.mjs +9 -0
  148. package/dist/admin/utils/translations.mjs.map +1 -0
  149. package/dist/admin/utils/users.js +17 -0
  150. package/dist/admin/utils/users.js.map +1 -0
  151. package/dist/admin/utils/users.mjs +15 -0
  152. package/dist/admin/utils/users.mjs.map +1 -0
  153. package/dist/server/bootstrap.js +54 -0
  154. package/dist/server/bootstrap.js.map +1 -0
  155. package/dist/server/bootstrap.mjs +52 -0
  156. package/dist/server/bootstrap.mjs.map +1 -0
  157. package/dist/server/config/actions.js +47 -0
  158. package/dist/server/config/actions.js.map +1 -0
  159. package/dist/server/config/actions.mjs +45 -0
  160. package/dist/server/config/actions.mjs.map +1 -0
  161. package/dist/server/constants/default-stages.json.js +23 -0
  162. package/dist/server/constants/default-stages.json.js.map +1 -0
  163. package/dist/server/constants/default-stages.json.mjs +21 -0
  164. package/dist/server/constants/default-stages.json.mjs.map +1 -0
  165. package/dist/server/constants/default-workflow.json.js +12 -0
  166. package/dist/server/constants/default-workflow.json.js.map +1 -0
  167. package/dist/server/constants/default-workflow.json.mjs +7 -0
  168. package/dist/server/constants/default-workflow.json.mjs.map +1 -0
  169. package/dist/server/constants/webhook-events.js +12 -0
  170. package/dist/server/constants/webhook-events.js.map +1 -0
  171. package/dist/server/constants/webhook-events.mjs +7 -0
  172. package/dist/server/constants/webhook-events.mjs.map +1 -0
  173. package/dist/server/constants/workflows.js +53 -0
  174. package/dist/server/constants/workflows.js.map +1 -0
  175. package/dist/server/constants/workflows.mjs +42 -0
  176. package/dist/server/constants/workflows.mjs.map +1 -0
  177. package/dist/server/content-types/index.js +12 -0
  178. package/dist/server/content-types/index.js.map +1 -0
  179. package/dist/server/content-types/index.mjs +10 -0
  180. package/dist/server/content-types/index.mjs.map +1 -0
  181. package/dist/server/content-types/workflow/index.js +50 -0
  182. package/dist/server/content-types/workflow/index.js.map +1 -0
  183. package/dist/server/content-types/workflow/index.mjs +48 -0
  184. package/dist/server/content-types/workflow/index.mjs.map +1 -0
  185. package/dist/server/content-types/workflow-stage/index.js +54 -0
  186. package/dist/server/content-types/workflow-stage/index.js.map +1 -0
  187. package/dist/server/content-types/workflow-stage/index.mjs +52 -0
  188. package/dist/server/content-types/workflow-stage/index.mjs.map +1 -0
  189. package/dist/server/controllers/assignees.js +57 -0
  190. package/dist/server/controllers/assignees.js.map +1 -0
  191. package/dist/server/controllers/assignees.mjs +55 -0
  192. package/dist/server/controllers/assignees.mjs.map +1 -0
  193. package/dist/server/controllers/index.js +14 -0
  194. package/dist/server/controllers/index.js.map +1 -0
  195. package/dist/server/controllers/index.mjs +12 -0
  196. package/dist/server/controllers/index.mjs.map +1 -0
  197. package/dist/server/controllers/stages.js +167 -0
  198. package/dist/server/controllers/stages.js.map +1 -0
  199. package/dist/server/controllers/stages.mjs +165 -0
  200. package/dist/server/controllers/stages.mjs.map +1 -0
  201. package/dist/server/controllers/workflows.js +136 -0
  202. package/dist/server/controllers/workflows.js.map +1 -0
  203. package/dist/server/controllers/workflows.mjs +134 -0
  204. package/dist/server/controllers/workflows.mjs.map +1 -0
  205. package/dist/server/destroy.js +6 -0
  206. package/dist/server/destroy.js.map +1 -0
  207. package/dist/server/destroy.mjs +4 -0
  208. package/dist/server/destroy.mjs.map +1 -0
  209. package/dist/server/index.js +12 -2333
  210. package/dist/server/index.js.map +1 -1
  211. package/dist/server/index.mjs +7 -2328
  212. package/dist/server/index.mjs.map +1 -1
  213. package/dist/server/middlewares/review-workflows.js +42 -0
  214. package/dist/server/middlewares/review-workflows.js.map +1 -0
  215. package/dist/server/middlewares/review-workflows.mjs +37 -0
  216. package/dist/server/middlewares/review-workflows.mjs.map +1 -0
  217. package/dist/server/migrations/handle-deleted-ct-in-workflows.js +40 -0
  218. package/dist/server/migrations/handle-deleted-ct-in-workflows.js.map +1 -0
  219. package/dist/server/migrations/handle-deleted-ct-in-workflows.mjs +38 -0
  220. package/dist/server/migrations/handle-deleted-ct-in-workflows.mjs.map +1 -0
  221. package/dist/server/migrations/multiple-workflows.js +41 -0
  222. package/dist/server/migrations/multiple-workflows.js.map +1 -0
  223. package/dist/server/migrations/multiple-workflows.mjs +39 -0
  224. package/dist/server/migrations/multiple-workflows.mjs.map +1 -0
  225. package/dist/server/migrations/set-stages-default-color.js +22 -0
  226. package/dist/server/migrations/set-stages-default-color.js.map +1 -0
  227. package/dist/server/migrations/set-stages-default-color.mjs +20 -0
  228. package/dist/server/migrations/set-stages-default-color.mjs.map +1 -0
  229. package/dist/server/migrations/set-stages-roles.js +56 -0
  230. package/dist/server/migrations/set-stages-roles.js.map +1 -0
  231. package/dist/server/migrations/set-stages-roles.mjs +54 -0
  232. package/dist/server/migrations/set-stages-roles.mjs.map +1 -0
  233. package/dist/server/migrations/set-workflow-default-name.js +29 -0
  234. package/dist/server/migrations/set-workflow-default-name.js.map +1 -0
  235. package/dist/server/migrations/set-workflow-default-name.mjs +27 -0
  236. package/dist/server/migrations/set-workflow-default-name.mjs.map +1 -0
  237. package/dist/server/migrations/shorten-stage-attribute.js +45 -0
  238. package/dist/server/migrations/shorten-stage-attribute.js.map +1 -0
  239. package/dist/server/migrations/shorten-stage-attribute.mjs +43 -0
  240. package/dist/server/migrations/shorten-stage-attribute.mjs.map +1 -0
  241. package/dist/server/register.js +116 -0
  242. package/dist/server/register.js.map +1 -0
  243. package/dist/server/register.mjs +114 -0
  244. package/dist/server/register.mjs.map +1 -0
  245. package/dist/server/routes/index.js +10 -0
  246. package/dist/server/routes/index.js.map +1 -0
  247. package/dist/server/routes/index.mjs +8 -0
  248. package/dist/server/routes/index.mjs.map +1 -0
  249. package/dist/server/routes/review-workflows.js +186 -0
  250. package/dist/server/routes/review-workflows.js.map +1 -0
  251. package/dist/server/routes/review-workflows.mjs +184 -0
  252. package/dist/server/routes/review-workflows.mjs.map +1 -0
  253. package/dist/server/routes/utils.js +11 -0
  254. package/dist/server/routes/utils.js.map +1 -0
  255. package/dist/server/routes/utils.mjs +9 -0
  256. package/dist/server/routes/utils.mjs.map +1 -0
  257. package/dist/server/services/assignees.js +68 -0
  258. package/dist/server/services/assignees.js.map +1 -0
  259. package/dist/server/services/assignees.mjs +66 -0
  260. package/dist/server/services/assignees.mjs.map +1 -0
  261. package/dist/server/services/document-service-middleware.js +130 -0
  262. package/dist/server/services/document-service-middleware.js.map +1 -0
  263. package/dist/server/services/document-service-middleware.mjs +128 -0
  264. package/dist/server/services/document-service-middleware.mjs.map +1 -0
  265. package/dist/server/services/index.js +24 -0
  266. package/dist/server/services/index.js.map +1 -0
  267. package/dist/server/services/index.mjs +22 -0
  268. package/dist/server/services/index.mjs.map +1 -0
  269. package/dist/server/services/metrics/index.js +67 -0
  270. package/dist/server/services/metrics/index.js.map +1 -0
  271. package/dist/server/services/metrics/index.mjs +55 -0
  272. package/dist/server/services/metrics/index.mjs.map +1 -0
  273. package/dist/server/services/metrics/weekly-metrics.js +84 -0
  274. package/dist/server/services/metrics/weekly-metrics.js.map +1 -0
  275. package/dist/server/services/metrics/weekly-metrics.mjs +82 -0
  276. package/dist/server/services/metrics/weekly-metrics.mjs.map +1 -0
  277. package/dist/server/services/stage-permissions.js +59 -0
  278. package/dist/server/services/stage-permissions.js.map +1 -0
  279. package/dist/server/services/stage-permissions.mjs +57 -0
  280. package/dist/server/services/stage-permissions.mjs.map +1 -0
  281. package/dist/server/services/stages.js +353 -0
  282. package/dist/server/services/stages.js.map +1 -0
  283. package/dist/server/services/stages.mjs +351 -0
  284. package/dist/server/services/stages.mjs.map +1 -0
  285. package/dist/server/services/validation.js +69 -0
  286. package/dist/server/services/validation.js.map +1 -0
  287. package/dist/server/services/validation.mjs +67 -0
  288. package/dist/server/services/validation.mjs.map +1 -0
  289. package/dist/server/services/workflow-content-types.js +90 -0
  290. package/dist/server/services/workflow-content-types.js.map +1 -0
  291. package/dist/server/services/workflow-content-types.mjs +88 -0
  292. package/dist/server/services/workflow-content-types.mjs.map +1 -0
  293. package/dist/server/services/workflows.js +279 -0
  294. package/dist/server/services/workflows.js.map +1 -0
  295. package/dist/server/services/workflows.mjs +277 -0
  296. package/dist/server/services/workflows.mjs.map +1 -0
  297. package/dist/server/utils/index.js +16 -0
  298. package/dist/server/utils/index.js.map +1 -0
  299. package/dist/server/utils/index.mjs +13 -0
  300. package/dist/server/utils/index.mjs.map +1 -0
  301. package/dist/server/utils/review-workflows.js +36 -0
  302. package/dist/server/utils/review-workflows.js.map +1 -0
  303. package/dist/server/utils/review-workflows.mjs +30 -0
  304. package/dist/server/utils/review-workflows.mjs.map +1 -0
  305. package/dist/server/validation/review-workflows.js +71 -0
  306. package/dist/server/validation/review-workflows.js.map +1 -0
  307. package/dist/server/validation/review-workflows.mjs +65 -0
  308. package/dist/server/validation/review-workflows.mjs.map +1 -0
  309. package/package.json +5 -5
  310. package/dist/admin/chunks/Layout-C4ri_ldC.js.map +0 -1
  311. package/dist/admin/chunks/Layout-CF497D6H.mjs.map +0 -1
  312. package/dist/admin/chunks/en-BNGiWajd.js.map +0 -1
  313. package/dist/admin/chunks/en-BrZXFtVv.mjs.map +0 -1
  314. package/dist/admin/chunks/id-DVOtqJqn.js +0 -1442
  315. package/dist/admin/chunks/id-DVOtqJqn.js.map +0 -1
  316. package/dist/admin/chunks/id-QD0V9dME.mjs +0 -1420
  317. package/dist/admin/chunks/id-QD0V9dME.mjs.map +0 -1
  318. package/dist/admin/chunks/index-CCx4kT-t.js.map +0 -1
  319. package/dist/admin/chunks/index-CzdEqFOm.js.map +0 -1
  320. package/dist/admin/chunks/index-DcEF47R4.mjs.map +0 -1
  321. package/dist/admin/chunks/index-iChY7MsG.mjs.map +0 -1
  322. package/dist/admin/chunks/purchase-review-workflows-4n0KXAeo.mjs.map +0 -1
  323. package/dist/admin/chunks/purchase-review-workflows-BDLncDcz.js.map +0 -1
  324. package/dist/admin/chunks/router-ChVwf8TN.js.map +0 -1
  325. package/dist/admin/chunks/router-D-YCUzYy.mjs.map +0 -1
  326. package/dist/admin/chunks/uk-CbRUr1I7.js.map +0 -1
  327. package/dist/admin/chunks/uk-DLlzEBUF.mjs.map +0 -1
@@ -0,0 +1,351 @@
1
+ import { async, errors } from '@strapi/utils';
2
+ import { pick, map, isEqual } from 'lodash/fp';
3
+ import { STAGE_MODEL_UID, ENTITY_STAGE_ATTRIBUTE, ERRORS } from '../constants/workflows.mjs';
4
+ import { getService } from '../utils/index.mjs';
5
+
6
+ const { ApplicationError, ValidationError } = errors;
7
+ const sanitizedStageFields = [
8
+ 'id',
9
+ 'name',
10
+ 'workflow',
11
+ 'color'
12
+ ];
13
+ const sanitizeStageFields = pick(sanitizedStageFields);
14
+ var stages = (({ strapi })=>{
15
+ const metrics = getService('workflow-metrics', {
16
+ strapi
17
+ });
18
+ const stagePermissionsService = getService('stage-permissions', {
19
+ strapi
20
+ });
21
+ const workflowValidator = getService('validation', {
22
+ strapi
23
+ });
24
+ return {
25
+ find ({ workflowId, populate }) {
26
+ return strapi.db.query(STAGE_MODEL_UID).findMany({
27
+ where: {
28
+ workflow: workflowId
29
+ },
30
+ populate
31
+ });
32
+ },
33
+ findById (id, { populate } = {}) {
34
+ return strapi.db.query(STAGE_MODEL_UID).findOne({
35
+ where: {
36
+ id
37
+ },
38
+ populate
39
+ });
40
+ },
41
+ async createMany (stagesList, { fields } = {}) {
42
+ const params = {
43
+ select: fields ?? '*'
44
+ };
45
+ const stages = await Promise.all(stagesList.map((stage)=>strapi.db.query(STAGE_MODEL_UID).create({
46
+ data: sanitizeStageFields(stage),
47
+ ...params
48
+ })));
49
+ // Create stage permissions
50
+ await async.reduce(stagesList)(async (_, stage, idx)=>{
51
+ // Ignore stages without permissions
52
+ if (!stage.permissions || stage.permissions.length === 0) {
53
+ return;
54
+ }
55
+ const stagePermissions = stage.permissions;
56
+ const stageId = stages[idx].id;
57
+ const permissions = await async.map(stagePermissions, // Register each stage permission
58
+ (permission)=>stagePermissionsService.register({
59
+ roleId: permission.role,
60
+ action: permission.action,
61
+ fromStage: stageId
62
+ }));
63
+ // Update stage with the new permissions
64
+ await strapi.db.query(STAGE_MODEL_UID).update({
65
+ where: {
66
+ id: stageId
67
+ },
68
+ data: {
69
+ permissions: permissions.flat().map((p)=>p.id)
70
+ }
71
+ });
72
+ }, []);
73
+ metrics.sendDidCreateStage();
74
+ return stages;
75
+ },
76
+ async update (srcStage, destStage) {
77
+ let stagePermissions = srcStage?.permissions ?? [];
78
+ const stageId = destStage.id;
79
+ if (destStage.permissions) {
80
+ await this.deleteStagePermissions([
81
+ srcStage
82
+ ]);
83
+ const permissions = await async.map(destStage.permissions, (permission)=>stagePermissionsService.register({
84
+ roleId: permission.role,
85
+ action: permission.action,
86
+ fromStage: stageId
87
+ }));
88
+ stagePermissions = permissions.flat().map((p)=>p.id);
89
+ }
90
+ const stage = await strapi.db.query(STAGE_MODEL_UID).update({
91
+ where: {
92
+ id: stageId
93
+ },
94
+ data: {
95
+ ...destStage,
96
+ permissions: stagePermissions
97
+ }
98
+ });
99
+ metrics.sendDidEditStage();
100
+ return stage;
101
+ },
102
+ async delete (stage) {
103
+ // Unregister all permissions related to this stage id
104
+ await this.deleteStagePermissions([
105
+ stage
106
+ ]);
107
+ const deletedStage = await strapi.db.query(STAGE_MODEL_UID).delete({
108
+ where: {
109
+ id: stage.id
110
+ }
111
+ });
112
+ metrics.sendDidDeleteStage();
113
+ return deletedStage;
114
+ },
115
+ async deleteMany (stages) {
116
+ await this.deleteStagePermissions(stages);
117
+ return strapi.db.query(STAGE_MODEL_UID).deleteMany({
118
+ where: {
119
+ id: {
120
+ $in: stages.map((s)=>s.id)
121
+ }
122
+ }
123
+ });
124
+ },
125
+ async deleteStagePermissions (stages) {
126
+ // TODO: Find another way to do this for when we use the "to" parameter.
127
+ const permissions = stages.map((s)=>s.permissions || []).flat();
128
+ await stagePermissionsService.unregister(permissions || []);
129
+ },
130
+ count ({ workflowId } = {}) {
131
+ const opts = {};
132
+ if (workflowId) {
133
+ opts.where = {
134
+ workflow: workflowId
135
+ };
136
+ }
137
+ return strapi.db.query(STAGE_MODEL_UID).count(opts);
138
+ },
139
+ async replaceStages (srcStages, destStages, contentTypesToMigrate = []) {
140
+ const { created, updated, deleted } = getDiffBetweenStages(srcStages, destStages);
141
+ assertAtLeastOneStageRemain(srcStages || [], {
142
+ created,
143
+ deleted
144
+ });
145
+ // Update stages and assign entity stages
146
+ return strapi.db.transaction(async ({ trx })=>{
147
+ // Create the new stages
148
+ const createdStages = await this.createMany(created, {
149
+ fields: [
150
+ 'id'
151
+ ]
152
+ });
153
+ // Put all the newly created stages ids
154
+ const createdStagesIds = map('id', createdStages);
155
+ // Update the workflow stages
156
+ await async.map(updated, (destStage)=>{
157
+ const srcStage = srcStages.find((s)=>s.id === destStage.id);
158
+ return this.update(srcStage, destStage);
159
+ });
160
+ // Delete the stages that are not in the new stages list
161
+ await async.map(deleted, async (stage)=>{
162
+ // Find the nearest stage in the workflow and newly created stages
163
+ // that is not deleted, prioritizing the previous stages
164
+ const nearestStage = findNearestMatchingStage([
165
+ ...srcStages,
166
+ ...createdStages
167
+ ], srcStages.findIndex((s)=>s.id === stage.id), (targetStage)=>{
168
+ return !deleted.find((s)=>s.id === targetStage.id);
169
+ });
170
+ // Assign the new stage to entities that had the deleted stage
171
+ await async.map(contentTypesToMigrate, (contentTypeUID)=>{
172
+ this.updateEntitiesStage(contentTypeUID, {
173
+ fromStageId: stage.id,
174
+ toStageId: nearestStage.id,
175
+ trx
176
+ });
177
+ });
178
+ return this.delete(stage);
179
+ });
180
+ return destStages.map((stage)=>({
181
+ ...stage,
182
+ id: stage.id ?? createdStagesIds.shift()
183
+ }));
184
+ });
185
+ },
186
+ /**
187
+ * Update the stage of an entity
188
+ */ async updateEntity (entityToUpdate, model, stageId) {
189
+ const stage = await this.findById(stageId);
190
+ const { documentId, locale } = entityToUpdate;
191
+ await workflowValidator.validateWorkflowCount();
192
+ if (!stage) {
193
+ throw new ApplicationError(`Selected stage does not exist`);
194
+ }
195
+ const entity = await strapi.documents(model).update({
196
+ documentId,
197
+ locale,
198
+ // Stage doesn't have DP or i18n enabled, connecting it through the `id`
199
+ // will be safer than relying on the `documentId` + `locale` + `status` transformation
200
+ data: {
201
+ [ENTITY_STAGE_ATTRIBUTE]: pick([
202
+ 'id'
203
+ ], stage)
204
+ },
205
+ populate: [
206
+ ENTITY_STAGE_ATTRIBUTE
207
+ ]
208
+ });
209
+ // Update the `updated_at` field of the entity, so that the `status` is not considered `Modified`
210
+ // NOTE: `updatedAt` is a protected attribute that can not be modified directly from the query layer
211
+ // hence the knex query builder is used here.
212
+ const { tableName } = strapi.db.metadata.get(model);
213
+ await strapi.db.connection(tableName).where({
214
+ id: entityToUpdate.id
215
+ }).update({
216
+ updated_at: new Date(entityToUpdate.updatedAt)
217
+ });
218
+ metrics.sendDidChangeEntryStage();
219
+ return entity;
220
+ },
221
+ /**
222
+ * Updates entity stages of a content type:
223
+ * - If fromStageId is undefined, all entities with an existing stage will be assigned the new stage
224
+ * - If fromStageId is null, all entities without a stage will be assigned the new stage
225
+ * - If fromStageId is a number, all entities with that stage will be assigned the new stage
226
+ *
227
+ * For performance reasons we use knex queries directly.
228
+ *
229
+ * @param {string} contentTypeUID
230
+ * @param {number | undefined | null} fromStageId
231
+ * @param {number} toStageId
232
+ * @param {import('knex').Knex.Transaction} trx
233
+ * @returns
234
+ */ async updateEntitiesStage (contentTypeUID, { fromStageId, toStageId }) {
235
+ const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID);
236
+ const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;
237
+ const joinColumn = joinTable.joinColumn.name;
238
+ const invJoinColumn = joinTable.inverseJoinColumn.name;
239
+ await workflowValidator.validateWorkflowCount();
240
+ return strapi.db.transaction(async ({ trx })=>{
241
+ // Update all already existing links to the new stage
242
+ if (fromStageId === undefined) {
243
+ return strapi.db.getConnection().from(joinTable.name).update({
244
+ [invJoinColumn]: toStageId
245
+ }).transacting(trx);
246
+ }
247
+ // Update all links from the specified stage to the new stage
248
+ const selectStatement = strapi.db.getConnection().select({
249
+ [joinColumn]: 't1.id',
250
+ [invJoinColumn]: toStageId
251
+ }).from(`${tableName} as t1`).leftJoin(`${joinTable.name} as t2`, `t1.id`, `t2.${joinColumn}`).where(`t2.${invJoinColumn}`, fromStageId).toSQL();
252
+ // Insert rows for all entries of the content type that have the specified stage
253
+ return strapi.db.getConnection(joinTable.name).insert(strapi.db.connection.raw(`(${joinColumn}, ${invJoinColumn}) ${selectStatement.sql}`, selectStatement.bindings)).transacting(trx);
254
+ });
255
+ },
256
+ /**
257
+ * Deletes all entity stages of a content type
258
+ * @param {string} contentTypeUID
259
+ * @returns
260
+ */ async deleteAllEntitiesStage (contentTypeUID) {
261
+ const { attributes } = strapi.db.metadata.get(contentTypeUID);
262
+ const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;
263
+ // Delete all stage links for the content type
264
+ return strapi.db.transaction(async ({ trx })=>strapi.db.getConnection().from(joinTable.name).delete().transacting(trx));
265
+ }
266
+ };
267
+ });
268
+ /**
269
+ * Compares two arrays of stages and returns an object indicating the differences.
270
+ *
271
+ * The function compares the `id` properties of each stage in `sourceStages` and `comparisonStages` to determine if the stage is present in both arrays.
272
+ * If a stage with the same `id` is found in both arrays but the `name` property is different, the stage is considered updated.
273
+ * If a stage with a particular `id` is only found in `comparisonStages`, it is considered created.
274
+ * If a stage with a particular `id` is only found in `sourceStages`, it is considered deleted.
275
+ *
276
+ * @typedef {{id: Number, name: String, workflow: Number}} Stage
277
+ * @typedef {{created: Stage[], updated: Stage[], deleted: Stage[]}} DiffStages
278
+ *
279
+ * The DiffStages object has three properties: `created`, `updated`, and `deleted`.
280
+ * `created` is an array of stages that are in `comparisonStages` but not in `sourceStages`.
281
+ * `updated` is an array of stages that have different names in `comparisonStages` and `sourceStages`.
282
+ * `deleted` is an array of stages that are in `sourceStages` but not in `comparisonStages`.
283
+ *
284
+ * @param {Stage[]} sourceStages
285
+ * @param {Stage[]} comparisonStages
286
+ * @returns { DiffStages }
287
+ */ function getDiffBetweenStages(sourceStages, comparisonStages) {
288
+ const result = comparisonStages.reduce(// ...
289
+ (acc, stageToCompare)=>{
290
+ const srcStage = sourceStages.find((stage)=>stage.id === stageToCompare.id);
291
+ if (!srcStage) {
292
+ acc.created.push(stageToCompare);
293
+ } else if (!isEqual(pick([
294
+ 'name',
295
+ 'color',
296
+ 'permissions'
297
+ ], srcStage), pick([
298
+ 'name',
299
+ 'color',
300
+ 'permissions'
301
+ ], stageToCompare))) {
302
+ acc.updated.push(stageToCompare);
303
+ }
304
+ return acc;
305
+ }, {
306
+ created: [],
307
+ updated: []
308
+ });
309
+ result.deleted = sourceStages.filter((srcStage)=>!comparisonStages.some((cmpStage)=>cmpStage.id === srcStage.id));
310
+ return result;
311
+ }
312
+ /**
313
+ * Asserts that at least one stage remains in the workflow after applying deletions and additions.
314
+ *
315
+ * @param {Array} workflowStages - An array of stages in the current workflow.
316
+ * @param {Object} diffStages - An object containing the stages to be deleted and created.
317
+ * @param {Array} diffStages.deleted - An array of stages that are planned to be deleted from the workflow.
318
+ * @param {Array} diffStages.created - An array of stages that are planned to be created in the workflow.
319
+ *
320
+ * @throws {ValidationError} If the number of remaining stages in the workflow after applying deletions and additions is less than 1.
321
+ */ function assertAtLeastOneStageRemain(workflowStages, diffStages) {
322
+ const remainingStagesCount = workflowStages.length - diffStages.deleted.length + diffStages.created.length;
323
+ if (remainingStagesCount < 1) {
324
+ throw new ValidationError(ERRORS.WORKFLOW_WITHOUT_STAGES);
325
+ }
326
+ }
327
+ /**
328
+ * Find the id of the nearest object in an array that matches a condition.
329
+ * Used for searching for the nearest stage that is not deleted.
330
+ * Starts by searching the elements before the index, then the remaining elements in the array.
331
+ *
332
+ * @param {Array} stages
333
+ * @param {Number} startIndex the index to start searching from
334
+ * @param {Function} condition must evaluate to true for the object to be considered a match
335
+ * @returns {Object} stage
336
+ */ function findNearestMatchingStage(stages, startIndex, condition) {
337
+ // Start by searching the elements before the startIndex
338
+ for(let i = startIndex; i >= 0; i -= 1){
339
+ if (condition(stages[i])) {
340
+ return stages[i];
341
+ }
342
+ }
343
+ // If no matching element is found before the startIndex,
344
+ // search the remaining elements in the array
345
+ const remainingArray = stages.slice(startIndex + 1);
346
+ const nearestObject = remainingArray.filter(condition)[0];
347
+ return nearestObject;
348
+ }
349
+
350
+ export { stages as default };
351
+ //# sourceMappingURL=stages.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stages.mjs","sources":["../../../server/src/services/stages.ts"],"sourcesContent":["import type { Core, UID } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { map, pick, isEqual } from 'lodash/fp';\nimport { STAGE_MODEL_UID, ENTITY_STAGE_ATTRIBUTE, ERRORS } from '../constants/workflows';\nimport { WORKFLOW_UPDATE_STAGE } from '../constants/webhook-events';\nimport { getService } from '../utils';\n\nconst { ApplicationError, ValidationError } = errors;\nconst sanitizedStageFields = ['id', 'name', 'workflow', 'color'];\nconst sanitizeStageFields = pick(sanitizedStageFields);\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const stagePermissionsService = getService('stage-permissions', { strapi });\n const workflowValidator = getService('validation', { strapi });\n\n return {\n find({ workflowId, populate }: any) {\n return strapi.db.query(STAGE_MODEL_UID).findMany({\n where: { workflow: workflowId },\n populate,\n });\n },\n\n findById(id: string | number, { populate }: any = {}) {\n return strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id },\n populate,\n });\n },\n\n async createMany(stagesList: any, { fields }: any = {}) {\n const params = { select: fields ?? '*' };\n\n const stages = await Promise.all(\n stagesList.map((stage: any) =>\n strapi.db.query(STAGE_MODEL_UID).create({\n data: sanitizeStageFields(stage),\n ...params,\n })\n )\n );\n\n // Create stage permissions\n await async.reduce(stagesList)(async (_, stage, idx) => {\n // Ignore stages without permissions\n if (!stage.permissions || stage.permissions.length === 0) {\n return;\n }\n\n const stagePermissions = stage.permissions;\n const stageId = stages[idx].id;\n\n const permissions = await async.map(\n stagePermissions,\n // Register each stage permission\n (permission: any) =>\n stagePermissionsService.register({\n roleId: permission.role,\n action: permission.action,\n fromStage: stageId,\n })\n );\n\n // Update stage with the new permissions\n await strapi.db.query(STAGE_MODEL_UID).update({\n where: { id: stageId },\n data: {\n permissions: permissions.flat().map((p: any) => p.id),\n },\n });\n }, []);\n\n metrics.sendDidCreateStage();\n\n return stages;\n },\n\n async update(srcStage: any, destStage: any) {\n let stagePermissions = srcStage?.permissions ?? [];\n const stageId = destStage.id;\n\n if (destStage.permissions) {\n await this.deleteStagePermissions([srcStage]);\n\n const permissions = await async.map(destStage.permissions, (permission: any) =>\n stagePermissionsService.register({\n roleId: permission.role,\n action: permission.action,\n fromStage: stageId,\n })\n );\n stagePermissions = permissions.flat().map((p: any) => p.id);\n }\n\n const stage = await strapi.db.query(STAGE_MODEL_UID).update({\n where: { id: stageId },\n data: {\n ...destStage,\n permissions: stagePermissions,\n },\n });\n\n metrics.sendDidEditStage();\n\n return stage;\n },\n\n async delete(stage: any) {\n // Unregister all permissions related to this stage id\n await this.deleteStagePermissions([stage]);\n\n const deletedStage = await strapi.db.query(STAGE_MODEL_UID).delete({\n where: { id: stage.id },\n });\n\n metrics.sendDidDeleteStage();\n\n return deletedStage;\n },\n\n async deleteMany(stages: any) {\n await this.deleteStagePermissions(stages);\n\n return strapi.db.query(STAGE_MODEL_UID).deleteMany({\n where: { id: { $in: stages.map((s: any) => s.id) } },\n });\n },\n\n async deleteStagePermissions(stages: any) {\n // TODO: Find another way to do this for when we use the \"to\" parameter.\n const permissions = stages.map((s: any) => s.permissions || []).flat();\n await stagePermissionsService.unregister(permissions || []);\n },\n\n count({ workflowId }: any = {}) {\n const opts = {} as any;\n\n if (workflowId) {\n opts.where = {\n workflow: workflowId,\n };\n }\n\n return strapi.db.query(STAGE_MODEL_UID).count(opts);\n },\n\n async replaceStages(srcStages: any, destStages: any, contentTypesToMigrate = []) {\n const { created, updated, deleted } = getDiffBetweenStages(srcStages, destStages);\n\n assertAtLeastOneStageRemain(srcStages || [], { created, deleted });\n\n // Update stages and assign entity stages\n return strapi.db.transaction(async ({ trx }) => {\n // Create the new stages\n const createdStages = await this.createMany(created, { fields: ['id'] });\n // Put all the newly created stages ids\n const createdStagesIds = map('id', createdStages);\n\n // Update the workflow stages\n await async.map(updated, (destStage: any) => {\n const srcStage = srcStages.find((s: any) => s.id === destStage.id);\n\n return this.update(srcStage, destStage);\n });\n\n // Delete the stages that are not in the new stages list\n await async.map(deleted, async (stage: any) => {\n // Find the nearest stage in the workflow and newly created stages\n // that is not deleted, prioritizing the previous stages\n const nearestStage = findNearestMatchingStage(\n [...srcStages, ...createdStages],\n srcStages.findIndex((s: any) => s.id === stage.id),\n (targetStage: any) => {\n return !deleted.find((s: any) => s.id === targetStage.id);\n }\n );\n\n // Assign the new stage to entities that had the deleted stage\n await async.map(contentTypesToMigrate, (contentTypeUID: any) => {\n this.updateEntitiesStage(contentTypeUID, {\n fromStageId: stage.id,\n toStageId: nearestStage.id,\n trx,\n });\n });\n\n return this.delete(stage);\n });\n\n return destStages.map((stage: any) => ({\n ...stage,\n id: stage.id ?? createdStagesIds.shift(),\n }));\n });\n },\n\n /**\n * Update the stage of an entity\n */\n async updateEntity(\n entityToUpdate: {\n id: number | string;\n documentId: string;\n locale: string;\n updatedAt: string;\n },\n model: UID.ContentType,\n stageId: any\n ) {\n const stage = await this.findById(stageId);\n const { documentId, locale } = entityToUpdate;\n\n await workflowValidator.validateWorkflowCount();\n\n if (!stage) {\n throw new ApplicationError(`Selected stage does not exist`);\n }\n\n const entity = await strapi.documents(model).update({\n documentId,\n locale,\n // Stage doesn't have DP or i18n enabled, connecting it through the `id`\n // will be safer than relying on the `documentId` + `locale` + `status` transformation\n data: { [ENTITY_STAGE_ATTRIBUTE]: pick(['id'], stage) },\n populate: [ENTITY_STAGE_ATTRIBUTE],\n });\n\n // Update the `updated_at` field of the entity, so that the `status` is not considered `Modified`\n // NOTE: `updatedAt` is a protected attribute that can not be modified directly from the query layer\n // hence the knex query builder is used here.\n const { tableName } = strapi.db.metadata.get(model);\n await strapi.db\n .connection(tableName)\n .where({ id: entityToUpdate.id })\n .update({\n updated_at: new Date(entityToUpdate.updatedAt),\n });\n\n metrics.sendDidChangeEntryStage();\n\n return entity;\n },\n\n /**\n * Updates entity stages of a content type:\n * - If fromStageId is undefined, all entities with an existing stage will be assigned the new stage\n * - If fromStageId is null, all entities without a stage will be assigned the new stage\n * - If fromStageId is a number, all entities with that stage will be assigned the new stage\n *\n * For performance reasons we use knex queries directly.\n *\n * @param {string} contentTypeUID\n * @param {number | undefined | null} fromStageId\n * @param {number} toStageId\n * @param {import('knex').Knex.Transaction} trx\n * @returns\n */\n async updateEntitiesStage(contentTypeUID: any, { fromStageId, toStageId }: any) {\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;\n const joinColumn = joinTable.joinColumn.name;\n const invJoinColumn = joinTable.inverseJoinColumn.name;\n\n await workflowValidator.validateWorkflowCount();\n\n return strapi.db.transaction(async ({ trx }) => {\n // Update all already existing links to the new stage\n if (fromStageId === undefined) {\n return strapi.db\n .getConnection()\n .from(joinTable.name)\n .update({ [invJoinColumn]: toStageId })\n .transacting(trx);\n }\n\n // Update all links from the specified stage to the new stage\n const selectStatement = strapi.db\n .getConnection()\n .select({ [joinColumn]: 't1.id', [invJoinColumn]: toStageId })\n .from(`${tableName} as t1`)\n .leftJoin(`${joinTable.name} as t2`, `t1.id`, `t2.${joinColumn}`)\n .where(`t2.${invJoinColumn}`, fromStageId)\n .toSQL();\n\n // Insert rows for all entries of the content type that have the specified stage\n return strapi.db\n .getConnection(joinTable.name)\n .insert(\n strapi.db.connection.raw(\n `(${joinColumn}, ${invJoinColumn}) ${selectStatement.sql}`,\n selectStatement.bindings\n )\n )\n .transacting(trx);\n });\n },\n\n /**\n * Deletes all entity stages of a content type\n * @param {string} contentTypeUID\n * @returns\n */\n async deleteAllEntitiesStage(contentTypeUID: any) {\n const { attributes } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;\n\n // Delete all stage links for the content type\n return strapi.db.transaction(async ({ trx }) =>\n strapi.db.getConnection().from(joinTable.name).delete().transacting(trx)\n );\n },\n };\n};\n\n/**\n * Compares two arrays of stages and returns an object indicating the differences.\n *\n * The function compares the `id` properties of each stage in `sourceStages` and `comparisonStages` to determine if the stage is present in both arrays.\n * If a stage with the same `id` is found in both arrays but the `name` property is different, the stage is considered updated.\n * If a stage with a particular `id` is only found in `comparisonStages`, it is considered created.\n * If a stage with a particular `id` is only found in `sourceStages`, it is considered deleted.\n *\n * @typedef {{id: Number, name: String, workflow: Number}} Stage\n * @typedef {{created: Stage[], updated: Stage[], deleted: Stage[]}} DiffStages\n *\n * The DiffStages object has three properties: `created`, `updated`, and `deleted`.\n * `created` is an array of stages that are in `comparisonStages` but not in `sourceStages`.\n * `updated` is an array of stages that have different names in `comparisonStages` and `sourceStages`.\n * `deleted` is an array of stages that are in `sourceStages` but not in `comparisonStages`.\n *\n * @param {Stage[]} sourceStages\n * @param {Stage[]} comparisonStages\n * @returns { DiffStages }\n */\nfunction getDiffBetweenStages(sourceStages: any, comparisonStages: any) {\n const result = comparisonStages.reduce(\n // ...\n\n (acc: any, stageToCompare: any) => {\n const srcStage = sourceStages.find((stage: any) => stage.id === stageToCompare.id);\n\n if (!srcStage) {\n acc.created.push(stageToCompare);\n } else if (\n !isEqual(\n pick(['name', 'color', 'permissions'], srcStage),\n pick(['name', 'color', 'permissions'], stageToCompare)\n )\n ) {\n acc.updated.push(stageToCompare);\n }\n return acc;\n },\n { created: [], updated: [] }\n );\n\n result.deleted = sourceStages.filter(\n (srcStage: any) => !comparisonStages.some((cmpStage: any) => cmpStage.id === srcStage.id)\n );\n\n return result;\n}\n\n/**\n * Asserts that at least one stage remains in the workflow after applying deletions and additions.\n *\n * @param {Array} workflowStages - An array of stages in the current workflow.\n * @param {Object} diffStages - An object containing the stages to be deleted and created.\n * @param {Array} diffStages.deleted - An array of stages that are planned to be deleted from the workflow.\n * @param {Array} diffStages.created - An array of stages that are planned to be created in the workflow.\n *\n * @throws {ValidationError} If the number of remaining stages in the workflow after applying deletions and additions is less than 1.\n */\nfunction assertAtLeastOneStageRemain(workflowStages: any, diffStages: any) {\n const remainingStagesCount =\n workflowStages.length - diffStages.deleted.length + diffStages.created.length;\n if (remainingStagesCount < 1) {\n throw new ValidationError(ERRORS.WORKFLOW_WITHOUT_STAGES);\n }\n}\n\n/**\n * Find the id of the nearest object in an array that matches a condition.\n * Used for searching for the nearest stage that is not deleted.\n * Starts by searching the elements before the index, then the remaining elements in the array.\n *\n * @param {Array} stages\n * @param {Number} startIndex the index to start searching from\n * @param {Function} condition must evaluate to true for the object to be considered a match\n * @returns {Object} stage\n */\nfunction findNearestMatchingStage(stages: any, startIndex: any, condition: any) {\n // Start by searching the elements before the startIndex\n for (let i = startIndex; i >= 0; i -= 1) {\n if (condition(stages[i])) {\n return stages[i];\n }\n }\n\n // If no matching element is found before the startIndex,\n // search the remaining elements in the array\n const remainingArray = stages.slice(startIndex + 1);\n const nearestObject = remainingArray.filter(condition)[0];\n return nearestObject;\n}\n"],"names":["ApplicationError","ValidationError","errors","sanitizedStageFields","sanitizeStageFields","pick","strapi","metrics","getService","stagePermissionsService","workflowValidator","find","workflowId","populate","db","query","STAGE_MODEL_UID","findMany","where","workflow","findById","id","findOne","createMany","stagesList","fields","params","select","stages","Promise","all","map","stage","create","data","async","reduce","_","idx","permissions","length","stagePermissions","stageId","permission","register","roleId","role","action","fromStage","update","flat","p","sendDidCreateStage","srcStage","destStage","deleteStagePermissions","sendDidEditStage","delete","deletedStage","sendDidDeleteStage","deleteMany","$in","s","unregister","count","opts","replaceStages","srcStages","destStages","contentTypesToMigrate","created","updated","deleted","getDiffBetweenStages","assertAtLeastOneStageRemain","transaction","trx","createdStages","createdStagesIds","nearestStage","findNearestMatchingStage","findIndex","targetStage","contentTypeUID","updateEntitiesStage","fromStageId","toStageId","shift","updateEntity","entityToUpdate","model","documentId","locale","validateWorkflowCount","entity","documents","ENTITY_STAGE_ATTRIBUTE","tableName","metadata","get","connection","updated_at","Date","updatedAt","sendDidChangeEntryStage","attributes","joinTable","joinColumn","name","invJoinColumn","inverseJoinColumn","undefined","getConnection","from","transacting","selectStatement","leftJoin","toSQL","insert","raw","sql","bindings","deleteAllEntitiesStage","sourceStages","comparisonStages","result","acc","stageToCompare","push","isEqual","filter","some","cmpStage","workflowStages","diffStages","remainingStagesCount","ERRORS","WORKFLOW_WITHOUT_STAGES","startIndex","condition","i","remainingArray","slice","nearestObject"],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var utils = require('@strapi/utils');
5
+ var index = require('../utils/index.js');
6
+ var workflows = require('../constants/workflows.js');
7
+ var reviewWorkflows = require('../utils/review-workflows.js');
8
+
9
+ const { ValidationError } = utils.errors;
10
+ var reviewWorkflowsValidation = (({ strapi })=>{
11
+ return {
12
+ limits: {
13
+ numberOfWorkflows: workflows.MAX_WORKFLOWS,
14
+ stagesPerWorkflow: workflows.MAX_STAGES_PER_WORKFLOW
15
+ },
16
+ register ({ numberOfWorkflows, stagesPerWorkflow }) {
17
+ if (!Object.isFrozen(this.limits)) {
18
+ this.limits.numberOfWorkflows = reviewWorkflows.clampMaxWorkflows(numberOfWorkflows || this.limits.numberOfWorkflows);
19
+ this.limits.stagesPerWorkflow = reviewWorkflows.clampMaxStagesPerWorkflow(stagesPerWorkflow || this.limits.stagesPerWorkflow);
20
+ Object.freeze(this.limits);
21
+ }
22
+ },
23
+ /**
24
+ * Validates the stages of a workflow.
25
+ * @param {Array} stages - Array of stages to be validated.
26
+ * @throws {ValidationError} - If the workflow has no stages or exceeds the limit.
27
+ */ validateWorkflowStages (stages) {
28
+ if (!stages || stages.length === 0) {
29
+ throw new ValidationError(workflows.ERRORS.WORKFLOW_WITHOUT_STAGES);
30
+ }
31
+ if (stages.length > this.limits.stagesPerWorkflow) {
32
+ throw new ValidationError(workflows.ERRORS.STAGES_LIMIT);
33
+ }
34
+ // Validate stage names are not duplicated
35
+ const stageNames = stages.map((stage)=>stage.name);
36
+ if (fp.uniq(stageNames).length !== stageNames.length) {
37
+ throw new ValidationError(workflows.ERRORS.DUPLICATED_STAGE_NAME);
38
+ }
39
+ },
40
+ async validateWorkflowCountStages (workflowId, countAddedStages = 0) {
41
+ const stagesService = index.getService('stages', {
42
+ strapi
43
+ });
44
+ const countWorkflowStages = await stagesService.count({
45
+ workflowId
46
+ });
47
+ if (countWorkflowStages + countAddedStages > this.limits.stagesPerWorkflow) {
48
+ throw new ValidationError(workflows.ERRORS.STAGES_LIMIT);
49
+ }
50
+ },
51
+ /**
52
+ * Validates the count of existing and added workflows.
53
+ * @param {number} [countAddedWorkflows=0] - The count of workflows to be added.
54
+ * @throws {ValidationError} - If the total count of workflows exceeds the limit.
55
+ * @returns {Promise<void>} - A Promise that resolves when the validation is completed.
56
+ */ async validateWorkflowCount (countAddedWorkflows = 0) {
57
+ const workflowsService = index.getService('workflows', {
58
+ strapi
59
+ });
60
+ const countWorkflows = await workflowsService.count();
61
+ if (countWorkflows + countAddedWorkflows > this.limits.numberOfWorkflows) {
62
+ throw new ValidationError(workflows.ERRORS.WORKFLOWS_LIMIT);
63
+ }
64
+ }
65
+ };
66
+ });
67
+
68
+ module.exports = reviewWorkflowsValidation;
69
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sources":["../../../server/src/services/validation.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { uniq } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { ERRORS, MAX_WORKFLOWS, MAX_STAGES_PER_WORKFLOW } from '../constants/workflows';\nimport { clampMaxWorkflows, clampMaxStagesPerWorkflow } from '../utils/review-workflows';\n\nconst { ValidationError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n limits: {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n },\n register({ numberOfWorkflows, stagesPerWorkflow }: any) {\n if (!Object.isFrozen(this.limits)) {\n this.limits.numberOfWorkflows = clampMaxWorkflows(\n numberOfWorkflows || this.limits.numberOfWorkflows\n );\n this.limits.stagesPerWorkflow = clampMaxStagesPerWorkflow(\n stagesPerWorkflow || this.limits.stagesPerWorkflow\n );\n Object.freeze(this.limits);\n }\n },\n /**\n * Validates the stages of a workflow.\n * @param {Array} stages - Array of stages to be validated.\n * @throws {ValidationError} - If the workflow has no stages or exceeds the limit.\n */\n validateWorkflowStages(stages: any) {\n if (!stages || stages.length === 0) {\n throw new ValidationError(ERRORS.WORKFLOW_WITHOUT_STAGES);\n }\n if (stages.length > this.limits.stagesPerWorkflow) {\n throw new ValidationError(ERRORS.STAGES_LIMIT);\n }\n // Validate stage names are not duplicated\n const stageNames = stages.map((stage: any) => stage.name);\n if (uniq(stageNames).length !== stageNames.length) {\n throw new ValidationError(ERRORS.DUPLICATED_STAGE_NAME);\n }\n },\n\n async validateWorkflowCountStages(workflowId: any, countAddedStages = 0) {\n const stagesService = getService('stages', { strapi });\n const countWorkflowStages = await stagesService.count({ workflowId });\n\n if (countWorkflowStages + countAddedStages > this.limits.stagesPerWorkflow) {\n throw new ValidationError(ERRORS.STAGES_LIMIT);\n }\n },\n\n /**\n * Validates the count of existing and added workflows.\n * @param {number} [countAddedWorkflows=0] - The count of workflows to be added.\n * @throws {ValidationError} - If the total count of workflows exceeds the limit.\n * @returns {Promise<void>} - A Promise that resolves when the validation is completed.\n */\n async validateWorkflowCount(countAddedWorkflows = 0) {\n const workflowsService = getService('workflows', { strapi });\n const countWorkflows = await workflowsService.count();\n if (countWorkflows + countAddedWorkflows > this.limits.numberOfWorkflows) {\n throw new ValidationError(ERRORS.WORKFLOWS_LIMIT);\n }\n },\n };\n};\n"],"names":["ValidationError","errors","strapi","limits","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","register","Object","isFrozen","clampMaxWorkflows","clampMaxStagesPerWorkflow","freeze","validateWorkflowStages","stages","length","ERRORS","WORKFLOW_WITHOUT_STAGES","STAGES_LIMIT","stageNames","map","stage","name","uniq","DUPLICATED_STAGE_NAME","validateWorkflowCountStages","workflowId","countAddedStages","stagesService","getService","countWorkflowStages","count","validateWorkflowCount","countAddedWorkflows","workflowsService","countWorkflows","WORKFLOWS_LIMIT"],"mappings":";;;;;;;;AAOA,MAAM,EAAEA,eAAe,EAAE,GAAGC,YAAAA;AAE5B,gCAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,OAAO;QACLC,MAAQ,EAAA;YACNC,iBAAmBC,EAAAA,uBAAAA;YACnBC,iBAAmBC,EAAAA;AACrB,SAAA;AACAC,QAAAA,QAAAA,CAAAA,CAAS,EAAEJ,iBAAiB,EAAEE,iBAAiB,EAAO,EAAA;AACpD,YAAA,IAAI,CAACG,MAAOC,CAAAA,QAAQ,CAAC,IAAI,CAACP,MAAM,CAAG,EAAA;gBACjC,IAAI,CAACA,MAAM,CAACC,iBAAiB,GAAGO,iCAC9BP,CAAAA,iBAAAA,IAAqB,IAAI,CAACD,MAAM,CAACC,iBAAiB,CAAA;gBAEpD,IAAI,CAACD,MAAM,CAACG,iBAAiB,GAAGM,yCAC9BN,CAAAA,iBAAAA,IAAqB,IAAI,CAACH,MAAM,CAACG,iBAAiB,CAAA;AAEpDG,gBAAAA,MAAAA,CAAOI,MAAM,CAAC,IAAI,CAACV,MAAM,CAAA;AAC3B;AACF,SAAA;AACA;;;;AAIC,QACDW,wBAAuBC,MAAW,EAAA;AAChC,YAAA,IAAI,CAACA,MAAAA,IAAUA,MAAOC,CAAAA,MAAM,KAAK,CAAG,EAAA;gBAClC,MAAM,IAAIhB,eAAgBiB,CAAAA,gBAAAA,CAAOC,uBAAuB,CAAA;AAC1D;YACA,IAAIH,MAAAA,CAAOC,MAAM,GAAG,IAAI,CAACb,MAAM,CAACG,iBAAiB,EAAE;gBACjD,MAAM,IAAIN,eAAgBiB,CAAAA,gBAAAA,CAAOE,YAAY,CAAA;AAC/C;;AAEA,YAAA,MAAMC,aAAaL,MAAOM,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAeA,MAAMC,IAAI,CAAA;AACxD,YAAA,IAAIC,QAAKJ,UAAYJ,CAAAA,CAAAA,MAAM,KAAKI,UAAAA,CAAWJ,MAAM,EAAE;gBACjD,MAAM,IAAIhB,eAAgBiB,CAAAA,gBAAAA,CAAOQ,qBAAqB,CAAA;AACxD;AACF,SAAA;AAEA,QAAA,MAAMC,2BAA4BC,CAAAA,CAAAA,UAAe,EAAEC,gBAAAA,GAAmB,CAAC,EAAA;YACrE,MAAMC,aAAAA,GAAgBC,iBAAW,QAAU,EAAA;AAAE5B,gBAAAA;AAAO,aAAA,CAAA;AACpD,YAAA,MAAM6B,mBAAsB,GAAA,MAAMF,aAAcG,CAAAA,KAAK,CAAC;AAAEL,gBAAAA;AAAW,aAAA,CAAA;AAEnE,YAAA,IAAII,sBAAsBH,gBAAmB,GAAA,IAAI,CAACzB,MAAM,CAACG,iBAAiB,EAAE;gBAC1E,MAAM,IAAIN,eAAgBiB,CAAAA,gBAAAA,CAAOE,YAAY,CAAA;AAC/C;AACF,SAAA;AAEA;;;;;QAMA,MAAMc,qBAAsBC,CAAAA,CAAAA,mBAAAA,GAAsB,CAAC,EAAA;YACjD,MAAMC,gBAAAA,GAAmBL,iBAAW,WAAa,EAAA;AAAE5B,gBAAAA;AAAO,aAAA,CAAA;YAC1D,MAAMkC,cAAAA,GAAiB,MAAMD,gBAAAA,CAAiBH,KAAK,EAAA;AACnD,YAAA,IAAII,iBAAiBF,mBAAsB,GAAA,IAAI,CAAC/B,MAAM,CAACC,iBAAiB,EAAE;gBACxE,MAAM,IAAIJ,eAAgBiB,CAAAA,gBAAAA,CAAOoB,eAAe,CAAA;AAClD;AACF;AACF,KAAA;AACF,CAAA;;;;"}
@@ -0,0 +1,67 @@
1
+ import { uniq } from 'lodash/fp';
2
+ import { errors } from '@strapi/utils';
3
+ import { getService } from '../utils/index.mjs';
4
+ import { MAX_WORKFLOWS, MAX_STAGES_PER_WORKFLOW, ERRORS } from '../constants/workflows.mjs';
5
+ import { clampMaxWorkflows, clampMaxStagesPerWorkflow } from '../utils/review-workflows.mjs';
6
+
7
+ const { ValidationError } = errors;
8
+ var reviewWorkflowsValidation = (({ strapi })=>{
9
+ return {
10
+ limits: {
11
+ numberOfWorkflows: MAX_WORKFLOWS,
12
+ stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW
13
+ },
14
+ register ({ numberOfWorkflows, stagesPerWorkflow }) {
15
+ if (!Object.isFrozen(this.limits)) {
16
+ this.limits.numberOfWorkflows = clampMaxWorkflows(numberOfWorkflows || this.limits.numberOfWorkflows);
17
+ this.limits.stagesPerWorkflow = clampMaxStagesPerWorkflow(stagesPerWorkflow || this.limits.stagesPerWorkflow);
18
+ Object.freeze(this.limits);
19
+ }
20
+ },
21
+ /**
22
+ * Validates the stages of a workflow.
23
+ * @param {Array} stages - Array of stages to be validated.
24
+ * @throws {ValidationError} - If the workflow has no stages or exceeds the limit.
25
+ */ validateWorkflowStages (stages) {
26
+ if (!stages || stages.length === 0) {
27
+ throw new ValidationError(ERRORS.WORKFLOW_WITHOUT_STAGES);
28
+ }
29
+ if (stages.length > this.limits.stagesPerWorkflow) {
30
+ throw new ValidationError(ERRORS.STAGES_LIMIT);
31
+ }
32
+ // Validate stage names are not duplicated
33
+ const stageNames = stages.map((stage)=>stage.name);
34
+ if (uniq(stageNames).length !== stageNames.length) {
35
+ throw new ValidationError(ERRORS.DUPLICATED_STAGE_NAME);
36
+ }
37
+ },
38
+ async validateWorkflowCountStages (workflowId, countAddedStages = 0) {
39
+ const stagesService = getService('stages', {
40
+ strapi
41
+ });
42
+ const countWorkflowStages = await stagesService.count({
43
+ workflowId
44
+ });
45
+ if (countWorkflowStages + countAddedStages > this.limits.stagesPerWorkflow) {
46
+ throw new ValidationError(ERRORS.STAGES_LIMIT);
47
+ }
48
+ },
49
+ /**
50
+ * Validates the count of existing and added workflows.
51
+ * @param {number} [countAddedWorkflows=0] - The count of workflows to be added.
52
+ * @throws {ValidationError} - If the total count of workflows exceeds the limit.
53
+ * @returns {Promise<void>} - A Promise that resolves when the validation is completed.
54
+ */ async validateWorkflowCount (countAddedWorkflows = 0) {
55
+ const workflowsService = getService('workflows', {
56
+ strapi
57
+ });
58
+ const countWorkflows = await workflowsService.count();
59
+ if (countWorkflows + countAddedWorkflows > this.limits.numberOfWorkflows) {
60
+ throw new ValidationError(ERRORS.WORKFLOWS_LIMIT);
61
+ }
62
+ }
63
+ };
64
+ });
65
+
66
+ export { reviewWorkflowsValidation as default };
67
+ //# sourceMappingURL=validation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.mjs","sources":["../../../server/src/services/validation.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { uniq } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { ERRORS, MAX_WORKFLOWS, MAX_STAGES_PER_WORKFLOW } from '../constants/workflows';\nimport { clampMaxWorkflows, clampMaxStagesPerWorkflow } from '../utils/review-workflows';\n\nconst { ValidationError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n limits: {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n },\n register({ numberOfWorkflows, stagesPerWorkflow }: any) {\n if (!Object.isFrozen(this.limits)) {\n this.limits.numberOfWorkflows = clampMaxWorkflows(\n numberOfWorkflows || this.limits.numberOfWorkflows\n );\n this.limits.stagesPerWorkflow = clampMaxStagesPerWorkflow(\n stagesPerWorkflow || this.limits.stagesPerWorkflow\n );\n Object.freeze(this.limits);\n }\n },\n /**\n * Validates the stages of a workflow.\n * @param {Array} stages - Array of stages to be validated.\n * @throws {ValidationError} - If the workflow has no stages or exceeds the limit.\n */\n validateWorkflowStages(stages: any) {\n if (!stages || stages.length === 0) {\n throw new ValidationError(ERRORS.WORKFLOW_WITHOUT_STAGES);\n }\n if (stages.length > this.limits.stagesPerWorkflow) {\n throw new ValidationError(ERRORS.STAGES_LIMIT);\n }\n // Validate stage names are not duplicated\n const stageNames = stages.map((stage: any) => stage.name);\n if (uniq(stageNames).length !== stageNames.length) {\n throw new ValidationError(ERRORS.DUPLICATED_STAGE_NAME);\n }\n },\n\n async validateWorkflowCountStages(workflowId: any, countAddedStages = 0) {\n const stagesService = getService('stages', { strapi });\n const countWorkflowStages = await stagesService.count({ workflowId });\n\n if (countWorkflowStages + countAddedStages > this.limits.stagesPerWorkflow) {\n throw new ValidationError(ERRORS.STAGES_LIMIT);\n }\n },\n\n /**\n * Validates the count of existing and added workflows.\n * @param {number} [countAddedWorkflows=0] - The count of workflows to be added.\n * @throws {ValidationError} - If the total count of workflows exceeds the limit.\n * @returns {Promise<void>} - A Promise that resolves when the validation is completed.\n */\n async validateWorkflowCount(countAddedWorkflows = 0) {\n const workflowsService = getService('workflows', { strapi });\n const countWorkflows = await workflowsService.count();\n if (countWorkflows + countAddedWorkflows > this.limits.numberOfWorkflows) {\n throw new ValidationError(ERRORS.WORKFLOWS_LIMIT);\n }\n },\n };\n};\n"],"names":["ValidationError","errors","strapi","limits","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","register","Object","isFrozen","clampMaxWorkflows","clampMaxStagesPerWorkflow","freeze","validateWorkflowStages","stages","length","ERRORS","WORKFLOW_WITHOUT_STAGES","STAGES_LIMIT","stageNames","map","stage","name","uniq","DUPLICATED_STAGE_NAME","validateWorkflowCountStages","workflowId","countAddedStages","stagesService","getService","countWorkflowStages","count","validateWorkflowCount","countAddedWorkflows","workflowsService","countWorkflows","WORKFLOWS_LIMIT"],"mappings":";;;;;;AAOA,MAAM,EAAEA,eAAe,EAAE,GAAGC,MAAAA;AAE5B,gCAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,OAAO;QACLC,MAAQ,EAAA;YACNC,iBAAmBC,EAAAA,aAAAA;YACnBC,iBAAmBC,EAAAA;AACrB,SAAA;AACAC,QAAAA,QAAAA,CAAAA,CAAS,EAAEJ,iBAAiB,EAAEE,iBAAiB,EAAO,EAAA;AACpD,YAAA,IAAI,CAACG,MAAOC,CAAAA,QAAQ,CAAC,IAAI,CAACP,MAAM,CAAG,EAAA;gBACjC,IAAI,CAACA,MAAM,CAACC,iBAAiB,GAAGO,iBAC9BP,CAAAA,iBAAAA,IAAqB,IAAI,CAACD,MAAM,CAACC,iBAAiB,CAAA;gBAEpD,IAAI,CAACD,MAAM,CAACG,iBAAiB,GAAGM,yBAC9BN,CAAAA,iBAAAA,IAAqB,IAAI,CAACH,MAAM,CAACG,iBAAiB,CAAA;AAEpDG,gBAAAA,MAAAA,CAAOI,MAAM,CAAC,IAAI,CAACV,MAAM,CAAA;AAC3B;AACF,SAAA;AACA;;;;AAIC,QACDW,wBAAuBC,MAAW,EAAA;AAChC,YAAA,IAAI,CAACA,MAAAA,IAAUA,MAAOC,CAAAA,MAAM,KAAK,CAAG,EAAA;gBAClC,MAAM,IAAIhB,eAAgBiB,CAAAA,MAAAA,CAAOC,uBAAuB,CAAA;AAC1D;YACA,IAAIH,MAAAA,CAAOC,MAAM,GAAG,IAAI,CAACb,MAAM,CAACG,iBAAiB,EAAE;gBACjD,MAAM,IAAIN,eAAgBiB,CAAAA,MAAAA,CAAOE,YAAY,CAAA;AAC/C;;AAEA,YAAA,MAAMC,aAAaL,MAAOM,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAeA,MAAMC,IAAI,CAAA;AACxD,YAAA,IAAIC,KAAKJ,UAAYJ,CAAAA,CAAAA,MAAM,KAAKI,UAAAA,CAAWJ,MAAM,EAAE;gBACjD,MAAM,IAAIhB,eAAgBiB,CAAAA,MAAAA,CAAOQ,qBAAqB,CAAA;AACxD;AACF,SAAA;AAEA,QAAA,MAAMC,2BAA4BC,CAAAA,CAAAA,UAAe,EAAEC,gBAAAA,GAAmB,CAAC,EAAA;YACrE,MAAMC,aAAAA,GAAgBC,WAAW,QAAU,EAAA;AAAE5B,gBAAAA;AAAO,aAAA,CAAA;AACpD,YAAA,MAAM6B,mBAAsB,GAAA,MAAMF,aAAcG,CAAAA,KAAK,CAAC;AAAEL,gBAAAA;AAAW,aAAA,CAAA;AAEnE,YAAA,IAAII,sBAAsBH,gBAAmB,GAAA,IAAI,CAACzB,MAAM,CAACG,iBAAiB,EAAE;gBAC1E,MAAM,IAAIN,eAAgBiB,CAAAA,MAAAA,CAAOE,YAAY,CAAA;AAC/C;AACF,SAAA;AAEA;;;;;QAMA,MAAMc,qBAAsBC,CAAAA,CAAAA,mBAAAA,GAAsB,CAAC,EAAA;YACjD,MAAMC,gBAAAA,GAAmBL,WAAW,WAAa,EAAA;AAAE5B,gBAAAA;AAAO,aAAA,CAAA;YAC1D,MAAMkC,cAAAA,GAAiB,MAAMD,gBAAAA,CAAiBH,KAAK,EAAA;AACnD,YAAA,IAAII,iBAAiBF,mBAAsB,GAAA,IAAI,CAAC/B,MAAM,CAACC,iBAAiB,EAAE;gBACxE,MAAM,IAAIJ,eAAgBiB,CAAAA,MAAAA,CAAOoB,eAAe,CAAA;AAClD;AACF;AACF,KAAA;AACF,CAAA;;;;"}