@strapi/content-manager 5.61.1 → 5.62.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 (260) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +1 -1
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
  6. package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
  7. package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
  8. package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
  9. package/dist/admin/history/components/VersionInputRenderer.js +7 -2
  10. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  11. package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
  12. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  13. package/dist/admin/hooks/useContentManagerInitData.js +27 -8
  14. package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
  15. package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
  16. package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocument.js +11 -13
  18. package/dist/admin/hooks/useDocument.js.map +1 -1
  19. package/dist/admin/hooks/useDocument.mjs +11 -13
  20. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  21. package/dist/admin/hooks/useI18nFieldLock.js +169 -0
  22. package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
  23. package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
  24. package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
  25. package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
  26. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  27. package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
  28. package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
  29. package/dist/admin/index.js +5 -0
  30. package/dist/admin/index.js.map +1 -1
  31. package/dist/admin/index.mjs +2 -0
  32. package/dist/admin/index.mjs.map +1 -1
  33. package/dist/admin/modules/app.js +8 -1
  34. package/dist/admin/modules/app.js.map +1 -1
  35. package/dist/admin/modules/app.mjs +8 -2
  36. package/dist/admin/modules/app.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/EditViewPage.js +129 -127
  38. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  39. package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
  40. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
  42. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
  44. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
  50. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
  53. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
  54. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
  55. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
  56. package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
  57. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
  58. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
  59. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
  60. package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
  61. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
  62. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
  64. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
  66. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
  68. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
  74. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
  76. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
  78. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
  79. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
  80. package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
  81. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
  82. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
  84. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
  86. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
  88. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -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 +18 -5
  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 +54 -6
  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 +54 -6
  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 +11 -9
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
  100. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
  102. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
  104. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
  106. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
  108. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  109. package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
  110. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  111. package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
  112. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  113. package/dist/admin/pages/EditView/utils/data.js +14 -9
  114. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  115. package/dist/admin/pages/EditView/utils/data.mjs +14 -9
  116. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  117. package/dist/admin/pages/EditView/utils/forms.js +34 -0
  118. package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
  119. package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
  120. package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
  121. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
  122. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  123. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
  124. package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
  125. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
  126. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  127. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
  128. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
  129. package/dist/admin/pages/ListView/ListViewPage.js +11 -2
  130. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  131. package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
  132. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  133. package/dist/admin/pages/ListView/components/Filters.js +15 -5
  134. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  135. package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
  136. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  137. package/dist/admin/preview/components/InputPopover.js +18 -8
  138. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  139. package/dist/admin/preview/components/InputPopover.mjs +19 -9
  140. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  141. package/dist/admin/preview/pages/Preview.js +5 -16
  142. package/dist/admin/preview/pages/Preview.js.map +1 -1
  143. package/dist/admin/preview/pages/Preview.mjs +5 -16
  144. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  145. package/dist/admin/preview/utils/fieldUtils.js +2 -0
  146. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  147. package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
  148. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  149. package/dist/admin/services/api.js +2 -1
  150. package/dist/admin/services/api.js.map +1 -1
  151. package/dist/admin/services/api.mjs +2 -1
  152. package/dist/admin/services/api.mjs.map +1 -1
  153. package/dist/admin/services/documents.js +21 -1
  154. package/dist/admin/services/documents.js.map +1 -1
  155. package/dist/admin/services/documents.mjs +21 -2
  156. package/dist/admin/services/documents.mjs.map +1 -1
  157. package/dist/admin/services/relations.js +47 -1
  158. package/dist/admin/services/relations.js.map +1 -1
  159. package/dist/admin/services/relations.mjs +47 -2
  160. package/dist/admin/services/relations.mjs.map +1 -1
  161. package/dist/admin/src/exports.d.ts +2 -0
  162. package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
  163. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
  164. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  165. package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
  166. package/dist/admin/src/modules/app.d.ts +4 -1
  167. package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
  168. package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
  169. package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
  170. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
  171. package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
  172. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
  173. package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
  174. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
  175. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
  176. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
  177. package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
  178. package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
  179. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  180. package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
  181. package/dist/admin/src/services/api.d.ts +1 -1
  182. package/dist/admin/src/services/components.d.ts +2 -2
  183. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  184. package/dist/admin/src/services/documents.d.ts +25 -21
  185. package/dist/admin/src/services/homepage.d.ts +1 -1
  186. package/dist/admin/src/services/init.d.ts +1 -1
  187. package/dist/admin/src/services/relations.d.ts +5 -3
  188. package/dist/admin/src/services/uid.d.ts +3 -3
  189. package/dist/admin/translations/en.json.js +41 -0
  190. package/dist/admin/translations/en.json.js.map +1 -1
  191. package/dist/admin/translations/en.json.mjs +41 -0
  192. package/dist/admin/translations/en.json.mjs.map +1 -1
  193. package/dist/server/controllers/relations.js +4 -2
  194. package/dist/server/controllers/relations.js.map +1 -1
  195. package/dist/server/controllers/relations.mjs +4 -2
  196. package/dist/server/controllers/relations.mjs.map +1 -1
  197. package/dist/server/controllers/utils/metadata.js +3 -1
  198. package/dist/server/controllers/utils/metadata.js.map +1 -1
  199. package/dist/server/controllers/utils/metadata.mjs +3 -1
  200. package/dist/server/controllers/utils/metadata.mjs.map +1 -1
  201. package/dist/server/history/services/utils.js +3 -1
  202. package/dist/server/history/services/utils.js.map +1 -1
  203. package/dist/server/history/services/utils.mjs +3 -1
  204. package/dist/server/history/services/utils.mjs.map +1 -1
  205. package/dist/server/homepage/services/homepage-query-utils.js +14 -0
  206. package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
  207. package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
  208. package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
  209. package/dist/server/homepage/services/homepage.js +1 -1
  210. package/dist/server/homepage/services/homepage.js.map +1 -1
  211. package/dist/server/homepage/services/homepage.mjs +2 -2
  212. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  213. package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
  214. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
  215. package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
  216. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
  217. package/dist/server/mcp/schemas/output-schemas.js +2 -1
  218. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  219. package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
  220. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  221. package/dist/server/services/document-manager.js +3 -2
  222. package/dist/server/services/document-manager.js.map +1 -1
  223. package/dist/server/services/document-manager.mjs +3 -2
  224. package/dist/server/services/document-manager.mjs.map +1 -1
  225. package/dist/server/services/document-metadata.js +92 -4
  226. package/dist/server/services/document-metadata.js.map +1 -1
  227. package/dist/server/services/document-metadata.mjs +92 -4
  228. package/dist/server/services/document-metadata.mjs.map +1 -1
  229. package/dist/server/services/permission-checker.js +20 -8
  230. package/dist/server/services/permission-checker.js.map +1 -1
  231. package/dist/server/services/permission-checker.mjs +20 -8
  232. package/dist/server/services/permission-checker.mjs.map +1 -1
  233. package/dist/server/services/uid.js +2 -1
  234. package/dist/server/services/uid.js.map +1 -1
  235. package/dist/server/services/uid.mjs +2 -1
  236. package/dist/server/services/uid.mjs.map +1 -1
  237. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  238. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  239. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  240. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  241. package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
  242. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  243. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  244. package/dist/server/src/index.d.ts +21 -7
  245. package/dist/server/src/index.d.ts.map +1 -1
  246. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
  247. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  248. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  249. package/dist/server/src/services/document-metadata.d.ts +5 -1
  250. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  251. package/dist/server/src/services/index.d.ts +21 -7
  252. package/dist/server/src/services/index.d.ts.map +1 -1
  253. package/dist/server/src/services/permission-checker.d.ts +6 -5
  254. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  255. package/dist/server/src/services/uid.d.ts.map +1 -1
  256. package/dist/shared/contracts/collection-types.d.ts +7 -0
  257. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  258. package/dist/shared/contracts/single-types.d.ts +4 -0
  259. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  260. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"shape-relations.mjs","sources":["../../../../server/src/mcp/sanitizers/shape-relations.ts"],"sourcesContent":["import { traverseEntity } from '@strapi/utils';\nimport type { UID } from '@strapi/types';\n\n// Relations whose cardinality is \"many\" — maps to Array output.\n// Includes non-owning variants and morph-many.\nconst MANY_RELATION_TYPES = new Set([\n 'oneToMany',\n 'manyToMany',\n 'manyWay',\n 'morphToMany',\n 'morphMany',\n]);\n\n/**\n * Canonical \"is this relation a list\" predicate for the MCP output boundary.\n * Both the runtime shaping (reduceToIdentity) and the registered output schemas\n * (output-schemas.ts) MUST use this single definition — the MCP SDK validates\n * structuredContent against the schema, so any divergence fails the tool call.\n * Intentionally broader than `relations.isAnyToMany` from @strapi/utils, which\n * ignores `manyWay` and the morph variants.\n */\nexport const isManyRelationForMcp = (attribute: { relation?: string }): boolean =>\n MANY_RELATION_TYPES.has(attribute.relation ?? '');\n\ntype RelationIdentity = {\n documentId: string;\n locale?: string;\n __type?: string;\n status?: string;\n};\n\n/**\n * Extracts identity fields from a single relation entry.\n * Returns undefined when the entry has no documentId (e.g. a bare {count} object).\n */\nconst pickIdentity = (entry: unknown): RelationIdentity | undefined => {\n if (entry === null || typeof entry !== 'object') {\n return undefined;\n }\n\n const obj = entry as Record<string, unknown>;\n\n if (typeof obj.documentId !== 'string') {\n return undefined;\n }\n\n const identity: RelationIdentity = { documentId: obj.documentId };\n\n if (typeof obj.locale === 'string') {\n identity.locale = obj.locale;\n }\n\n if (typeof obj.__type === 'string') {\n identity.__type = obj.__type;\n }\n\n // Preserve the computed publish status on `localizations` entries — it is\n // calculated by formatDocumentWithMetadata BEFORE shaping (calculate, then strip).\n // Non-localization relation entries never carry a string `status`, so this is a no-op for them.\n if (typeof obj.status === 'string') {\n identity.status = obj.status;\n }\n\n return identity;\n};\n\n/**\n * Reduces a populated relation value to identity-only shape.\n *\n * to-one → { documentId, locale?, __type? } | null\n * to-many → Array<{ documentId, locale?, __type? }> ([] when empty)\n */\nconst reduceToIdentity = (\n attribute: { relation?: string },\n value: unknown\n): RelationIdentity | RelationIdentity[] | null => {\n const isMany = isManyRelationForMcp(attribute);\n\n if (isMany) {\n if (Array.isArray(value)) {\n return value.map(pickIdentity).filter((v): v is RelationIdentity => v !== undefined);\n }\n // defensive: { count: N } or null/undefined → empty array\n return [];\n }\n\n // to-one\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n // should not happen, but guard: treat first element\n return pickIdentity(value[0]) ?? null;\n }\n\n return pickIdentity(value) ?? null;\n};\n\n/**\n * Post-sanitize shaping visitor.\n * Reduces every relation attribute to identity-only (documentId + locale? + __type?).\n * Skips admin::user relations — those are out of scope and preserved as-is.\n */\nconst shapeRelationToIdentity: Parameters<typeof traverseEntity>[0] = (\n { key, value, attribute },\n { set }\n) => {\n if (attribute?.type !== 'relation') {\n return;\n }\n\n const target = (attribute as { target?: string }).target;\n\n // Out of scope — admin user records are preserved untouched (tracked separately).\n if (target === 'admin::user') {\n return;\n }\n\n // @ts-expect-error — reduceToIdentity returns a narrower type; traverseEntity Data allows unknown\n set(key, reduceToIdentity(attribute as { relation?: string }, value));\n};\n\n/**\n * Applies identity shaping to all relation fields in a document, including\n * nested fields inside components, dynamic zones, and `localizations`.\n *\n * This covers leak family #1 (relation targets) and #2 (localizations full draft rows)\n * with the same single mechanism.\n */\nexport const shapeRelationsForMcp = async (\n uid: UID.Schema,\n data: Record<string, unknown>\n): Promise<Record<string, unknown>> => {\n return traverseEntity(\n shapeRelationToIdentity,\n {\n schema: strapi.getModel(uid),\n getModel: strapi.getModel.bind(strapi),\n },\n // @ts-expect-error — traverseEntity expects Data; post-sanitize documents are compatible at runtime\n data\n );\n};\n\n// Export for unit-testing without a full strapi instance\nexport { reduceToIdentity, MANY_RELATION_TYPES };\n"],"names":["MANY_RELATION_TYPES","Set","isManyRelationForMcp","attribute","has","relation","pickIdentity","entry","undefined","obj","documentId","identity","locale","__type","status","reduceToIdentity","value","isMany","Array","isArray","map","filter","v","shapeRelationToIdentity","key","set","type","target","shapeRelationsForMcp","uid","data","traverseEntity","schema","strapi","getModel","bind"],"mappings":"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"}
