@strapi/content-manager 5.48.1 → 5.50.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 (458) 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 +3 -2
  18. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  19. package/dist/admin/history/components/VersionContent.js +7 -3
  20. package/dist/admin/history/components/VersionContent.js.map +1 -1
  21. package/dist/admin/history/components/VersionHeader.js +3 -2
  22. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  23. package/dist/admin/history/components/VersionInputRenderer.js +3 -2
  24. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  25. package/dist/admin/history/pages/History.js +3 -2
  26. package/dist/admin/history/pages/History.js.map +1 -1
  27. package/dist/admin/history/routes.js +3 -2
  28. package/dist/admin/history/routes.js.map +1 -1
  29. package/dist/admin/hooks/useContentTypeSchema.js +3 -2
  30. package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
  31. package/dist/admin/hooks/useDocument.js +3 -2
  32. package/dist/admin/hooks/useDocument.js.map +1 -1
  33. package/dist/admin/hooks/useDocumentActions.js +3 -2
  34. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  35. package/dist/admin/hooks/useDocumentContext.js +3 -2
  36. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  37. package/dist/admin/hooks/useDocumentLayout.js +3 -2
  38. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  39. package/dist/admin/hooks/useDragAndDrop.js +3 -2
  40. package/dist/admin/hooks/useDragAndDrop.js.map +1 -1
  41. package/dist/admin/hooks/useKeyboardDragAndDrop.js +3 -2
  42. package/dist/admin/hooks/useKeyboardDragAndDrop.js.map +1 -1
  43. package/dist/admin/hooks/useOnce.js +3 -2
  44. package/dist/admin/hooks/useOnce.js.map +1 -1
  45. package/dist/admin/hooks/usePersistentQueryParams.js +7 -2
  46. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  47. package/dist/admin/layout.js +3 -1
  48. package/dist/admin/layout.js.map +1 -1
  49. package/dist/admin/layout.mjs +5 -3
  50. package/dist/admin/layout.mjs.map +1 -1
  51. package/dist/admin/pages/ComponentConfigurationPage.js +3 -2
  52. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  53. package/dist/admin/pages/EditConfigurationPage.js +3 -2
  54. package/dist/admin/pages/EditConfigurationPage.js.map +1 -1
  55. package/dist/admin/pages/EditView/EditViewPage.js +3 -2
  56. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  57. package/dist/admin/pages/EditView/components/DocumentActions.js +238 -108
  58. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/DocumentActions.mjs +225 -103
  60. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js +3 -2
  62. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +4 -3
  64. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +3 -2
  66. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +3 -2
  68. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +3 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +3 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +3 -2
  74. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +4 -3
  76. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +3 -2
  78. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +3 -2
  80. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +3 -2
  82. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +6 -1
  84. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
  86. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +9 -4
  88. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -2
  90. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +13 -4
  92. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +6 -1
  94. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +3 -2
  96. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +7 -3
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/UID.js +3 -2
  100. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +8 -4
  102. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js +3 -2
  104. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +3 -2
  106. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js +5 -1
  108. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js.map +1 -1
  109. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js +15 -2
  110. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js.map +1 -1
  111. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +5 -1
  112. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -1
  113. package/dist/admin/pages/EditView/components/FormLayout.js +3 -2
  114. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  115. package/dist/admin/pages/EditView/components/Header.js +3 -2
  116. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  117. package/dist/admin/pages/EditView/components/InputRenderer.js +3 -2
  118. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  119. package/dist/admin/pages/EditView/components/Panels.js +3 -2
  120. package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
  121. package/dist/admin/pages/EditView/utils/data.js +5 -1
  122. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  123. package/dist/admin/pages/EditView/utils/draftRelationCounts.js +117 -0
  124. package/dist/admin/pages/EditView/utils/draftRelationCounts.js.map +1 -0
  125. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs +109 -0
  126. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs.map +1 -0
  127. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js +35 -0
  128. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js.map +1 -0
  129. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs +33 -0
  130. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs.map +1 -0
  131. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +3 -2
  132. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  133. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +3 -2
  134. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  135. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +3 -2
  136. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  137. package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -2
  138. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  139. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +3 -2
  140. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  141. package/dist/admin/pages/ListView/ListViewPage.js +3 -2
  142. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  143. package/dist/admin/pages/ListView/components/BulkActions/Actions.js +3 -2
  144. package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -1
  145. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +4 -3
  146. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  147. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +1 -1
  148. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  149. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +3 -2
  150. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  151. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  152. package/dist/admin/pages/ListView/components/Filters.js +3 -2
  153. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  154. package/dist/admin/pages/ListView/components/TableActions.js +3 -2
  155. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  156. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +9 -5
  157. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  158. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs +2 -2
  159. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs.map +1 -1
  160. package/dist/admin/pages/ListView/components/TableCells/CellValue.js +7 -2
  161. package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -1
  162. package/dist/admin/pages/ListView/components/TableCells/Relations.js +4 -3
  163. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  164. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs +1 -1
  165. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
  166. package/dist/admin/preview/components/InputPopover.js +3 -2
  167. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  168. package/dist/admin/preview/hooks/usePreviewInputManager.js +3 -2
  169. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  170. package/dist/admin/preview/pages/Preview.js +41 -13
  171. package/dist/admin/preview/pages/Preview.js.map +1 -1
  172. package/dist/admin/preview/pages/Preview.mjs +39 -12
  173. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  174. package/dist/admin/preview/routes.js +3 -2
  175. package/dist/admin/preview/routes.js.map +1 -1
  176. package/dist/admin/preview/utils/constants.js +9 -15
  177. package/dist/admin/preview/utils/constants.js.map +1 -1
  178. package/dist/admin/preview/utils/constants.mjs +10 -15
  179. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  180. package/dist/admin/src/components/InjectionZone.d.ts +1 -2
  181. package/dist/admin/src/content-manager.d.ts +15 -15
  182. package/dist/admin/src/history/services/historyVersion.d.ts +2 -2
  183. package/dist/admin/src/hooks/useContentTypeSchema.d.ts +1 -1
  184. package/dist/admin/src/hooks/useDocument.d.ts +8 -9
  185. package/dist/admin/src/hooks/useDocumentLayout.d.ts +3 -3
  186. package/dist/admin/src/hooks/useDragAndDrop.d.ts +4 -4
  187. package/dist/admin/src/hooks/useKeyboardDragAndDrop.d.ts +1 -1
  188. package/dist/admin/src/hooks/usePersistentQueryParams.d.ts +0 -1
  189. package/dist/admin/src/modules/app.d.ts +5 -5
  190. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +1 -1
  191. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +12 -1
  192. package/dist/admin/src/pages/EditView/components/EditorToolbarObserver.d.ts +1 -1
  193. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +1 -1
  194. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +2 -2
  195. package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -2
  196. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +4 -4
  197. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  198. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +19 -20
  199. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +12 -12
  200. package/dist/admin/src/pages/EditView/utils/draftRelationCounts.d.ts +26 -0
  201. package/dist/admin/src/pages/EditView/utils/keyboardShortcuts.d.ts +18 -0
  202. package/dist/admin/src/pages/ListView/components/BulkActions/PublishAction.d.ts +1 -1
  203. package/dist/admin/src/pages/ListView/components/Filters.d.ts +1 -1
  204. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +1 -1
  205. package/dist/admin/src/preview/utils/constants.d.ts +1 -7
  206. package/dist/admin/src/preview/utils/getSendMessage.d.ts +0 -1
  207. package/dist/admin/src/services/documents.d.ts +30 -70
  208. package/dist/admin/src/services/relations.d.ts +6 -20
  209. package/dist/admin/src/services/uid.d.ts +5 -5
  210. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +4 -4
  211. package/dist/admin/src/utils/users.d.ts +1 -1
  212. package/dist/admin/src/utils/validation.d.ts +1 -1
  213. package/dist/admin/translations/cs.json.js +2 -1
  214. package/dist/admin/translations/cs.json.js.map +1 -1
  215. package/dist/admin/translations/cs.json.mjs +2 -1
  216. package/dist/admin/translations/cs.json.mjs.map +1 -1
  217. package/dist/admin/translations/de.json.js +2 -1
  218. package/dist/admin/translations/de.json.js.map +1 -1
  219. package/dist/admin/translations/de.json.mjs +2 -1
  220. package/dist/admin/translations/de.json.mjs.map +1 -1
  221. package/dist/admin/translations/en.json.js +7 -3
  222. package/dist/admin/translations/en.json.js.map +1 -1
  223. package/dist/admin/translations/en.json.mjs +7 -3
  224. package/dist/admin/translations/en.json.mjs.map +1 -1
  225. package/dist/admin/translations/es.json.js +2 -1
  226. package/dist/admin/translations/es.json.js.map +1 -1
  227. package/dist/admin/translations/es.json.mjs +2 -1
  228. package/dist/admin/translations/es.json.mjs.map +1 -1
  229. package/dist/admin/translations/fr.json.js +2 -1
  230. package/dist/admin/translations/fr.json.js.map +1 -1
  231. package/dist/admin/translations/fr.json.mjs +2 -1
  232. package/dist/admin/translations/fr.json.mjs.map +1 -1
  233. package/dist/admin/translations/ja.json.js +262 -87
  234. package/dist/admin/translations/ja.json.js.map +1 -1
  235. package/dist/admin/translations/ja.json.mjs +262 -87
  236. package/dist/admin/translations/ja.json.mjs.map +1 -1
  237. package/dist/admin/translations/nl.json.js +2 -1
  238. package/dist/admin/translations/nl.json.js.map +1 -1
  239. package/dist/admin/translations/nl.json.mjs +2 -1
  240. package/dist/admin/translations/nl.json.mjs.map +1 -1
  241. package/dist/admin/translations/pl.json.js +2 -1
  242. package/dist/admin/translations/pl.json.js.map +1 -1
  243. package/dist/admin/translations/pl.json.mjs +2 -1
  244. package/dist/admin/translations/pl.json.mjs.map +1 -1
  245. package/dist/admin/translations/sk.json.js +2 -1
  246. package/dist/admin/translations/sk.json.js.map +1 -1
  247. package/dist/admin/translations/sk.json.mjs +2 -1
  248. package/dist/admin/translations/sk.json.mjs.map +1 -1
  249. package/dist/admin/utils/objects.js +9 -4
  250. package/dist/admin/utils/objects.js.map +1 -1
  251. package/dist/admin/utils/validation.js +7 -3
  252. package/dist/admin/utils/validation.js.map +1 -1
  253. package/dist/server/controllers/collection-types.js +2 -2
  254. package/dist/server/controllers/collection-types.js.map +1 -1
  255. package/dist/server/controllers/collection-types.mjs +2 -2
  256. package/dist/server/controllers/collection-types.mjs.map +1 -1
  257. package/dist/server/controllers/single-types.js +2 -2
  258. package/dist/server/controllers/single-types.js.map +1 -1
  259. package/dist/server/controllers/single-types.mjs +2 -2
  260. package/dist/server/controllers/single-types.mjs.map +1 -1
  261. package/dist/server/controllers/utils/clone.js +5 -1
  262. package/dist/server/controllers/utils/clone.js.map +1 -1
  263. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  264. package/dist/server/controllers/validation/index.js +6 -2
  265. package/dist/server/controllers/validation/index.js.map +1 -1
  266. package/dist/server/homepage/services/homepage.js +6 -1
  267. package/dist/server/homepage/services/homepage.js.map +1 -1
  268. package/dist/server/homepage/services/homepage.mjs +6 -1
  269. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  270. package/dist/server/mcp/handlers/collection-handlers.js +15 -18
  271. package/dist/server/mcp/handlers/collection-handlers.js.map +1 -1
  272. package/dist/server/mcp/handlers/collection-handlers.mjs +16 -19
  273. package/dist/server/mcp/handlers/collection-handlers.mjs.map +1 -1
  274. package/dist/server/mcp/handlers/single-type-handlers.js +12 -12
  275. package/dist/server/mcp/handlers/single-type-handlers.js.map +1 -1
  276. package/dist/server/mcp/handlers/single-type-handlers.mjs +13 -13
  277. package/dist/server/mcp/handlers/single-type-handlers.mjs.map +1 -1
  278. package/dist/server/mcp/register-content-manager-mcp-tools.js +4 -1
  279. package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
  280. package/dist/server/mcp/register-content-manager-mcp-tools.mjs +4 -1
  281. package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
  282. package/dist/server/mcp/sanitizers/shape-relations.js +108 -0
  283. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -0
  284. package/dist/server/mcp/sanitizers/shape-relations.mjs +103 -0
  285. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -0
  286. package/dist/server/mcp/schemas/data-schema.js +0 -3
  287. package/dist/server/mcp/schemas/data-schema.js.map +1 -1
  288. package/dist/server/mcp/schemas/data-schema.mjs +0 -3
  289. package/dist/server/mcp/schemas/data-schema.mjs.map +1 -1
  290. package/dist/server/mcp/schemas/output-schemas.js +30 -4
  291. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  292. package/dist/server/mcp/schemas/output-schemas.mjs +30 -4
  293. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  294. package/dist/server/mcp/utils.js +30 -3
  295. package/dist/server/mcp/utils.js.map +1 -1
  296. package/dist/server/mcp/utils.mjs +30 -4
  297. package/dist/server/mcp/utils.mjs.map +1 -1
  298. package/dist/server/middlewares/routing.js +5 -1
  299. package/dist/server/middlewares/routing.js.map +1 -1
  300. package/dist/server/preview/controllers/preview.js +9 -0
  301. package/dist/server/preview/controllers/preview.js.map +1 -1
  302. package/dist/server/preview/controllers/preview.mjs +9 -0
  303. package/dist/server/preview/controllers/preview.mjs.map +1 -1
  304. package/dist/server/preview/controllers/previewScript.js +1450 -0
  305. package/dist/server/preview/routes/preview.js +11 -0
  306. package/dist/server/preview/routes/preview.js.map +1 -1
  307. package/dist/server/preview/routes/preview.mjs +11 -0
  308. package/dist/server/preview/routes/preview.mjs.map +1 -1
  309. package/dist/server/services/document-manager.js +13 -19
  310. package/dist/server/services/document-manager.js.map +1 -1
  311. package/dist/server/services/document-manager.mjs +13 -19
  312. package/dist/server/services/document-manager.mjs.map +1 -1
  313. package/dist/server/services/populate-builder.js.map +1 -1
  314. package/dist/server/services/populate-builder.mjs.map +1 -1
  315. package/dist/server/services/uid.js +9 -4
  316. package/dist/server/services/uid.js.map +1 -1
  317. package/dist/server/services/utils/configuration/attributes.js +14 -10
  318. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  319. package/dist/server/services/utils/configuration/layouts.js +8 -4
  320. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  321. package/dist/server/services/utils/configuration/metadatas.js +19 -15
  322. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  323. package/dist/server/services/utils/configuration/settings.js +5 -1
  324. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  325. package/dist/server/services/utils/draft-relations.js +9 -0
  326. package/dist/server/services/utils/draft-relations.js.map +1 -0
  327. package/dist/server/services/utils/draft-relations.mjs +7 -0
  328. package/dist/server/services/utils/draft-relations.mjs.map +1 -0
  329. package/dist/server/services/utils/draft.js +123 -26
  330. package/dist/server/services/utils/draft.js.map +1 -1
  331. package/dist/server/services/utils/draft.mjs +118 -25
  332. package/dist/server/services/utils/draft.mjs.map +1 -1
  333. package/dist/server/services/utils/populate.js +23 -5
  334. package/dist/server/services/utils/populate.js.map +1 -1
  335. package/dist/server/services/utils/populate.mjs +15 -1
  336. package/dist/server/services/utils/populate.mjs.map +1 -1
  337. package/dist/server/services/utils/store.js +9 -5
  338. package/dist/server/services/utils/store.js.map +1 -1
  339. package/dist/server/src/controllers/index.d.ts +1 -1
  340. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  341. package/dist/server/src/controllers/utils/clone.d.ts +1 -1
  342. package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
  343. package/dist/server/src/controllers/utils/document-status.d.ts +1 -1
  344. package/dist/server/src/controllers/utils/document-status.d.ts.map +1 -1
  345. package/dist/server/src/controllers/utils/metadata.d.ts +5 -5
  346. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  347. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  348. package/dist/server/src/controllers/validation/index.d.ts +3 -3
  349. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  350. package/dist/server/src/controllers/validation/model-configuration.d.ts.map +1 -1
  351. package/dist/server/src/controllers/validation/relations.d.ts +2 -2
  352. package/dist/server/src/history/controllers/history-version.d.ts +1 -7
  353. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  354. package/dist/server/src/history/controllers/index.d.ts +2 -1
  355. package/dist/server/src/history/controllers/index.d.ts.map +1 -1
  356. package/dist/server/src/history/controllers/validation/history-version.d.ts +1 -1
  357. package/dist/server/src/history/services/history.d.ts +0 -2
  358. package/dist/server/src/history/services/history.d.ts.map +1 -1
  359. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  360. package/dist/server/src/history/services/utils.d.ts +3 -3
  361. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  362. package/dist/server/src/history/utils.d.ts +1 -18
  363. package/dist/server/src/history/utils.d.ts.map +1 -1
  364. package/dist/server/src/homepage/controllers/homepage.d.ts +0 -1
  365. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
  366. package/dist/server/src/homepage/controllers/index.d.ts +2 -1
  367. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -1
  368. package/dist/server/src/homepage/index.d.ts +4 -8
  369. package/dist/server/src/homepage/index.d.ts.map +1 -1
  370. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  371. package/dist/server/src/homepage/services/homepage.d.ts +3 -4
  372. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  373. package/dist/server/src/homepage/services/index.d.ts +4 -8
  374. package/dist/server/src/homepage/services/index.d.ts.map +1 -1
  375. package/dist/server/src/index.d.ts +82 -86
  376. package/dist/server/src/index.d.ts.map +1 -1
  377. package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts.map +1 -1
  378. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
  379. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
  380. package/dist/server/src/mcp/permissions.d.ts +1 -1
  381. package/dist/server/src/mcp/permissions.d.ts.map +1 -1
  382. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +2 -1
  383. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  384. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts +38 -0
  385. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -0
  386. package/dist/server/src/mcp/schemas/blocks-schema.d.ts.map +1 -1
  387. package/dist/server/src/mcp/schemas/data-schema.d.ts +0 -3
  388. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
  389. package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -1
  390. package/dist/server/src/mcp/schemas/output-schemas.d.ts +2 -2
  391. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  392. package/dist/server/src/mcp/schemas/sort-schema.d.ts.map +1 -1
  393. package/dist/server/src/mcp/types.d.ts +2 -2
  394. package/dist/server/src/mcp/types.d.ts.map +1 -1
  395. package/dist/server/src/mcp/utils.d.ts +19 -1
  396. package/dist/server/src/mcp/utils.d.ts.map +1 -1
  397. package/dist/server/src/middlewares/routing.d.ts.map +1 -1
  398. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  399. package/dist/server/src/policies/index.d.ts.map +1 -1
  400. package/dist/server/src/preview/controllers/index.d.ts +2 -1
  401. package/dist/server/src/preview/controllers/index.d.ts.map +1 -1
  402. package/dist/server/src/preview/controllers/preview.d.ts +5 -0
  403. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -1
  404. package/dist/server/src/preview/controllers/validation/preview.d.ts +1 -2
  405. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  406. package/dist/server/src/preview/routes/preview.d.ts.map +1 -1
  407. package/dist/server/src/preview/services/index.d.ts +1 -1
  408. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  409. package/dist/server/src/preview/services/preview-config.d.ts +1 -1
  410. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  411. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  412. package/dist/server/src/preview/utils.d.ts +1 -16
  413. package/dist/server/src/preview/utils.d.ts.map +1 -1
  414. package/dist/server/src/services/components.d.ts +2 -2
  415. package/dist/server/src/services/components.d.ts.map +1 -1
  416. package/dist/server/src/services/configuration.d.ts.map +1 -1
  417. package/dist/server/src/services/content-types.d.ts.map +1 -1
  418. package/dist/server/src/services/data-mapper.d.ts +5 -5
  419. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  420. package/dist/server/src/services/document-manager.d.ts +14 -14
  421. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  422. package/dist/server/src/services/document-metadata.d.ts +6 -6
  423. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  424. package/dist/server/src/services/field-sizes.d.ts +2 -2
  425. package/dist/server/src/services/field-sizes.d.ts.map +1 -1
  426. package/dist/server/src/services/index.d.ts +81 -85
  427. package/dist/server/src/services/index.d.ts.map +1 -1
  428. package/dist/server/src/services/metrics.d.ts.map +1 -1
  429. package/dist/server/src/services/permission-checker.d.ts +12 -31
  430. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  431. package/dist/server/src/services/permission.d.ts.map +1 -1
  432. package/dist/server/src/services/populate-builder.d.ts +7 -5
  433. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  434. package/dist/server/src/services/uid.d.ts.map +1 -1
  435. package/dist/server/src/services/utils/configuration/attributes.d.ts.map +1 -1
  436. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  437. package/dist/server/src/services/utils/count.d.ts.map +1 -1
  438. package/dist/server/src/services/utils/draft-relations.d.ts +19 -0
  439. package/dist/server/src/services/utils/draft-relations.d.ts.map +1 -0
  440. package/dist/server/src/services/utils/draft.d.ts +8 -7
  441. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  442. package/dist/server/src/services/utils/populate.d.ts +3 -1
  443. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  444. package/dist/server/src/services/utils/store.d.ts.map +1 -1
  445. package/dist/server/src/utils/index.d.ts.map +1 -1
  446. package/dist/server/src/validation/policies/hasPermissions.d.ts +1 -1
  447. package/dist/server/src/validation/zod.d.ts +1 -1
  448. package/dist/server/src/validation/zod.d.ts.map +1 -1
  449. package/dist/shared/contracts/collection-types.d.ts +4 -1
  450. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  451. package/dist/shared/contracts/single-types.d.ts +4 -1
  452. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  453. package/package.json +10 -10
  454. package/dist/admin/preview/utils/previewScript.js +0 -1068
  455. package/dist/admin/preview/utils/previewScript.js.map +0 -1
  456. package/dist/admin/preview/utils/previewScript.mjs +0 -1066
  457. package/dist/admin/preview/utils/previewScript.mjs.map +0 -1
  458. package/dist/admin/src/preview/utils/previewScript.d.ts +0 -32
