@strapi/content-manager 5.48.0 → 5.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/dist/admin/components/ActionsDrawer.js +3 -2
  2. package/dist/admin/components/ActionsDrawer.js.map +1 -1
  3. package/dist/admin/components/ComponentIcon.js +4 -3
  4. package/dist/admin/components/ComponentIcon.js.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/EditFieldForm.js +3 -2
  6. package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
  7. package/dist/admin/components/ConfigurationForm/Fields.js +3 -2
  8. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  9. package/dist/admin/components/ConfigurationForm/Form.js +7 -3
  10. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  11. package/dist/admin/components/LeftMenu.js +3 -2
  12. package/dist/admin/components/LeftMenu.js.map +1 -1
  13. package/dist/admin/components/RelativeTime.js +3 -2
  14. package/dist/admin/components/RelativeTime.js.map +1 -1
  15. package/dist/admin/components/Widgets.js +3 -2
  16. package/dist/admin/components/Widgets.js.map +1 -1
  17. package/dist/admin/features/DocumentRBAC.js +12 -3
  18. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  19. package/dist/admin/features/DocumentRBAC.mjs +9 -1
  20. package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
  21. package/dist/admin/history/components/VersionContent.js +7 -3
  22. package/dist/admin/history/components/VersionContent.js.map +1 -1
  23. package/dist/admin/history/components/VersionHeader.js +3 -2
  24. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  25. package/dist/admin/history/components/VersionInputRenderer.js +3 -2
  26. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  27. package/dist/admin/history/pages/History.js +3 -2
  28. package/dist/admin/history/pages/History.js.map +1 -1
  29. package/dist/admin/history/routes.js +3 -2
  30. package/dist/admin/history/routes.js.map +1 -1
  31. package/dist/admin/hooks/useContentTypeSchema.js +40 -19
  32. package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
  33. package/dist/admin/hooks/useContentTypeSchema.mjs +37 -17
  34. package/dist/admin/hooks/useContentTypeSchema.mjs.map +1 -1
  35. package/dist/admin/hooks/useDocument.js +3 -2
  36. package/dist/admin/hooks/useDocument.js.map +1 -1
  37. package/dist/admin/hooks/useDocumentActions.js +3 -2
  38. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  39. package/dist/admin/hooks/useDocumentContext.js +3 -2
  40. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  41. package/dist/admin/hooks/useDocumentLayout.js +46 -6
  42. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  43. package/dist/admin/hooks/useDocumentLayout.mjs +43 -4
  44. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  45. package/dist/admin/hooks/useDragAndDrop.js +3 -2
  46. package/dist/admin/hooks/useDragAndDrop.js.map +1 -1
  47. package/dist/admin/hooks/useKeyboardDragAndDrop.js +3 -2
  48. package/dist/admin/hooks/useKeyboardDragAndDrop.js.map +1 -1
  49. package/dist/admin/hooks/useOnce.js +3 -2
  50. package/dist/admin/hooks/useOnce.js.map +1 -1
  51. package/dist/admin/hooks/usePersistentQueryParams.js +7 -2
  52. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  53. package/dist/admin/pages/ComponentConfigurationPage.js +9 -5
  54. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  55. package/dist/admin/pages/ComponentConfigurationPage.mjs +6 -3
  56. package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
  57. package/dist/admin/pages/EditConfigurationPage.js +3 -2
  58. package/dist/admin/pages/EditConfigurationPage.js.map +1 -1
  59. package/dist/admin/pages/EditView/EditViewPage.js +3 -2
  60. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  61. package/dist/admin/pages/EditView/components/DocumentActions.js +80 -39
  62. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/DocumentActions.mjs +67 -33
  64. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js +3 -2
  66. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +4 -3
  68. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +3 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +3 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +8 -4
  74. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +5 -2
  76. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +3 -2
  78. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +3 -2
  80. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +4 -3
  82. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +3 -2
  84. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +3 -2
  86. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +3 -2
  88. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +14 -4
  90. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +11 -2
  92. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +16 -7
  94. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +9 -4
  96. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +3 -2
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +7 -3
  100. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/UID.js +3 -2
  102. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +8 -4
  104. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js +3 -2
  106. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +5 -28
  108. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
  109. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs +2 -26
  110. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -1
  111. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js +5 -1
  112. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js.map +1 -1
  113. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js +15 -2
  114. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js.map +1 -1
  115. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +76 -0
  116. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -0
  117. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs +70 -0
  118. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs.map +1 -0
  119. package/dist/admin/pages/EditView/components/FormLayout.js +3 -2
  120. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  121. package/dist/admin/pages/EditView/components/Header.js +3 -2
  122. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  123. package/dist/admin/pages/EditView/components/InputRenderer.js +3 -2
  124. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  125. package/dist/admin/pages/EditView/components/Panels.js +3 -2
  126. package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
  127. package/dist/admin/pages/EditView/utils/data.js +5 -1
  128. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  129. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js +35 -0
  130. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js.map +1 -0
  131. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs +33 -0
  132. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs.map +1 -0
  133. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +7 -10
  134. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  135. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +5 -9
  136. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  137. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +3 -2
  138. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  139. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +3 -2
  140. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  141. package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -2
  142. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  143. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +9 -12
  144. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  145. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +6 -10
  146. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
  147. package/dist/admin/pages/ListView/ListViewPage.js +3 -2
  148. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  149. package/dist/admin/pages/ListView/components/BulkActions/Actions.js +3 -2
  150. package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -1
  151. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +3 -2
  152. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  153. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +3 -2
  154. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  155. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  156. package/dist/admin/pages/ListView/components/Filters.js +10 -11
  157. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  158. package/dist/admin/pages/ListView/components/Filters.mjs +7 -9
  159. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  160. package/dist/admin/pages/ListView/components/TableActions.js +3 -2
  161. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  162. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +7 -3
  163. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  164. package/dist/admin/pages/ListView/components/TableCells/CellValue.js +7 -2
  165. package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -1
  166. package/dist/admin/pages/ListView/components/TableCells/Media.js +5 -4
  167. package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
  168. package/dist/admin/pages/ListView/components/TableCells/Media.mjs +5 -4
  169. package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
  170. package/dist/admin/pages/ListView/components/TableCells/Relations.js +3 -2
  171. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  172. package/dist/admin/pages/formatComponentConfigurationEditLayout.js +15 -9
  173. package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -1
  174. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +15 -9
  175. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -1
  176. package/dist/admin/preview/components/InputPopover.js +3 -2
  177. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  178. package/dist/admin/preview/hooks/usePreviewInputManager.js +3 -2
  179. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  180. package/dist/admin/preview/pages/Preview.js +3 -2
  181. package/dist/admin/preview/pages/Preview.js.map +1 -1
  182. package/dist/admin/preview/routes.js +3 -2
  183. package/dist/admin/preview/routes.js.map +1 -1
  184. package/dist/admin/services/components.js +3 -2
  185. package/dist/admin/services/components.js.map +1 -1
  186. package/dist/admin/services/components.mjs +3 -2
  187. package/dist/admin/services/components.mjs.map +1 -1
  188. package/dist/admin/services/contentTypes.js +4 -3
  189. package/dist/admin/services/contentTypes.js.map +1 -1
  190. package/dist/admin/services/contentTypes.mjs +4 -3
  191. package/dist/admin/services/contentTypes.mjs.map +1 -1
  192. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +1 -1
  193. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.d.ts +2 -0
  194. package/dist/admin/src/pages/EditView/utils/keyboardShortcuts.d.ts +18 -0
  195. package/dist/admin/src/pages/ListConfiguration/components/SortDisplayedFields.d.ts +2 -2
  196. package/dist/admin/src/pages/ListView/components/TableCells/Media.d.ts +2 -2
  197. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +3 -1
  198. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +24 -0
  199. package/dist/admin/translations/cs.json.js +2 -1
  200. package/dist/admin/translations/cs.json.js.map +1 -1
  201. package/dist/admin/translations/cs.json.mjs +2 -1
  202. package/dist/admin/translations/cs.json.mjs.map +1 -1
  203. package/dist/admin/translations/de.json.js +2 -1
  204. package/dist/admin/translations/de.json.js.map +1 -1
  205. package/dist/admin/translations/de.json.mjs +2 -1
  206. package/dist/admin/translations/de.json.mjs.map +1 -1
  207. package/dist/admin/translations/en.json.js +3 -1
  208. package/dist/admin/translations/en.json.js.map +1 -1
  209. package/dist/admin/translations/en.json.mjs +3 -1
  210. package/dist/admin/translations/en.json.mjs.map +1 -1
  211. package/dist/admin/translations/es.json.js +2 -1
  212. package/dist/admin/translations/es.json.js.map +1 -1
  213. package/dist/admin/translations/es.json.mjs +2 -1
  214. package/dist/admin/translations/es.json.mjs.map +1 -1
  215. package/dist/admin/translations/fr.json.js +2 -1
  216. package/dist/admin/translations/fr.json.js.map +1 -1
  217. package/dist/admin/translations/fr.json.mjs +2 -1
  218. package/dist/admin/translations/fr.json.mjs.map +1 -1
  219. package/dist/admin/translations/nl.json.js +2 -1
  220. package/dist/admin/translations/nl.json.js.map +1 -1
  221. package/dist/admin/translations/nl.json.mjs +2 -1
  222. package/dist/admin/translations/nl.json.mjs.map +1 -1
  223. package/dist/admin/translations/pl.json.js +2 -1
  224. package/dist/admin/translations/pl.json.js.map +1 -1
  225. package/dist/admin/translations/pl.json.mjs +2 -1
  226. package/dist/admin/translations/pl.json.mjs.map +1 -1
  227. package/dist/admin/translations/sk.json.js +2 -1
  228. package/dist/admin/translations/sk.json.js.map +1 -1
  229. package/dist/admin/translations/sk.json.mjs +2 -1
  230. package/dist/admin/translations/sk.json.mjs.map +1 -1
  231. package/dist/admin/utils/attributes.js +17 -2
  232. package/dist/admin/utils/attributes.js.map +1 -1
  233. package/dist/admin/utils/attributes.mjs +17 -2
  234. package/dist/admin/utils/attributes.mjs.map +1 -1
  235. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js +329 -0
  236. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js.map +1 -0
  237. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs +321 -0
  238. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs.map +1 -0
  239. package/dist/admin/utils/objects.js +9 -4
  240. package/dist/admin/utils/objects.js.map +1 -1
  241. package/dist/admin/utils/validation.js +7 -3
  242. package/dist/admin/utils/validation.js.map +1 -1
  243. package/dist/server/controllers/collection-types.js +7 -2
  244. package/dist/server/controllers/collection-types.js.map +1 -1
  245. package/dist/server/controllers/collection-types.mjs +7 -2
  246. package/dist/server/controllers/collection-types.mjs.map +1 -1
  247. package/dist/server/controllers/utils/clone.js +5 -1
  248. package/dist/server/controllers/utils/clone.js.map +1 -1
  249. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  250. package/dist/server/controllers/validation/index.js +6 -2
  251. package/dist/server/controllers/validation/index.js.map +1 -1
  252. package/dist/server/homepage/services/homepage.js +6 -1
  253. package/dist/server/homepage/services/homepage.js.map +1 -1
  254. package/dist/server/homepage/services/homepage.mjs +6 -1
  255. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  256. package/dist/server/mcp/handlers/collection-handlers.js +15 -18
  257. package/dist/server/mcp/handlers/collection-handlers.js.map +1 -1
  258. package/dist/server/mcp/handlers/collection-handlers.mjs +16 -19
  259. package/dist/server/mcp/handlers/collection-handlers.mjs.map +1 -1
  260. package/dist/server/mcp/handlers/single-type-handlers.js +12 -12
  261. package/dist/server/mcp/handlers/single-type-handlers.js.map +1 -1
  262. package/dist/server/mcp/handlers/single-type-handlers.mjs +13 -13
  263. package/dist/server/mcp/handlers/single-type-handlers.mjs.map +1 -1
  264. package/dist/server/mcp/register-content-manager-mcp-tools.js +4 -1
  265. package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
  266. package/dist/server/mcp/register-content-manager-mcp-tools.mjs +4 -1
  267. package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
  268. package/dist/server/mcp/sanitizers/shape-relations.js +108 -0
  269. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -0
  270. package/dist/server/mcp/sanitizers/shape-relations.mjs +103 -0
  271. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -0
  272. package/dist/server/mcp/schemas/data-schema.js +0 -3
  273. package/dist/server/mcp/schemas/data-schema.js.map +1 -1
  274. package/dist/server/mcp/schemas/data-schema.mjs +0 -3
  275. package/dist/server/mcp/schemas/data-schema.mjs.map +1 -1
  276. package/dist/server/mcp/schemas/output-schemas.js +30 -4
  277. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  278. package/dist/server/mcp/schemas/output-schemas.mjs +30 -4
  279. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  280. package/dist/server/mcp/utils.js +30 -3
  281. package/dist/server/mcp/utils.js.map +1 -1
  282. package/dist/server/mcp/utils.mjs +30 -4
  283. package/dist/server/mcp/utils.mjs.map +1 -1
  284. package/dist/server/middlewares/routing.js +5 -1
  285. package/dist/server/middlewares/routing.js.map +1 -1
  286. package/dist/server/services/populate-builder.js.map +1 -1
  287. package/dist/server/services/populate-builder.mjs.map +1 -1
  288. package/dist/server/services/uid.js +9 -4
  289. package/dist/server/services/uid.js.map +1 -1
  290. package/dist/server/services/utils/configuration/attributes.js +14 -10
  291. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  292. package/dist/server/services/utils/configuration/layouts.js +8 -4
  293. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  294. package/dist/server/services/utils/configuration/metadatas.js +19 -15
  295. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  296. package/dist/server/services/utils/configuration/settings.js +5 -1
  297. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  298. package/dist/server/services/utils/draft.js +5 -1
  299. package/dist/server/services/utils/draft.js.map +1 -1
  300. package/dist/server/services/utils/populate.js +8 -4
  301. package/dist/server/services/utils/populate.js.map +1 -1
  302. package/dist/server/services/utils/populate.mjs.map +1 -1
  303. package/dist/server/services/utils/store.js +9 -5
  304. package/dist/server/services/utils/store.js.map +1 -1
  305. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  306. package/dist/server/src/controllers/utils/clone.d.ts +1 -1
  307. package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
  308. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  309. package/dist/server/src/index.d.ts +3 -1
  310. package/dist/server/src/index.d.ts.map +1 -1
  311. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
  312. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
  313. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +2 -1
  314. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  315. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts +38 -0
  316. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -0
  317. package/dist/server/src/mcp/schemas/data-schema.d.ts +0 -3
  318. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
  319. package/dist/server/src/mcp/schemas/output-schemas.d.ts +2 -2
  320. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  321. package/dist/server/src/mcp/types.d.ts +2 -2
  322. package/dist/server/src/mcp/types.d.ts.map +1 -1
  323. package/dist/server/src/mcp/utils.d.ts +19 -1
  324. package/dist/server/src/mcp/utils.d.ts.map +1 -1
  325. package/dist/server/src/services/index.d.ts +3 -1
  326. package/dist/server/src/services/index.d.ts.map +1 -1
  327. package/dist/server/src/services/populate-builder.d.ts +3 -1
  328. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  329. package/dist/server/src/services/utils/populate.d.ts +3 -1
  330. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  331. package/package.json +8 -8
