@strapi/content-manager 0.0.0-next.d2d15ef227d67cce89c2673764c0555c841cd29c → 0.0.0-next.d65d44102fd32871728c0d74ec4f2519b7cc0a16

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 (165) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-DfFSZQxe.mjs → ComponentConfigurationPage-DhWA-JzT.mjs} +4 -4
  2. package/dist/_chunks/{ComponentConfigurationPage-DfFSZQxe.mjs.map → ComponentConfigurationPage-DhWA-JzT.mjs.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-FqfsxQ1j.js → ComponentConfigurationPage-UduDBv3m.js} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-FqfsxQ1j.js.map → ComponentConfigurationPage-UduDBv3m.js.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-DdPNAbl3.mjs → EditConfigurationPage-5tmx_7Hp.mjs} +4 -4
  6. package/dist/_chunks/{EditConfigurationPage-DdPNAbl3.mjs.map → EditConfigurationPage-5tmx_7Hp.mjs.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-Cn0e8t3I.js → EditConfigurationPage-Cp9UzUfs.js} +4 -4
  8. package/dist/_chunks/{EditConfigurationPage-Cn0e8t3I.js.map → EditConfigurationPage-Cp9UzUfs.js.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-B82x_x1b.mjs → EditViewPage-BKoISUOu.mjs} +38 -8
  10. package/dist/_chunks/EditViewPage-BKoISUOu.mjs.map +1 -0
  11. package/dist/_chunks/{EditViewPage-DlxEHhUt.js → EditViewPage-C7l2Emuj.js} +37 -7
  12. package/dist/_chunks/EditViewPage-C7l2Emuj.js.map +1 -0
  13. package/dist/_chunks/{Field-COL25JiC.js → Field-BPSJpDfE.js} +43 -24
  14. package/dist/_chunks/Field-BPSJpDfE.js.map +1 -0
  15. package/dist/_chunks/{Field-DufHXW17.mjs → Field-BZxzYf1x.mjs} +44 -25
  16. package/dist/_chunks/Field-BZxzYf1x.mjs.map +1 -0
  17. package/dist/_chunks/{Form-u_kAOhwB.mjs → Form-8qyOU6YG.mjs} +2 -2
  18. package/dist/_chunks/{Form-u_kAOhwB.mjs.map → Form-8qyOU6YG.mjs.map} +1 -1
  19. package/dist/_chunks/{Form-BssUwrTO.js → Form-DLkqDd2G.js} +2 -2
  20. package/dist/_chunks/{Form-BssUwrTO.js.map → Form-DLkqDd2G.js.map} +1 -1
  21. package/dist/_chunks/{History-C9t9UqpO.js → History-DYMicybF.js} +22 -92
  22. package/dist/_chunks/History-DYMicybF.js.map +1 -0
  23. package/dist/_chunks/{History-DRwA3oMM.mjs → History-N_kRb1Yr.mjs} +23 -93
  24. package/dist/_chunks/History-N_kRb1Yr.mjs.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-BxfQJzPk.mjs → ListConfigurationPage-BM3qVxug.mjs} +6 -5
  26. package/dist/_chunks/ListConfigurationPage-BM3qVxug.mjs.map +1 -0
  27. package/dist/_chunks/{ListConfigurationPage-BXYPohh-.js → ListConfigurationPage-rUF9iGWq.js} +5 -4
  28. package/dist/_chunks/ListConfigurationPage-rUF9iGWq.js.map +1 -0
  29. package/dist/_chunks/{ListViewPage-D2VD8Szg.js → ListViewPage-BSLzd7cZ.js} +62 -39
  30. package/dist/_chunks/ListViewPage-BSLzd7cZ.js.map +1 -0
  31. package/dist/_chunks/{ListViewPage-CELx2ysp.mjs → ListViewPage-CWilGbZb.mjs} +62 -39
  32. package/dist/_chunks/ListViewPage-CWilGbZb.mjs.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-BV9IjJSM.js → NoContentTypePage-CQccVhIX.js} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-BV9IjJSM.js.map → NoContentTypePage-CQccVhIX.js.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-DtJ9jcfk.mjs → NoContentTypePage-VWYlePwI.mjs} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-DtJ9jcfk.mjs.map → NoContentTypePage-VWYlePwI.mjs.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-Dp8NpF9I.js → NoPermissionsPage-Af32Gg2m.js} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-Dp8NpF9I.js.map → NoPermissionsPage-Af32Gg2m.js.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-DWleVYK7.mjs → NoPermissionsPage-CS2tCmfr.mjs} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-DWleVYK7.mjs.map → NoPermissionsPage-CS2tCmfr.mjs.map} +1 -1
  41. package/dist/_chunks/Preview-D4KzuJFL.js +291 -0
  42. package/dist/_chunks/Preview-D4KzuJFL.js.map +1 -0
  43. package/dist/_chunks/Preview-kPkuZbBJ.mjs +272 -0
  44. package/dist/_chunks/Preview-kPkuZbBJ.mjs.map +1 -0
  45. package/dist/_chunks/{Relations-BTcf5xaw.mjs → Relations-5k27Rh54.mjs} +44 -17
  46. package/dist/_chunks/Relations-5k27Rh54.mjs.map +1 -0
  47. package/dist/_chunks/{Relations-DR7EUgyC.js → Relations-D_Ki5aVM.js} +43 -16
  48. package/dist/_chunks/Relations-D_Ki5aVM.js.map +1 -0
  49. package/dist/_chunks/{en-Bm0D0IWz.js → en-BK8Xyl5I.js} +16 -4
  50. package/dist/_chunks/{en-Bm0D0IWz.js.map → en-BK8Xyl5I.js.map} +1 -1
  51. package/dist/_chunks/{en-DKV44jRb.mjs → en-Dtk_ot79.mjs} +16 -4
  52. package/dist/_chunks/{en-DKV44jRb.mjs.map → en-Dtk_ot79.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-wnqzm4Q8.mjs → index-BLPa8Dq-.mjs} +208 -94
  62. package/dist/_chunks/index-BLPa8Dq-.mjs.map +1 -0
  63. package/dist/_chunks/{index-BdMf2lfT.js → index-DwOsF7wF.js} +205 -90
  64. package/dist/_chunks/index-DwOsF7wF.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-2CfjL0T9.mjs → layout-2Si0j0jO.mjs} +3 -3
  70. package/dist/_chunks/{layout-2CfjL0T9.mjs.map → layout-2Si0j0jO.mjs.map} +1 -1
  71. package/dist/_chunks/{layout-B2MyZU-_.js → layout-CN2bFL9V.js} +3 -3
  72. package/dist/_chunks/{layout-B2MyZU-_.js.map → layout-CN2bFL9V.js.map} +1 -1
  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-BH7JJGGe.js → relations-B0E0XUY7.js} +6 -7
  78. package/dist/_chunks/relations-B0E0XUY7.js.map +1 -0
  79. package/dist/_chunks/{relations-C0w0GcXi.mjs → relations-CAxDjUJF.mjs} +6 -7
  80. package/dist/_chunks/relations-CAxDjUJF.mjs.map +1 -0
  81. package/dist/admin/index.js +1 -1
  82. package/dist/admin/index.mjs +4 -4
  83. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  84. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +2 -2
  85. package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
  86. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  87. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  88. package/dist/admin/src/preview/constants.d.ts +1 -0
  89. package/dist/admin/src/preview/index.d.ts +4 -0
  90. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  91. package/dist/admin/src/preview/routes.d.ts +3 -0
  92. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  93. package/dist/admin/src/router.d.ts +1 -1
  94. package/dist/admin/src/services/documents.d.ts +0 -3
  95. package/dist/server/index.js +391 -144
  96. package/dist/server/index.js.map +1 -1
  97. package/dist/server/index.mjs +392 -145
  98. package/dist/server/index.mjs.map +1 -1
  99. package/dist/server/src/bootstrap.d.ts.map +1 -1
  100. package/dist/server/src/controllers/index.d.ts.map +1 -1
  101. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  102. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  103. package/dist/server/src/controllers/utils/metadata.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 +2 -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 +16 -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 +32 -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 +19 -0
  129. package/dist/server/src/preview/utils.d.ts.map +1 -0
  130. package/dist/server/src/register.d.ts.map +1 -1
  131. package/dist/server/src/routes/index.d.ts.map +1 -1
  132. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  133. package/dist/server/src/services/document-metadata.d.ts +8 -8
  134. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  135. package/dist/server/src/services/index.d.ts +4 -4
  136. package/dist/server/src/services/index.d.ts.map +1 -1
  137. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  138. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  139. package/dist/server/src/utils/index.d.ts +2 -0
  140. package/dist/server/src/utils/index.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 +10 -10
  150. package/dist/_chunks/EditViewPage-B82x_x1b.mjs.map +0 -1
  151. package/dist/_chunks/EditViewPage-DlxEHhUt.js.map +0 -1
  152. package/dist/_chunks/Field-COL25JiC.js.map +0 -1
  153. package/dist/_chunks/Field-DufHXW17.mjs.map +0 -1
  154. package/dist/_chunks/History-C9t9UqpO.js.map +0 -1
  155. package/dist/_chunks/History-DRwA3oMM.mjs.map +0 -1
  156. package/dist/_chunks/ListConfigurationPage-BXYPohh-.js.map +0 -1
  157. package/dist/_chunks/ListConfigurationPage-BxfQJzPk.mjs.map +0 -1
  158. package/dist/_chunks/ListViewPage-CELx2ysp.mjs.map +0 -1
  159. package/dist/_chunks/ListViewPage-D2VD8Szg.js.map +0 -1
  160. package/dist/_chunks/Relations-BTcf5xaw.mjs.map +0 -1
  161. package/dist/_chunks/Relations-DR7EUgyC.js.map +0 -1
  162. package/dist/_chunks/index-BdMf2lfT.js.map +0 -1
  163. package/dist/_chunks/index-wnqzm4Q8.mjs.map +0 -1
  164. package/dist/_chunks/relations-BH7JJGGe.js.map +0 -1
  165. package/dist/_chunks/relations-C0w0GcXi.mjs.map +0 -1
