@strapi/content-manager 0.0.0-experimental.f9cac24ba3b2f6acb12d0fb5669106e5a134174e → 0.0.0-experimental.fb22a8bd8745528903b2f168fdd286dfd1f5082e

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 (160) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-DkUdgHD9.mjs → ComponentConfigurationPage-BaJMOQyq.mjs} +4 -4
  2. package/dist/_chunks/{ComponentConfigurationPage-DkUdgHD9.mjs.map → ComponentConfigurationPage-BaJMOQyq.mjs.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-3feZ0gyp.js → ComponentConfigurationPage-N-CTtgQa.js} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-3feZ0gyp.js.map → ComponentConfigurationPage-N-CTtgQa.js.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-B0KA-x9U.js → EditConfigurationPage-BHkjAbxH.js} +4 -4
  6. package/dist/_chunks/{EditConfigurationPage-B0KA-x9U.js.map → EditConfigurationPage-BHkjAbxH.js.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-Ox5wFgpq.mjs → EditConfigurationPage-CKK-5LfX.mjs} +4 -4
  8. package/dist/_chunks/{EditConfigurationPage-Ox5wFgpq.mjs.map → EditConfigurationPage-CKK-5LfX.mjs.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-foKE8Al3.mjs → EditViewPage-B11aeMcf.mjs} +38 -8
  10. package/dist/_chunks/EditViewPage-B11aeMcf.mjs.map +1 -0
  11. package/dist/_chunks/{EditViewPage-OMv9CogC.js → EditViewPage-QPUftxUd.js} +37 -7
  12. package/dist/_chunks/EditViewPage-QPUftxUd.js.map +1 -0
  13. package/dist/_chunks/{Field-CLqZcnnc.mjs → Field-Bj_RgtGo.mjs} +44 -25
  14. package/dist/_chunks/Field-Bj_RgtGo.mjs.map +1 -0
  15. package/dist/_chunks/{Field-u09MCk3G.js → Field-DUK83cfh.js} +43 -24
  16. package/dist/_chunks/Field-DUK83cfh.js.map +1 -0
  17. package/dist/_chunks/{Form-B9c_Ti0q.js → Form-DHmBRlHd.js} +2 -2
  18. package/dist/_chunks/{Form-B9c_Ti0q.js.map → Form-DHmBRlHd.js.map} +1 -1
  19. package/dist/_chunks/{Form-CU4hRyJf.mjs → Form-DLMSoXV7.mjs} +2 -2
  20. package/dist/_chunks/{Form-CU4hRyJf.mjs.map → Form-DLMSoXV7.mjs.map} +1 -1
  21. package/dist/_chunks/{History-BFyFzpSS.mjs → History-CfCSNlG9.mjs} +22 -92
  22. package/dist/_chunks/History-CfCSNlG9.mjs.map +1 -0
  23. package/dist/_chunks/{History-OlickLyX.js → History-Di3zm4HT.js} +21 -91
  24. package/dist/_chunks/History-Di3zm4HT.js.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-Bu5Z_39o.mjs → ListConfigurationPage-0mtv_iqk.mjs} +6 -5
  26. package/dist/_chunks/ListConfigurationPage-0mtv_iqk.mjs.map +1 -0
  27. package/dist/_chunks/{ListConfigurationPage-D0AAi_cW.js → ListConfigurationPage-Cq361KIt.js} +5 -4
  28. package/dist/_chunks/ListConfigurationPage-Cq361KIt.js.map +1 -0
  29. package/dist/_chunks/{ListViewPage-BAHxSPux.mjs → ListViewPage-BxLVROX8.mjs} +62 -39
  30. package/dist/_chunks/ListViewPage-BxLVROX8.mjs.map +1 -0
  31. package/dist/_chunks/{ListViewPage--lV5p8Qi.js → ListViewPage-DFDcG8gM.js} +62 -39
  32. package/dist/_chunks/ListViewPage-DFDcG8gM.js.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-C6SMXW77.mjs → NoContentTypePage-BRfDd67_.mjs} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-C6SMXW77.mjs.map → NoContentTypePage-BRfDd67_.mjs.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-Dxl9oZqL.js → NoContentTypePage-BSyvnDZZ.js} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-Dxl9oZqL.js.map → NoContentTypePage-BSyvnDZZ.js.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-o9BXzQeI.mjs → NoPermissionsPage-CV9V8KWa.mjs} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-o9BXzQeI.mjs.map → NoPermissionsPage-CV9V8KWa.mjs.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-BY1-rMng.js → NoPermissionsPage-DyLphsn_.js} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-BY1-rMng.js.map → NoPermissionsPage-DyLphsn_.js.map} +1 -1
  41. package/dist/_chunks/Preview-C_B1nx3g.mjs +272 -0
  42. package/dist/_chunks/Preview-C_B1nx3g.mjs.map +1 -0
  43. package/dist/_chunks/Preview-D_3aO6Ly.js +291 -0
  44. package/dist/_chunks/Preview-D_3aO6Ly.js.map +1 -0
  45. package/dist/_chunks/{Relations-BAK95JHc.mjs → Relations-C6pwmDXh.mjs} +44 -17
  46. package/dist/_chunks/Relations-C6pwmDXh.mjs.map +1 -0
  47. package/dist/_chunks/{Relations-CHfwGkBG.js → Relations-Cne2AlrL.js} +43 -16
  48. package/dist/_chunks/Relations-Cne2AlrL.js.map +1 -0
  49. package/dist/_chunks/{en-DKV44jRb.mjs → en-DhFUjrNW.mjs} +15 -4
  50. package/dist/_chunks/{en-DKV44jRb.mjs.map → en-DhFUjrNW.mjs.map} +1 -1
  51. package/dist/_chunks/{en-Bm0D0IWz.js → en-Ic0kXjxB.js} +15 -4
  52. package/dist/_chunks/{en-Bm0D0IWz.js.map → en-Ic0kXjxB.js.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-CxlpxzA5.mjs → index-BpxR3En4.mjs} +179 -95
  62. package/dist/_chunks/index-BpxR3En4.mjs.map +1 -0
  63. package/dist/_chunks/{index-_Mlmsefd.js → index-T-aWjbj2.js} +176 -91
  64. package/dist/_chunks/index-T-aWjbj2.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-vcHVgSr1.js → layout-BEuNwv-F.js} +3 -3
  70. package/dist/_chunks/{layout-vcHVgSr1.js.map → layout-BEuNwv-F.js.map} +1 -1
  71. package/dist/_chunks/{layout-Cr0H40au.mjs → layout-DhMZ_lDx.mjs} +3 -3
  72. package/dist/_chunks/{layout-Cr0H40au.mjs.map → layout-DhMZ_lDx.mjs.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-Dq60voyX.mjs → relations-BdnxoX6f.mjs} +6 -7
  78. package/dist/_chunks/relations-BdnxoX6f.mjs.map +1 -0
  79. package/dist/_chunks/{relations-hXUB80SH.js → relations-kLcuobLk.js} +6 -7
  80. package/dist/_chunks/relations-kLcuobLk.js.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/index.d.ts +1 -1
  89. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  90. package/dist/admin/src/preview/routes.d.ts +3 -0
  91. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  92. package/dist/admin/src/router.d.ts +1 -1
  93. package/dist/admin/src/services/documents.d.ts +0 -3
  94. package/dist/server/index.js +384 -150
  95. package/dist/server/index.js.map +1 -1
  96. package/dist/server/index.mjs +385 -151
  97. package/dist/server/index.mjs.map +1 -1
  98. package/dist/server/src/controllers/index.d.ts.map +1 -1
  99. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  100. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  101. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  102. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  103. package/dist/server/src/history/services/utils.d.ts +2 -3
  104. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  105. package/dist/server/src/index.d.ts +4 -4
  106. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  107. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  108. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  109. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  110. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  111. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  112. package/dist/server/src/preview/index.d.ts.map +1 -1
  113. package/dist/server/src/preview/routes/index.d.ts +8 -0
  114. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  115. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  116. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  117. package/dist/server/src/preview/services/index.d.ts +16 -0
  118. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  119. package/dist/server/src/preview/services/preview-config.d.ts +32 -0
  120. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  121. package/dist/server/src/preview/services/preview.d.ts +12 -0
  122. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  123. package/dist/server/src/preview/utils.d.ts +19 -0
  124. package/dist/server/src/preview/utils.d.ts.map +1 -0
  125. package/dist/server/src/register.d.ts.map +1 -1
  126. package/dist/server/src/routes/index.d.ts.map +1 -1
  127. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  128. package/dist/server/src/services/document-metadata.d.ts +8 -8
  129. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  130. package/dist/server/src/services/index.d.ts +4 -4
  131. package/dist/server/src/services/index.d.ts.map +1 -1
  132. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  133. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  134. package/dist/server/src/utils/index.d.ts +2 -0
  135. package/dist/server/src/utils/index.d.ts.map +1 -1
  136. package/dist/shared/contracts/index.d.ts +1 -0
  137. package/dist/shared/contracts/index.d.ts.map +1 -1
  138. package/dist/shared/contracts/preview.d.ts +27 -0
  139. package/dist/shared/contracts/preview.d.ts.map +1 -0
  140. package/dist/shared/index.js +4 -0
  141. package/dist/shared/index.js.map +1 -1
  142. package/dist/shared/index.mjs +4 -0
  143. package/dist/shared/index.mjs.map +1 -1
  144. package/package.json +9 -9
  145. package/dist/_chunks/EditViewPage-OMv9CogC.js.map +0 -1
  146. package/dist/_chunks/EditViewPage-foKE8Al3.mjs.map +0 -1
  147. package/dist/_chunks/Field-CLqZcnnc.mjs.map +0 -1
  148. package/dist/_chunks/Field-u09MCk3G.js.map +0 -1
  149. package/dist/_chunks/History-BFyFzpSS.mjs.map +0 -1
  150. package/dist/_chunks/History-OlickLyX.js.map +0 -1
  151. package/dist/_chunks/ListConfigurationPage-Bu5Z_39o.mjs.map +0 -1
  152. package/dist/_chunks/ListConfigurationPage-D0AAi_cW.js.map +0 -1
  153. package/dist/_chunks/ListViewPage--lV5p8Qi.js.map +0 -1
  154. package/dist/_chunks/ListViewPage-BAHxSPux.mjs.map +0 -1
  155. package/dist/_chunks/Relations-BAK95JHc.mjs.map +0 -1
  156. package/dist/_chunks/Relations-CHfwGkBG.js.map +0 -1
  157. package/dist/_chunks/index-CxlpxzA5.mjs.map +0 -1
  158. package/dist/_chunks/index-_Mlmsefd.js.map +0 -1
  159. package/dist/_chunks/relations-Dq60voyX.mjs.map +0 -1
  160. package/dist/_chunks/relations-hXUB80SH.js.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 = {
@@ -702,14 +723,14 @@ const getFeature$1 = () => {
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 {
@@ -719,33 +740,217 @@ const getFeature$1 = () => {
719
740
  };
720
741
  };
721
742
  const history = getFeature$1();
722
- const register = async ({ strapi: strapi2 }) => {
723
- await history.register?.({ strapi: strapi2 });
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
+ ]
724
758
  };
725
- const ALLOWED_WEBHOOK_EVENTS = {
726
- ENTRY_PUBLISH: "entry.publish",
727
- ENTRY_UNPUBLISH: "entry.unpublish"
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
728
919
  };
729
- const FEATURE_ID = "preview";
730
920
  const getFeature = () => {
731
921
  if (!strapi.features.future.isEnabled(FEATURE_ID)) {
732
922
  return {};
733
923
  }
734
924
  return {
925
+ register() {
926
+ const config = getService(strapi, "preview-config");
927
+ config.validate();
928
+ config.register();
929
+ },
735
930
  bootstrap() {
736
- console.log("Bootstrapping preview server");
737
- }
931
+ },
932
+ routes: routes$1,
933
+ controllers: controllers$1,
934
+ services: services$1
738
935
  };
739
936
  };