@@ -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":"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"}
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;;;;;;;;;;"}
@@ -5,7 +5,8 @@ import { formatDocumentWithMetadata } from '../../controllers/utils/metadata.mjs
5
5
  import { getPopulateForLocalizations } from '../../services/utils/populate.mjs';
6
6
  import { MCP_NOT_FOUND_DOCUMENT } from './constants.mjs';
7
7
  import { isContentTypeLocalized } from '../permissions.mjs';
8
- import { ok } from '../utils.mjs';
8
+ import { shapeRelationsForMcp } from '../sanitizers/shape-relations.mjs';
9
+ import { ok, sanitizeFormatShape } from '../utils.mjs';
9
10
 
10
11
  // ---------------------------------------------------------------------------
11
12
  // Shared create-or-update logic mirroring single-types controller
@@ -33,7 +34,7 @@ import { ok } from '../utils.mjs';
33
34
  const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({
34
35
  locale
35
36
  }, uid);
36
- const populate = await getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).countRelations().withPopulateOverride(getPopulateForLocalizations(typedUid)).build();
37
+ const populate = await getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).withPopulateOverride(getPopulateForLocalizations(typedUid)).build();
37
38
  const draftFindQuery = {
38
39
  ...sanitizedQuery,
39
40
  populate,
@@ -77,8 +78,7 @@ import { ok } from '../utils.mjs';
77
78
  locale: resolvedLocale
78
79
  });
