@strapi/content-manager 5.49.0 → 5.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/dist/admin/layout.js +3 -1
  2. package/dist/admin/layout.js.map +1 -1
  3. package/dist/admin/layout.mjs +5 -3
  4. package/dist/admin/layout.mjs.map +1 -1
  5. package/dist/admin/pages/EditView/components/DocumentActions.js +161 -72
  6. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  7. package/dist/admin/pages/EditView/components/DocumentActions.mjs +161 -73
  8. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +6 -1
  10. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
  12. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +6 -2
  14. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -2
  16. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +6 -1
  18. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +6 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/utils/draftRelationCounts.js +117 -0
  22. package/dist/admin/pages/EditView/utils/draftRelationCounts.js.map +1 -0
  23. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs +109 -0
  24. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs.map +1 -0
  25. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +1 -1
  26. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  27. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +1 -1
  28. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  29. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +2 -2
  30. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  31. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs +2 -2
  32. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs.map +1 -1
  33. package/dist/admin/pages/ListView/components/TableCells/Relations.js +1 -1
  34. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  35. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs +1 -1
  36. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
  37. package/dist/admin/preview/pages/Preview.js +38 -11
  38. package/dist/admin/preview/pages/Preview.js.map +1 -1
  39. package/dist/admin/preview/pages/Preview.mjs +39 -12
  40. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  41. package/dist/admin/preview/utils/constants.js +9 -15
  42. package/dist/admin/preview/utils/constants.js.map +1 -1
  43. package/dist/admin/preview/utils/constants.mjs +10 -15
  44. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  45. package/dist/admin/src/components/InjectionZone.d.ts +1 -2
  46. package/dist/admin/src/content-manager.d.ts +15 -15
  47. package/dist/admin/src/history/services/historyVersion.d.ts +2 -2
  48. package/dist/admin/src/hooks/useContentTypeSchema.d.ts +1 -1
  49. package/dist/admin/src/hooks/useDocument.d.ts +8 -9
  50. package/dist/admin/src/hooks/useDocumentLayout.d.ts +3 -3
  51. package/dist/admin/src/hooks/useDragAndDrop.d.ts +4 -4
  52. package/dist/admin/src/hooks/useKeyboardDragAndDrop.d.ts +1 -1
  53. package/dist/admin/src/hooks/usePersistentQueryParams.d.ts +0 -1
  54. package/dist/admin/src/modules/app.d.ts +5 -5
  55. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +1 -1
  56. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +12 -1
  57. package/dist/admin/src/pages/EditView/components/EditorToolbarObserver.d.ts +1 -1
  58. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +1 -1
  59. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +2 -2
  60. package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -2
  61. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +4 -4
  62. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  63. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +19 -20
  64. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +12 -12
  65. package/dist/admin/src/pages/EditView/utils/draftRelationCounts.d.ts +26 -0
  66. package/dist/admin/src/pages/ListView/components/BulkActions/PublishAction.d.ts +1 -1
  67. package/dist/admin/src/pages/ListView/components/Filters.d.ts +1 -1
  68. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +1 -1
  69. package/dist/admin/src/preview/utils/constants.d.ts +1 -7
  70. package/dist/admin/src/preview/utils/getSendMessage.d.ts +0 -1
  71. package/dist/admin/src/services/documents.d.ts +30 -70
  72. package/dist/admin/src/services/relations.d.ts +6 -20
  73. package/dist/admin/src/services/uid.d.ts +5 -5
  74. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +4 -4
  75. package/dist/admin/src/utils/users.d.ts +1 -1
  76. package/dist/admin/src/utils/validation.d.ts +1 -1
  77. package/dist/admin/translations/en.json.js +5 -2
  78. package/dist/admin/translations/en.json.js.map +1 -1
  79. package/dist/admin/translations/en.json.mjs +5 -2
  80. package/dist/admin/translations/en.json.mjs.map +1 -1
  81. package/dist/admin/translations/ja.json.js +262 -87
  82. package/dist/admin/translations/ja.json.js.map +1 -1
  83. package/dist/admin/translations/ja.json.mjs +262 -87
  84. package/dist/admin/translations/ja.json.mjs.map +1 -1
  85. package/dist/server/controllers/collection-types.js +2 -2
  86. package/dist/server/controllers/collection-types.js.map +1 -1
  87. package/dist/server/controllers/collection-types.mjs +2 -2
  88. package/dist/server/controllers/collection-types.mjs.map +1 -1
  89. package/dist/server/controllers/single-types.js +2 -2
  90. package/dist/server/controllers/single-types.js.map +1 -1
  91. package/dist/server/controllers/single-types.mjs +2 -2
  92. package/dist/server/controllers/single-types.mjs.map +1 -1
  93. package/dist/server/preview/controllers/preview.js +9 -0
  94. package/dist/server/preview/controllers/preview.js.map +1 -1
  95. package/dist/server/preview/controllers/preview.mjs +9 -0
  96. package/dist/server/preview/controllers/preview.mjs.map +1 -1
  97. package/dist/server/preview/controllers/previewScript.js +1450 -0
  98. package/dist/server/preview/routes/preview.js +11 -0
  99. package/dist/server/preview/routes/preview.js.map +1 -1
  100. package/dist/server/preview/routes/preview.mjs +11 -0
  101. package/dist/server/preview/routes/preview.mjs.map +1 -1
  102. package/dist/server/services/document-manager.js +13 -19
  103. package/dist/server/services/document-manager.js.map +1 -1
  104. package/dist/server/services/document-manager.mjs +13 -19
  105. package/dist/server/services/document-manager.mjs.map +1 -1
  106. package/dist/server/services/utils/draft-relations.js +9 -0
  107. package/dist/server/services/utils/draft-relations.js.map +1 -0
  108. package/dist/server/services/utils/draft-relations.mjs +7 -0
  109. package/dist/server/services/utils/draft-relations.mjs.map +1 -0
  110. package/dist/server/services/utils/draft.js +118 -25
  111. package/dist/server/services/utils/draft.js.map +1 -1
  112. package/dist/server/services/utils/draft.mjs +118 -25
  113. package/dist/server/services/utils/draft.mjs.map +1 -1
  114. package/dist/server/services/utils/populate.js +15 -1
  115. package/dist/server/services/utils/populate.js.map +1 -1
  116. package/dist/server/services/utils/populate.mjs +15 -1
  117. package/dist/server/services/utils/populate.mjs.map +1 -1
  118. package/dist/server/src/controllers/index.d.ts +1 -1
  119. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  120. package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
  121. package/dist/server/src/controllers/utils/document-status.d.ts +1 -1
  122. package/dist/server/src/controllers/utils/document-status.d.ts.map +1 -1
  123. package/dist/server/src/controllers/utils/metadata.d.ts +5 -5
  124. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  125. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  126. package/dist/server/src/controllers/validation/index.d.ts +3 -3
  127. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  128. package/dist/server/src/controllers/validation/model-configuration.d.ts.map +1 -1
  129. package/dist/server/src/controllers/validation/relations.d.ts +2 -2
  130. package/dist/server/src/history/controllers/history-version.d.ts +1 -7
  131. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  132. package/dist/server/src/history/controllers/index.d.ts +2 -1
  133. package/dist/server/src/history/controllers/index.d.ts.map +1 -1
  134. package/dist/server/src/history/controllers/validation/history-version.d.ts +1 -1
  135. package/dist/server/src/history/services/history.d.ts +0 -2
  136. package/dist/server/src/history/services/history.d.ts.map +1 -1
  137. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  138. package/dist/server/src/history/services/utils.d.ts +3 -3
  139. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  140. package/dist/server/src/history/utils.d.ts +1 -18
  141. package/dist/server/src/history/utils.d.ts.map +1 -1
  142. package/dist/server/src/homepage/controllers/homepage.d.ts +0 -1
  143. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
  144. package/dist/server/src/homepage/controllers/index.d.ts +2 -1
  145. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -1
  146. package/dist/server/src/homepage/index.d.ts +4 -8
  147. package/dist/server/src/homepage/index.d.ts.map +1 -1
  148. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  149. package/dist/server/src/homepage/services/homepage.d.ts +3 -4
  150. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  151. package/dist/server/src/homepage/services/index.d.ts +4 -8
  152. package/dist/server/src/homepage/services/index.d.ts.map +1 -1
  153. package/dist/server/src/index.d.ts +79 -85
  154. package/dist/server/src/index.d.ts.map +1 -1
  155. package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts.map +1 -1
  156. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
  157. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
  158. package/dist/server/src/mcp/permissions.d.ts +1 -1
  159. package/dist/server/src/mcp/permissions.d.ts.map +1 -1
  160. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  161. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
  162. package/dist/server/src/mcp/schemas/blocks-schema.d.ts.map +1 -1
  163. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
  164. package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -1
  165. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  166. package/dist/server/src/mcp/schemas/sort-schema.d.ts.map +1 -1
  167. package/dist/server/src/mcp/utils.d.ts.map +1 -1
  168. package/dist/server/src/middlewares/routing.d.ts.map +1 -1
  169. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  170. package/dist/server/src/policies/index.d.ts.map +1 -1
  171. package/dist/server/src/preview/controllers/index.d.ts +2 -1
  172. package/dist/server/src/preview/controllers/index.d.ts.map +1 -1
  173. package/dist/server/src/preview/controllers/preview.d.ts +5 -0
  174. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -1
  175. package/dist/server/src/preview/controllers/validation/preview.d.ts +1 -2
  176. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  177. package/dist/server/src/preview/routes/preview.d.ts.map +1 -1
  178. package/dist/server/src/preview/services/index.d.ts +1 -1
  179. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  180. package/dist/server/src/preview/services/preview-config.d.ts +1 -1
  181. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  182. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  183. package/dist/server/src/preview/utils.d.ts +1 -16
  184. package/dist/server/src/preview/utils.d.ts.map +1 -1
  185. package/dist/server/src/services/components.d.ts +2 -2
  186. package/dist/server/src/services/components.d.ts.map +1 -1
  187. package/dist/server/src/services/configuration.d.ts.map +1 -1
  188. package/dist/server/src/services/content-types.d.ts.map +1 -1
  189. package/dist/server/src/services/data-mapper.d.ts +5 -5
  190. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  191. package/dist/server/src/services/document-manager.d.ts +14 -14
  192. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  193. package/dist/server/src/services/document-metadata.d.ts +6 -6
  194. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  195. package/dist/server/src/services/field-sizes.d.ts +2 -2
  196. package/dist/server/src/services/field-sizes.d.ts.map +1 -1
  197. package/dist/server/src/services/index.d.ts +78 -84
  198. package/dist/server/src/services/index.d.ts.map +1 -1
  199. package/dist/server/src/services/metrics.d.ts.map +1 -1
  200. package/dist/server/src/services/permission-checker.d.ts +12 -31
  201. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  202. package/dist/server/src/services/permission.d.ts.map +1 -1
  203. package/dist/server/src/services/populate-builder.d.ts +4 -4
  204. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  205. package/dist/server/src/services/uid.d.ts.map +1 -1
  206. package/dist/server/src/services/utils/configuration/attributes.d.ts.map +1 -1
  207. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  208. package/dist/server/src/services/utils/count.d.ts.map +1 -1
  209. package/dist/server/src/services/utils/draft-relations.d.ts +19 -0
  210. package/dist/server/src/services/utils/draft-relations.d.ts.map +1 -0
  211. package/dist/server/src/services/utils/draft.d.ts +8 -7
  212. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  213. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  214. package/dist/server/src/services/utils/store.d.ts.map +1 -1
  215. package/dist/server/src/utils/index.d.ts.map +1 -1
  216. package/dist/server/src/validation/policies/hasPermissions.d.ts +1 -1
  217. package/dist/server/src/validation/zod.d.ts +1 -1
  218. package/dist/server/src/validation/zod.d.ts.map +1 -1
  219. package/dist/shared/contracts/collection-types.d.ts +4 -1
  220. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  221. package/dist/shared/contracts/single-types.d.ts +4 -1
  222. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  223. package/package.json +8 -8
  224. package/dist/admin/preview/utils/previewScript.js +0 -1068
  225. package/dist/admin/preview/utils/previewScript.js.map +0 -1
  226. package/dist/admin/preview/utils/previewScript.mjs +0 -1066
  227. package/dist/admin/preview/utils/previewScript.mjs.map +0 -1
  228. package/dist/admin/src/preview/utils/previewScript.d.ts +0 -32
