@strapi/content-manager 0.0.0-experimental.5691f94a497e119f564a7f60ce0830bf4c875eb9 → 0.0.0-experimental.58c6b635911a7cb83cd165b4e5abd75b8ec30893

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 (169) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-qemkOlnj.mjs → ComponentConfigurationPage-BpM_Hc7r.mjs} +4 -4
  2. package/dist/_chunks/{ComponentConfigurationPage-qemkOlnj.mjs.map → ComponentConfigurationPage-BpM_Hc7r.mjs.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-D_M8iBw5.js → ComponentConfigurationPage-CL9CAMaL.js} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-D_M8iBw5.js.map → ComponentConfigurationPage-CL9CAMaL.js.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-BePwPuHy.js → EditConfigurationPage-ILWo0h1e.js} +4 -4
  6. package/dist/_chunks/{EditConfigurationPage-BePwPuHy.js.map → EditConfigurationPage-ILWo0h1e.js.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-CjUrEewK.mjs → EditConfigurationPage-_prbqpTM.mjs} +4 -4
  8. package/dist/_chunks/{EditConfigurationPage-CjUrEewK.mjs.map → EditConfigurationPage-_prbqpTM.mjs.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-B-RJeiJD.js → EditViewPage-BqZvBN4s.js} +15 -5
  10. package/dist/_chunks/EditViewPage-BqZvBN4s.js.map +1 -0
  11. package/dist/_chunks/{EditViewPage-De8GyU8P.mjs → EditViewPage-DAtscabN.mjs} +15 -5
  12. package/dist/_chunks/EditViewPage-DAtscabN.mjs.map +1 -0
  13. package/dist/_chunks/{Field-dq8Tg1M_.js → Field-CcoQiiz1.js} +92 -86
  14. package/dist/_chunks/Field-CcoQiiz1.js.map +1 -0
  15. package/dist/_chunks/{Field-pb2o8uBe.mjs → Field-D-mgn1tH.mjs} +88 -82
  16. package/dist/_chunks/Field-D-mgn1tH.mjs.map +1 -0
  17. package/dist/_chunks/{Form-DJn0Dxha.mjs → Form-BxyeWiXW.mjs} +16 -8
  18. package/dist/_chunks/Form-BxyeWiXW.mjs.map +1 -0
  19. package/dist/_chunks/{Form-DGIf4jQU.js → Form-CmLbZDfi.js} +16 -8
  20. package/dist/_chunks/Form-CmLbZDfi.js.map +1 -0
  21. package/dist/_chunks/{History-BowL3JKP.mjs → History-BOhLaq_g.mjs} +38 -41
  22. package/dist/_chunks/History-BOhLaq_g.mjs.map +1 -0
  23. package/dist/_chunks/{History-Dh2NEHnR.js → History-uECUbCZB.js} +37 -40
  24. package/dist/_chunks/History-uECUbCZB.js.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-BpVOB-hn.mjs → ListConfigurationPage-D0vQez6F.mjs} +3 -3
  26. package/dist/_chunks/{ListConfigurationPage-BpVOB-hn.mjs.map → ListConfigurationPage-D0vQez6F.mjs.map} +1 -1
  27. package/dist/_chunks/{ListConfigurationPage-BxYCWz9e.js → ListConfigurationPage-D_bBSFNW.js} +3 -3
  28. package/dist/_chunks/{ListConfigurationPage-BxYCWz9e.js.map → ListConfigurationPage-D_bBSFNW.js.map} +1 -1
  29. package/dist/_chunks/{ListViewPage-4XsciqHZ.js → ListViewPage-BkZ83b1A.js} +55 -40
  30. package/dist/_chunks/ListViewPage-BkZ83b1A.js.map +1 -0
  31. package/dist/_chunks/{ListViewPage-CXFUjZQC.mjs → ListViewPage-ns-bmy5C.mjs} +52 -37
  32. package/dist/_chunks/ListViewPage-ns-bmy5C.mjs.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-DuhOTp3x.mjs → NoContentTypePage-BA5ZKMDR.mjs} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-DuhOTp3x.mjs.map → NoContentTypePage-BA5ZKMDR.mjs.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-C8OpoHeU.js → NoContentTypePage-C1439s4s.js} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-C8OpoHeU.js.map → NoContentTypePage-C1439s4s.js.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-DVz3mzDz.mjs → NoPermissionsPage-B0GdMw1Q.mjs} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-DVz3mzDz.mjs.map → NoPermissionsPage-B0GdMw1Q.mjs.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-y_r7DVA2.js → NoPermissionsPage-CPGwsVfb.js} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-y_r7DVA2.js.map → NoPermissionsPage-CPGwsVfb.js.map} +1 -1
  41. package/dist/_chunks/{Relations-CVNLrn1Y.mjs → Relations-BIGPMSW4.mjs} +72 -36
  42. package/dist/_chunks/Relations-BIGPMSW4.mjs.map +1 -0
  43. package/dist/_chunks/{Relations-DPFCAa7b.js → Relations-d-8Uef_-.js} +71 -35
  44. package/dist/_chunks/Relations-d-8Uef_-.js.map +1 -0
  45. package/dist/_chunks/{en-uOUIxfcQ.js → en-Bdpa50w3.js} +18 -13
  46. package/dist/_chunks/{en-uOUIxfcQ.js.map → en-Bdpa50w3.js.map} +1 -1
  47. package/dist/_chunks/{en-BrCTWlZv.mjs → en-CZw4xdPY.mjs} +18 -13
  48. package/dist/_chunks/{en-BrCTWlZv.mjs.map → en-CZw4xdPY.mjs.map} +1 -1
  49. package/dist/_chunks/{es-EUonQTon.js → es-9K52xZIr.js} +2 -2
  50. package/dist/_chunks/{ja-CcFe8diO.js.map → es-9K52xZIr.js.map} +1 -1
  51. package/dist/_chunks/{es-CeXiYflN.mjs → es-D34tqjMw.mjs} +2 -2
  52. package/dist/_chunks/{es-CeXiYflN.mjs.map → es-D34tqjMw.mjs.map} +1 -1
  53. package/dist/_chunks/{fr-CD9VFbPM.mjs → fr--pg5jUbt.mjs} +13 -3
  54. package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr--pg5jUbt.mjs.map} +1 -1
  55. package/dist/_chunks/{fr-B7kGGg3E.js → fr-B2Kyv8Z9.js} +13 -3
  56. package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-B2Kyv8Z9.js.map} +1 -1
  57. package/dist/_chunks/{index-DiMrfcfy.mjs → index-3_WeHXYp.mjs} +898 -698
  58. package/dist/_chunks/index-3_WeHXYp.mjs.map +1 -0
  59. package/dist/_chunks/{index-C3fJE-1-.js → index-BgaeYWIy.js} +895 -694
  60. package/dist/_chunks/index-BgaeYWIy.js.map +1 -0
  61. package/dist/_chunks/{ja-CcFe8diO.js → ja-7sfIbjxE.js} +2 -2
  62. package/dist/_chunks/{es-EUonQTon.js.map → ja-7sfIbjxE.js.map} +1 -1
  63. package/dist/_chunks/{ja-CtsUxOvk.mjs → ja-BHqhDq4V.mjs} +2 -2
  64. package/dist/_chunks/{ja-CtsUxOvk.mjs.map → ja-BHqhDq4V.mjs.map} +1 -1
  65. package/dist/_chunks/{layout-C788OmNr.js → layout-ByFyQRDH.js} +5 -4
  66. package/dist/_chunks/{layout-C788OmNr.js.map → layout-ByFyQRDH.js.map} +1 -1
  67. package/dist/_chunks/{layout-ls3gxfpH.mjs → layout-CrTxOnCy.mjs} +5 -4
  68. package/dist/_chunks/{layout-ls3gxfpH.mjs.map → layout-CrTxOnCy.mjs.map} +1 -1
  69. package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
  70. package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
  71. package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
  72. package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
  73. package/dist/_chunks/{relations-CLcOmGO0.mjs → relations-BlpLgngh.mjs} +3 -7
  74. package/dist/_chunks/relations-BlpLgngh.mjs.map +1 -0
  75. package/dist/_chunks/{relations-DYeotliT.js → relations-C5RSW926.js} +3 -7
  76. package/dist/_chunks/relations-C5RSW926.js.map +1 -0
  77. package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
  78. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
  79. package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
  80. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
  81. package/dist/admin/index.js +2 -1
  82. package/dist/admin/index.js.map +1 -1
  83. package/dist/admin/index.mjs +3 -2
  84. package/dist/admin/src/exports.d.ts +1 -1
  85. package/dist/admin/src/hooks/useDocument.d.ts +32 -1
  86. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +0 -32
  87. package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
  88. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  89. package/dist/admin/src/preview/constants.d.ts +1 -0
  90. package/dist/admin/src/preview/index.d.ts +4 -0
  91. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  92. package/dist/admin/src/services/documents.d.ts +3 -1
  93. package/dist/server/index.js +392 -165
  94. package/dist/server/index.js.map +1 -1
  95. package/dist/server/index.mjs +392 -165
  96. package/dist/server/index.mjs.map +1 -1
  97. package/dist/server/src/bootstrap.d.ts.map +1 -1
  98. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  99. package/dist/server/src/controllers/index.d.ts.map +1 -1
  100. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  101. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  102. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  103. package/dist/server/src/history/services/history.d.ts.map +1 -1
  104. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  105. package/dist/server/src/history/services/utils.d.ts +3 -3
  106. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  107. package/dist/server/src/index.d.ts +4 -4
  108. package/dist/server/src/preview/constants.d.ts +2 -0
  109. package/dist/server/src/preview/constants.d.ts.map +1 -0
  110. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  111. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  112. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  113. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  114. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  115. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  116. package/dist/server/src/preview/index.d.ts +4 -0
  117. package/dist/server/src/preview/index.d.ts.map +1 -0
  118. package/dist/server/src/preview/routes/index.d.ts +8 -0
  119. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  120. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  121. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  122. package/dist/server/src/preview/services/index.d.ts +15 -0
  123. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  124. package/dist/server/src/preview/services/preview-config.d.ts +30 -0
  125. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  126. package/dist/server/src/preview/services/preview.d.ts +12 -0
  127. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  128. package/dist/server/src/preview/utils.d.ts +18 -0
  129. package/dist/server/src/preview/utils.d.ts.map +1 -0
  130. package/dist/server/src/routes/index.d.ts.map +1 -1
  131. package/dist/server/src/services/document-metadata.d.ts +8 -8
  132. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  133. package/dist/server/src/services/index.d.ts +4 -4
  134. package/dist/server/src/services/index.d.ts.map +1 -1
  135. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  136. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  137. package/dist/server/src/utils/index.d.ts +2 -0
  138. package/dist/server/src/utils/index.d.ts.map +1 -1
  139. package/dist/shared/contracts/collection-types.d.ts +3 -1
  140. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  141. package/dist/shared/contracts/index.d.ts +1 -0
  142. package/dist/shared/contracts/index.d.ts.map +1 -1
  143. package/dist/shared/contracts/preview.d.ts +27 -0
  144. package/dist/shared/contracts/preview.d.ts.map +1 -0
  145. package/dist/shared/index.js +4 -0
  146. package/dist/shared/index.js.map +1 -1
  147. package/dist/shared/index.mjs +4 -0
  148. package/dist/shared/index.mjs.map +1 -1
  149. package/package.json +13 -13
  150. package/dist/_chunks/EditViewPage-B-RJeiJD.js.map +0 -1
  151. package/dist/_chunks/EditViewPage-De8GyU8P.mjs.map +0 -1
  152. package/dist/_chunks/Field-dq8Tg1M_.js.map +0 -1
  153. package/dist/_chunks/Field-pb2o8uBe.mjs.map +0 -1
  154. package/dist/_chunks/Form-DGIf4jQU.js.map +0 -1
  155. package/dist/_chunks/Form-DJn0Dxha.mjs.map +0 -1
  156. package/dist/_chunks/History-BowL3JKP.mjs.map +0 -1
  157. package/dist/_chunks/History-Dh2NEHnR.js.map +0 -1
  158. package/dist/_chunks/ListViewPage-4XsciqHZ.js.map +0 -1
  159. package/dist/_chunks/ListViewPage-CXFUjZQC.mjs.map +0 -1
  160. package/dist/_chunks/Relations-CVNLrn1Y.mjs.map +0 -1
  161. package/dist/_chunks/Relations-DPFCAa7b.js.map +0 -1
  162. package/dist/_chunks/index-C3fJE-1-.js.map +0 -1
  163. package/dist/_chunks/index-DiMrfcfy.mjs.map +0 -1
  164. package/dist/_chunks/relations-CLcOmGO0.mjs.map +0 -1
  165. package/dist/_chunks/relations-DYeotliT.js.map +0 -1
  166. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  167. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  168. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
  169. 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,6 +228,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