740
937
  const preview = getFeature();
938
+ const register = async ({ strapi: strapi2 }) => {
939
+ await history.register?.({ strapi: strapi2 });
940
+ await preview.register?.({ strapi: strapi2 });
941
+ };
942
+ const ALLOWED_WEBHOOK_EVENTS = {
943
+ ENTRY_PUBLISH: "entry.publish",
944
+ ENTRY_UNPUBLISH: "entry.unpublish"
945
+ };
741
946
  const bootstrap = async () => {
742
947
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
743
948
  strapi.get("webhookStore").addAllowedEvent(key, value);
744
949
  });
745
- getService$1("field-sizes").setCustomFieldInputSizes();
746
- await getService$1("components").syncConfigurations();
747
- await getService$1("content-types").syncConfigurations();
748
- 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();
749
954
  await history.bootstrap?.({ strapi });
750
955
  await preview.bootstrap?.({ strapi });
751
956
  };
@@ -1237,7 +1442,8 @@ const admin = {
1237
1442
  };
1238
1443
  const routes = {
1239
1444
  admin,
1240
- ...history.routes ? history.routes : {}
1445
+ ...history.routes ? history.routes : {},
1446
+ ...preview.routes ? preview.routes : {}
1241
1447
  };
1242
1448
  const hasPermissionsSchema = strapiUtils.yup.object({
1243
1449
  actions: strapiUtils.yup.array().of(strapiUtils.yup.string()),
@@ -1494,7 +1700,7 @@ const createMetadasSchema = (schema) => {
1494
1700
  if (!value) {
1495
1701
  return strapiUtils.yup.string();
1496
1702
  }
1497
- const targetSchema = getService$1("content-types").findContentType(
1703
+ const targetSchema = getService$2("content-types").findContentType(
1498
1704
  schema.attributes[key].targetModel
1499
1705
  );
1500
1706
  if (!targetSchema) {
@@ -1663,7 +1869,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
1663
1869
  }
1664
1870
  };
1665
1871
  const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
1666
- const documentMetadata2 = getService$1("document-metadata");
1872
+ const documentMetadata2 = getService$2("document-metadata");
1667
1873
  const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
1668
1874
  let {
1669
1875
  meta: { availableLocales, availableStatus }
@@ -1689,8 +1895,8 @@ const createDocument = async (ctx, opts) => {
1689
1895
  const { userAbility, user } = ctx.state;
1690
1896
  const { model } = ctx.params;
1691
1897
  const { body } = ctx.request;
1692
- const documentManager2 = getService$1("document-manager");
1693
- 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 });
1694
1900
  if (permissionChecker2.cannot.create()) {
1695
1901
  throw new strapiUtils.errors.ForbiddenError();
1696
1902
  }
@@ -1710,13 +1916,13 @@ const updateDocument = async (ctx, opts) => {
1710
1916
  const { userAbility, user } = ctx.state;
1711
1917
  const { id, model } = ctx.params;
1712
1918
  const { body } = ctx.request;
1713
- const documentManager2 = getService$1("document-manager");
1714
- 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 });
1715
1921
  if (permissionChecker2.cannot.update()) {
1716
1922
  throw new strapiUtils.errors.ForbiddenError();
1717
1923
  }
1718
1924
  const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
1719
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1925
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1720
1926
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1721
1927
  const [documentVersion, documentExists] = await Promise.all([
1722
1928
  documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
@@ -1747,14 +1953,14 @@ const collectionTypes = {
1747
1953
  const { userAbility } = ctx.state;
1748
1954
  const { model } = ctx.params;
1749
1955
  const { query } = ctx.request;
1750
- const documentMetadata2 = getService$1("document-metadata");
1751
- const documentManager2 = getService$1("document-manager");
1752
- 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 });
1753
1959
  if (permissionChecker2.cannot.read()) {
1754
1960
  return ctx.forbidden();
1755
1961
  }
1756
1962
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
1757
- 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();
1758
1964
  const { locale, status } = await getDocumentLocaleAndStatus(query, model);
1759
1965
  const { results: documents, pagination } = await documentManager2.findPage(
1760
1966
  { ...permissionQuery, populate, locale, status },
@@ -1783,13 +1989,13 @@ const collectionTypes = {
1783
1989
  async findOne(ctx) {
1784
1990
  const { userAbility } = ctx.state;
1785
1991
  const { model, id } = ctx.params;
1786
- const documentManager2 = getService$1("document-manager");
1787
- 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 });
1788
1994
  if (permissionChecker2.cannot.read()) {
1789
1995
  return ctx.forbidden();
1790
1996
  }
1791
1997
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
1792
- 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();
1793
1999
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
1794
2000
  const version = await documentManager2.findOne(id, model, {
1795
2001
  populate,
@@ -1820,7 +2026,7 @@ const collectionTypes = {
1820
2026
  async create(ctx) {
1821
2027
  const { userAbility } = ctx.state;
1822
2028
  const { model } = ctx.params;
1823
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2029
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1824
2030
  const [totalEntries, document] = await Promise.all([
1825
2031
  strapi.db.query(model).count(),
1826
2032
  createDocument(ctx)
@@ -1841,7 +2047,7 @@ const collectionTypes = {
1841
2047
  async update(ctx) {
1842
2048
  const { userAbility } = ctx.state;
1843
2049
  const { model } = ctx.params;
1844
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2050
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1845
2051
  const updatedVersion = await updateDocument(ctx);
1846
2052
  const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
1847
2053
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
@@ -1850,13 +2056,13 @@ const collectionTypes = {
1850
2056
  const { userAbility, user } = ctx.state;
1851
2057
  const { model, sourceId: id } = ctx.params;
1852
2058
  const { body } = ctx.request;
1853
- const documentManager2 = getService$1("document-manager");
1854
- 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 });
1855
2061
  if (permissionChecker2.cannot.create()) {
1856
2062
  return ctx.forbidden();
1857
2063
  }
1858
2064
  const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
1859
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2065
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1860
2066
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1861
2067
  const document = await documentManager2.findOne(id, model, {
1862
2068
  populate,
@@ -1895,13 +2101,13 @@ const collectionTypes = {
1895
2101
  async delete(ctx) {
1896
2102
  const { userAbility } = ctx.state;
1897
2103
  const { id, model } = ctx.params;
1898
- const documentManager2 = getService$1("document-manager");
1899
- 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 });
1900
2106
  if (permissionChecker2.cannot.delete()) {
1901
2107
  return ctx.forbidden();
1902
2108
  }
1903
2109
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
1904
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2110
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1905
2111
  const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
1906
2112
  const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
1907
2113
  if (documentLocales.length === 0) {
@@ -1923,14 +2129,14 @@ const collectionTypes = {
1923
2129
  const { userAbility } = ctx.state;
1924
2130
  const { id, model } = ctx.params;
1925
2131
  const { body } = ctx.request;
1926
- const documentManager2 = getService$1("document-manager");
1927
- 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 });
1928
2134
  if (permissionChecker2.cannot.publish()) {
1929
2135
  return ctx.forbidden();
1930
2136
  }
1931
2137
  const publishedDocument = await strapi.db.transaction(async () => {
1932
2138
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1933
- 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();
1934
2140
  let document;
1935
2141
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1936
2142
  const isCreate = fp.isNil(id);
@@ -1978,13 +2184,13 @@ const collectionTypes = {
1978
2184
  const { body } = ctx.request;
1979
2185
  const { documentIds } = body;
1980
2186
  await validateBulkActionInput(body);
1981
- const documentManager2 = getService$1("document-manager");
1982
- 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 });
1983
2189
  if (permissionChecker2.cannot.publish()) {
1984
2190
  return ctx.forbidden();
1985
2191
  }
1986
2192
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1987
- 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();
1988
2194
  const { locale } = await getDocumentLocaleAndStatus(body, model, {
1989
2195
  allowMultipleLocales: true
1990
2196
  });
@@ -2009,8 +2215,8 @@ const collectionTypes = {
2009
2215
  const { body } = ctx.request;
2010
2216
  const { documentIds } = body;
2011
2217
  await validateBulkActionInput(body);
2012
- const documentManager2 = getService$1("document-manager");
2013
- 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 });
2014
2220
  if (permissionChecker2.cannot.unpublish()) {
2015
2221
  return ctx.forbidden();
2016
2222
  }
@@ -2039,8 +2245,8 @@ const collectionTypes = {
2039
2245
  const {
2040
2246
  body: { discardDraft, ...body }
2041
2247
  } = ctx.request;
2042
- const documentManager2 = getService$1("document-manager");
2043
- 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 });
2044
2250
  if (permissionChecker2.cannot.unpublish()) {
2045
2251
  return ctx.forbidden();
2046
2252
  }
@@ -2048,7 +2254,7 @@ const collectionTypes = {
2048
2254
  return ctx.forbidden();
2049
2255
  }
2050
2256
  const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
2051
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2257
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2052
2258
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2053
2259
  const document = await documentManager2.findOne(id, model, {
2054
2260
  populate,
@@ -2079,13 +2285,13 @@ const collectionTypes = {
2079
2285
  const { userAbility } = ctx.state;
2080
2286
  const { id, model } = ctx.params;
2081
2287
  const { body } = ctx.request;
2082
- const documentManager2 = getService$1("document-manager");
2083
- 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 });
2084
2290
  if (permissionChecker2.cannot.discard()) {
2085
2291
  return ctx.forbidden();
2086
2292
  }
2087
2293
  const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
2088
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2294
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2089
2295
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2090
2296
  const document = await documentManager2.findOne(id, model, {
2091
2297
  populate,
@@ -2110,13 +2316,13 @@ const collectionTypes = {
2110
2316
  const { query, body } = ctx.request;
2111
2317
  const { documentIds } = body;
2112
2318
  await validateBulkActionInput(body);
2113
- const documentManager2 = getService$1("document-manager");
2114
- 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 });
2115
2321
  if (permissionChecker2.cannot.delete()) {
2116
2322
  return ctx.forbidden();
2117
2323
  }
2118
2324
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
2119
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2325
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2120
2326
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2121
2327
  const documentLocales = await documentManager2.findLocales(documentIds, model, {
2122
2328
  populate,
@@ -2137,13 +2343,13 @@ const collectionTypes = {
2137
2343
  async countDraftRelations(ctx) {
2138
2344
  const { userAbility } = ctx.state;
2139
2345
  const { model, id } = ctx.params;
2140
- const documentManager2 = getService$1("document-manager");
2141
- 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 });
2142
2348
  if (permissionChecker2.cannot.read()) {
2143
2349
  return ctx.forbidden();
2144
2350
  }
2145
2351
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2146
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2352
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2147
2353
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
2148
2354
  const entity = await documentManager2.findOne(id, model, { populate, locale, status });
2149
2355
  if (!entity) {
@@ -2162,8 +2368,8 @@ const collectionTypes = {
2162
2368
  const ids = ctx.request.query.documentIds;
2163
2369
  const locale = ctx.request.query.locale;
2164
2370
  const { model } = ctx.params;
2165
- const documentManager2 = getService$1("document-manager");
2166
- 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 });
2167
2373
  if (permissionChecker2.cannot.read()) {
2168
2374
  return ctx.forbidden();
2169
2375
  }
@@ -2187,13 +2393,13 @@ const collectionTypes = {
2187
2393
  };
2188
2394
  const components$1 = {
2189
2395
  findComponents(ctx) {
2190
- const components2 = getService$1("components").findAllComponents();
2191
- const { toDto } = getService$1("data-mapper");
2396
+ const components2 = getService$2("components").findAllComponents();
2397
+ const { toDto } = getService$2("data-mapper");
2192
2398
  ctx.body = { data: components2.map(toDto) };
2193
2399
  },
2194
2400
  async findComponentConfiguration(ctx) {
2195
2401
  const { uid: uid2 } = ctx.params;
2196
- const componentService = getService$1("components");
2402
+ const componentService = getService$2("components");
2197
2403
  const component = componentService.findComponent(uid2);
2198
2404
  if (!component) {
2199
2405
  return ctx.notFound("component.notFound");
@@ -2210,7 +2416,7 @@ const components$1 = {
2210
2416
  async updateComponentConfiguration(ctx) {
2211
2417
  const { uid: uid2 } = ctx.params;
2212
2418
  const { body } = ctx.request;
2213
- const componentService = getService$1("components");
2419
+ const componentService = getService$2("components");
2214
2420
  const component = componentService.findComponent(uid2);
2215
2421
  if (!component) {
2216
2422
  return ctx.notFound("component.notFound");
@@ -2244,12 +2450,12 @@ const contentTypes = {
2244
2450
  } catch (error) {
2245
2451
  return ctx.send({ error }, 400);
2246
2452
  }
2247
- const contentTypes2 = getService$1("content-types").findContentTypesByKind(kind);
2248
- const { toDto } = getService$1("data-mapper");
2453
+ const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
2454
+ const { toDto } = getService$2("data-mapper");
2249
2455
  ctx.body = { data: contentTypes2.map(toDto) };
2250
2456
  },
2251
2457
  async findContentTypesSettings(ctx) {
2252
- const { findAllContentTypes, findConfiguration } = getService$1("content-types");
2458
+ const { findAllContentTypes, findConfiguration } = getService$2("content-types");
2253
2459
  const contentTypes2 = await findAllContentTypes();
2254
2460
  const configurations = await Promise.all(
2255
2461
  contentTypes2.map(async (contentType) => {
@@ -2263,7 +2469,7 @@ const contentTypes = {
2263
2469
  },
2264
2470
  async findContentTypeConfiguration(ctx) {
2265
2471
  const { uid: uid2 } = ctx.params;
2266
- const contentTypeService = getService$1("content-types");
2472
+ const contentTypeService = getService$2("content-types");
2267
2473
  const contentType = await contentTypeService.findContentType(uid2);
2268
2474
  if (!contentType) {
2269
2475
  return ctx.notFound("contentType.notFound");
@@ -2285,13 +2491,13 @@ const contentTypes = {
2285
2491
  const { userAbility } = ctx.state;
2286
2492
  const { uid: uid2 } = ctx.params;
2287
2493
  const { body } = ctx.request;
2288
- const contentTypeService = getService$1("content-types");
2289
- const metricsService = getService$1("metrics");
2494
+ const contentTypeService = getService$2("content-types");
2495
+ const metricsService = getService$2("metrics");
2290
2496
  const contentType = await contentTypeService.findContentType(uid2);
2291
2497
  if (!contentType) {
2292
2498
  return ctx.notFound("contentType.notFound");
2293
2499
  }
2294
- if (!getService$1("permission").canConfigureContentType({ userAbility, contentType })) {
2500
+ if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
2295
2501
  return ctx.forbidden();
2296
2502
  }
2297
2503
  let input;
@@ -2324,10 +2530,10 @@ const contentTypes = {
2324
2530
  };
2325
2531
  const init = {
2326
2532
  getInitData(ctx) {
2327
- const { toDto } = getService$1("data-mapper");
2328
- const { findAllComponents } = getService$1("components");
2329
- const { getAllFieldSizes } = getService$1("field-sizes");
2330
- 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");
2331
2537
  ctx.body = {
2332
2538
  data: {
2333
2539
  fieldSizes: getAllFieldSizes(),
@@ -2363,7 +2569,7 @@ const addFiltersClause = (params, filtersClause) => {
2363
2569
  params.filters.$and.push(filtersClause);
2364
2570
  };
2365
2571
  const sanitizeMainField = (model, mainField, userAbility) => {
2366
- const permissionChecker2 = getService$1("permission-checker").create({
2572
+ const permissionChecker2 = getService$2("permission-checker").create({
2367
2573
  userAbility,
2368
2574
  model: model.uid
2369
2575
  });
@@ -2377,15 +2583,27 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2377
2583
  }
2378
2584
  return mainField;
2379
2585
  };
2380
- const addStatusToRelations = async (uid2, relations2) => {
2381
- if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2586
+ const addStatusToRelations = async (targetUid, relations2) => {
2587
+ if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
2588
+ return relations2;
2589
+ }
2590
+ const documentMetadata2 = getService$2("document-metadata");
2591
+ if (!relations2.length) {
2382
2592
  return relations2;
2383
2593
  }
2384
- const documentMetadata2 = getService$1("document-metadata");
2385
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
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
+ });
2386
2604
  return relations2.map((relation) => {
2387
- const availableStatuses = documentsAvailableStatus.filter(
2388
- (availableDocument) => availableDocument.documentId === relation.documentId
2605
+ const availableStatuses = availableStatus.filter(
2606
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2389
2607
  );
2390
2608
  return {
2391
2609
  ...relation,
@@ -2447,7 +2665,7 @@ const relations = {
2447
2665
  ctx.request?.query?.locale
2448
2666
  );
2449
2667
  const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
2450
- const permissionChecker2 = getService$1("permission-checker").create({
2668
+ const permissionChecker2 = getService$2("permission-checker").create({
2451
2669
  userAbility,
2452
2670
  model
2453
2671
  });
@@ -2472,7 +2690,7 @@ const relations = {
2472
2690
  where.id = id;
2473
2691
  }
2474
2692
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2475
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2693
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2476
2694
  const currentEntity = await strapi.db.query(model).findOne({
2477
2695
  where,
2478
2696
  populate
@@ -2487,7 +2705,7 @@ const relations = {
2487
2705
  }
2488
2706
  entryId = currentEntity.id;
2489
2707
  }
2490
- 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);
2491
2709
  const targetSchema = strapi.getModel(targetUid);
2492
2710
  const mainField = fp.flow(
2493
2711
  fp.prop(`metadatas.${targetField}.edit.mainField`),
@@ -2541,7 +2759,7 @@ const relations = {
2541
2759
  }
2542
2760
  } = await this.extractAndValidateRequestInfo(ctx, id);
2543
2761
  const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
2544
- const permissionChecker2 = getService$1("permission-checker").create({
2762
+ const permissionChecker2 = getService$2("permission-checker").create({
2545
2763
  userAbility: ctx.state.userAbility,
2546
2764
  model: targetUid
2547
2765
  });
@@ -2614,21 +2832,33 @@ const relations = {
2614
2832
  attribute,
2615
2833
  targetField,
2616
2834
  fieldsToSelect,
2617
- source: {
2618
- schema: { uid: sourceUid }
2619
- },
2620
- target: {
2621
- schema: { uid: targetUid }
2622
- }
2835
+ status,
2836
+ source: { schema: sourceSchema },
2837
+ target: { schema: targetSchema }
2623
2838
  } = await this.extractAndValidateRequestInfo(ctx, id);
2624
- 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 });
2625
2842
  const dbQuery = strapi.db.query(sourceUid);
2626
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
+ }
2627
2856
  const res = await loadRelations({ id: entryId }, targetField, {
2628
- select: ["id", "documentId", "locale", "publishedAt"],
2857
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2629
2858
  ordering: "desc",
2630
2859
  page: ctx.request.query.page,
2631
- pageSize: ctx.request.query.pageSize
2860
+ pageSize: ctx.request.query.pageSize,
2861
+ filters
2632
2862
  });
2633
2863
  const loadedIds = res.results.map((item) => item.id);
2634
2864
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
@@ -2649,10 +2879,10 @@ const relations = {
2649
2879
  }
2650
2880
  };
2651
2881
  const buildPopulateFromQuery = async (query, model) => {
2652
- 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();
2653
2883
  };
2654
2884
  const findDocument = async (query, uid2, opts = {}) => {
2655
- const documentManager2 = getService$1("document-manager");
2885
+ const documentManager2 = getService$2("document-manager");
2656
2886
  const populate = await buildPopulateFromQuery(query, uid2);
2657
2887
  return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
2658
2888
  };
@@ -2660,8 +2890,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
2660
2890
  const { user, userAbility } = ctx.state;
2661
2891
  const { model } = ctx.params;
2662
2892
  const { body, query } = ctx.request;
2663
- const documentManager2 = getService$1("document-manager");
2664
- 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 });
2665
2895
  if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
2666
2896
  throw new strapiUtils.errors.ForbiddenError();
2667
2897
  }
@@ -2702,7 +2932,7 @@ const singleTypes = {
2702
2932
  const { userAbility } = ctx.state;
2703
2933
  const { model } = ctx.params;
2704
2934
  const { query = {} } = ctx.request;
2705
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2935
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2706
2936
  if (permissionChecker2.cannot.read()) {
2707
2937
  return ctx.forbidden();
2708
2938
  }
@@ -2736,7 +2966,7 @@ const singleTypes = {
2736
2966
  async createOrUpdate(ctx) {
2737
2967
  const { userAbility } = ctx.state;
2738
2968
  const { model } = ctx.params;
2739
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2969
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2740
2970
  const document = await createOrUpdateDocument(ctx);
2741
2971
  const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
2742
2972
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
@@ -2745,8 +2975,8 @@ const singleTypes = {
2745
2975
  const { userAbility } = ctx.state;
2746
2976
  const { model } = ctx.params;
2747
2977
  const { query = {} } = ctx.request;
2748
- const documentManager2 = getService$1("document-manager");
2749
- 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 });
2750
2980
  if (permissionChecker2.cannot.delete()) {
2751
2981
  return ctx.forbidden();
2752
2982
  }
@@ -2774,8 +3004,8 @@ const singleTypes = {
2774
3004
  const { userAbility } = ctx.state;
2775
3005
  const { model } = ctx.params;
2776
3006
  const { query = {} } = ctx.request;
2777
- const documentManager2 = getService$1("document-manager");
2778
- 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 });
2779
3009
  if (permissionChecker2.cannot.publish()) {
2780
3010
  return ctx.forbidden();
2781
3011
  }
@@ -2803,8 +3033,8 @@ const singleTypes = {
2803
3033
  body: { discardDraft, ...body },
2804
3034
  query = {}
2805
3035
  } = ctx.request;
2806
- const documentManager2 = getService$1("document-manager");
2807
- 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 });
2808
3038
  if (permissionChecker2.cannot.unpublish()) {
2809
3039
  return ctx.forbidden();
2810
3040
  }
@@ -2838,8 +3068,8 @@ const singleTypes = {
2838
3068
  const { userAbility } = ctx.state;
2839
3069
  const { model } = ctx.params;
2840
3070
  const { body, query = {} } = ctx.request;
2841
- const documentManager2 = getService$1("document-manager");
2842
- 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 });
2843
3073
  if (permissionChecker2.cannot.discard()) {
2844
3074
  return ctx.forbidden();
2845
3075
  }
@@ -2862,8 +3092,8 @@ const singleTypes = {
2862
3092
  const { userAbility } = ctx.state;
2863
3093
  const { model } = ctx.params;
2864
3094
  const { query } = ctx.request;
2865
- const documentManager2 = getService$1("document-manager");
2866
- 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 });
2867
3097
  const { locale } = await getDocumentLocaleAndStatus(query, model);
2868
3098
  if (permissionChecker2.cannot.read()) {
2869
3099
  return ctx.forbidden();
@@ -2887,7 +3117,7 @@ const uid$1 = {
2887
3117
  const { query = {} } = ctx.request;
2888
3118
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2889
3119
  await validateUIDField(contentTypeUID, field);
2890
- const uidService = getService$1("uid");
3120
+ const uidService = getService$2("uid");
2891
3121
  ctx.body = {
2892
3122
  data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
2893
3123
  };
@@ -2899,7 +3129,7 @@ const uid$1 = {
2899
3129
  const { query = {} } = ctx.request;
2900
3130
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2901
3131
  await validateUIDField(contentTypeUID, field);
2902
- const uidService = getService$1("uid");
3132
+ const uidService = getService$2("uid");
2903
3133
  const isAvailable = await uidService.checkUIDAvailability({
2904
3134
  contentTypeUID,
2905
3135
  field,
@@ -2920,7 +3150,8 @@ const controllers = {
2920
3150
  relations,
2921
3151
  "single-types": singleTypes,
2922
3152
  uid: uid$1,
2923
- ...history.controllers ? history.controllers : {}
3153
+ ...history.controllers ? history.controllers : {},
3154
+ ...preview.controllers ? preview.controllers : {}
2924
3155
  };
2925
3156
  const keys = {
2926
3157
  CONFIGURATION: "configuration"
@@ -3071,12 +3302,12 @@ async function syncMetadatas(configuration, schema) {
3071
3302
  return ___default.default.assign(metasWithDefaults, updatedMetas);
3072
3303
  }
3073
3304
  const getTargetSchema = (targetModel) => {
3074
- return getService$1("content-types").findContentType(targetModel);
3305
+ return getService$2("content-types").findContentType(targetModel);
3075
3306
  };
3076
3307
  const DEFAULT_LIST_LENGTH = 4;
3077
3308
  const MAX_ROW_SIZE = 12;
3078
3309
  const isAllowedFieldSize = (type, size) => {
3079
- const { getFieldSize } = getService$1("field-sizes");
3310
+ const { getFieldSize } = getService$2("field-sizes");
3080
3311
  const fieldSize = getFieldSize(type);
3081
3312
  if (!fieldSize.isResizable && size !== fieldSize.default) {
3082
3313
  return false;
@@ -3084,7 +3315,7 @@ const isAllowedFieldSize = (type, size) => {
3084
3315
  return size <= MAX_ROW_SIZE;
3085
3316
  };
3086
3317
  const getDefaultFieldSize = (attribute) => {
3087
- const { hasFieldSize, getFieldSize } = getService$1("field-sizes");
3318
+ const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
3088
3319
  return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
3089
3320
  };
3090
3321
  async function createDefaultLayouts(schema) {
@@ -3119,7 +3350,7 @@ function syncLayouts(configuration, schema) {
3119
3350
  for (const el of row) {
3120
3351
  if (!hasEditableAttribute(schema, el.name))
3121
3352
  continue;
3122
- const { hasFieldSize } = getService$1("field-sizes");
3353
+ const { hasFieldSize } = getService$2("field-sizes");
3123
3354
  const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
3124
3355
  if (!isAllowedFieldSize(fieldType, el.size)) {
3125
3356
  elementsToReAppend.push(el.name);
@@ -3259,17 +3490,17 @@ const configurationService$1 = createConfigurationService({
3259
3490
  isComponent: true,
3260
3491
  prefix: STORE_KEY_PREFIX,
3261
3492
  getModels() {
3262
- const { toContentManagerModel } = getService$1("data-mapper");
3493
+ const { toContentManagerModel } = getService$2("data-mapper");
3263
3494
  return fp.mapValues(toContentManagerModel, strapi.components);
3264
3495
  }
3265
3496
  });
3266
3497
  const components = ({ strapi: strapi2 }) => ({
3267
3498
  findAllComponents() {
3268
- const { toContentManagerModel } = getService$1("data-mapper");
3499
+ const { toContentManagerModel } = getService$2("data-mapper");
3269
3500
  return Object.values(strapi2.components).map(toContentManagerModel);
3270
3501
  },
3271
3502
  findComponent(uid2) {
3272
- const { toContentManagerModel } = getService$1("data-mapper");
3503
+ const { toContentManagerModel } = getService$2("data-mapper");
3273
3504
  const component = strapi2.components[uid2];
3274
3505
  return fp.isNil(component) ? component : toContentManagerModel(component);
3275
3506
  },
@@ -3320,17 +3551,17 @@ const configurationService = createConfigurationService({
3320
3551
  storeUtils,
3321
3552
  prefix: "content_types",
3322
3553
  getModels() {
3323
- const { toContentManagerModel } = getService$1("data-mapper");
3554
+ const { toContentManagerModel } = getService$2("data-mapper");
3324
3555
  return fp.mapValues(toContentManagerModel, strapi.contentTypes);
3325
3556
  }
3326
3557
  });
3327
3558
  const service = ({ strapi: strapi2 }) => ({
3328
3559
  findAllContentTypes() {
3329
- const { toContentManagerModel } = getService$1("data-mapper");
3560
+ const { toContentManagerModel } = getService$2("data-mapper");
3330
3561
  return Object.values(strapi2.contentTypes).map(toContentManagerModel);
3331
3562
  },
3332
3563
  findContentType(uid2) {
3333
- const { toContentManagerModel } = getService$1("data-mapper");
3564
+ const { toContentManagerModel } = getService$2("data-mapper");
3334
3565
  const contentType = strapi2.contentTypes[uid2];
3335
3566
  return fp.isNil(contentType) ? contentType : toContentManagerModel(contentType);
3336
3567
  },
@@ -3359,7 +3590,7 @@ const service = ({ strapi: strapi2 }) => ({
3359
3590
  return this.findConfiguration(contentType);
3360
3591
  },
3361
3592
  findComponentsConfigurations(contentType) {
3362
- return getService$1("components").findComponentsConfigurations(contentType);
3593
+ return getService$2("components").findComponentsConfigurations(contentType);
3363
3594
  },
3364
3595
  syncConfigurations() {
3365
3596
  return configurationService.syncConfigurations();
@@ -3631,7 +3862,7 @@ const permission = ({ strapi: strapi2 }) => ({
3631
3862
  return userAbility.can(action);
3632
3863
  },
3633
3864
  async registerPermissions() {
3634
- const displayedContentTypes = getService$1("content-types").findDisplayedContentTypes();
3865
+ const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
3635
3866
  const contentTypesUids = displayedContentTypes.map(fp.prop("uid"));
3636
3867
  const actions = [
3637
3868
  {
@@ -3907,7 +4138,7 @@ const getQueryPopulate = async (uid2, query) => {
3907
4138
  return populateQuery;
3908
4139
  };
3909
4140
  const buildDeepPopulate = (uid2) => {
3910
- return getService$1("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
4141
+ return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
3911
4142
  };
3912
4143
  const populateBuilder = (uid2) => {
3913
4144
  let getInitialPopulate = async () => {
@@ -4092,7 +4323,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4092
4323
  */
4093
4324
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4094
4325
  const versionsByLocale = fp.groupBy("locale", allVersions);
4095
- delete versionsByLocale[version.locale];
4326
+ if (version.locale) {
4327
+ delete versionsByLocale[version.locale];
4328
+ }
4096
4329
  const model = strapi2.getModel(uid2);
4097
4330
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4098
4331
  const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
@@ -4448,7 +4681,8 @@ const services = {
4448
4681
  permission,
4449
4682
  "populate-builder": populateBuilder$1,
4450
4683
  uid,
4451
- ...history.services ? history.services : {}
4684
+ ...history.services ? history.services : {},
4685
+ ...preview.services ? preview.services : {}
4452
4686
  };
4453
4687
  const index = () => {
4454
4688
  return {