@@ -17,6 +17,17 @@ const previewRouter = {
17
17
  'admin::isAuthenticatedAdmin'
18
18
  ]
19
19
  }
20
+ },
21
+ {
22
+ method: 'GET',
23
+ info,
24
+ path: '/preview/script',
25
+ handler: 'preview.getPreviewScript',
26
+ // Public: the script is non-sensitive (it runs on the user's public site) and
27
+ // is convenience-fetched by the admin to inject into the preview iframe.
28
+ config: {
29
+ auth: false
30
+ }
20
31
  }
21
32
  ]
22
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sources":["../../../../server/src/preview/routes/preview.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nconst info = { pluginName: 'content-manager', type: 'admin' };\n\nconst previewRouter: Plugin.LoadedPlugin['routes'][string] = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n info,\n path: '/preview/url/:contentType',\n handler: 'preview.getPreviewUrl',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n\nexport { previewRouter };\n"],"names":["info","pluginName","type","previewRouter","routes","method","path","handler","config","policies"],"mappings":";;AAEA,MAAMA,IAAAA,GAAO;IAAEC,UAAAA,EAAY,iBAAA;IAAmBC,IAAAA,EAAM;AAAQ,CAAA;AAE5D,MAAMC,aAAAA,GAAuD;IAC3DD,IAAAA,EAAM,OAAA;IACNE,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAAA,EAAM,2BAAA;YACNC,OAAAA,EAAS,uBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH;;;;"}
1
+ {"version":3,"file":"preview.js","sources":["../../../../server/src/preview/routes/preview.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nconst info = { pluginName: 'content-manager', type: 'admin' };\n\nconst previewRouter: Plugin.LoadedPlugin['routes'][string] = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n info,\n path: '/preview/url/:contentType',\n handler: 'preview.getPreviewUrl',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n info,\n path: '/preview/script',\n handler: 'preview.getPreviewScript',\n // Public: the script is non-sensitive (it runs on the user's public site) and\n // is convenience-fetched by the admin to inject into the preview iframe.\n config: {\n auth: false,\n },\n },\n ],\n};\n\nexport { previewRouter };\n"],"names":["info","pluginName","type","previewRouter","routes","method","path","handler","config","policies","auth"],"mappings":";;AAEA,MAAMA,IAAAA,GAAO;IAAEC,UAAAA,EAAY,iBAAA;IAAmBC,IAAAA,EAAM;AAAQ,CAAA;AAE5D,MAAMC,aAAAA,GAAuD;IAC3DD,IAAAA,EAAM,OAAA;IACNE,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAAA,EAAM,2BAAA;YACNC,OAAAA,EAAS,uBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAAA,EAAM,iBAAA;YACNC,OAAAA,EAAS,0BAAA;;;YAGTC,MAAAA,EAAQ;gBACNE,IAAAA,EAAM;AACR;AACF;AACD;AACH;;;;"}
@@ -15,6 +15,17 @@ const previewRouter = {
15
15
  'admin::isAuthenticatedAdmin'
16
16
  ]