226
228
  const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
227
229
  return documentMetadataService.getStatus(document, meta.availableStatus);
228
230
  };
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
+ };
229
242
  const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
230
243
  const model = strapi2.getModel(uid2);
231
244
  const attributes = Object.entries(model.attributes);
@@ -249,13 +262,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
249
262
  }
250
263
  case "component": {
251
264
  const populate = getDeepPopulate2(attribute.component);
252
- acc[attributeName] = { populate };
265
+ acc[attributeName] = {
266
+ populate,
267
+ [fieldSelector]: getComponentFields(attribute.component)
268
+ };
253
269
  break;
254
270
  }
255
271
  case "dynamiczone": {
256
272
  const populatedComponents = (attribute.components || []).reduce(
257
273
  (acc2, componentUID) => {
258
- acc2[componentUID] = { populate: getDeepPopulate2(componentUID) };
274
+ acc2[componentUID] = {
275
+ populate: getDeepPopulate2(componentUID),
276
+ [fieldSelector]: getComponentFields(componentUID)
277
+ };
259
278
  return acc2;
260
279
  },
261
280
  {}
@@ -317,6 +336,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
317
336
  getRelationRestoreValue,
318
337
  getMediaRestoreValue,
319
338
  getDefaultLocale,
339
+ isLocalizedContentType,
320
340
  getLocaleDictionary,
321
341
  getRetentionDays,
322
342
  getVersionStatus,
@@ -339,7 +359,13 @@ const createHistoryService = ({ strapi: strapi2 }) => {
339
359
  });
340
360
  },