1
+ {"version":3,"file":"shape-relations.mjs","sources":["../../../../server/src/mcp/sanitizers/shape-relations.ts"],"sourcesContent":["import { traverseEntity } from '@strapi/utils';\nimport type { UID } from '@strapi/types';\n\n// Relations whose cardinality is \"many\" — maps to Array output.\n// Includes non-owning variants and morph-many.\nconst MANY_RELATION_TYPES = new Set([\n 'oneToMany',\n 'manyToMany',\n 'manyWay',\n 'morphToMany',\n 'morphMany',\n]);\n\n/**\n * Canonical \"is this relation a list\" predicate for the MCP output boundary.\n * Both the runtime shaping (reduceToIdentity) and the registered output schemas\n * (output-schemas.ts) MUST use this single definition — the MCP SDK validates\n * structuredContent against the schema, so any divergence fails the tool call.\n * Intentionally broader than `relations.isAnyToMany` from @strapi/utils, which\n * ignores `manyWay` and the morph variants.\n */\nexport const isManyRelationForMcp = (attribute: { relation?: string }): boolean =>\n MANY_RELATION_TYPES.has(attribute.relation ?? '');\n\ntype RelationIdentity = {\n documentId: string;\n locale?: string;\n __type?: string;\n status?: string;\n};\n\n/**\n * Extracts identity fields from a single relation entry.\n * Returns undefined when the entry has no documentId (e.g. a bare {count} object).\n */\nconst pickIdentity = (entry: unknown): RelationIdentity | undefined => {\n if (entry === null || typeof entry !== 'object') {\n return undefined;\n }\n\n const obj = entry as Record<string, unknown>;\n\n if (typeof obj.documentId !== 'string') {\n return undefined;\n }\n\n const identity: RelationIdentity = { documentId: obj.documentId };\n\n if (typeof obj.locale === 'string') {\n identity.locale = obj.locale;\n }\n\n if (typeof obj.__type === 'string') {\n identity.__type = obj.__type;\n }\n\n // Preserve the computed publish status on `localizations` entries — it is\n // calculated by formatDocumentWithMetadata BEFORE shaping (calculate, then strip).\n // Non-localization relation entries never carry a string `status`, so this is a no-op for them.\n if (typeof obj.status === 'string') {\n identity.status = obj.status;\n }\n\n return identity;\n};\n\n/**\n * Reduces a populated relation value to identity-only shape.\n *\n * to-one → { documentId, locale?, __type? } | null\n * to-many → Array<{ documentId, locale?, __type? }> ([] when empty)\n */\nconst reduceToIdentity = (\n attribute: { relation?: string },\n value: unknown\n): RelationIdentity | RelationIdentity[] | null => {\n const isMany = isManyRelationForMcp(attribute);\n\n if (isMany) {\n if (Array.isArray(value)) {\n return value.map(pickIdentity).filter((v): v is RelationIdentity => v !== undefined);\n }\n // defensive: { count: N } or null/undefined → empty array\n return [];\n }\n\n // to-one\n if (value === null || value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n // should not happen, but guard: treat first element\n return pickIdentity(value[0]) ?? null;\n }\n\n return pickIdentity(value) ?? null;\n};\n\n/**\n * Post-sanitize shaping visitor.\n * Reduces every relation attribute to identity-only (documentId + locale? + __type?).\n * Skips admin::user relations — those are out of scope and preserved as-is.\n */\nconst shapeRelationToIdentity: Parameters<typeof traverseEntity>[0] = (\n { key, value, attribute },\n { set }\n) => {\n if (attribute?.type !== 'relation') {\n return;\n }\n\n const target = (attribute as { target?: string }).target;\n\n // Out of scope — admin user records are preserved untouched (tracked separately).\n if (target === 'admin::user') {\n return;\n }\n\n set(key, reduceToIdentity(attribute as { relation?: string }, value));\n};\n\n/**\n * Applies identity shaping to all relation fields in a document, including\n * nested fields inside components, dynamic zones, and `localizations`.\n *\n * This covers leak family #1 (relation targets) and #2 (localizations full draft rows)\n * with the same single mechanism.\n */\nexport const shapeRelationsForMcp = async (\n uid: UID.Schema,\n data: Record<string, unknown>\n): Promise<Record<string, unknown>> => {\n return traverseEntity(\n shapeRelationToIdentity,\n {\n schema: strapi.getModel(uid),\n getModel: strapi.getModel.bind(strapi),\n },\n data\n );\n};\n\n// Export for unit-testing without a full strapi instance\nexport { reduceToIdentity, MANY_RELATION_TYPES };\n"],"names":["MANY_RELATION_TYPES","Set","isManyRelationForMcp","attribute","has","relation","pickIdentity","entry","undefined","obj","documentId","identity","locale","__type","status","reduceToIdentity","value","isMany","Array","isArray","map","filter","v","shapeRelationToIdentity","key","set","type","target","shapeRelationsForMcp","uid","data","traverseEntity","schema","strapi","getModel","bind"],"mappings":"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"}
@@ -44,7 +44,8 @@ const buildOutputDataSchema = (attributes, permittedFields)=>{
44
44
  data: buildOutputDataSchema(attributes, readFields).nullable(),
45
45
  meta: strapiUtils.z.object({
46
46
  availableLocales: strapiUtils.z.array(strapiUtils.z.record(strapiUtils.z.string(), strapiUtils.z.unknown())).optional(),
47
- availableStatus: strapiUtils.z.array(strapiUtils.z.record(strapiUtils.z.string(), strapiUtils.z.unknown())).optional()
47
+ availableStatus: strapiUtils.z.array(strapiUtils.z.record(strapiUtils.z.string(), strapiUtils.z.unknown())).optional(),
48
+ defaultLocale: strapiUtils.z.string().nullable().optional()
48
49
  }).optional()
49
50
  }).loose();