@@ -6,7 +6,8 @@ import { indexByDocumentId } from '../../controllers/utils/document-status.mjs';
6
6
  import { getPopulateForLocalizations } from '../../services/utils/populate.mjs';
7
7
  import { MCP_NOT_FOUND_DOCUMENT, MCP_NOT_FOUND_LOCALE, MCP_NOT_FOUND_OR_PUBLISHED } from './constants.mjs';
8
8
  import { isContentTypeLocalized } from '../permissions.mjs';
9
- import { ok } from '../utils.mjs';
9
+ import { shapeRelationsForMcp } from '../sanitizers/shape-relations.mjs';
10
+ import { ok, sanitizeFormatShape } from '../utils.mjs';
10
11
 
11
12
  // ---------------------------------------------------------------------------
12
13
  // Handler factories
@@ -41,10 +42,7 @@ import { ok } from '../utils.mjs';
41
42
  }
42
43
  };
43
44
  const permissionQuery = await permissionChecker.sanitizedQuery.read(query);
44
- const populate = await getService('populate-builder')(uid).populateFromQuery(permissionQuery).populateDeep(1).countRelations({
45
- toOne: false,
46
- toMany: true
47
- }).withPopulateOverride(getPopulateForLocalizations(uid)).build();
45
+ const populate = await getService('populate-builder')(uid).populateFromQuery(permissionQuery).populateDeep(1).withPopulateOverride(getPopulateForLocalizations(uid)).build();
48
46
  const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus({
49
47
  locale,
50
48
  status
@@ -63,7 +61,9 @@ import { ok } from '../utils.mjs';
63
61
  document.status = documentMetadata.getStatus(document, availableStatuses);
64
62
  return document;
65
63
  };
66
- const results = await async.map(documents, async.pipe(permissionChecker.sanitizeOutput, setStatus));
64
+ // Calculate, then strip: setStatus reads top-level publishedAt/updatedAt, so it must
65
+ // run before relation shaping reduces the document at the output boundary.
66
+ const results = await async.map(documents, async.pipe((doc)=>permissionChecker.sanitizeOutput(doc), setStatus, (doc)=>shapeRelationsForMcp(uid, doc)));
67
67
  return ok({
68
68
  results,
69
69
  pagination
@@ -87,7 +87,7 @@ import { ok } from '../utils.mjs';
87
87
  locale,
88
88
  status
89
89
  });
90
- const populate = await getService('populate-builder')(uid).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().withPopulateOverride(getPopulateForLocalizations(uid)).build();
90
+ const populate = await getService('populate-builder')(uid).populateFromQuery(permissionQuery).populateDeep(Infinity).withPopulateOverride(getPopulateForLocalizations(uid)).build();
91
91
  const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus({
92
92
  locale,
93
93
  status
@@ -118,8 +118,7 @@ import { ok } from '../utils.mjs';
118
118
  if (permissionChecker.cannot.read(version)) {
119
119
  throw new errors.ForbiddenError();
120
120
  }
121
- const sanitizedDocument = await permissionChecker.sanitizeOutput(version);
122
- const result = await formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);
121
+ const result = await sanitizeFormatShape(permissionChecker, uid, version);
123
122
  return ok(result);
124
123
  };
125
124
  /**
@@ -148,8 +147,7 @@ import { ok } from '../utils.mjs';
148
147
  locale: resolvedLocale,
149
148
  status
150
149
  });
151
- const sanitizedDocument = await permissionChecker.sanitizeOutput(document);
152
- return formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument, {
150
+ return sanitizeFormatShape(permissionChecker, uid, document, {
153
151
  availableLocales: false,
154
152
  availableStatus: false
155
153
  });
@@ -208,8 +206,7 @@ import { ok } from '../utils.mjs';
208
206
  data: sanitizedData,
209
207
  locale: resolvedLocale
210
208
  });
211
- const sanitizedDocument = await permissionChecker.sanitizeOutput(updatedDocument);
212
- return formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);
209
+ return sanitizeFormatShape(permissionChecker, uid, updatedDocument);
213
210
  });
214
211
  return ok(result);
215
212
  };
@@ -251,9 +248,11 @@ import { ok } from '../utils.mjs';
251
248
  const result = await documentManager.delete(documentId, uid, {
252
249
  locale: localeForQuery
253
250
  });
251
+ // Delete returns `{ data }` without metadata — no status to compute, so sanitize + shape only.
254
252
  const sanitizedResult = await permissionChecker.sanitizeOutput(result);
253
+ const shapedResult = await shapeRelationsForMcp(uid, sanitizedResult);
255
254
  return ok({
256
- data: sanitizedResult
255
+ data: shapedResult
257
256
  });
258
257
  };
259
258
  /**
@@ -296,8 +295,7 @@ import { ok } from '../utils.mjs';
296
295
  }
297
296
  return publishResult[0];
298
297
  });
299
- const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);
300
- const result = await formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);
298
+ const result = await sanitizeFormatShape(permissionChecker, uid, publishedDocument);
301
299
  return ok(result);
302
300
  };
303
301
  /**
@@ -349,8 +347,7 @@ import { ok } from '../utils.mjs';
349
347
  locale: resolvedLocale
350
348
  });
351
349
  });
352
- const sanitizedDocument = await permissionChecker.sanitizeOutput(unpublishedDocument);
353
- const result = await formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);
350
+ const result = await sanitizeFormatShape(permissionChecker, uid, unpublishedDocument);
354
351
  return ok(result);
355
352
  };
356
353
  /**
@@ -387,7 +384,7 @@ import { ok } from '../utils.mjs';
387
384
  }
388
385
  const discardedDocument = await async.pipe((doc)=>documentManager.discardDraft(doc.documentId, uid, {
389
386
  locale: resolvedLocale
390
- }), permissionChecker.sanitizeOutput, (doc)=>formatDocumentWithMetadata(permissionChecker, uid, doc))(document);
387
+ }), (doc)=>sanitizeFormatShape(permissionChecker, uid, doc))(document);
391
388
  return ok(discardedDocument);
392
389
  };
393
390
 
@@ -1 +1 @@
1
- {"version":3,"file":"collection-handlers.mjs","sources":["../../../../server/src/mcp/handlers/collection-handlers.ts"],"sourcesContent":["import { errors, contentTypes, async as asyncPipe, setCreatorFields } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { getDocumentLocaleAndStatus } from '../../controllers/validation/dimensions';\nimport { formatDocumentWithMetadata } from '../../controllers/utils/metadata';\nimport { indexByDocumentId } from '../../controllers/utils/document-status';\nimport { getPopulateForLocalizations } from '../../services/utils/populate';\nimport {\n MCP_NOT_FOUND_DOCUMENT,\n MCP_NOT_FOUND_LOCALE,\n MCP_NOT_FOUND_OR_PUBLISHED,\n} from './constants';\nimport { isContentTypeLocalized } from '../permissions';\nimport { ok } from '../utils';\n\ntype McpDocumentQuery = {\n populate?: unknown;\n locale?: string;\n status?: string;\n filters?: unknown;\n sort?: unknown;\n pagination?: unknown;\n [key: string]: unknown;\n};\n\ntype McpFindManyParams = Parameters<Modules.Documents.ServiceInstance['findMany']>[0];\n\n// ---------------------------------------------------------------------------\n// Arg types — type-level only; runtime validation is handled by the MCP SDK\n// ---------------------------------------------------------------------------\n\ntype CollectionListArgs = {\n locale?: string;\n status?: 'draft' | 'published';\n page?: number;\n pageSize?: number;\n sort?: unknown;\n filters?: unknown;\n};\n\ntype DocumentLocaleArgs = {\n documentId: string;\n locale?: string;\n};\n\ntype CollectionGetArgs = DocumentLocaleArgs & {\n status?: 'draft' | 'published';\n};\n\ntype CollectionCreateArgs = {\n data: Record<string, unknown>;\n locale?: string;\n};\n\ntype CollectionUpdateArgs = DocumentLocaleArgs & {\n data: Record<string, unknown>;\n};\n\ntype CollectionUnpublishArgs = DocumentLocaleArgs & {\n discardDraft?: boolean;\n};\n\n// ---------------------------------------------------------------------------\n// Handler factories\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a handler for listing (paginated) documents of a collection-type.\n * Enforces RBAC read permission and sanitizes query + output via permissionChecker.\n */\nexport const createCollectionListHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: CollectionListArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale, status, page, pageSize, sort, filters } = args;\n\n const documentMetadata = getService('document-metadata');\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.read()) {\n throw new errors.ForbiddenError();\n }\n\n const query: Record<string, unknown> = {\n ...(page !== undefined && { page }),\n ...(pageSize !== undefined && { pageSize }),\n ...(sort !== undefined && { sort }),\n ...(filters !== undefined && { filters }),\n };\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .populateDeep(1)\n .countRelations({ toOne: false, toMany: true })\n .withPopulateOverride(getPopulateForLocalizations(uid))\n .build();\n\n const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus(\n { locale, status },\n uid\n );\n\n const findPageQuery: McpDocumentQuery = {\n ...permissionQuery,\n populate,\n locale: resolvedLocale,\n status: resolvedStatus,\n };\n const { results: documents, pagination } = await documentManager.findPage(\n findPageQuery as McpFindManyParams,\n uid\n );\n\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(strapi.getModel(uid));\n const statusByDocumentId = hasDraftAndPublish\n ? indexByDocumentId(await documentMetadata.getManyAvailableStatus(uid, documents))\n : new Map();\n\n const setStatus = (document: any) => {\n const availableStatuses = statusByDocumentId.get(document.documentId) || [];\n document.status = documentMetadata.getStatus(document, availableStatuses);\n return document;\n };\n\n const results = await asyncPipe.map(\n documents,\n asyncPipe.pipe(permissionChecker.sanitizeOutput, setStatus)\n );\n\n return ok({ results, pagination } as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for fetching a single collection-type document by `documentId`.\n * Enforces RBAC read permission; returns available locale metadata when the locale is missing.\n */\nexport const createCollectionGetHandler =\n (uid: UID.CollectionType) =>\n (_strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale, status } = args as CollectionGetArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.read()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read({ locale, status });\n\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(uid))\n .build();\n\n const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus(\n { locale, status },\n uid\n );\n\n const version = await documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: resolvedStatus,\n });\n\n if (!version) {\n const exists = await documentManager.exists(uid, documentId);\n if (!exists) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n uid,\n { documentId, locale: resolvedLocale, publishedAt: null } as Parameters<\n typeof formatDocumentWithMetadata\n >[2],\n { availableLocales: true, availableStatus: false }\n );\n\n return ok({ data: {}, meta } as Record<string, unknown>);\n }\n\n if (permissionChecker.cannot.read(version)) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n const result = await formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for creating a new collection-type document.\n * Enforces RBAC create permission; sanitizes input and stamps creator fields.\n */\nexport const createCollectionCreateHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility, user } = context;\n const { data, locale } = args as CollectionCreateArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedData = setCreatorFields({ user })(\n await permissionChecker.sanitizeCreateInput(data)\n ) as Record<string, unknown>;\n\n const { locale: resolvedLocale, status } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const result = await strapi.db.transaction(async () => {\n const document = await documentManager.create(uid, {\n data: sanitizedData,\n locale: resolvedLocale,\n status,\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(document);\n return formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument, {\n availableLocales: false,\n availableStatus: false,\n });\n });\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for updating an existing collection-type document draft.\n * Creates a new locale version when the target locale does not yet exist for the document.\n * Enforces RBAC update (or create) permission accordingly.\n */\nexport const createCollectionUpdateHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility, user } = context;\n const { documentId, data, locale } = args as CollectionUpdateArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.update({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const [documentVersion, documentExists] = await Promise.all([\n documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: 'draft',\n }),\n documentManager.exists(uid, documentId),\n ]);\n\n if (!documentExists) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n // If version is not found but document exists, the intent is to create a new locale\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizeInput = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const isEdition = documentVersion !== null && documentVersion !== undefined;\n const sanitizedData = setCreatorFields({ user, isEdition })(\n await sanitizeInput(data)\n ) as Record<string, unknown>;\n\n const result = await strapi.db.transaction(async () => {\n const updatedDocument = await documentManager.update(\n documentVersion?.documentId ?? documentId,\n uid,\n { data: sanitizedData, locale: resolvedLocale }\n );\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(updatedDocument);\n return formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);\n });\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for deleting a collection-type document (or a specific locale).\n * Enforces RBAC delete permission on every locale version before deletion.\n */\nexport const createCollectionDeleteHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale } = args as DocumentLocaleArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.delete()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.delete({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const isLocalized = isContentTypeLocalized(strapi, uid);\n\n const localeForQuery = isLocalized === true ? resolvedLocale : undefined;\n\n const documentLocales = await documentManager.findLocales(documentId, uid, {\n populate,\n locale: localeForQuery,\n });\n\n if (documentLocales.length === 0) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n throw new errors.ForbiddenError();\n }\n }\n\n const result = await documentManager.delete(documentId, uid, { locale: localeForQuery });\n const sanitizedResult = await permissionChecker.sanitizeOutput(result);\n\n return ok({ data: sanitizedResult } as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for publishing a collection-type document draft.\n * Enforces RBAC publish permission; throws NotFound when the draft or document is missing.\n */\nexport const createCollectionPublishHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale } = args as DocumentLocaleArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.publish()) {\n throw new errors.ForbiddenError();\n }\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const exists = await documentManager.exists(uid, documentId);\n if (!exists) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n const document = await documentManager.findOne(documentId, uid, {\n locale: resolvedLocale,\n status: 'draft',\n });\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_LOCALE);\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, uid, {\n locale: resolvedLocale,\n });\n\n if (!publishResult || publishResult.length === 0) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_OR_PUBLISHED);\n }\n\n return publishResult[0];\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n const result = await formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for unpublishing a collection-type document.\n * Optionally discards the draft in the same transaction when `discardDraft` is true.\n * Enforces RBAC unpublish (and discard) permission.\n */\nexport const createCollectionUnpublishHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale, discardDraft } = args as CollectionUnpublishArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.unpublish()) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.unpublish({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const document = await documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: 'published',\n });\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const unpublishedDocument = await strapi.db.transaction(async () => {\n if (discardDraft === true) {\n await documentManager.discardDraft(document.documentId, uid, { locale: resolvedLocale });\n }\n\n return documentManager.unpublish(document.documentId, uid, { locale: resolvedLocale });\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(unpublishedDocument);\n const result = await formatDocumentWithMetadata(permissionChecker, uid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for discarding the draft of a collection-type document.\n * Restores the published version as the draft. Enforces RBAC discard permission.\n */\nexport const createCollectionDiscardDraftHandler =\n (uid: UID.CollectionType) =>\n (_strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale } = args as DocumentLocaleArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.discard({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const document = await documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: 'published',\n });\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const discardedDocument = await asyncPipe.pipe(\n (doc: any) => documentManager.discardDraft(doc.documentId, uid, { locale: resolvedLocale }),\n permissionChecker.sanitizeOutput,\n (doc: any) => formatDocumentWithMetadata(permissionChecker, uid, doc)\n )(document);\n\n return ok(discardedDocument as Record<string, unknown>);\n };\n"],"names":["createCollectionListHandler","uid","strapi","context","args","userAbility","locale","status","page","pageSize","sort","filters","documentMetadata","getService","documentManager","permissionChecker","create","model","cannot","read","errors","ForbiddenError","query","undefined","permissionQuery","sanitizedQuery","populate","populateFromQuery","populateDeep","countRelations","toOne","toMany","withPopulateOverride","getPopulateForLocalizations","build","resolvedLocale","resolvedStatus","getDocumentLocaleAndStatus","findPageQuery","results","documents","pagination","findPage","hasDraftAndPublish","contentTypes","getModel","statusByDocumentId","indexByDocumentId","getManyAvailableStatus","Map","setStatus","document","availableStatuses","get","documentId","getStatus","asyncPipe","map","pipe","sanitizeOutput","ok","createCollectionGetHandler","_strapi","Infinity","version","findOne","exists","NotFoundError","MCP_NOT_FOUND_DOCUMENT","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","data","sanitizedDocument","result","createCollectionCreateHandler","user","sanitizedData","setCreatorFields","sanitizeCreateInput","db","transaction","createCollectionUpdateHandler","update","documentVersion","documentExists","Promise","all","sanitizeInput","sanitizeUpdateInput","isEdition","updatedDocument","createCollectionDeleteHandler","delete","isLocalized","isContentTypeLocalized","localeForQuery","documentLocales","findLocales","length","sanitizedResult","createCollectionPublishHandler","publish","publishedDocument","MCP_NOT_FOUND_LOCALE","publishResult","MCP_NOT_FOUND_OR_PUBLISHED","createCollectionUnpublishHandler","discardDraft","unpublish","discard","unpublishedDocument","createCollectionDiscardDraftHandler","discardedDocument","doc"],"mappings":"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"}
1
+ {"version":3,"file":"collection-handlers.mjs","sources":["../../../../server/src/mcp/handlers/collection-handlers.ts"],"sourcesContent":["import { errors, contentTypes, async as asyncPipe, setCreatorFields } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { getDocumentLocaleAndStatus } from '../../controllers/validation/dimensions';\nimport { formatDocumentWithMetadata } from '../../controllers/utils/metadata';\nimport { indexByDocumentId } from '../../controllers/utils/document-status';\nimport { getPopulateForLocalizations } from '../../services/utils/populate';\nimport {\n MCP_NOT_FOUND_DOCUMENT,\n MCP_NOT_FOUND_LOCALE,\n MCP_NOT_FOUND_OR_PUBLISHED,\n} from './constants';\nimport { isContentTypeLocalized } from '../permissions';\nimport { shapeRelationsForMcp } from '../sanitizers/shape-relations';\nimport { ok, sanitizeFormatShape } from '../utils';\n\ntype McpDocumentQuery = {\n populate?: unknown;\n locale?: string;\n status?: string;\n filters?: unknown;\n sort?: unknown;\n pagination?: unknown;\n [key: string]: unknown;\n};\n\ntype McpFindManyParams = Parameters<Modules.Documents.ServiceInstance['findMany']>[0];\n\n// ---------------------------------------------------------------------------\n// Arg types — type-level only; runtime validation is handled by the MCP SDK\n// ---------------------------------------------------------------------------\n\ntype CollectionListArgs = {\n locale?: string;\n status?: 'draft' | 'published';\n page?: number;\n pageSize?: number;\n sort?: unknown;\n filters?: unknown;\n};\n\ntype DocumentLocaleArgs = {\n documentId: string;\n locale?: string;\n};\n\ntype CollectionGetArgs = DocumentLocaleArgs & {\n status?: 'draft' | 'published';\n};\n\ntype CollectionCreateArgs = {\n data: Record<string, unknown>;\n locale?: string;\n};\n\ntype CollectionUpdateArgs = DocumentLocaleArgs & {\n data: Record<string, unknown>;\n};\n\ntype CollectionUnpublishArgs = DocumentLocaleArgs & {\n discardDraft?: boolean;\n};\n\n// ---------------------------------------------------------------------------\n// Handler factories\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a handler for listing (paginated) documents of a collection-type.\n * Enforces RBAC read permission and sanitizes query + output via permissionChecker.\n */\nexport const createCollectionListHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: CollectionListArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale, status, page, pageSize, sort, filters } = args;\n\n const documentMetadata = getService('document-metadata');\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.read()) {\n throw new errors.ForbiddenError();\n }\n\n const query: Record<string, unknown> = {\n ...(page !== undefined && { page }),\n ...(pageSize !== undefined && { pageSize }),\n ...(sort !== undefined && { sort }),\n ...(filters !== undefined && { filters }),\n };\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .populateDeep(1)\n .withPopulateOverride(getPopulateForLocalizations(uid))\n .build();\n\n const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus(\n { locale, status },\n uid\n );\n\n const findPageQuery: McpDocumentQuery = {\n ...permissionQuery,\n populate,\n locale: resolvedLocale,\n status: resolvedStatus,\n };\n const { results: documents, pagination } = await documentManager.findPage(\n findPageQuery as McpFindManyParams,\n uid\n );\n\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(strapi.getModel(uid));\n const statusByDocumentId = hasDraftAndPublish\n ? indexByDocumentId(await documentMetadata.getManyAvailableStatus(uid, documents))\n : new Map();\n\n const setStatus = (document: any) => {\n const availableStatuses = statusByDocumentId.get(document.documentId) || [];\n document.status = documentMetadata.getStatus(document, availableStatuses);\n return document;\n };\n\n // Calculate, then strip: setStatus reads top-level publishedAt/updatedAt, so it must\n // run before relation shaping reduces the document at the output boundary.\n const results = await asyncPipe.map(\n documents,\n asyncPipe.pipe(\n (doc: unknown) => permissionChecker.sanitizeOutput(doc),\n setStatus,\n (doc: Record<string, unknown>) => shapeRelationsForMcp(uid, doc)\n )\n );\n\n return ok({ results, pagination } as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for fetching a single collection-type document by `documentId`.\n * Enforces RBAC read permission; returns available locale metadata when the locale is missing.\n */\nexport const createCollectionGetHandler =\n (uid: UID.CollectionType) =>\n (_strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale, status } = args as CollectionGetArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.read()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read({ locale, status });\n\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .withPopulateOverride(getPopulateForLocalizations(uid))\n .build();\n\n const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus(\n { locale, status },\n uid\n );\n\n const version = await documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: resolvedStatus,\n });\n\n if (!version) {\n const exists = await documentManager.exists(uid, documentId);\n if (!exists) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n uid,\n { documentId, locale: resolvedLocale, publishedAt: null } as Parameters<\n typeof formatDocumentWithMetadata\n >[2],\n { availableLocales: true, availableStatus: false }\n );\n\n return ok({ data: {}, meta } as Record<string, unknown>);\n }\n\n if (permissionChecker.cannot.read(version)) {\n throw new errors.ForbiddenError();\n }\n\n const result = await sanitizeFormatShape(permissionChecker, uid, version);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for creating a new collection-type document.\n * Enforces RBAC create permission; sanitizes input and stamps creator fields.\n */\nexport const createCollectionCreateHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility, user } = context;\n const { data, locale } = args as CollectionCreateArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedData = setCreatorFields({ user })(\n await permissionChecker.sanitizeCreateInput(data)\n ) as Record<string, unknown>;\n\n const { locale: resolvedLocale, status } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const result = await strapi.db.transaction(async () => {\n const document = await documentManager.create(uid, {\n data: sanitizedData,\n locale: resolvedLocale,\n status,\n });\n\n return sanitizeFormatShape(permissionChecker, uid, document, {\n availableLocales: false,\n availableStatus: false,\n });\n });\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for updating an existing collection-type document draft.\n * Creates a new locale version when the target locale does not yet exist for the document.\n * Enforces RBAC update (or create) permission accordingly.\n */\nexport const createCollectionUpdateHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility, user } = context;\n const { documentId, data, locale } = args as CollectionUpdateArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.update({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const [documentVersion, documentExists] = await Promise.all([\n documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: 'draft',\n }),\n documentManager.exists(uid, documentId),\n ]);\n\n if (!documentExists) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n // If version is not found but document exists, the intent is to create a new locale\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizeInput = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const isEdition = documentVersion !== null && documentVersion !== undefined;\n const sanitizedData = setCreatorFields({ user, isEdition })(\n await sanitizeInput(data)\n ) as Record<string, unknown>;\n\n const result = await strapi.db.transaction(async () => {\n const updatedDocument = await documentManager.update(\n documentVersion?.documentId ?? documentId,\n uid,\n { data: sanitizedData, locale: resolvedLocale }\n );\n\n return sanitizeFormatShape(permissionChecker, uid, updatedDocument);\n });\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for deleting a collection-type document (or a specific locale).\n * Enforces RBAC delete permission on every locale version before deletion.\n */\nexport const createCollectionDeleteHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale } = args as DocumentLocaleArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.delete()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.delete({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const isLocalized = isContentTypeLocalized(strapi, uid);\n\n const localeForQuery = isLocalized === true ? resolvedLocale : undefined;\n\n const documentLocales = await documentManager.findLocales(documentId, uid, {\n populate,\n locale: localeForQuery,\n });\n\n if (documentLocales.length === 0) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n throw new errors.ForbiddenError();\n }\n }\n\n const result = await documentManager.delete(documentId, uid, { locale: localeForQuery });\n // Delete returns `{ data }` without metadata — no status to compute, so sanitize + shape only.\n const sanitizedResult = await permissionChecker.sanitizeOutput(result);\n const shapedResult = await shapeRelationsForMcp(uid, sanitizedResult);\n\n return ok({ data: shapedResult } as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for publishing a collection-type document draft.\n * Enforces RBAC publish permission; throws NotFound when the draft or document is missing.\n */\nexport const createCollectionPublishHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale } = args as DocumentLocaleArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.publish()) {\n throw new errors.ForbiddenError();\n }\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const exists = await documentManager.exists(uid, documentId);\n if (!exists) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n const document = await documentManager.findOne(documentId, uid, {\n locale: resolvedLocale,\n status: 'draft',\n });\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_LOCALE);\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, uid, {\n locale: resolvedLocale,\n });\n\n if (!publishResult || publishResult.length === 0) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_OR_PUBLISHED);\n }\n\n return publishResult[0];\n });\n\n const result = await sanitizeFormatShape(permissionChecker, uid, publishedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for unpublishing a collection-type document.\n * Optionally discards the draft in the same transaction when `discardDraft` is true.\n * Enforces RBAC unpublish (and discard) permission.\n */\nexport const createCollectionUnpublishHandler =\n (uid: UID.CollectionType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale, discardDraft } = args as CollectionUnpublishArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.unpublish()) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.unpublish({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const document = await documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: 'published',\n });\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const unpublishedDocument = await strapi.db.transaction(async () => {\n if (discardDraft === true) {\n await documentManager.discardDraft(document.documentId, uid, { locale: resolvedLocale });\n }\n\n return documentManager.unpublish(document.documentId, uid, { locale: resolvedLocale });\n });\n\n const result = await sanitizeFormatShape(permissionChecker, uid, unpublishedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for discarding the draft of a collection-type document.\n * Restores the published version as the draft. Enforces RBAC discard permission.\n */\nexport const createCollectionDiscardDraftHandler =\n (uid: UID.CollectionType) =>\n (_strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { documentId, locale } = args as DocumentLocaleArgs;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({ userAbility, model: uid });\n\n if (permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.discard({ locale });\n const populate = await getService('populate-builder')(uid)\n .populateFromQuery(permissionQuery)\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const document = await documentManager.findOne(documentId, uid, {\n populate,\n locale: resolvedLocale,\n status: 'published',\n });\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const discardedDocument = await asyncPipe.pipe(\n (doc: any) => documentManager.discardDraft(doc.documentId, uid, { locale: resolvedLocale }),\n (doc: unknown) => sanitizeFormatShape(permissionChecker, uid, doc)\n )(document);\n\n return ok(discardedDocument as Record<string, unknown>);\n };\n"],"names":["createCollectionListHandler","uid","strapi","context","args","userAbility","locale","status","page","pageSize","sort","filters","documentMetadata","getService","documentManager","permissionChecker","create","model","cannot","read","errors","ForbiddenError","query","undefined","permissionQuery","sanitizedQuery","populate","populateFromQuery","populateDeep","withPopulateOverride","getPopulateForLocalizations","build","resolvedLocale","resolvedStatus","getDocumentLocaleAndStatus","findPageQuery","results","documents","pagination","findPage","hasDraftAndPublish","contentTypes","getModel","statusByDocumentId","indexByDocumentId","getManyAvailableStatus","Map","setStatus","document","availableStatuses","get","documentId","getStatus","asyncPipe","map","pipe","doc","sanitizeOutput","shapeRelationsForMcp","ok","createCollectionGetHandler","_strapi","Infinity","version","findOne","exists","NotFoundError","MCP_NOT_FOUND_DOCUMENT","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","data","result","sanitizeFormatShape","createCollectionCreateHandler","user","sanitizedData","setCreatorFields","sanitizeCreateInput","db","transaction","createCollectionUpdateHandler","update","documentVersion","documentExists","Promise","all","sanitizeInput","sanitizeUpdateInput","isEdition","updatedDocument","createCollectionDeleteHandler","delete","isLocalized","isContentTypeLocalized","localeForQuery","documentLocales","findLocales","length","sanitizedResult","shapedResult","createCollectionPublishHandler","publish","publishedDocument","MCP_NOT_FOUND_LOCALE","publishResult","MCP_NOT_FOUND_OR_PUBLISHED","createCollectionUnpublishHandler","discardDraft","unpublish","discard","unpublishedDocument","createCollectionDiscardDraftHandler","discardedDocument"],"mappings":"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"}
@@ -7,6 +7,7 @@ var metadata = require('../../controllers/utils/metadata.js');
7
7
  var populate = require('../../services/utils/populate.js');