@@ -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
@@ -228,6 +228,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
228
228
  const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
229
229
  return documentMetadataService.getStatus(document, meta.availableStatus);
230
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
+ };
231
242
  const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
232
243
  const model = strapi2.getModel(uid2);
233
244
  const attributes = Object.entries(model.attributes);
@@ -251,13 +262,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
251
262
  }
252
263
  case "component": {
253
264
  const populate = getDeepPopulate2(attribute.component);
254
- acc[attributeName] = { populate };
265
+ acc[attributeName] = {
266
+ populate,
267
+ [fieldSelector]: getComponentFields(attribute.component)
268
+ };
255
269
  break;
256
270
  }
257
271
  case "dynamiczone": {
258
272
  const populatedComponents = (attribute.components || []).reduce(
259
273
  (acc2, componentUID) => {
260
- acc2[componentUID] = { populate: getDeepPopulate2(componentUID) };
274
+ acc2[componentUID] = {
275
+ populate: getDeepPopulate2(componentUID),
276
+ [fieldSelector]: getComponentFields(componentUID)
277
+ };
261
278
  return acc2;
262
279
  },
263
280
  {}
@@ -370,7 +387,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
370
387
  const attributeValue = entry.data[attributeKey];
371
388
  const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
372
389
  if (attributeSchema.type === "media") {
373
- const permissionChecker2 = getService$1("permission-checker").create({
390
+ const permissionChecker2 = getService$2("permission-checker").create({
374
391
  userAbility: params.state.userAbility,
375
392
  model: "plugin::upload.file"
376
393
  });
@@ -411,7 +428,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
411
428
  [attributeKey]: adminUsers
412
429
  };
413
430
  }
414
- const permissionChecker2 = getService$1("permission-checker").create({
431
+ const permissionChecker2 = getService$2("permission-checker").create({
415
432
  userAbility: params.state.userAbility,
416
433
  model: attributeSchema.target
417
434
  });
@@ -587,7 +604,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
587
604
  onCommit(async () => {
588
605
  for (const entry of localeEntries) {
589
606
  const status = await serviceUtils.getVersionStatus(uid2, entry);
590
- await getService(strapi2, "history").createVersion({
607
+ await getService$1(strapi2, "history").createVersion({
591
608
  contentType: uid2,
592
609
  data: fp.omit(FIELDS_TO_IGNORE, entry),
593
610
  relatedDocumentId: documentId,
@@ -600,15 +617,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
600
617
  });
601
618
  return result;
602
619
  });
603
- state.deleteExpiredJob = nodeSchedule.scheduleJob("0 0 * * *", () => {
620
+ state.deleteExpiredJob = nodeSchedule.scheduleJob("historyDaily", "0 0 * * *", () => {
604
621
  const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
605
622
  const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
606
623
  strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
607
624
  where: {
608
625
  created_at: {
609
- $lt: expirationDate.toISOString()
626
+ $lt: expirationDate
610
627
  }
611
628
  }
629
+ }).catch((error) => {
630
+ if (error instanceof Error) {
631
+ strapi2.log.error("Error deleting expired history versions", error.message);
632
+ }
612
633
  });
613
634
  });
614
635
  state.isInitialized = true;
@@ -620,17 +641,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
620
641
  }
621
642
  };
622
643
  };
623
- const services$1 = {
644
+ const services$2 = {
624
645
  history: createHistoryService,
625
646
  lifecycles: createLifecyclesService
626
647
  };
627
- const info = { pluginName: "content-manager", type: "admin" };
648
+ const info$1 = { pluginName: "content-manager", type: "admin" };
628
649
  const historyVersionRouter = {
629
650
  type: "admin",
630
651
  routes: [
631
652
  {
632
653
  method: "GET",
633
- info,
654
+ info: info$1,
634
655
  path: "/history-versions",
635
656
  handler: "history-version.findMany",
636
657
  config: {
@@ -639,7 +660,7 @@ const historyVersionRouter = {
639
660
  },
640
661
  {
641
662
  method: "PUT",
642
- info,
663
+ info: info$1,
643
664
  path: "/history-versions/:versionId/restore",
644
665
  handler: "history-version.restoreVersion",
645
666
  config: {
@@ -648,7 +669,7 @@ const historyVersionRouter = {
648
669
  }
649
670
  ]
650
671
  };
651
- const routes$1 = {
672
+ const routes$2 = {
652
673
  "history-version": historyVersionRouter
653
674
  };
654
675
  const historyVersion = {
@@ -695,21 +716,21 @@ const historyVersion = {
695
716
  }
696
717
  }
697
718
  };
698
- const getFeature = () => {
719
+ const getFeature$1 = () => {
699
720
  if (strapi.ee.features.isEnabled("cms-content-history")) {
700
721
  return {
701
722
  register({ strapi: strapi2 }) {
702
723
  strapi2.get("models").add(historyVersion);
703
724
  },
704
725
  bootstrap({ strapi: strapi2 }) {
705
- getService(strapi2, "lifecycles").bootstrap();
726
+ getService$1(strapi2, "lifecycles").bootstrap();
706
727
  },
707
728
  destroy({ strapi: strapi2 }) {
708
- getService(strapi2, "lifecycles").destroy();
729
+ getService$1(strapi2, "lifecycles").destroy();
709
730
  },
710
- controllers: controllers$1,
711
- services: services$1,
712
- routes: routes$1
731
+ controllers: controllers$2,
732
+ services: services$2,
733
+ routes: routes$2
713
734
  };
714
735
  }
715
736
  return {
@@ -718,9 +739,205 @@ const getFeature = () => {
718
739
  }
719
740
  };
720
741
  };
721
- const history = getFeature();
742
+ const history = getFeature$1();
743
+ const FEATURE_ID = "preview";
744
+ const info = { pluginName: "content-manager", type: "admin" };
745
+ const previewRouter = {
746
+ type: "admin",
747
+ routes: [
748
+ {
749
+ method: "GET",
750
+ info,
751
+ path: "/preview/url/:contentType",
752
+ handler: "preview.getPreviewUrl",
753
+ config: {
754
+ policies: ["admin::isAuthenticatedAdmin"]
755
+ }
756
+ }
757
+ ]
758
+ };
759
+ const routes$1 = {
760
+ preview: previewRouter
761
+ };
762
+ function getService(strapi2, name) {
763
+ return strapi2.service(`plugin::content-manager.${name}`);
764
+ }
765
+ const getPreviewUrlSchema = yup__namespace.object().shape({
766
+ // Will be undefined for single types
767
+ documentId: yup__namespace.string(),
768
+ locale: yup__namespace.string().nullable(),
769
+ status: yup__namespace.string()
770
+ }).required();
771
+ const validatePreviewUrl = async (strapi2, uid2, params) => {
772
+ await strapiUtils.validateYupSchema(getPreviewUrlSchema)(params);
773
+ const newParams = fp.pick(["documentId", "locale", "status"], params);
774
+ const model = strapi2.getModel(uid2);
775
+ if (!model || model.modelType !== "contentType") {
776
+ throw new strapiUtils.errors.ValidationError("Invalid content type");
777
+ }
778
+ const isSingleType = model?.kind === "singleType";
779
+ if (!isSingleType && !params.documentId) {
780
+ throw new strapiUtils.errors.ValidationError("documentId is required for Collection Types");
781
+ }
782
+ if (isSingleType) {
783
+ const doc = await strapi2.documents(uid2).findFirst();
784
+ if (!doc) {
785
+ throw new strapiUtils.errors.NotFoundError("Document not found");
786
+ }
787
+ newParams.documentId = doc?.documentId;
788
+ }
789
+ if (!newParams.status) {
790
+ const isDPEnabled = model?.options?.draftAndPublish;
791
+ newParams.status = isDPEnabled ? "draft" : "published";
792
+ }
793
+ return newParams;
794
+ };
795
+ const createPreviewController = () => {
796
+ return {
797
+ /**
798
+ * Transforms an entry into a preview URL, so that it can be previewed
799
+ * in the Content Manager.
800
+ */
801
+ async getPreviewUrl(ctx) {
802
+ const uid2 = ctx.params.contentType;
803
+ const query = ctx.request.query;
804
+ const params = await validatePreviewUrl(strapi, uid2, query);
805
+ const previewService = getService(strapi, "preview");
806
+ const url = await previewService.getPreviewUrl(uid2, params);
807
+ if (!url) {
808
+ ctx.status = 204;
809
+ }
810
+ return {
811
+ data: { url }
812
+ };
813
+ }
814
+ };
815
+ };
816
+ const controllers$1 = {
817
+ preview: createPreviewController
818
+ /**
819
+ * Casting is needed because the types aren't aware that Strapi supports
820
+ * passing a controller factory as the value, instead of a controller object directly
821
+ */
822
+ };
823
+ const createPreviewService = ({ strapi: strapi2 }) => {
824
+ const config = getService(strapi2, "preview-config");
825
+ return {
826
+ async getPreviewUrl(uid2, params) {
827
+ const handler = config.getPreviewHandler();
828
+ try {
829
+ return handler(uid2, params);
830
+ } catch (error) {
831
+ strapi2.log.error(`Failed to get preview URL: ${error}`);
832
+ throw new strapiUtils.errors.ApplicationError("Failed to get preview URL");
833
+ }
834
+ return;
835
+ }
836
+ };
837
+ };
838
+ const extendMiddlewareConfiguration = (middleware = { name: "", config: {} }) => {
839
+ const middlewares = strapi.config.get("middlewares");
840
+ const configuredMiddlewares = middlewares.map((currentMiddleware) => {
841
+ if (currentMiddleware === middleware.name) {
842
+ return middleware;
843
+ }
844
+ if (currentMiddleware.name === middleware.name) {
845
+ return fp.mergeWith(
846
+ (objValue, srcValue) => {
847
+ if (Array.isArray(objValue)) {
848
+ return objValue.concat(srcValue);
849
+ }
850
+ return void 0;
851
+ },
852
+ currentMiddleware,
853
+ middleware
854
+ );
855
+ }
856
+ return currentMiddleware;
857
+ });
858
+ strapi.config.set("middlewares", configuredMiddlewares);
859
+ };
860
+ const createPreviewConfigService = ({ strapi: strapi2 }) => {
861
+ return {
862
+ register() {
863
+ if (!this.isEnabled()) {
864
+ return;
865
+ }
866
+ const config = strapi2.config.get("admin.preview");
867
+ if (config.config?.allowedOrigins) {
868
+ extendMiddlewareConfiguration({
869
+ name: "strapi::security",
870
+ config: {
871
+ contentSecurityPolicy: {
872
+ directives: {
873
+ "frame-src": config.config.allowedOrigins
874
+ }
875
+ }
876
+ }
877
+ });
878
+ }
879
+ },
880
+ isEnabled() {
881
+ const config = strapi2.config.get("admin.preview");
882
+ if (!config) {
883
+ return false;
884
+ }
885
+ return config?.enabled ?? true;
886
+ },
887
+ /**
888
+ * Validate if the configuration is valid
889
+ */
890
+ validate() {
891
+ if (!this.isEnabled()) {
892
+ return;
893
+ }
894
+ const handler = this.getPreviewHandler();
895
+ if (typeof handler !== "function") {
896
+ throw new strapiUtils.errors.ValidationError(
897
+ "Preview configuration is invalid. Handler must be a function"
898
+ );
899
+ }
900
+ },
901
+ /**
902
+ * Utility to get the preview handler from the configuration
903
+ */
904
+ getPreviewHandler() {
905
+ const config = strapi2.config.get("admin.preview");
906
+ const emptyHandler = () => {
907
+ return void 0;
908
+ };
909
+ if (!this.isEnabled()) {
910
+ return emptyHandler;
911
+ }
912
+ return config?.config?.handler || emptyHandler;
913
+ }
914
+ };
915
+ };
916
+ const services$1 = {
917
+ preview: createPreviewService,
918
+ "preview-config": createPreviewConfigService
919
+ };
920
+ const getFeature = () => {
921
+ if (!strapi.features.future.isEnabled(FEATURE_ID)) {
922
+ return {};
923
+ }
924
+ return {
925
+ register() {
926
+ const config = getService(strapi, "preview-config");
927
+ config.validate();
928
+ config.register();
929
+ },
930
+ bootstrap() {
931
+ },
932
+ routes: routes$1,
933
+ controllers: controllers$1,
934
+ services: services$1
935
+ };
936
+ };
937
+ const preview = getFeature();
722
938
  const register = async ({ strapi: strapi2 }) => {
723
939
  await history.register?.({ strapi: strapi2 });
940
+ await preview.register?.({ strapi: strapi2 });
724
941
  };
725
942
  const ALLOWED_WEBHOOK_EVENTS = {
726
943
  ENTRY_PUBLISH: "entry.publish",
@@ -730,11 +947,12 @@ const bootstrap = async () => {
730
947
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
731
948
  strapi.get("webhookStore").addAllowedEvent(key, value);
732
949
  });
733
- getService$1("field-sizes").setCustomFieldInputSizes();
734
- await getService$1("components").syncConfigurations();
735
- await getService$1("content-types").syncConfigurations();
736
- await getService$1("permission").registerPermissions();
950
+ getService$2("field-sizes").setCustomFieldInputSizes();
951
+ await getService$2("components").syncConfigurations();
952
+ await getService$2("content-types").syncConfigurations();
953
+ await getService$2("permission").registerPermissions();
737
954
  await history.bootstrap?.({ strapi });
955
+ await preview.bootstrap?.({ strapi });
738
956
  };
739
957
  const destroy = async ({ strapi: strapi2 }) => {
740
958
  await history.destroy?.({ strapi: strapi2 });
@@ -1224,7 +1442,8 @@ const admin = {
1224
1442
  };
1225
1443
  const routes = {
1226
1444
  admin,
1227
- ...history.routes ? history.routes : {}
1445
+ ...history.routes ? history.routes : {},
1446
+ ...preview.routes ? preview.routes : {}
1228
1447
  };
1229
1448
  const hasPermissionsSchema = strapiUtils.yup.object({
1230
1449
  actions: strapiUtils.yup.array().of(strapiUtils.yup.string()),
@@ -1481,7 +1700,7 @@ const createMetadasSchema = (schema) => {
1481
1700
  if (!value) {
1482
1701
  return strapiUtils.yup.string();
1483
1702
  }
1484
- const targetSchema = getService$1("content-types").findContentType(
1703
+ const targetSchema = getService$2("content-types").findContentType(
1485
1704
  schema.attributes[key].targetModel
1486
1705
  );
1487
1706
  if (!targetSchema) {
@@ -1650,7 +1869,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
1650
1869
  }
1651
1870
  };
1652
1871
  const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
1653
- const documentMetadata2 = getService$1("document-metadata");
1872
+ const documentMetadata2 = getService$2("document-metadata");
1654
1873
  const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
1655
1874
  let {
1656
1875
  meta: { availableLocales, availableStatus }
@@ -1676,8 +1895,8 @@ const createDocument = async (ctx, opts) => {
1676
1895
  const { userAbility, user } = ctx.state;
1677
1896
  const { model } = ctx.params;
1678
1897
  const { body } = ctx.request;
1679
- const documentManager2 = getService$1("document-manager");
1680
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1898
+ const documentManager2 = getService$2("document-manager");
1899
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1681
1900
  if (permissionChecker2.cannot.create()) {
1682
1901
  throw new strapiUtils.errors.ForbiddenError();
1683
1902
  }
@@ -1697,13 +1916,13 @@ const updateDocument = async (ctx, opts) => {
1697
1916
  const { userAbility, user } = ctx.state;
1698
1917
  const { id, model } = ctx.params;
1699
1918
  const { body } = ctx.request;
1700
- const documentManager2 = getService$1("document-manager");
1701
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1919
+ const documentManager2 = getService$2("document-manager");
1920
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1702
1921
  if (permissionChecker2.cannot.update()) {
1703
1922
  throw new strapiUtils.errors.ForbiddenError();
1704
1923
  }
1705
1924
  const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
1706
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1925
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1707
1926
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1708
1927
  const [documentVersion, documentExists] = await Promise.all([
1709
1928
  documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
@@ -1734,14 +1953,14 @@ const collectionTypes = {
1734
1953
  const { userAbility } = ctx.state;
1735
1954
  const { model } = ctx.params;
1736
1955
  const { query } = ctx.request;
1737
- const documentMetadata2 = getService$1("document-metadata");
1738
- const documentManager2 = getService$1("document-manager");
1739
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1956
+ const documentMetadata2 = getService$2("document-metadata");
1957
+ const documentManager2 = getService$2("document-manager");
1958
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1740
1959
  if (permissionChecker2.cannot.read()) {
1741
1960
  return ctx.forbidden();
1742
1961
  }
1743
1962
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
1744
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1963
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1745
1964
  const { locale, status } = await getDocumentLocaleAndStatus(query, model);
1746
1965
  const { results: documents, pagination } = await documentManager2.findPage(
1747
1966
  { ...permissionQuery, populate, locale, status },
@@ -1770,13 +1989,13 @@ const collectionTypes = {
1770
1989
  async findOne(ctx) {
1771
1990
  const { userAbility } = ctx.state;
1772
1991
  const { model, id } = ctx.params;
1773
- const documentManager2 = getService$1("document-manager");
1774
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1992
+ const documentManager2 = getService$2("document-manager");
1993
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1775
1994
  if (permissionChecker2.cannot.read()) {
1776
1995
  return ctx.forbidden();
1777
1996
  }
1778
1997
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
1779
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1998
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1780
1999
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
1781
2000
  const version = await documentManager2.findOne(id, model, {
1782
2001
  populate,
@@ -1807,7 +2026,7 @@ const collectionTypes = {
1807
2026
  async create(ctx) {
1808
2027
  const { userAbility } = ctx.state;
1809
2028
  const { model } = ctx.params;
1810
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2029
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1811
2030
  const [totalEntries, document] = await Promise.all([
1812
2031
  strapi.db.query(model).count(),
1813
2032
  createDocument(ctx)
@@ -1828,7 +2047,7 @@ const collectionTypes = {
1828
2047
  async update(ctx) {
1829
2048
  const { userAbility } = ctx.state;
1830
2049
  const { model } = ctx.params;
1831
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2050
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1832
2051
  const updatedVersion = await updateDocument(ctx);
1833
2052
  const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
1834
2053
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
@@ -1837,13 +2056,13 @@ const collectionTypes = {
1837
2056
  const { userAbility, user } = ctx.state;
1838
2057
  const { model, sourceId: id } = ctx.params;
1839
2058
  const { body } = ctx.request;
1840
- const documentManager2 = getService$1("document-manager");
1841
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2059
+ const documentManager2 = getService$2("document-manager");
2060
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1842
2061
  if (permissionChecker2.cannot.create()) {
1843
2062
  return ctx.forbidden();
1844
2063
  }
1845
2064
  const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
1846
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2065
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1847
2066
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1848
2067
  const document = await documentManager2.findOne(id, model, {
1849
2068
  populate,
@@ -1882,13 +2101,13 @@ const collectionTypes = {
1882
2101
  async delete(ctx) {
1883
2102
  const { userAbility } = ctx.state;
1884
2103
  const { id, model } = ctx.params;
1885
- const documentManager2 = getService$1("document-manager");
1886
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2104
+ const documentManager2 = getService$2("document-manager");
2105
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1887
2106
  if (permissionChecker2.cannot.delete()) {
1888
2107
  return ctx.forbidden();
1889
2108
  }
1890
2109
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
1891
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2110
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1892
2111
  const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
1893
2112
  const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
1894
2113
  if (documentLocales.length === 0) {
@@ -1910,14 +2129,14 @@ const collectionTypes = {
1910
2129
  const { userAbility } = ctx.state;
1911
2130
  const { id, model } = ctx.params;
1912
2131
  const { body } = ctx.request;
1913
- const documentManager2 = getService$1("document-manager");
1914
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2132
+ const documentManager2 = getService$2("document-manager");
2133
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1915
2134
  if (permissionChecker2.cannot.publish()) {
1916
2135
  return ctx.forbidden();
1917
2136
  }
1918
2137
  const publishedDocument = await strapi.db.transaction(async () => {
1919
2138
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1920
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2139
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1921
2140
  let document;
1922
2141
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1923
2142
  const isCreate = fp.isNil(id);
@@ -1965,13 +2184,13 @@ const collectionTypes = {
1965
2184
  const { body } = ctx.request;
1966
2185
  const { documentIds } = body;
1967
2186
  await validateBulkActionInput(body);
1968
- const documentManager2 = getService$1("document-manager");
1969
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2187
+ const documentManager2 = getService$2("document-manager");
2188
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1970
2189
  if (permissionChecker2.cannot.publish()) {
1971
2190
  return ctx.forbidden();
1972
2191
  }
1973
2192
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1974
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2193
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1975
2194
  const { locale } = await getDocumentLocaleAndStatus(body, model, {
1976
2195
  allowMultipleLocales: true
1977
2196
  });
@@ -1996,8 +2215,8 @@ const collectionTypes = {
1996
2215
  const { body } = ctx.request;
1997
2216
  const { documentIds } = body;
1998
2217
  await validateBulkActionInput(body);
1999
- const documentManager2 = getService$1("document-manager");
2000
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2218
+ const documentManager2 = getService$2("document-manager");
2219
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2001
2220
  if (permissionChecker2.cannot.unpublish()) {
2002
2221
  return ctx.forbidden();
2003
2222
  }
@@ -2026,8 +2245,8 @@ const collectionTypes = {
2026
2245
  const {
2027
2246
  body: { discardDraft, ...body }
2028
2247
  } = ctx.request;
2029
- const documentManager2 = getService$1("document-manager");
2030
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2248
+ const documentManager2 = getService$2("document-manager");
2249
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2031
2250
  if (permissionChecker2.cannot.unpublish()) {
2032
2251
  return ctx.forbidden();
2033
2252
  }
@@ -2035,7 +2254,7 @@ const collectionTypes = {
2035
2254
  return ctx.forbidden();
2036
2255
  }
2037
2256
  const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
2038
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2257
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2039
2258
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2040
2259
  const document = await documentManager2.findOne(id, model, {
2041
2260
  populate,
@@ -2066,13 +2285,13 @@ const collectionTypes = {
2066
2285
  const { userAbility } = ctx.state;
2067
2286
  const { id, model } = ctx.params;
2068
2287
  const { body } = ctx.request;
2069
- const documentManager2 = getService$1("document-manager");
2070
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2288
+ const documentManager2 = getService$2("document-manager");
2289
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2071
2290
  if (permissionChecker2.cannot.discard()) {
2072
2291
  return ctx.forbidden();
2073
2292
  }
2074
2293
  const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
2075
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2294
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2076
2295
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2077
2296
  const document = await documentManager2.findOne(id, model, {
2078
2297
  populate,
@@ -2097,13 +2316,13 @@ const collectionTypes = {
2097
2316
  const { query, body } = ctx.request;
2098
2317
  const { documentIds } = body;
2099
2318
  await validateBulkActionInput(body);
2100
- const documentManager2 = getService$1("document-manager");
2101
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2319
+ const documentManager2 = getService$2("document-manager");
2320
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2102
2321
  if (permissionChecker2.cannot.delete()) {
2103
2322
  return ctx.forbidden();
2104
2323
  }
2105
2324
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
2106
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2325
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2107
2326
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2108
2327
  const documentLocales = await documentManager2.findLocales(documentIds, model, {
2109
2328
  populate,
@@ -2124,13 +2343,13 @@ const collectionTypes = {
2124
2343
  async countDraftRelations(ctx) {
2125
2344
  const { userAbility } = ctx.state;
2126
2345
  const { model, id } = ctx.params;
2127
- const documentManager2 = getService$1("document-manager");
2128
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2346
+ const documentManager2 = getService$2("document-manager");
2347
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2129
2348
  if (permissionChecker2.cannot.read()) {
2130
2349
  return ctx.forbidden();
2131
2350
  }
2132
2351
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2133
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2352
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2134
2353
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
2135
2354
  const entity = await documentManager2.findOne(id, model, { populate, locale, status });
2136
2355
  if (!entity) {
@@ -2149,8 +2368,8 @@ const collectionTypes = {
2149
2368
  const ids = ctx.request.query.documentIds;
2150
2369
  const locale = ctx.request.query.locale;
2151
2370
  const { model } = ctx.params;
2152
- const documentManager2 = getService$1("document-manager");
2153
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2371
+ const documentManager2 = getService$2("document-manager");
2372
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2154
2373
  if (permissionChecker2.cannot.read()) {
2155
2374
  return ctx.forbidden();
2156
2375
  }
@@ -2174,13 +2393,13 @@ const collectionTypes = {
2174
2393
  };
2175
2394
  const components$1 = {
2176
2395
  findComponents(ctx) {
2177
- const components2 = getService$1("components").findAllComponents();
2178
- const { toDto } = getService$1("data-mapper");
2396
+ const components2 = getService$2("components").findAllComponents();
2397
+ const { toDto } = getService$2("data-mapper");
2179
2398
  ctx.body = { data: components2.map(toDto) };
2180
2399
  },
2181
2400
  async findComponentConfiguration(ctx) {
2182
2401
  const { uid: uid2 } = ctx.params;
2183
- const componentService = getService$1("components");
2402
+ const componentService = getService$2("components");
2184
2403
  const component = componentService.findComponent(uid2);
2185
2404
  if (!component) {
2186
2405
  return ctx.notFound("component.notFound");
@@ -2197,7 +2416,7 @@ const components$1 = {
2197
2416
  async updateComponentConfiguration(ctx) {
2198
2417
  const { uid: uid2 } = ctx.params;
2199
2418
  const { body } = ctx.request;
2200
- const componentService = getService$1("components");
2419
+ const componentService = getService$2("components");
2201
2420
  const component = componentService.findComponent(uid2);
2202
2421
  if (!component) {
2203
2422
  return ctx.notFound("component.notFound");
@@ -2231,12 +2450,12 @@ const contentTypes = {
2231
2450
  } catch (error) {
2232
2451
  return ctx.send({ error }, 400);
2233
2452
  }
2234
- const contentTypes2 = getService$1("content-types").findContentTypesByKind(kind);
2235
- const { toDto } = getService$1("data-mapper");
2453
+ const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
2454
+ const { toDto } = getService$2("data-mapper");
2236
2455
  ctx.body = { data: contentTypes2.map(toDto) };
2237
2456
  },
2238
2457
  async findContentTypesSettings(ctx) {
2239
- const { findAllContentTypes, findConfiguration } = getService$1("content-types");
2458
+ const { findAllContentTypes, findConfiguration } = getService$2("content-types");
2240
2459
  const contentTypes2 = await findAllContentTypes();
2241
2460
  const configurations = await Promise.all(
2242
2461
  contentTypes2.map(async (contentType) => {
@@ -2250,7 +2469,7 @@ const contentTypes = {
2250
2469
  },
2251
2470
  async findContentTypeConfiguration(ctx) {
2252
2471
  const { uid: uid2 } = ctx.params;
2253
- const contentTypeService = getService$1("content-types");
2472
+ const contentTypeService = getService$2("content-types");
2254
2473
  const contentType = await contentTypeService.findContentType(uid2);
2255
2474
  if (!contentType) {
2256
2475
  return ctx.notFound("contentType.notFound");
@@ -2272,13 +2491,13 @@ const contentTypes = {
2272
2491
  const { userAbility } = ctx.state;
2273
2492
  const { uid: uid2 } = ctx.params;
2274
2493
  const { body } = ctx.request;
2275
- const contentTypeService = getService$1("content-types");
2276
- const metricsService = getService$1("metrics");
2494
+ const contentTypeService = getService$2("content-types");
2495
+ const metricsService = getService$2("metrics");
2277
2496
  const contentType = await contentTypeService.findContentType(uid2);
2278
2497
  if (!contentType) {
2279
2498
  return ctx.notFound("contentType.notFound");
2280
2499
  }
2281
- if (!getService$1("permission").canConfigureContentType({ userAbility, contentType })) {
2500
+ if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
2282
2501
  return ctx.forbidden();
2283
2502
  }
2284
2503
  let input;
@@ -2311,10 +2530,10 @@ const contentTypes = {
2311
2530
  };
2312
2531
  const init = {
2313
2532
  getInitData(ctx) {
2314
- const { toDto } = getService$1("data-mapper");
2315
- const { findAllComponents } = getService$1("components");
2316
- const { getAllFieldSizes } = getService$1("field-sizes");
2317
- const { findAllContentTypes } = getService$1("content-types");
2533
+ const { toDto } = getService$2("data-mapper");
2534
+ const { findAllComponents } = getService$2("components");
2535
+ const { getAllFieldSizes } = getService$2("field-sizes");
2536
+ const { findAllContentTypes } = getService$2("content-types");
2318
2537
  ctx.body = {
2319
2538
  data: {
2320
2539
  fieldSizes: getAllFieldSizes(),
@@ -2350,7 +2569,7 @@ const addFiltersClause = (params, filtersClause) => {
2350
2569
  params.filters.$and.push(filtersClause);
2351
2570
  };
2352
2571
  const sanitizeMainField = (model, mainField, userAbility) => {
2353
- const permissionChecker2 = getService$1("permission-checker").create({
2572
+ const permissionChecker2 = getService$2("permission-checker").create({
2354
2573
  userAbility,
2355
2574
  model: model.uid
2356
2575
  });
@@ -2364,15 +2583,27 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2364
2583
  }
2365
2584
  return mainField;
2366
2585
  };
2367
- const addStatusToRelations = async (uid2, relations2) => {
2368
- if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2586
+ const addStatusToRelations = async (targetUid, relations2) => {
2587
+ if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
2369
2588
  return relations2;
2370
2589
  }
2371
- const documentMetadata2 = getService$1("document-metadata");
2372
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
2590
+ const documentMetadata2 = getService$2("document-metadata");
2591
+ if (!relations2.length) {
2592
+ return relations2;
2593
+ }
2594
+ const firstRelation = relations2[0];
2595
+ const filters = {
2596
+ documentId: { $in: relations2.map((r) => r.documentId) },
2597
+ // NOTE: find the "opposite" status
2598
+ publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
2599
+ };
2600
+ const availableStatus = await strapi.query(targetUid).findMany({
2601
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
2602
+ filters
2603
+ });
2373
2604
  return relations2.map((relation) => {
2374
- const availableStatuses = documentsAvailableStatus.filter(
2375
- (availableDocument) => availableDocument.documentId === relation.documentId
2605
+ const availableStatuses = availableStatus.filter(
2606
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2376
2607
  );
2377
2608
  return {
2378
2609
  ...relation,
@@ -2434,7 +2665,7 @@ const relations = {
2434
2665
  ctx.request?.query?.locale
2435
2666
  );
2436
2667
  const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
2437
- const permissionChecker2 = getService$1("permission-checker").create({
2668
+ const permissionChecker2 = getService$2("permission-checker").create({
2438
2669
  userAbility,
2439
2670
  model
2440
2671
  });
@@ -2459,7 +2690,7 @@ const relations = {
2459
2690
  where.id = id;
2460
2691
  }
2461
2692
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2462
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2693
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2463
2694
  const currentEntity = await strapi.db.query(model).findOne({
2464
2695
  where,
2465
2696
  populate
@@ -2474,7 +2705,7 @@ const relations = {
2474
2705
  }
2475
2706
  entryId = currentEntity.id;
2476
2707
  }
2477
- const modelConfig = isComponent2 ? await getService$1("components").findConfiguration(sourceSchema) : await getService$1("content-types").findConfiguration(sourceSchema);
2708
+ const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
2478
2709
  const targetSchema = strapi.getModel(targetUid);
2479
2710
  const mainField = fp.flow(
2480
2711
  fp.prop(`metadatas.${targetField}.edit.mainField`),
@@ -2528,7 +2759,7 @@ const relations = {
2528
2759
  }
2529
2760
  } = await this.extractAndValidateRequestInfo(ctx, id);
2530
2761
  const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
2531
- const permissionChecker2 = getService$1("permission-checker").create({
2762
+ const permissionChecker2 = getService$2("permission-checker").create({
2532
2763
  userAbility: ctx.state.userAbility,
2533
2764
  model: targetUid
2534
2765
  });
@@ -2601,21 +2832,33 @@ const relations = {
2601
2832
  attribute,
2602
2833
  targetField,
2603
2834
  fieldsToSelect,
2604
- source: {
2605
- schema: { uid: sourceUid }
2606
- },
2607
- target: {
2608
- schema: { uid: targetUid }
2609
- }
2835
+ status,
2836
+ source: { schema: sourceSchema },
2837
+ target: { schema: targetSchema }
2610
2838
  } = await this.extractAndValidateRequestInfo(ctx, id);
2611
- const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2839
+ const { uid: sourceUid } = sourceSchema;
2840
+ const { uid: targetUid } = targetSchema;
2841
+ const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2612
2842
  const dbQuery = strapi.db.query(sourceUid);
2613
2843
  const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2844
+ const filters = {};
2845
+ if (sourceSchema?.options?.draftAndPublish) {
2846
+ if (targetSchema?.options?.draftAndPublish) {
2847
+ if (status === "published") {
2848
+ filters.publishedAt = { $notNull: true };
2849
+ } else {
2850
+ filters.publishedAt = { $null: true };
2851
+ }
2852
+ }
2853
+ } else if (targetSchema?.options?.draftAndPublish) {
2854
+ filters.publishedAt = { $null: true };
2855
+ }
2614
2856
  const res = await loadRelations({ id: entryId }, targetField, {
2615
- select: ["id", "documentId", "locale", "publishedAt"],
2857
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2616
2858
  ordering: "desc",
2617
2859
  page: ctx.request.query.page,
2618
- pageSize: ctx.request.query.pageSize
2860
+ pageSize: ctx.request.query.pageSize,
2861
+ filters
2619
2862
  });
2620
2863
  const loadedIds = res.results.map((item) => item.id);
2621
2864
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
@@ -2636,10 +2879,10 @@ const relations = {
2636
2879
  }
2637
2880
  };
2638
2881
  const buildPopulateFromQuery = async (query, model) => {
2639
- return getService$1("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
2882
+ return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
2640
2883
  };
2641
2884
  const findDocument = async (query, uid2, opts = {}) => {
2642
- const documentManager2 = getService$1("document-manager");
2885
+ const documentManager2 = getService$2("document-manager");
2643
2886
  const populate = await buildPopulateFromQuery(query, uid2);
2644
2887
  return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
2645
2888
  };
@@ -2647,8 +2890,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
2647
2890
  const { user, userAbility } = ctx.state;
2648
2891
  const { model } = ctx.params;
2649
2892
  const { body, query } = ctx.request;
2650
- const documentManager2 = getService$1("document-manager");
2651
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2893
+ const documentManager2 = getService$2("document-manager");
2894
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2652
2895
  if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
2653
2896
  throw new strapiUtils.errors.ForbiddenError();
2654
2897
  }
@@ -2689,7 +2932,7 @@ const singleTypes = {
2689
2932
  const { userAbility } = ctx.state;
2690
2933
  const { model } = ctx.params;
2691
2934
  const { query = {} } = ctx.request;
2692
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2935
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2693
2936
  if (permissionChecker2.cannot.read()) {
2694
2937
  return ctx.forbidden();
2695
2938
  }
@@ -2723,7 +2966,7 @@ const singleTypes = {
2723
2966
  async createOrUpdate(ctx) {
2724
2967
  const { userAbility } = ctx.state;
2725
2968
  const { model } = ctx.params;
2726
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2969
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2727
2970
  const document = await createOrUpdateDocument(ctx);
2728
2971
  const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
2729
2972
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
@@ -2732,8 +2975,8 @@ const singleTypes = {
2732
2975
  const { userAbility } = ctx.state;
2733
2976
  const { model } = ctx.params;
2734
2977
  const { query = {} } = ctx.request;
2735
- const documentManager2 = getService$1("document-manager");
2736
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2978
+ const documentManager2 = getService$2("document-manager");
2979
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2737
2980
  if (permissionChecker2.cannot.delete()) {
2738
2981
  return ctx.forbidden();
2739
2982
  }
@@ -2761,8 +3004,8 @@ const singleTypes = {
2761
3004
  const { userAbility } = ctx.state;
2762
3005
  const { model } = ctx.params;
2763
3006
  const { query = {} } = ctx.request;
2764
- const documentManager2 = getService$1("document-manager");
2765
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3007
+ const documentManager2 = getService$2("document-manager");
3008
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2766
3009
  if (permissionChecker2.cannot.publish()) {
2767
3010
  return ctx.forbidden();
2768
3011
  }
@@ -2790,8 +3033,8 @@ const singleTypes = {
2790
3033
  body: { discardDraft, ...body },
2791
3034
  query = {}
2792
3035
  } = ctx.request;
2793
- const documentManager2 = getService$1("document-manager");
2794
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3036
+ const documentManager2 = getService$2("document-manager");
3037
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2795
3038
  if (permissionChecker2.cannot.unpublish()) {
2796
3039
  return ctx.forbidden();
2797
3040
  }
@@ -2825,8 +3068,8 @@ const singleTypes = {
2825
3068
  const { userAbility } = ctx.state;
2826
3069
  const { model } = ctx.params;
2827
3070
  const { body, query = {} } = ctx.request;
2828
- const documentManager2 = getService$1("document-manager");
2829
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3071
+ const documentManager2 = getService$2("document-manager");
3072
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2830
3073
  if (permissionChecker2.cannot.discard()) {
2831
3074
  return ctx.forbidden();
2832
3075
  }
@@ -2849,8 +3092,8 @@ const singleTypes = {
2849
3092
  const { userAbility } = ctx.state;
2850
3093
  const { model } = ctx.params;
2851
3094
  const { query } = ctx.request;
2852
- const documentManager2 = getService$1("document-manager");
2853
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3095
+ const documentManager2 = getService$2("document-manager");
3096
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2854
3097
  const { locale } = await getDocumentLocaleAndStatus(query, model);
2855
3098
  if (permissionChecker2.cannot.read()) {
2856
3099
  return ctx.forbidden();
@@ -2874,7 +3117,7 @@ const uid$1 = {
2874
3117
  const { query = {} } = ctx.request;
2875
3118
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2876
3119
  await validateUIDField(contentTypeUID, field);
2877
- const uidService = getService$1("uid");
3120
+ const uidService = getService$2("uid");
2878
3121
  ctx.body = {
2879
3122
  data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
2880
3123
  };
@@ -2886,7 +3129,7 @@ const uid$1 = {
2886
3129
  const { query = {} } = ctx.request;
2887
3130
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2888
3131
  await validateUIDField(contentTypeUID, field);
2889
- const uidService = getService$1("uid");
3132
+ const uidService = getService$2("uid");
2890
3133
  const isAvailable = await uidService.checkUIDAvailability({
2891
3134
  contentTypeUID,
2892
3135
  field,
@@ -2907,7 +3150,8 @@ const controllers = {
2907
3150
  relations,
2908
3151
  "single-types": singleTypes,
2909
3152
  uid: uid$1,
2910
- ...history.controllers ? history.controllers : {}
3153
+ ...history.controllers ? history.controllers : {},
3154
+ ...preview.controllers ? preview.controllers : {}
2911
3155
  };
2912
3156
  const keys = {
2913
3157
  CONFIGURATION: "configuration"
@@ -3058,12 +3302,12 @@ async function syncMetadatas(configuration, schema) {
3058
3302
  return ___default.default.assign(metasWithDefaults, updatedMetas);
3059
3303
  }
3060
3304
  const getTargetSchema = (targetModel) => {
3061
- return getService$1("content-types").findContentType(targetModel);
3305
+ return getService$2("content-types").findContentType(targetModel);
3062
3306
  };
3063
3307
  const DEFAULT_LIST_LENGTH = 4;
3064
3308
  const MAX_ROW_SIZE = 12;
3065
3309
  const isAllowedFieldSize = (type, size) => {
3066
- const { getFieldSize } = getService$1("field-sizes");
3310
+ const { getFieldSize } = getService$2("field-sizes");
3067
3311
  const fieldSize = getFieldSize(type);
3068
3312
  if (!fieldSize.isResizable && size !== fieldSize.default) {
3069
3313
  return false;
@@ -3071,7 +3315,7 @@ const isAllowedFieldSize = (type, size) => {
3071
3315
  return size <= MAX_ROW_SIZE;
3072
3316
  };
3073
3317
  const getDefaultFieldSize = (attribute) => {
3074
- const { hasFieldSize, getFieldSize } = getService$1("field-sizes");
3318
+ const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
3075
3319
  return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
3076
3320
  };
3077
3321
  async function createDefaultLayouts(schema) {
@@ -3106,7 +3350,7 @@ function syncLayouts(configuration, schema) {
3106
3350
  for (const el of row) {
3107
3351
  if (!hasEditableAttribute(schema, el.name))
3108
3352
  continue;
3109
- const { hasFieldSize } = getService$1("field-sizes");
3353
+ const { hasFieldSize } = getService$2("field-sizes");
3110
3354
  const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
3111
3355
  if (!isAllowedFieldSize(fieldType, el.size)) {
3112
3356
  elementsToReAppend.push(el.name);
@@ -3246,17 +3490,17 @@ const configurationService$1 = createConfigurationService({
3246
3490
  isComponent: true,
3247
3491
  prefix: STORE_KEY_PREFIX,
3248
3492
  getModels() {
3249
- const { toContentManagerModel } = getService$1("data-mapper");
3493
+ const { toContentManagerModel } = getService$2("data-mapper");
3250
3494
  return fp.mapValues(toContentManagerModel, strapi.components);
3251
3495
  }
3252
3496
  });
3253
3497
  const components = ({ strapi: strapi2 }) => ({
3254
3498
  findAllComponents() {
3255
- const { toContentManagerModel } = getService$1("data-mapper");
3499
+ const { toContentManagerModel } = getService$2("data-mapper");
3256
3500
  return Object.values(strapi2.components).map(toContentManagerModel);
3257
3501
  },
3258
3502
  findComponent(uid2) {
3259
- const { toContentManagerModel } = getService$1("data-mapper");
3503
+ const { toContentManagerModel } = getService$2("data-mapper");
3260
3504
  const component = strapi2.components[uid2];
3261
3505
  return fp.isNil(component) ? component : toContentManagerModel(component);
3262
3506
  },
@@ -3307,17 +3551,17 @@ const configurationService = createConfigurationService({
3307
3551
  storeUtils,
3308
3552
  prefix: "content_types",
3309
3553
  getModels() {
3310
- const { toContentManagerModel } = getService$1("data-mapper");
3554
+ const { toContentManagerModel } = getService$2("data-mapper");
3311
3555
  return fp.mapValues(toContentManagerModel, strapi.contentTypes);
3312
3556
  }
3313
3557
  });
3314
3558
  const service = ({ strapi: strapi2 }) => ({
3315
3559
  findAllContentTypes() {
3316
- const { toContentManagerModel } = getService$1("data-mapper");
3560
+ const { toContentManagerModel } = getService$2("data-mapper");
3317
3561
  return Object.values(strapi2.contentTypes).map(toContentManagerModel);
3318
3562
  },
3319
3563
  findContentType(uid2) {
3320
- const { toContentManagerModel } = getService$1("data-mapper");
3564
+ const { toContentManagerModel } = getService$2("data-mapper");
3321
3565
  const contentType = strapi2.contentTypes[uid2];
3322
3566
  return fp.isNil(contentType) ? contentType : toContentManagerModel(contentType);
3323
3567
  },
@@ -3346,7 +3590,7 @@ const service = ({ strapi: strapi2 }) => ({
3346
3590
  return this.findConfiguration(contentType);
3347
3591
  },
3348
3592
  findComponentsConfigurations(contentType) {
3349
- return getService$1("components").findComponentsConfigurations(contentType);
3593
+ return getService$2("components").findComponentsConfigurations(contentType);
3350
3594
  },
3351
3595
  syncConfigurations() {
3352
3596
  return configurationService.syncConfigurations();
@@ -3618,7 +3862,7 @@ const permission = ({ strapi: strapi2 }) => ({
3618
3862
  return userAbility.can(action);
3619
3863
  },
3620
3864
  async registerPermissions() {
3621
- const displayedContentTypes = getService$1("content-types").findDisplayedContentTypes();
3865
+ const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
3622
3866
  const contentTypesUids = displayedContentTypes.map(fp.prop("uid"));
3623
3867
  const actions = [
3624
3868
  {
@@ -3894,7 +4138,7 @@ const getQueryPopulate = async (uid2, query) => {
3894
4138
  return populateQuery;
3895
4139
  };
3896
4140
  const buildDeepPopulate = (uid2) => {
3897
- return getService$1("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
4141
+ return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
3898
4142
  };
3899
4143
  const populateBuilder = (uid2) => {
3900
4144
  let getInitialPopulate = async () => {
@@ -4079,7 +4323,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4079
4323
  */
4080
4324
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4081
4325
  const versionsByLocale = fp.groupBy("locale", allVersions);
4082
- delete versionsByLocale[version.locale];
4326
+ if (version.locale) {
4327
+ delete versionsByLocale[version.locale];
4328
+ }
4083
4329
  const model = strapi2.getModel(uid2);
4084
4330
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4085
4331
  const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
@@ -4435,7 +4681,8 @@ const services = {
4435
4681
  permission,
4436
4682
  "populate-builder": populateBuilder$1,
4437
4683
  uid,
4438
- ...history.services ? history.services : {}
4684
+ ...history.services ? history.services : {},
4685
+ ...preview.services ? preview.services : {}
4439
4686
  };
4440
4687
  const index = () => {
4441
4688
  return {