50
51
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"output-schemas.js","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":"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"}
1
+ {"version":3,"file":"output-schemas.js","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n defaultLocale: z.string().nullable().optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","defaultLocale","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":"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"}
@@ -42,7 +42,8 @@ const buildOutputDataSchema = (attributes, permittedFields)=>{
42
42
  data: buildOutputDataSchema(attributes, readFields).nullable(),
43
43
  meta: z.object({
44
44
  availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),
45
- availableStatus: z.array(z.record(z.string(), z.unknown())).optional()
45
+ availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),
46
+ defaultLocale: z.string().nullable().optional()
46
47
  }).optional()
47
48
  }).loose();
48
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"output-schemas.mjs","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":"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"}
1
+ {"version":3,"file":"output-schemas.mjs","sources":["../../../../server/src/mcp/schemas/output-schemas.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\n\nimport { isManyRelationForMcp } from '../sanitizers/shape-relations';\n\nconst relationIdentity = z.object({\n documentId: z.string(),\n locale: z.string().optional(),\n __type: z.string().optional(),\n // Computed publish status preserved on `localizations` entries (calculate, then strip).\n status: z.string().optional(),\n});\n\nconst buildAttributeSchema = (key: string, attributes: Struct.SchemaAttributes): z.ZodTypeAny => {\n const attribute = attributes[key];\n\n if (attribute?.type !== 'relation') {\n return z.unknown().optional();\n }\n\n // admin::user relations are out of scope — left as unknown\n if ((attribute as { target?: string }).target === 'admin::user') {\n return z.unknown().optional();\n }\n\n // Must match the runtime shaping cardinality (shape-relations.ts) — the MCP SDK\n // validates structuredContent against this schema, so a mismatch fails the tool call.\n if (isManyRelationForMcp(attribute as { relation?: string })) {\n return z.array(relationIdentity).optional();\n }\n\n return relationIdentity.nullable().optional();\n};\n\nconst buildOutputDataSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields: Set<string> | null\n): z.ZodTypeAny => {\n const readableKeys = Object.keys(attributes).filter(\n (key) => permittedFields === null || permittedFields.has(key)\n );\n\n if (readableKeys.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n\n const shape = Object.fromEntries(\n readableKeys.map((key) => [key, buildAttributeSchema(key, attributes)])\n );\n\n return z.object(shape).loose();\n};\n\n/**\n * Builds the MCP output schema for a single-document response (`{ data, meta }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildDocumentOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: buildOutputDataSchema(attributes, readFields).nullable(),\n meta: z\n .object({\n availableLocales: z.array(z.record(z.string(), z.unknown())).optional(),\n availableStatus: z.array(z.record(z.string(), z.unknown())).optional(),\n defaultLocale: z.string().nullable().optional(),\n })\n .optional(),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a paginated list response (`{ results, pagination }`).\n * Field shape is constrained to `readFields` when non-null (RBAC field filtering).\n */\nexport const buildListOutputSchema = (\n attributes: Struct.SchemaAttributes,\n readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n results: z.array(buildOutputDataSchema(attributes, readFields)),\n pagination: z.object({\n page: z.number(),\n pageSize: z.number(),\n pageCount: z.number(),\n total: z.number(),\n }),\n })\n .loose();\n\n/**\n * Builds the MCP output schema for a delete response (`{ data }`).\n * Delete handlers return an empty data object, so do not require document relation fields.\n */\nexport const buildDeleteOutputSchema = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _attributes: Struct.SchemaAttributes,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _readFields: Set<string> | null\n): z.ZodObject<z.ZodRawShape> =>\n z\n .object({\n data: z.object({}).loose().nullable(),\n })\n .loose();\n"],"names":["relationIdentity","z","object","documentId","string","locale","optional","__type","status","buildAttributeSchema","key","attributes","attribute","type","unknown","target","isManyRelationForMcp","array","nullable","buildOutputDataSchema","permittedFields","readableKeys","Object","keys","filter","has","length","record","shape","fromEntries","map","loose","buildDocumentOutputSchema","readFields","data","meta","availableLocales","availableStatus","defaultLocale","buildListOutputSchema","results","pagination","page","number","pageSize","pageCount","total","buildDeleteOutputSchema","_attributes","_readFields"],"mappings":"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"}
@@ -100,8 +100,9 @@ const documentManager = ({ strapi })=>{
100
100
  },
