@strapi/content-manager 5.48.0 → 5.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/dist/admin/components/ActionsDrawer.js +3 -2
  2. package/dist/admin/components/ActionsDrawer.js.map +1 -1
  3. package/dist/admin/components/ComponentIcon.js +4 -3
  4. package/dist/admin/components/ComponentIcon.js.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/EditFieldForm.js +3 -2
  6. package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
  7. package/dist/admin/components/ConfigurationForm/Fields.js +3 -2
  8. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  9. package/dist/admin/components/ConfigurationForm/Form.js +7 -3
  10. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  11. package/dist/admin/components/LeftMenu.js +3 -2
  12. package/dist/admin/components/LeftMenu.js.map +1 -1
  13. package/dist/admin/components/RelativeTime.js +3 -2
  14. package/dist/admin/components/RelativeTime.js.map +1 -1
  15. package/dist/admin/components/Widgets.js +3 -2
  16. package/dist/admin/components/Widgets.js.map +1 -1
  17. package/dist/admin/features/DocumentRBAC.js +12 -3
  18. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  19. package/dist/admin/features/DocumentRBAC.mjs +9 -1
  20. package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
  21. package/dist/admin/history/components/VersionContent.js +7 -3
  22. package/dist/admin/history/components/VersionContent.js.map +1 -1
  23. package/dist/admin/history/components/VersionHeader.js +3 -2
  24. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  25. package/dist/admin/history/components/VersionInputRenderer.js +3 -2
  26. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  27. package/dist/admin/history/pages/History.js +3 -2
  28. package/dist/admin/history/pages/History.js.map +1 -1
  29. package/dist/admin/history/routes.js +3 -2
  30. package/dist/admin/history/routes.js.map +1 -1
  31. package/dist/admin/hooks/useContentTypeSchema.js +40 -19
  32. package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
  33. package/dist/admin/hooks/useContentTypeSchema.mjs +37 -17
  34. package/dist/admin/hooks/useContentTypeSchema.mjs.map +1 -1
  35. package/dist/admin/hooks/useDocument.js +3 -2
  36. package/dist/admin/hooks/useDocument.js.map +1 -1
  37. package/dist/admin/hooks/useDocumentActions.js +3 -2
  38. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  39. package/dist/admin/hooks/useDocumentContext.js +3 -2
  40. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  41. package/dist/admin/hooks/useDocumentLayout.js +46 -6
  42. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  43. package/dist/admin/hooks/useDocumentLayout.mjs +43 -4
  44. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  45. package/dist/admin/hooks/useDragAndDrop.js +3 -2
  46. package/dist/admin/hooks/useDragAndDrop.js.map +1 -1
  47. package/dist/admin/hooks/useKeyboardDragAndDrop.js +3 -2
  48. package/dist/admin/hooks/useKeyboardDragAndDrop.js.map +1 -1
  49. package/dist/admin/hooks/useOnce.js +3 -2
  50. package/dist/admin/hooks/useOnce.js.map +1 -1
  51. package/dist/admin/hooks/usePersistentQueryParams.js +7 -2
  52. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  53. package/dist/admin/pages/ComponentConfigurationPage.js +9 -5
  54. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  55. package/dist/admin/pages/ComponentConfigurationPage.mjs +6 -3
  56. package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
  57. package/dist/admin/pages/EditConfigurationPage.js +3 -2
  58. package/dist/admin/pages/EditConfigurationPage.js.map +1 -1
  59. package/dist/admin/pages/EditView/EditViewPage.js +3 -2
  60. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  61. package/dist/admin/pages/EditView/components/DocumentActions.js +80 -39
  62. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/DocumentActions.mjs +67 -33
  64. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js +3 -2
  66. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +4 -3
  68. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +3 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +3 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +8 -4
  74. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +5 -2
  76. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +3 -2
  78. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +3 -2
  80. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +4 -3
  82. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +3 -2
  84. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +3 -2
  86. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +3 -2
  88. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +14 -4
  90. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +11 -2
  92. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +16 -7
  94. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +9 -4
  96. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +3 -2
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +7 -3
  100. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/UID.js +3 -2
  102. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +8 -4
  104. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js +3 -2
  106. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +5 -28
  108. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
  109. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs +2 -26
  110. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -1
  111. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js +5 -1
  112. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js.map +1 -1
  113. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js +15 -2
  114. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js.map +1 -1
  115. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +76 -0
  116. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -0
  117. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs +70 -0
  118. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs.map +1 -0
  119. package/dist/admin/pages/EditView/components/FormLayout.js +3 -2
  120. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  121. package/dist/admin/pages/EditView/components/Header.js +3 -2
  122. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  123. package/dist/admin/pages/EditView/components/InputRenderer.js +3 -2
  124. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  125. package/dist/admin/pages/EditView/components/Panels.js +3 -2
  126. package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
  127. package/dist/admin/pages/EditView/utils/data.js +5 -1
  128. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  129. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js +35 -0
  130. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js.map +1 -0
  131. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs +33 -0
  132. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs.map +1 -0
  133. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +7 -10
  134. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  135. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +5 -9
  136. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  137. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +3 -2
  138. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  139. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +3 -2
  140. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  141. package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -2
  142. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  143. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +9 -12
  144. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  145. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +6 -10
  146. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
  147. package/dist/admin/pages/ListView/ListViewPage.js +3 -2
  148. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  149. package/dist/admin/pages/ListView/components/BulkActions/Actions.js +3 -2
  150. package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -1
  151. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +3 -2
  152. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  153. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +3 -2
  154. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  155. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  156. package/dist/admin/pages/ListView/components/Filters.js +10 -11
  157. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  158. package/dist/admin/pages/ListView/components/Filters.mjs +7 -9
  159. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  160. package/dist/admin/pages/ListView/components/TableActions.js +3 -2
  161. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  162. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +7 -3
  163. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  164. package/dist/admin/pages/ListView/components/TableCells/CellValue.js +7 -2
  165. package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -1
  166. package/dist/admin/pages/ListView/components/TableCells/Media.js +5 -4
  167. package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
  168. package/dist/admin/pages/ListView/components/TableCells/Media.mjs +5 -4
  169. package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
  170. package/dist/admin/pages/ListView/components/TableCells/Relations.js +3 -2
  171. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  172. package/dist/admin/pages/formatComponentConfigurationEditLayout.js +15 -9
  173. package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -1
  174. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +15 -9
  175. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -1
  176. package/dist/admin/preview/components/InputPopover.js +3 -2
  177. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  178. package/dist/admin/preview/hooks/usePreviewInputManager.js +3 -2
  179. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  180. package/dist/admin/preview/pages/Preview.js +3 -2
  181. package/dist/admin/preview/pages/Preview.js.map +1 -1
  182. package/dist/admin/preview/routes.js +3 -2
  183. package/dist/admin/preview/routes.js.map +1 -1
  184. package/dist/admin/services/components.js +3 -2
  185. package/dist/admin/services/components.js.map +1 -1
  186. package/dist/admin/services/components.mjs +3 -2
  187. package/dist/admin/services/components.mjs.map +1 -1
  188. package/dist/admin/services/contentTypes.js +4 -3
  189. package/dist/admin/services/contentTypes.js.map +1 -1
  190. package/dist/admin/services/contentTypes.mjs +4 -3
  191. package/dist/admin/services/contentTypes.mjs.map +1 -1
  192. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +1 -1
  193. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.d.ts +2 -0
  194. package/dist/admin/src/pages/EditView/utils/keyboardShortcuts.d.ts +18 -0
  195. package/dist/admin/src/pages/ListConfiguration/components/SortDisplayedFields.d.ts +2 -2
  196. package/dist/admin/src/pages/ListView/components/TableCells/Media.d.ts +2 -2
  197. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +3 -1
  198. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +24 -0
  199. package/dist/admin/translations/cs.json.js +2 -1
  200. package/dist/admin/translations/cs.json.js.map +1 -1
  201. package/dist/admin/translations/cs.json.mjs +2 -1
  202. package/dist/admin/translations/cs.json.mjs.map +1 -1
  203. package/dist/admin/translations/de.json.js +2 -1
  204. package/dist/admin/translations/de.json.js.map +1 -1
  205. package/dist/admin/translations/de.json.mjs +2 -1
  206. package/dist/admin/translations/de.json.mjs.map +1 -1
  207. package/dist/admin/translations/en.json.js +3 -1
  208. package/dist/admin/translations/en.json.js.map +1 -1
  209. package/dist/admin/translations/en.json.mjs +3 -1
  210. package/dist/admin/translations/en.json.mjs.map +1 -1
  211. package/dist/admin/translations/es.json.js +2 -1
  212. package/dist/admin/translations/es.json.js.map +1 -1
  213. package/dist/admin/translations/es.json.mjs +2 -1
  214. package/dist/admin/translations/es.json.mjs.map +1 -1
  215. package/dist/admin/translations/fr.json.js +2 -1
  216. package/dist/admin/translations/fr.json.js.map +1 -1
  217. package/dist/admin/translations/fr.json.mjs +2 -1
  218. package/dist/admin/translations/fr.json.mjs.map +1 -1
  219. package/dist/admin/translations/nl.json.js +2 -1
  220. package/dist/admin/translations/nl.json.js.map +1 -1
  221. package/dist/admin/translations/nl.json.mjs +2 -1
  222. package/dist/admin/translations/nl.json.mjs.map +1 -1
  223. package/dist/admin/translations/pl.json.js +2 -1
  224. package/dist/admin/translations/pl.json.js.map +1 -1
  225. package/dist/admin/translations/pl.json.mjs +2 -1
  226. package/dist/admin/translations/pl.json.mjs.map +1 -1
  227. package/dist/admin/translations/sk.json.js +2 -1
  228. package/dist/admin/translations/sk.json.js.map +1 -1
  229. package/dist/admin/translations/sk.json.mjs +2 -1
  230. package/dist/admin/translations/sk.json.mjs.map +1 -1
  231. package/dist/admin/utils/attributes.js +17 -2
  232. package/dist/admin/utils/attributes.js.map +1 -1
  233. package/dist/admin/utils/attributes.mjs +17 -2
  234. package/dist/admin/utils/attributes.mjs.map +1 -1
  235. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js +329 -0
  236. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js.map +1 -0
  237. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs +321 -0
  238. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs.map +1 -0
  239. package/dist/admin/utils/objects.js +9 -4
  240. package/dist/admin/utils/objects.js.map +1 -1
  241. package/dist/admin/utils/validation.js +7 -3
  242. package/dist/admin/utils/validation.js.map +1 -1
  243. package/dist/server/controllers/collection-types.js +7 -2
  244. package/dist/server/controllers/collection-types.js.map +1 -1
  245. package/dist/server/controllers/collection-types.mjs +7 -2
  246. package/dist/server/controllers/collection-types.mjs.map +1 -1
  247. package/dist/server/controllers/utils/clone.js +5 -1
  248. package/dist/server/controllers/utils/clone.js.map +1 -1
  249. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  250. package/dist/server/controllers/validation/index.js +6 -2
  251. package/dist/server/controllers/validation/index.js.map +1 -1
  252. package/dist/server/homepage/services/homepage.js +6 -1
  253. package/dist/server/homepage/services/homepage.js.map +1 -1
  254. package/dist/server/homepage/services/homepage.mjs +6 -1
  255. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  256. package/dist/server/mcp/handlers/collection-handlers.js +15 -18
  257. package/dist/server/mcp/handlers/collection-handlers.js.map +1 -1
  258. package/dist/server/mcp/handlers/collection-handlers.mjs +16 -19
  259. package/dist/server/mcp/handlers/collection-handlers.mjs.map +1 -1
  260. package/dist/server/mcp/handlers/single-type-handlers.js +12 -12
  261. package/dist/server/mcp/handlers/single-type-handlers.js.map +1 -1
  262. package/dist/server/mcp/handlers/single-type-handlers.mjs +13 -13
  263. package/dist/server/mcp/handlers/single-type-handlers.mjs.map +1 -1
  264. package/dist/server/mcp/register-content-manager-mcp-tools.js +4 -1
  265. package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
  266. package/dist/server/mcp/register-content-manager-mcp-tools.mjs +4 -1
  267. package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
  268. package/dist/server/mcp/sanitizers/shape-relations.js +108 -0
  269. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -0
  270. package/dist/server/mcp/sanitizers/shape-relations.mjs +103 -0
  271. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -0
  272. package/dist/server/mcp/schemas/data-schema.js +0 -3
  273. package/dist/server/mcp/schemas/data-schema.js.map +1 -1
  274. package/dist/server/mcp/schemas/data-schema.mjs +0 -3
  275. package/dist/server/mcp/schemas/data-schema.mjs.map +1 -1
  276. package/dist/server/mcp/schemas/output-schemas.js +30 -4
  277. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  278. package/dist/server/mcp/schemas/output-schemas.mjs +30 -4
  279. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  280. package/dist/server/mcp/utils.js +30 -3
  281. package/dist/server/mcp/utils.js.map +1 -1
  282. package/dist/server/mcp/utils.mjs +30 -4
  283. package/dist/server/mcp/utils.mjs.map +1 -1
  284. package/dist/server/middlewares/routing.js +5 -1
  285. package/dist/server/middlewares/routing.js.map +1 -1
  286. package/dist/server/services/populate-builder.js.map +1 -1
  287. package/dist/server/services/populate-builder.mjs.map +1 -1
  288. package/dist/server/services/uid.js +9 -4
  289. package/dist/server/services/uid.js.map +1 -1
  290. package/dist/server/services/utils/configuration/attributes.js +14 -10
  291. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  292. package/dist/server/services/utils/configuration/layouts.js +8 -4
  293. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  294. package/dist/server/services/utils/configuration/metadatas.js +19 -15
  295. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  296. package/dist/server/services/utils/configuration/settings.js +5 -1
  297. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  298. package/dist/server/services/utils/draft.js +5 -1
  299. package/dist/server/services/utils/draft.js.map +1 -1
  300. package/dist/server/services/utils/populate.js +8 -4
  301. package/dist/server/services/utils/populate.js.map +1 -1
  302. package/dist/server/services/utils/populate.mjs.map +1 -1
  303. package/dist/server/services/utils/store.js +9 -5
  304. package/dist/server/services/utils/store.js.map +1 -1
  305. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  306. package/dist/server/src/controllers/utils/clone.d.ts +1 -1
  307. package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
  308. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  309. package/dist/server/src/index.d.ts +3 -1
  310. package/dist/server/src/index.d.ts.map +1 -1
  311. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
  312. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
  313. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +2 -1
  314. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  315. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts +38 -0
  316. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -0
  317. package/dist/server/src/mcp/schemas/data-schema.d.ts +0 -3
  318. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
  319. package/dist/server/src/mcp/schemas/output-schemas.d.ts +2 -2
  320. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  321. package/dist/server/src/mcp/types.d.ts +2 -2
  322. package/dist/server/src/mcp/types.d.ts.map +1 -1
  323. package/dist/server/src/mcp/utils.d.ts +19 -1
  324. package/dist/server/src/mcp/utils.d.ts.map +1 -1
  325. package/dist/server/src/services/index.d.ts +3 -1
  326. package/dist/server/src/services/index.d.ts.map +1 -1
  327. package/dist/server/src/services/populate-builder.d.ts +3 -1
  328. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  329. package/dist/server/src/services/utils/populate.d.ts +3 -1
  330. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  331. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"draft.js","sources":["../../../../server/src/services/utils/draft.ts"],"sourcesContent":["import { castArray } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\n\nconst { isVisibleAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;\n/**\n * sumDraftCounts works recursively on the attributes of a model counting the\n * number of draft relations\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param {Object} entity containing the draft relation counts\n * @param {String} uid of the content type\n * @returns {Number} of draft relations\n */\nconst sumDraftCounts = (entity: any, uid: any): number => {\n const model = strapi.getModel(uid);\n\n return Object.keys(model.attributes).reduce((sum, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const value = entity[attributeName];\n if (!value) {\n return sum;\n }\n\n switch (attribute.type) {\n case 'relation': {\n if (!('target' in attribute)) {\n return sum;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n return sum;\n }\n if (isVisibleAttribute(model, attributeName)) {\n return sum + value.count;\n }\n return sum;\n }\n case 'component': {\n const compoSum = castArray(value).reduce((acc, componentValue) => {\n return acc + sumDraftCounts(componentValue, attribute.component);\n }, 0);\n return sum + compoSum;\n }\n case 'dynamiczone': {\n const dzSum = value.reduce((acc: any, componentValue: any) => {\n return acc + sumDraftCounts(componentValue, componentValue.__component);\n }, 0);\n return sum + dzSum;\n }\n default:\n return sum;\n }\n }, 0);\n};\n\nexport { sumDraftCounts };\n"],"names":["isVisibleAttribute","hasDraftAndPublish","strapiUtils","contentTypes","sumDraftCounts","entity","uid","model","strapi","getModel","Object","keys","attributes","reduce","sum","attributeName","attribute","value","type","targetModel","target","count","compoSum","castArray","acc","componentValue","component","dzSum","__component"],"mappings":";;;;;AAGA,MAAM,EAAEA,kBAAkB,EAAEC,kBAAkB,EAAE,GAAGC,YAAYC,YAAY;AAC3E;;;;;;;IAQA,MAAMC,cAAAA,GAAiB,CAACC,MAAAA,EAAaC,GAAAA,GAAAA;IACnC,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACH,GAAAA,CAAAA;IAE9B,OAAOI,MAAAA,CAAOC,IAAI,CAACJ,KAAAA,CAAMK,UAAU,CAAA,CAAEC,MAAM,CAAC,CAACC,GAAAA,EAAKC,aAAAA,GAAAA;AAChD,QAAA,MAAMC,SAAAA,GAAiBT,KAAAA,CAAMK,UAAU,CAACG,aAAAA,CAAc;QACtD,MAAME,KAAAA,GAAQZ,MAAM,CAACU,aAAAA,CAAc;AACnC,QAAA,IAAI,CAACE,KAAAA,EAAO;YACV,OAAOH,GAAAA;AACT,QAAA;AAEA,QAAA,OAAQE,UAAUE,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;AACf,oBAAA,IAAI,EAAE,QAAA,IAAYF,SAAQ,CAAA,EAAI;wBAC5B,OAAOF,GAAAA;AACT,oBAAA;AAEA,oBAAA,MAAMK,WAAAA,GAAcX,MAAAA,CAAOC,QAAQ,CAACO,UAAUI,MAAM,CAAA;AACpD,oBAAA,IAAI,CAACD,WAAAA,IAAe,CAAClB,kBAAAA,CAAmBkB,WAAAA,CAAAA,EAAc;wBACpD,OAAOL,GAAAA;AACT,oBAAA;oBACA,IAAId,kBAAAA,CAAmBO,OAAOQ,aAAAA,CAAAA,EAAgB;wBAC5C,OAAOD,GAAAA,GAAMG,MAAMI,KAAK;AAC1B,oBAAA;oBACA,OAAOP,GAAAA;AACT,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAMQ,WAAWC,YAAAA,CAAUN,KAAAA,CAAAA,CAAOJ,MAAM,CAAC,CAACW,GAAAA,EAAKC,cAAAA,GAAAA;AAC7C,wBAAA,OAAOD,GAAAA,GAAMpB,cAAAA,CAAeqB,cAAAA,EAAgBT,SAAAA,CAAUU,SAAS,CAAA;oBACjE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOZ,GAAAA,GAAMQ,QAAAA;AACf,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMK,KAAAA,GAAQV,KAAAA,CAAMJ,MAAM,CAAC,CAACW,GAAAA,EAAUC,cAAAA,GAAAA;AACpC,wBAAA,OAAOD,GAAAA,GAAMpB,cAAAA,CAAeqB,cAAAA,EAAgBA,cAAAA,CAAeG,WAAW,CAAA;oBACxE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOd,GAAAA,GAAMa,KAAAA;AACf,gBAAA;AACA,YAAA;gBACE,OAAOb,GAAAA;AACX;IACF,CAAA,EAAG,CAAA,CAAA;AACL;;;;"}