17
17
  }
18
+ },
19
+ {
20
+ method: 'GET',
21
+ info,
22
+ path: '/preview/script',
23
+ handler: 'preview.getPreviewScript',
24
+ // Public: the script is non-sensitive (it runs on the user's public site) and
25
+ // is convenience-fetched by the admin to inject into the preview iframe.
26
+ config: {
27
+ auth: false
28
+ }
18
29
  }
19
30
  ]
20
31
  };
@@ -1 +1 @@
1
- {"version":3,"file":"preview.mjs","sources":["../../../../server/src/preview/routes/preview.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nconst info = { pluginName: 'content-manager', type: 'admin' };\n\nconst previewRouter: Plugin.LoadedPlugin['routes'][string] = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n info,\n path: '/preview/url/:contentType',\n handler: 'preview.getPreviewUrl',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n\nexport { previewRouter };\n"],"names":["info","pluginName","type","previewRouter","routes","method","path","handler","config","policies"],"mappings":"AAEA,MAAMA,IAAAA,GAAO;IAAEC,UAAAA,EAAY,iBAAA;IAAmBC,IAAAA,EAAM;AAAQ,CAAA;AAE5D,MAAMC,aAAAA,GAAuD;IAC3DD,IAAAA,EAAM,OAAA;IACNE,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAAA,EAAM,2BAAA;YACNC,OAAAA,EAAS,uBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH;;;;"}
1
+ {"version":3,"file":"preview.mjs","sources":["../../../../server/src/preview/routes/preview.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\n\nconst info = { pluginName: 'content-manager', type: 'admin' };\n\nconst previewRouter: Plugin.LoadedPlugin['routes'][string] = {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n info,\n path: '/preview/url/:contentType',\n handler: 'preview.getPreviewUrl',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n info,\n path: '/preview/script',\n handler: 'preview.getPreviewScript',\n // Public: the script is non-sensitive (it runs on the user's public site) and\n // is convenience-fetched by the admin to inject into the preview iframe.\n config: {\n auth: false,\n },\n },\n ],\n};\n\nexport { previewRouter };\n"],"names":["info","pluginName","type","previewRouter","routes","method","path","handler","config","policies","auth"],"mappings":"AAEA,MAAMA,IAAAA,GAAO;IAAEC,UAAAA,EAAY,iBAAA;IAAmBC,IAAAA,EAAM;AAAQ,CAAA;AAE5D,MAAMC,aAAAA,GAAuD;IAC3DD,IAAAA,EAAM,OAAA;IACNE,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAAA,EAAM,2BAAA;YACNC,OAAAA,EAAS,uBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;AACRL,YAAAA,IAAAA;YACAM,IAAAA,EAAM,iBAAA;YACNC,OAAAA,EAAS,0BAAA;;;YAGTC,MAAAA,EAAQ;gBACNE,IAAAA,EAAM;AACR;AACF;AACD;AACH;;;;"}
@@ -200,7 +200,10 @@ const documentManager = ({ strapi })=>{
200
200
  async countDraftRelations (id, uid, locale) {
201
201
  const { populate: populate$1, hasRelations } = populate.getDeepPopulateDraftCount(uid);
202
202
  if (!hasRelations) {
203
- return 0;
203
+ return {
204
+ unpublishedRelations: 0,
205
+ draftM2mLinks: 0
206
+ };
204
207
  }
205
208
  const document = await strapi.documents(uid).findOne({
206
209
  documentId: id,
@@ -210,34 +213,25 @@ const documentManager = ({ strapi })=>{
210
213
  if (!document) {
211
214
  throw new ApplicationError(`Unable to count draft relations, document with id ${id} and locale ${locale} not found`);
212
215
  }
213
- return draft.sumDraftCounts(document, uid);
216
+ return draft.sumDraftCounts(strapi, document, uid);
214
217
  },
215
218
  async countManyEntriesDraftRelations (documentIds, uid, locale) {
216
219
  const { populate: populate$1, hasRelations } = populate.getDeepPopulateDraftCount(uid);
217
220
  if (!hasRelations) {
218
221
  return 0;
219
222
  }
220
- let localeFilter = {};
221
- if (locale) {
222
- localeFilter = Array.isArray(locale) ? {
223
- locale: {
224
- $in: locale
225
- }
226
- } : {
227
- locale
228
- };
229
- }
230
- const entities = await strapi.db.query(uid).findMany({
223
+ const entities = await strapi.documents(uid).findMany({
231
224
  populate: populate$1,
232
- where: {
225
+ filters: {
233
226
  documentId: {
234
227
  $in: documentIds
235
- },
236
- ...localeFilter
237
- }
228
+ }
229
+ },
230
+ locale,
231
+ status: 'draft'
238
232
  });
239
- const totalNumberDraftRelations = entities.reduce((count, entity)=>draft.sumDraftCounts(entity, uid) + count, 0);
240
- return totalNumberDraftRelations;
233
+ const counts = await Promise.all(entities.map((entity)=>draft.sumDraftCounts(strapi, entity, uid)));
234
+ return counts.reduce((total, entityCounts)=>total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks, 0);
241
235
  }
242
236
  };
243
237
  };
@@ -1 +1 @@
1
- {"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\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 { 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 { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\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, 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 = pipe(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(['id', 'documentId'], body),\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 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 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 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 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 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 0;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\n }\n\n return sumDraftCounts(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 let localeFilter = {};\n if (locale) {\n localeFilter = Array.isArray(locale) ? { locale: { $in: locale } } : { locale };\n }\n\n const entities = await strapi.db.query(uid).findMany({\n populate,\n where: {\n documentId: { $in: documentIds },\n ...localeFilter,\n },\n });\n\n const totalNumberDraftRelations: number = entities!.reduce(\n (count: number, entity: Document) => sumDraftCounts(entity, uid) + count,\n 0\n );\n\n return totalNumberDraftRelations;\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","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","document","sumDraftCounts","countManyEntriesDraftRelations","localeFilter","entities","totalNumberDraftRelations","reduce","entity"],"mappings":"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"}
1
+ {"version":3,"file":"document-manager.js","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\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 { 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 { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\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, 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 = pipe(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(['id', 'documentId'], body),\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 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 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 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 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 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 { unpublishedRelations: 0, draftM2mLinks: 0 };\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\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":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","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","unpublishedRelations","draftM2mLinks","document","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts"],"mappings":"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"}
@@ -198,7 +198,10 @@ const documentManager = ({ strapi })=>{
198
198
  async countDraftRelations (id, uid, locale) {
199
199
  const { populate, hasRelations } = getDeepPopulateDraftCount(uid);
200
200
  if (!hasRelations) {
201
- return 0;
201
+ return {
202
+ unpublishedRelations: 0,
203
+ draftM2mLinks: 0
204
+ };
202
205
  }
203
206
  const document = await strapi.documents(uid).findOne({
204
207
  documentId: id,
@@ -208,34 +211,25 @@ const documentManager = ({ strapi })=>{
208
211
  if (!document) {
209
212
  throw new ApplicationError(`Unable to count draft relations, document with id ${id} and locale ${locale} not found`);
210
213
  }
211
- return sumDraftCounts(document, uid);
214
+ return sumDraftCounts(strapi, document, uid);
212
215
  },
213
216
  async countManyEntriesDraftRelations (documentIds, uid, locale) {
214
217
  const { populate, hasRelations } = getDeepPopulateDraftCount(uid);
215
218
  if (!hasRelations) {
216
219
  return 0;
217
220
  }
218
- let localeFilter = {};
219
- if (locale) {
220
- localeFilter = Array.isArray(locale) ? {
221
- locale: {
222
- $in: locale
223
- }
224
- } : {
225
- locale
226
- };
227
- }
228
- const entities = await strapi.db.query(uid).findMany({
221
+ const entities = await strapi.documents(uid).findMany({
229
222
  populate,
230
- where: {
223
+ filters: {
231
224
  documentId: {
232
225
  $in: documentIds
233
- },
234
- ...localeFilter
235
- }
226
+ }
227
+ },
228
+ locale,
229
+ status: 'draft'
236
230
  });
237
- const totalNumberDraftRelations = entities.reduce((count, entity)=>sumDraftCounts(entity, uid) + count, 0);
238
- return totalNumberDraftRelations;
231
+ const counts = await Promise.all(entities.map((entity)=>sumDraftCounts(strapi, entity, uid)));
232
+ return counts.reduce((total, entityCounts)=>total + entityCounts.unpublishedRelations + entityCounts.draftM2mLinks, 0);
239
233
  }
240
234
  };
241
235
  };
@@ -1 +1 @@
1
- {"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\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 { 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 { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\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, 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 = pipe(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(['id', 'documentId'], body),\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 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 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 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 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 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 0;\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\n }\n\n return sumDraftCounts(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 let localeFilter = {};\n if (locale) {\n localeFilter = Array.isArray(locale) ? { locale: { $in: locale } } : { locale };\n }\n\n const entities = await strapi.db.query(uid).findMany({\n populate,\n where: {\n documentId: { $in: documentIds },\n ...localeFilter,\n },\n });\n\n const totalNumberDraftRelations: number = entities!.reduce(\n (count: number, entity: Document) => sumDraftCounts(entity, uid) + count,\n 0\n );\n\n return totalNumberDraftRelations;\n },\n };\n};\n\nexport type DocumentManagerService = typeof documentManager;\n\nexport default documentManager;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","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","document","sumDraftCounts","countManyEntriesDraftRelations","localeFilter","entities","totalNumberDraftRelations","reduce","entity"],"mappings":"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"}
1
+ {"version":3,"file":"document-manager.mjs","sources":["../../../server/src/services/document-manager.ts"],"sourcesContent":["import { omit, pipe } from 'lodash/fp';\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 { 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 { ApplicationError } = errors;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\nconst omitIdField = omit('id');\n\nconst documentManager = ({ strapi }: { strapi: Core.Strapi }) => {\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, 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 = pipe(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(['id', 'documentId'], body),\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 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 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 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 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 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 { unpublishedRelations: 0, draftM2mLinks: 0 };\n }\n\n const document = await strapi.documents(uid).findOne({ documentId: id, populate, locale });\n if (!document) {\n throw new ApplicationError(\n `Unable to count draft relations, document with id ${id} and locale ${locale} not found`\n );\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":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypes","constants","omitPublishedAtField","omit","omitIdField","documentManager","strapi","findOne","id","uid","opts","documents","documentId","findLocales","where","Array","isArray","locale","$in","isPublished","publishedAt","$notNull","db","query","findMany","populate","params","getDeepPopulate","findPage","pagination","withDefaultPagination","maxLimit","sort","countParams","total","Promise","all","count","results","transformPagedPaginationInfo","create","buildDeepPopulate","status","update","publishData","pipe","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","unpublishedRelations","draftM2mLinks","document","sumDraftCounts","countManyEntriesDraftRelations","entities","filters","counts","entity","reduce","entityCounts"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Bidirectional manyToMany links share a join-table row and are kept on publish; they become
5
+ * visible on the live site once the related entry is published. xToOne-style links are stripped.
6
+ */ const isBidirectionalManyToMany = (attribute)=>attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);
7
+
8
+ exports.isBidirectionalManyToMany = isBidirectionalManyToMany;
9
+ //# sourceMappingURL=draft-relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-relations.js","sources":["../../../../server/src/services/utils/draft-relations.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\ntype RelationAttribute = Schema.Attribute.Relation & {\n target?: string;\n inversedBy?: string;\n mappedBy?: string;\n};\n\nexport interface DraftRelationCounts {\n unpublishedRelations: number;\n draftM2mLinks: number;\n}\n\nexport const EMPTY_DRAFT_RELATION_COUNTS: DraftRelationCounts = {\n unpublishedRelations: 0,\n draftM2mLinks: 0,\n};\n\n/**\n * Bidirectional manyToMany links share a join-table row and are kept on publish; they become\n * visible on the live site once the related entry is published. xToOne-style links are stripped.\n */\nexport const isBidirectionalManyToMany = (attribute: RelationAttribute) =>\n attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);\n\nexport const mergeDraftRelationCounts = (\n left: DraftRelationCounts,\n right: DraftRelationCounts\n): DraftRelationCounts => ({\n unpublishedRelations: left.unpublishedRelations + right.unpublishedRelations,\n draftM2mLinks: left.draftM2mLinks + right.draftM2mLinks,\n});\n"],"names":["isBidirectionalManyToMany","attribute","relation","Boolean","inversedBy","mappedBy"],"mappings":";;AAkBA;;;AAGC,IACM,MAAMA,yBAAAA,GAA4B,CAACC,YACxCA,SAAAA,CAAUC,QAAQ,KAAK,YAAA,IAAgBC,QAAQF,SAAAA,CAAUG,UAAU,IAAIH,SAAAA,CAAUI,QAAQ;;;;"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Bidirectional manyToMany links share a join-table row and are kept on publish; they become
3
+ * visible on the live site once the related entry is published. xToOne-style links are stripped.
4
+ */ const isBidirectionalManyToMany = (attribute)=>attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);
5
+
6
+ export { isBidirectionalManyToMany };
7
+ //# sourceMappingURL=draft-relations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-relations.mjs","sources":["../../../../server/src/services/utils/draft-relations.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\n\ntype RelationAttribute = Schema.Attribute.Relation & {\n target?: string;\n inversedBy?: string;\n mappedBy?: string;\n};\n\nexport interface DraftRelationCounts {\n unpublishedRelations: number;\n draftM2mLinks: number;\n}\n\nexport const EMPTY_DRAFT_RELATION_COUNTS: DraftRelationCounts = {\n unpublishedRelations: 0,\n draftM2mLinks: 0,\n};\n\n/**\n * Bidirectional manyToMany links share a join-table row and are kept on publish; they become\n * visible on the live site once the related entry is published. xToOne-style links are stripped.\n */\nexport const isBidirectionalManyToMany = (attribute: RelationAttribute) =>\n attribute.relation === 'manyToMany' && Boolean(attribute.inversedBy || attribute.mappedBy);\n\nexport const mergeDraftRelationCounts = (\n left: DraftRelationCounts,\n right: DraftRelationCounts\n): DraftRelationCounts => ({\n unpublishedRelations: left.unpublishedRelations + right.unpublishedRelations,\n draftM2mLinks: left.draftM2mLinks + right.draftM2mLinks,\n});\n"],"names":["isBidirectionalManyToMany","attribute","relation","Boolean","inversedBy","mappedBy"],"mappings":"AAkBA;;;AAGC,IACM,MAAMA,yBAAAA,GAA4B,CAACC,YACxCA,SAAAA,CAAUC,QAAQ,KAAK,YAAA,IAAgBC,QAAQF,SAAAA,CAAUG,UAAU,IAAIH,SAAAA,CAAUI,QAAQ;;;;"}
@@ -2,60 +2,153 @@
2
2
 
3
3
  var fp = require('lodash/fp');
4
4
  var strapiUtils = require('@strapi/utils');
5
+ var draftRelations = require('./draft-relations.js');
5
6
 
6
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
8
 
8
9
  var strapiUtils__default = /*#__PURE__*/_interopDefault(strapiUtils);
9
10
 
10
11
  const { isVisibleAttribute, hasDraftAndPublish } = strapiUtils__default.default.contentTypes;
11
- /**
12
- * sumDraftCounts works recursively on the attributes of a model counting the
13
- * number of draft relations
14
- * These relations can be direct to this content type or contained within components/dynamic zones
15
- * @param {Object} entity containing the draft relation counts
16
- * @param {String} uid of the content type
17
- * @returns {Number} of draft relations
18
- */ const sumDraftCounts = (entity, uid)=>{
12
+ const isLocalizedContentType = (model)=>model.pluginOptions?.i18n?.localized === true;
13
+ const toPublishedDocumentKey = (documentId, locale)=>`${documentId}:${locale ?? ''}`;
14
+ const mergeCollectedLinks = (left, right)=>({
15
+ m2mLinks: [
16
+ ...left.m2mLinks,
17
+ ...right.m2mLinks
18
+ ],
19
+ xToOneLinks: [
20
+ ...left.xToOneLinks,
21
+ ...right.xToOneLinks
22
+ ]
23
+ });
24
+ const toDraftRelationLink = (entry, targetUid, targetIsLocalized, documentLocale)=>{
25
+ if (!entry?.documentId) {
26
+ return null;
27
+ }
28
+ return {
29
+ targetUid,
30
+ documentId: entry.documentId,
31
+ locale: targetIsLocalized ? entry.locale ?? documentLocale : null
32
+ };
33
+ };
34
+ const collectDraftRelationLinks = (strapi, entity, uid, documentLocale)=>{
19
35
  const model = strapi.getModel(uid);
20
- return Object.keys(model.attributes).reduce((sum, attributeName)=>{
36
+ const locale = entity.locale ?? documentLocale;
37
+ return Object.keys(model.attributes).reduce((collected, attributeName)=>{
21
38
  const attribute = model.attributes[attributeName];
22
39
  const value = entity[attributeName];
23
40
  if (!value) {
24
- return sum;
41
+ return collected;
25
42
  }
26
43
  switch(attribute.type){
27
44
  case 'relation':
28
45
  {
29
46
  if (!('target' in attribute)) {
30
- return sum;
47
+ return collected;
31
48
  }
32
49
  const targetModel = strapi.getModel(attribute.target);
33
50
  if (!targetModel || !hasDraftAndPublish(targetModel)) {
34
- return sum;
51
+ return collected;
52
+ }
53
+ if (attribute.target === uid || !isVisibleAttribute(model, attributeName)) {
54
+ return collected;
35
55
  }
36
- if (isVisibleAttribute(model, attributeName)) {
37
- return sum + value.count;
56
+ const targetIsLocalized = isLocalizedContentType(targetModel);
57
+ const relatedEntries = fp.castArray(value);
58
+ const links = relatedEntries.map((entry)=>toDraftRelationLink(entry, attribute.target, targetIsLocalized, locale)).filter((link)=>link !== null);
59
+ if (links.length === 0) {
60
+ return collected;
38
61
  }
39
- return sum;
62
+ if (draftRelations.isBidirectionalManyToMany(attribute)) {
63
+ return {
64
+ ...collected,
65
+ m2mLinks: [
66
+ ...collected.m2mLinks,
67
+ ...links
68
+ ]
69
+ };
70
+ }
71
+ return {
72
+ ...collected,
73
+ xToOneLinks: [
74
+ ...collected.xToOneLinks,
75
+ ...links
76
+ ]
77
+ };
40
78
  }
41
79
  case 'component':
42
80
  {
43
- const compoSum = fp.castArray(value).reduce((acc, componentValue)=>{
44
- return acc + sumDraftCounts(componentValue, attribute.component);
45
- }, 0);
46
- return sum + compoSum;
81
+ return fp.castArray(value).reduce((componentCollected, componentValue)=>mergeCollectedLinks(componentCollected, collectDraftRelationLinks(strapi, componentValue, attribute.component, locale)), collected);
47
82
  }
48
83
  case 'dynamiczone':
49
84
  {
50
- const dzSum = value.reduce((acc, componentValue)=>{
51
- return acc + sumDraftCounts(componentValue, componentValue.__component);
52
- }, 0);
53
- return sum + dzSum;
85
+ return value.reduce((zoneCollected, componentValue)=>{
86
+ return mergeCollectedLinks(zoneCollected, collectDraftRelationLinks(strapi, componentValue, componentValue.__component, locale));
87
+ }, collected);
54
88
  }
55
89
  default:
56
- return sum;
90
+ return collected;
57
91
  }
58
- }, 0);
92
+ }, {
93
+ m2mLinks: [],
94
+ xToOneLinks: []
95
+ });
96
+ };
97
+ const countLinksToUnpublishedDocuments = async (strapi, links)=>{
98
+ if (links.length === 0) {
99
+ return 0;
100
+ }
101
+ const linksByTarget = links.reduce((acc, link)=>{
102
+ const targetLinks = acc.get(link.targetUid) ?? [];
103
+ targetLinks.push(link);
104
+ acc.set(link.targetUid, targetLinks);
105
+ return acc;
106
+ }, new Map());
107
+ const counts = await Promise.all(Array.from(linksByTarget.entries()).map(async ([targetUid, targetLinks])=>{
108
+ const targetModel = strapi.getModel(targetUid);
109
+ const targetIsLocalized = isLocalizedContentType(targetModel);
110
+ const documentIds = [
111
+ ...new Set(targetLinks.map((link)=>link.documentId))
112
+ ];
113
+ const publishedRows = await strapi.db.query(targetUid).findMany({
114
+ select: [
115
+ 'documentId',
116
+ 'locale'
117
+ ],
118
+ where: {
119
+ documentId: {
120
+ $in: documentIds
121
+ },
122
+ publishedAt: {
123
+ $notNull: true
124
+ }
125
+ }
126
+ });
127
+ if (!targetIsLocalized) {
128
+ const publishedDocumentIds = new Set(publishedRows.map((row)=>row.documentId));
129
+ return targetLinks.filter((link)=>!publishedDocumentIds.has(link.documentId)).length;
130
+ }
131
+ const publishedDocumentKeys = new Set(publishedRows.map((row)=>toPublishedDocumentKey(row.documentId, row.locale)));
132
+ return targetLinks.filter((link)=>!publishedDocumentKeys.has(toPublishedDocumentKey(link.documentId, link.locale))).length;
133
+ }));
134
+ return counts.reduce((total, count)=>total + count, 0);
135
+ };
136
+ /**
137
+ * sumDraftCounts works recursively on the attributes of a model counting draft relations
138
+ * that matter for publish warnings.
139
+ *
140
+ * - unpublishedRelations: xToOne / oneToMany style links stripped from the published version
141
+ * - draftM2mLinks: bidirectional manyToMany links to documents without a published version
142
+ */ const sumDraftCounts = async (strapi, entity, uid)=>{
143
+ const { m2mLinks, xToOneLinks } = collectDraftRelationLinks(strapi, entity, uid);
144
+ const [draftM2mLinks, unpublishedRelations] = await Promise.all([
145
+ countLinksToUnpublishedDocuments(strapi, m2mLinks),
146
+ countLinksToUnpublishedDocuments(strapi, xToOneLinks)
147
+ ]);
148
+ return {
149
+ unpublishedRelations,
150
+ draftM2mLinks
151
+ };
59
152
  };
60
153
 
61
154
  exports.sumDraftCounts = sumDraftCounts;