79
80
  }
80
- const sanitizedDocument = await permissionChecker.sanitizeOutput(doc);
81
- return formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);
81
+ return sanitizeFormatShape(permissionChecker, typedUid, doc);
82
82
  });
83
83
  return ok(formatted);
84
84
  };
@@ -109,7 +109,7 @@ import { ok } from '../utils.mjs';
109
109
  locale,
110
110
  status
111
111
  }, uid);
112
- const populate = await getService('populate-builder')(typedUid).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().withPopulateOverride(getPopulateForLocalizations(typedUid)).build();
112
+ const populate = await getService('populate-builder')(typedUid).populateFromQuery(permissionQuery).populateDeep(Infinity).withPopulateOverride(getPopulateForLocalizations(typedUid)).build();
113
113
  const versionFindQuery = {
114
114
  ...permissionQuery,
115
115
  populate,
@@ -141,8 +141,7 @@ import { ok } from '../utils.mjs';
141
141
  if (permissionChecker.cannot.read(version)) {
142
142
  throw new errors.ForbiddenError();
143
143
  }
144
- const sanitizedDocument = await permissionChecker.sanitizeOutput(version);
145
- const result = await formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);
144
+ const result = await sanitizeFormatShape(permissionChecker, typedUid, version);
146
145
  return ok(result);