8
8
  var constants = require('./constants.js');
9
9
  var permissions = require('../permissions.js');
10
+ var shapeRelations = require('../sanitizers/shape-relations.js');
10
11
  var utils = require('../utils.js');
11
12
 
12
13
  // ---------------------------------------------------------------------------
@@ -35,7 +36,7 @@ var utils = require('../utils.js');
35
36
  const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
36
37
  locale
37
38
  }, uid);
38
- const populate$1 = await index.getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).countRelations().withPopulateOverride(populate.getPopulateForLocalizations(typedUid)).build();
39
+ const populate$1 = await index.getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).withPopulateOverride(populate.getPopulateForLocalizations(typedUid)).build();
39
40
  const draftFindQuery = {
40
41
  ...sanitizedQuery,
41
42
  populate: populate$1,
@@ -79,8 +80,7 @@ var utils = require('../utils.js');
79
80
  locale: resolvedLocale
80
81
  });
81
82
  }
82
- const sanitizedDocument = await permissionChecker.sanitizeOutput(doc);
83
- return metadata.formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);
83
+ return utils.sanitizeFormatShape(permissionChecker, typedUid, doc);
84
84
  });
85
85
  return utils.ok(formatted);
86
86
  };
@@ -111,7 +111,7 @@ var utils = require('../utils.js');
111
111
  locale,