1
+ {"version":3,"file":"draft.js","sources":["../../../../server/src/services/utils/draft.ts"],"sourcesContent":["import { castArray } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\n\nconst { isVisibleAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;\n/**\n * sumDraftCounts works recursively on the attributes of a model counting the\n * number of draft relations\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param {Object} entity containing the draft relation counts\n * @param {String} uid of the content type\n * @returns {Number} of draft relations\n */\nconst sumDraftCounts = (entity: any, uid: any): number => {\n const model = strapi.getModel(uid);\n\n return Object.keys(model.attributes).reduce((sum, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const value = entity[attributeName];\n if (!value) {\n return sum;\n }\n\n switch (attribute.type) {\n case 'relation': {\n if (!('target' in attribute)) {\n return sum;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n return sum;\n }\n if (isVisibleAttribute(model, attributeName)) {\n return sum + value.count;\n }\n return sum;\n }\n case 'component': {\n const compoSum = castArray(value).reduce((acc, componentValue) => {\n return acc + sumDraftCounts(componentValue, attribute.component);\n }, 0);\n return sum + compoSum;\n }\n case 'dynamiczone': {\n const dzSum = value.reduce((acc: any, componentValue: any) => {\n return acc + sumDraftCounts(componentValue, componentValue.__component);\n }, 0);\n return sum + dzSum;\n }\n default:\n return sum;\n }\n }, 0);\n};\n\nexport { sumDraftCounts };\n"],"names":["isVisibleAttribute","hasDraftAndPublish","strapiUtils","contentTypes","sumDraftCounts","entity","uid","model","strapi","getModel","Object","keys","attributes","reduce","sum","attributeName","attribute","value","type","targetModel","target","count","compoSum","castArray","acc","componentValue","component","dzSum","__component"],"mappings":";;;;;;;;;AAGA,MAAM,EAAEA,kBAAkB,EAAEC,kBAAkB,EAAE,GAAGC,6BAAYC,YAAY;AAC3E;;;;;;;IAQA,MAAMC,cAAAA,GAAiB,CAACC,MAAAA,EAAaC,GAAAA,GAAAA;IACnC,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACH,GAAAA,CAAAA;IAE9B,OAAOI,MAAAA,CAAOC,IAAI,CAACJ,KAAAA,CAAMK,UAAU,CAAA,CAAEC,MAAM,CAAC,CAACC,GAAAA,EAAKC,aAAAA,GAAAA;AAChD,QAAA,MAAMC,SAAAA,GAAiBT,KAAAA,CAAMK,UAAU,CAACG,aAAAA,CAAc;QACtD,MAAME,KAAAA,GAAQZ,MAAM,CAACU,aAAAA,CAAc;AACnC,QAAA,IAAI,CAACE,KAAAA,EAAO;YACV,OAAOH,GAAAA;AACT,QAAA;AAEA,QAAA,OAAQE,UAAUE,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;AACf,oBAAA,IAAI,EAAE,QAAA,IAAYF,SAAQ,CAAA,EAAI;wBAC5B,OAAOF,GAAAA;AACT,oBAAA;AAEA,oBAAA,MAAMK,WAAAA,GAAcX,MAAAA,CAAOC,QAAQ,CAACO,UAAUI,MAAM,CAAA;AACpD,oBAAA,IAAI,CAACD,WAAAA,IAAe,CAAClB,kBAAAA,CAAmBkB,WAAAA,CAAAA,EAAc;wBACpD,OAAOL,GAAAA;AACT,oBAAA;oBACA,IAAId,kBAAAA,CAAmBO,OAAOQ,aAAAA,CAAAA,EAAgB;wBAC5C,OAAOD,GAAAA,GAAMG,MAAMI,KAAK;AAC1B,oBAAA;oBACA,OAAOP,GAAAA;AACT,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAMQ,WAAWC,YAAAA,CAAUN,KAAAA,CAAAA,CAAOJ,MAAM,CAAC,CAACW,GAAAA,EAAKC,cAAAA,GAAAA;AAC7C,wBAAA,OAAOD,GAAAA,GAAMpB,cAAAA,CAAeqB,cAAAA,EAAgBT,SAAAA,CAAUU,SAAS,CAAA;oBACjE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOZ,GAAAA,GAAMQ,QAAAA;AACf,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMK,KAAAA,GAAQV,KAAAA,CAAMJ,MAAM,CAAC,CAACW,GAAAA,EAAUC,cAAAA,GAAAA;AACpC,wBAAA,OAAOD,GAAAA,GAAMpB,cAAAA,CAAeqB,cAAAA,EAAgBA,cAAAA,CAAeG,WAAW,CAAA;oBACxE,CAAA,EAAG,CAAA,CAAA;AACH,oBAAA,OAAOd,GAAAA,GAAMa,KAAAA;AACf,gBAAA;AACA,YAAA;gBACE,OAAOb,GAAAA;AACX;IACF,CAAA,EAAG,CAAA,CAAA;AACL;;;;"}
@@ -4,9 +4,13 @@ var fp = require('lodash/fp');
4
4
  var strapiUtils = require('@strapi/utils');