147
146
  };
148
147
  /**
@@ -170,7 +169,7 @@ import { ok } from '../utils.mjs';
170
169
  const sanitizedQuery = await permissionChecker.sanitizedQuery.delete({
171
170
  locale
172
171
  });
173
- const populate = await getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).countRelations().withPopulateOverride(getPopulateForLocalizations(typedUid)).build();
172
+ const populate = await getService('populate-builder')(typedUid).populateFromQuery(sanitizedQuery).populateDeep(Infinity).withPopulateOverride(getPopulateForLocalizations(typedUid)).build();
174
173
  const { locale: resolvedLocale } = await getDocumentLocaleAndStatus({
175
174
  locale
176
175
  }, uid);
@@ -191,9 +190,11 @@ import { ok } from '../utils.mjs';
191
190
  const deletedEntity = await documentManager.delete(documentLocales[0].documentId, typedUid, {
192
191
  locale: localeForQuery
193
192
  });
193
+ // Delete returns `{ data }` without metadata — no status to compute, so sanitize + shape only.
194
194
  const sanitizedResult = await permissionChecker.sanitizeOutput(deletedEntity);
195
+ const shapedResult = await shapeRelationsForMcp(typedUid, sanitizedResult);
195
196
  return ok({
196
- data: sanitizedResult
197
+ data: shapedResult
197
198
  });
198
199
  };
199
200
  /**
@@ -236,8 +237,7 @@ import { ok } from '../utils.mjs';
236
237
  });
237
238
  return publishResult?.at(0);
238
239
  });
239
- const sanitizedDocument = await permissionChecker.sanitizeOutput(publishedDocument);
240
- const result = await formatDocumentWithMetadata(permissionChecker, typedUid, sanitizedDocument);
240
+ const result = await sanitizeFormatShape(permissionChecker, typedUid, publishedDocument);
241
241
  return ok(result);
242
242
  };
243
243
  /**
@@ -288,7 +288,7 @@ import { ok } from '../utils.mjs';
288
288
  }
289
289
  return async.pipe((doc)=>documentManager.unpublish(doc.documentId, typedUid, {
290
290
  locale: resolvedLocale
291
- }), permissionChecker.sanitizeOutput, (doc)=>formatDocumentWithMetadata(permissionChecker, typedUid, doc))(document);
291
+ }), (doc)=>sanitizeFormatShape(permissionChecker, typedUid, doc))(document);
292
292
  });
293
293
  return ok(result);
294
294
  };
@@ -328,7 +328,7 @@ import { ok } from '../utils.mjs';
328
328
  }
329
329
  const discardedDocument = await async.pipe((doc)=>documentManager.discardDraft(doc.documentId, typedUid, {
330
330
  locale: resolvedLocale
331
- }), permissionChecker.sanitizeOutput, (doc)=>formatDocumentWithMetadata(permissionChecker, typedUid, doc))(document);
331
+ }), (doc)=>sanitizeFormatShape(permissionChecker, typedUid, doc))(document);
332
332
  return ok(discardedDocument);
333
333
  };
334
334
 
@@ -1 +1 @@
1
- {"version":3,"file":"single-type-handlers.mjs","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":"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"}
1
+ {"version":3,"file":"single-type-handlers.mjs","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":"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"}
@@ -4,8 +4,11 @@ var deriveContentTypeMcpTools = require('./derive-content-type-mcp-tools.js');
4
4
  var index = require('../utils/index.js');
5
5
 
6
6
  /**
7
- * Registers derived content-type MCP tools during plugin bootstrap, before the MCP HTTP server starts.
7
+ * Registers derived content-type MCP tools via strapi.ai.mcp.registerTool().
8
+ * Must be called from the plugin register phase, before the MCP HTTP server starts.
8
9
  */ const registerContentManagerMcpTools = async ({ strapi })=>{
10
+ // Performance only: registerTool() is safe when MCP is disabled (definitions are stored but
11
+ // never exposed). Skip the expensive derivation below when the MCP server will not start.
9
12
  if (strapi.ai.mcp.isEnabled() !== true) {
10
13
  return;
11
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"register-content-manager-mcp-tools.js","sources":["../../../server/src/mcp/register-content-manager-mcp-tools.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { deriveDisplayedContentTypeMcpToolDefinitions } from './derive-content-type-mcp-tools';\nimport { getService } from '../utils';\n\n/**\n * Registers derived content-type MCP tools during plugin bootstrap, before the MCP HTTP server starts.\n */\nexport const registerContentManagerMcpTools = async ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): Promise<void> => {\n if (strapi.ai.mcp.isEnabled() !== true) {\n return;\n }\n\n const i18nPlugin = strapi.plugin('i18n');\n\n let localeCodes = null;\n let defaultLocale: string | null = null;\n if (i18nPlugin !== undefined) {\n localeCodes = (await i18nPlugin.service('locales').find()).map(\n (locale: { code: string }) => locale.code\n ) as [string, ...string[]];\n defaultLocale = await i18nPlugin.service('locales').getDefaultLocale();\n }\n\n const models = getService('content-types').findDisplayedContentTypes();\n const tools = deriveDisplayedContentTypeMcpToolDefinitions(strapi, models, {\n localeCodes,\n defaultLocale,\n });\n\n for (const tool of tools) {\n strapi.ai.mcp.registerTool(tool);\n }\n};\n"],"names":["registerContentManagerMcpTools","strapi","ai","mcp","isEnabled","i18nPlugin","plugin","localeCodes","defaultLocale","undefined","service","find","map","locale","code","getDefaultLocale","models","getService","findDisplayedContentTypes","tools","deriveDisplayedContentTypeMcpToolDefinitions","tool","registerTool"],"mappings":";;;;;AAKA;;AAEC,IACM,MAAMA,8BAAAA,GAAiC,OAAO,EACnDC,MAAM,EAGP,GAAA;AACC,IAAA,IAAIA,OAAOC,EAAE,CAACC,GAAG,CAACC,SAAS,OAAO,IAAA,EAAM;AACtC,QAAA;AACF,IAAA;IAEA,MAAMC,UAAAA,GAAaJ,MAAAA,CAAOK,MAAM,CAAC,MAAA,CAAA;AAEjC,IAAA,IAAIC,WAAAA,GAAc,IAAA;AAClB,IAAA,IAAIC,aAAAA,GAA+B,IAAA;AACnC,IAAA,IAAIH,eAAeI,SAAAA,EAAW;AAC5BF,QAAAA,WAAAA,GAAc,CAAC,MAAMF,UAAAA,CAAWK,OAAO,CAAC,SAAA,CAAA,CAAWC,IAAI,EAAC,EAAGC,GAAG,CAC5D,CAACC,MAAAA,GAA6BA,OAAOC,IAAI,CAAA;AAE3CN,QAAAA,aAAAA,GAAgB,MAAMH,UAAAA,CAAWK,OAAO,CAAC,WAAWK,gBAAgB,EAAA;AACtE,IAAA;IAEA,MAAMC,MAAAA,GAASC,gBAAAA,CAAW,eAAA,CAAA,CAAiBC,yBAAyB,EAAA;IACpE,MAAMC,KAAAA,GAAQC,sEAAAA,CAA6CnB,MAAAA,EAAQe,MAAAA,EAAQ;AACzET,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IAEA,KAAK,MAAMa,QAAQF,KAAAA,CAAO;AACxBlB,QAAAA,MAAAA,CAAOC,EAAE,CAACC,GAAG,CAACmB,YAAY,CAACD,IAAAA,CAAAA;AAC7B,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"register-content-manager-mcp-tools.js","sources":["../../../server/src/mcp/register-content-manager-mcp-tools.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { deriveDisplayedContentTypeMcpToolDefinitions } from './derive-content-type-mcp-tools';\nimport { getService } from '../utils';\n\n/**\n * Registers derived content-type MCP tools via strapi.ai.mcp.registerTool().\n * Must be called from the plugin register phase, before the MCP HTTP server starts.\n */\nexport const registerContentManagerMcpTools = async ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): Promise<void> => {\n // Performance only: registerTool() is safe when MCP is disabled (definitions are stored but\n // never exposed). Skip the expensive derivation below when the MCP server will not start.\n if (strapi.ai.mcp.isEnabled() !== true) {\n return;\n }\n\n const i18nPlugin = strapi.plugin('i18n');\n\n let localeCodes = null;\n let defaultLocale: string | null = null;\n if (i18nPlugin !== undefined) {\n localeCodes = (await i18nPlugin.service('locales').find()).map(\n (locale: { code: string }) => locale.code\n ) as [string, ...string[]];\n defaultLocale = await i18nPlugin.service('locales').getDefaultLocale();\n }\n\n const models = getService('content-types').findDisplayedContentTypes();\n const tools = deriveDisplayedContentTypeMcpToolDefinitions(strapi, models, {\n localeCodes,\n defaultLocale,\n });\n\n for (const tool of tools) {\n strapi.ai.mcp.registerTool(tool);\n }\n};\n"],"names":["registerContentManagerMcpTools","strapi","ai","mcp","isEnabled","i18nPlugin","plugin","localeCodes","defaultLocale","undefined","service","find","map","locale","code","getDefaultLocale","models","getService","findDisplayedContentTypes","tools","deriveDisplayedContentTypeMcpToolDefinitions","tool","registerTool"],"mappings":";;;;;AAKA;;;AAGC,IACM,MAAMA,8BAAAA,GAAiC,OAAO,EACnDC,MAAM,EAGP,GAAA;;;AAGC,IAAA,IAAIA,OAAOC,EAAE,CAACC,GAAG,CAACC,SAAS,OAAO,IAAA,EAAM;AACtC,QAAA;AACF,IAAA;IAEA,MAAMC,UAAAA,GAAaJ,MAAAA,CAAOK,MAAM,CAAC,MAAA,CAAA;AAEjC,IAAA,IAAIC,WAAAA,GAAc,IAAA;AAClB,IAAA,IAAIC,aAAAA,GAA+B,IAAA;AACnC,IAAA,IAAIH,eAAeI,SAAAA,EAAW;AAC5BF,QAAAA,WAAAA,GAAc,CAAC,MAAMF,UAAAA,CAAWK,OAAO,CAAC,SAAA,CAAA,CAAWC,IAAI,EAAC,EAAGC,GAAG,CAC5D,CAACC,MAAAA,GAA6BA,OAAOC,IAAI,CAAA;AAE3CN,QAAAA,aAAAA,GAAgB,MAAMH,UAAAA,CAAWK,OAAO,CAAC,WAAWK,gBAAgB,EAAA;AACtE,IAAA;IAEA,MAAMC,MAAAA,GAASC,gBAAAA,CAAW,eAAA,CAAA,CAAiBC,yBAAyB,EAAA;IACpE,MAAMC,KAAAA,GAAQC,sEAAAA,CAA6CnB,MAAAA,EAAQe,MAAAA,EAAQ;AACzET,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IAEA,KAAK,MAAMa,QAAQF,KAAAA,CAAO;AACxBlB,QAAAA,MAAAA,CAAOC,EAAE,CAACC,GAAG,CAACmB,YAAY,CAACD,IAAAA,CAAAA;AAC7B,IAAA;AACF;;;;"}
@@ -2,8 +2,11 @@ import { deriveDisplayedContentTypeMcpToolDefinitions } from './derive-content-t
2
2
  import { getService } from '../utils/index.mjs';
3
3
 
4
4
  /**
5
- * Registers derived content-type MCP tools during plugin bootstrap, before the MCP HTTP server starts.
5
+ * Registers derived content-type MCP tools via strapi.ai.mcp.registerTool().
6
+ * Must be called from the plugin register phase, before the MCP HTTP server starts.
6
7
  */ const registerContentManagerMcpTools = async ({ strapi })=>{
8
+ // Performance only: registerTool() is safe when MCP is disabled (definitions are stored but
9
+ // never exposed). Skip the expensive derivation below when the MCP server will not start.
7
10
  if (strapi.ai.mcp.isEnabled() !== true) {
8
11
  return;
9
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"register-content-manager-mcp-tools.mjs","sources":["../../../server/src/mcp/register-content-manager-mcp-tools.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { deriveDisplayedContentTypeMcpToolDefinitions } from './derive-content-type-mcp-tools';\nimport { getService } from '../utils';\n\n/**\n * Registers derived content-type MCP tools during plugin bootstrap, before the MCP HTTP server starts.\n */\nexport const registerContentManagerMcpTools = async ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): Promise<void> => {\n if (strapi.ai.mcp.isEnabled() !== true) {\n return;\n }\n\n const i18nPlugin = strapi.plugin('i18n');\n\n let localeCodes = null;\n let defaultLocale: string | null = null;\n if (i18nPlugin !== undefined) {\n localeCodes = (await i18nPlugin.service('locales').find()).map(\n (locale: { code: string }) => locale.code\n ) as [string, ...string[]];\n defaultLocale = await i18nPlugin.service('locales').getDefaultLocale();\n }\n\n const models = getService('content-types').findDisplayedContentTypes();\n const tools = deriveDisplayedContentTypeMcpToolDefinitions(strapi, models, {\n localeCodes,\n defaultLocale,\n });\n\n for (const tool of tools) {\n strapi.ai.mcp.registerTool(tool);\n }\n};\n"],"names":["registerContentManagerMcpTools","strapi","ai","mcp","isEnabled","i18nPlugin","plugin","localeCodes","defaultLocale","undefined","service","find","map","locale","code","getDefaultLocale","models","getService","findDisplayedContentTypes","tools","deriveDisplayedContentTypeMcpToolDefinitions","tool","registerTool"],"mappings":";;;AAKA;;AAEC,IACM,MAAMA,8BAAAA,GAAiC,OAAO,EACnDC,MAAM,EAGP,GAAA;AACC,IAAA,IAAIA,OAAOC,EAAE,CAACC,GAAG,CAACC,SAAS,OAAO,IAAA,EAAM;AACtC,QAAA;AACF,IAAA;IAEA,MAAMC,UAAAA,GAAaJ,MAAAA,CAAOK,MAAM,CAAC,MAAA,CAAA;AAEjC,IAAA,IAAIC,WAAAA,GAAc,IAAA;AAClB,IAAA,IAAIC,aAAAA,GAA+B,IAAA;AACnC,IAAA,IAAIH,eAAeI,SAAAA,EAAW;AAC5BF,QAAAA,WAAAA,GAAc,CAAC,MAAMF,UAAAA,CAAWK,OAAO,CAAC,SAAA,CAAA,CAAWC,IAAI,EAAC,EAAGC,GAAG,CAC5D,CAACC,MAAAA,GAA6BA,OAAOC,IAAI,CAAA;AAE3CN,QAAAA,aAAAA,GAAgB,MAAMH,UAAAA,CAAWK,OAAO,CAAC,WAAWK,gBAAgB,EAAA;AACtE,IAAA;IAEA,MAAMC,MAAAA,GAASC,UAAAA,CAAW,eAAA,CAAA,CAAiBC,yBAAyB,EAAA;IACpE,MAAMC,KAAAA,GAAQC,4CAAAA,CAA6CnB,MAAAA,EAAQe,MAAAA,EAAQ;AACzET,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IAEA,KAAK,MAAMa,QAAQF,KAAAA,CAAO;AACxBlB,QAAAA,MAAAA,CAAOC,EAAE,CAACC,GAAG,CAACmB,YAAY,CAACD,IAAAA,CAAAA;AAC7B,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"register-content-manager-mcp-tools.mjs","sources":["../../../server/src/mcp/register-content-manager-mcp-tools.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { deriveDisplayedContentTypeMcpToolDefinitions } from './derive-content-type-mcp-tools';\nimport { getService } from '../utils';\n\n/**\n * Registers derived content-type MCP tools via strapi.ai.mcp.registerTool().\n * Must be called from the plugin register phase, before the MCP HTTP server starts.\n */\nexport const registerContentManagerMcpTools = async ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): Promise<void> => {\n // Performance only: registerTool() is safe when MCP is disabled (definitions are stored but\n // never exposed). Skip the expensive derivation below when the MCP server will not start.\n if (strapi.ai.mcp.isEnabled() !== true) {\n return;\n }\n\n const i18nPlugin = strapi.plugin('i18n');\n\n let localeCodes = null;\n let defaultLocale: string | null = null;\n if (i18nPlugin !== undefined) {\n localeCodes = (await i18nPlugin.service('locales').find()).map(\n (locale: { code: string }) => locale.code\n ) as [string, ...string[]];\n defaultLocale = await i18nPlugin.service('locales').getDefaultLocale();\n }\n\n const models = getService('content-types').findDisplayedContentTypes();\n const tools = deriveDisplayedContentTypeMcpToolDefinitions(strapi, models, {\n localeCodes,\n defaultLocale,\n });\n\n for (const tool of tools) {\n strapi.ai.mcp.registerTool(tool);\n }\n};\n"],"names":["registerContentManagerMcpTools","strapi","ai","mcp","isEnabled","i18nPlugin","plugin","localeCodes","defaultLocale","undefined","service","find","map","locale","code","getDefaultLocale","models","getService","findDisplayedContentTypes","tools","deriveDisplayedContentTypeMcpToolDefinitions","tool","registerTool"],"mappings":";;;AAKA;;;AAGC,IACM,MAAMA,8BAAAA,GAAiC,OAAO,EACnDC,MAAM,EAGP,GAAA;;;AAGC,IAAA,IAAIA,OAAOC,EAAE,CAACC,GAAG,CAACC,SAAS,OAAO,IAAA,EAAM;AACtC,QAAA;AACF,IAAA;IAEA,MAAMC,UAAAA,GAAaJ,MAAAA,CAAOK,MAAM,CAAC,MAAA,CAAA;AAEjC,IAAA,IAAIC,WAAAA,GAAc,IAAA;AAClB,IAAA,IAAIC,aAAAA,GAA+B,IAAA;AACnC,IAAA,IAAIH,eAAeI,SAAAA,EAAW;AAC5BF,QAAAA,WAAAA,GAAc,CAAC,MAAMF,UAAAA,CAAWK,OAAO,CAAC,SAAA,CAAA,CAAWC,IAAI,EAAC,EAAGC,GAAG,CAC5D,CAACC,MAAAA,GAA6BA,OAAOC,IAAI,CAAA;AAE3CN,QAAAA,aAAAA,GAAgB,MAAMH,UAAAA,CAAWK,OAAO,CAAC,WAAWK,gBAAgB,EAAA;AACtE,IAAA;IAEA,MAAMC,MAAAA,GAASC,UAAAA,CAAW,eAAA,CAAA,CAAiBC,yBAAyB,EAAA;IACpE,MAAMC,KAAAA,GAAQC,4CAAAA,CAA6CnB,MAAAA,EAAQe,MAAAA,EAAQ;AACzET,QAAAA,WAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IAEA,KAAK,MAAMa,QAAQF,KAAAA,CAAO;AACxBlB,QAAAA,MAAAA,CAAOC,EAAE,CAACC,GAAG,CAACmB,YAAY,CAACD,IAAAA,CAAAA;AAC7B,IAAA;AACF;;;;"}