@strapi/content-manager 0.0.0-experimental.bd712ad3930045f4a5d2144c119e0b7856e97fc4 → 0.0.0-experimental.c222e1c4de12dd05c26938a605a1128fb3481d1d

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 (202) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-BWQv6yRj.js → ComponentConfigurationPage--MCP7Aew.js} +4 -4
  2. package/dist/_chunks/{ComponentConfigurationPage-BWQv6yRj.js.map → ComponentConfigurationPage--MCP7Aew.js.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-C7ImeKGM.mjs → ComponentConfigurationPage-DT41asyM.mjs} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-C7ImeKGM.mjs.map → ComponentConfigurationPage-DT41asyM.mjs.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-MItFGzT9.mjs → EditConfigurationPage-DznPxn9p.mjs} +4 -4
  6. package/dist/_chunks/{EditConfigurationPage-MItFGzT9.mjs.map → EditConfigurationPage-DznPxn9p.mjs.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-CEGwxV-L.js → EditConfigurationPage-qgnNvv_u.js} +4 -4
  8. package/dist/_chunks/{EditConfigurationPage-CEGwxV-L.js.map → EditConfigurationPage-qgnNvv_u.js.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-DhmAg0NK.mjs → EditViewPage-B_k7z288.mjs} +33 -11
  10. package/dist/_chunks/EditViewPage-B_k7z288.mjs.map +1 -0
  11. package/dist/_chunks/{EditViewPage-CmMi2Xsn.js → EditViewPage-Bb4S7p8c.js} +32 -10
  12. package/dist/_chunks/EditViewPage-Bb4S7p8c.js.map +1 -0
  13. package/dist/_chunks/{Field-1DLtcLAI.js → Field-ByR1mllE.js} +181 -109
  14. package/dist/_chunks/Field-ByR1mllE.js.map +1 -0
  15. package/dist/_chunks/{Field-Cs62u5pl.mjs → Field-DmwbE0TL.mjs} +179 -107
  16. package/dist/_chunks/Field-DmwbE0TL.mjs.map +1 -0
  17. package/dist/_chunks/{Form-CqFA7F_V.js → Form-BpeyAyS1.js} +36 -17
  18. package/dist/_chunks/Form-BpeyAyS1.js.map +1 -0
  19. package/dist/_chunks/{Form-zYHtzGUX.mjs → Form-Dvt5eouJ.mjs} +36 -17
  20. package/dist/_chunks/Form-Dvt5eouJ.mjs.map +1 -0
  21. package/dist/_chunks/{History-DalgFQ3D.mjs → History-CAERKpYl.mjs} +54 -54
  22. package/dist/_chunks/History-CAERKpYl.mjs.map +1 -0
  23. package/dist/_chunks/{History-BblwXv7-.js → History-d-IgDGPl.js} +53 -53
  24. package/dist/_chunks/History-d-IgDGPl.js.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-DWy-vRzs.mjs → ListConfigurationPage-CVVT45M8.mjs} +15 -5
  26. package/dist/_chunks/ListConfigurationPage-CVVT45M8.mjs.map +1 -0
  27. package/dist/_chunks/{ListConfigurationPage-Cpy4QqNd.js → ListConfigurationPage-DSX98CYb.js} +15 -5
  28. package/dist/_chunks/ListConfigurationPage-DSX98CYb.js.map +1 -0
  29. package/dist/_chunks/{ListViewPage-DFjn1DNW.js → ListViewPage-C9gPPp-V.js} +61 -41
  30. package/dist/_chunks/ListViewPage-C9gPPp-V.js.map +1 -0
  31. package/dist/_chunks/{ListViewPage-BkAwIW9s.mjs → ListViewPage-Q4g6kHDl.mjs} +59 -39
  32. package/dist/_chunks/ListViewPage-Q4g6kHDl.mjs.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-B9BCNNdL.mjs → NoContentTypePage-BY4YRGs0.mjs} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-B9BCNNdL.mjs.map → NoContentTypePage-BY4YRGs0.mjs.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-C-3ykoxs.js → NoContentTypePage-D09gppmy.js} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-C-3ykoxs.js.map → NoContentTypePage-D09gppmy.js.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-DKLmDZnZ.js → NoPermissionsPage-32WgThJG.js} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-DKLmDZnZ.js.map → NoPermissionsPage-32WgThJG.js.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-Bt_HWGat.mjs → NoPermissionsPage-CyM16RKL.mjs} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-Bt_HWGat.mjs.map → NoPermissionsPage-CyM16RKL.mjs.map} +1 -1
  41. package/dist/_chunks/Preview-C2WFq4S8.mjs +267 -0
  42. package/dist/_chunks/Preview-C2WFq4S8.mjs.map +1 -0
  43. package/dist/_chunks/Preview-PpV3g9wJ.js +286 -0
  44. package/dist/_chunks/Preview-PpV3g9wJ.js.map +1 -0
  45. package/dist/_chunks/{Relations-CJmTbZ8T.mjs → Relations-B_Yn9xGB.mjs} +73 -37
  46. package/dist/_chunks/Relations-B_Yn9xGB.mjs.map +1 -0
  47. package/dist/_chunks/{Relations-CrxfoH2n.js → Relations-mWaebC5t.js} +72 -36
  48. package/dist/_chunks/Relations-mWaebC5t.js.map +1 -0
  49. package/dist/_chunks/{en-fbKQxLGn.js → en-CHOp_xJv.js} +27 -16
  50. package/dist/_chunks/{en-fbKQxLGn.js.map → en-CHOp_xJv.js.map} +1 -1
  51. package/dist/_chunks/{en-Ux26r5pl.mjs → en-D_BMf0hT.mjs} +27 -16
  52. package/dist/_chunks/{en-Ux26r5pl.mjs.map → en-D_BMf0hT.mjs.map} +1 -1
  53. package/dist/_chunks/{es-EUonQTon.js → es-9K52xZIr.js} +2 -2
  54. package/dist/_chunks/{ja-CcFe8diO.js.map → es-9K52xZIr.js.map} +1 -1
  55. package/dist/_chunks/{es-CeXiYflN.mjs → es-D34tqjMw.mjs} +2 -2
  56. package/dist/_chunks/{es-CeXiYflN.mjs.map → es-D34tqjMw.mjs.map} +1 -1
  57. package/dist/_chunks/{fr-CD9VFbPM.mjs → fr--pg5jUbt.mjs} +13 -3
  58. package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr--pg5jUbt.mjs.map} +1 -1
  59. package/dist/_chunks/{fr-B7kGGg3E.js → fr-B2Kyv8Z9.js} +13 -3
  60. package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-B2Kyv8Z9.js.map} +1 -1
  61. package/dist/_chunks/{index-D1344xdw.mjs → index-CbytGVdz.mjs} +1070 -698
  62. package/dist/_chunks/index-CbytGVdz.mjs.map +1 -0
  63. package/dist/_chunks/{index-Buwn78Rt.js → index-iun2i4xv.js} +1052 -679
  64. package/dist/_chunks/index-iun2i4xv.js.map +1 -0
  65. package/dist/_chunks/{ja-CcFe8diO.js → ja-7sfIbjxE.js} +2 -2
  66. package/dist/_chunks/{es-EUonQTon.js.map → ja-7sfIbjxE.js.map} +1 -1
  67. package/dist/_chunks/{ja-CtsUxOvk.mjs → ja-BHqhDq4V.mjs} +2 -2
  68. package/dist/_chunks/{ja-CtsUxOvk.mjs.map → ja-BHqhDq4V.mjs.map} +1 -1
  69. package/dist/_chunks/{layout-ChVuUpa1.mjs → layout-Btu_cMRF.mjs} +22 -9
  70. package/dist/_chunks/layout-Btu_cMRF.mjs.map +1 -0
  71. package/dist/_chunks/{layout-DRuJUpas.js → layout-CkaP4K5_.js} +21 -8
  72. package/dist/_chunks/layout-CkaP4K5_.js.map +1 -0
  73. package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
  74. package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
  75. package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
  76. package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
  77. package/dist/_chunks/{relations-B-deMCy4.mjs → relations-Cn5re8ia.mjs} +6 -7
  78. package/dist/_chunks/relations-Cn5re8ia.mjs.map +1 -0
  79. package/dist/_chunks/{relations-DuoUwyJr.js → relations-O_v9g0v_.js} +6 -7
  80. package/dist/_chunks/relations-O_v9g0v_.js.map +1 -0
  81. package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
  82. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
  83. package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
  84. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
  85. package/dist/admin/index.js +2 -1
  86. package/dist/admin/index.js.map +1 -1
  87. package/dist/admin/index.mjs +5 -4
  88. package/dist/admin/src/exports.d.ts +1 -1
  89. package/dist/admin/src/history/index.d.ts +3 -0
  90. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  91. package/dist/admin/src/hooks/useDocument.d.ts +32 -1
  92. package/dist/admin/src/index.d.ts +1 -0
  93. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  94. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -0
  95. package/dist/admin/src/pages/EditView/components/FormInputs/Relations.d.ts +20 -0
  96. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  97. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
  98. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +4 -48
  99. package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
  100. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  101. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  102. package/dist/admin/src/preview/constants.d.ts +1 -0
  103. package/dist/admin/src/preview/index.d.ts +4 -0
  104. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  105. package/dist/admin/src/preview/routes.d.ts +3 -0
  106. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  107. package/dist/admin/src/services/api.d.ts +1 -1
  108. package/dist/admin/src/services/components.d.ts +2 -2
  109. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  110. package/dist/admin/src/services/documents.d.ts +19 -17
  111. package/dist/admin/src/services/init.d.ts +1 -1
  112. package/dist/admin/src/services/relations.d.ts +2 -2
  113. package/dist/admin/src/services/uid.d.ts +3 -3
  114. package/dist/admin/src/utils/validation.d.ts +4 -1
  115. package/dist/server/index.js +544 -261
  116. package/dist/server/index.js.map +1 -1
  117. package/dist/server/index.mjs +545 -262
  118. package/dist/server/index.mjs.map +1 -1
  119. package/dist/server/src/bootstrap.d.ts.map +1 -1
  120. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  121. package/dist/server/src/controllers/index.d.ts.map +1 -1
  122. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  123. package/dist/server/src/controllers/uid.d.ts.map +1 -1
  124. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  125. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  126. package/dist/server/src/controllers/validation/dimensions.d.ts +4 -2
  127. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  128. package/dist/server/src/history/services/history.d.ts.map +1 -1
  129. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  130. package/dist/server/src/history/services/utils.d.ts +4 -4
  131. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  132. package/dist/server/src/index.d.ts +4 -4
  133. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  134. package/dist/server/src/preview/constants.d.ts +2 -0
  135. package/dist/server/src/preview/constants.d.ts.map +1 -0
  136. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  137. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  138. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  139. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  140. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  141. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  142. package/dist/server/src/preview/index.d.ts +4 -0
  143. package/dist/server/src/preview/index.d.ts.map +1 -0
  144. package/dist/server/src/preview/routes/index.d.ts +8 -0
  145. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  146. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  147. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  148. package/dist/server/src/preview/services/index.d.ts +15 -0
  149. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  150. package/dist/server/src/preview/services/preview-config.d.ts +30 -0
  151. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  152. package/dist/server/src/preview/services/preview.d.ts +12 -0
  153. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  154. package/dist/server/src/preview/utils.d.ts +18 -0
  155. package/dist/server/src/preview/utils.d.ts.map +1 -0
  156. package/dist/server/src/routes/index.d.ts.map +1 -1
  157. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  158. package/dist/server/src/services/document-metadata.d.ts +8 -8
  159. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  160. package/dist/server/src/services/index.d.ts +4 -4
  161. package/dist/server/src/services/index.d.ts.map +1 -1
  162. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  163. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  164. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  165. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  166. package/dist/server/src/utils/index.d.ts +2 -0
  167. package/dist/server/src/utils/index.d.ts.map +1 -1
  168. package/dist/shared/contracts/collection-types.d.ts +3 -1
  169. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  170. package/dist/shared/contracts/index.d.ts +1 -0
  171. package/dist/shared/contracts/index.d.ts.map +1 -1
  172. package/dist/shared/contracts/preview.d.ts +27 -0
  173. package/dist/shared/contracts/preview.d.ts.map +1 -0
  174. package/dist/shared/index.js +4 -0
  175. package/dist/shared/index.js.map +1 -1
  176. package/dist/shared/index.mjs +4 -0
  177. package/dist/shared/index.mjs.map +1 -1
  178. package/package.json +13 -13
  179. package/dist/_chunks/EditViewPage-CmMi2Xsn.js.map +0 -1
  180. package/dist/_chunks/EditViewPage-DhmAg0NK.mjs.map +0 -1
  181. package/dist/_chunks/Field-1DLtcLAI.js.map +0 -1
  182. package/dist/_chunks/Field-Cs62u5pl.mjs.map +0 -1
  183. package/dist/_chunks/Form-CqFA7F_V.js.map +0 -1
  184. package/dist/_chunks/Form-zYHtzGUX.mjs.map +0 -1
  185. package/dist/_chunks/History-BblwXv7-.js.map +0 -1
  186. package/dist/_chunks/History-DalgFQ3D.mjs.map +0 -1
  187. package/dist/_chunks/ListConfigurationPage-Cpy4QqNd.js.map +0 -1
  188. package/dist/_chunks/ListConfigurationPage-DWy-vRzs.mjs.map +0 -1
  189. package/dist/_chunks/ListViewPage-BkAwIW9s.mjs.map +0 -1
  190. package/dist/_chunks/ListViewPage-DFjn1DNW.js.map +0 -1
  191. package/dist/_chunks/Relations-CJmTbZ8T.mjs.map +0 -1
  192. package/dist/_chunks/Relations-CrxfoH2n.js.map +0 -1
  193. package/dist/_chunks/index-Buwn78Rt.js.map +0 -1
  194. package/dist/_chunks/index-D1344xdw.mjs.map +0 -1
  195. package/dist/_chunks/layout-ChVuUpa1.mjs.map +0 -1
  196. package/dist/_chunks/layout-DRuJUpas.js.map +0 -1
  197. package/dist/_chunks/relations-B-deMCy4.mjs.map +0 -1
  198. package/dist/_chunks/relations-DuoUwyJr.js.map +0 -1
  199. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  200. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  201. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
  202. package/strapi-server.js +0 -3