5
5
  var index = require('../../utils/index.js');
6
6
 
7
- const { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation, isPrivateAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;
8
- const { isAnyToMany } = strapiUtils.relations;
9
- const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var strapiUtils__default = /*#__PURE__*/_interopDefault(strapiUtils);
10
+
11
+ const { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation, isPrivateAttribute, hasDraftAndPublish } = strapiUtils__default.default.contentTypes;
12
+ const { isAnyToMany } = strapiUtils__default.default.relations;
13
+ const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils__default.default.contentTypes.constants;
10
14
  const isMorphToRelation = (attribute)=>isRelation(attribute) && attribute.relation.includes('morphTo');
11
15
  const isMedia = fp.propEq('type', 'media');
12
16
  const isRelation = fp.propEq('type', 'relation');
@@ -294,7 +298,7 @@ const getDeepPopulateDraftCount = (uid)=>{
294
298
  * Create a Strapi populate object which populates all attribute fields of a Strapi query.
295
299
  */ const getQueryPopulate = async (uid, query)=>{
296
300
  let populateQuery = {};
297
- await strapiUtils.traverse.traverseQueryFilters(/**
301
+ await strapiUtils__default.default.traverse.traverseQueryFilters(/**
298
302
  *
299
303
  * @param {Object} param0
300
304
  * @param {string} param0.key - Attribute name
@@ -1 +1 @@
1
- {"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst {\n isVisibleAttribute,\n isScalarAttribute,\n getDoesAttributeRequireValidation,\n isPrivateAttribute,\n hasDraftAndPublish,\n} = strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n // Use initialPopulate when explicitly provided (including `false` to suppress population)\n if (initialPopulate !== undefined) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst validationPopulateCache = new Map<string, Record<string, any>>();\n\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const cached = validationPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n const result = Object.entries(model.attributes).reduce(\n (populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n },\n {}\n );\n\n validationPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst draftCountPopulateCache = new Map<string, { populate: any; hasRelations: boolean }>();\n\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const cached = draftCountPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return { populate: {}, hasRelations: false };\n }\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n // Skip relations to content types without draft & publish,\n // as they don't have a publishedAt attribute and can't have drafts\n if (!('target' in attribute)) {\n break;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n const result = { populate, hasRelations };\n draftCountPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst deepPopulateCache = new Map<string, object>();\n\nconst buildDeepPopulate = async (uid: UID.CollectionType) => {\n const cached = deepPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const result = await getService('populate-builder')(uid)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n deepPopulateCache.set(uid, result);\n\n return result;\n};\n\n/**\n * Restrict localizations populate to only metadata fields for localized content types.\n * Returns an empty object for non-localized content types.\n *\n * By default, localizations are deeply populated which includes all relations and\n * components for every locale — this is expensive and unnecessary for CM responses.\n * The CM only needs these fields from localizations:\n * - locale: to identify which locales exist\n * - documentId: to link to the localized document\n * - publishedAt: to determine published/draft status\n * - updatedAt: to support the modified state indicator in the UI\n */\nconst getPopulateForLocalizations = (model: UID.Schema) => {\n const modelSchema = strapi.getModel(model);\n if (\n (modelSchema as unknown as { pluginOptions: { i18n: { localized?: boolean } } }).pluginOptions\n ?.i18n?.localized\n ) {\n return { localizations: { fields: ['locale', 'documentId', 'publishedAt', 'updatedAt'] } };\n }\n\n return {};\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n getPopulateForLocalizations,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","isPrivateAttribute","hasDraftAndPublish","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","undefined","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","validationPopulateCache","Map","cached","get","result","entries","fields","push","componentResult","length","componentsResult","set","draftCountPopulateCache","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","targetModel","target","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","schema","bind","deepPopulateCache","buildDeepPopulate","getService","populateDeep","countRelations","build","getPopulateForLocalizations","modelSchema","pluginOptions","i18n","localized","localizations"],"mappings":"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"}
1
+ {"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst {\n isVisibleAttribute,\n isScalarAttribute,\n getDoesAttributeRequireValidation,\n isPrivateAttribute,\n hasDraftAndPublish,\n} = strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n // Use initialPopulate when explicitly provided (including `false` to suppress population)\n if (initialPopulate !== undefined) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n): { on: { [key: string]: { populate: { [key: string]: boolean | object } } } } {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n): { [key: string]: boolean | object } => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst validationPopulateCache = new Map<string, Record<string, any>>();\n\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const cached = validationPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n const result = Object.entries(model.attributes).reduce(\n (populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n },\n {}\n );\n\n validationPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst draftCountPopulateCache = new Map<string, { populate: any; hasRelations: boolean }>();\n\nconst getDeepPopulateDraftCount = (uid: UID.Schema): { populate: any; hasRelations: boolean } => {\n const cached = draftCountPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return { populate: {}, hasRelations: false };\n }\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n // Skip relations to content types without draft & publish,\n // as they don't have a publishedAt attribute and can't have drafts\n if (!('target' in attribute)) {\n break;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n const result = { populate, hasRelations };\n draftCountPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst deepPopulateCache = new Map<string, object>();\n\nconst buildDeepPopulate = async (uid: UID.CollectionType) => {\n const cached = deepPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const result = await getService('populate-builder')(uid)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n deepPopulateCache.set(uid, result);\n\n return result;\n};\n\n/**\n * Restrict localizations populate to only metadata fields for localized content types.\n * Returns an empty object for non-localized content types.\n *\n * By default, localizations are deeply populated which includes all relations and\n * components for every locale — this is expensive and unnecessary for CM responses.\n * The CM only needs these fields from localizations:\n * - locale: to identify which locales exist\n * - documentId: to link to the localized document\n * - publishedAt: to determine published/draft status\n * - updatedAt: to support the modified state indicator in the UI\n */\nconst getPopulateForLocalizations = (model: UID.Schema) => {\n const modelSchema = strapi.getModel(model);\n if (\n (modelSchema as unknown as { pluginOptions: { i18n: { localized?: boolean } } }).pluginOptions\n ?.i18n?.localized\n ) {\n return { localizations: { fields: ['locale', 'documentId', 'publishedAt', 'updatedAt'] } };\n }\n\n return {};\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n getPopulateForLocalizations,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","isPrivateAttribute","hasDraftAndPublish","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","undefined","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","validationPopulateCache","Map","cached","get","result","entries","fields","push","componentResult","length","componentsResult","set","draftCountPopulateCache","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","targetModel","target","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","schema","bind","deepPopulateCache","buildDeepPopulate","getService","populateDeep","countRelations","build","getPopulateForLocalizations","modelSchema","pluginOptions","i18n","localized","localizations"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"populate.mjs","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst {\n isVisibleAttribute,\n isScalarAttribute,\n getDoesAttributeRequireValidation,\n isPrivateAttribute,\n hasDraftAndPublish,\n} = strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n // Use initialPopulate when explicitly provided (including `false` to suppress population)\n if (initialPopulate !== undefined) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n) {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n) => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst validationPopulateCache = new Map<string, Record<string, any>>();\n\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const cached = validationPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n const result = Object.entries(model.attributes).reduce(\n (populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n },\n {}\n );\n\n validationPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst draftCountPopulateCache = new Map<string, { populate: any; hasRelations: boolean }>();\n\nconst getDeepPopulateDraftCount = (uid: UID.Schema) => {\n const cached = draftCountPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return { populate: {}, hasRelations: false };\n }\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n // Skip relations to content types without draft & publish,\n // as they don't have a publishedAt attribute and can't have drafts\n if (!('target' in attribute)) {\n break;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n const result = { populate, hasRelations };\n draftCountPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst deepPopulateCache = new Map<string, object>();\n\nconst buildDeepPopulate = async (uid: UID.CollectionType) => {\n const cached = deepPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const result = await getService('populate-builder')(uid)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n deepPopulateCache.set(uid, result);\n\n return result;\n};\n\n/**\n * Restrict localizations populate to only metadata fields for localized content types.\n * Returns an empty object for non-localized content types.\n *\n * By default, localizations are deeply populated which includes all relations and\n * components for every locale — this is expensive and unnecessary for CM responses.\n * The CM only needs these fields from localizations:\n * - locale: to identify which locales exist\n * - documentId: to link to the localized document\n * - publishedAt: to determine published/draft status\n * - updatedAt: to support the modified state indicator in the UI\n */\nconst getPopulateForLocalizations = (model: UID.Schema) => {\n const modelSchema = strapi.getModel(model);\n if (\n (modelSchema as unknown as { pluginOptions: { i18n: { localized?: boolean } } }).pluginOptions\n ?.i18n?.localized\n ) {\n return { localizations: { fields: ['locale', 'documentId', 'publishedAt', 'updatedAt'] } };\n }\n\n return {};\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n getPopulateForLocalizations,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","isPrivateAttribute","hasDraftAndPublish","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","undefined","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","validationPopulateCache","Map","cached","get","result","entries","fields","push","componentResult","length","componentsResult","set","draftCountPopulateCache","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","targetModel","target","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","schema","bind","deepPopulateCache","buildDeepPopulate","getService","populateDeep","countRelations","build","getPopulateForLocalizations","modelSchema","pluginOptions","i18n","localized","localizations"],"mappings":"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"}
1
+ {"version":3,"file":"populate.mjs","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst {\n isVisibleAttribute,\n isScalarAttribute,\n getDoesAttributeRequireValidation,\n isPrivateAttribute,\n hasDraftAndPublish,\n} = strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n // Use initialPopulate when explicitly provided (including `false` to suppress population)\n if (initialPopulate !== undefined) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n): { on: { [key: string]: { populate: { [key: string]: boolean | object } } } } {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n): { [key: string]: boolean | object } => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst validationPopulateCache = new Map<string, Record<string, any>>();\n\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const cached = validationPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n const result = Object.entries(model.attributes).reduce(\n (populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n },\n {}\n );\n\n validationPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst draftCountPopulateCache = new Map<string, { populate: any; hasRelations: boolean }>();\n\nconst getDeepPopulateDraftCount = (uid: UID.Schema): { populate: any; hasRelations: boolean } => {\n const cached = draftCountPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return { populate: {}, hasRelations: false };\n }\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n // Skip relations to content types without draft & publish,\n // as they don't have a publishedAt attribute and can't have drafts\n if (!('target' in attribute)) {\n break;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n populateAcc[attributeName] = {\n count: true,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n const result = { populate, hasRelations };\n draftCountPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n populateQuery = set(populatePath, {}, populateQuery);\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst deepPopulateCache = new Map<string, object>();\n\nconst buildDeepPopulate = async (uid: UID.CollectionType) => {\n const cached = deepPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const result = await getService('populate-builder')(uid)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n deepPopulateCache.set(uid, result);\n\n return result;\n};\n\n/**\n * Restrict localizations populate to only metadata fields for localized content types.\n * Returns an empty object for non-localized content types.\n *\n * By default, localizations are deeply populated which includes all relations and\n * components for every locale — this is expensive and unnecessary for CM responses.\n * The CM only needs these fields from localizations:\n * - locale: to identify which locales exist\n * - documentId: to link to the localized document\n * - publishedAt: to determine published/draft status\n * - updatedAt: to support the modified state indicator in the UI\n */\nconst getPopulateForLocalizations = (model: UID.Schema) => {\n const modelSchema = strapi.getModel(model);\n if (\n (modelSchema as unknown as { pluginOptions: { i18n: { localized?: boolean } } }).pluginOptions\n ?.i18n?.localized\n ) {\n return { localizations: { fields: ['locale', 'documentId', 'publishedAt', 'updatedAt'] } };\n }\n\n return {};\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n getPopulateForLocalizations,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","isPrivateAttribute","hasDraftAndPublish","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","undefined","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","validationPopulateCache","Map","cached","get","result","entries","fields","push","componentResult","length","componentsResult","set","draftCountPopulateCache","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","targetModel","target","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","schema","bind","deepPopulateCache","buildDeepPopulate","getService","populateDeep","countRelations","build","getPopulateForLocalizations","modelSchema","pluginOptions","i18n","localized","localizations"],"mappings":";;;;AAKA,MAAM,EACJA,kBAAkB,EAClBC,iBAAiB,EACjBC,iCAAiC,EACjCC,kBAAkB,EAClBC,kBAAkB,EACnB,GAAGC,YAAYC,YAAY;AAC5B,MAAM,EAAEC,WAAW,EAAE,GAAGF,YAAYG,SAAS;AAC7C,MAAM,EAAEC,sBAAsB,EAAE,GAAGJ,WAAAA,CAAYC,YAAY,CAACI,SAAS;AAErE,MAAMC,iBAAAA,GAAoB,CAACC,SAAAA,GACzBC,UAAAA,CAAWD,cAAcA,SAAAA,CAAUE,QAAQ,CAACC,QAAQ,CAAC,SAAA,CAAA;AACvD,MAAMC,OAAAA,GAAUC,OAAO,MAAA,EAAQ,OAAA,CAAA;AAC/B,MAAMJ,UAAAA,GAAaI,OAAO,MAAA,EAAQ,UAAA,CAAA;AAClC,MAAMC,WAAAA,GAAcD,OAAO,MAAA,EAAQ,WAAA,CAAA;AACnC,MAAME,aAAAA,GAAgBF,OAAO,MAAA,EAAQ,aAAA,CAAA;AAarC;;;;;;;AAOC,IACD,SAASG,sBAAAA,CACPR,SAAwC,EACxCS,KAAY,EACZC,aAAqB,EACrB,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,eAAe,EAAmB,EAAA;AAEzD,IAAA,MAAMC,iBAAiBnB,WAAAA,CAAYK,SAAAA,CAAAA;;AAGnC,IAAA,IAAIa,oBAAoBE,SAAAA,EAAW;QACjC,OAAOF,eAAAA;AACT,IAAA;;;AAIA,IAAA,IAAIH,kBAAkB,eAAA,EAAiB;QACrC,MAAMM,kBAAAA,GAAqBC,wBAAAA,CAAyBR,KAAAA,CAAMS,GAAG,CAAA;QAE7D,OAAO;AACLC,YAAAA,QAAAA,EAAUH,mBAAmBG;AAC/B,SAAA;AACF,IAAA;;IAGA,IAAI,CAAC/B,kBAAAA,CAAmBqB,KAAAA,EAAOC,aAAAA,CAAAA,EAAgB;QAC7C,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAI,cAACI,IAAkBH,SAAAA,IAAe,CAACG,kBAAkBF,QAAAA,EAAW;QAClE,OAAO;YAAEQ,KAAAA,EAAO;AAAK,SAAA;AACvB,IAAA;IAEA,OAAO,IAAA;AACT;AAEA;;;;;AAKC,IACD,SAASC,gBAAAA,CACPrB,SAAuC,EACvCsB,OAAwB,EACxBC,KAAa,EAAA;;AAGb,IAAA,MAAMC,mBAAAA,GAAuBxB,CAAAA,SAAAA,CAAUyB,UAAU,IAAI,EAAE,EAAEC,MAAM,CAC7D,CAACC,GAAAA,EAAUC,gBAAiC;AAC1C,YAAA,GAAGD,GAAG;AACN,YAAA,CAACC,eAAe;gBACdT,QAAAA,EAAUU,eAAAA,CAAgBD,YAAAA,EAAcN,OAAAA,EAASC,KAAAA,GAAQ,CAAA;AAC3D;AACF,SAAA,GACA,EAAC,CAAA;IAGH,OAAO;QAAEO,EAAAA,EAAIN;AAAoB,KAAA;AACnC;AAEA;;;;;;;;;;IAWA,SAASO,eACPrB,aAAqB,EACrBD,KAAU,EACVa,OAAwB,EACxBC,KAAa,EAAA;AAEb,IAAA,MAAMvB,SAAAA,GAAYS,KAAAA,CAAMuB,UAAU,CAACtB,aAAAA,CAAc;AAEjD,IAAA,OAAQV,UAAUiC,IAAI;QACpB,KAAK,UAAA;;YAEH,OAAO;AACL,gBAAA,CAACvB,aAAAA,GAAgBF,sBAAAA,CAAuBR,SAAAA,EAAWS,OAAOC,aAAAA,EAAeY,OAAAA;AAC3E,aAAA;QACF,KAAK,WAAA;YACH,OAAO;AACL,gBAAA,CAACZ,gBAAgB;AACfS,oBAAAA,QAAAA,EAAUU,eAAAA,CAAgB7B,SAAAA,CAAUkC,SAAS,EAAEZ,SAASC,KAAAA,GAAQ,CAAA;AAClE;AACF,aAAA;QACF,KAAK,OAAA;YACH,OAAO;AACL,gBAAA,CAACb,gBAAgB;oBACfS,QAAAA,EAAU;wBACRgB,MAAAA,EAAQ;AACV;AACF;AACF,aAAA;QACF,KAAK,aAAA;YACH,OAAO;AACL,gBAAA,CAACzB,aAAAA,GAAgBW,gBAAAA,CAAiBrB,SAAAA,EAAWsB,OAAAA,EAASC,KAAAA;AACxD,aAAA;AACF,QAAA;AACE,YAAA,OAAO,EAAC;AACZ;AACF;AAEA;;;;;IAMA,MAAMM,kBAAkB,CACtBX,GAAAA,EACA,EACEL,eAAAA,GAAkB,EAAS,EAC3BF,SAAAA,GAAY,KAAK,EACjBC,QAAAA,GAAW,KAAK,EAChBwB,QAAAA,GAAWC,QAAQ,EACH,GAAG,EAAE,EACvBd,KAAAA,GAAQ,CAAC,GAAA;AAET,IAAA,IAAIA,QAAQa,QAAAA,EAAU;AACpB,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,MAAM3B,KAAAA,GAAQ6B,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAE9B,IAAA,IAAI,CAACT,KAAAA,EAAO;AACV,QAAA,OAAO,EAAC;AACV,IAAA;AAEA,IAAA,OAAO+B,MAAAA,CAAOC,IAAI,CAAChC,KAAAA,CAAMuB,UAAU,CAAA,CAAEN,MAAM,CACzC,CAACgB,aAAahC,aAAAA,GACZiC,KAAAA,CACED,WAAAA,EACAX,cAAAA,CACErB,eACAD,KAAAA,EACA;;YAEEI,eAAAA,EAAiBA,eAAAA,GAAkBH,aAAAA,CAAc;AACjDC,YAAAA,SAAAA;AACAC,YAAAA,QAAAA;AACAwB,YAAAA;AACF,SAAA,EACAb,SAGN,EAAC,CAAA;AAEL;AAEA;;;;;IAMA,MAAMqB,0BAA0B,IAAIC,GAAAA,EAAAA;AAEpC,MAAM5B,2BAA2B,CAACC,GAAAA,GAAAA;IAChC,MAAM4B,MAAAA,GAASF,uBAAAA,CAAwBG,GAAG,CAAC7B,GAAAA,CAAAA;AAC3C,IAAA,IAAI4B,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAMrC,KAAAA,GAAQ6B,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAC9B,IAAA,IAAI,CAACT,KAAAA,EAAO;AACV,QAAA,OAAO,EAAC;AACV,IAAA;AAEA,IAAA,MAAMuC,MAAAA,GAASR,MAAAA,CAAOS,OAAO,CAACxC,KAAAA,CAAMuB,UAAU,CAAA,CAAEN,MAAM,CACpD,CAACgB,WAAAA,EAAkB,CAAChC,eAAeV,SAAAA,CAAU,GAAA;AAC3C,QAAA,IAAIX,kBAAkBW,SAAAA,CAAAA,EAAY;;AAEhC,YAAA,IACEV,iCAAAA,CAAkCU,SAAAA,CAAAA,IAClC,CAACT,kBAAAA,CAAmBkB,OAAOC,aAAAA,CAAAA,EAC3B;AACAgC,gBAAAA,WAAAA,CAAYQ,MAAM,GAAGR,WAAAA,CAAYQ,MAAM,IAAI,EAAE;gBAC7CR,WAAAA,CAAYQ,MAAM,CAACC,IAAI,CAACzC,aAAAA,CAAAA;AAC1B,YAAA;YACA,OAAOgC,WAAAA;AACT,QAAA;AAEA,QAAA,IAAItC,QAAQJ,SAAAA,CAAAA,EAAY;AACtB,YAAA,IACEV,iCAAAA,CAAkCU,SAAAA,CAAAA,IAClC,CAACT,kBAAAA,CAAmBkB,OAAOC,aAAAA,CAAAA,EAC3B;AACAgC,gBAAAA,WAAAA,CAAYvB,QAAQ,GAAGuB,WAAAA,CAAYvB,QAAQ,IAAI,EAAC;gBAChDuB,WAAAA,CAAYvB,QAAQ,CAACT,aAAAA,CAAc,GAAG;oBACpCS,QAAAA,EAAU;wBACRgB,MAAAA,EAAQ;AACV;AACF,iBAAA;gBACA,OAAOO,WAAAA;AACT,YAAA;AACF,QAAA;AAEA,QAAA,IAAIpC,YAAYN,SAAAA,CAAAA,EAAY;;YAE1B,MAAMkC,SAAAA,GAAYlC,UAAUkC,SAAS;;AAGrC,YAAA,MAAMkB,kBAAkBnC,wBAAAA,CAAyBiB,SAAAA,CAAAA;AAEjD,YAAA,IAAIM,OAAOC,IAAI,CAACW,eAAAA,CAAAA,CAAiBC,MAAM,GAAG,CAAA,EAAG;AAC3CX,gBAAAA,WAAAA,CAAYvB,QAAQ,GAAGuB,WAAAA,CAAYvB,QAAQ,IAAI,EAAC;gBAChDuB,WAAAA,CAAYvB,QAAQ,CAACT,aAAAA,CAAc,GAAG0C,eAAAA;AACxC,YAAA;YAEA,OAAOV,WAAAA;AACT,QAAA;AAEA,QAAA,IAAInC,cAAcP,SAAAA,CAAAA,EAAY;YAC5B,MAAMyB,UAAAA,GAAa,SAACzB,CAA2CyB,UAAU;;YAEzE,MAAM6B,gBAAAA,GAAmB,CAAC7B,UAAAA,IAAc,EAAE,EAAEC,MAAM,CAChD,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;;AAEJ,gBAAA,MAAMwB,kBAAkBnC,wBAAAA,CAAyBW,YAAAA,CAAAA;;AAGjD,gBAAA,IAAIY,OAAOC,IAAI,CAACW,eAAAA,CAAAA,CAAiBC,MAAM,GAAG,CAAA,EAAG;oBAC3C1B,GAAG,CAACC,aAAa,GAAGwB,eAAAA;AACtB,gBAAA;gBAEA,OAAOzB,GAAAA;AACT,YAAA,CAAA,EACA,EAAC,CAAA;;AAIH,YAAA,IAAIa,OAAOC,IAAI,CAACa,gBAAAA,CAAAA,CAAkBD,MAAM,GAAG,CAAA,EAAG;AAC5CX,gBAAAA,WAAAA,CAAYvB,QAAQ,GAAGuB,WAAAA,CAAYvB,QAAQ,IAAI,EAAC;gBAChDuB,WAAAA,CAAYvB,QAAQ,CAACT,aAAAA,CAAc,GAAG;oBAAEoB,EAAAA,EAAIwB;AAAiB,iBAAA;AAC/D,YAAA;AACF,QAAA;QAEA,OAAOZ,WAAAA;AACT,IAAA,CAAA,EACA,EAAC,CAAA;IAGHE,uBAAAA,CAAwBW,GAAG,CAACrC,GAAAA,EAAK8B,MAAAA,CAAAA;IACjC,OAAOA,MAAAA;AACT;AAEA;;;;;;;;IASA,MAAMQ,0BAA0B,IAAIX,GAAAA,EAAAA;AAEpC,MAAMY,4BAA4B,CAACvC,GAAAA,GAAAA;IACjC,MAAM4B,MAAAA,GAASU,uBAAAA,CAAwBT,GAAG,CAAC7B,GAAAA,CAAAA;AAC3C,IAAA,IAAI4B,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAMrC,KAAAA,GAAQ6B,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAC9B,IAAA,IAAI,CAACT,KAAAA,EAAO;QACV,OAAO;AAAEU,YAAAA,QAAAA,EAAU,EAAC;YAAGuC,YAAAA,EAAc;AAAM,SAAA;AAC7C,IAAA;AACA,IAAA,IAAIA,YAAAA,GAAe,KAAA;IAEnB,MAAMvC,QAAAA,GAAWqB,MAAAA,CAAOC,IAAI,CAAChC,KAAAA,CAAMuB,UAAU,CAAA,CAAEN,MAAM,CAAC,CAACgB,WAAAA,EAAkBhC,aAAAA,GAAAA;AACvE,QAAA,MAAMV,SAAAA,GAA2CS,KAAAA,CAAMuB,UAAU,CAACtB,aAAAA,CAAc;AAEhF,QAAA,OAAQV,UAAUiC,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;;AAEf,oBAAA,MAAM0B,kBAAkB3D,SAAAA,CAAUE,QAAQ,CAAC0D,WAAW,EAAA,CAAGC,UAAU,CAAC,OAAA,CAAA;AACpE,oBAAA,IAAIF,eAAAA,EAAiB;AACnB,wBAAA;AACF,oBAAA;;;AAIA,oBAAA,IAAI,EAAE,QAAA,IAAY3D,SAAQ,CAAA,EAAI;AAC5B,wBAAA;AACF,oBAAA;AAEA,oBAAA,MAAM8D,WAAAA,GAAcxB,MAAAA,CAAOC,QAAQ,CAACvC,UAAU+D,MAAM,CAAA;AACpD,oBAAA,IAAI,CAACD,WAAAA,IAAe,CAACtE,kBAAAA,CAAmBsE,WAAAA,CAAAA,EAAc;AACpD,wBAAA;AACF,oBAAA;oBAEA,IAAI1E,kBAAAA,CAAmBqB,OAAOC,aAAAA,CAAAA,EAAgB;wBAC5CgC,WAAW,CAAChC,cAAc,GAAG;4BAC3BU,KAAAA,EAAO,IAAA;4BACP4C,OAAAA,EAAS;AAAE,gCAAA,CAACnE,yBAAyB;oCAAEoE,KAAAA,EAAO;AAAK;AAAE;AACvD,yBAAA;wBACAP,YAAAA,GAAe,IAAA;AACjB,oBAAA;AACA,oBAAA;AACF,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;oBAChB,MAAM,EAAEvC,QAAQ,EAAEuC,YAAAA,EAAcQ,iBAAiB,EAAE,GAAGT,yBAAAA,CACpDzD,SAAAA,CAAUkC,SAAS,CAAA;AAErB,oBAAA,IAAIgC,iBAAAA,EAAmB;wBACrBxB,WAAW,CAAChC,cAAc,GAAG;AAC3BS,4BAAAA;AACF,yBAAA;wBACAuC,YAAAA,GAAe,IAAA;AACjB,oBAAA;AACA,oBAAA;AACF,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMS,qBAAqBnE,SAAAA,CAAUyB,UAAU,EAAEC,MAAAA,CAAO,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;wBAC5D,MAAM,EAAET,UAAUiD,iBAAiB,EAAEV,cAAcW,qBAAqB,EAAE,GACxEZ,yBAAAA,CAA0B7B,YAAAA,CAAAA;AAE5B,wBAAA,IAAIyC,qBAAAA,EAAuB;4BACzBX,YAAAA,GAAe,IAAA;4BAEf,OAAO;AAAE,gCAAA,GAAG/B,GAAG;AAAE,gCAAA,CAACC,eAAe;oCAAET,QAAAA,EAAUiD;AAAkB;AAAE,6BAAA;AACnE,wBAAA;wBAEA,OAAOzC,GAAAA;AACT,oBAAA,CAAA,EAAG,EAAC,CAAA;oBAEJ,IAAI,CAAC2C,QAAQH,kBAAAA,CAAAA,EAAqB;wBAChCzB,WAAW,CAAChC,cAAc,GAAG;4BAAEoB,EAAAA,EAAIqC;AAAmB,yBAAA;AACxD,oBAAA;AACA,oBAAA;AACF,gBAAA;AAEF;QAEA,OAAOzB,WAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AAEJ,IAAA,MAAMM,MAAAA,GAAS;AAAE7B,QAAAA,QAAAA;AAAUuC,QAAAA;AAAa,KAAA;IACxCF,uBAAAA,CAAwBD,GAAG,CAACrC,GAAAA,EAAK8B,MAAAA,CAAAA;IACjC,OAAOA,MAAAA;AACT;AAEA;;IAGA,MAAMuB,gBAAAA,GAAmB,OAAOrD,GAAAA,EAAiBsD,KAAAA,GAAAA;AAC/C,IAAA,IAAIC,gBAA0B,EAAC;AAE/B,IAAA,MAAMhF,WAAAA,CAAYiF,QAAQ,CAACC,oBAAoB;;;;;;;AAQ5C,QACD,CAAC,EAAE3E,SAAS,EAAE4E,IAAI,EAAO,GAAA;;AAEvB,QAAA,IAAI,CAAC5E,SAAAA,IAAaO,aAAAA,CAAcP,SAAAA,CAAAA,IAAcD,kBAAkBC,SAAAA,CAAAA,EAAY;AAC1E,YAAA;AACF,QAAA;;AAGA,QAAA,IAAIC,UAAAA,CAAWD,SAAAA,CAAAA,IAAcI,OAAAA,CAAQJ,SAAAA,CAAAA,IAAcM,YAAYN,SAAAA,CAAAA,EAAY;AACzE,YAAA,MAAM6E,eAAeD,IAAAA,CAAK5E,SAAS,CAAC8E,OAAO,CAAC,KAAA,EAAO,YAAA,CAAA;;YAEnDL,aAAAA,GAAgBlB,GAAAA,CAAIsB,YAAAA,EAAc,EAAC,EAAGJ,aAAAA,CAAAA;AACxC,QAAA;IACF,CAAA,EACA;QAAEM,MAAAA,EAAQzC,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAAMqB,QAAAA,QAAAA,EAAUD,MAAAA,CAAOC,QAAQ,CAACyC,IAAI,CAAC1C,MAAAA;KAAQ,EACvEkC,KAAAA,CAAAA;IAGF,OAAOC,aAAAA;AACT;AAEA,MAAMQ,oBAAoB,IAAIpC,GAAAA,EAAAA;AAE9B,MAAMqC,oBAAoB,OAAOhE,GAAAA,GAAAA;IAC/B,MAAM4B,MAAAA,GAASmC,iBAAAA,CAAkBlC,GAAG,CAAC7B,GAAAA,CAAAA;AACrC,IAAA,IAAI4B,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAME,MAAAA,GAAS,MAAMmC,UAAAA,CAAW,kBAAA,CAAA,CAAoBjE,GAAAA,CAAAA,CACjDkE,YAAY,CAAC/C,QAAAA,CAAAA,CACbgD,cAAc,EAAA,CACdC,KAAK,EAAA;IAERL,iBAAAA,CAAkB1B,GAAG,CAACrC,GAAAA,EAAK8B,MAAAA,CAAAA;IAE3B,OAAOA,MAAAA;AACT;AAEA;;;;;;;;;;;IAYA,MAAMuC,8BAA8B,CAAC9E,KAAAA,GAAAA;IACnC,MAAM+E,WAAAA,GAAclD,MAAAA,CAAOC,QAAQ,CAAC9B,KAAAA,CAAAA;AACpC,IAAA,IACE,WAAC+E,CAAgFC,aAAa,EAC1FC,MAAMC,SAAAA,EACV;QACA,OAAO;YAAEC,aAAAA,EAAe;gBAAE1C,MAAAA,EAAQ;AAAC,oBAAA,QAAA;AAAU,oBAAA,YAAA;AAAc,oBAAA,aAAA;AAAe,oBAAA;AAAY;AAAC;AAAE,SAAA;AAC3F,IAAA;AAEA,IAAA,OAAO,EAAC;AACV;;;;"}
@@ -2,6 +2,10 @@
2
2
 
3
3
  var _ = require('lodash');
4
4
 
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var ___default = /*#__PURE__*/_interopDefault(_);
8
+
5
9
  const keys = {
6
10
  CONFIGURATION: 'configuration'
7
11
  };
@@ -23,7 +27,7 @@ const getModelConfiguration = async (key)=>{
23
27
  const config = await getStore().get({
24
28
  key: configurationKey(key)
25
29
  });
26
- return _.merge({}, EMPTY_CONFIG, config);
30
+ return ___default.default.merge({}, EMPTY_CONFIG, config);
27
31
  };
28
32
  /**
29
33
  * Batch load multiple model configurations in a single query.
@@ -47,7 +51,7 @@ const getModelConfiguration = async (key)=>{
47
51
  const originalKey = result.key.replace(`${STORE_KEY_PREFIX}configuration_`, '');
48
52
  try {
49
53
  const value = typeof result.value === 'string' ? JSON.parse(result.value) : result.value;
50
- configMap[originalKey] = _.merge({}, EMPTY_CONFIG, value);
54
+ configMap[originalKey] = ___default.default.merge({}, EMPTY_CONFIG, value);
51
55
  } catch {
52
56
  strapi.log.warn(`Malformed JSON in core-store key "${result.key}", using default config`);
53
57
  }
@@ -55,7 +59,7 @@ const getModelConfiguration = async (key)=>{
55
59
  // Default missing keys to empty config
56
60
  for (const key of keys){
57
61
  if (!configMap[key]) {
58
- configMap[key] = _.merge({}, EMPTY_CONFIG);
62
+ configMap[key] = ___default.default.merge({}, EMPTY_CONFIG);
59
63
  }
60
64
  }
61
65
  return configMap;
@@ -69,10 +73,10 @@ const setModelConfiguration = async (key, value)=>{
69
73
  };
70
74
  Object.keys(value).forEach((key)=>{
71
75
  if (value[key] !== null && value[key] !== undefined) {
72
- _.set(currentConfig, key, value[key]);
76
+ ___default.default.set(currentConfig, key, value[key]);
73
77
  }
74
78
  });
75
- if (!_.isEqual(currentConfig, storedConfig)) {
79
+ if (!___default.default.isEqual(currentConfig, storedConfig)) {
76
80
  return getStore().set({
77
81
  key: configurationKey(key),
78
82
  value: currentConfig
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sources":["../../../../server/src/services/utils/store.ts"],"sourcesContent":["import _ from 'lodash';\n\nconst keys = {\n CONFIGURATION: 'configuration',\n};\n\nconst STORE_KEY_PREFIX = 'plugin_content_manager_';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'content_manager' });\n\n/** Model configuration */\nconst EMPTY_CONFIG = {\n settings: {},\n metadatas: {},\n layouts: { list: [], edit: [] },\n};\n\nconst configurationKey = (key: any) => `${keys.CONFIGURATION}_${key}`;\n\nconst getModelConfiguration = async (key: any) => {\n const config = await getStore().get({ key: configurationKey(key) });\n return _.merge({}, EMPTY_CONFIG, config);\n};\n\n/**\n * Batch load multiple model configurations in a single query.\n *\n * @param keys - Array of configuration keys (e.g., ['components::sections.hero', ...])\n * @returns Map of key -> configuration object\n */\nconst getModelConfigurations = async (keys: string[]) => {\n if (keys.length === 0) {\n return {};\n }\n\n const configKeys = keys.map((k) => `${STORE_KEY_PREFIX}${configurationKey(k)}`);\n const results = await strapi.db.query('strapi::core-store').findMany({\n where: {\n key: { $in: configKeys },\n },\n });\n\n const configMap: Record<string, any> = {};\n for (const result of results) {\n const originalKey = result.key.replace(`${STORE_KEY_PREFIX}configuration_`, '');\n try {\n const value = typeof result.value === 'string' ? JSON.parse(result.value) : result.value;\n configMap[originalKey] = _.merge({}, EMPTY_CONFIG, value);\n } catch {\n strapi.log.warn(`Malformed JSON in core-store key \"${result.key}\", using default config`);\n }\n }\n\n // Default missing keys to empty config\n for (const key of keys) {\n if (!configMap[key]) {\n configMap[key] = _.merge({}, EMPTY_CONFIG);\n }\n }\n\n return configMap;\n};\n\nconst setModelConfiguration = async (key: string, value: any) => {\n const storedConfig = (await getStore().get({ key: configurationKey(key) })) || {};\n const currentConfig = { ...storedConfig };\n\n Object.keys(value).forEach((key) => {\n if (value[key] !== null && value[key] !== undefined) {\n _.set(currentConfig, key, value[key]);\n }\n });\n\n if (!_.isEqual(currentConfig, storedConfig)) {\n return getStore().set({\n key: configurationKey(key),\n value: currentConfig,\n });\n }\n};\n\nconst deleteKey = (key: any) => {\n return strapi.db\n .query('strapi::core-store')\n .delete({ where: { key: `${STORE_KEY_PREFIX}configuration_${key}` } });\n};\n\nconst findByKey = async (key: any) => {\n const results = await strapi.db.query('strapi::core-store').findMany({\n where: {\n key: {\n $startsWith: key,\n },\n },\n });\n\n return results\n .map(({ key, value }) => {\n try {\n return JSON.parse(value);\n } catch {\n strapi.log.warn(`Malformed JSON in core-store key \"${key}\", skipping entry`);\n return null;\n }\n })\n .filter((v) => v !== null);\n};\n\nconst getAllConfigurations = () => findByKey(`${STORE_KEY_PREFIX}configuration`);\n\nexport default {\n getAllConfigurations,\n findByKey,\n getModelConfiguration,\n getModelConfigurations,\n setModelConfiguration,\n deleteKey,\n keys,\n};\n"],"names":["keys","CONFIGURATION","STORE_KEY_PREFIX","getStore","strapi","store","type","name","EMPTY_CONFIG","settings","metadatas","layouts","list","edit","configurationKey","key","getModelConfiguration","config","get","_","merge","getModelConfigurations","length","configKeys","map","k","results","db","query","findMany","where","$in","configMap","result","originalKey","replace","value","JSON","parse","log","warn","setModelConfiguration","storedConfig","currentConfig","Object","forEach","undefined","set","isEqual","deleteKey","delete","findByKey","$startsWith","filter","v","getAllConfigurations"],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sources":["../../../../server/src/services/utils/store.ts"],"sourcesContent":["import _ from 'lodash';\n\nconst keys = {\n CONFIGURATION: 'configuration',\n};\n\nconst STORE_KEY_PREFIX = 'plugin_content_manager_';\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'content_manager' });\n\n/** Model configuration */\nconst EMPTY_CONFIG = {\n settings: {},\n metadatas: {},\n layouts: { list: [], edit: [] },\n};\n\nconst configurationKey = (key: any) => `${keys.CONFIGURATION}_${key}`;\n\nconst getModelConfiguration = async (key: any) => {\n const config = await getStore().get({ key: configurationKey(key) });\n return _.merge({}, EMPTY_CONFIG, config);\n};\n\n/**\n * Batch load multiple model configurations in a single query.\n *\n * @param keys - Array of configuration keys (e.g., ['components::sections.hero', ...])\n * @returns Map of key -> configuration object\n */\nconst getModelConfigurations = async (keys: string[]) => {\n if (keys.length === 0) {\n return {};\n }\n\n const configKeys = keys.map((k) => `${STORE_KEY_PREFIX}${configurationKey(k)}`);\n const results = await strapi.db.query('strapi::core-store').findMany({\n where: {\n key: { $in: configKeys },\n },\n });\n\n const configMap: Record<string, any> = {};\n for (const result of results) {\n const originalKey = result.key.replace(`${STORE_KEY_PREFIX}configuration_`, '');\n try {\n const value = typeof result.value === 'string' ? JSON.parse(result.value) : result.value;\n configMap[originalKey] = _.merge({}, EMPTY_CONFIG, value);\n } catch {\n strapi.log.warn(`Malformed JSON in core-store key \"${result.key}\", using default config`);\n }\n }\n\n // Default missing keys to empty config\n for (const key of keys) {\n if (!configMap[key]) {\n configMap[key] = _.merge({}, EMPTY_CONFIG);\n }\n }\n\n return configMap;\n};\n\nconst setModelConfiguration = async (key: string, value: any) => {\n const storedConfig = (await getStore().get({ key: configurationKey(key) })) || {};\n const currentConfig = { ...storedConfig };\n\n Object.keys(value).forEach((key) => {\n if (value[key] !== null && value[key] !== undefined) {\n _.set(currentConfig, key, value[key]);\n }\n });\n\n if (!_.isEqual(currentConfig, storedConfig)) {\n return getStore().set({\n key: configurationKey(key),\n value: currentConfig,\n });\n }\n};\n\nconst deleteKey = (key: any) => {\n return strapi.db\n .query('strapi::core-store')\n .delete({ where: { key: `${STORE_KEY_PREFIX}configuration_${key}` } });\n};\n\nconst findByKey = async (key: any) => {\n const results = await strapi.db.query('strapi::core-store').findMany({\n where: {\n key: {\n $startsWith: key,\n },\n },\n });\n\n return results\n .map(({ key, value }) => {\n try {\n return JSON.parse(value);\n } catch {\n strapi.log.warn(`Malformed JSON in core-store key \"${key}\", skipping entry`);\n return null;\n }\n })\n .filter((v) => v !== null);\n};\n\nconst getAllConfigurations = () => findByKey(`${STORE_KEY_PREFIX}configuration`);\n\nexport default {\n getAllConfigurations,\n findByKey,\n getModelConfiguration,\n getModelConfigurations,\n setModelConfiguration,\n deleteKey,\n keys,\n};\n"],"names":["keys","CONFIGURATION","STORE_KEY_PREFIX","getStore","strapi","store","type","name","EMPTY_CONFIG","settings","metadatas","layouts","list","edit","configurationKey","key","getModelConfiguration","config","get","_","merge","getModelConfigurations","length","configKeys","map","k","results","db","query","findMany","where","$in","configMap","result","originalKey","replace","value","JSON","parse","log","warn","setModelConfiguration","storedConfig","currentConfig","Object","forEach","undefined","set","isEqual","deleteKey","delete","findByKey","$startsWith","filter","v","getAllConfigurations"],"mappings":";;;;;;;;AAEA,MAAMA,IAAAA,GAAO;IACXC,aAAAA,EAAe;AACjB,CAAA;AAEA,MAAMC,gBAAAA,GAAmB,yBAAA;AAEzB,MAAMC,QAAAA,GAAW,IAAMC,MAAAA,CAAOC,KAAK,CAAC;QAAEC,IAAAA,EAAM,QAAA;QAAUC,IAAAA,EAAM;AAAkB,KAAA,CAAA;AAE9E,2BACA,MAAMC,YAAAA,GAAe;AACnBC,IAAAA,QAAAA,EAAU,EAAC;AACXC,IAAAA,SAAAA,EAAW,EAAC;IACZC,OAAAA,EAAS;AAAEC,QAAAA,IAAAA,EAAM,EAAE;AAAEC,QAAAA,IAAAA,EAAM;AAAG;AAChC,CAAA;AAEA,MAAMC,gBAAAA,GAAmB,CAACC,GAAAA,GAAa,CAAA,EAAGf,KAAKC,aAAa,CAAC,CAAC,EAAEc,GAAAA,CAAAA,CAAK;AAErE,MAAMC,wBAAwB,OAAOD,GAAAA,GAAAA;AACnC,IAAA,MAAME,MAAAA,GAAS,MAAMd,QAAAA,EAAAA,CAAWe,GAAG,CAAC;AAAEH,QAAAA,GAAAA,EAAKD,gBAAAA,CAAiBC,GAAAA;AAAK,KAAA,CAAA;AACjE,IAAA,OAAOI,kBAAAA,CAAEC,KAAK,CAAC,IAAIZ,YAAAA,EAAcS,MAAAA,CAAAA;AACnC,CAAA;AAEA;;;;;IAMA,MAAMI,yBAAyB,OAAOrB,IAAAA,GAAAA;IACpC,IAAIA,IAAAA,CAAKsB,MAAM,KAAK,CAAA,EAAG;AACrB,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,MAAMC,UAAAA,GAAavB,KAAKwB,GAAG,CAAC,CAACC,CAAAA,GAAM,CAAA,EAAGvB,gBAAAA,CAAAA,EAAmBY,gBAAAA,CAAiBW,CAAAA,CAAAA,CAAAA,CAAI,CAAA;IAC9E,MAAMC,OAAAA,GAAU,MAAMtB,MAAAA,CAAOuB,EAAE,CAACC,KAAK,CAAC,oBAAA,CAAA,CAAsBC,QAAQ,CAAC;QACnEC,KAAAA,EAAO;YACLf,GAAAA,EAAK;gBAAEgB,GAAAA,EAAKR;AAAW;AACzB;AACF,KAAA,CAAA;AAEA,IAAA,MAAMS,YAAiC,EAAC;IACxC,KAAK,MAAMC,UAAUP,OAAAA,CAAS;QAC5B,MAAMQ,WAAAA,GAAcD,MAAAA,CAAOlB,GAAG,CAACoB,OAAO,CAAC,CAAA,EAAGjC,gBAAAA,CAAiB,cAAc,CAAC,EAAE,EAAA,CAAA;QAC5E,IAAI;AACF,YAAA,MAAMkC,KAAAA,GAAQ,OAAOH,MAAAA,CAAOG,KAAK,KAAK,QAAA,GAAWC,IAAAA,CAAKC,KAAK,CAACL,MAAAA,CAAOG,KAAK,CAAA,GAAIH,OAAOG,KAAK;YACxFJ,SAAS,CAACE,YAAY,GAAGf,kBAAAA,CAAEC,KAAK,CAAC,IAAIZ,YAAAA,EAAc4B,KAAAA,CAAAA;AACrD,QAAA,CAAA,CAAE,OAAM;YACNhC,MAAAA,CAAOmC,GAAG,CAACC,IAAI,CAAC,CAAC,kCAAkC,EAAEP,MAAAA,CAAOlB,GAAG,CAAC,uBAAuB,CAAC,CAAA;AAC1F,QAAA;AACF,IAAA;;IAGA,KAAK,MAAMA,OAAOf,IAAAA,CAAM;AACtB,QAAA,IAAI,CAACgC,SAAS,CAACjB,GAAAA,CAAI,EAAE;AACnBiB,YAAAA,SAAS,CAACjB,GAAAA,CAAI,GAAGI,mBAAEC,KAAK,CAAC,EAAC,EAAGZ,YAAAA,CAAAA;AAC/B,QAAA;AACF,IAAA;IAEA,OAAOwB,SAAAA;AACT,CAAA;AAEA,MAAMS,qBAAAA,GAAwB,OAAO1B,GAAAA,EAAaqB,KAAAA,GAAAA;AAChD,IAAA,MAAMM,YAAAA,GAAgB,MAAMvC,QAAAA,EAAAA,CAAWe,GAAG,CAAC;AAAEH,QAAAA,GAAAA,EAAKD,gBAAAA,CAAiBC,GAAAA;AAAK,KAAA,CAAA,IAAO,EAAC;AAChF,IAAA,MAAM4B,aAAAA,GAAgB;AAAE,QAAA,GAAGD;AAAa,KAAA;AAExCE,IAAAA,MAAAA,CAAO5C,IAAI,CAACoC,KAAAA,CAAAA,CAAOS,OAAO,CAAC,CAAC9B,GAAAA,GAAAA;QAC1B,IAAIqB,KAAK,CAACrB,GAAAA,CAAI,KAAK,QAAQqB,KAAK,CAACrB,GAAAA,CAAI,KAAK+B,SAAAA,EAAW;AACnD3B,YAAAA,kBAAAA,CAAE4B,GAAG,CAACJ,aAAAA,EAAe5B,GAAAA,EAAKqB,KAAK,CAACrB,GAAAA,CAAI,CAAA;AACtC,QAAA;AACF,IAAA,CAAA,CAAA;AAEA,IAAA,IAAI,CAACI,kBAAAA,CAAE6B,OAAO,CAACL,eAAeD,YAAAA,CAAAA,EAAe;QAC3C,OAAOvC,QAAAA,EAAAA,CAAW4C,GAAG,CAAC;AACpBhC,YAAAA,GAAAA,EAAKD,gBAAAA,CAAiBC,GAAAA,CAAAA;YACtBqB,KAAAA,EAAOO;AACT,SAAA,CAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAMM,YAAY,CAAClC,GAAAA,GAAAA;AACjB,IAAA,OAAOX,OAAOuB,EAAE,CACbC,KAAK,CAAC,oBAAA,CAAA,CACNsB,MAAM,CAAC;QAAEpB,KAAAA,EAAO;AAAEf,YAAAA,GAAAA,EAAK,CAAA,EAAGb,gBAAAA,CAAiB,cAAc,EAAEa,GAAAA,CAAAA;AAAM;AAAE,KAAA,CAAA;AACxE,CAAA;AAEA,MAAMoC,YAAY,OAAOpC,GAAAA,GAAAA;IACvB,MAAMW,OAAAA,GAAU,MAAMtB,MAAAA,CAAOuB,EAAE,CAACC,KAAK,CAAC,oBAAA,CAAA,CAAsBC,QAAQ,CAAC;QACnEC,KAAAA,EAAO;YACLf,GAAAA,EAAK;gBACHqC,WAAAA,EAAarC;AACf;AACF;AACF,KAAA,CAAA;IAEA,OAAOW,OAAAA,CACJF,GAAG,CAAC,CAAC,EAAET,GAAG,EAAEqB,KAAK,EAAE,GAAA;QAClB,IAAI;YACF,OAAOC,IAAAA,CAAKC,KAAK,CAACF,KAAAA,CAAAA;AACpB,QAAA,CAAA,CAAE,OAAM;YACNhC,MAAAA,CAAOmC,GAAG,CAACC,IAAI,CAAC,CAAC,kCAAkC,EAAEzB,GAAAA,CAAI,iBAAiB,CAAC,CAAA;YAC3E,OAAO,IAAA;AACT,QAAA;AACF,IAAA,CAAA,CAAA,CACCsC,MAAM,CAAC,CAACC,CAAAA,GAAMA,CAAAA,KAAM,IAAA,CAAA;AACzB,CAAA;AAEA,MAAMC,uBAAuB,IAAMJ,SAAAA,CAAU,CAAA,EAAGjD,gBAAAA,CAAiB,aAAa,CAAC,CAAA;AAE/E,iBAAe;AACbqD,IAAAA,oBAAAA;AACAJ,IAAAA,SAAAA;AACAnC,IAAAA,qBAAAA;AACAK,IAAAA,sBAAAA;AACAoB,IAAAA,qBAAAA;AACAQ,IAAAA,SAAAA;AACAjD,IAAAA;AACF,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"collection-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/collection-types.ts"],"names":[],"mappings":";cAoTkB,GAAG;iBAmIA,GAAG;gBA2DJ,GAAG;gBA0BH,GAAG;eAYJ,GAAG;mBA4CC,GAAG;gBAmBN,GAAG;IAoCrB;;;OAGG;iBACgB,GAAG;+BA+FW,GAAG;qBA4Bb,GAAG;uBA8CD,GAAG;mBAyCP,GAAG;iBAyDL,GAAG;oBAwCA,GAAG;6BA6CM,GAAG;wCA2CQ,GAAG;;AAvtB/C,wBAkvBE"}
1
+ {"version":3,"file":"collection-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/collection-types.ts"],"names":[],"mappings":";cAoTkB,GAAG;iBAmIA,GAAG;gBA2DJ,GAAG;gBA0BH,GAAG;eAYJ,GAAG;mBA4CC,GAAG;gBAmBN,GAAG;IAoCrB;;;OAGG;iBACgB,GAAG;+BA+FW,GAAG;qBA4Bb,GAAG;uBA8CD,GAAG;mBAyCP,GAAG;iBAyDL,GAAG;oBAwCA,GAAG;6BAgDM,GAAG;wCA2CQ,GAAG;;AA1tB/C,wBAqvBE"}
@@ -7,6 +7,6 @@ declare const getProhibitedCloningFields: (uid: any, pathPrefix?: string[]) => P
7
7
  * When cloning, if you don't set a field it will be copied from the original entry. So we need to
8
8
  * remove the fields that the user can't create.
9
9
  */
10
- declare const excludeNotCreatableFields: (uid: any, permissionChecker: any) => (body: any, path?: never[]) => any;
10
+ declare const excludeNotCreatableFields: (uid: any, permissionChecker: any) => ((body: any, path?: any[]) => any);
11
11
  export { getProhibitedCloningFields, excludeNotCreatableFields };
12
12
  //# sourceMappingURL=clone.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../../../../server/src/controllers/utils/clone.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAiCvF,QAAA,MAAM,0BAA0B,QACzB,GAAG,eACI,MAAM,EAAE,KACnB,sBAAsB,EAoCxB,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,yBAAyB,QACvB,GAAG,qBAAqB,GAAG,YAC1B,GAAG,qBAAc,GAiCvB,CAAC;AAEJ,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,CAAC"}
1
+ {"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../../../../server/src/controllers/utils/clone.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAiCvF,QAAA,MAAM,0BAA0B,QACzB,GAAG,eACI,MAAM,EAAE,KACnB,sBAAsB,EAoCxB,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,yBAAyB,QACvB,GAAG,qBAAqB,GAAG,KAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,CAkCpE,CAAC;AAEJ,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/services/homepage.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,eAAe,CAAC;AAG3D,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACf,MAAM,uCAAuC,CAAC;AAS/C,QAAA,MAAM,qBAAqB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;oCA0IxB,cAAc,EAAE,GAAG,QAAQ,cAAc,EAAE,CAAC;+CAgCxD,OAAO,MAAM,EAAE,OAAO,CAAC,wBACzB,OAAO,GAC5B,QAAQ,cAAc,EAAE,CAAC;qCAiDW,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;mCAY9C,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;yBAQtD,QAAQ,0BAA0B,CAAC,MAAM,CAAC,CAAC;CAkEzE,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"homepage.d.ts","sourceRoot":"","sources":["../../../../../server/src/homepage/services/homepage.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,eAAe,CAAC;AAG3D,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACf,MAAM,uCAAuC,CAAC;AAS/C,QAAA,MAAM,qBAAqB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;oCAiJxB,cAAc,EAAE,GAAG,QAAQ,cAAc,EAAE,CAAC;+CAgCxD,OAAO,MAAM,EAAE,OAAO,CAAC,wBACzB,OAAO,GAC5B,QAAQ,cAAc,EAAE,CAAC;qCAiDW,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;mCAY9C,QAAQ,2BAA2B,CAAC,MAAM,CAAC,CAAC;yBAQtD,QAAQ,0BAA0B,CAAC,MAAM,CAAC,CAAC;CAkEzE,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -356,7 +356,9 @@ declare const _default: () => {
356
356
  }): any;
357
357
  populateDeep(level?: number): any;
358
358
  withPopulateOverride(overrides: Record<string, any>): any;
359
- build(): Promise<{} | undefined>;
359
+ build(): Promise<string | import("@strapi/types/dist/modules/entity-service/params/populate").ArrayNotation<import("@strapi/types/dist/uid").Schema> | {
360
+ [key: string]: boolean | object;
361
+ } | undefined>;
360
362
  };
361
363
  uid: ({ strapi }: {
362
364
  strapi: import("@strapi/types/dist/core").Strapi;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBAUE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBAUE"}
@@ -1 +1 @@
1
- {"version":3,"file":"collection-handlers.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/handlers/collection-handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AA+BxD,KAAK,kBAAkB,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AA4BF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,QAChC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA6DvF,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAC/B,IAAI,cAAc,eACd,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAG1D;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAyD3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,6BAA6B,QAClC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAgC3C,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,QAClC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA6D3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,6BAA6B,QAClC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAyC3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,8BAA8B,QACnC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA+C3C,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,QACrC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAoD3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,mCAAmC,QACxC,IAAI,cAAc,eACd,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAG1D;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAuC3C,CAAC"}
1
+ {"version":3,"file":"collection-handlers.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/handlers/collection-handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAgCxD,KAAK,kBAAkB,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AA4BF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,QAChC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAkEvF,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAC/B,IAAI,cAAc,eACd,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAG1D;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAuD3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,6BAA6B,QAClC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA+B3C,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,QAClC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA4D3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,6BAA6B,QAClC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA2C3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,8BAA8B,QACnC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA8C3C,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,QACrC,IAAI,cAAc,cACf,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAmD3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,mCAAmC,QACxC,IAAI,cAAc,eACd,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAG1D;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAsC3C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"single-type-handlers.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/handlers/single-type-handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AA0BxD,KAAK,gBAAgB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5C,KAAK,aAAa,GAAG,gBAAgB,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;CAAE,CAAC;AAC3E,KAAK,mBAAmB,GAAG,gBAAgB,GAAG;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AACzE,KAAK,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAM1E;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,WACvB,KAAK,MAAM,OACd,IAAI,UAAU,WACV,QAAQ,GAAG,CAAC,iBAAiB,QAChC,eAAe,KACpB,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAiF1C,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAC3B,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAuElF,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAC7B,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAE3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,yBAAyB,QAC9B,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAqDrF,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAC/B,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAgDrF,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,QACjC,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAwDxF,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,+BAA+B,QACpC,IAAI,UAAU,eACV,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC5C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA4CrF,CAAC"}
1
+ {"version":3,"file":"single-type-handlers.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/handlers/single-type-handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AA2BxD,KAAK,gBAAgB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5C,KAAK,aAAa,GAAG,gBAAgB,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;CAAE,CAAC;AAC3E,KAAK,mBAAmB,GAAG,gBAAgB,GAAG;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AACzE,KAAK,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAM1E;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,WACvB,KAAK,MAAM,OACd,IAAI,UAAU,WACV,QAAQ,GAAG,CAAC,iBAAiB,QAChC,eAAe,KACpB,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA+E1C,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAC3B,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAqElF,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAC7B,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,iBAGzD;IACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAE3C,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,yBAAyB,QAC9B,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAsDrF,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAC/B,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA+CrF,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,QACjC,IAAI,UAAU,cACX,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC3C;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CAuDxF,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,+BAA+B,QACpC,IAAI,UAAU,eACV,KAAK,MAAM,WAAW,QAAQ,GAAG,CAAC,iBAAiB,gBAC5C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,KAAG,QAAQ,QAAQ,GAAG,CAAC,oBAAoB,CA2CrF,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { Core } from '@strapi/types';
2
2
  /**
3
- * Registers derived content-type MCP tools during plugin bootstrap, before the MCP HTTP server starts.
3
+ * Registers derived content-type MCP tools via strapi.ai.mcp.registerTool().
4
+ * Must be called from the plugin register phase, before the MCP HTTP server starts.
4
5
  */
5
6
  export declare const registerContentManagerMcpTools: ({ strapi, }: {
6
7
  strapi: Core.Strapi;
@@ -1 +1 @@
1
- {"version":3,"file":"register-content-manager-mcp-tools.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/register-content-manager-mcp-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAK1C;;GAEG;AACH,eAAO,MAAM,8BAA8B,gBAExC;IACD,MAAM,EAAE,KAAK,MAAM,CAAC;CACrB,KAAG,QAAQ,IAAI,CAyBf,CAAC"}
1
+ {"version":3,"file":"register-content-manager-mcp-tools.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/register-content-manager-mcp-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAK1C;;;GAGG;AACH,eAAO,MAAM,8BAA8B,gBAExC;IACD,MAAM,EAAE,KAAK,MAAM,CAAC;CACrB,KAAG,QAAQ,IAAI,CA2Bf,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { UID } from '@strapi/types';
2
+ declare const MANY_RELATION_TYPES: Set<string>;
3
+ /**
4
+ * Canonical "is this relation a list" predicate for the MCP output boundary.
5
+ * Both the runtime shaping (reduceToIdentity) and the registered output schemas
6
+ * (output-schemas.ts) MUST use this single definition — the MCP SDK validates
7
+ * structuredContent against the schema, so any divergence fails the tool call.
8
+ * Intentionally broader than `relations.isAnyToMany` from @strapi/utils, which
9
+ * ignores `manyWay` and the morph variants.
10
+ */
11
+ export declare const isManyRelationForMcp: (attribute: {
12
+ relation?: string;
13
+ }) => boolean;
14
+ type RelationIdentity = {
15
+ documentId: string;
16
+ locale?: string;
17
+ __type?: string;
18
+ status?: string;
19
+ };
20
+ /**
21
+ * Reduces a populated relation value to identity-only shape.
22
+ *
23
+ * to-one → { documentId, locale?, __type? } | null
24
+ * to-many → Array<{ documentId, locale?, __type? }> ([] when empty)
25
+ */
26
+ declare const reduceToIdentity: (attribute: {
27
+ relation?: string;
28
+ }, value: unknown) => RelationIdentity | RelationIdentity[] | null;
29
+ /**
30
+ * Applies identity shaping to all relation fields in a document, including
31
+ * nested fields inside components, dynamic zones, and `localizations`.
32
+ *
33
+ * This covers leak family #1 (relation targets) and #2 (localizations full draft rows)
34
+ * with the same single mechanism.
35
+ */
36
+ export declare const shapeRelationsForMcp: (uid: UID.Schema, data: Record<string, unknown>) => Promise<Record<string, unknown>>;
37
+ export { reduceToIdentity, MANY_RELATION_TYPES };
38
+ //# sourceMappingURL=shape-relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-relations.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/sanitizers/shape-relations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAIzC,QAAA,MAAM,mBAAmB,aAMvB,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,cAAe;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OACrB,CAAC;AAEpD,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAqCF;;;;;GAKG;AACH,QAAA,MAAM,gBAAgB,cACT;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,SACzB,OAAO,KACb,gBAAgB,GAAG,gBAAgB,EAAE,GAAG,IAsB1C,CAAC;AA0BF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QAC1B,IAAI,MAAM,QACT,OAAO,MAAM,EAAE,OAAO,CAAC,KAC5B,QAAQ,OAAO,MAAM,EAAE,OAAO,CAAC,CAUjC,CAAC;AAGF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -21,9 +21,6 @@ export declare function buildComponentInputSchema(strapi: Core.Strapi, component
21
21
  * here to avoid a cross-package import from @strapi/content-manager into
22
22
  * @strapi/core (which is not a listed dependency).
23
23
  *
24
- * TODO — custom fields call `strapi.get('custom-fields')` at schema-build
25
- * time; confirm with an integration test that the registry is populated when MCP
26
- * tools are registered (post-bootstrap).
27
24
  */
28
25
  export declare const attributeToInputSchema: (strapi: Core.Strapi, attr: Schema.Attribute.AnyAttribute, visited?: Set<string>) => z.ZodTypeAny;
29
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"data-schema.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/data-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,CAAC,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAc1D;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,GAC/B,CAAC,CAAC,UAAU,CA2Bd;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,WACzB,KAAK,MAAM,QACb,OAAO,SAAS,CAAC,YAAY,YAC1B,IAAI,MAAM,CAAC,KACnB,EAAE,UAiNJ,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,WAClB,KAAK,MAAM,UACX,OAAO,iBAAiB,GAAG,yBAAyB,cAChD,OAAO,gBAAgB,oBACjB,IAAI,MAAM,CAAC,GAAG,IAAI,KACnC,EAAE,UAmBJ,CAAC"}
1
+ {"version":3,"file":"data-schema.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/data-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,CAAC,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAc1D;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,GAC/B,CAAC,CAAC,UAAU,CA2Bd;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,WACzB,KAAK,MAAM,QACb,OAAO,SAAS,CAAC,YAAY,YAC1B,IAAI,MAAM,CAAC,KACnB,EAAE,UAiNJ,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,WAClB,KAAK,MAAM,UACX,OAAO,iBAAiB,GAAG,yBAAyB,cAChD,OAAO,gBAAgB,oBACjB,IAAI,MAAM,CAAC,GAAG,IAAI,KACnC,EAAE,UAmBJ,CAAC"}
@@ -12,7 +12,7 @@ export declare const buildDocumentOutputSchema: (attributes: Struct.SchemaAttrib
12
12
  export declare const buildListOutputSchema: (attributes: Struct.SchemaAttributes, readFields: Set<string> | null) => z.ZodObject<z.ZodRawShape>;
13
13
  /**
14
14
  * Builds the MCP output schema for a delete response (`{ data }`).
15
- * Field shape is constrained to `readFields` when non-null (RBAC field filtering).
15
+ * Delete handlers return an empty data object, so do not require document relation fields.
16
16
  */
17
- export declare const buildDeleteOutputSchema: (attributes: Struct.SchemaAttributes, readFields: Set<string> | null) => z.ZodObject<z.ZodRawShape>;
17
+ export declare const buildDeleteOutputSchema: (_attributes: Struct.SchemaAttributes, _readFields: Set<string> | null) => z.ZodObject<z.ZodRawShape>;
18
18
  //# sourceMappingURL=output-schemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"output-schemas.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/output-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAmB5C;;;GAGG;AACH,eAAO,MAAM,yBAAyB,eACxB,OAAO,gBAAgB,cACvB,IAAI,MAAM,CAAC,GAAG,IAAI,KAC7B,EAAE,SAAS,CAAC,EAAE,WAAW,CAWhB,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,qBAAqB,eACpB,OAAO,gBAAgB,cACvB,IAAI,MAAM,CAAC,GAAG,IAAI,KAC7B,EAAE,SAAS,CAAC,EAAE,WAAW,CAWhB,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eACtB,OAAO,gBAAgB,cACvB,IAAI,MAAM,CAAC,GAAG,IAAI,KAC7B,EAAE,SAAS,CAAC,EAAE,WAAW,CAKhB,CAAC"}
1
+ {"version":3,"file":"output-schemas.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/output-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAoD5C;;;GAGG;AACH,eAAO,MAAM,yBAAyB,eACxB,OAAO,gBAAgB,cACvB,IAAI,MAAM,CAAC,GAAG,IAAI,KAC7B,EAAE,SAAS,CAAC,EAAE,WAAW,CAWhB,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,qBAAqB,eACpB,OAAO,gBAAgB,cACvB,IAAI,MAAM,CAAC,GAAG,IAAI,KAC7B,EAAE,SAAS,CAAC,EAAE,WAAW,CAWhB,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,uBAAuB,gBAErB,OAAO,gBAAgB,eAEvB,IAAI,MAAM,CAAC,GAAG,IAAI,KAC9B,EAAE,SAAS,CAAC,EAAE,WAAW,CAKhB,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Struct, Modules } from '@strapi/types';
1
+ import type { Struct, Modules, Core } from '@strapi/types';
2
2
  import type { z } from '@strapi/utils';
3
3
  export type ContentManagerModelForMcp = Pick<Struct.ContentTypeSchema, 'uid' | 'kind' | 'options'> & {
4
4
  /** Present on content-manager DTOs from data-mapper.toContentManagerModel */
@@ -26,6 +26,6 @@ export type DerivedTool = {
26
26
  auth: Modules.MCP.McpCapabilityAuth;
27
27
  resolveInputSchema: (context: Modules.MCP.McpHandlerContext) => z.ZodObject<z.ZodRawShape>;
28
28
  resolveOutputSchema: (context: Modules.MCP.McpHandlerContext) => z.ZodObject<z.ZodRawShape>;
29
- createHandler: (strapi: import('@strapi/types').Core.Strapi, context: Modules.MCP.McpHandlerContext) => Modules.MCP.McpToolHandler<z.ZodObject<z.ZodRawShape>, z.ZodObject<z.ZodRawShape>>;
29
+ createHandler: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) => Modules.MCP.McpToolHandler<z.ZodObject<z.ZodRawShape>, z.ZodObject<z.ZodRawShape>>;
30
30
  };
31
31
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,MAAM,CAAC,iBAAiB,EACxB,KAAK,GAAG,MAAM,GAAG,SAAS,CAC3B,GAAG;IACF,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC,gBAAgB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,gFAAgF;IAChF,WAAW,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1C,mFAAmF;IACnF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QAAE,MAAM,EAAE,iBAAiB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACpC,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC3F,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC5F,aAAa,EAAE,CACb,MAAM,EAAE,OAAO,eAAe,EAAE,IAAI,CAAC,MAAM,EAC3C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KACnC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;CACzF,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,MAAM,CAAC,iBAAiB,EACxB,KAAK,GAAG,MAAM,GAAG,SAAS,CAC3B,GAAG;IACF,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC,gBAAgB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,gFAAgF;IAChF,WAAW,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1C,mFAAmF;IACnF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QAAE,MAAM,EAAE,iBAAiB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACpC,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC3F,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC5F,aAAa,EAAE,CACb,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KACnC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;CACzF,CAAC"}