112
112
  status
113
113
  }, uid);
114
- const populate$1 = await index.getService('populate-builder')(typedUid).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().withPopulateOverride(populate.getPopulateForLocalizations(typedUid)).build();
114
+ const populate$1 = await index.getService('populate-builder')(typedUid).populateFromQuery(permissionQuery).populateDeep(Infinity).withPopulateOverride(populate.getPopulateForLocalizations(typedUid)).build();
115
115
  const versionFindQuery = {
116
116
  ...permissionQuery,
117
117
  populate: populate$1,
@@ -143,8 +143,7 @@ var utils = require('../utils.js');
143
143
  if (permissionChecker.cannot.read(version)) {
144
144
  throw new strapiUtils.errors.ForbiddenError();
145
145
  }
146
- const sanitizedDocument = await permissionChecker.sanitizeOutput(version);
147
- const result = await metadata.formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);
146
+ const result = await utils.sanitizeFormatShape(permissionChecker, typedUid, version);
148
147
  return utils.ok(result);
149
148
  };
150
149
  /**
@@ -172,7 +171,7 @@ var utils = require('../utils.js');
172
171
  const sanitizedQuery = await permissionChecker.sanitizedQuery.delete({
173
172
  locale
174
173
  });
175
- const populate$1 = await index.getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).countRelations().withPopulateOverride(populate.getPopulateForLocalizations(typedUid)).build();
174
+ const populate$1 = await index.getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).withPopulateOverride(populate.getPopulateForLocalizations(typedUid)).build();
176
175
  const { locale: resolvedLocale } = await dimensions.getDocumentLocaleAndStatus({
177
176
  locale
178
177
  }, uid);
@@ -193,9 +192,11 @@ var utils = require('../utils.js');
193
192
  const deletedEntity = await documentManager.delete(documentLocales[0].documentId, typedUid, {
194
193
  locale: localeForQuery
195
194
  });
195
+ // Delete returns `{ data }` without metadata — no status to compute, so sanitize + shape only.
196
196
  const sanitizedResult = await permissionChecker.sanitizeOutput(deletedEntity);
197
+ const shapedResult = await shapeRelations.shapeRelationsForMcp(typedUid, sanitizedResult);
197
198
  return utils.ok({
198
- data: sanitizedResult
199
+ data: shapedResult
199
200
  });
200
201
  };
201
202
  /**
@@ -238,8 +239,7 @@ var utils = require('../utils.js');
238
239
  });
239
240
  return publishResult?.at(0);
240
241
  });
241
- const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);
242
- const result = await metadata.formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);
242
+ const result = await utils.sanitizeFormatShape(permissionChecker, typedUid, publishedDocument);
243
243
  return utils.ok(result);
244
244
  };
245
245
  /**
@@ -290,7 +290,7 @@ var utils = require('../utils.js');
290
290
  }
291
291
  return strapiUtils.async.pipe((doc)=>documentManager.unpublish(doc.documentId, typedUid, {
292
292
  locale: resolvedLocale
293
- }), permissionChecker.sanitizeOutput, (doc)=>metadata.formatDocumentWithMetadata(permissionChecker, typedUid, doc))(document);
293
+ }), (doc)=>utils.sanitizeFormatShape(permissionChecker, typedUid, doc))(document);
294
294
  });
295
295
  return utils.ok(result);
296
296
  };
@@ -330,7 +330,7 @@ var utils = require('../utils.js');
330
330
  }
331
331
  const discardedDocument = await strapiUtils.async.pipe((doc)=>documentManager.discardDraft(doc.documentId, typedUid, {
332
332
  locale: resolvedLocale
333
- }), permissionChecker.sanitizeOutput, (doc)=>metadata.formatDocumentWithMetadata(permissionChecker, typedUid, doc))(document);
333
+ }), (doc)=>utils.sanitizeFormatShape(permissionChecker, typedUid, doc))(document);
334
334
  return utils.ok(discardedDocument);
335
335
  };
336
336
 
@@ -1 +1 @@
1
- {"version":3,"file":"single-type-handlers.js","sources":["../../../../server/src/mcp/handlers/single-type-handlers.ts"],"sourcesContent":["import { errors, async as asyncPipe, setCreatorFields } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { getDocumentLocaleAndStatus } from '../../controllers/validation/dimensions';\nimport { formatDocumentWithMetadata } from '../../controllers/utils/metadata';\nimport { getPopulateForLocalizations } from '../../services/utils/populate';\nimport { MCP_NOT_FOUND_DOCUMENT } from './constants';\nimport { isContentTypeLocalized } from '../permissions';\nimport { ok } from '../utils';\n\ntype McpDocumentQuery = {\n populate?: unknown;\n locale?: string;\n status?: string;\n filters?: unknown;\n sort?: unknown;\n pagination?: unknown;\n [key: string]: unknown;\n};\n\ntype McpFindManyParams = Parameters<Modules.Documents.ServiceInstance['findMany']>[0];\n\n// ---------------------------------------------------------------------------\n// Input arg schemas — used for type-safe narrowing from Record<string, unknown>\n// ---------------------------------------------------------------------------\n\ntype SingleLocaleArgs = { locale?: string };\ntype SingleGetArgs = SingleLocaleArgs & { status?: 'draft' | 'published' };\ntype SingleUnpublishArgs = SingleLocaleArgs & { discardDraft?: boolean };\ntype SingleWriteArgs = { data: Record<string, unknown>; locale?: string };\n\n// ---------------------------------------------------------------------------\n// Shared create-or-update logic mirroring single-types controller\n// ---------------------------------------------------------------------------\n\n/**\n * Core write logic shared by the single-type write handler.\n * Creates the document when none exists; updates the existing draft otherwise.\n * Enforces RBAC create/update permission and sanitizes input + output.\n */\nexport const singleCreateOrUpdate = async (\n strapi: Core.Strapi,\n uid: UID.SingleType,\n context: Modules.MCP.McpHandlerContext,\n args: SingleWriteArgs\n): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility, user } = context;\n const { data, locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const populate = await getService('populate-builder')(typedUid)\n .populateFromQuery(sanitizedQuery)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(typedUid))\n .build();\n\n const draftFindQuery: McpDocumentQuery = {\n ...sanitizedQuery,\n populate,\n locale: resolvedLocale,\n status: 'draft',\n };\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n documentManager\n .findMany(draftFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]),\n strapi.db.query(typedUid).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizeInput = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const isEdition = documentVersion !== null && documentVersion !== undefined;\n const sanitizedData = setCreatorFields({ user, isEdition })(await sanitizeInput(data)) as Record<\n string,\n unknown\n >;\n\n const formatted = await strapi.db.transaction(async () => {\n let doc: any;\n\n if (documentId === undefined) {\n doc = await documentManager.create(typedUid, {\n data: sanitizedData,\n ...sanitizedQuery,\n locale: resolvedLocale,\n });\n } else {\n doc = await documentManager.update(documentId, typedUid, {\n data: sanitizedData,\n populate,\n locale: resolvedLocale,\n });\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(doc);\n return formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);\n });\n\n return ok(formatted as Record<string, unknown>);\n};\n\n// ---------------------------------------------------------------------------\n// Handler factories\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a handler for reading the single-type document.\n * Returns available locale metadata when the requested locale version does not exist.\n * Enforces RBAC read permission.\n */\nexport const createSingleGetHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleGetArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale, status } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.read()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read({ locale, status });\n const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus(\n { locale, status },\n uid\n );\n\n const populate = await getService('populate-builder')(typedUid)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(typedUid))\n .build();\n\n const versionFindQuery: McpDocumentQuery = {\n ...permissionQuery,\n populate,\n locale: resolvedLocale,\n status: resolvedStatus,\n };\n const version = await getService('document-manager')\n .findMany(versionFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!version) {\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const document = await strapi.db.query(typedUid).findOne({});\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n typedUid,\n {\n documentId: document.documentId,\n locale: resolvedLocale,\n publishedAt: null,\n } as Parameters<typeof formatDocumentWithMetadata>[2],\n { availableLocales: true, availableStatus: false }\n );\n\n return ok({ data: {}, meta } as Record<string, unknown>);\n }\n\n if (permissionChecker.cannot.read(version)) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(version);\n const result = await formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for creating or updating the single-type document.\n * Delegates to `singleCreateOrUpdate`; enforces RBAC create/update permission.\n */\nexport const createSingleWriteHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n return singleCreateOrUpdate(strapi, uid, context, args as SingleWriteArgs);\n };\n\n/**\n * Creates a handler for deleting the single-type document (or a specific locale).\n * Enforces RBAC delete permission on every locale version before deletion.\n */\nexport const createSingleDeleteHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleLocaleArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.delete()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete({ locale });\n\n const populate = await getService('populate-builder')(typedUid)\n .populateFromQuery(sanitizedQuery)\n .populateDeep(Infinity)\n .countRelations()\n .withPopulateOverride(getPopulateForLocalizations(typedUid))\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const isLocalized = isContentTypeLocalized(strapi, uid);\n\n const localeForQuery = isLocalized === true ? resolvedLocale : undefined;\n\n const documentLocales = await documentManager.findLocales(undefined, typedUid, {\n populate,\n locale: localeForQuery,\n });\n\n if (documentLocales.length === 0) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n throw new errors.ForbiddenError();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales[0].documentId, typedUid, {\n locale: localeForQuery,\n });\n\n const sanitizedResult = await permissionChecker.sanitizeOutput(deletedEntity);\n\n return ok({ data: sanitizedResult } as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for publishing the single-type document draft.\n * Enforces RBAC publish permission; throws NotFound when the draft is missing.\n */\nexport const createSinglePublishHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleLocaleArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.publish()) {\n throw new errors.ForbiddenError();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const publishFindQuery: McpDocumentQuery = {\n ...sanitizedQuery,\n locale: resolvedLocale,\n status: 'draft',\n };\n const document = await getService('document-manager')\n .findMany(publishFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, typedUid, {\n locale: resolvedLocale,\n });\n\n return publishResult?.at(0);\n });\n\n const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);\n const result = await formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for unpublishing the single-type document.\n * Optionally discards the draft in the same transaction when `discardDraft` is true.\n * Enforces RBAC unpublish (and discard) permission.\n */\nexport const createSingleUnpublishHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleUnpublishArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale, discardDraft } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.unpublish()) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const unpublishFindQuery: McpDocumentQuery = { ...sanitizedQuery, locale: resolvedLocale };\n const document = await getService('document-manager')\n .findMany(unpublishFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const result = await strapi.db.transaction(async () => {\n if (discardDraft === true) {\n await documentManager.discardDraft(document.documentId, typedUid, {\n locale: resolvedLocale,\n });\n }\n\n return asyncPipe.pipe(\n (doc: any) =>\n documentManager.unpublish(doc.documentId, typedUid, { locale: resolvedLocale }),\n permissionChecker.sanitizeOutput,\n (doc: any) => formatDocumentWithMetadata(permissionChecker, typedUid, doc)\n )(document);\n });\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for discarding the draft of the single-type document.\n * Restores the published version as the draft. Enforces RBAC discard permission.\n */\nexport const createSingleDiscardDraftHandler =\n (uid: UID.SingleType) =>\n (_strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleLocaleArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const discardFindQuery: McpDocumentQuery = {\n ...sanitizedQuery,\n locale: resolvedLocale,\n status: 'published',\n };\n const document = await getService('document-manager')\n .findMany(discardFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const discardedDocument = await asyncPipe.pipe(\n (doc: any) =>\n documentManager.discardDraft(doc.documentId, typedUid, { locale: resolvedLocale }),\n permissionChecker.sanitizeOutput,\n (doc: any) => formatDocumentWithMetadata(permissionChecker, typedUid, doc)\n )(document);\n\n return ok(discardedDocument as Record<string, unknown>);\n };\n"],"names":["singleCreateOrUpdate","strapi","uid","context","args","userAbility","user","data","locale","typedUid","documentManager","getService","permissionChecker","create","model","cannot","update","errors","ForbiddenError","sanitizedQuery","resolvedLocale","getDocumentLocaleAndStatus","populate","populateFromQuery","populateDeep","Infinity","countRelations","withPopulateOverride","getPopulateForLocalizations","build","draftFindQuery","status","documentVersion","otherDocumentVersion","Promise","all","findMany","then","docs","db","query","findOne","select","documentId","sanitizeInput","sanitizeUpdateInput","sanitizeCreateInput","isEdition","undefined","sanitizedData","setCreatorFields","formatted","transaction","doc","sanitizedDocument","sanitizeOutput","formatDocumentWithMetadata","ok","createSingleGetHandler","read","permissionQuery","resolvedStatus","versionFindQuery","version","document","NotFoundError","MCP_NOT_FOUND_DOCUMENT","meta","publishedAt","availableLocales","availableStatus","result","createSingleWriteHandler","createSingleDeleteHandler","delete","isLocalized","isContentTypeLocalized","localeForQuery","documentLocales","findLocales","length","deletedEntity","sanitizedResult","createSinglePublishHandler","publish","publishedDocument","publishFindQuery","publishResult","at","createSingleUnpublishHandler","discardDraft","unpublish","discard","unpublishFindQuery","asyncPipe","pipe","createSingleDiscardDraftHandler","_strapi","discardFindQuery","discardedDocument"],"mappings":";;;;;;;;;;;AAgCA;AACA;AACA;AAEA;;;;AAIC,IACM,MAAMA,oBAAAA,GAAuB,OAClCC,MAAAA,EACAC,KACAC,OAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,WAAW,EAAEC,IAAI,EAAE,GAAGH,OAAAA;AAC9B,IAAA,MAAM,EAAEI,IAAI,EAAEC,MAAM,EAAE,GAAGJ,IAAAA;;AAEzB,IAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,IAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,IAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,QAAAA,WAAAA;QACAS,KAAAA,EAAOZ;AACT,KAAA,CAAA;IAEA,IAAIU,iBAAAA,CAAkBG,MAAM,CAACF,MAAM,MAAMD,iBAAAA,CAAkBG,MAAM,CAACC,MAAM,EAAA,EAAI;QAC1E,MAAM,IAAIC,mBAAOC,cAAc,EAAA;AACjC,IAAA;AAEA,IAAA,MAAMC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAACH,MAAM,CAAC;AAAER,QAAAA;AAAO,KAAA,CAAA;AAC9E,IAAA,MAAM,EAAEA,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,QAAAA;KAAO,EAAGN,GAAAA,CAAAA;AAEhF,IAAA,MAAMoB,aAAW,MAAMX,gBAAAA,CAAW,kBAAA,CAAA,CAAoBF,QAAAA,CAAAA,CACnDc,iBAAiB,CAACJ,cAAAA,CAAAA,CAClBK,YAAY,CAACC,UACbC,cAAc,EAAA,CACdC,oBAAoB,CAACC,oCAAAA,CAA4BnB,WACjDoB,KAAK,EAAA;AAER,IAAA,MAAMC,cAAAA,GAAmC;AACvC,QAAA,GAAGX,cAAc;AACjBG,kBAAAA,UAAAA;QACAd,MAAAA,EAAQY,cAAAA;QACRW,MAAAA,EAAQ;AACV,KAAA;AACA,IAAA,MAAM,CAACC,eAAAA,EAAiBC,oBAAAA,CAAqB,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;QAChEzB,eAAAA,CACG0B,QAAQ,CAACN,cAAAA,EAAqCrB,QAAAA,CAAAA,CAC9C4B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAChCrC,QAAAA,MAAAA,CAAOsC,EAAE,CAACC,KAAK,CAAC/B,QAAAA,CAAAA,CAAUgC,OAAO,CAAC;YAAEC,MAAAA,EAAQ;AAAC,gBAAA;AAAa;AAAC,SAAA;AAC5D,KAAA,CAAA;AAED,IAAA,MAAMC,aAAaV,oBAAAA,EAAsBU,UAAAA;AAEzC,IAAA,IAAIX,eAAAA,EAAiB;AACnB,QAAA,IAAIpB,iBAAAA,CAAkBG,MAAM,CAACC,MAAM,CAACgB,eAAAA,CAAAA,EAAkB;YACpD,MAAM,IAAIf,mBAAOC,cAAc,EAAA;AACjC,QAAA;AACF,IAAA,CAAA,MAAO,IAAIN,iBAAAA,CAAkBG,MAAM,CAACF,MAAM,EAAA,EAAI;QAC5C,MAAM,IAAII,mBAAOC,cAAc,EAAA;AACjC,IAAA;AAEA,IAAA,MAAM0B,gBAAgBZ,eAAAA,GAClBpB,iBAAAA,CAAkBiC,mBAAmB,CAACb,eAAAA,CAAAA,GACtCpB,kBAAkBkC,mBAAmB;IAEzC,MAAMC,SAAAA,GAAYf,eAAAA,KAAoB,IAAA,IAAQA,eAAAA,KAAoBgB,SAAAA;AAClE,IAAA,MAAMC,gBAAgBC,4BAAAA,CAAiB;AAAE5C,QAAAA,IAAAA;AAAMyC,QAAAA;AAAU,KAAA,CAAA,CAAG,MAAMH,aAAAA,CAAcrC,IAAAA,CAAAA,CAAAA;AAKhF,IAAA,MAAM4C,YAAY,MAAMlD,MAAAA,CAAOsC,EAAE,CAACa,WAAW,CAAC,UAAA;QAC5C,IAAIC,GAAAA;AAEJ,QAAA,IAAIV,eAAeK,SAAAA,EAAW;AAC5BK,YAAAA,GAAAA,GAAM,MAAM3C,eAAAA,CAAgBG,MAAM,CAACJ,QAAAA,EAAU;gBAC3CF,IAAAA,EAAM0C,aAAAA;AACN,gBAAA,GAAG9B,cAAc;gBACjBX,MAAAA,EAAQY;AACV,aAAA,CAAA;QACF,CAAA,MAAO;AACLiC,YAAAA,GAAAA,GAAM,MAAM3C,eAAAA,CAAgBM,MAAM,CAAC2B,YAAYlC,QAAAA,EAAU;gBACvDF,IAAAA,EAAM0C,aAAAA;AACN3B,0BAAAA,UAAAA;gBACAd,MAAAA,EAAQY;AACV,aAAA,CAAA;AACF,QAAA;AAEA,QAAA,MAAMkC,iBAAAA,GAAoB,MAAM1C,iBAAAA,CAAkB2C,cAAc,CAACF,GAAAA,CAAAA;QACjE,OAAOG,mCAAAA,CAA2B5C,mBAAmBH,QAAAA,EAAU6C,iBAAAA,CAAAA;AACjE,IAAA,CAAA,CAAA;AAEA,IAAA,OAAOG,QAAAA,CAAGN,SAAAA,CAAAA;AACZ;AAEA;AACA;AACA;AAEA;;;;IAKO,MAAMO,sBAAAA,GACX,CAACxD,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EAAEC,IAAI,EAA2B,GAAA;YACtC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEK,MAAM,EAAEuB,MAAM,EAAE,GAAG3B,IAAAA;;AAE3B,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMU,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAAC4C,IAAI,EAAA,EAAI;gBACnC,MAAM,IAAI1C,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAM0C,kBAAkB,MAAMhD,iBAAAA,CAAkBO,cAAc,CAACwC,IAAI,CAAC;AAAEnD,gBAAAA,MAAAA;AAAQuB,gBAAAA;AAAO,aAAA,CAAA;YACrF,MAAM,EAAEvB,QAAQY,cAAc,EAAEW,QAAQ8B,cAAc,EAAE,GAAG,MAAMxC,qCAAAA,CAC/D;AAAEb,gBAAAA,MAAAA;AAAQuB,gBAAAA;aAAO,EACjB7B,GAAAA,CAAAA;AAGF,YAAA,MAAMoB,aAAW,MAAMX,gBAAAA,CAAW,kBAAA,CAAA,CAAoBF,QAAAA,CAAAA,CACnDc,iBAAiB,CAACqC,eAAAA,CAAAA,CAClBpC,YAAY,CAACC,UACbC,cAAc,EAAA,CACdC,oBAAoB,CAACC,oCAAAA,CAA4BnB,WACjDoB,KAAK,EAAA;AAER,YAAA,MAAMiC,gBAAAA,GAAqC;AACzC,gBAAA,GAAGF,eAAe;AAClBtC,0BAAAA,UAAAA;gBACAd,MAAAA,EAAQY,cAAAA;gBACRW,MAAAA,EAAQ8B;AACV,aAAA;AACA,YAAA,MAAME,OAAAA,GAAU,MAAMpD,gBAAAA,CAAW,kBAAA,CAAA,CAC9ByB,QAAQ,CAAC0B,gBAAAA,EAAuCrD,QAAAA,CAAAA,CAChD4B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAEhC,YAAA,IAAI,CAACyB,OAAAA,EAAS;AACZ,gBAAA,IAAInD,iBAAAA,CAAkBG,MAAM,CAACF,MAAM,EAAA,EAAI;oBACrC,MAAM,IAAII,mBAAOC,cAAc,EAAA;AACjC,gBAAA;gBAEA,MAAM8C,QAAAA,GAAW,MAAM/D,MAAAA,CAAOsC,EAAE,CAACC,KAAK,CAAC/B,QAAAA,CAAAA,CAAUgC,OAAO,CAAC,EAAC,CAAA;AAE1D,gBAAA,IAAI,CAACuB,QAAAA,EAAU;oBACb,MAAM,IAAI/C,kBAAAA,CAAOgD,aAAa,CAACC,gCAAAA,CAAAA;AACjC,gBAAA;AAEA,gBAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMX,mCAAAA,CACrB5C,mBACAH,QAAAA,EACA;AACEkC,oBAAAA,UAAAA,EAAYqB,SAASrB,UAAU;oBAC/BnC,MAAAA,EAAQY,cAAAA;oBACRgD,WAAAA,EAAa;iBACf,EACA;oBAAEC,gBAAAA,EAAkB,IAAA;oBAAMC,eAAAA,EAAiB;AAAM,iBAAA,CAAA;AAGnD,gBAAA,OAAOb,QAAAA,CAAG;AAAElD,oBAAAA,IAAAA,EAAM,EAAC;AAAG4D,oBAAAA;AAAK,iBAAA,CAAA;AAC7B,YAAA;AAEA,YAAA,IAAIvD,iBAAAA,CAAkBG,MAAM,CAAC4C,IAAI,CAACI,OAAAA,CAAAA,EAAU;gBAC1C,MAAM,IAAI9C,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMoC,iBAAAA,GAAoB,MAAM1C,iBAAAA,CAAkB2C,cAAc,CAACQ,OAAAA,CAAAA;AACjE,YAAA,MAAMQ,MAAAA,GAAS,MAAMf,mCAAAA,CAA2B5C,iBAAAA,EAAmBH,QAAAA,EAAU6C,iBAAAA,CAAAA;AAE7E,YAAA,OAAOG,QAAAA,CAAGc,MAAAA,CAAAA;QACZ;AAEF;;;IAIO,MAAMC,wBAAAA,GACX,CAACtE,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EACLC,IAAI,EAGL,GAAA;YACC,OAAOJ,oBAAAA,CAAqBC,MAAAA,EAAQC,GAAAA,EAAKC,OAAAA,EAASC,IAAAA,CAAAA;QACpD;AAEF;;;IAIO,MAAMqE,yBAAAA,GACX,CAACvE,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EAAEC,IAAI,EAA8B,GAAA;YACzC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;YACxB,MAAM,EAAEK,MAAM,EAAE,GAAGJ,IAAAA;;AAEnB,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAAC2D,MAAM,EAAA,EAAI;gBACrC,MAAM,IAAIzD,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAACuD,MAAM,CAAC;AAAElE,gBAAAA;AAAO,aAAA,CAAA;AAE9E,YAAA,MAAMc,aAAW,MAAMX,gBAAAA,CAAW,kBAAA,CAAA,CAAoBF,QAAAA,CAAAA,CACnDc,iBAAiB,CAACJ,cAAAA,CAAAA,CAClBK,YAAY,CAACC,UACbC,cAAc,EAAA,CACdC,oBAAoB,CAACC,oCAAAA,CAA4BnB,WACjDoB,KAAK,EAAA;AAER,YAAA,MAAM,EAAErB,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,gBAAAA;aAAO,EAAGN,GAAAA,CAAAA;YAEhF,MAAMyE,WAAAA,GAAcC,mCAAuB3E,MAAAA,EAAQC,GAAAA,CAAAA;YAEnD,MAAM2E,cAAAA,GAAiBF,WAAAA,KAAgB,IAAA,GAAOvD,cAAAA,GAAiB4B,SAAAA;AAE/D,YAAA,MAAM8B,kBAAkB,MAAMpE,eAAAA,CAAgBqE,WAAW,CAAC/B,WAAWvC,QAAAA,EAAU;AAC7Ea,0BAAAA,UAAAA;gBACAd,MAAAA,EAAQqE;AACV,aAAA,CAAA;YAEA,IAAIC,eAAAA,CAAgBE,MAAM,KAAK,CAAA,EAAG;gBAChC,MAAM,IAAI/D,kBAAAA,CAAOgD,aAAa,CAACC,gCAAAA,CAAAA;AACjC,YAAA;YAEA,KAAK,MAAMF,YAAYc,eAAAA,CAAiB;AACtC,gBAAA,IAAIlE,iBAAAA,CAAkBG,MAAM,CAAC2D,MAAM,CAACV,QAAAA,CAAAA,EAAW;oBAC7C,MAAM,IAAI/C,mBAAOC,cAAc,EAAA;AACjC,gBAAA;AACF,YAAA;YAEA,MAAM+D,aAAAA,GAAgB,MAAMvE,eAAAA,CAAgBgE,MAAM,CAACI,eAAe,CAAC,CAAA,CAAE,CAACnC,UAAU,EAAElC,QAAAA,EAAU;gBAC1FD,MAAAA,EAAQqE;AACV,aAAA,CAAA;AAEA,YAAA,MAAMK,eAAAA,GAAkB,MAAMtE,iBAAAA,CAAkB2C,cAAc,CAAC0B,aAAAA,CAAAA;AAE/D,YAAA,OAAOxB,QAAAA,CAAG;gBAAElD,IAAAA,EAAM2E;AAAgB,aAAA,CAAA;QACpC;AAEF;;;IAIO,MAAMC,0BAAAA,GACX,CAACjF,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EAAEC,IAAI,EAA8B,GAAA;YACzC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;YACxB,MAAM,EAAEK,MAAM,EAAE,GAAGJ,IAAAA;;AAEnB,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAACqE,OAAO,EAAA,EAAI;gBACtC,MAAM,IAAInE,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMmE,oBAAoB,MAAMpF,MAAAA,CAAOsC,EAAE,CAACa,WAAW,CAAC,UAAA;AACpD,gBAAA,MAAMjC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAACiE,OAAO,CAAC;AAAE5E,oBAAAA;AAAO,iBAAA,CAAA;AAC/E,gBAAA,MAAM,EAAEA,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,oBAAAA;iBAAO,EAAGN,GAAAA,CAAAA;AAEhF,gBAAA,MAAMoF,gBAAAA,GAAqC;AACzC,oBAAA,GAAGnE,cAAc;oBACjBX,MAAAA,EAAQY,cAAAA;oBACRW,MAAAA,EAAQ;AACV,iBAAA;AACA,gBAAA,MAAMiC,QAAAA,GAAW,MAAMrD,gBAAAA,CAAW,kBAAA,CAAA,CAC/ByB,QAAQ,CAACkD,gBAAAA,EAAuC7E,QAAAA,CAAAA,CAChD4B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAEhC,gBAAA,IAAI,CAAC0B,QAAAA,EAAU;oBACb,MAAM,IAAI/C,kBAAAA,CAAOgD,aAAa,CAACC,gCAAAA,CAAAA;AACjC,gBAAA;AAEA,gBAAA,IAAItD,iBAAAA,CAAkBG,MAAM,CAACqE,OAAO,CAACpB,QAAAA,CAAAA,EAAW;oBAC9C,MAAM,IAAI/C,mBAAOC,cAAc,EAAA;AACjC,gBAAA;gBAEA,MAAMqE,aAAAA,GAAgB,MAAM7E,eAAAA,CAAgB0E,OAAO,CAACpB,QAAAA,CAASrB,UAAU,EAAElC,QAAAA,EAAU;oBACjFD,MAAAA,EAAQY;AACV,iBAAA,CAAA;AAEA,gBAAA,OAAOmE,eAAeC,EAAAA,CAAG,CAAA,CAAA;AAC3B,YAAA,CAAA,CAAA;AAEA,YAAA,MAAMlC,iBAAAA,GAAoB,MAAM1C,iBAAAA,CAAkB2C,cAAc,CAAC8B,iBAAAA,CAAAA;AACjE,YAAA,MAAMd,MAAAA,GAAS,MAAMf,mCAAAA,CAA2B5C,iBAAAA,EAAmBH,QAAAA,EAAU6C,iBAAAA,CAAAA;AAE7E,YAAA,OAAOG,QAAAA,CAAGc,MAAAA,CAAAA;QACZ;AAEF;;;;IAKO,MAAMkB,4BAAAA,GACX,CAACvF,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EAAEC,IAAI,EAAiC,GAAA;YAC5C,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEK,MAAM,EAAEkF,YAAY,EAAE,GAAGtF,IAAAA;;AAEjC,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAAC4E,SAAS,EAAA,EAAI;gBACxC,MAAM,IAAI1E,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,IAAIwE,iBAAiB,IAAA,IAAQ9E,iBAAAA,CAAkBG,MAAM,CAAC6E,OAAO,EAAA,EAAI;gBAC/D,MAAM,IAAI3E,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAACwE,SAAS,CAAC;AAAEnF,gBAAAA;AAAO,aAAA,CAAA;AACjF,YAAA,MAAM,EAAEA,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,gBAAAA;aAAO,EAAGN,GAAAA,CAAAA;AAEhF,YAAA,MAAM2F,kBAAAA,GAAuC;AAAE,gBAAA,GAAG1E,cAAc;gBAAEX,MAAAA,EAAQY;AAAe,aAAA;AACzF,YAAA,MAAM4C,QAAAA,GAAW,MAAMrD,gBAAAA,CAAW,kBAAA,CAAA,CAC/ByB,QAAQ,CAACyD,kBAAAA,EAAyCpF,QAAAA,CAAAA,CAClD4B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAEhC,YAAA,IAAI,CAAC0B,QAAAA,EAAU;gBACb,MAAM,IAAI/C,kBAAAA,CAAOgD,aAAa,CAACC,gCAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAItD,iBAAAA,CAAkBG,MAAM,CAAC4E,SAAS,CAAC3B,QAAAA,CAAAA,EAAW;gBAChD,MAAM,IAAI/C,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,IAAIwE,iBAAiB,IAAA,IAAQ9E,iBAAAA,CAAkBG,MAAM,CAAC6E,OAAO,CAAC5B,QAAAA,CAAAA,EAAW;gBACvE,MAAM,IAAI/C,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMqD,SAAS,MAAMtE,MAAAA,CAAOsC,EAAE,CAACa,WAAW,CAAC,UAAA;AACzC,gBAAA,IAAIsC,iBAAiB,IAAA,EAAM;AACzB,oBAAA,MAAMhF,gBAAgBgF,YAAY,CAAC1B,QAAAA,CAASrB,UAAU,EAAElC,QAAAA,EAAU;wBAChED,MAAAA,EAAQY;AACV,qBAAA,CAAA;AACF,gBAAA;gBAEA,OAAO0E,iBAAAA,CAAUC,IAAI,CACnB,CAAC1C,GAAAA,GACC3C,eAAAA,CAAgBiF,SAAS,CAACtC,GAAAA,CAAIV,UAAU,EAAElC,QAAAA,EAAU;wBAAED,MAAAA,EAAQY;qBAAe,CAAA,EAC/ER,iBAAAA,CAAkB2C,cAAc,EAChC,CAACF,MAAaG,mCAAAA,CAA2B5C,iBAAAA,EAAmBH,UAAU4C,GAAAA,CAAAA,CAAAA,CACtEW,QAAAA,CAAAA;AACJ,YAAA,CAAA,CAAA;AAEA,YAAA,OAAOP,QAAAA,CAAGc,MAAAA,CAAAA;QACZ;AAEF;;;IAIO,MAAMyB,+BAAAA,GACX,CAAC9F,GAAAA,GACD,CAAC+F,OAAAA,EAAsB9F,OAAAA,GACvB,OAAO,EAAEC,IAAI,EAA8B,GAAA;YACzC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;YACxB,MAAM,EAAEK,MAAM,EAAE,GAAGJ,IAAAA;;AAEnB,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAAC6E,OAAO,EAAA,EAAI;gBACtC,MAAM,IAAI3E,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAACyE,OAAO,CAAC;AAAEpF,gBAAAA;AAAO,aAAA,CAAA;AAC/E,YAAA,MAAM,EAAEA,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,gBAAAA;aAAO,EAAGN,GAAAA,CAAAA;AAEhF,YAAA,MAAMgG,gBAAAA,GAAqC;AACzC,gBAAA,GAAG/E,cAAc;gBACjBX,MAAAA,EAAQY,cAAAA;gBACRW,MAAAA,EAAQ;AACV,aAAA;AACA,YAAA,MAAMiC,QAAAA,GAAW,MAAMrD,gBAAAA,CAAW,kBAAA,CAAA,CAC/ByB,QAAQ,CAAC8D,gBAAAA,EAAuCzF,QAAAA,CAAAA,CAChD4B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAEhC,YAAA,IAAI,CAAC0B,QAAAA,EAAU;gBACb,MAAM,IAAI/C,kBAAAA,CAAOgD,aAAa,CAACC,gCAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAItD,iBAAAA,CAAkBG,MAAM,CAAC6E,OAAO,CAAC5B,QAAAA,CAAAA,EAAW;gBAC9C,MAAM,IAAI/C,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMiF,iBAAAA,GAAoB,MAAML,iBAAAA,CAAUC,IAAI,CAC5C,CAAC1C,GAAAA,GACC3C,eAAAA,CAAgBgF,YAAY,CAACrC,GAAAA,CAAIV,UAAU,EAAElC,QAAAA,EAAU;oBAAED,MAAAA,EAAQY;iBAAe,CAAA,EAClFR,iBAAAA,CAAkB2C,cAAc,EAChC,CAACF,MAAaG,mCAAAA,CAA2B5C,iBAAAA,EAAmBH,UAAU4C,GAAAA,CAAAA,CAAAA,CACtEW,QAAAA,CAAAA;AAEF,YAAA,OAAOP,QAAAA,CAAG0C,iBAAAA,CAAAA;QACZ;;;;;;;;;;"}
1
+ {"version":3,"file":"single-type-handlers.js","sources":["../../../../server/src/mcp/handlers/single-type-handlers.ts"],"sourcesContent":["import { errors, async as asyncPipe, setCreatorFields } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { getDocumentLocaleAndStatus } from '../../controllers/validation/dimensions';\nimport { formatDocumentWithMetadata } from '../../controllers/utils/metadata';\nimport { getPopulateForLocalizations } from '../../services/utils/populate';\nimport { MCP_NOT_FOUND_DOCUMENT } from './constants';\nimport { isContentTypeLocalized } from '../permissions';\nimport { shapeRelationsForMcp } from '../sanitizers/shape-relations';\nimport { ok, sanitizeFormatShape } from '../utils';\n\ntype McpDocumentQuery = {\n populate?: unknown;\n locale?: string;\n status?: string;\n filters?: unknown;\n sort?: unknown;\n pagination?: unknown;\n [key: string]: unknown;\n};\n\ntype McpFindManyParams = Parameters<Modules.Documents.ServiceInstance['findMany']>[0];\n\n// ---------------------------------------------------------------------------\n// Input arg schemas — used for type-safe narrowing from Record<string, unknown>\n// ---------------------------------------------------------------------------\n\ntype SingleLocaleArgs = { locale?: string };\ntype SingleGetArgs = SingleLocaleArgs & { status?: 'draft' | 'published' };\ntype SingleUnpublishArgs = SingleLocaleArgs & { discardDraft?: boolean };\ntype SingleWriteArgs = { data: Record<string, unknown>; locale?: string };\n\n// ---------------------------------------------------------------------------\n// Shared create-or-update logic mirroring single-types controller\n// ---------------------------------------------------------------------------\n\n/**\n * Core write logic shared by the single-type write handler.\n * Creates the document when none exists; updates the existing draft otherwise.\n * Enforces RBAC create/update permission and sanitizes input + output.\n */\nexport const singleCreateOrUpdate = async (\n strapi: Core.Strapi,\n uid: UID.SingleType,\n context: Modules.MCP.McpHandlerContext,\n args: SingleWriteArgs\n): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility, user } = context;\n const { data, locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.update({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const populate = await getService('populate-builder')(typedUid)\n .populateFromQuery(sanitizedQuery)\n .populateDeep(Infinity)\n .withPopulateOverride(getPopulateForLocalizations(typedUid))\n .build();\n\n const draftFindQuery: McpDocumentQuery = {\n ...sanitizedQuery,\n populate,\n locale: resolvedLocale,\n status: 'draft',\n };\n const [documentVersion, otherDocumentVersion] = await Promise.all([\n documentManager\n .findMany(draftFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]),\n strapi.db.query(typedUid).findOne({ select: ['documentId'] }),\n ]);\n\n const documentId = otherDocumentVersion?.documentId;\n\n if (documentVersion) {\n if (permissionChecker.cannot.update(documentVersion)) {\n throw new errors.ForbiddenError();\n }\n } else if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizeInput = documentVersion\n ? permissionChecker.sanitizeUpdateInput(documentVersion)\n : permissionChecker.sanitizeCreateInput;\n\n const isEdition = documentVersion !== null && documentVersion !== undefined;\n const sanitizedData = setCreatorFields({ user, isEdition })(await sanitizeInput(data)) as Record<\n string,\n unknown\n >;\n\n const formatted = await strapi.db.transaction(async () => {\n let doc: any;\n\n if (documentId === undefined) {\n doc = await documentManager.create(typedUid, {\n data: sanitizedData,\n ...sanitizedQuery,\n locale: resolvedLocale,\n });\n } else {\n doc = await documentManager.update(documentId, typedUid, {\n data: sanitizedData,\n populate,\n locale: resolvedLocale,\n });\n }\n\n return sanitizeFormatShape(permissionChecker, typedUid, doc);\n });\n\n return ok(formatted as Record<string, unknown>);\n};\n\n// ---------------------------------------------------------------------------\n// Handler factories\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a handler for reading the single-type document.\n * Returns available locale metadata when the requested locale version does not exist.\n * Enforces RBAC read permission.\n */\nexport const createSingleGetHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleGetArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale, status } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.read()) {\n throw new errors.ForbiddenError();\n }\n\n const permissionQuery = await permissionChecker.sanitizedQuery.read({ locale, status });\n const { locale: resolvedLocale, status: resolvedStatus } = await getDocumentLocaleAndStatus(\n { locale, status },\n uid\n );\n\n const populate = await getService('populate-builder')(typedUid)\n .populateFromQuery(permissionQuery)\n .populateDeep(Infinity)\n .withPopulateOverride(getPopulateForLocalizations(typedUid))\n .build();\n\n const versionFindQuery: McpDocumentQuery = {\n ...permissionQuery,\n populate,\n locale: resolvedLocale,\n status: resolvedStatus,\n };\n const version = await getService('document-manager')\n .findMany(versionFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!version) {\n if (permissionChecker.cannot.create()) {\n throw new errors.ForbiddenError();\n }\n\n const document = await strapi.db.query(typedUid).findOne({});\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n const { meta } = await formatDocumentWithMetadata(\n permissionChecker,\n typedUid,\n {\n documentId: document.documentId,\n locale: resolvedLocale,\n publishedAt: null,\n } as Parameters<typeof formatDocumentWithMetadata>[2],\n { availableLocales: true, availableStatus: false }\n );\n\n return ok({ data: {}, meta } as Record<string, unknown>);\n }\n\n if (permissionChecker.cannot.read(version)) {\n throw new errors.ForbiddenError();\n }\n\n const result = await sanitizeFormatShape(permissionChecker, typedUid, version);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for creating or updating the single-type document.\n * Delegates to `singleCreateOrUpdate`; enforces RBAC create/update permission.\n */\nexport const createSingleWriteHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({\n args,\n }: {\n args: Record<string, unknown>;\n }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n return singleCreateOrUpdate(strapi, uid, context, args as SingleWriteArgs);\n };\n\n/**\n * Creates a handler for deleting the single-type document (or a specific locale).\n * Enforces RBAC delete permission on every locale version before deletion.\n */\nexport const createSingleDeleteHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleLocaleArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.delete()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.delete({ locale });\n\n const populate = await getService('populate-builder')(typedUid)\n .populateFromQuery(sanitizedQuery)\n .populateDeep(Infinity)\n .withPopulateOverride(getPopulateForLocalizations(typedUid))\n .build();\n\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const isLocalized = isContentTypeLocalized(strapi, uid);\n\n const localeForQuery = isLocalized === true ? resolvedLocale : undefined;\n\n const documentLocales = await documentManager.findLocales(undefined, typedUid, {\n populate,\n locale: localeForQuery,\n });\n\n if (documentLocales.length === 0) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n for (const document of documentLocales) {\n if (permissionChecker.cannot.delete(document)) {\n throw new errors.ForbiddenError();\n }\n }\n\n const deletedEntity = await documentManager.delete(documentLocales[0].documentId, typedUid, {\n locale: localeForQuery,\n });\n\n // Delete returns `{ data }` without metadata — no status to compute, so sanitize + shape only.\n const sanitizedResult = await permissionChecker.sanitizeOutput(deletedEntity);\n const shapedResult = await shapeRelationsForMcp(typedUid, sanitizedResult);\n\n return ok({ data: shapedResult } as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for publishing the single-type document draft.\n * Enforces RBAC publish permission; throws NotFound when the draft is missing.\n */\nexport const createSinglePublishHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleLocaleArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.publish()) {\n throw new errors.ForbiddenError();\n }\n\n const publishedDocument = await strapi.db.transaction(async () => {\n const sanitizedQuery = await permissionChecker.sanitizedQuery.publish({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const publishFindQuery: McpDocumentQuery = {\n ...sanitizedQuery,\n locale: resolvedLocale,\n status: 'draft',\n };\n const document = await getService('document-manager')\n .findMany(publishFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.publish(document)) {\n throw new errors.ForbiddenError();\n }\n\n const publishResult = await documentManager.publish(document.documentId, typedUid, {\n locale: resolvedLocale,\n });\n\n return publishResult?.at(0);\n });\n\n const result = await sanitizeFormatShape(permissionChecker, typedUid, publishedDocument);\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for unpublishing the single-type document.\n * Optionally discards the draft in the same transaction when `discardDraft` is true.\n * Enforces RBAC unpublish (and discard) permission.\n */\nexport const createSingleUnpublishHandler =\n (uid: UID.SingleType) =>\n (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleUnpublishArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale, discardDraft } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.unpublish()) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const unpublishFindQuery: McpDocumentQuery = { ...sanitizedQuery, locale: resolvedLocale };\n const document = await getService('document-manager')\n .findMany(unpublishFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.unpublish(document)) {\n throw new errors.ForbiddenError();\n }\n\n if (discardDraft === true && permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const result = await strapi.db.transaction(async () => {\n if (discardDraft === true) {\n await documentManager.discardDraft(document.documentId, typedUid, {\n locale: resolvedLocale,\n });\n }\n\n return asyncPipe.pipe(\n (doc: any) =>\n documentManager.unpublish(doc.documentId, typedUid, { locale: resolvedLocale }),\n (doc: unknown) => sanitizeFormatShape(permissionChecker, typedUid, doc)\n )(document);\n });\n\n return ok(result as Record<string, unknown>);\n };\n\n/**\n * Creates a handler for discarding the draft of the single-type document.\n * Restores the published version as the draft. Enforces RBAC discard permission.\n */\nexport const createSingleDiscardDraftHandler =\n (uid: UID.SingleType) =>\n (_strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) =>\n async ({ args }: { args: SingleLocaleArgs }): Promise<Modules.MCP.McpToolHandlerReturn> => {\n const { userAbility } = context;\n const { locale } = args;\n // TODO: fix UID.SingleType assignability in @strapi/types\n const typedUid = uid as UID.ContentType;\n\n const documentManager = getService('document-manager');\n const permissionChecker = getService('permission-checker').create({\n userAbility,\n model: uid as string,\n });\n\n if (permissionChecker.cannot.discard()) {\n throw new errors.ForbiddenError();\n }\n\n const sanitizedQuery = await permissionChecker.sanitizedQuery.discard({ locale });\n const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({ locale }, uid);\n\n const discardFindQuery: McpDocumentQuery = {\n ...sanitizedQuery,\n locale: resolvedLocale,\n status: 'published',\n };\n const document = await getService('document-manager')\n .findMany(discardFindQuery as McpFindManyParams, typedUid)\n .then((docs: any[]) => docs[0]);\n\n if (!document) {\n throw new errors.NotFoundError(MCP_NOT_FOUND_DOCUMENT);\n }\n\n if (permissionChecker.cannot.discard(document)) {\n throw new errors.ForbiddenError();\n }\n\n const discardedDocument = await asyncPipe.pipe(\n (doc: any) =>\n documentManager.discardDraft(doc.documentId, typedUid, { locale: resolvedLocale }),\n (doc: unknown) => sanitizeFormatShape(permissionChecker, typedUid, doc)\n )(document);\n\n return ok(discardedDocument as Record<string, unknown>);\n };\n"],"names":["singleCreateOrUpdate","strapi","uid","context","args","userAbility","user","data","locale","typedUid","documentManager","getService","permissionChecker","create","model","cannot","update","errors","ForbiddenError","sanitizedQuery","resolvedLocale","getDocumentLocaleAndStatus","populate","populateFromQuery","populateDeep","Infinity","withPopulateOverride","getPopulateForLocalizations","build","draftFindQuery","status","documentVersion","otherDocumentVersion","Promise","all","findMany","then","docs","db","query","findOne","select","documentId","sanitizeInput","sanitizeUpdateInput","sanitizeCreateInput","isEdition","undefined","sanitizedData","setCreatorFields","formatted","transaction","doc","sanitizeFormatShape","ok","createSingleGetHandler","read","permissionQuery","resolvedStatus","versionFindQuery","version","document","NotFoundError","MCP_NOT_FOUND_DOCUMENT","meta","formatDocumentWithMetadata","publishedAt","availableLocales","availableStatus","result","createSingleWriteHandler","createSingleDeleteHandler","delete","isLocalized","isContentTypeLocalized","localeForQuery","documentLocales","findLocales","length","deletedEntity","sanitizedResult","sanitizeOutput","shapedResult","shapeRelationsForMcp","createSinglePublishHandler","publish","publishedDocument","publishFindQuery","publishResult","at","createSingleUnpublishHandler","discardDraft","unpublish","discard","unpublishFindQuery","asyncPipe","pipe","createSingleDiscardDraftHandler","_strapi","discardFindQuery","discardedDocument"],"mappings":";;;;;;;;;;;;AAiCA;AACA;AACA;AAEA;;;;AAIC,IACM,MAAMA,oBAAAA,GAAuB,OAClCC,MAAAA,EACAC,KACAC,OAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,WAAW,EAAEC,IAAI,EAAE,GAAGH,OAAAA;AAC9B,IAAA,MAAM,EAAEI,IAAI,EAAEC,MAAM,EAAE,GAAGJ,IAAAA;;AAEzB,IAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,IAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,IAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,QAAAA,WAAAA;QACAS,KAAAA,EAAOZ;AACT,KAAA,CAAA;IAEA,IAAIU,iBAAAA,CAAkBG,MAAM,CAACF,MAAM,MAAMD,iBAAAA,CAAkBG,MAAM,CAACC,MAAM,EAAA,EAAI;QAC1E,MAAM,IAAIC,mBAAOC,cAAc,EAAA;AACjC,IAAA;AAEA,IAAA,MAAMC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAACH,MAAM,CAAC;AAAER,QAAAA;AAAO,KAAA,CAAA;AAC9E,IAAA,MAAM,EAAEA,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,QAAAA;KAAO,EAAGN,GAAAA,CAAAA;AAEhF,IAAA,MAAMoB,UAAAA,GAAW,MAAMX,gBAAAA,CAAW,kBAAA,CAAA,CAAoBF,UACnDc,iBAAiB,CAACJ,cAAAA,CAAAA,CAClBK,YAAY,CAACC,QAAAA,CAAAA,CACbC,oBAAoB,CAACC,oCAAAA,CAA4BlB,WACjDmB,KAAK,EAAA;AAER,IAAA,MAAMC,cAAAA,GAAmC;AACvC,QAAA,GAAGV,cAAc;AACjBG,kBAAAA,UAAAA;QACAd,MAAAA,EAAQY,cAAAA;QACRU,MAAAA,EAAQ;AACV,KAAA;AACA,IAAA,MAAM,CAACC,eAAAA,EAAiBC,oBAAAA,CAAqB,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;QAChExB,eAAAA,CACGyB,QAAQ,CAACN,cAAAA,EAAqCpB,QAAAA,CAAAA,CAC9C2B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAChCpC,QAAAA,MAAAA,CAAOqC,EAAE,CAACC,KAAK,CAAC9B,QAAAA,CAAAA,CAAU+B,OAAO,CAAC;YAAEC,MAAAA,EAAQ;AAAC,gBAAA;AAAa;AAAC,SAAA;AAC5D,KAAA,CAAA;AAED,IAAA,MAAMC,aAAaV,oBAAAA,EAAsBU,UAAAA;AAEzC,IAAA,IAAIX,eAAAA,EAAiB;AACnB,QAAA,IAAInB,iBAAAA,CAAkBG,MAAM,CAACC,MAAM,CAACe,eAAAA,CAAAA,EAAkB;YACpD,MAAM,IAAId,mBAAOC,cAAc,EAAA;AACjC,QAAA;AACF,IAAA,CAAA,MAAO,IAAIN,iBAAAA,CAAkBG,MAAM,CAACF,MAAM,EAAA,EAAI;QAC5C,MAAM,IAAII,mBAAOC,cAAc,EAAA;AACjC,IAAA;AAEA,IAAA,MAAMyB,gBAAgBZ,eAAAA,GAClBnB,iBAAAA,CAAkBgC,mBAAmB,CAACb,eAAAA,CAAAA,GACtCnB,kBAAkBiC,mBAAmB;IAEzC,MAAMC,SAAAA,GAAYf,eAAAA,KAAoB,IAAA,IAAQA,eAAAA,KAAoBgB,SAAAA;AAClE,IAAA,MAAMC,gBAAgBC,4BAAAA,CAAiB;AAAE3C,QAAAA,IAAAA;AAAMwC,QAAAA;AAAU,KAAA,CAAA,CAAG,MAAMH,aAAAA,CAAcpC,IAAAA,CAAAA,CAAAA;AAKhF,IAAA,MAAM2C,YAAY,MAAMjD,MAAAA,CAAOqC,EAAE,CAACa,WAAW,CAAC,UAAA;QAC5C,IAAIC,GAAAA;AAEJ,QAAA,IAAIV,eAAeK,SAAAA,EAAW;AAC5BK,YAAAA,GAAAA,GAAM,MAAM1C,eAAAA,CAAgBG,MAAM,CAACJ,QAAAA,EAAU;gBAC3CF,IAAAA,EAAMyC,aAAAA;AACN,gBAAA,GAAG7B,cAAc;gBACjBX,MAAAA,EAAQY;AACV,aAAA,CAAA;QACF,CAAA,MAAO;AACLgC,YAAAA,GAAAA,GAAM,MAAM1C,eAAAA,CAAgBM,MAAM,CAAC0B,YAAYjC,QAAAA,EAAU;gBACvDF,IAAAA,EAAMyC,aAAAA;AACN1B,0BAAAA,UAAAA;gBACAd,MAAAA,EAAQY;AACV,aAAA,CAAA;AACF,QAAA;QAEA,OAAOiC,yBAAAA,CAAoBzC,mBAAmBH,QAAAA,EAAU2C,GAAAA,CAAAA;AAC1D,IAAA,CAAA,CAAA;AAEA,IAAA,OAAOE,QAAAA,CAAGJ,SAAAA,CAAAA;AACZ;AAEA;AACA;AACA;AAEA;;;;IAKO,MAAMK,sBAAAA,GACX,CAACrD,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EAAEC,IAAI,EAA2B,GAAA;YACtC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEK,MAAM,EAAEsB,MAAM,EAAE,GAAG1B,IAAAA;;AAE3B,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMU,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAACyC,IAAI,EAAA,EAAI;gBACnC,MAAM,IAAIvC,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMuC,kBAAkB,MAAM7C,iBAAAA,CAAkBO,cAAc,CAACqC,IAAI,CAAC;AAAEhD,gBAAAA,MAAAA;AAAQsB,gBAAAA;AAAO,aAAA,CAAA;YACrF,MAAM,EAAEtB,QAAQY,cAAc,EAAEU,QAAQ4B,cAAc,EAAE,GAAG,MAAMrC,qCAAAA,CAC/D;AAAEb,gBAAAA,MAAAA;AAAQsB,gBAAAA;aAAO,EACjB5B,GAAAA,CAAAA;AAGF,YAAA,MAAMoB,UAAAA,GAAW,MAAMX,gBAAAA,CAAW,kBAAA,CAAA,CAAoBF,UACnDc,iBAAiB,CAACkC,eAAAA,CAAAA,CAClBjC,YAAY,CAACC,QAAAA,CAAAA,CACbC,oBAAoB,CAACC,oCAAAA,CAA4BlB,WACjDmB,KAAK,EAAA;AAER,YAAA,MAAM+B,gBAAAA,GAAqC;AACzC,gBAAA,GAAGF,eAAe;AAClBnC,0BAAAA,UAAAA;gBACAd,MAAAA,EAAQY,cAAAA;gBACRU,MAAAA,EAAQ4B;AACV,aAAA;AACA,YAAA,MAAME,OAAAA,GAAU,MAAMjD,gBAAAA,CAAW,kBAAA,CAAA,CAC9BwB,QAAQ,CAACwB,gBAAAA,EAAuClD,QAAAA,CAAAA,CAChD2B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAEhC,YAAA,IAAI,CAACuB,OAAAA,EAAS;AACZ,gBAAA,IAAIhD,iBAAAA,CAAkBG,MAAM,CAACF,MAAM,EAAA,EAAI;oBACrC,MAAM,IAAII,mBAAOC,cAAc,EAAA;AACjC,gBAAA;gBAEA,MAAM2C,QAAAA,GAAW,MAAM5D,MAAAA,CAAOqC,EAAE,CAACC,KAAK,CAAC9B,QAAAA,CAAAA,CAAU+B,OAAO,CAAC,EAAC,CAAA;AAE1D,gBAAA,IAAI,CAACqB,QAAAA,EAAU;oBACb,MAAM,IAAI5C,kBAAAA,CAAO6C,aAAa,CAACC,gCAAAA,CAAAA;AACjC,gBAAA;AAEA,gBAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMC,mCAAAA,CACrBrD,mBACAH,QAAAA,EACA;AACEiC,oBAAAA,UAAAA,EAAYmB,SAASnB,UAAU;oBAC/BlC,MAAAA,EAAQY,cAAAA;oBACR8C,WAAAA,EAAa;iBACf,EACA;oBAAEC,gBAAAA,EAAkB,IAAA;oBAAMC,eAAAA,EAAiB;AAAM,iBAAA,CAAA;AAGnD,gBAAA,OAAOd,QAAAA,CAAG;AAAE/C,oBAAAA,IAAAA,EAAM,EAAC;AAAGyD,oBAAAA;AAAK,iBAAA,CAAA;AAC7B,YAAA;AAEA,YAAA,IAAIpD,iBAAAA,CAAkBG,MAAM,CAACyC,IAAI,CAACI,OAAAA,CAAAA,EAAU;gBAC1C,MAAM,IAAI3C,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMmD,MAAAA,GAAS,MAAMhB,yBAAAA,CAAoBzC,iBAAAA,EAAmBH,QAAAA,EAAUmD,OAAAA,CAAAA;AAEtE,YAAA,OAAON,QAAAA,CAAGe,MAAAA,CAAAA;QACZ;AAEF;;;IAIO,MAAMC,wBAAAA,GACX,CAACpE,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EACLC,IAAI,EAGL,GAAA;YACC,OAAOJ,oBAAAA,CAAqBC,MAAAA,EAAQC,GAAAA,EAAKC,OAAAA,EAASC,IAAAA,CAAAA;QACpD;AAEF;;;IAIO,MAAMmE,yBAAAA,GACX,CAACrE,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EAAEC,IAAI,EAA8B,GAAA;YACzC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;YACxB,MAAM,EAAEK,MAAM,EAAE,GAAGJ,IAAAA;;AAEnB,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAACyD,MAAM,EAAA,EAAI;gBACrC,MAAM,IAAIvD,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAACqD,MAAM,CAAC;AAAEhE,gBAAAA;AAAO,aAAA,CAAA;AAE9E,YAAA,MAAMc,UAAAA,GAAW,MAAMX,gBAAAA,CAAW,kBAAA,CAAA,CAAoBF,UACnDc,iBAAiB,CAACJ,cAAAA,CAAAA,CAClBK,YAAY,CAACC,QAAAA,CAAAA,CACbC,oBAAoB,CAACC,oCAAAA,CAA4BlB,WACjDmB,KAAK,EAAA;AAER,YAAA,MAAM,EAAEpB,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,gBAAAA;aAAO,EAAGN,GAAAA,CAAAA;YAEhF,MAAMuE,WAAAA,GAAcC,mCAAuBzE,MAAAA,EAAQC,GAAAA,CAAAA;YAEnD,MAAMyE,cAAAA,GAAiBF,WAAAA,KAAgB,IAAA,GAAOrD,cAAAA,GAAiB2B,SAAAA;AAE/D,YAAA,MAAM6B,kBAAkB,MAAMlE,eAAAA,CAAgBmE,WAAW,CAAC9B,WAAWtC,QAAAA,EAAU;AAC7Ea,0BAAAA,UAAAA;gBACAd,MAAAA,EAAQmE;AACV,aAAA,CAAA;YAEA,IAAIC,eAAAA,CAAgBE,MAAM,KAAK,CAAA,EAAG;gBAChC,MAAM,IAAI7D,kBAAAA,CAAO6C,aAAa,CAACC,gCAAAA,CAAAA;AACjC,YAAA;YAEA,KAAK,MAAMF,YAAYe,eAAAA,CAAiB;AACtC,gBAAA,IAAIhE,iBAAAA,CAAkBG,MAAM,CAACyD,MAAM,CAACX,QAAAA,CAAAA,EAAW;oBAC7C,MAAM,IAAI5C,mBAAOC,cAAc,EAAA;AACjC,gBAAA;AACF,YAAA;YAEA,MAAM6D,aAAAA,GAAgB,MAAMrE,eAAAA,CAAgB8D,MAAM,CAACI,eAAe,CAAC,CAAA,CAAE,CAAClC,UAAU,EAAEjC,QAAAA,EAAU;gBAC1FD,MAAAA,EAAQmE;AACV,aAAA,CAAA;;AAGA,YAAA,MAAMK,eAAAA,GAAkB,MAAMpE,iBAAAA,CAAkBqE,cAAc,CAACF,aAAAA,CAAAA;YAC/D,MAAMG,YAAAA,GAAe,MAAMC,mCAAAA,CAAqB1E,QAAAA,EAAUuE,eAAAA,CAAAA;AAE1D,YAAA,OAAO1B,QAAAA,CAAG;gBAAE/C,IAAAA,EAAM2E;AAAa,aAAA,CAAA;QACjC;AAEF;;;IAIO,MAAME,0BAAAA,GACX,CAAClF,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EAAEC,IAAI,EAA8B,GAAA;YACzC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;YACxB,MAAM,EAAEK,MAAM,EAAE,GAAGJ,IAAAA;;AAEnB,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAACsE,OAAO,EAAA,EAAI;gBACtC,MAAM,IAAIpE,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMoE,oBAAoB,MAAMrF,MAAAA,CAAOqC,EAAE,CAACa,WAAW,CAAC,UAAA;AACpD,gBAAA,MAAMhC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAACkE,OAAO,CAAC;AAAE7E,oBAAAA;AAAO,iBAAA,CAAA;AAC/E,gBAAA,MAAM,EAAEA,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,oBAAAA;iBAAO,EAAGN,GAAAA,CAAAA;AAEhF,gBAAA,MAAMqF,gBAAAA,GAAqC;AACzC,oBAAA,GAAGpE,cAAc;oBACjBX,MAAAA,EAAQY,cAAAA;oBACRU,MAAAA,EAAQ;AACV,iBAAA;AACA,gBAAA,MAAM+B,QAAAA,GAAW,MAAMlD,gBAAAA,CAAW,kBAAA,CAAA,CAC/BwB,QAAQ,CAACoD,gBAAAA,EAAuC9E,QAAAA,CAAAA,CAChD2B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAEhC,gBAAA,IAAI,CAACwB,QAAAA,EAAU;oBACb,MAAM,IAAI5C,kBAAAA,CAAO6C,aAAa,CAACC,gCAAAA,CAAAA;AACjC,gBAAA;AAEA,gBAAA,IAAInD,iBAAAA,CAAkBG,MAAM,CAACsE,OAAO,CAACxB,QAAAA,CAAAA,EAAW;oBAC9C,MAAM,IAAI5C,mBAAOC,cAAc,EAAA;AACjC,gBAAA;gBAEA,MAAMsE,aAAAA,GAAgB,MAAM9E,eAAAA,CAAgB2E,OAAO,CAACxB,QAAAA,CAASnB,UAAU,EAAEjC,QAAAA,EAAU;oBACjFD,MAAAA,EAAQY;AACV,iBAAA,CAAA;AAEA,gBAAA,OAAOoE,eAAeC,EAAAA,CAAG,CAAA,CAAA;AAC3B,YAAA,CAAA,CAAA;AAEA,YAAA,MAAMpB,MAAAA,GAAS,MAAMhB,yBAAAA,CAAoBzC,iBAAAA,EAAmBH,QAAAA,EAAU6E,iBAAAA,CAAAA;AAEtE,YAAA,OAAOhC,QAAAA,CAAGe,MAAAA,CAAAA;QACZ;AAEF;;;;IAKO,MAAMqB,4BAAAA,GACX,CAACxF,GAAAA,GACD,CAACD,MAAAA,EAAqBE,OAAAA,GACtB,OAAO,EAAEC,IAAI,EAAiC,GAAA;YAC5C,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;AACxB,YAAA,MAAM,EAAEK,MAAM,EAAEmF,YAAY,EAAE,GAAGvF,IAAAA;;AAEjC,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAAC6E,SAAS,EAAA,EAAI;gBACxC,MAAM,IAAI3E,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,IAAIyE,iBAAiB,IAAA,IAAQ/E,iBAAAA,CAAkBG,MAAM,CAAC8E,OAAO,EAAA,EAAI;gBAC/D,MAAM,IAAI5E,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAACyE,SAAS,CAAC;AAAEpF,gBAAAA;AAAO,aAAA,CAAA;AACjF,YAAA,MAAM,EAAEA,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,gBAAAA;aAAO,EAAGN,GAAAA,CAAAA;AAEhF,YAAA,MAAM4F,kBAAAA,GAAuC;AAAE,gBAAA,GAAG3E,cAAc;gBAAEX,MAAAA,EAAQY;AAAe,aAAA;AACzF,YAAA,MAAMyC,QAAAA,GAAW,MAAMlD,gBAAAA,CAAW,kBAAA,CAAA,CAC/BwB,QAAQ,CAAC2D,kBAAAA,EAAyCrF,QAAAA,CAAAA,CAClD2B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAEhC,YAAA,IAAI,CAACwB,QAAAA,EAAU;gBACb,MAAM,IAAI5C,kBAAAA,CAAO6C,aAAa,CAACC,gCAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAInD,iBAAAA,CAAkBG,MAAM,CAAC6E,SAAS,CAAC/B,QAAAA,CAAAA,EAAW;gBAChD,MAAM,IAAI5C,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,IAAIyE,iBAAiB,IAAA,IAAQ/E,iBAAAA,CAAkBG,MAAM,CAAC8E,OAAO,CAAChC,QAAAA,CAAAA,EAAW;gBACvE,MAAM,IAAI5C,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMmD,SAAS,MAAMpE,MAAAA,CAAOqC,EAAE,CAACa,WAAW,CAAC,UAAA;AACzC,gBAAA,IAAIwC,iBAAiB,IAAA,EAAM;AACzB,oBAAA,MAAMjF,gBAAgBiF,YAAY,CAAC9B,QAAAA,CAASnB,UAAU,EAAEjC,QAAAA,EAAU;wBAChED,MAAAA,EAAQY;AACV,qBAAA,CAAA;AACF,gBAAA;gBAEA,OAAO2E,iBAAAA,CAAUC,IAAI,CACnB,CAAC5C,GAAAA,GACC1C,eAAAA,CAAgBkF,SAAS,CAACxC,GAAAA,CAAIV,UAAU,EAAEjC,QAAAA,EAAU;wBAAED,MAAAA,EAAQY;AAAe,qBAAA,CAAA,EAC/E,CAACgC,GAAAA,GAAiBC,yBAAAA,CAAoBzC,iBAAAA,EAAmBH,UAAU2C,GAAAA,CAAAA,CAAAA,CACnES,QAAAA,CAAAA;AACJ,YAAA,CAAA,CAAA;AAEA,YAAA,OAAOP,QAAAA,CAAGe,MAAAA,CAAAA;QACZ;AAEF;;;IAIO,MAAM4B,+BAAAA,GACX,CAAC/F,GAAAA,GACD,CAACgG,OAAAA,EAAsB/F,OAAAA,GACvB,OAAO,EAAEC,IAAI,EAA8B,GAAA;YACzC,MAAM,EAAEC,WAAW,EAAE,GAAGF,OAAAA;YACxB,MAAM,EAAEK,MAAM,EAAE,GAAGJ,IAAAA;;AAEnB,YAAA,MAAMK,QAAAA,GAAWP,GAAAA;AAEjB,YAAA,MAAMQ,kBAAkBC,gBAAAA,CAAW,kBAAA,CAAA;AACnC,YAAA,MAAMC,iBAAAA,GAAoBD,gBAAAA,CAAW,oBAAA,CAAA,CAAsBE,MAAM,CAAC;AAChER,gBAAAA,WAAAA;gBACAS,KAAAA,EAAOZ;AACT,aAAA,CAAA;AAEA,YAAA,IAAIU,iBAAAA,CAAkBG,MAAM,CAAC8E,OAAO,EAAA,EAAI;gBACtC,MAAM,IAAI5E,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMC,iBAAiB,MAAMP,iBAAAA,CAAkBO,cAAc,CAAC0E,OAAO,CAAC;AAAErF,gBAAAA;AAAO,aAAA,CAAA;AAC/E,YAAA,MAAM,EAAEA,MAAAA,EAAQY,cAAc,EAAE,GAAG,MAAMC,qCAAAA,CAA2B;AAAEb,gBAAAA;aAAO,EAAGN,GAAAA,CAAAA;AAEhF,YAAA,MAAMiG,gBAAAA,GAAqC;AACzC,gBAAA,GAAGhF,cAAc;gBACjBX,MAAAA,EAAQY,cAAAA;gBACRU,MAAAA,EAAQ;AACV,aAAA;AACA,YAAA,MAAM+B,QAAAA,GAAW,MAAMlD,gBAAAA,CAAW,kBAAA,CAAA,CAC/BwB,QAAQ,CAACgE,gBAAAA,EAAuC1F,QAAAA,CAAAA,CAChD2B,IAAI,CAAC,CAACC,IAAAA,GAAgBA,IAAI,CAAC,CAAA,CAAE,CAAA;AAEhC,YAAA,IAAI,CAACwB,QAAAA,EAAU;gBACb,MAAM,IAAI5C,kBAAAA,CAAO6C,aAAa,CAACC,gCAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAInD,iBAAAA,CAAkBG,MAAM,CAAC8E,OAAO,CAAChC,QAAAA,CAAAA,EAAW;gBAC9C,MAAM,IAAI5C,mBAAOC,cAAc,EAAA;AACjC,YAAA;AAEA,YAAA,MAAMkF,iBAAAA,GAAoB,MAAML,iBAAAA,CAAUC,IAAI,CAC5C,CAAC5C,GAAAA,GACC1C,eAAAA,CAAgBiF,YAAY,CAACvC,GAAAA,CAAIV,UAAU,EAAEjC,QAAAA,EAAU;oBAAED,MAAAA,EAAQY;AAAe,iBAAA,CAAA,EAClF,CAACgC,GAAAA,GAAiBC,yBAAAA,CAAoBzC,iBAAAA,EAAmBH,UAAU2C,GAAAA,CAAAA,CAAAA,CACnES,QAAAA,CAAAA;AAEF,YAAA,OAAOP,QAAAA,CAAG8C,iBAAAA,CAAAA;QACZ;;;;;;;;;;"}