@@ -33,10 +33,10 @@ const isNil__default = /* @__PURE__ */ _interopDefault(isNil);
33
33
  const ___default = /* @__PURE__ */ _interopDefault(_);
34
34
  const qs__default = /* @__PURE__ */ _interopDefault(qs);
35
35
  const slugify__default = /* @__PURE__ */ _interopDefault(slugify);
36
- const getService$1 = (name) => {
36
+ const getService$2 = (name) => {
37
37
  return strapi.plugin("content-manager").service(name);
38
38
  };
39
- function getService(strapi2, name) {
39
+ function getService$1(strapi2, name) {
40
40
  return strapi2.service(`plugin::content-manager.${name}`);
41
41
  }
42
42
  const historyRestoreVersionSchema = yup__namespace.object().shape({
@@ -72,7 +72,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
72
72
  if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {
73
73
  throw new strapiUtils.errors.ForbiddenError("contentType and documentId are required");
74
74
  }
75
- const permissionChecker2 = getService$1("permission-checker").create({
75
+ const permissionChecker2 = getService$2("permission-checker").create({
76
76
  userAbility: ctx.state.userAbility,
77
77
  model: ctx.query.contentType
78
78
  });
@@ -80,7 +80,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
80
80
  return ctx.forbidden();
81
81
  }
82
82
  const query = await permissionChecker2.sanitizeQuery(ctx.query);
83
- const { results, pagination } = await getService(strapi2, "history").findVersionsPage({
83
+ const { results, pagination } = await getService$1(strapi2, "history").findVersionsPage({
84
84
  query: {
85
85
  ...query,
86
86
  ...getValidPagination({ page: query.page, pageSize: query.pageSize })
@@ -105,14 +105,14 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
105
105
  async restoreVersion(ctx) {
106
106
  const request = ctx.request;
107
107
  await validateRestoreVersion(request.body, "contentType is required");
108
- const permissionChecker2 = getService$1("permission-checker").create({
108
+ const permissionChecker2 = getService$2("permission-checker").create({
109
109
  userAbility: ctx.state.userAbility,
110
110
  model: request.body.contentType
111
111
  });
112
112
  if (permissionChecker2.cannot.update()) {
113
113
  throw new strapiUtils.errors.ForbiddenError();
114
114
  }
115
- const restoredDocument = await getService(strapi2, "history").restoreVersion(
115
+ const restoredDocument = await getService$1(strapi2, "history").restoreVersion(
116
116
  request.params.versionId
117
117
  );
118
118
  return {
@@ -121,7 +121,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
121
121
  }
122
122
  };
123
123
  };
124
- const controllers$1 = {
124
+ const controllers$2 = {
125
125
  "history-version": createHistoryVersionController
126
126
  /**
127
127
  * Casting is needed because the types aren't aware that Strapi supports
@@ -199,7 +199,9 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
199
199
  return strapi2.db.query("plugin::upload.file").findOne({ where: { id: versionRelationData.id } });
200
200
  };
201
201
  const localesService = strapi2.plugin("i18n")?.service("locales");
202
+ const i18nContentTypeService = strapi2.plugin("i18n")?.service("content-types");
202
203
  const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
204
+ const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
203
205
  const getLocaleDictionary = async () => {
204
206
  if (!localesService)
205
207
  return {};
@@ -226,9 +228,21 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
226
228
  const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
227
229
  return documentMetadataService.getStatus(document, meta.availableStatus);
228
230
  };
229
- const getDeepPopulate2 = (uid2) => {
231
+ const getComponentFields = (componentUID) => {
232
+ return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
233
+ (fieldsAcc, [key, attribute]) => {
234
+ if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
235
+ fieldsAcc.push(key);
236
+ }
237
+ return fieldsAcc;
238
+ },
239
+ []
240
+ );
241
+ };
242
+ const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
230
243
  const model = strapi2.getModel(uid2);
231
244
  const attributes = Object.entries(model.attributes);
245
+ const fieldSelector = useDatabaseSyntax ? "select" : "fields";
232
246
  return attributes.reduce((acc, [attributeName, attribute]) => {
233
247
  switch (attribute.type) {
234
248
  case "relation": {
@@ -238,23 +252,29 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
238
252
  }
239
253
  const isVisible2 = strapiUtils.contentTypes.isVisibleAttribute(model, attributeName);
240
254
  if (isVisible2) {
241
- acc[attributeName] = { fields: ["documentId", "locale", "publishedAt"] };
255
+ acc[attributeName] = { [fieldSelector]: ["documentId", "locale", "publishedAt"] };
242
256
  }
243
257
  break;
244
258
  }
245
259
  case "media": {
246
- acc[attributeName] = { fields: ["id"] };
260
+ acc[attributeName] = { [fieldSelector]: ["id"] };
247
261
  break;
248
262
  }
249
263
  case "component": {
250
264
  const populate = getDeepPopulate2(attribute.component);
251
- acc[attributeName] = { populate };
265
+ acc[attributeName] = {
266
+ populate,
267
+ [fieldSelector]: getComponentFields(attribute.component)
268
+ };
252
269
  break;
253
270
  }
254
271
  case "dynamiczone": {
255
272
  const populatedComponents = (attribute.components || []).reduce(
256
273
  (acc2, componentUID) => {
257
- acc2[componentUID] = { populate: getDeepPopulate2(componentUID) };
274
+ acc2[componentUID] = {
275
+ populate: getDeepPopulate2(componentUID),
276
+ [fieldSelector]: getComponentFields(componentUID)
277
+ };
258
278
  return acc2;
259
279
  },
260
280
  {}
@@ -316,6 +336,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
316
336
  getRelationRestoreValue,
317
337
  getMediaRestoreValue,
318
338
  getDefaultLocale,
339
+ isLocalizedContentType,
319
340
  getLocaleDictionary,
320
341
  getRetentionDays,
321
342
  getVersionStatus,
@@ -338,7 +359,13 @@ const createHistoryService = ({ strapi: strapi2 }) => {
338
359
  });
339
360
  },
340
361
  async findVersionsPage(params) {
341
- const locale = params.query.locale || await serviceUtils.getDefaultLocale();
362
+ const model = strapi2.getModel(params.query.contentType);
363
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
364
+ const defaultLocale = await serviceUtils.getDefaultLocale();
365
+ let locale = null;
366
+ if (isLocalizedContentType) {
367
+ locale = params.query.locale || defaultLocale;
368
+ }
342
369
  const [{ results, pagination }, localeDictionary] = await Promise.all([
343
370
  query.findPage({
344
371
  ...params.query,
@@ -360,7 +387,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
360
387
  const attributeValue = entry.data[attributeKey];
361
388
  const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
362
389
  if (attributeSchema.type === "media") {
363
- const permissionChecker2 = getService$1("permission-checker").create({
390
+ const permissionChecker2 = getService$2("permission-checker").create({
364
391
  userAbility: params.state.userAbility,
365
392
  model: "plugin::upload.file"
366
393
  });
@@ -383,7 +410,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
383
410
  if (userToPopulate == null) {
384
411
  return null;
385
412
  }
386
- return strapi2.query("admin::user").findOne({ where: { id: userToPopulate.id } });
413
+ return strapi2.query("admin::user").findOne({
414
+ where: {
415
+ ...userToPopulate.id ? { id: userToPopulate.id } : {},
416
+ ...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
417
+ }
418
+ });
387
419
  })
388
420
  );
389
421
  return {
@@ -396,7 +428,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
396
428
  [attributeKey]: adminUsers
397
429
  };
398
430
  }
399
- const permissionChecker2 = getService$1("permission-checker").create({
431
+ const permissionChecker2 = getService$2("permission-checker").create({
400
432
  userAbility: params.state.userAbility,
401
433
  model: attributeSchema.target
402
434
  });
@@ -494,6 +526,42 @@ const createHistoryService = ({ strapi: strapi2 }) => {
494
526
  }
495
527
  };
496
528
  };
529
+ const shouldCreateHistoryVersion = (context) => {
530
+ if (!strapi.requestContext.get()?.request.url.startsWith("/content-manager")) {
531
+ return false;
532
+ }
533
+ if (context.action !== "create" && context.action !== "update" && context.action !== "clone" && context.action !== "publish" && context.action !== "unpublish" && context.action !== "discardDraft") {
534
+ return false;
535
+ }
536
+ if (context.action === "update" && strapi.requestContext.get()?.request.url.endsWith("/actions/publish")) {
537
+ return false;
538
+ }
539
+ if (!context.contentType.uid.startsWith("api::")) {
540
+ return false;
541
+ }
542
+ return true;
543
+ };
544
+ const getSchemas = (uid2) => {
545
+ const attributesSchema = strapi.getModel(uid2).attributes;
546
+ const componentsSchemas = Object.keys(attributesSchema).reduce(
547
+ (currentComponentSchemas, key) => {
548
+ const fieldSchema = attributesSchema[key];
549
+ if (fieldSchema.type === "component") {
550
+ const componentSchema = strapi.getModel(fieldSchema.component).attributes;
551
+ return {
552
+ ...currentComponentSchemas,
553
+ [fieldSchema.component]: componentSchema
554
+ };
555
+ }
556
+ return currentComponentSchemas;
557
+ },
558
+ {}
559
+ );
560
+ return {
561
+ schema: fp.omit(FIELDS_TO_IGNORE, attributesSchema),
562
+ componentsSchemas
563
+ };
564
+ };
497
565
  const createLifecyclesService = ({ strapi: strapi2 }) => {
498
566
  const state = {
499
567
  deleteExpiredJob: null,
@@ -506,76 +574,62 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
506
574
  return;
507
575
  }
508
576
  strapi2.documents.use(async (context, next) => {
509
- if (!strapi2.requestContext.get()?.request.url.startsWith("/content-manager")) {
510
- return next();
511
- }
512
- if (context.action !== "create" && context.action !== "update" && context.action !== "clone" && context.action !== "publish" && context.action !== "unpublish" && context.action !== "discardDraft") {
513
- return next();
514
- }
515
- if (context.action === "update" && strapi2.requestContext.get()?.request.url.endsWith("/actions/publish")) {
516
- return next();
517
- }
518
- const contentTypeUid = context.contentType.uid;
519
- if (!contentTypeUid.startsWith("api::")) {
520
- return next();
521
- }
522
577
  const result = await next();
523
- const documentContext = {
524
- documentId: context.action === "create" || context.action === "clone" ? result.documentId : context.params.documentId,
525
- locale: context.params?.locale
526
- };
578
+ if (!shouldCreateHistoryVersion(context)) {
579
+ return result;
580
+ }
581
+ const documentId = context.action === "create" || context.action === "clone" ? result.documentId : context.params.documentId;
527
582
  const defaultLocale = await serviceUtils.getDefaultLocale();
528
- const locale = documentContext.locale || defaultLocale;
529
- if (Array.isArray(locale)) {
530
- strapi2.log.warn(
531
- "[Content manager history middleware]: An array of locales was provided, but only a single locale is supported for the findOne operation."
532
- );
533
- return next();
583
+ const locales = fp.castArray(context.params?.locale || defaultLocale);
584
+ if (!locales.length) {
585
+ return result;
534
586
  }
535
- const document = await strapi2.documents(contentTypeUid).findOne({
536
- documentId: documentContext.documentId,
537
- locale,
538
- populate: serviceUtils.getDeepPopulate(contentTypeUid)
587
+ const uid2 = context.contentType.uid;
588
+ const schemas = getSchemas(uid2);
589
+ const model = strapi2.getModel(uid2);
590
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
591
+ const localeEntries = await strapi2.db.query(uid2).findMany({
592
+ where: {
593
+ documentId,
594
+ ...isLocalizedContentType ? { locale: { $in: locales } } : {},
595
+ ...strapiUtils.contentTypes.hasDraftAndPublish(strapi2.contentTypes[uid2]) ? { publishedAt: null } : {}
596
+ },
597
+ populate: serviceUtils.getDeepPopulate(
598
+ uid2,
599
+ true
600
+ /* use database syntax */
601
+ )
539
602
  });
540
- const status = await serviceUtils.getVersionStatus(contentTypeUid, document);
541
- const attributesSchema = strapi2.getModel(contentTypeUid).attributes;
542
- const componentsSchemas = Object.keys(
543
- attributesSchema
544
- ).reduce((currentComponentSchemas, key) => {
545
- const fieldSchema = attributesSchema[key];
546
- if (fieldSchema.type === "component") {
547
- const componentSchema = strapi2.getModel(fieldSchema.component).attributes;
548
- return {
549
- ...currentComponentSchemas,
550
- [fieldSchema.component]: componentSchema
551
- };
552
- }
553
- return currentComponentSchemas;
554
- }, {});
555
603
  await strapi2.db.transaction(async ({ onCommit }) => {
556
- onCommit(() => {
557
- getService(strapi2, "history").createVersion({
558
- contentType: contentTypeUid,
559
- data: fp.omit(FIELDS_TO_IGNORE, document),
560
- schema: fp.omit(FIELDS_TO_IGNORE, attributesSchema),
561
- componentsSchemas,
562
- relatedDocumentId: documentContext.documentId,
563
- locale,
564
- status
565
- });
604
+ onCommit(async () => {
605
+ for (const entry of localeEntries) {
606
+ const status = await serviceUtils.getVersionStatus(uid2, entry);
607
+ await getService$1(strapi2, "history").createVersion({
608
+ contentType: uid2,
609
+ data: fp.omit(FIELDS_TO_IGNORE, entry),
610
+ relatedDocumentId: documentId,
611
+ locale: entry.locale,
612
+ status,
613
+ ...schemas
614
+ });
615
+ }
566
616
  });
567
617
  });
568
618
  return result;
569
619
  });
570
- state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
620
+ state.deleteExpiredJob = nodeSchedule.scheduleJob("historyDaily", "0 0 * * *", () => {
571
621
  const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
572
622
  const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
573
623
  strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
574
624
  where: {
575
625
  created_at: {
576
- $lt: expirationDate.toISOString()
626
+ $lt: expirationDate
577
627
  }
578
628
  }
629
+ }).catch((error) => {
630
+ if (error instanceof Error) {
631
+ strapi2.log.error("Error deleting expired history versions", error.message);
632
+ }
579
633
  });
580
634
  });
581
635
  state.isInitialized = true;
@@ -587,17 +641,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
587
641
  }
588
642
  };
589
643
  };
590
- const services$1 = {
644
+ const services$2 = {
591
645
  history: createHistoryService,
592
646
  lifecycles: createLifecyclesService
593
647
  };
594
- const info = { pluginName: "content-manager", type: "admin" };
648
+ const info$1 = { pluginName: "content-manager", type: "admin" };
595
649
  const historyVersionRouter = {
596
650
  type: "admin",
597
651
  routes: [
598
652
  {
599
653
  method: "GET",
600
- info,
654
+ info: info$1,
601
655
  path: "/history-versions",
602
656
  handler: "history-version.findMany",
603
657
  config: {
@@ -606,7 +660,7 @@ const historyVersionRouter = {
606
660
  },
607
661
  {
608
662
  method: "PUT",
609
- info,
663
+ info: info$1,
610
664
  path: "/history-versions/:versionId/restore",
611
665
  handler: "history-version.restoreVersion",
612
666
  config: {
@@ -615,7 +669,7 @@ const historyVersionRouter = {
615
669
  }
616
670
  ]
617
671
  };
618
- const routes$1 = {
672
+ const routes$2 = {
619
673
  "history-version": historyVersionRouter
620
674
  };
621
675
  const historyVersion = {
@@ -662,21 +716,21 @@ const historyVersion = {
662
716
  }
663
717
  }
664
718
  };
665
- const getFeature = () => {
719
+ const getFeature$1 = () => {
666
720
  if (strapi.ee.features.isEnabled("cms-content-history")) {
667
721
  return {
668
722
  register({ strapi: strapi2 }) {
669
723
  strapi2.get("models").add(historyVersion);
670
724
  },
671
725
  bootstrap({ strapi: strapi2 }) {
672
- getService(strapi2, "lifecycles").bootstrap();
726
+ getService$1(strapi2, "lifecycles").bootstrap();
673
727
  },
674
728
  destroy({ strapi: strapi2 }) {
675
- getService(strapi2, "lifecycles").destroy();
729
+ getService$1(strapi2, "lifecycles").destroy();
676
730
  },
677
- controllers: controllers$1,
678
- services: services$1,
679
- routes: routes$1
731
+ controllers: controllers$2,
732
+ services: services$2,
733
+ routes: routes$2
680
734
  };
681
735
  }
682
736
  return {
@@ -685,7 +739,7 @@ const getFeature = () => {
685
739
  }
686
740
  };
687
741
  };
688
- const history = getFeature();
742
+ const history = getFeature$1();
689
743
  const register = async ({ strapi: strapi2 }) => {
690
744
  await history.register?.({ strapi: strapi2 });
691
745
  };
@@ -693,15 +747,165 @@ const ALLOWED_WEBHOOK_EVENTS = {
693
747
  ENTRY_PUBLISH: "entry.publish",
694
748
  ENTRY_UNPUBLISH: "entry.unpublish"
695
749
  };
750
+ const FEATURE_ID = "preview";
751
+ const info = { pluginName: "content-manager", type: "admin" };
752
+ const previewRouter = {
753
+ type: "admin",
754
+ routes: [
755
+ {
756
+ method: "GET",
757
+ info,
758
+ path: "/preview/url/:contentType",
759
+ handler: "preview.getPreviewUrl",
760
+ config: {
761
+ policies: ["admin::isAuthenticatedAdmin"]
762
+ }
763
+ }
764
+ ]
765
+ };
766
+ const routes$1 = {
767
+ preview: previewRouter
768
+ };
769
+ function getService(strapi2, name) {
770
+ return strapi2.service(`plugin::content-manager.${name}`);
771
+ }
772
+ const getPreviewUrlSchema = yup__namespace.object().shape({
773
+ // Will be undefined for single types
774
+ documentId: yup__namespace.string(),
775
+ locale: yup__namespace.string().nullable(),
776
+ status: yup__namespace.string()
777
+ }).required();
778
+ const validatePreviewUrl = async (strapi2, uid2, params) => {
779
+ await strapiUtils.validateYupSchema(getPreviewUrlSchema)(params);
780
+ const newParams = fp.pick(["documentId", "locale", "status"], params);
781
+ const model = strapi2.getModel(uid2);
782
+ if (!model || model.modelType !== "contentType") {
783
+ throw new strapiUtils.errors.ValidationError("Invalid content type");
784
+ }
785
+ const isSingleType = model?.kind === "singleType";
786
+ if (!isSingleType && !params.documentId) {
787
+ throw new strapiUtils.errors.ValidationError("documentId is required for Collection Types");
788
+ }
789
+ if (isSingleType) {
790
+ const doc = await strapi2.documents(uid2).findFirst();
791
+ if (!doc) {
792
+ throw new strapiUtils.errors.NotFoundError("Document not found");
793
+ }
794
+ newParams.documentId = doc?.documentId;
795
+ }
796
+ return newParams;
797
+ };
798
+ const createPreviewController = () => {
799
+ return {
800
+ /**
801
+ * Transforms an entry into a preview URL, so that it can be previewed
802
+ * in the Content Manager.
803
+ */
804
+ async getPreviewUrl(ctx) {
805
+ const uid2 = ctx.params.contentType;
806
+ const query = ctx.request.query;
807
+ const params = await validatePreviewUrl(strapi, uid2, query);
808
+ const previewService = getService(strapi, "preview");
809
+ const url = await previewService.getPreviewUrl(uid2, params);
810
+ if (!url) {
811
+ ctx.status = 204;
812
+ }
813
+ return {
814
+ data: { url }
815
+ };
816
+ }
817
+ };
818
+ };
819
+ const controllers$1 = {
820
+ preview: createPreviewController
821
+ /**
822
+ * Casting is needed because the types aren't aware that Strapi supports
823
+ * passing a controller factory as the value, instead of a controller object directly
824
+ */
825
+ };
826
+ const createPreviewService = ({ strapi: strapi2 }) => {
827
+ const config = getService(strapi2, "preview-config");
828
+ return {
829
+ async getPreviewUrl(uid2, params) {
830
+ const handler = config.getPreviewHandler();
831
+ try {
832
+ return handler(uid2, params);
833
+ } catch (error) {
834
+ strapi2.log.error(`Failed to get preview URL: ${error}`);
835
+ throw new strapiUtils.errors.ApplicationError("Failed to get preview URL");
836
+ }
837
+ return;
838
+ }
839
+ };
840
+ };
841
+ const createPreviewConfigService = ({ strapi: strapi2 }) => {
842
+ return {
843
+ isEnabled() {
844
+ const config = strapi2.config.get("admin.preview");
845
+ if (!config) {
846
+ return false;
847
+ }
848
+ return config?.enabled ?? true;
849
+ },
850
+ /**
851
+ * Validate if the configuration is valid
852
+ */
853
+ validate() {
854
+ if (!this.isEnabled()) {
855
+ return;
856
+ }
857
+ const handler = this.getPreviewHandler();
858
+ if (typeof handler !== "function") {
859
+ throw new strapiUtils.errors.ValidationError(
860
+ "Preview configuration is invalid. Handler must be a function"
861
+ );
862
+ }
863
+ },
864
+ /**
865
+ * Utility to get the preview handler from the configuration
866
+ */
867
+ getPreviewHandler() {
868
+ const config = strapi2.config.get("admin.preview");
869
+ const emptyHandler = () => {
870
+ return void 0;
871
+ };
872
+ if (!this.isEnabled()) {
873
+ return emptyHandler;
874
+ }
875
+ return config?.config?.handler || emptyHandler;
876
+ }
877
+ };
878
+ };
879
+ const services$1 = {
880
+ preview: createPreviewService,
881
+ "preview-config": createPreviewConfigService
882
+ };
883
+ const getFeature = () => {
884
+ if (!strapi.features.future.isEnabled(FEATURE_ID)) {
885
+ return {};
886
+ }
887
+ return {
888
+ bootstrap() {
889
+ console.log("Bootstrapping preview server");
890
+ const config = getService(strapi, "preview-config");
891
+ config.validate();
892
+ },
893
+ routes: routes$1,
894
+ controllers: controllers$1,
895
+ services: services$1
896
+ };
897
+ };
898
+ const preview = getFeature();
696
899
  const bootstrap = async () => {
697
900
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
698
901
  strapi.get("webhookStore").addAllowedEvent(key, value);
699
902
  });
700
- getService$1("field-sizes").setCustomFieldInputSizes();
701
- await getService$1("components").syncConfigurations();
702
- await getService$1("content-types").syncConfigurations();
703
- await getService$1("permission").registerPermissions();
903
+ getService$2("field-sizes").setCustomFieldInputSizes();
904
+ await getService$2("components").syncConfigurations();
905
+ await getService$2("content-types").syncConfigurations();
906
+ await getService$2("permission").registerPermissions();
704
907
  await history.bootstrap?.({ strapi });
908
+ await preview.bootstrap?.({ strapi });
705
909
  };
706
910
  const destroy = async ({ strapi: strapi2 }) => {
707
911
  await history.destroy?.({ strapi: strapi2 });
@@ -1191,7 +1395,8 @@ const admin = {
1191
1395
  };
1192
1396
  const routes = {
1193
1397
  admin,
1194
- ...history.routes ? history.routes : {}
1398
+ ...history.routes ? history.routes : {},
1399
+ ...preview.routes ? preview.routes : {}
1195
1400
  };
1196
1401
  const hasPermissionsSchema = strapiUtils.yup.object({
1197
1402
  actions: strapiUtils.yup.array().of(strapiUtils.yup.string()),
@@ -1202,6 +1407,11 @@ const { createPolicy } = strapiUtils.policy;
1202
1407
  const hasPermissions = createPolicy({
1203
1408
  name: "plugin::content-manager.hasPermissions",
1204
1409
  validator: validateHasPermissionsInput,
1410
+ /**
1411
+ * NOTE: Action aliases are currently not checked at this level (policy).
1412
+ * This is currently the intended behavior to avoid changing the behavior of API related permissions.
1413
+ * If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
1414
+ */
1205
1415
  handler(ctx, config = {}) {
1206
1416
  const { actions = [], hasAtLeastOne = false } = config;
1207
1417
  const { userAbility } = ctx.state;
@@ -1443,7 +1653,7 @@ const createMetadasSchema = (schema) => {
1443
1653
  if (!value) {
1444
1654
  return strapiUtils.yup.string();
1445
1655
  }
1446
- const targetSchema = getService$1("content-types").findContentType(
1656
+ const targetSchema = getService$2("content-types").findContentType(
1447
1657
  schema.attributes[key].targetModel
1448
1658
  );
1449
1659
  if (!targetSchema) {
@@ -1595,9 +1805,11 @@ const multipleLocaleSchema = strapiUtils.yup.lazy(
1595
1805
  (value) => Array.isArray(value) ? strapiUtils.yup.array().of(singleLocaleSchema.required()) : singleLocaleSchema
1596
1806
  );
1597
1807
  const statusSchema = strapiUtils.yup.mixed().oneOf(["draft", "published"], "Invalid status");
1598
- const getDocumentLocaleAndStatus = async (request, opts = { allowMultipleLocales: false }) => {
1808
+ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultipleLocales: false }) => {
1599
1809
  const { allowMultipleLocales } = opts;
1600
- const { locale, status, ...rest } = request || {};
1810
+ const { locale, status: providedStatus, ...rest } = request || {};
1811
+ const defaultStatus = strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(model)) ? void 0 : "published";
1812
+ const status = providedStatus !== void 0 ? providedStatus : defaultStatus;
1601
1813
  const schema = strapiUtils.yup.object().shape({
1602
1814
  locale: allowMultipleLocales ? multipleLocaleSchema : singleLocaleSchema,
1603
1815
  status: statusSchema
@@ -1610,7 +1822,7 @@ const getDocumentLocaleAndStatus = async (request, opts = { allowMultipleLocales
1610
1822
  }
1611
1823
  };
1612
1824
  const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
1613
- const documentMetadata2 = getService$1("document-metadata");
1825
+ const documentMetadata2 = getService$2("document-metadata");
1614
1826
  const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
1615
1827
  let {
1616
1828
  meta: { availableLocales, availableStatus }
@@ -1636,8 +1848,8 @@ const createDocument = async (ctx, opts) => {
1636
1848
  const { userAbility, user } = ctx.state;
1637
1849
  const { model } = ctx.params;
1638
1850
  const { body } = ctx.request;
1639
- const documentManager2 = getService$1("document-manager");
1640
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1851
+ const documentManager2 = getService$2("document-manager");
1852
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1641
1853
  if (permissionChecker2.cannot.create()) {
1642
1854
  throw new strapiUtils.errors.ForbiddenError();
1643
1855
  }
@@ -1645,7 +1857,7 @@ const createDocument = async (ctx, opts) => {
1645
1857
  const setCreator = strapiUtils.setCreatorFields({ user });
1646
1858
  const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
1647
1859
  const sanitizedBody = await sanitizeFn(body);
1648
- const { locale, status = "draft" } = await getDocumentLocaleAndStatus(body);
1860
+ const { locale, status } = await getDocumentLocaleAndStatus(body, model);
1649
1861
  return documentManager2.create(model, {
1650
1862
  data: sanitizedBody,
1651
1863
  locale,
@@ -1657,14 +1869,14 @@ const updateDocument = async (ctx, opts) => {
1657
1869
  const { userAbility, user } = ctx.state;
1658
1870
  const { id, model } = ctx.params;
1659
1871
  const { body } = ctx.request;
1660
- const documentManager2 = getService$1("document-manager");
1661
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1872
+ const documentManager2 = getService$2("document-manager");
1873
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1662
1874
  if (permissionChecker2.cannot.update()) {
1663
1875
  throw new strapiUtils.errors.ForbiddenError();
1664
1876
  }
1665
1877
  const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
1666
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1667
- const { locale } = await getDocumentLocaleAndStatus(body);
1878
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1879
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
1668
1880
  const [documentVersion, documentExists] = await Promise.all([
1669
1881
  documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
1670
1882
  documentManager2.exists(model, id)
@@ -1680,7 +1892,7 @@ const updateDocument = async (ctx, opts) => {
1680
1892
  throw new strapiUtils.errors.ForbiddenError();
1681
1893
  }
1682
1894
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1683
- const setCreator = strapiUtils.setCreatorFields({ user, isEdition: true });
1895
+ const setCreator = documentVersion ? strapiUtils.setCreatorFields({ user, isEdition: true }) : strapiUtils.setCreatorFields({ user });
1684
1896
  const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
1685
1897
  const sanitizedBody = await sanitizeFn(body);
1686
1898
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1694,15 +1906,15 @@ const collectionTypes = {
1694
1906
  const { userAbility } = ctx.state;
1695
1907
  const { model } = ctx.params;
1696
1908
  const { query } = ctx.request;
1697
- const documentMetadata2 = getService$1("document-metadata");
1698
- const documentManager2 = getService$1("document-manager");
1699
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1909
+ const documentMetadata2 = getService$2("document-metadata");
1910
+ const documentManager2 = getService$2("document-manager");
1911
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1700
1912
  if (permissionChecker2.cannot.read()) {
1701
1913
  return ctx.forbidden();
1702
1914
  }
1703
1915
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
1704
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1705
- const { locale, status } = await getDocumentLocaleAndStatus(query);
1916
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1917
+ const { locale, status } = await getDocumentLocaleAndStatus(query, model);
1706
1918
  const { results: documents, pagination } = await documentManager2.findPage(
1707
1919
  { ...permissionQuery, populate, locale, status },
1708
1920
  model
@@ -1730,14 +1942,14 @@ const collectionTypes = {
1730
1942
  async findOne(ctx) {
1731
1943
  const { userAbility } = ctx.state;
1732
1944
  const { model, id } = ctx.params;
1733
- const documentManager2 = getService$1("document-manager");
1734
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1945
+ const documentManager2 = getService$2("document-manager");
1946
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1735
1947
  if (permissionChecker2.cannot.read()) {
1736
1948
  return ctx.forbidden();
1737
1949
  }
1738
1950
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
1739
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1740
- const { locale, status = "draft" } = await getDocumentLocaleAndStatus(ctx.query);
1951
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1952
+ const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
1741
1953
  const version = await documentManager2.findOne(id, model, {
1742
1954
  populate,
1743
1955
  locale,
@@ -1752,7 +1964,7 @@ const collectionTypes = {
1752
1964
  permissionChecker2,
1753
1965
  model,
1754
1966
  // @ts-expect-error TODO: fix
1755
- { id, locale, publishedAt: null },
1967
+ { documentId: id, locale, publishedAt: null },
1756
1968
  { availableLocales: true, availableStatus: false }
1757
1969
  );
1758
1970
  ctx.body = { data: {}, meta };
@@ -1767,7 +1979,7 @@ const collectionTypes = {
1767
1979
  async create(ctx) {
1768
1980
  const { userAbility } = ctx.state;
1769
1981
  const { model } = ctx.params;
1770
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1982
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1771
1983
  const [totalEntries, document] = await Promise.all([
1772
1984
  strapi.db.query(model).count(),
1773
1985
  createDocument(ctx)
@@ -1788,7 +2000,7 @@ const collectionTypes = {
1788
2000
  async update(ctx) {
1789
2001
  const { userAbility } = ctx.state;
1790
2002
  const { model } = ctx.params;
1791
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2003
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1792
2004
  const updatedVersion = await updateDocument(ctx);
1793
2005
  const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
1794
2006
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
@@ -1797,14 +2009,14 @@ const collectionTypes = {
1797
2009
  const { userAbility, user } = ctx.state;
1798
2010
  const { model, sourceId: id } = ctx.params;
1799
2011
  const { body } = ctx.request;
1800
- const documentManager2 = getService$1("document-manager");
1801
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2012
+ const documentManager2 = getService$2("document-manager");
2013
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1802
2014
  if (permissionChecker2.cannot.create()) {
1803
2015
  return ctx.forbidden();
1804
2016
  }
1805
2017
  const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
1806
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1807
- const { locale } = await getDocumentLocaleAndStatus(body);
2018
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2019
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
1808
2020
  const document = await documentManager2.findOne(id, model, {
1809
2021
  populate,
1810
2022
  locale,
@@ -1842,14 +2054,14 @@ const collectionTypes = {
1842
2054
  async delete(ctx) {
1843
2055
  const { userAbility } = ctx.state;
1844
2056
  const { id, model } = ctx.params;
1845
- const documentManager2 = getService$1("document-manager");
1846
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2057
+ const documentManager2 = getService$2("document-manager");
2058
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1847
2059
  if (permissionChecker2.cannot.delete()) {
1848
2060
  return ctx.forbidden();
1849
2061
  }
1850
2062
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
1851
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1852
- const { locale } = await getDocumentLocaleAndStatus(ctx.query);
2063
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2064
+ const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
1853
2065
  const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
1854
2066
  if (documentLocales.length === 0) {
1855
2067
  return ctx.notFound();
@@ -1870,19 +2082,42 @@ const collectionTypes = {
1870
2082
  const { userAbility } = ctx.state;
1871
2083
  const { id, model } = ctx.params;
1872
2084
  const { body } = ctx.request;
1873
- const documentManager2 = getService$1("document-manager");
1874
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2085
+ const documentManager2 = getService$2("document-manager");
2086
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1875
2087
  if (permissionChecker2.cannot.publish()) {
1876
2088
  return ctx.forbidden();
1877
2089
  }
1878
2090
  const publishedDocument = await strapi.db.transaction(async () => {
1879
2091
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1880
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1881
- const document = id ? await updateDocument(ctx, { populate }) : await createDocument(ctx, { populate });
2092
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2093
+ let document;
2094
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
2095
+ const isCreate = fp.isNil(id);
2096
+ if (isCreate) {
2097
+ if (permissionChecker2.cannot.create()) {
2098
+ throw new strapiUtils.errors.ForbiddenError();
2099
+ }
2100
+ document = await createDocument(ctx, { populate });
2101
+ }
2102
+ const isUpdate = !isCreate;
2103
+ if (isUpdate) {
2104
+ const documentExists = documentManager2.exists(model, id);
2105
+ if (!documentExists) {
2106
+ throw new strapiUtils.errors.NotFoundError("Document not found");
2107
+ }
2108
+ document = await documentManager2.findOne(id, model, { populate, locale });
2109
+ if (!document) {
2110
+ if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
2111
+ throw new strapiUtils.errors.ForbiddenError();
2112
+ }
2113
+ document = await updateDocument(ctx);
2114
+ } else if (permissionChecker2.can.update(document)) {
2115
+ await updateDocument(ctx);
2116
+ }
2117
+ }
1882
2118
  if (permissionChecker2.cannot.publish(document)) {
1883
2119
  throw new strapiUtils.errors.ForbiddenError();
1884
2120
  }
1885
- const { locale } = await getDocumentLocaleAndStatus(body);
1886
2121
  const publishResult = await documentManager2.publish(document.documentId, model, {
1887
2122
  locale
1888
2123
  // TODO: Allow setting creator fields on publish
@@ -1902,14 +2137,16 @@ const collectionTypes = {
1902
2137
  const { body } = ctx.request;
1903
2138
  const { documentIds } = body;
1904
2139
  await validateBulkActionInput(body);
1905
- const documentManager2 = getService$1("document-manager");
1906
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2140
+ const documentManager2 = getService$2("document-manager");
2141
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1907
2142
  if (permissionChecker2.cannot.publish()) {
1908
2143
  return ctx.forbidden();
1909
2144
  }
1910
2145
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1911
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1912
- const { locale } = await getDocumentLocaleAndStatus(body, { allowMultipleLocales: true });
2146
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2147
+ const { locale } = await getDocumentLocaleAndStatus(body, model, {
2148
+ allowMultipleLocales: true
2149
+ });
1913
2150
  const entityPromises = documentIds.map(
1914
2151
  (documentId) => documentManager2.findLocales(documentId, model, { populate, locale, isPublished: false })
1915
2152
  );
@@ -1931,12 +2168,14 @@ const collectionTypes = {
1931
2168
  const { body } = ctx.request;
1932
2169
  const { documentIds } = body;
1933
2170
  await validateBulkActionInput(body);
1934
- const documentManager2 = getService$1("document-manager");
1935
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2171
+ const documentManager2 = getService$2("document-manager");
2172
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1936
2173
  if (permissionChecker2.cannot.unpublish()) {
1937
2174
  return ctx.forbidden();
1938
2175
  }
1939
- const { locale } = await getDocumentLocaleAndStatus(body);
2176
+ const { locale } = await getDocumentLocaleAndStatus(body, model, {
2177
+ allowMultipleLocales: true
2178
+ });
1940
2179
  const entityPromises = documentIds.map(
1941
2180
  (documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
1942
2181
  );
@@ -1959,8 +2198,8 @@ const collectionTypes = {
1959
2198
  const {
1960
2199
  body: { discardDraft, ...body }
1961
2200
  } = ctx.request;
1962
- const documentManager2 = getService$1("document-manager");
1963
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2201
+ const documentManager2 = getService$2("document-manager");
2202
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1964
2203
  if (permissionChecker2.cannot.unpublish()) {
1965
2204
  return ctx.forbidden();
1966
2205
  }
@@ -1968,8 +2207,8 @@ const collectionTypes = {
1968
2207
  return ctx.forbidden();
1969
2208
  }
1970
2209
  const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
1971
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1972
- const { locale } = await getDocumentLocaleAndStatus(body);
2210
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2211
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
1973
2212
  const document = await documentManager2.findOne(id, model, {
1974
2213
  populate,
1975
2214
  locale,
@@ -1999,14 +2238,14 @@ const collectionTypes = {
1999
2238
  const { userAbility } = ctx.state;
2000
2239
  const { id, model } = ctx.params;
2001
2240
  const { body } = ctx.request;
2002
- const documentManager2 = getService$1("document-manager");
2003
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2241
+ const documentManager2 = getService$2("document-manager");
2242
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2004
2243
  if (permissionChecker2.cannot.discard()) {
2005
2244
  return ctx.forbidden();
2006
2245
  }
2007
2246
  const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
2008
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2009
- const { locale } = await getDocumentLocaleAndStatus(body);
2247
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2248
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
2010
2249
  const document = await documentManager2.findOne(id, model, {
2011
2250
  populate,
2012
2251
  locale,
@@ -2030,14 +2269,14 @@ const collectionTypes = {
2030
2269
  const { query, body } = ctx.request;
2031
2270
  const { documentIds } = body;
2032
2271
  await validateBulkActionInput(body);
2033
- const documentManager2 = getService$1("document-manager");
2034
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2272
+ const documentManager2 = getService$2("document-manager");
2273
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2035
2274
  if (permissionChecker2.cannot.delete()) {
2036
2275
  return ctx.forbidden();
2037
2276
  }
2038
2277
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
2039
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2040
- const { locale } = await getDocumentLocaleAndStatus(body);
2278
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2279
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
2041
2280
  const documentLocales = await documentManager2.findLocales(documentIds, model, {
2042
2281
  populate,
2043
2282
  locale
@@ -2057,14 +2296,14 @@ const collectionTypes = {
2057
2296
  async countDraftRelations(ctx) {
2058
2297
  const { userAbility } = ctx.state;
2059
2298
  const { model, id } = ctx.params;
2060
- const documentManager2 = getService$1("document-manager");
2061
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2299
+ const documentManager2 = getService$2("document-manager");
2300
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2062
2301
  if (permissionChecker2.cannot.read()) {
2063
2302
  return ctx.forbidden();
2064
2303
  }
2065
2304
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2066
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2067
- const { locale, status = "draft" } = await getDocumentLocaleAndStatus(ctx.query);
2305
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2306
+ const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
2068
2307
  const entity = await documentManager2.findOne(id, model, { populate, locale, status });
2069
2308
  if (!entity) {
2070
2309
  return ctx.notFound();
@@ -2082,8 +2321,8 @@ const collectionTypes = {
2082
2321
  const ids = ctx.request.query.documentIds;
2083
2322
  const locale = ctx.request.query.locale;
2084
2323
  const { model } = ctx.params;
2085
- const documentManager2 = getService$1("document-manager");
2086
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2324
+ const documentManager2 = getService$2("document-manager");
2325
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2087
2326
  if (permissionChecker2.cannot.read()) {
2088
2327
  return ctx.forbidden();
2089
2328
  }
@@ -2107,13 +2346,13 @@ const collectionTypes = {
2107
2346
  };
2108
2347
  const components$1 = {
2109
2348
  findComponents(ctx) {
2110
- const components2 = getService$1("components").findAllComponents();
2111
- const { toDto } = getService$1("data-mapper");
2349
+ const components2 = getService$2("components").findAllComponents();
2350
+ const { toDto } = getService$2("data-mapper");
2112
2351
  ctx.body = { data: components2.map(toDto) };
2113
2352
  },
2114
2353
  async findComponentConfiguration(ctx) {
2115
2354
  const { uid: uid2 } = ctx.params;
2116
- const componentService = getService$1("components");
2355
+ const componentService = getService$2("components");
2117
2356
  const component = componentService.findComponent(uid2);
2118
2357
  if (!component) {
2119
2358
  return ctx.notFound("component.notFound");
@@ -2130,7 +2369,7 @@ const components$1 = {
2130
2369
  async updateComponentConfiguration(ctx) {
2131
2370
  const { uid: uid2 } = ctx.params;
2132
2371
  const { body } = ctx.request;
2133
- const componentService = getService$1("components");
2372
+ const componentService = getService$2("components");
2134
2373
  const component = componentService.findComponent(uid2);
2135
2374
  if (!component) {
2136
2375
  return ctx.notFound("component.notFound");
@@ -2164,12 +2403,12 @@ const contentTypes = {
2164
2403
  } catch (error) {
2165
2404
  return ctx.send({ error }, 400);
2166
2405
  }
2167
- const contentTypes2 = getService$1("content-types").findContentTypesByKind(kind);
2168
- const { toDto } = getService$1("data-mapper");
2406
+ const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
2407
+ const { toDto } = getService$2("data-mapper");
2169
2408
  ctx.body = { data: contentTypes2.map(toDto) };
2170
2409
  },
2171
2410
  async findContentTypesSettings(ctx) {
2172
- const { findAllContentTypes, findConfiguration } = getService$1("content-types");
2411
+ const { findAllContentTypes, findConfiguration } = getService$2("content-types");
2173
2412
  const contentTypes2 = await findAllContentTypes();
2174
2413
  const configurations = await Promise.all(
2175
2414
  contentTypes2.map(async (contentType) => {
@@ -2183,7 +2422,7 @@ const contentTypes = {
2183
2422
  },
2184
2423
  async findContentTypeConfiguration(ctx) {
2185
2424
  const { uid: uid2 } = ctx.params;
2186
- const contentTypeService = getService$1("content-types");
2425
+ const contentTypeService = getService$2("content-types");
2187
2426
  const contentType = await contentTypeService.findContentType(uid2);
2188
2427
  if (!contentType) {
2189
2428
  return ctx.notFound("contentType.notFound");
@@ -2205,13 +2444,13 @@ const contentTypes = {
2205
2444
  const { userAbility } = ctx.state;
2206
2445
  const { uid: uid2 } = ctx.params;
2207
2446
  const { body } = ctx.request;
2208
- const contentTypeService = getService$1("content-types");
2209
- const metricsService = getService$1("metrics");
2447
+ const contentTypeService = getService$2("content-types");
2448
+ const metricsService = getService$2("metrics");
2210
2449
  const contentType = await contentTypeService.findContentType(uid2);
2211
2450
  if (!contentType) {
2212
2451
  return ctx.notFound("contentType.notFound");
2213
2452
  }
2214
- if (!getService$1("permission").canConfigureContentType({ userAbility, contentType })) {
2453
+ if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
2215
2454
  return ctx.forbidden();
2216
2455
  }
2217
2456
  let input;
@@ -2244,10 +2483,10 @@ const contentTypes = {
2244
2483
  };
2245
2484
  const init = {
2246
2485
  getInitData(ctx) {
2247
- const { toDto } = getService$1("data-mapper");
2248
- const { findAllComponents } = getService$1("components");
2249
- const { getAllFieldSizes } = getService$1("field-sizes");
2250
- const { findAllContentTypes } = getService$1("content-types");
2486
+ const { toDto } = getService$2("data-mapper");
2487
+ const { findAllComponents } = getService$2("components");
2488
+ const { getAllFieldSizes } = getService$2("field-sizes");
2489
+ const { findAllContentTypes } = getService$2("content-types");
2251
2490
  ctx.body = {
2252
2491
  data: {
2253
2492
  fieldSizes: getAllFieldSizes(),
@@ -2283,36 +2522,41 @@ const addFiltersClause = (params, filtersClause) => {
2283
2522
  params.filters.$and.push(filtersClause);
2284
2523
  };
2285
2524
  const sanitizeMainField = (model, mainField, userAbility) => {
2286
- const permissionChecker2 = getService$1("permission-checker").create({
2525
+ const permissionChecker2 = getService$2("permission-checker").create({
2287
2526
  userAbility,
2288
2527
  model: model.uid
2289
2528
  });
2290
- if (!isListable(model, mainField)) {
2529
+ const isMainFieldListable = isListable(model, mainField);
2530
+ const canReadMainField = permissionChecker2.can.read(null, mainField);
2531
+ if (!isMainFieldListable || !canReadMainField) {
2291
2532
  return "id";
2292
2533
  }
2293
- if (permissionChecker2.cannot.read(null, mainField)) {
2294
- if (model.uid === "plugin::users-permissions.role") {
2295
- const userPermissionChecker = getService$1("permission-checker").create({
2296
- userAbility,
2297
- model: "plugin::users-permissions.user"
2298
- });
2299
- if (userPermissionChecker.can.read()) {
2300
- return "name";
2301
- }
2302
- }
2303
- return "id";
2534
+ if (model.uid === "plugin::users-permissions.role") {
2535
+ return "name";
2304
2536
  }
2305
2537
  return mainField;
2306
2538
  };
2307
- const addStatusToRelations = async (uid2, relations2) => {
2308
- if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2539
+ const addStatusToRelations = async (targetUid, relations2) => {
2540
+ if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
2309
2541
  return relations2;
2310
2542
  }
2311
- const documentMetadata2 = getService$1("document-metadata");
2312
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
2543
+ const documentMetadata2 = getService$2("document-metadata");
2544
+ if (!relations2.length) {
2545
+ return relations2;
2546
+ }
2547
+ const firstRelation = relations2[0];
2548
+ const filters = {
2549
+ documentId: { $in: relations2.map((r) => r.documentId) },
2550
+ // NOTE: find the "opposite" status
2551
+ publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
2552
+ };
2553
+ const availableStatus = await strapi.query(targetUid).findMany({
2554
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
2555
+ filters
2556
+ });
2313
2557
  return relations2.map((relation) => {
2314
- const availableStatuses = documentsAvailableStatus.filter(
2315
- (availableDocument) => availableDocument.documentId === relation.documentId
2558
+ const availableStatuses = availableStatus.filter(
2559
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2316
2560
  );
2317
2561
  return {
2318
2562
  ...relation,
@@ -2333,11 +2577,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2333
2577
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2334
2578
  const isSourceLocalized = isLocalized(sourceModel);
2335
2579
  const isTargetLocalized = isLocalized(targetModel);
2336
- let validatedLocale = locale;
2337
- if (!targetModel || !isTargetLocalized)
2338
- validatedLocale = void 0;
2339
2580
  return {
2340
- locale: validatedLocale,
2581
+ locale,
2341
2582
  isSourceLocalized,
2342
2583
  isTargetLocalized
2343
2584
  };
@@ -2377,7 +2618,7 @@ const relations = {
2377
2618
  ctx.request?.query?.locale
2378
2619
  );
2379
2620
  const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
2380
- const permissionChecker2 = getService$1("permission-checker").create({
2621
+ const permissionChecker2 = getService$2("permission-checker").create({
2381
2622
  userAbility,
2382
2623
  model
2383
2624
  });
@@ -2402,7 +2643,7 @@ const relations = {
2402
2643
  where.id = id;
2403
2644
  }
2404
2645
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2405
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2646
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2406
2647
  const currentEntity = await strapi.db.query(model).findOne({
2407
2648
  where,
2408
2649
  populate
@@ -2417,7 +2658,7 @@ const relations = {
2417
2658
  }
2418
2659
  entryId = currentEntity.id;
2419
2660
  }
2420
- const modelConfig = isComponent2 ? await getService$1("components").findConfiguration(sourceSchema) : await getService$1("content-types").findConfiguration(sourceSchema);
2661
+ const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
2421
2662
  const targetSchema = strapi.getModel(targetUid);
2422
2663
  const mainField = fp.flow(
2423
2664
  fp.prop(`metadatas.${targetField}.edit.mainField`),
@@ -2440,7 +2681,7 @@ const relations = {
2440
2681
  attribute,
2441
2682
  fieldsToSelect,
2442
2683
  mainField,
2443
- source: { schema: sourceSchema },
2684
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2444
2685
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2445
2686
  sourceSchema,
2446
2687
  targetSchema,
@@ -2462,7 +2703,8 @@ const relations = {
2462
2703
  fieldsToSelect,
2463
2704
  mainField,
2464
2705
  source: {
2465
- schema: { uid: sourceUid, modelType: sourceModelType }
2706
+ schema: { uid: sourceUid, modelType: sourceModelType },
2707
+ isLocalized: isSourceLocalized
2466
2708
  },
2467
2709
  target: {
2468
2710
  schema: { uid: targetUid },
@@ -2470,7 +2712,7 @@ const relations = {
2470
2712
  }
2471
2713
  } = await this.extractAndValidateRequestInfo(ctx, id);
2472
2714
  const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
2473
- const permissionChecker2 = getService$1("permission-checker").create({
2715
+ const permissionChecker2 = getService$2("permission-checker").create({
2474
2716
  userAbility: ctx.state.userAbility,
2475
2717
  model: targetUid
2476
2718
  });
@@ -2500,12 +2742,16 @@ const relations = {
2500
2742
  } else {
2501
2743
  where.id = id;
2502
2744
  }
2503
- if (status) {
2504
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2745
+ const publishedAt = getPublishedAtClause(status, targetUid);
2746
+ if (!fp.isEmpty(publishedAt)) {
2747
+ where[`${alias}.published_at`] = publishedAt;
2505
2748
  }
2506
- if (filterByLocale) {
2749
+ if (isTargetLocalized && locale) {
2507
2750
  where[`${alias}.locale`] = locale;
2508
2751
  }
2752
+ if (isSourceLocalized && locale) {
2753
+ where.locale = locale;
2754
+ }
2509
2755
  if ((idsToInclude?.length ?? 0) !== 0) {
2510
2756
  where[`${alias}.id`].$notIn = idsToInclude;
2511
2757
  }
@@ -2523,7 +2769,8 @@ const relations = {
2523
2769
  id: { $notIn: fp.uniq(idsToOmit) }
2524
2770
  });
2525
2771
  }
2526
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2772
+ const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
2773
+ const res = await strapi.db.query(targetUid).findPage(dbQuery);
2527
2774
  ctx.body = {
2528
2775
  ...res,
2529
2776
  results: await addStatusToRelations(targetUid, res.results)
@@ -2538,29 +2785,39 @@ const relations = {
2538
2785
  attribute,
2539
2786
  targetField,
2540
2787
  fieldsToSelect,
2541
- source: {
2542
- schema: { uid: sourceUid }
2543
- },
2544
- target: {
2545
- schema: { uid: targetUid }
2546
- }
2788
+ status,
2789
+ source: { schema: sourceSchema },
2790
+ target: { schema: targetSchema }
2547
2791
  } = await this.extractAndValidateRequestInfo(ctx, id);
2548
- const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2792
+ const { uid: sourceUid } = sourceSchema;
2793
+ const { uid: targetUid } = targetSchema;
2794
+ const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2549
2795
  const dbQuery = strapi.db.query(sourceUid);
2550
2796
  const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2797
+ const filters = {};
2798
+ if (sourceSchema?.options?.draftAndPublish) {
2799
+ if (targetSchema?.options?.draftAndPublish) {
2800
+ if (status === "published") {
2801
+ filters.publishedAt = { $notNull: true };
2802
+ } else {
2803
+ filters.publishedAt = { $null: true };
2804
+ }
2805
+ }
2806
+ } else if (targetSchema?.options?.draftAndPublish) {
2807
+ filters.publishedAt = { $null: true };
2808
+ }
2551
2809
  const res = await loadRelations({ id: entryId }, targetField, {
2552
- select: ["id", "documentId", "locale", "publishedAt"],
2810
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2553
2811
  ordering: "desc",
2554
2812
  page: ctx.request.query.page,
2555
- pageSize: ctx.request.query.pageSize
2813
+ pageSize: ctx.request.query.pageSize,
2814
+ filters
2556
2815
  });
2557
2816
  const loadedIds = res.results.map((item) => item.id);
2558
2817
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
2559
2818
  const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
2560
2819
  ...strapi.get("query-params").transform(targetUid, permissionQuery),
2561
- ordering: "desc",
2562
- page: ctx.request.query.page,
2563
- pageSize: ctx.request.query.pageSize
2820
+ ordering: "desc"
2564
2821
  });
2565
2822
  const relationsUnion = fp.uniqBy("id", fp.concat(sanitizedRes.results, res.results));
2566
2823
  ctx.body = {
@@ -2575,10 +2832,10 @@ const relations = {
2575
2832
  }
2576
2833
  };
2577
2834
  const buildPopulateFromQuery = async (query, model) => {
2578
- return getService$1("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
2835
+ return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
2579
2836
  };
2580
2837
  const findDocument = async (query, uid2, opts = {}) => {
2581
- const documentManager2 = getService$1("document-manager");
2838
+ const documentManager2 = getService$2("document-manager");
2582
2839
  const populate = await buildPopulateFromQuery(query, uid2);
2583
2840
  return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
2584
2841
  };
@@ -2586,13 +2843,13 @@ const createOrUpdateDocument = async (ctx, opts) => {
2586
2843
  const { user, userAbility } = ctx.state;
2587
2844
  const { model } = ctx.params;
2588
2845
  const { body, query } = ctx.request;
2589
- const documentManager2 = getService$1("document-manager");
2590
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2846
+ const documentManager2 = getService$2("document-manager");
2847
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2591
2848
  if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
2592
2849
  throw new strapiUtils.errors.ForbiddenError();
2593
2850
  }
2594
2851
  const sanitizedQuery = await permissionChecker2.sanitizedQuery.update(query);
2595
- const { locale } = await getDocumentLocaleAndStatus(body);
2852
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
2596
2853
  const [documentVersion, otherDocumentVersion] = await Promise.all([
2597
2854
  findDocument(sanitizedQuery, model, { locale, status: "draft" }),
2598
2855
  // Find the first document to check if it exists
@@ -2628,12 +2885,12 @@ const singleTypes = {
2628
2885
  const { userAbility } = ctx.state;
2629
2886
  const { model } = ctx.params;
2630
2887
  const { query = {} } = ctx.request;
2631
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2888
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2632
2889
  if (permissionChecker2.cannot.read()) {
2633
2890
  return ctx.forbidden();
2634
2891
  }
2635
2892
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
2636
- const { locale, status } = await getDocumentLocaleAndStatus(query);
2893
+ const { locale, status } = await getDocumentLocaleAndStatus(query, model);
2637
2894
  const version = await findDocument(permissionQuery, model, { locale, status });
2638
2895
  if (!version) {
2639
2896
  if (permissionChecker2.cannot.create()) {
@@ -2647,7 +2904,7 @@ const singleTypes = {
2647
2904
  permissionChecker2,
2648
2905
  model,
2649
2906
  // @ts-expect-error - fix types
2650
- { id: document.documentId, locale, publishedAt: null },
2907
+ { documentId: document.documentId, locale, publishedAt: null },
2651
2908
  { availableLocales: true, availableStatus: false }
2652
2909
  );
2653
2910
  ctx.body = { data: {}, meta };
@@ -2662,7 +2919,7 @@ const singleTypes = {
2662
2919
  async createOrUpdate(ctx) {
2663
2920
  const { userAbility } = ctx.state;
2664
2921
  const { model } = ctx.params;
2665
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2922
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2666
2923
  const document = await createOrUpdateDocument(ctx);
2667
2924
  const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
2668
2925
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
@@ -2671,14 +2928,14 @@ const singleTypes = {
2671
2928
  const { userAbility } = ctx.state;
2672
2929
  const { model } = ctx.params;
2673
2930
  const { query = {} } = ctx.request;
2674
- const documentManager2 = getService$1("document-manager");
2675
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2931
+ const documentManager2 = getService$2("document-manager");
2932
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2676
2933
  if (permissionChecker2.cannot.delete()) {
2677
2934
  return ctx.forbidden();
2678
2935
  }
2679
2936
  const sanitizedQuery = await permissionChecker2.sanitizedQuery.delete(query);
2680
2937
  const populate = await buildPopulateFromQuery(sanitizedQuery, model);
2681
- const { locale } = await getDocumentLocaleAndStatus(query);
2938
+ const { locale } = await getDocumentLocaleAndStatus(query, model);
2682
2939
  const documentLocales = await documentManager2.findLocales(void 0, model, {
2683
2940
  populate,
2684
2941
  locale
@@ -2700,8 +2957,8 @@ const singleTypes = {
2700
2957
  const { userAbility } = ctx.state;
2701
2958
  const { model } = ctx.params;
2702
2959
  const { query = {} } = ctx.request;
2703
- const documentManager2 = getService$1("document-manager");
2704
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2960
+ const documentManager2 = getService$2("document-manager");
2961
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2705
2962
  if (permissionChecker2.cannot.publish()) {
2706
2963
  return ctx.forbidden();
2707
2964
  }
@@ -2715,7 +2972,7 @@ const singleTypes = {
2715
2972
  if (permissionChecker2.cannot.publish(document)) {
2716
2973
  throw new strapiUtils.errors.ForbiddenError();
2717
2974
  }
2718
- const { locale } = await getDocumentLocaleAndStatus(document);
2975
+ const { locale } = await getDocumentLocaleAndStatus(document, model);
2719
2976
  const publishResult = await documentManager2.publish(document.documentId, model, { locale });
2720
2977
  return publishResult.at(0);
2721
2978
  });
@@ -2729,8 +2986,8 @@ const singleTypes = {
2729
2986
  body: { discardDraft, ...body },
2730
2987
  query = {}
2731
2988
  } = ctx.request;
2732
- const documentManager2 = getService$1("document-manager");
2733
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2989
+ const documentManager2 = getService$2("document-manager");
2990
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2734
2991
  if (permissionChecker2.cannot.unpublish()) {
2735
2992
  return ctx.forbidden();
2736
2993
  }
@@ -2738,7 +2995,7 @@ const singleTypes = {
2738
2995
  return ctx.forbidden();
2739
2996
  }
2740
2997
  const sanitizedQuery = await permissionChecker2.sanitizedQuery.unpublish(query);
2741
- const { locale } = await getDocumentLocaleAndStatus(body);
2998
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
2742
2999
  const document = await findDocument(sanitizedQuery, model, { locale });
2743
3000
  if (!document) {
2744
3001
  return ctx.notFound();
@@ -2764,13 +3021,13 @@ const singleTypes = {
2764
3021
  const { userAbility } = ctx.state;
2765
3022
  const { model } = ctx.params;
2766
3023
  const { body, query = {} } = ctx.request;
2767
- const documentManager2 = getService$1("document-manager");
2768
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3024
+ const documentManager2 = getService$2("document-manager");
3025
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2769
3026
  if (permissionChecker2.cannot.discard()) {
2770
3027
  return ctx.forbidden();
2771
3028
  }
2772
3029
  const sanitizedQuery = await permissionChecker2.sanitizedQuery.discard(query);
2773
- const { locale } = await getDocumentLocaleAndStatus(body);
3030
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
2774
3031
  const document = await findDocument(sanitizedQuery, model, { locale, status: "published" });
2775
3032
  if (!document) {
2776
3033
  return ctx.notFound();
@@ -2788,9 +3045,9 @@ const singleTypes = {
2788
3045
  const { userAbility } = ctx.state;
2789
3046
  const { model } = ctx.params;
2790
3047
  const { query } = ctx.request;
2791
- const documentManager2 = getService$1("document-manager");
2792
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2793
- const { locale } = await getDocumentLocaleAndStatus(query);
3048
+ const documentManager2 = getService$2("document-manager");
3049
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
3050
+ const { locale } = await getDocumentLocaleAndStatus(query, model);
2794
3051
  if (permissionChecker2.cannot.read()) {
2795
3052
  return ctx.forbidden();
2796
3053
  }
@@ -2811,9 +3068,9 @@ const uid$1 = {
2811
3068
  async generateUID(ctx) {
2812
3069
  const { contentTypeUID, field, data } = await validateGenerateUIDInput(ctx.request.body);
2813
3070
  const { query = {} } = ctx.request;
2814
- const { locale } = await getDocumentLocaleAndStatus(query);
3071
+ const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2815
3072
  await validateUIDField(contentTypeUID, field);
2816
- const uidService = getService$1("uid");
3073
+ const uidService = getService$2("uid");
2817
3074
  ctx.body = {
2818
3075
  data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
2819
3076
  };
@@ -2823,9 +3080,9 @@ const uid$1 = {
2823
3080
  ctx.request.body
2824
3081
  );
2825
3082
  const { query = {} } = ctx.request;
2826
- const { locale } = await getDocumentLocaleAndStatus(query);
3083
+ const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2827
3084
  await validateUIDField(contentTypeUID, field);
2828
- const uidService = getService$1("uid");
3085
+ const uidService = getService$2("uid");
2829
3086
  const isAvailable = await uidService.checkUIDAvailability({
2830
3087
  contentTypeUID,
2831
3088
  field,
@@ -2846,7 +3103,8 @@ const controllers = {
2846
3103
  relations,
2847
3104
  "single-types": singleTypes,
2848
3105
  uid: uid$1,
2849
- ...history.controllers ? history.controllers : {}
3106
+ ...history.controllers ? history.controllers : {},
3107
+ ...preview.controllers ? preview.controllers : {}
2850
3108
  };
2851
3109
  const keys = {
2852
3110
  CONFIGURATION: "configuration"
@@ -2997,12 +3255,12 @@ async function syncMetadatas(configuration, schema) {
2997
3255
  return ___default.default.assign(metasWithDefaults, updatedMetas);
2998
3256
  }
2999
3257
  const getTargetSchema = (targetModel) => {
3000
- return getService$1("content-types").findContentType(targetModel);
3258
+ return getService$2("content-types").findContentType(targetModel);
3001
3259
  };
3002
3260
  const DEFAULT_LIST_LENGTH = 4;
3003
3261
  const MAX_ROW_SIZE = 12;
3004
3262
  const isAllowedFieldSize = (type, size) => {
3005
- const { getFieldSize } = getService$1("field-sizes");
3263
+ const { getFieldSize } = getService$2("field-sizes");
3006
3264
  const fieldSize = getFieldSize(type);
3007
3265
  if (!fieldSize.isResizable && size !== fieldSize.default) {
3008
3266
  return false;
@@ -3010,7 +3268,7 @@ const isAllowedFieldSize = (type, size) => {
3010
3268
  return size <= MAX_ROW_SIZE;
3011
3269
  };
3012
3270
  const getDefaultFieldSize = (attribute) => {
3013
- const { hasFieldSize, getFieldSize } = getService$1("field-sizes");
3271
+ const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
3014
3272
  return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
3015
3273
  };
3016
3274
  async function createDefaultLayouts(schema) {
@@ -3045,7 +3303,7 @@ function syncLayouts(configuration, schema) {
3045
3303
  for (const el of row) {
3046
3304
  if (!hasEditableAttribute(schema, el.name))
3047
3305
  continue;
3048
- const { hasFieldSize } = getService$1("field-sizes");
3306
+ const { hasFieldSize } = getService$2("field-sizes");
3049
3307
  const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
3050
3308
  if (!isAllowedFieldSize(fieldType, el.size)) {
3051
3309
  elementsToReAppend.push(el.name);
@@ -3185,17 +3443,17 @@ const configurationService$1 = createConfigurationService({
3185
3443
  isComponent: true,
3186
3444
  prefix: STORE_KEY_PREFIX,
3187
3445
  getModels() {
3188
- const { toContentManagerModel } = getService$1("data-mapper");
3446
+ const { toContentManagerModel } = getService$2("data-mapper");
3189
3447
  return fp.mapValues(toContentManagerModel, strapi.components);
3190
3448
  }
3191
3449
  });
3192
3450
  const components = ({ strapi: strapi2 }) => ({
3193
3451
  findAllComponents() {
3194
- const { toContentManagerModel } = getService$1("data-mapper");
3452
+ const { toContentManagerModel } = getService$2("data-mapper");
3195
3453
  return Object.values(strapi2.components).map(toContentManagerModel);
3196
3454
  },
3197
3455
  findComponent(uid2) {
3198
- const { toContentManagerModel } = getService$1("data-mapper");
3456
+ const { toContentManagerModel } = getService$2("data-mapper");
3199
3457
  const component = strapi2.components[uid2];
3200
3458
  return fp.isNil(component) ? component : toContentManagerModel(component);
3201
3459
  },
@@ -3246,17 +3504,17 @@ const configurationService = createConfigurationService({
3246
3504
  storeUtils,
3247
3505
  prefix: "content_types",
3248
3506
  getModels() {
3249
- const { toContentManagerModel } = getService$1("data-mapper");
3507
+ const { toContentManagerModel } = getService$2("data-mapper");
3250
3508
  return fp.mapValues(toContentManagerModel, strapi.contentTypes);
3251
3509
  }
3252
3510
  });
3253
3511
  const service = ({ strapi: strapi2 }) => ({
3254
3512
  findAllContentTypes() {
3255
- const { toContentManagerModel } = getService$1("data-mapper");
3513
+ const { toContentManagerModel } = getService$2("data-mapper");
3256
3514
  return Object.values(strapi2.contentTypes).map(toContentManagerModel);
3257
3515
  },
3258
3516
  findContentType(uid2) {
3259
- const { toContentManagerModel } = getService$1("data-mapper");
3517
+ const { toContentManagerModel } = getService$2("data-mapper");
3260
3518
  const contentType = strapi2.contentTypes[uid2];
3261
3519
  return fp.isNil(contentType) ? contentType : toContentManagerModel(contentType);
3262
3520
  },
@@ -3285,7 +3543,7 @@ const service = ({ strapi: strapi2 }) => ({
3285
3543
  return this.findConfiguration(contentType);
3286
3544
  },
3287
3545
  findComponentsConfigurations(contentType) {
3288
- return getService$1("components").findComponentsConfigurations(contentType);
3546
+ return getService$2("components").findComponentsConfigurations(contentType);
3289
3547
  },
3290
3548
  syncConfigurations() {
3291
3549
  return configurationService.syncConfigurations();
@@ -3466,12 +3724,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
3466
3724
  ability: userAbility,
3467
3725
  model
3468
3726
  });
3469
- const toSubject = (entity) => entity ? permissionsManager.toSubject(entity, model) : model;
3727
+ const { actionProvider } = strapi2.service("admin::permission");
3728
+ const toSubject = (entity) => {
3729
+ return entity ? permissionsManager.toSubject(entity, model) : model;
3730
+ };
3470
3731
  const can = (action, entity, field) => {
3471
- return userAbility.can(action, toSubject(entity), field);
3732
+ const subject = toSubject(entity);
3733
+ const aliases = actionProvider.unstable_aliases(action, model);
3734
+ return (
3735
+ // Test the original action to see if it passes
3736
+ userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
3737
+ aliases.some((alias) => userAbility.can(alias, subject, field))
3738
+ );
3472
3739
  };
3473
3740
  const cannot = (action, entity, field) => {
3474
- return userAbility.cannot(action, toSubject(entity), field);
3741
+ const subject = toSubject(entity);
3742
+ const aliases = actionProvider.unstable_aliases(action, model);
3743
+ return (
3744
+ // Test both the original action
3745
+ userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
3746
+ aliases.every((alias) => userAbility.cannot(alias, subject, field))
3747
+ );
3475
3748
  };
3476
3749
  const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
3477
3750
  return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
@@ -3542,7 +3815,7 @@ const permission = ({ strapi: strapi2 }) => ({
3542
3815
  return userAbility.can(action);
3543
3816
  },
3544
3817
  async registerPermissions() {
3545
- const displayedContentTypes = getService$1("content-types").findDisplayedContentTypes();
3818
+ const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
3546
3819
  const contentTypesUids = displayedContentTypes.map(fp.prop("uid"));
3547
3820
  const actions = [
3548
3821
  {
@@ -3748,6 +4021,10 @@ const getDeepPopulateDraftCount = (uid2) => {
3748
4021
  const attribute = model.attributes[attributeName];
3749
4022
  switch (attribute.type) {
3750
4023
  case "relation": {
4024
+ const isMorphRelation = attribute.relation.toLowerCase().startsWith("morph");
4025
+ if (isMorphRelation) {
4026
+ break;
4027
+ }
3751
4028
  if (isVisibleAttribute$1(model, attributeName)) {
3752
4029
  populateAcc[attributeName] = {
3753
4030
  count: true,
@@ -3814,7 +4091,7 @@ const getQueryPopulate = async (uid2, query) => {
3814
4091
  return populateQuery;
3815
4092
  };
3816
4093
  const buildDeepPopulate = (uid2) => {
3817
- return getService$1("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
4094
+ return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
3818
4095
  };
3819
4096
  const populateBuilder = (uid2) => {
3820
4097
  let getInitialPopulate = async () => {
@@ -3999,7 +4276,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
3999
4276
  */
4000
4277
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4001
4278
  const versionsByLocale = fp.groupBy("locale", allVersions);
4002
- delete versionsByLocale[version.locale];
4279
+ if (version.locale) {
4280
+ delete versionsByLocale[version.locale];
4281
+ }
4003
4282
  const model = strapi2.getModel(uid2);
4004
4283
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4005
4284
  const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
@@ -4125,7 +4404,13 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4125
4404
  */
4126
4405
  async formatDocumentWithMetadata(uid2, document, opts = {}) {
4127
4406
  if (!document) {
4128
- return document;
4407
+ return {
4408
+ data: document,
4409
+ meta: {
4410
+ availableLocales: [],
4411
+ availableStatus: []
4412
+ }
4413
+ };
4129
4414
  }
4130
4415
  const hasDraftAndPublish = strapiUtils.contentTypes.hasDraftAndPublish(strapi2.getModel(uid2));
4131
4416
  if (!hasDraftAndPublish) {
@@ -4233,10 +4518,7 @@ const documentManager = ({ strapi: strapi2 }) => {
4233
4518
  async clone(id, body, uid2) {
4234
4519
  const populate = await buildDeepPopulate(uid2);
4235
4520
  const params = {
4236
- data: {
4237
- ...omitIdField(body),
4238
- [PUBLISHED_AT_ATTRIBUTE]: null
4239
- },
4521
+ data: omitIdField(body),
4240
4522
  populate
4241
4523
  };
4242
4524
  return strapi2.documents(uid2).clone({ ...params, documentId: id }).then((result) => result?.entries.at(0));
@@ -4352,7 +4634,8 @@ const services = {
4352
4634
  permission,
4353
4635
  "populate-builder": populateBuilder$1,
4354
4636
  uid,
4355
- ...history.services ? history.services : {}
4637
+ ...history.services ? history.services : {},
4638
+ ...preview.services ? preview.services : {}
4356
4639
  };
4357
4640
  const index = () => {
4358
4641
  return {