101
101
  async clone (id, body, uid) {
102
102
  const populate$1 = await populate.buildDeepPopulate(uid);
103
- // Extract the locale to pass it as a plain param
104
- const locale = body?.locale;
103
+ // Extract the locale to pass it as a plain param. The clone route accepts a null locale,
104
+ // which the document service handles like an absent one: pass undefined instead.
105
+ const locale = body?.locale ?? undefined;
105
106
  const params = {
106
107
  // Ensure id and documentId are not copied to the clone
107
108
  data: _.omit(body, [
@@ -1 +1 @@
1
- {"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, flow } from 'lodash';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = <T extends object>(document: T) =>\n omit(document, PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = <T extends object>(document: T) => omit(document, 'id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * The document service has no publish, unpublish or discardDraft methods\n * for content types without draft and publish\n */\n const assertDraftAndPublish = (uid: UID.ContentType) => {\n if (contentTypes.hasDraftAndPublish(strapi.getModel(uid)) === false) {\n throw new errors.ValidationError('Draft and publish is not enabled for this content type');\n }\n };\n\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = flow(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(body, ['id', 'documentId']),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n assertDraftAndPublish(uid);\n\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","document","omit","omitIdField","documentManager","strapi","assertDraftAndPublish","uid","hasDraftAndPublish","getModel","errors","ValidationError","findOne","id","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","flow","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":"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"}
1
+ {"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, flow } from 'lodash';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = <T extends object>(document: T) =>\n omit(document, PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = <T extends object>(document: T) => omit(document, 'id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * The document service has no publish, unpublish or discardDraft methods\n * for content types without draft and publish\n */\n const assertDraftAndPublish = (uid: UID.ContentType) => {\n if (contentTypes.hasDraftAndPublish(strapi.getModel(uid)) === false) {\n throw new errors.ValidationError('Draft and publish is not enabled for this content type');\n }\n };\n\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = flow(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param. The clone route accepts a null locale,\n // which the document service handles like an absent one: pass undefined instead.\n const locale = body?.locale ?? undefined;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(body, ['id', 'documentId']),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n assertDraftAndPublish(uid);\n\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","document","omit","omitIdField","documentManager","strapi","assertDraftAndPublish","uid","hasDraftAndPublish","getModel","errors","ValidationError","findOne","id","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","flow","data","clone","body","undefined","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":"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"}
@@ -98,8 +98,9 @@ const documentManager = ({ strapi })=>{
98
98
  },
99
99
  async clone (id, body, uid) {
100
100
  const populate = await buildDeepPopulate(uid);
101
- // Extract the locale to pass it as a plain param
102
- const locale = body?.locale;
101
+ // Extract the locale to pass it as a plain param. The clone route accepts a null locale,
102
+ // which the document service handles like an absent one: pass undefined instead.
103
+ const locale = body?.locale ?? undefined;
103
104
  const params = {
104
105
  // Ensure id and documentId are not copied to the clone
105
106
  data: omit(body, [
@@ -1 +1 @@
1
- {"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, flow } from 'lodash';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = <T extends object>(document: T) =>\n omit(document, PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = <T extends object>(document: T) => omit(document, 'id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * The document service has no publish, unpublish or discardDraft methods\n * for content types without draft and publish\n */\n const assertDraftAndPublish = (uid: UID.ContentType) => {\n if (contentTypes.hasDraftAndPublish(strapi.getModel(uid)) === false) {\n throw new errors.ValidationError('Draft and publish is not enabled for this content type');\n }\n };\n\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = flow(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param\n const locale = body?.locale;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(body, ['id', 'documentId']),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n assertDraftAndPublish(uid);\n\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","document","omit","omitIdField","documentManager","strapi","assertDraftAndPublish","uid","hasDraftAndPublish","getModel","errors","ValidationError","findOne","id","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","flow","data","clone","body","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":"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"}
1
+ {"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, flow } from 'lodash';\n\nimport { contentTypes, errors, pagination } from '@strapi/utils';\nimport type { Core, Modules, UID } from '@strapi/types';\n\nimport { buildDeepPopulate, getDeepPopulate, getDeepPopulateDraftCount } from './utils/populate';\nimport { EMPTY_DRAFT_RELATION_COUNTS } from './utils/draft-relations';\nimport { sumDraftCounts } from './utils/draft';\n\ntype DocService = Modules.Documents.ServiceInstance;\ntype DocServiceParams<TAction extends keyof DocService> = Parameters<DocService[TAction]>[0];\nexport type Document = Modules.Documents.Result<UID.ContentType>;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = <T extends object>(document: T) =>\n omit(document, PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = <T extends object>(document: T) => omit(document, 'id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\n /**\n * The document service has no publish, unpublish or discardDraft methods\n * for content types without draft and publish\n */\n const assertDraftAndPublish = (uid: UID.ContentType) => {\n if (contentTypes.hasDraftAndPublish(strapi.getModel(uid)) === false) {\n throw new errors.ValidationError('Draft and publish is not enabled for this content type');\n }\n };\n\n return {\n async findOne(\n id: string,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'findOne'>, 'documentId'> = {}\n ) {\n return strapi.documents(uid).findOne({ ...opts, documentId: id });\n },\n\n /**\n * Find multiple (or all) locales for a document\n */\n async findLocales(\n id: string | string[] | undefined,\n uid: UID.CollectionType,\n opts: {\n populate?: Modules.Documents.Params.Pick<any, 'populate'>;\n locale?: string | string[] | '*';\n isPublished?: boolean;\n }\n ) {\n // Will look for a specific locale by default\n const where: any = {};\n\n // Might not have an id if querying a single type\n if (id) {\n where.documentId = id;\n }\n\n // Search in array of locales\n if (Array.isArray(opts.locale)) {\n where.locale = { $in: opts.locale };\n } else if (opts.locale && opts.locale !== '*') {\n // Look for a specific locale, ignore if looking for all locales\n where.locale = opts.locale;\n }\n\n // Published is passed, so we filter on it, otherwise we don't filter\n if (typeof opts.isPublished === 'boolean') {\n where.publishedAt = { $notNull: opts.isPublished };\n }\n\n return strapi.db.query(uid).findMany({ populate: opts.populate, where });\n },\n\n async findMany(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n return strapi.documents(uid).findMany(params);\n },\n\n async findPage(opts: DocServiceParams<'findMany'>, uid: UID.CollectionType) {\n const params = pagination.withDefaultPagination(opts || {}, {\n maxLimit: 1000,\n });\n\n const { populate: _populate, sort: _sort, ...countParams } = params;\n const [documents, total = 0] = await Promise.all([\n strapi.documents(uid).findMany(params),\n strapi.documents(uid).count(countParams),\n ]);\n\n return {\n results: documents,\n pagination: pagination.transformPagedPaginationInfo(params, total),\n };\n },\n\n async create(uid: UID.CollectionType, opts: DocServiceParams<'create'> = {} as any) {\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, status: 'draft' as const, populate };\n\n return strapi.documents(uid).create(params);\n },\n\n async update(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'update'>, 'documentId'> = {} as any\n ) {\n const publishData = flow(omitPublishedAtField, omitIdField)(opts.data || {});\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, data: publishData, populate, status: 'draft' };\n\n return strapi.documents(uid).update({ ...params, documentId: id });\n },\n\n async clone(\n id: Modules.Documents.ID,\n body: Partial<Modules.Documents.Params.Data.Input<UID.CollectionType>>,\n uid: UID.CollectionType\n ) {\n const populate = await buildDeepPopulate(uid);\n\n // Extract the locale to pass it as a plain param. The clone route accepts a null locale,\n // which the document service handles like an absent one: pass undefined instead.\n const locale = body?.locale ?? undefined;\n const params = {\n // Ensure id and documentId are not copied to the clone\n data: omit(body, ['id', 'documentId']),\n locale,\n populate,\n };\n\n return strapi\n .documents(uid)\n .clone({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n /**\n * Check if a document exists\n */\n async exists(uid: UID.CollectionType, id?: string) {\n // Collection type\n if (id) {\n const count = await strapi.db.query(uid).count({ where: { documentId: id } });\n return count > 0;\n }\n\n // Single type\n const count = await strapi.db.query(uid).count();\n return count > 0;\n },\n\n async delete(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'delete'>, 'documentId'> = {} as any\n ) {\n await strapi.documents(uid).delete({\n ...opts,\n documentId: id,\n });\n return {};\n },\n\n // FIXME: handle relations\n async deleteMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: DocServiceParams<'findMany'> & { locale?: string } = {}\n ) {\n const deletedEntries = await strapi.db.transaction(async () => {\n return Promise.all(documentIds.map(async (id) => this.delete(id, uid, opts)));\n });\n\n return { count: deletedEntries.length };\n },\n\n async publish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'publish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .publish({ ...params, documentId: id })\n .then((result) => result?.entries);\n },\n\n async publishMany(uid: UID.ContentType, documentIds: string[], locale?: string | string[]) {\n assertDraftAndPublish(uid);\n\n return strapi.db.transaction(async () => {\n const results = await Promise.all(\n documentIds.map((documentId) => this.publish(documentId, uid, { locale, populate: {} }))\n );\n\n const publishedEntitiesCount = results.flat().filter(Boolean).length;\n return publishedEntitiesCount;\n });\n },\n\n async unpublishMany(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const unpublishedEntries = await strapi.db.transaction(async () => {\n return Promise.all(\n documentIds.map((id) =>\n strapi\n .documents(uid)\n .unpublish({ ...opts, documentId: id, populate: {} })\n .then((result) => result?.entries)\n )\n );\n });\n\n const unpublishedEntitiesCount = unpublishedEntries.flat().filter(Boolean).length;\n\n // Return the number of unpublished entities\n return { count: unpublishedEntitiesCount };\n },\n\n async unpublish(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'unpublish'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .unpublish({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async discardDraft(\n id: Modules.Documents.ID,\n uid: UID.CollectionType,\n opts: Omit<DocServiceParams<'discardDraft'>, 'documentId'> & { populate?: object } = {} as any\n ) {\n assertDraftAndPublish(uid);\n\n const populate = opts.populate ?? (await buildDeepPopulate(uid));\n const params = { ...opts, populate };\n\n return strapi\n .documents(uid)\n .discardDraft({ ...params, documentId: id })\n .then((result) => result?.entries.at(0));\n },\n\n async countDraftRelations(id: string, uid: UID.ContentType, locale: string) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n return EMPTY_DRAFT_RELATION_COUNTS;\n }\n\n return sumDraftCounts(strapi, document, uid);\n },\n\n async countManyEntriesDraftRelations(\n documentIds: Modules.Documents.ID[],\n uid: UID.CollectionType,\n locale: string | string[]\n ) {\n const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n if (!hasRelations) {\n return 0;\n }\n\n const entities = await strapi.documents(uid).findMany({\n populate,\n filters: { documentId: { $in: documentIds } } as any,\n locale,\n status: 'draft',\n });\n\n const counts = await Promise.all(\n entities.map((entity: Document) => sumDraftCounts(strapi, entity, uid))\n );\n\n return counts.reduce(\n (total, entityCounts) =>\n total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks,\n 0\n );\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","document","omit","omitIdField","documentManager","strapi","assertDraftAndPublish","uid","hasDraftAndPublish","getModel","errors","ValidationError","findOne","id","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","_populate","sort","_sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","flow","data","clone","body","undefined","then","result","entries","at","exists","delete","deleteMany","documentIds","deletedEntries","transaction","map","length","publish","publishMany","publishedEntitiesCount","flat","filter","Boolean","unpublishMany","unpublishedEntries","unpublish","unpublishedEntitiesCount","discardDraft","countDraftRelations","hasRelations","getDeepPopulateDraftCount","EMPTY_DRAFT_RELATION_COUNTS","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts","unpublishedRelations","draftM2mLinks"],"mappings":"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"}
@@ -47,6 +47,35 @@ const AVAILABLE_LOCALES_FIELDS = [
47
47
  'createdAt',
48
48
  'publishedAt'
49
49
  ];
50
+ /**
51
+ * Convert dotted populate paths (`comp.mid.inners`) into a nested populate object
52
+ * the query-params transformer understands.
53
+ */ const dottedPathsToPopulate = (paths)=>{
54
+ const root = {};
55
+ for (const path of paths){
56
+ const parts = path.split('.').filter(Boolean);
57
+ let node = root;
58
+ for (const [i, part] of parts.entries()){
59
+ const isLast = i === parts.length - 1;
60
+ if (isLast) {
61
+ if (node[part] === undefined) {
62
+ node[part] = true;
63
+ }
64
+ continue;
65
+ }
66
+ const current = node[part];
67
+ if (current === true || current === undefined) {
68
+ node[part] = {
69
+ populate: {}
70
+ };
71
+ } else if (typeof current === 'object' && current !== null && !('populate' in current)) {
72
+ current.populate = {};
73
+ }
74
+ node = node[part].populate;
75
+ }
76
+ }
77
+ return root;
78
+ };
50
79
  /** Returns a DB filter that matches the opposite publish status. */ const oppositePublishStatus = (publishedAt)=>publishedAt !== null ? {
51
80
  $null: true
52
81
  } : {
@@ -74,7 +103,7 @@ var documentMetadata = (({ strapi })=>({
74
103
  * The result is sorted with the default locale (as defined by the i18n plugin)
75
104
  * at index 0 when present. This is the canonical-source invariant relied on by
76
105
  * `useDocument.getInitialFormValues` in the admin: when creating a new locale
77
- * draft, non-localized scalar/media values are inherited from
106
+ * draft, non-localized scalar/media/component/dynamic-zone values are inherited from
78
107
  * `availableLocales[0]`. Putting the default locale first means inheritance
79
108
  * stays predictable when sibling locales have drifted on non-localized fields
80
109
  * (which can happen because the server only syncs non-localized fields at
@@ -223,11 +252,22 @@ var documentMetadata = (({ strapi })=>({
223
252
  const model = strapi.getModel(uid);
224
253
  const hasDnP = strapiUtils.contentTypes.hasDraftAndPublish(model);
225
254
  const isLocalized = strapi.localization.isLocalizedContentType(model);
255
+ // Resolve once for all return paths — admin lock logic needs this even when
256
+ // the current locale is excluded from `availableLocales`.
257
+ let defaultLocale = null;
258
+ if (isLocalized) {
259
+ try {
260
+ defaultLocale = await strapi.localization.getDefaultLocale() ?? null;
261
+ } catch {
262
+ defaultLocale = null;
263
+ }
264
+ }
226
265
  if (!availableLocales && !availableStatus) {
227
266
  // Nothing to compute.
228
267
  return {
229
268
  availableLocales: [],
230
269
  availableStatus: [],
270
+ defaultLocale,
231
271
  versions: []
232
272
  };
233
273
  }
@@ -236,6 +276,7 @@ var documentMetadata = (({ strapi })=>({
236
276
  return {
237
277
  availableLocales: [],
238
278
  availableStatus: [],
279
+ defaultLocale,
239
280
  versions: []
240
281
  };
241
282
  }
@@ -257,16 +298,19 @@ var documentMetadata = (({ strapi })=>({
257
298
  availableStatus: otherVersion ? [
258
299
  _.pick(otherVersion, AVAILABLE_STATUS_FIELDS)
259
300
  ] : [],
301
+ defaultLocale,
260
302
  versions: []
261
303
  };
262
304
  }
263
305
  // Full path for localized content types
264
306
  // TODO: Ignore publishedAt if availableStatus=false, and ignore locale if
265
307
  // i18n is disabled
266
- // Include non-translatable scalar and media fields in availableLocales for i18n prefilling
308
+ // Include non-translatable fields in availableLocales for i18n prefilling
309
+ // (scalars + media + components + dynamic zones; relations stay server-filled).
267
310
  let nonLocalizedFields = [];
268
311
  let nonLocalizedMediaFields = [];
269
312
  // Without a localization provider there are no non-localized attributes.
313
+ let nestedPopulate = {};
270
314
  try {
271
315
  if (model?.attributes !== undefined) {
272
316
  const allNonLocalized = strapi.localization.getNonLocalizedAttributes(model);
@@ -276,11 +320,52 @@ var documentMetadata = (({ strapi })=>({
276
320
  // Separate scalar fields (can be in fields array) from media fields (need to be populated)
277
321
  nonLocalizedFields = allNonLocalized.filter((field)=>field in model.attributes && scalarAttrs.includes(field));
278
322
  nonLocalizedMediaFields = allNonLocalized.filter((field)=>field in model.attributes && mediaAttrs.includes(field));
323
+ const getNestedPopulate = strapi.localization.getNestedPopulateOfNonLocalizedAttributes;
324
+ if (typeof getNestedPopulate === 'function') {
325
+ const buildNestedPopulate = (schemaUID, populate = dottedPathsToPopulate(getNestedPopulate(schemaUID)))=>{
326
+ const schema = strapi.getModel(schemaUID);
327
+ return Object.fromEntries(Object.entries(populate).map(([field, value])=>{
328
+ const attribute = schema?.attributes[field];
329
+ if (attribute?.type === 'dynamiczone') {
330
+ return [
331
+ field,
332
+ {
333
+ on: attribute.components.reduce((acc, componentUID)=>{
334
+ acc[componentUID] = {
335
+ populate: buildNestedPopulate(componentUID)
336
+ };
337
+ return acc;
338
+ }, {})
339
+ }
340
+ ];
341
+ }
342
+ if (attribute?.type === 'component' && typeof value === 'object' && value !== null && 'populate' in value) {
343
+ return [
344
+ field,
345
+ {
346
+ populate: buildNestedPopulate(attribute.component, value.populate)
347
+ }
348
+ ];
349
+ }
350
+ return [
351
+ field,
352
+ value
353
+ ];
354
+ }));
355
+ };
356
+ nestedPopulate = buildNestedPopulate(uid);
357
+ } else {
358
+ const componentAndDzFields = allNonLocalized.filter((field)=>field in model.attributes && (model.attributes[field]?.type === 'component' || model.attributes[field]?.type === 'dynamiczone'));
359
+ nestedPopulate = componentAndDzFields.reduce((acc, field)=>{
360
+ acc[field] = true;
361
+ return acc;
362
+ }, {});
363
+ }
279
364
  }
280
365
  } catch {
281
366
  // The provider errored — fall back to no prefilled non-localized fields
282
367
  }
283
- // Build populate object for non-localized media fields
368
+ // Build populate object for non-localized media + nested component/DZ fields
284
369
  const mediaPopulate = nonLocalizedMediaFields.reduce((acc, field)=>{
285
370
  acc[field] = {
286
371
  populate: {
@@ -291,6 +376,7 @@ var documentMetadata = (({ strapi })=>({
291
376
  }, {});
292
377
  const params = {
293
378
  populate: {
379
+ ...nestedPopulate,
294
380
  ...mediaPopulate,
295
381
  ...AVAILABLE_STATUS_POPULATE
296
382
  },
@@ -314,6 +400,7 @@ var documentMetadata = (({ strapi })=>({
314
400
  availableStatus: availableStatusResult ? [
315
401
  availableStatusResult
316
402
  ] : [],
403
+ defaultLocale,
317
404
  versions
318
405
  };
319
406
  },
@@ -327,7 +414,8 @@ var documentMetadata = (({ strapi })=>({
327
414
  data: document,
328
415
  meta: {
329
416
  availableLocales: [],
330
- availableStatus: []
417
+ availableStatus: [],
418
+ defaultLocale: null
331
419
  }
332
420
  };
333
421
  }