341
361
  async findVersionsPage(params) {
342
- 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
+ }
343
369
  const [{ results, pagination }, localeDictionary] = await Promise.all([
344
370
  query.findPage({
345
371
  ...params.query,
@@ -361,7 +387,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
361
387
  const attributeValue = entry.data[attributeKey];
362
388
  const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
363
389
  if (attributeSchema.type === "media") {
364
- const permissionChecker2 = getService$1("permission-checker").create({
390
+ const permissionChecker2 = getService$2("permission-checker").create({
365
391
  userAbility: params.state.userAbility,
366
392
  model: "plugin::upload.file"
367
393
  });
@@ -384,7 +410,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
384
410
  if (userToPopulate == null) {
385
411
  return null;
386
412
  }
387
- 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
+ });
388
419
  })
389
420
  );
390
421
  return {
@@ -397,7 +428,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
397
428
  [attributeKey]: adminUsers
398
429
  };
399
430
  }
400
- const permissionChecker2 = getService$1("permission-checker").create({
431
+ const permissionChecker2 = getService$2("permission-checker").create({
401
432
  userAbility: params.state.userAbility,
402
433
  model: attributeSchema.target
403
434
  });
@@ -555,11 +586,13 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
555
586
  }
556
587
  const uid2 = context.contentType.uid;
557
588
  const schemas = getSchemas(uid2);
589
+ const model = strapi2.getModel(uid2);
590
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
558
591
  const localeEntries = await strapi2.db.query(uid2).findMany({
559
592
  where: {
560
593
  documentId,
561
- locale: { $in: locales },
562
- publishedAt: null
594
+ ...isLocalizedContentType ? { locale: { $in: locales } } : {},
595
+ ...strapiUtils.contentTypes.hasDraftAndPublish(strapi2.contentTypes[uid2]) ? { publishedAt: null } : {}
563
596
  },
564
597
  populate: serviceUtils.getDeepPopulate(
565
598
  uid2,
@@ -571,7 +604,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
571
604
  onCommit(async () => {
572
605
  for (const entry of localeEntries) {
573
606
  const status = await serviceUtils.getVersionStatus(uid2, entry);
574
- await getService(strapi2, "history").createVersion({
607
+ await getService$1(strapi2, "history").createVersion({
575
608
  contentType: uid2,
576
609
  data: fp.omit(FIELDS_TO_IGNORE, entry),
577
610
  relatedDocumentId: documentId,
@@ -584,15 +617,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
584
617
  });
585
618
  return result;
586
619
  });
587
- state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
620
+ state.deleteExpiredJob = nodeSchedule.scheduleJob("historyDaily", "0 0 * * *", () => {
588
621
  const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
589
622
  const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
590
623
  strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
591
624
  where: {
592
625
  created_at: {
593
- $lt: expirationDate.toISOString()
626
+ $lt: expirationDate
594
627
  }
595
628
  }
629
+ }).catch((error) => {
630
+ if (error instanceof Error) {
631
+ strapi2.log.error("Error deleting expired history versions", error.message);
632
+ }
596
633
  });
597
634
  });
598
635
  state.isInitialized = true;
@@ -604,17 +641,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
604
641
  }
605
642
  };
606
643
  };
607
- const services$1 = {
644
+ const services$2 = {
608
645
  history: createHistoryService,
609
646
  lifecycles: createLifecyclesService
610
647
  };
611
- const info = { pluginName: "content-manager", type: "admin" };
648
+ const info$1 = { pluginName: "content-manager", type: "admin" };
612
649
  const historyVersionRouter = {
613
650
  type: "admin",
614
651
  routes: [
615
652
  {
616
653
  method: "GET",
617
- info,
654
+ info: info$1,
618
655
  path: "/history-versions",
619
656
  handler: "history-version.findMany",
620
657
  config: {
@@ -623,7 +660,7 @@ const historyVersionRouter = {
623
660
  },
624
661
  {
625
662
  method: "PUT",
626
- info,
663
+ info: info$1,
627
664
  path: "/history-versions/:versionId/restore",
628
665
  handler: "history-version.restoreVersion",
629
666
  config: {
@@ -632,7 +669,7 @@ const historyVersionRouter = {
632
669
  }
633
670
  ]
634
671
  };
635
- const routes$1 = {
672
+ const routes$2 = {
636
673
  "history-version": historyVersionRouter
637
674
  };
638
675
  const historyVersion = {
@@ -679,21 +716,21 @@ const historyVersion = {
679
716
  }
680
717
  }
681
718
  };
682
- const getFeature = () => {
719
+ const getFeature$1 = () => {
683
720
  if (strapi.ee.features.isEnabled("cms-content-history")) {
684
721
  return {
685
722
  register({ strapi: strapi2 }) {
686
723
  strapi2.get("models").add(historyVersion);
687
724
  },
688
725
  bootstrap({ strapi: strapi2 }) {
689
- getService(strapi2, "lifecycles").bootstrap();
726
+ getService$1(strapi2, "lifecycles").bootstrap();
690
727
  },
691
728
  destroy({ strapi: strapi2 }) {
692
- getService(strapi2, "lifecycles").destroy();
729
+ getService$1(strapi2, "lifecycles").destroy();
693
730
  },
694
- controllers: controllers$1,
695
- services: services$1,
696
- routes: routes$1
731
+ controllers: controllers$2,
732
+ services: services$2,
733
+ routes: routes$2
697
734
  };
698
735
  }
699
736
  return {
@@ -702,7 +739,7 @@ const getFeature = () => {
702
739
  }
703
740
  };
704
741
  };
705
- const history = getFeature();
742
+ const history = getFeature$1();
706
743
  const register = async ({ strapi: strapi2 }) => {
707
744
  await history.register?.({ strapi: strapi2 });
708
745
  };
@@ -710,15 +747,165 @@ const ALLOWED_WEBHOOK_EVENTS = {
710
747
  ENTRY_PUBLISH: "entry.publish",
711
748
  ENTRY_UNPUBLISH: "entry.unpublish"
712
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();
713
899
  const bootstrap = async () => {
714
900
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
715
901
  strapi.get("webhookStore").addAllowedEvent(key, value);
716
902
  });
717
- getService$1("field-sizes").setCustomFieldInputSizes();
718
- await getService$1("components").syncConfigurations();
719
- await getService$1("content-types").syncConfigurations();
720
- 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();
721
907
  await history.bootstrap?.({ strapi });
908
+ await preview.bootstrap?.({ strapi });
722
909
  };
723
910
  const destroy = async ({ strapi: strapi2 }) => {
724
911
  await history.destroy?.({ strapi: strapi2 });
@@ -1208,7 +1395,8 @@ const admin = {
1208
1395
  };
1209
1396
  const routes = {
1210
1397
  admin,
1211
- ...history.routes ? history.routes : {}
1398
+ ...history.routes ? history.routes : {},
1399
+ ...preview.routes ? preview.routes : {}
1212
1400
  };
1213
1401
  const hasPermissionsSchema = strapiUtils.yup.object({
1214
1402
  actions: strapiUtils.yup.array().of(strapiUtils.yup.string()),
@@ -1465,7 +1653,7 @@ const createMetadasSchema = (schema) => {
1465
1653
  if (!value) {
1466
1654
  return strapiUtils.yup.string();
1467
1655
  }
1468
- const targetSchema = getService$1("content-types").findContentType(
1656
+ const targetSchema = getService$2("content-types").findContentType(
1469
1657
  schema.attributes[key].targetModel
1470
1658
  );
1471
1659
  if (!targetSchema) {
@@ -1634,7 +1822,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
1634
1822
  }
1635
1823
  };
1636
1824
  const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
1637
- const documentMetadata2 = getService$1("document-metadata");
1825
+ const documentMetadata2 = getService$2("document-metadata");
1638
1826
  const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
1639
1827
  let {
1640
1828
  meta: { availableLocales, availableStatus }
@@ -1660,8 +1848,8 @@ const createDocument = async (ctx, opts) => {
1660
1848
  const { userAbility, user } = ctx.state;
1661
1849
  const { model } = ctx.params;
1662
1850
  const { body } = ctx.request;
1663
- const documentManager2 = getService$1("document-manager");
1664
- 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 });
1665
1853
  if (permissionChecker2.cannot.create()) {
1666
1854
  throw new strapiUtils.errors.ForbiddenError();
1667
1855
  }
@@ -1681,13 +1869,13 @@ const updateDocument = async (ctx, opts) => {
1681
1869
  const { userAbility, user } = ctx.state;
1682
1870
  const { id, model } = ctx.params;
1683
1871
  const { body } = ctx.request;
1684
- const documentManager2 = getService$1("document-manager");
1685
- 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 });
1686
1874
  if (permissionChecker2.cannot.update()) {
1687
1875
  throw new strapiUtils.errors.ForbiddenError();
1688
1876
  }
1689
1877
  const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
1690
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1878
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1691
1879
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1692
1880
  const [documentVersion, documentExists] = await Promise.all([
1693
1881
  documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
@@ -1704,7 +1892,7 @@ const updateDocument = async (ctx, opts) => {
1704
1892
  throw new strapiUtils.errors.ForbiddenError();
1705
1893
  }
1706
1894
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1707
- const setCreator = strapiUtils.setCreatorFields({ user, isEdition: true });
1895
+ const setCreator = documentVersion ? strapiUtils.setCreatorFields({ user, isEdition: true }) : strapiUtils.setCreatorFields({ user });
1708
1896
  const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
1709
1897
  const sanitizedBody = await sanitizeFn(body);
1710
1898
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1718,14 +1906,14 @@ const collectionTypes = {
1718
1906
  const { userAbility } = ctx.state;
1719
1907
  const { model } = ctx.params;
1720
1908
  const { query } = ctx.request;
1721
- const documentMetadata2 = getService$1("document-metadata");
1722
- const documentManager2 = getService$1("document-manager");
1723
- 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 });
1724
1912
  if (permissionChecker2.cannot.read()) {
1725
1913
  return ctx.forbidden();
1726
1914
  }
1727
1915
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
1728
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1916
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1729
1917
  const { locale, status } = await getDocumentLocaleAndStatus(query, model);
1730
1918
  const { results: documents, pagination } = await documentManager2.findPage(
1731
1919
  { ...permissionQuery, populate, locale, status },
@@ -1754,13 +1942,13 @@ const collectionTypes = {
1754
1942
  async findOne(ctx) {
1755
1943
  const { userAbility } = ctx.state;
1756
1944
  const { model, id } = ctx.params;
1757
- const documentManager2 = getService$1("document-manager");
1758
- 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 });
1759
1947
  if (permissionChecker2.cannot.read()) {
1760
1948
  return ctx.forbidden();
1761
1949
  }
1762
1950
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
1763
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1951
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1764
1952
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
1765
1953
  const version = await documentManager2.findOne(id, model, {
1766
1954
  populate,
@@ -1776,7 +1964,7 @@ const collectionTypes = {
1776
1964
  permissionChecker2,
1777
1965
  model,
1778
1966
  // @ts-expect-error TODO: fix
1779
- { id, locale, publishedAt: null },
1967
+ { documentId: id, locale, publishedAt: null },
1780
1968
  { availableLocales: true, availableStatus: false }
1781
1969
  );
1782
1970
  ctx.body = { data: {}, meta };
@@ -1791,7 +1979,7 @@ const collectionTypes = {
1791
1979
  async create(ctx) {
1792
1980
  const { userAbility } = ctx.state;
1793
1981
  const { model } = ctx.params;
1794
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1982
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1795
1983
  const [totalEntries, document] = await Promise.all([
1796
1984
  strapi.db.query(model).count(),
1797
1985
  createDocument(ctx)
@@ -1812,7 +2000,7 @@ const collectionTypes = {
1812
2000
  async update(ctx) {
1813
2001
  const { userAbility } = ctx.state;
1814
2002
  const { model } = ctx.params;
1815
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2003
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1816
2004
  const updatedVersion = await updateDocument(ctx);
1817
2005
  const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
1818
2006
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
@@ -1821,13 +2009,13 @@ const collectionTypes = {
1821
2009
  const { userAbility, user } = ctx.state;
1822
2010
  const { model, sourceId: id } = ctx.params;
1823
2011
  const { body } = ctx.request;
1824
- const documentManager2 = getService$1("document-manager");
1825
- 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 });
1826
2014
  if (permissionChecker2.cannot.create()) {
1827
2015
  return ctx.forbidden();
1828
2016
  }
1829
2017
  const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
1830
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2018
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1831
2019
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1832
2020
  const document = await documentManager2.findOne(id, model, {
1833
2021
  populate,
@@ -1866,13 +2054,13 @@ const collectionTypes = {
1866
2054
  async delete(ctx) {
1867
2055
  const { userAbility } = ctx.state;
1868
2056
  const { id, model } = ctx.params;
1869
- const documentManager2 = getService$1("document-manager");
1870
- 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 });
1871
2059
  if (permissionChecker2.cannot.delete()) {
1872
2060
  return ctx.forbidden();
1873
2061
  }
1874
2062
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
1875
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2063
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1876
2064
  const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
1877
2065
  const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
1878
2066
  if (documentLocales.length === 0) {
@@ -1894,14 +2082,14 @@ const collectionTypes = {
1894
2082
  const { userAbility } = ctx.state;
1895
2083
  const { id, model } = ctx.params;
1896
2084
  const { body } = ctx.request;
1897
- const documentManager2 = getService$1("document-manager");
1898
- 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 });
1899
2087
  if (permissionChecker2.cannot.publish()) {
1900
2088
  return ctx.forbidden();
1901
2089
  }
1902
2090
  const publishedDocument = await strapi.db.transaction(async () => {
1903
2091
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1904
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2092
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1905
2093
  let document;
1906
2094
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1907
2095
  const isCreate = fp.isNil(id);
@@ -1913,11 +2101,17 @@ const collectionTypes = {
1913
2101
  }
1914
2102
  const isUpdate = !isCreate;
1915
2103
  if (isUpdate) {
1916
- document = await documentManager2.findOne(id, model, { populate, locale });
1917
- if (!document) {
2104
+ const documentExists = documentManager2.exists(model, id);
2105
+ if (!documentExists) {
1918
2106
  throw new strapiUtils.errors.NotFoundError("Document not found");
1919
2107
  }
1920
- if (permissionChecker2.can.update(document)) {
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)) {
1921
2115
  await updateDocument(ctx);
1922
2116
  }
1923
2117
  }
@@ -1943,13 +2137,13 @@ const collectionTypes = {
1943
2137
  const { body } = ctx.request;
1944
2138
  const { documentIds } = body;
1945
2139
  await validateBulkActionInput(body);
1946
- const documentManager2 = getService$1("document-manager");
1947
- 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 });
1948
2142
  if (permissionChecker2.cannot.publish()) {
1949
2143
  return ctx.forbidden();
1950
2144
  }
1951
2145
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1952
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2146
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1953
2147
  const { locale } = await getDocumentLocaleAndStatus(body, model, {
1954
2148
  allowMultipleLocales: true
1955
2149
  });
@@ -1974,12 +2168,14 @@ const collectionTypes = {
1974
2168
  const { body } = ctx.request;
1975
2169
  const { documentIds } = body;
1976
2170
  await validateBulkActionInput(body);
1977
- const documentManager2 = getService$1("document-manager");
1978
- 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 });
1979
2173
  if (permissionChecker2.cannot.unpublish()) {
1980
2174
  return ctx.forbidden();
1981
2175
  }
1982
- const { locale } = await getDocumentLocaleAndStatus(body, model);
2176
+ const { locale } = await getDocumentLocaleAndStatus(body, model, {
2177
+ allowMultipleLocales: true
2178
+ });
1983
2179
  const entityPromises = documentIds.map(
1984
2180
  (documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
1985
2181
  );
@@ -2002,8 +2198,8 @@ const collectionTypes = {
2002
2198
  const {
2003
2199
  body: { discardDraft, ...body }
2004
2200
  } = ctx.request;
2005
- const documentManager2 = getService$1("document-manager");
2006
- 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 });
2007
2203
  if (permissionChecker2.cannot.unpublish()) {
2008
2204
  return ctx.forbidden();
2009
2205
  }
@@ -2011,7 +2207,7 @@ const collectionTypes = {
2011
2207
  return ctx.forbidden();
2012
2208
  }
2013
2209
  const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
2014
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2210
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2015
2211
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2016
2212
  const document = await documentManager2.findOne(id, model, {
2017
2213
  populate,
@@ -2042,13 +2238,13 @@ const collectionTypes = {
2042
2238
  const { userAbility } = ctx.state;
2043
2239
  const { id, model } = ctx.params;
2044
2240
  const { body } = ctx.request;
2045
- const documentManager2 = getService$1("document-manager");
2046
- 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 });
2047
2243
  if (permissionChecker2.cannot.discard()) {
2048
2244
  return ctx.forbidden();
2049
2245
  }
2050
2246
  const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
2051
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2247
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2052
2248
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2053
2249
  const document = await documentManager2.findOne(id, model, {
2054
2250
  populate,
@@ -2073,13 +2269,13 @@ const collectionTypes = {
2073
2269
  const { query, body } = ctx.request;
2074
2270
  const { documentIds } = body;
2075
2271
  await validateBulkActionInput(body);
2076
- const documentManager2 = getService$1("document-manager");
2077
- 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 });
2078
2274
  if (permissionChecker2.cannot.delete()) {
2079
2275
  return ctx.forbidden();
2080
2276
  }
2081
2277
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
2082
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2278
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2083
2279
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2084
2280
  const documentLocales = await documentManager2.findLocales(documentIds, model, {
2085
2281
  populate,
@@ -2100,13 +2296,13 @@ const collectionTypes = {
2100
2296
  async countDraftRelations(ctx) {
2101
2297
  const { userAbility } = ctx.state;
2102
2298
  const { model, id } = ctx.params;
2103
- const documentManager2 = getService$1("document-manager");
2104
- 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 });
2105
2301
  if (permissionChecker2.cannot.read()) {
2106
2302
  return ctx.forbidden();
2107
2303
  }
2108
2304
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2109
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2305
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2110
2306
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
2111
2307
  const entity = await documentManager2.findOne(id, model, { populate, locale, status });
2112
2308
  if (!entity) {
@@ -2125,8 +2321,8 @@ const collectionTypes = {
2125
2321
  const ids = ctx.request.query.documentIds;
2126
2322
  const locale = ctx.request.query.locale;
2127
2323
  const { model } = ctx.params;
2128
- const documentManager2 = getService$1("document-manager");
2129
- 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 });
2130
2326
  if (permissionChecker2.cannot.read()) {
2131
2327
  return ctx.forbidden();
2132
2328
  }
@@ -2150,13 +2346,13 @@ const collectionTypes = {
2150
2346
  };
2151
2347
  const components$1 = {
2152
2348
  findComponents(ctx) {
2153
- const components2 = getService$1("components").findAllComponents();
2154
- const { toDto } = getService$1("data-mapper");
2349
+ const components2 = getService$2("components").findAllComponents();
2350
+ const { toDto } = getService$2("data-mapper");
2155
2351
  ctx.body = { data: components2.map(toDto) };
2156
2352
  },
2157
2353
  async findComponentConfiguration(ctx) {
2158
2354
  const { uid: uid2 } = ctx.params;
2159
- const componentService = getService$1("components");
2355
+ const componentService = getService$2("components");
2160
2356
  const component = componentService.findComponent(uid2);
2161
2357
  if (!component) {
2162
2358
  return ctx.notFound("component.notFound");
@@ -2173,7 +2369,7 @@ const components$1 = {
2173
2369
  async updateComponentConfiguration(ctx) {
2174
2370
  const { uid: uid2 } = ctx.params;
2175
2371
  const { body } = ctx.request;
2176
- const componentService = getService$1("components");
2372
+ const componentService = getService$2("components");
2177
2373
  const component = componentService.findComponent(uid2);
2178
2374
  if (!component) {
2179
2375
  return ctx.notFound("component.notFound");
@@ -2207,12 +2403,12 @@ const contentTypes = {
2207
2403
  } catch (error) {
2208
2404
  return ctx.send({ error }, 400);
2209
2405
  }
2210
- const contentTypes2 = getService$1("content-types").findContentTypesByKind(kind);
2211
- const { toDto } = getService$1("data-mapper");
2406
+ const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
2407
+ const { toDto } = getService$2("data-mapper");
2212
2408
  ctx.body = { data: contentTypes2.map(toDto) };
2213
2409
  },
2214
2410
  async findContentTypesSettings(ctx) {
2215
- const { findAllContentTypes, findConfiguration } = getService$1("content-types");
2411
+ const { findAllContentTypes, findConfiguration } = getService$2("content-types");
2216
2412
  const contentTypes2 = await findAllContentTypes();
2217
2413
  const configurations = await Promise.all(
2218
2414
  contentTypes2.map(async (contentType) => {
@@ -2226,7 +2422,7 @@ const contentTypes = {
2226
2422
  },
2227
2423
  async findContentTypeConfiguration(ctx) {
2228
2424
  const { uid: uid2 } = ctx.params;
2229
- const contentTypeService = getService$1("content-types");
2425
+ const contentTypeService = getService$2("content-types");
2230
2426
  const contentType = await contentTypeService.findContentType(uid2);
2231
2427
  if (!contentType) {
2232
2428
  return ctx.notFound("contentType.notFound");
@@ -2248,13 +2444,13 @@ const contentTypes = {
2248
2444
  const { userAbility } = ctx.state;
2249
2445
  const { uid: uid2 } = ctx.params;
2250
2446
  const { body } = ctx.request;
2251
- const contentTypeService = getService$1("content-types");
2252
- const metricsService = getService$1("metrics");
2447
+ const contentTypeService = getService$2("content-types");
2448
+ const metricsService = getService$2("metrics");
2253
2449
  const contentType = await contentTypeService.findContentType(uid2);
2254
2450
  if (!contentType) {
2255
2451
  return ctx.notFound("contentType.notFound");
2256
2452
  }
2257
- if (!getService$1("permission").canConfigureContentType({ userAbility, contentType })) {
2453
+ if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
2258
2454
  return ctx.forbidden();
2259
2455
  }
2260
2456
  let input;
@@ -2287,10 +2483,10 @@ const contentTypes = {
2287
2483
  };
2288
2484
  const init = {
2289
2485
  getInitData(ctx) {
2290
- const { toDto } = getService$1("data-mapper");
2291
- const { findAllComponents } = getService$1("components");
2292
- const { getAllFieldSizes } = getService$1("field-sizes");
2293
- 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");
2294
2490
  ctx.body = {
2295
2491
  data: {
2296
2492
  fieldSizes: getAllFieldSizes(),
@@ -2326,7 +2522,7 @@ const addFiltersClause = (params, filtersClause) => {
2326
2522
  params.filters.$and.push(filtersClause);
2327
2523
  };
2328
2524
  const sanitizeMainField = (model, mainField, userAbility) => {
2329
- const permissionChecker2 = getService$1("permission-checker").create({
2525
+ const permissionChecker2 = getService$2("permission-checker").create({
2330
2526
  userAbility,
2331
2527
  model: model.uid
2332
2528
  });
@@ -2340,15 +2536,27 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2340
2536
  }
2341
2537
  return mainField;
2342
2538
  };
2343
- const addStatusToRelations = async (uid2, relations2) => {
2344
- if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2539
+ const addStatusToRelations = async (targetUid, relations2) => {
2540
+ if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
2345
2541
  return relations2;
2346
2542
  }
2347
- const documentMetadata2 = getService$1("document-metadata");
2348
- 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
+ });
2349
2557
  return relations2.map((relation) => {
2350
- const availableStatuses = documentsAvailableStatus.filter(
2351
- (availableDocument) => availableDocument.documentId === relation.documentId
2558
+ const availableStatuses = availableStatus.filter(
2559
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2352
2560
  );
2353
2561
  return {
2354
2562
  ...relation,
@@ -2369,11 +2577,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2369
2577
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2370
2578
  const isSourceLocalized = isLocalized(sourceModel);
2371
2579
  const isTargetLocalized = isLocalized(targetModel);
2372
- let validatedLocale = locale;
2373
- if (!targetModel || !isTargetLocalized)
2374
- validatedLocale = void 0;
2375
2580
  return {
2376
- locale: validatedLocale,
2581
+ locale,
2377
2582
  isSourceLocalized,
2378
2583
  isTargetLocalized
2379
2584
  };
@@ -2413,7 +2618,7 @@ const relations = {
2413
2618
  ctx.request?.query?.locale
2414
2619
  );
2415
2620
  const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
2416
- const permissionChecker2 = getService$1("permission-checker").create({
2621
+ const permissionChecker2 = getService$2("permission-checker").create({
2417
2622
  userAbility,
2418
2623
  model
2419
2624
  });
@@ -2438,7 +2643,7 @@ const relations = {
2438
2643
  where.id = id;
2439
2644
  }
2440
2645
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2441
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2646
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2442
2647
  const currentEntity = await strapi.db.query(model).findOne({
2443
2648
  where,
2444
2649
  populate
@@ -2453,7 +2658,7 @@ const relations = {
2453
2658
  }
2454
2659
  entryId = currentEntity.id;
2455
2660
  }
2456
- 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);
2457
2662
  const targetSchema = strapi.getModel(targetUid);
2458
2663
  const mainField = fp.flow(
2459
2664
  fp.prop(`metadatas.${targetField}.edit.mainField`),
@@ -2476,7 +2681,7 @@ const relations = {
2476
2681
  attribute,
2477
2682
  fieldsToSelect,
2478
2683
  mainField,
2479
- source: { schema: sourceSchema },
2684
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2480
2685
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2481
2686
  sourceSchema,
2482
2687
  targetSchema,
@@ -2498,7 +2703,8 @@ const relations = {
2498
2703
  fieldsToSelect,
2499
2704
  mainField,
2500
2705
  source: {
2501
- schema: { uid: sourceUid, modelType: sourceModelType }
2706
+ schema: { uid: sourceUid, modelType: sourceModelType },
2707
+ isLocalized: isSourceLocalized
2502
2708
  },
2503
2709
  target: {
2504
2710
  schema: { uid: targetUid },
@@ -2506,7 +2712,7 @@ const relations = {
2506
2712
  }
2507
2713
  } = await this.extractAndValidateRequestInfo(ctx, id);
2508
2714
  const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
2509
- const permissionChecker2 = getService$1("permission-checker").create({
2715
+ const permissionChecker2 = getService$2("permission-checker").create({
2510
2716
  userAbility: ctx.state.userAbility,
2511
2717
  model: targetUid
2512
2718
  });
@@ -2536,12 +2742,16 @@ const relations = {
2536
2742
  } else {
2537
2743
  where.id = id;
2538
2744
  }
2539
- if (status) {
2540
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2745
+ const publishedAt = getPublishedAtClause(status, targetUid);
2746
+ if (!fp.isEmpty(publishedAt)) {
2747
+ where[`${alias}.published_at`] = publishedAt;
2541
2748
  }
2542
- if (filterByLocale) {
2749
+ if (isTargetLocalized && locale) {
2543
2750
  where[`${alias}.locale`] = locale;
2544
2751
  }
2752
+ if (isSourceLocalized && locale) {
2753
+ where.locale = locale;
2754
+ }
2545
2755
  if ((idsToInclude?.length ?? 0) !== 0) {
2546
2756
  where[`${alias}.id`].$notIn = idsToInclude;
2547
2757
  }
@@ -2559,7 +2769,8 @@ const relations = {
2559
2769
  id: { $notIn: fp.uniq(idsToOmit) }
2560
2770
  });
2561
2771
  }
2562
- 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);
2563
2774
  ctx.body = {
2564
2775
  ...res,
2565
2776
  results: await addStatusToRelations(targetUid, res.results)
@@ -2574,21 +2785,33 @@ const relations = {
2574
2785
  attribute,
2575
2786
  targetField,
2576
2787
  fieldsToSelect,
2577
- source: {
2578
- schema: { uid: sourceUid }
2579
- },
2580
- target: {
2581
- schema: { uid: targetUid }
2582
- }
2788
+ status,
2789
+ source: { schema: sourceSchema },
2790
+ target: { schema: targetSchema }
2583
2791
  } = await this.extractAndValidateRequestInfo(ctx, id);
2584
- 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 });
2585
2795
  const dbQuery = strapi.db.query(sourceUid);
2586
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
+ }
2587
2809
  const res = await loadRelations({ id: entryId }, targetField, {
2588
- select: ["id", "documentId", "locale", "publishedAt"],
2810
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2589
2811
  ordering: "desc",
2590
2812
  page: ctx.request.query.page,
2591
- pageSize: ctx.request.query.pageSize
2813
+ pageSize: ctx.request.query.pageSize,
2814
+ filters
2592
2815
  });
2593
2816
  const loadedIds = res.results.map((item) => item.id);
2594
2817
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
@@ -2609,10 +2832,10 @@ const relations = {
2609
2832
  }
2610
2833
  };
2611
2834
  const buildPopulateFromQuery = async (query, model) => {
2612
- 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();
2613
2836
  };
2614
2837
  const findDocument = async (query, uid2, opts = {}) => {
2615
- const documentManager2 = getService$1("document-manager");
2838
+ const documentManager2 = getService$2("document-manager");
2616
2839
  const populate = await buildPopulateFromQuery(query, uid2);
2617
2840
  return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
2618
2841
  };
@@ -2620,8 +2843,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
2620
2843
  const { user, userAbility } = ctx.state;
2621
2844
  const { model } = ctx.params;
2622
2845
  const { body, query } = ctx.request;
2623
- const documentManager2 = getService$1("document-manager");
2624
- 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 });
2625
2848
  if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
2626
2849
  throw new strapiUtils.errors.ForbiddenError();
2627
2850
  }
@@ -2662,7 +2885,7 @@ const singleTypes = {
2662
2885
  const { userAbility } = ctx.state;
2663
2886
  const { model } = ctx.params;
2664
2887
  const { query = {} } = ctx.request;
2665
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2888
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2666
2889
  if (permissionChecker2.cannot.read()) {
2667
2890
  return ctx.forbidden();
2668
2891
  }
@@ -2681,7 +2904,7 @@ const singleTypes = {
2681
2904
  permissionChecker2,
2682
2905
  model,
2683
2906
  // @ts-expect-error - fix types
2684
- { id: document.documentId, locale, publishedAt: null },
2907
+ { documentId: document.documentId, locale, publishedAt: null },
2685
2908
  { availableLocales: true, availableStatus: false }
2686
2909
  );
2687
2910
  ctx.body = { data: {}, meta };
@@ -2696,7 +2919,7 @@ const singleTypes = {
2696
2919
  async createOrUpdate(ctx) {
2697
2920
  const { userAbility } = ctx.state;
2698
2921
  const { model } = ctx.params;
2699
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2922
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2700
2923
  const document = await createOrUpdateDocument(ctx);
2701
2924
  const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
2702
2925
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
@@ -2705,8 +2928,8 @@ const singleTypes = {
2705
2928
  const { userAbility } = ctx.state;
2706
2929
  const { model } = ctx.params;
2707
2930
  const { query = {} } = ctx.request;
2708
- const documentManager2 = getService$1("document-manager");
2709
- 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 });
2710
2933
  if (permissionChecker2.cannot.delete()) {
2711
2934
  return ctx.forbidden();
2712
2935
  }
@@ -2734,8 +2957,8 @@ const singleTypes = {
2734
2957
  const { userAbility } = ctx.state;
2735
2958
  const { model } = ctx.params;
2736
2959
  const { query = {} } = ctx.request;
2737
- const documentManager2 = getService$1("document-manager");
2738
- 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 });
2739
2962
  if (permissionChecker2.cannot.publish()) {
2740
2963
  return ctx.forbidden();
2741
2964
  }
@@ -2763,8 +2986,8 @@ const singleTypes = {
2763
2986
  body: { discardDraft, ...body },
2764
2987
  query = {}
2765
2988
  } = ctx.request;
2766
- const documentManager2 = getService$1("document-manager");
2767
- 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 });
2768
2991
  if (permissionChecker2.cannot.unpublish()) {
2769
2992
  return ctx.forbidden();
2770
2993
  }
@@ -2798,8 +3021,8 @@ const singleTypes = {
2798
3021
  const { userAbility } = ctx.state;
2799
3022
  const { model } = ctx.params;
2800
3023
  const { body, query = {} } = ctx.request;
2801
- const documentManager2 = getService$1("document-manager");
2802
- 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 });
2803
3026
  if (permissionChecker2.cannot.discard()) {
2804
3027
  return ctx.forbidden();
2805
3028
  }
@@ -2822,8 +3045,8 @@ const singleTypes = {
2822
3045
  const { userAbility } = ctx.state;
2823
3046
  const { model } = ctx.params;
2824
3047
  const { query } = ctx.request;
2825
- const documentManager2 = getService$1("document-manager");
2826
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3048
+ const documentManager2 = getService$2("document-manager");
3049
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2827
3050
  const { locale } = await getDocumentLocaleAndStatus(query, model);
2828
3051
  if (permissionChecker2.cannot.read()) {
2829
3052
  return ctx.forbidden();
@@ -2847,7 +3070,7 @@ const uid$1 = {
2847
3070
  const { query = {} } = ctx.request;
2848
3071
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2849
3072
  await validateUIDField(contentTypeUID, field);
2850
- const uidService = getService$1("uid");
3073
+ const uidService = getService$2("uid");
2851
3074
  ctx.body = {
2852
3075
  data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
2853
3076
  };
@@ -2859,7 +3082,7 @@ const uid$1 = {
2859
3082
  const { query = {} } = ctx.request;
2860
3083
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2861
3084
  await validateUIDField(contentTypeUID, field);
2862
- const uidService = getService$1("uid");
3085
+ const uidService = getService$2("uid");
2863
3086
  const isAvailable = await uidService.checkUIDAvailability({
2864
3087
  contentTypeUID,
2865
3088
  field,
@@ -2880,7 +3103,8 @@ const controllers = {
2880
3103
  relations,
2881
3104
  "single-types": singleTypes,
2882
3105
  uid: uid$1,
2883
- ...history.controllers ? history.controllers : {}
3106
+ ...history.controllers ? history.controllers : {},
3107
+ ...preview.controllers ? preview.controllers : {}
2884
3108
  };
2885
3109
  const keys = {
2886
3110
  CONFIGURATION: "configuration"
@@ -3031,12 +3255,12 @@ async function syncMetadatas(configuration, schema) {
3031
3255
  return ___default.default.assign(metasWithDefaults, updatedMetas);
3032
3256
  }
3033
3257
  const getTargetSchema = (targetModel) => {
3034
- return getService$1("content-types").findContentType(targetModel);
3258
+ return getService$2("content-types").findContentType(targetModel);
3035
3259
  };
3036
3260
  const DEFAULT_LIST_LENGTH = 4;
3037
3261
  const MAX_ROW_SIZE = 12;
3038
3262
  const isAllowedFieldSize = (type, size) => {
3039
- const { getFieldSize } = getService$1("field-sizes");
3263
+ const { getFieldSize } = getService$2("field-sizes");
3040
3264
  const fieldSize = getFieldSize(type);
3041
3265
  if (!fieldSize.isResizable && size !== fieldSize.default) {
3042
3266
  return false;
@@ -3044,7 +3268,7 @@ const isAllowedFieldSize = (type, size) => {
3044
3268
  return size <= MAX_ROW_SIZE;
3045
3269
  };
3046
3270
  const getDefaultFieldSize = (attribute) => {
3047
- const { hasFieldSize, getFieldSize } = getService$1("field-sizes");
3271
+ const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
3048
3272
  return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
3049
3273
  };
3050
3274
  async function createDefaultLayouts(schema) {
@@ -3079,7 +3303,7 @@ function syncLayouts(configuration, schema) {
3079
3303
  for (const el of row) {
3080
3304
  if (!hasEditableAttribute(schema, el.name))
3081
3305
  continue;
3082
- const { hasFieldSize } = getService$1("field-sizes");
3306
+ const { hasFieldSize } = getService$2("field-sizes");
3083
3307
  const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
3084
3308
  if (!isAllowedFieldSize(fieldType, el.size)) {
3085
3309
  elementsToReAppend.push(el.name);
@@ -3219,17 +3443,17 @@ const configurationService$1 = createConfigurationService({
3219
3443
  isComponent: true,
3220
3444
  prefix: STORE_KEY_PREFIX,
3221
3445
  getModels() {
3222
- const { toContentManagerModel } = getService$1("data-mapper");
3446
+ const { toContentManagerModel } = getService$2("data-mapper");
3223
3447
  return fp.mapValues(toContentManagerModel, strapi.components);
3224
3448
  }
3225
3449
  });
3226
3450
  const components = ({ strapi: strapi2 }) => ({
3227
3451
  findAllComponents() {
3228
- const { toContentManagerModel } = getService$1("data-mapper");
3452
+ const { toContentManagerModel } = getService$2("data-mapper");
3229
3453
  return Object.values(strapi2.components).map(toContentManagerModel);
3230
3454
  },
3231
3455
  findComponent(uid2) {
3232
- const { toContentManagerModel } = getService$1("data-mapper");
3456
+ const { toContentManagerModel } = getService$2("data-mapper");
3233
3457
  const component = strapi2.components[uid2];
3234
3458
  return fp.isNil(component) ? component : toContentManagerModel(component);
3235
3459
  },
@@ -3280,17 +3504,17 @@ const configurationService = createConfigurationService({
3280
3504
  storeUtils,
3281
3505
  prefix: "content_types",
3282
3506
  getModels() {
3283
- const { toContentManagerModel } = getService$1("data-mapper");
3507
+ const { toContentManagerModel } = getService$2("data-mapper");
3284
3508
  return fp.mapValues(toContentManagerModel, strapi.contentTypes);
3285
3509
  }
3286
3510
  });
3287
3511
  const service = ({ strapi: strapi2 }) => ({
3288
3512
  findAllContentTypes() {
3289
- const { toContentManagerModel } = getService$1("data-mapper");
3513
+ const { toContentManagerModel } = getService$2("data-mapper");
3290
3514
  return Object.values(strapi2.contentTypes).map(toContentManagerModel);
3291
3515
  },
3292
3516
  findContentType(uid2) {
3293
- const { toContentManagerModel } = getService$1("data-mapper");
3517
+ const { toContentManagerModel } = getService$2("data-mapper");
3294
3518
  const contentType = strapi2.contentTypes[uid2];
3295
3519
  return fp.isNil(contentType) ? contentType : toContentManagerModel(contentType);
3296
3520
  },
@@ -3319,7 +3543,7 @@ const service = ({ strapi: strapi2 }) => ({
3319
3543
  return this.findConfiguration(contentType);
3320
3544
  },
3321
3545
  findComponentsConfigurations(contentType) {
3322
- return getService$1("components").findComponentsConfigurations(contentType);
3546
+ return getService$2("components").findComponentsConfigurations(contentType);
3323
3547
  },
3324
3548
  syncConfigurations() {
3325
3549
  return configurationService.syncConfigurations();
@@ -3591,7 +3815,7 @@ const permission = ({ strapi: strapi2 }) => ({
3591
3815
  return userAbility.can(action);
3592
3816
  },
3593
3817
  async registerPermissions() {
3594
- const displayedContentTypes = getService$1("content-types").findDisplayedContentTypes();
3818
+ const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
3595
3819
  const contentTypesUids = displayedContentTypes.map(fp.prop("uid"));
3596
3820
  const actions = [
3597
3821
  {
@@ -3867,7 +4091,7 @@ const getQueryPopulate = async (uid2, query) => {
3867
4091
  return populateQuery;
3868
4092
  };
3869
4093
  const buildDeepPopulate = (uid2) => {
3870
- return getService$1("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
4094
+ return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
3871
4095
  };
3872
4096
  const populateBuilder = (uid2) => {
3873
4097
  let getInitialPopulate = async () => {
@@ -4052,7 +4276,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4052
4276
  */
4053
4277
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4054
4278
  const versionsByLocale = fp.groupBy("locale", allVersions);
4055
- delete versionsByLocale[version.locale];
4279
+ if (version.locale) {
4280
+ delete versionsByLocale[version.locale];
4281
+ }
4056
4282
  const model = strapi2.getModel(uid2);
4057
4283
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4058
4284
  const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
@@ -4408,7 +4634,8 @@ const services = {
4408
4634
  permission,
4409
4635
  "populate-builder": populateBuilder$1,
4410
4636
  uid,
4411
- ...history.services ? history.services : {}
4637
+ ...history.services ? history.services : {},
4638
+ ...preview.services ? preview.services : {}
4412
4639
  };
4413
4640
  const index = () => {
4414
4641
  return {