@strapi/content-manager 0.0.0-experimental.b1d7921ddb1b36c84b58a3946e1dc9dbda91b2dc → 0.0.0-experimental.b67f4e6a09bc9dea2c9c999705ecef7e18e84f94

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 (152) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-CQDCxI8x.js → ComponentConfigurationPage-ClKl_TA2.js} +4 -4
  2. package/dist/_chunks/{ComponentConfigurationPage-CQDCxI8x.js.map → ComponentConfigurationPage-ClKl_TA2.js.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-jmWwucg_.mjs → ComponentConfigurationPage-D3ZWDAHG.mjs} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-jmWwucg_.mjs.map → ComponentConfigurationPage-D3ZWDAHG.mjs.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-W07CEdm2.mjs → EditConfigurationPage-BYCBSJxP.mjs} +4 -4
  6. package/dist/_chunks/{EditConfigurationPage-W07CEdm2.mjs.map → EditConfigurationPage-BYCBSJxP.mjs.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-Ce4bIm4n.js → EditConfigurationPage-OWez0Kxp.js} +4 -4
  8. package/dist/_chunks/{EditConfigurationPage-Ce4bIm4n.js.map → EditConfigurationPage-OWez0Kxp.js.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-al5OO1NR.mjs → EditViewPage-5pdbvsO_.mjs} +38 -8
  10. package/dist/_chunks/EditViewPage-5pdbvsO_.mjs.map +1 -0
  11. package/dist/_chunks/{EditViewPage-CqHMM0P0.js → EditViewPage-BEs5iGDi.js} +37 -7
  12. package/dist/_chunks/EditViewPage-BEs5iGDi.js.map +1 -0
  13. package/dist/_chunks/{Field-DSOUlTCm.js → Field-DNHm4wHx.js} +42 -23
  14. package/dist/_chunks/Field-DNHm4wHx.js.map +1 -0
  15. package/dist/_chunks/{Field-EeG6NQ7x.mjs → Field-DcKuFHYK.mjs} +42 -23
  16. package/dist/_chunks/Field-DcKuFHYK.mjs.map +1 -0
  17. package/dist/_chunks/{Form-BAo9ANb_.mjs → Form-CGwM_-5c.mjs} +2 -2
  18. package/dist/_chunks/{Form-BAo9ANb_.mjs.map → Form-CGwM_-5c.mjs.map} +1 -1
  19. package/dist/_chunks/{Form-DAEfHKzm.js → Form-CoRxWJOz.js} +2 -2
  20. package/dist/_chunks/{Form-DAEfHKzm.js.map → Form-CoRxWJOz.js.map} +1 -1
  21. package/dist/_chunks/{History-CTFvy6XH.js → History-BcUTQrfG.js} +21 -91
  22. package/dist/_chunks/History-BcUTQrfG.js.map +1 -0
  23. package/dist/_chunks/{History-BpLIu67W.mjs → History-DEvr3Q_V.mjs} +22 -92
  24. package/dist/_chunks/History-DEvr3Q_V.mjs.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-CDzlMBz_.js → ListConfigurationPage-BE_Ho7tV.js} +5 -4
  26. package/dist/_chunks/ListConfigurationPage-BE_Ho7tV.js.map +1 -0
  27. package/dist/_chunks/{ListConfigurationPage-DOqj5f8Y.mjs → ListConfigurationPage-BM4zZZcM.mjs} +6 -5
  28. package/dist/_chunks/ListConfigurationPage-BM4zZZcM.mjs.map +1 -0
  29. package/dist/_chunks/{ListViewPage-BbXYNI0v.mjs → ListViewPage-BK2mkrql.mjs} +28 -6
  30. package/dist/_chunks/{ListViewPage-BbXYNI0v.mjs.map → ListViewPage-BK2mkrql.mjs.map} +1 -1
  31. package/dist/_chunks/{ListViewPage-D0fpPYKp.js → ListViewPage-BkT8Eao0.js} +28 -6
  32. package/dist/_chunks/ListViewPage-BkT8Eao0.js.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-w2Q0VVOT.mjs → NoContentTypePage-BvcAutu9.mjs} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-w2Q0VVOT.mjs.map → NoContentTypePage-BvcAutu9.mjs.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-DTzkSAV5.js → NoContentTypePage-C8mtyc4H.js} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-DTzkSAV5.js.map → NoContentTypePage-C8mtyc4H.js.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-BoI2rU68.js → NoPermissionsPage-B5Y9Y78B.js} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-BoI2rU68.js.map → NoPermissionsPage-B5Y9Y78B.js.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-Km0Vk5Wp.mjs → NoPermissionsPage-BmbRz7PR.mjs} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-Km0Vk5Wp.mjs.map → NoPermissionsPage-BmbRz7PR.mjs.map} +1 -1
  41. package/dist/_chunks/Preview-BF8ZDYqS.js +286 -0
  42. package/dist/_chunks/Preview-BF8ZDYqS.js.map +1 -0
  43. package/dist/_chunks/Preview-DcexhKJE.mjs +267 -0
  44. package/dist/_chunks/Preview-DcexhKJE.mjs.map +1 -0
  45. package/dist/_chunks/{Relations-D6Nz5ksc.js → Relations-BKnoK1R0.js} +24 -10
  46. package/dist/_chunks/Relations-BKnoK1R0.js.map +1 -0
  47. package/dist/_chunks/{Relations-C_bpmSuQ.mjs → Relations-BjIzc4EK.mjs} +25 -11
  48. package/dist/_chunks/Relations-BjIzc4EK.mjs.map +1 -0
  49. package/dist/_chunks/{en-DKV44jRb.mjs → en-CfIXaZf9.mjs} +14 -3
  50. package/dist/_chunks/{en-DKV44jRb.mjs.map → en-CfIXaZf9.mjs.map} +1 -1
  51. package/dist/_chunks/{en-Bm0D0IWz.js → en-DTWPCdTS.js} +14 -3
  52. package/dist/_chunks/{en-Bm0D0IWz.js.map → en-DTWPCdTS.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-DcQ6xogO.mjs → index-BW-rXkjn.mjs} +164 -81
  62. package/dist/_chunks/index-BW-rXkjn.mjs.map +1 -0
  63. package/dist/_chunks/{index-BsMu2oVP.js → index-DOzAG2cq.js} +160 -77
  64. package/dist/_chunks/index-DOzAG2cq.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-BavJ6v4B.mjs → layout-DFVbgjp2.mjs} +3 -3
  70. package/dist/_chunks/{layout-BavJ6v4B.mjs.map → layout-DFVbgjp2.mjs.map} +1 -1
  71. package/dist/_chunks/{layout-B4aCAdTt.js → layout-RC3W2obV.js} +3 -3
  72. package/dist/_chunks/{layout-B4aCAdTt.js.map → layout-RC3W2obV.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-DMG453Od.mjs → relations-Dogh8HWI.mjs} +6 -7
  78. package/dist/_chunks/relations-Dogh8HWI.mjs.map +1 -0
  79. package/dist/_chunks/{relations-Lrm9nz_m.js → relations-zam7-5H7.js} +6 -7
  80. package/dist/_chunks/relations-zam7-5H7.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/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/server/index.js +347 -130
  95. package/dist/server/index.js.map +1 -1
  96. package/dist/server/index.mjs +348 -131
  97. package/dist/server/index.mjs.map +1 -1
  98. package/dist/server/src/bootstrap.d.ts.map +1 -1
  99. package/dist/server/src/controllers/index.d.ts.map +1 -1
  100. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  101. package/dist/server/src/history/services/utils.d.ts +2 -3
  102. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  103. package/dist/server/src/preview/constants.d.ts +2 -0
  104. package/dist/server/src/preview/constants.d.ts.map +1 -0
  105. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  106. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  107. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  108. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  109. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  110. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  111. package/dist/server/src/preview/index.d.ts +4 -0
  112. package/dist/server/src/preview/index.d.ts.map +1 -0
  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/index.d.ts.map +1 -1
  129. package/dist/shared/contracts/index.d.ts +1 -0
  130. package/dist/shared/contracts/index.d.ts.map +1 -1
  131. package/dist/shared/contracts/preview.d.ts +27 -0
  132. package/dist/shared/contracts/preview.d.ts.map +1 -0
  133. package/dist/shared/index.js +4 -0
  134. package/dist/shared/index.js.map +1 -1
  135. package/dist/shared/index.mjs +4 -0
  136. package/dist/shared/index.mjs.map +1 -1
  137. package/package.json +10 -10
  138. package/dist/_chunks/EditViewPage-CqHMM0P0.js.map +0 -1
  139. package/dist/_chunks/EditViewPage-al5OO1NR.mjs.map +0 -1
  140. package/dist/_chunks/Field-DSOUlTCm.js.map +0 -1
  141. package/dist/_chunks/Field-EeG6NQ7x.mjs.map +0 -1
  142. package/dist/_chunks/History-BpLIu67W.mjs.map +0 -1
  143. package/dist/_chunks/History-CTFvy6XH.js.map +0 -1
  144. package/dist/_chunks/ListConfigurationPage-CDzlMBz_.js.map +0 -1
  145. package/dist/_chunks/ListConfigurationPage-DOqj5f8Y.mjs.map +0 -1
  146. package/dist/_chunks/ListViewPage-D0fpPYKp.js.map +0 -1
  147. package/dist/_chunks/Relations-C_bpmSuQ.mjs.map +0 -1
  148. package/dist/_chunks/Relations-D6Nz5ksc.js.map +0 -1
  149. package/dist/_chunks/index-BsMu2oVP.js.map +0 -1
  150. package/dist/_chunks/index-DcQ6xogO.mjs.map +0 -1
  151. package/dist/_chunks/relations-DMG453Od.mjs.map +0 -1
  152. package/dist/_chunks/relations-Lrm9nz_m.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import strapiUtils, { validateYupSchema, errors, async, contentTypes as contentTypes$1, yup as yup$1, validateYupSchemaSync, policy, traverse, setCreatorFields, isOperatorOfType, relations as relations$1, traverseEntity, pagination } from "@strapi/utils";
2
- import { pick, omit, difference, castArray, intersection, pipe, propOr, isEqual, isEmpty, set, isNil as isNil$1, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, getOr, propEq, merge, groupBy } from "lodash/fp";
2
+ import { pick, omit, difference, castArray, mergeWith, intersection, pipe, propOr, isEqual, isEmpty, set, isNil as isNil$1, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, getOr, propEq, merge, groupBy } from "lodash/fp";
3
3
  import "@strapi/types";
4
4
  import * as yup from "yup";
5
5
  import { scheduleJob } from "node-schedule";
@@ -7,10 +7,10 @@ import isNil from "lodash/isNil";
7
7
  import _, { intersection as intersection$1, difference as difference$1 } from "lodash";
8
8
  import qs from "qs";
9
9
  import slugify from "@sindresorhus/slugify";
10
- const getService$1 = (name) => {
10
+ const getService$2 = (name) => {
11
11
  return strapi.plugin("content-manager").service(name);
12
12
  };
13
- function getService(strapi2, name) {
13
+ function getService$1(strapi2, name) {
14
14
  return strapi2.service(`plugin::content-manager.${name}`);
15
15
  }
16
16
  const historyRestoreVersionSchema = yup.object().shape({
@@ -46,7 +46,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
46
46
  if (!isSingleType && (!contentTypeUid || !ctx.query.documentId)) {
47
47
  throw new errors.ForbiddenError("contentType and documentId are required");
48
48
  }
49
- const permissionChecker2 = getService$1("permission-checker").create({
49
+ const permissionChecker2 = getService$2("permission-checker").create({
50
50
  userAbility: ctx.state.userAbility,
51
51
  model: ctx.query.contentType
52
52
  });
@@ -54,7 +54,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
54
54
  return ctx.forbidden();
55
55
  }
56
56
  const query = await permissionChecker2.sanitizeQuery(ctx.query);
57
- const { results, pagination: pagination2 } = await getService(strapi2, "history").findVersionsPage({
57
+ const { results, pagination: pagination2 } = await getService$1(strapi2, "history").findVersionsPage({
58
58
  query: {
59
59
  ...query,
60
60
  ...getValidPagination({ page: query.page, pageSize: query.pageSize })
@@ -79,14 +79,14 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
79
79
  async restoreVersion(ctx) {
80
80
  const request = ctx.request;
81
81
  await validateRestoreVersion(request.body, "contentType is required");
82
- const permissionChecker2 = getService$1("permission-checker").create({
82
+ const permissionChecker2 = getService$2("permission-checker").create({
83
83
  userAbility: ctx.state.userAbility,
84
84
  model: request.body.contentType
85
85
  });
86
86
  if (permissionChecker2.cannot.update()) {
87
87
  throw new errors.ForbiddenError();
88
88
  }
89
- const restoredDocument = await getService(strapi2, "history").restoreVersion(
89
+ const restoredDocument = await getService$1(strapi2, "history").restoreVersion(
90
90
  request.params.versionId
91
91
  );
92
92
  return {
@@ -95,7 +95,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
95
95
  }
96
96
  };
97
97
  };
98
- const controllers$1 = {
98
+ const controllers$2 = {
99
99
  "history-version": createHistoryVersionController
100
100
  /**
101
101
  * Casting is needed because the types aren't aware that Strapi supports
@@ -202,6 +202,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
202
202
  const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
203
203
  return documentMetadataService.getStatus(document, meta.availableStatus);
204
204
  };
205
+ const getComponentFields = (componentUID) => {
206
+ return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
207
+ (fieldsAcc, [key, attribute]) => {
208
+ if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
209
+ fieldsAcc.push(key);
210
+ }
211
+ return fieldsAcc;
212
+ },
213
+ []
214
+ );
215
+ };
205
216
  const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
206
217
  const model = strapi2.getModel(uid2);
207
218
  const attributes = Object.entries(model.attributes);
@@ -225,13 +236,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
225
236
  }
226
237
  case "component": {
227
238
  const populate = getDeepPopulate2(attribute.component);
228
- acc[attributeName] = { populate };
239
+ acc[attributeName] = {
240
+ populate,
241
+ [fieldSelector]: getComponentFields(attribute.component)
242
+ };
229
243
  break;
230
244
  }
231
245
  case "dynamiczone": {
232
246
  const populatedComponents = (attribute.components || []).reduce(
233
247
  (acc2, componentUID) => {
234
- acc2[componentUID] = { populate: getDeepPopulate2(componentUID) };
248
+ acc2[componentUID] = {
249
+ populate: getDeepPopulate2(componentUID),
250
+ [fieldSelector]: getComponentFields(componentUID)
251
+ };
235
252
  return acc2;
236
253
  },
237
254
  {}
@@ -344,7 +361,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
344
361
  const attributeValue = entry.data[attributeKey];
345
362
  const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
346
363
  if (attributeSchema.type === "media") {
347
- const permissionChecker2 = getService$1("permission-checker").create({
364
+ const permissionChecker2 = getService$2("permission-checker").create({
348
365
  userAbility: params.state.userAbility,
349
366
  model: "plugin::upload.file"
350
367
  });
@@ -385,7 +402,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
385
402
  [attributeKey]: adminUsers
386
403
  };
387
404
  }
388
- const permissionChecker2 = getService$1("permission-checker").create({
405
+ const permissionChecker2 = getService$2("permission-checker").create({
389
406
  userAbility: params.state.userAbility,
390
407
  model: attributeSchema.target
391
408
  });
@@ -561,7 +578,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
561
578
  onCommit(async () => {
562
579
  for (const entry of localeEntries) {
563
580
  const status = await serviceUtils.getVersionStatus(uid2, entry);
564
- await getService(strapi2, "history").createVersion({
581
+ await getService$1(strapi2, "history").createVersion({
565
582
  contentType: uid2,
566
583
  data: omit(FIELDS_TO_IGNORE, entry),
567
584
  relatedDocumentId: documentId,
@@ -574,15 +591,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
574
591
  });
575
592
  return result;
576
593
  });
577
- state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
594
+ state.deleteExpiredJob = scheduleJob("historyDaily", "0 0 * * *", () => {
578
595
  const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
579
596
  const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
580
597
  strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
581
598
  where: {
582
599
  created_at: {
583
- $lt: expirationDate.toISOString()
600
+ $lt: expirationDate
584
601
  }
585
602
  }
603
+ }).catch((error) => {
604
+ if (error instanceof Error) {
605
+ strapi2.log.error("Error deleting expired history versions", error.message);
606
+ }
586
607
  });
587
608
  });
588
609
  state.isInitialized = true;
@@ -594,17 +615,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
594
615
  }
595
616
  };
596
617
  };
597
- const services$1 = {
618
+ const services$2 = {
598
619
  history: createHistoryService,
599
620
  lifecycles: createLifecyclesService
600
621
  };
601
- const info = { pluginName: "content-manager", type: "admin" };
622
+ const info$1 = { pluginName: "content-manager", type: "admin" };
602
623
  const historyVersionRouter = {
603
624
  type: "admin",
604
625
  routes: [
605
626
  {
606
627
  method: "GET",
607
- info,
628
+ info: info$1,
608
629
  path: "/history-versions",
609
630
  handler: "history-version.findMany",
610
631
  config: {
@@ -613,7 +634,7 @@ const historyVersionRouter = {
613
634
  },
614
635
  {
615
636
  method: "PUT",
616
- info,
637
+ info: info$1,
617
638
  path: "/history-versions/:versionId/restore",
618
639
  handler: "history-version.restoreVersion",
619
640
  config: {
@@ -622,7 +643,7 @@ const historyVersionRouter = {
622
643
  }
623
644
  ]
624
645
  };
625
- const routes$1 = {
646
+ const routes$2 = {
626
647
  "history-version": historyVersionRouter
627
648
  };
628
649
  const historyVersion = {
@@ -669,21 +690,21 @@ const historyVersion = {
669
690
  }
670
691
  }
671
692
  };
672
- const getFeature = () => {
693
+ const getFeature$1 = () => {
673
694
  if (strapi.ee.features.isEnabled("cms-content-history")) {
674
695
  return {
675
696
  register({ strapi: strapi2 }) {
676
697
  strapi2.get("models").add(historyVersion);
677
698
  },
678
699
  bootstrap({ strapi: strapi2 }) {
679
- getService(strapi2, "lifecycles").bootstrap();
700
+ getService$1(strapi2, "lifecycles").bootstrap();
680
701
  },
681
702
  destroy({ strapi: strapi2 }) {
682
- getService(strapi2, "lifecycles").destroy();
703
+ getService$1(strapi2, "lifecycles").destroy();
683
704
  },
684
- controllers: controllers$1,
685
- services: services$1,
686
- routes: routes$1
705
+ controllers: controllers$2,
706
+ services: services$2,
707
+ routes: routes$2
687
708
  };
688
709
  }
689
710
  return {
@@ -692,9 +713,201 @@ const getFeature = () => {
692
713
  }
693
714
  };
694
715
  };
695
- const history = getFeature();
716
+ const history = getFeature$1();
717
+ const FEATURE_ID = "preview";
718
+ const info = { pluginName: "content-manager", type: "admin" };
719
+ const previewRouter = {
720
+ type: "admin",
721
+ routes: [
722
+ {
723
+ method: "GET",
724
+ info,
725
+ path: "/preview/url/:contentType",
726
+ handler: "preview.getPreviewUrl",
727
+ config: {
728
+ policies: ["admin::isAuthenticatedAdmin"]
729
+ }
730
+ }
731
+ ]
732
+ };
733
+ const routes$1 = {
734
+ preview: previewRouter
735
+ };
736
+ function getService(strapi2, name) {
737
+ return strapi2.service(`plugin::content-manager.${name}`);
738
+ }
739
+ const getPreviewUrlSchema = yup.object().shape({
740
+ // Will be undefined for single types
741
+ documentId: yup.string(),
742
+ locale: yup.string().nullable(),
743
+ status: yup.string()
744
+ }).required();
745
+ const validatePreviewUrl = async (strapi2, uid2, params) => {
746
+ await validateYupSchema(getPreviewUrlSchema)(params);
747
+ const newParams = pick(["documentId", "locale", "status"], params);
748
+ const model = strapi2.getModel(uid2);
749
+ if (!model || model.modelType !== "contentType") {
750
+ throw new errors.ValidationError("Invalid content type");
751
+ }
752
+ const isSingleType = model?.kind === "singleType";
753
+ if (!isSingleType && !params.documentId) {
754
+ throw new errors.ValidationError("documentId is required for Collection Types");
755
+ }
756
+ if (isSingleType) {
757
+ const doc = await strapi2.documents(uid2).findFirst();
758
+ if (!doc) {
759
+ throw new errors.NotFoundError("Document not found");
760
+ }
761
+ newParams.documentId = doc?.documentId;
762
+ }
763
+ return newParams;
764
+ };
765
+ const createPreviewController = () => {
766
+ return {
767
+ /**
768
+ * Transforms an entry into a preview URL, so that it can be previewed
769
+ * in the Content Manager.
770
+ */
771
+ async getPreviewUrl(ctx) {
772
+ const uid2 = ctx.params.contentType;
773
+ const query = ctx.request.query;
774
+ const params = await validatePreviewUrl(strapi, uid2, query);
775
+ const previewService = getService(strapi, "preview");
776
+ const url = await previewService.getPreviewUrl(uid2, params);
777
+ if (!url) {
778
+ ctx.status = 204;
779
+ }
780
+ return {
781
+ data: { url }
782
+ };
783
+ }
784
+ };
785
+ };
786
+ const controllers$1 = {
787
+ preview: createPreviewController
788
+ /**
789
+ * Casting is needed because the types aren't aware that Strapi supports
790
+ * passing a controller factory as the value, instead of a controller object directly
791
+ */
792
+ };
793
+ const createPreviewService = ({ strapi: strapi2 }) => {
794
+ const config = getService(strapi2, "preview-config");
795
+ return {
796
+ async getPreviewUrl(uid2, params) {
797
+ const handler = config.getPreviewHandler();
798
+ try {
799
+ return handler(uid2, params);
800
+ } catch (error) {
801
+ strapi2.log.error(`Failed to get preview URL: ${error}`);
802
+ throw new errors.ApplicationError("Failed to get preview URL");
803
+ }
804
+ return;
805
+ }
806
+ };
807
+ };
808
+ const extendMiddlewareConfiguration = (middleware = { name: "", config: {} }) => {
809
+ const middlewares = strapi.config.get("middlewares");
810
+ const configuredMiddlewares = middlewares.map((currentMiddleware) => {
811
+ if (currentMiddleware === middleware.name) {
812
+ return middleware;
813
+ }
814
+ if (currentMiddleware.name === middleware.name) {
815
+ return mergeWith(
816
+ (objValue, srcValue) => {
817
+ if (Array.isArray(objValue)) {
818
+ return objValue.concat(srcValue);
819
+ }
820
+ return void 0;
821
+ },
822
+ currentMiddleware,
823
+ middleware
824
+ );
825
+ }
826
+ return currentMiddleware;
827
+ });
828
+ strapi.config.set("middlewares", configuredMiddlewares);
829
+ };
830
+ const createPreviewConfigService = ({ strapi: strapi2 }) => {
831
+ return {
832
+ register() {
833
+ if (!this.isEnabled()) {
834
+ return;
835
+ }
836
+ const config = strapi2.config.get("admin.preview");
837
+ if (config.config?.allowedOrigins) {
838
+ extendMiddlewareConfiguration({
839
+ name: "strapi::security",
840
+ config: {
841
+ contentSecurityPolicy: {
842
+ directives: {
843
+ "frame-src": config.config.allowedOrigins
844
+ }
845
+ }
846
+ }
847
+ });
848
+ }
849
+ },
850
+ isEnabled() {
851
+ const config = strapi2.config.get("admin.preview");
852
+ if (!config) {
853
+ return false;
854
+ }
855
+ return config?.enabled ?? true;
856
+ },
857
+ /**
858
+ * Validate if the configuration is valid
859
+ */
860
+ validate() {
861
+ if (!this.isEnabled()) {
862
+ return;
863
+ }
864
+ const handler = this.getPreviewHandler();
865
+ if (typeof handler !== "function") {
866
+ throw new errors.ValidationError(
867
+ "Preview configuration is invalid. Handler must be a function"
868
+ );
869
+ }
870
+ },
871
+ /**
872
+ * Utility to get the preview handler from the configuration
873
+ */
874
+ getPreviewHandler() {
875
+ const config = strapi2.config.get("admin.preview");
876
+ const emptyHandler = () => {
877
+ return void 0;
878
+ };
879
+ if (!this.isEnabled()) {
880
+ return emptyHandler;
881
+ }
882
+ return config?.config?.handler || emptyHandler;
883
+ }
884
+ };
885
+ };
886
+ const services$1 = {
887
+ preview: createPreviewService,
888
+ "preview-config": createPreviewConfigService
889
+ };
890
+ const getFeature = () => {
891
+ if (!strapi.features.future.isEnabled(FEATURE_ID)) {
892
+ return {};
893
+ }
894
+ return {
895
+ register() {
896
+ const config = getService(strapi, "preview-config");
897
+ config.validate();
898
+ config.register();
899
+ },
900
+ bootstrap() {
901
+ },
902
+ routes: routes$1,
903
+ controllers: controllers$1,
904
+ services: services$1
905
+ };
906
+ };
907
+ const preview = getFeature();
696
908
  const register = async ({ strapi: strapi2 }) => {
697
909
  await history.register?.({ strapi: strapi2 });
910
+ await preview.register?.({ strapi: strapi2 });
698
911
  };
699
912
  const ALLOWED_WEBHOOK_EVENTS = {
700
913
  ENTRY_PUBLISH: "entry.publish",
@@ -704,11 +917,12 @@ const bootstrap = async () => {
704
917
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
705
918
  strapi.get("webhookStore").addAllowedEvent(key, value);
706
919
  });
707
- getService$1("field-sizes").setCustomFieldInputSizes();
708
- await getService$1("components").syncConfigurations();
709
- await getService$1("content-types").syncConfigurations();
710
- await getService$1("permission").registerPermissions();
920
+ getService$2("field-sizes").setCustomFieldInputSizes();
921
+ await getService$2("components").syncConfigurations();
922
+ await getService$2("content-types").syncConfigurations();
923
+ await getService$2("permission").registerPermissions();
711
924
  await history.bootstrap?.({ strapi });
925
+ await preview.bootstrap?.({ strapi });
712
926
  };
713
927
  const destroy = async ({ strapi: strapi2 }) => {
714
928
  await history.destroy?.({ strapi: strapi2 });
@@ -1198,7 +1412,8 @@ const admin = {
1198
1412
  };
1199
1413
  const routes = {
1200
1414
  admin,
1201
- ...history.routes ? history.routes : {}
1415
+ ...history.routes ? history.routes : {},
1416
+ ...preview.routes ? preview.routes : {}
1202
1417
  };
1203
1418
  const hasPermissionsSchema = yup$1.object({
1204
1419
  actions: yup$1.array().of(yup$1.string()),
@@ -1455,7 +1670,7 @@ const createMetadasSchema = (schema) => {
1455
1670
  if (!value) {
1456
1671
  return yup$1.string();
1457
1672
  }
1458
- const targetSchema = getService$1("content-types").findContentType(
1673
+ const targetSchema = getService$2("content-types").findContentType(
1459
1674
  schema.attributes[key].targetModel
1460
1675
  );
1461
1676
  if (!targetSchema) {
@@ -1624,7 +1839,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
1624
1839
  }
1625
1840
  };
1626
1841
  const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
1627
- const documentMetadata2 = getService$1("document-metadata");
1842
+ const documentMetadata2 = getService$2("document-metadata");
1628
1843
  const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
1629
1844
  let {
1630
1845
  meta: { availableLocales, availableStatus }
@@ -1650,8 +1865,8 @@ const createDocument = async (ctx, opts) => {
1650
1865
  const { userAbility, user } = ctx.state;
1651
1866
  const { model } = ctx.params;
1652
1867
  const { body } = ctx.request;
1653
- const documentManager2 = getService$1("document-manager");
1654
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1868
+ const documentManager2 = getService$2("document-manager");
1869
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1655
1870
  if (permissionChecker2.cannot.create()) {
1656
1871
  throw new errors.ForbiddenError();
1657
1872
  }
@@ -1671,13 +1886,13 @@ const updateDocument = async (ctx, opts) => {
1671
1886
  const { userAbility, user } = ctx.state;
1672
1887
  const { id, model } = ctx.params;
1673
1888
  const { body } = ctx.request;
1674
- const documentManager2 = getService$1("document-manager");
1675
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1889
+ const documentManager2 = getService$2("document-manager");
1890
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1676
1891
  if (permissionChecker2.cannot.update()) {
1677
1892
  throw new errors.ForbiddenError();
1678
1893
  }
1679
1894
  const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
1680
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1895
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1681
1896
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1682
1897
  const [documentVersion, documentExists] = await Promise.all([
1683
1898
  documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
@@ -1708,14 +1923,14 @@ const collectionTypes = {
1708
1923
  const { userAbility } = ctx.state;
1709
1924
  const { model } = ctx.params;
1710
1925
  const { query } = ctx.request;
1711
- const documentMetadata2 = getService$1("document-metadata");
1712
- const documentManager2 = getService$1("document-manager");
1713
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1926
+ const documentMetadata2 = getService$2("document-metadata");
1927
+ const documentManager2 = getService$2("document-manager");
1928
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1714
1929
  if (permissionChecker2.cannot.read()) {
1715
1930
  return ctx.forbidden();
1716
1931
  }
1717
1932
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
1718
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1933
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1719
1934
  const { locale, status } = await getDocumentLocaleAndStatus(query, model);
1720
1935
  const { results: documents, pagination: pagination2 } = await documentManager2.findPage(
1721
1936
  { ...permissionQuery, populate, locale, status },
@@ -1744,13 +1959,13 @@ const collectionTypes = {
1744
1959
  async findOne(ctx) {
1745
1960
  const { userAbility } = ctx.state;
1746
1961
  const { model, id } = ctx.params;
1747
- const documentManager2 = getService$1("document-manager");
1748
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1962
+ const documentManager2 = getService$2("document-manager");
1963
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1749
1964
  if (permissionChecker2.cannot.read()) {
1750
1965
  return ctx.forbidden();
1751
1966
  }
1752
1967
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
1753
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1968
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1754
1969
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
1755
1970
  const version = await documentManager2.findOne(id, model, {
1756
1971
  populate,
@@ -1781,7 +1996,7 @@ const collectionTypes = {
1781
1996
  async create(ctx) {
1782
1997
  const { userAbility } = ctx.state;
1783
1998
  const { model } = ctx.params;
1784
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1999
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1785
2000
  const [totalEntries, document] = await Promise.all([
1786
2001
  strapi.db.query(model).count(),
1787
2002
  createDocument(ctx)
@@ -1802,7 +2017,7 @@ const collectionTypes = {
1802
2017
  async update(ctx) {
1803
2018
  const { userAbility } = ctx.state;
1804
2019
  const { model } = ctx.params;
1805
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2020
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1806
2021
  const updatedVersion = await updateDocument(ctx);
1807
2022
  const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
1808
2023
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
@@ -1811,13 +2026,13 @@ const collectionTypes = {
1811
2026
  const { userAbility, user } = ctx.state;
1812
2027
  const { model, sourceId: id } = ctx.params;
1813
2028
  const { body } = ctx.request;
1814
- const documentManager2 = getService$1("document-manager");
1815
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2029
+ const documentManager2 = getService$2("document-manager");
2030
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1816
2031
  if (permissionChecker2.cannot.create()) {
1817
2032
  return ctx.forbidden();
1818
2033
  }
1819
2034
  const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
1820
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2035
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1821
2036
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1822
2037
  const document = await documentManager2.findOne(id, model, {
1823
2038
  populate,
@@ -1856,13 +2071,13 @@ const collectionTypes = {
1856
2071
  async delete(ctx) {
1857
2072
  const { userAbility } = ctx.state;
1858
2073
  const { id, model } = ctx.params;
1859
- const documentManager2 = getService$1("document-manager");
1860
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2074
+ const documentManager2 = getService$2("document-manager");
2075
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1861
2076
  if (permissionChecker2.cannot.delete()) {
1862
2077
  return ctx.forbidden();
1863
2078
  }
1864
2079
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
1865
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2080
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1866
2081
  const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
1867
2082
  const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
1868
2083
  if (documentLocales.length === 0) {
@@ -1884,14 +2099,14 @@ const collectionTypes = {
1884
2099
  const { userAbility } = ctx.state;
1885
2100
  const { id, model } = ctx.params;
1886
2101
  const { body } = ctx.request;
1887
- const documentManager2 = getService$1("document-manager");
1888
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2102
+ const documentManager2 = getService$2("document-manager");
2103
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1889
2104
  if (permissionChecker2.cannot.publish()) {
1890
2105
  return ctx.forbidden();
1891
2106
  }
1892
2107
  const publishedDocument = await strapi.db.transaction(async () => {
1893
2108
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1894
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2109
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1895
2110
  let document;
1896
2111
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1897
2112
  const isCreate = isNil$1(id);
@@ -1939,13 +2154,13 @@ const collectionTypes = {
1939
2154
  const { body } = ctx.request;
1940
2155
  const { documentIds } = body;
1941
2156
  await validateBulkActionInput(body);
1942
- const documentManager2 = getService$1("document-manager");
1943
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2157
+ const documentManager2 = getService$2("document-manager");
2158
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1944
2159
  if (permissionChecker2.cannot.publish()) {
1945
2160
  return ctx.forbidden();
1946
2161
  }
1947
2162
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1948
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2163
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1949
2164
  const { locale } = await getDocumentLocaleAndStatus(body, model, {
1950
2165
  allowMultipleLocales: true
1951
2166
  });
@@ -1970,8 +2185,8 @@ const collectionTypes = {
1970
2185
  const { body } = ctx.request;
1971
2186
  const { documentIds } = body;
1972
2187
  await validateBulkActionInput(body);
1973
- const documentManager2 = getService$1("document-manager");
1974
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2188
+ const documentManager2 = getService$2("document-manager");
2189
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1975
2190
  if (permissionChecker2.cannot.unpublish()) {
1976
2191
  return ctx.forbidden();
1977
2192
  }
@@ -2000,8 +2215,8 @@ const collectionTypes = {
2000
2215
  const {
2001
2216
  body: { discardDraft, ...body }
2002
2217
  } = ctx.request;
2003
- const documentManager2 = getService$1("document-manager");
2004
- 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 });
2005
2220
  if (permissionChecker2.cannot.unpublish()) {
2006
2221
  return ctx.forbidden();
2007
2222
  }
@@ -2009,7 +2224,7 @@ const collectionTypes = {
2009
2224
  return ctx.forbidden();
2010
2225
  }
2011
2226
  const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
2012
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2227
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2013
2228
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2014
2229
  const document = await documentManager2.findOne(id, model, {
2015
2230
  populate,
@@ -2040,13 +2255,13 @@ const collectionTypes = {
2040
2255
  const { userAbility } = ctx.state;
2041
2256
  const { id, model } = ctx.params;
2042
2257
  const { body } = ctx.request;
2043
- const documentManager2 = getService$1("document-manager");
2044
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2258
+ const documentManager2 = getService$2("document-manager");
2259
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2045
2260
  if (permissionChecker2.cannot.discard()) {
2046
2261
  return ctx.forbidden();
2047
2262
  }
2048
2263
  const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
2049
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2264
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2050
2265
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2051
2266
  const document = await documentManager2.findOne(id, model, {
2052
2267
  populate,
@@ -2071,13 +2286,13 @@ const collectionTypes = {
2071
2286
  const { query, body } = ctx.request;
2072
2287
  const { documentIds } = body;
2073
2288
  await validateBulkActionInput(body);
2074
- const documentManager2 = getService$1("document-manager");
2075
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2289
+ const documentManager2 = getService$2("document-manager");
2290
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2076
2291
  if (permissionChecker2.cannot.delete()) {
2077
2292
  return ctx.forbidden();
2078
2293
  }
2079
2294
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
2080
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2295
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2081
2296
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2082
2297
  const documentLocales = await documentManager2.findLocales(documentIds, model, {
2083
2298
  populate,
@@ -2098,13 +2313,13 @@ const collectionTypes = {
2098
2313
  async countDraftRelations(ctx) {
2099
2314
  const { userAbility } = ctx.state;
2100
2315
  const { model, id } = ctx.params;
2101
- const documentManager2 = getService$1("document-manager");
2102
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2316
+ const documentManager2 = getService$2("document-manager");
2317
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2103
2318
  if (permissionChecker2.cannot.read()) {
2104
2319
  return ctx.forbidden();
2105
2320
  }
2106
2321
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2107
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2322
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2108
2323
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
2109
2324
  const entity = await documentManager2.findOne(id, model, { populate, locale, status });
2110
2325
  if (!entity) {
@@ -2123,8 +2338,8 @@ const collectionTypes = {
2123
2338
  const ids = ctx.request.query.documentIds;
2124
2339
  const locale = ctx.request.query.locale;
2125
2340
  const { model } = ctx.params;
2126
- const documentManager2 = getService$1("document-manager");
2127
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2341
+ const documentManager2 = getService$2("document-manager");
2342
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2128
2343
  if (permissionChecker2.cannot.read()) {
2129
2344
  return ctx.forbidden();
2130
2345
  }
@@ -2148,13 +2363,13 @@ const collectionTypes = {
2148
2363
  };
2149
2364
  const components$1 = {
2150
2365
  findComponents(ctx) {
2151
- const components2 = getService$1("components").findAllComponents();
2152
- const { toDto } = getService$1("data-mapper");
2366
+ const components2 = getService$2("components").findAllComponents();
2367
+ const { toDto } = getService$2("data-mapper");
2153
2368
  ctx.body = { data: components2.map(toDto) };
2154
2369
  },
2155
2370
  async findComponentConfiguration(ctx) {
2156
2371
  const { uid: uid2 } = ctx.params;
2157
- const componentService = getService$1("components");
2372
+ const componentService = getService$2("components");
2158
2373
  const component = componentService.findComponent(uid2);
2159
2374
  if (!component) {
2160
2375
  return ctx.notFound("component.notFound");
@@ -2171,7 +2386,7 @@ const components$1 = {
2171
2386
  async updateComponentConfiguration(ctx) {
2172
2387
  const { uid: uid2 } = ctx.params;
2173
2388
  const { body } = ctx.request;
2174
- const componentService = getService$1("components");
2389
+ const componentService = getService$2("components");
2175
2390
  const component = componentService.findComponent(uid2);
2176
2391
  if (!component) {
2177
2392
  return ctx.notFound("component.notFound");
@@ -2205,12 +2420,12 @@ const contentTypes = {
2205
2420
  } catch (error) {
2206
2421
  return ctx.send({ error }, 400);
2207
2422
  }
2208
- const contentTypes2 = getService$1("content-types").findContentTypesByKind(kind);
2209
- const { toDto } = getService$1("data-mapper");
2423
+ const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
2424
+ const { toDto } = getService$2("data-mapper");
2210
2425
  ctx.body = { data: contentTypes2.map(toDto) };
2211
2426
  },
2212
2427
  async findContentTypesSettings(ctx) {
2213
- const { findAllContentTypes, findConfiguration } = getService$1("content-types");
2428
+ const { findAllContentTypes, findConfiguration } = getService$2("content-types");
2214
2429
  const contentTypes2 = await findAllContentTypes();
2215
2430
  const configurations = await Promise.all(
2216
2431
  contentTypes2.map(async (contentType) => {
@@ -2224,7 +2439,7 @@ const contentTypes = {
2224
2439
  },
2225
2440
  async findContentTypeConfiguration(ctx) {
2226
2441
  const { uid: uid2 } = ctx.params;
2227
- const contentTypeService = getService$1("content-types");
2442
+ const contentTypeService = getService$2("content-types");
2228
2443
  const contentType = await contentTypeService.findContentType(uid2);
2229
2444
  if (!contentType) {
2230
2445
  return ctx.notFound("contentType.notFound");
@@ -2246,13 +2461,13 @@ const contentTypes = {
2246
2461
  const { userAbility } = ctx.state;
2247
2462
  const { uid: uid2 } = ctx.params;
2248
2463
  const { body } = ctx.request;
2249
- const contentTypeService = getService$1("content-types");
2250
- const metricsService = getService$1("metrics");
2464
+ const contentTypeService = getService$2("content-types");
2465
+ const metricsService = getService$2("metrics");
2251
2466
  const contentType = await contentTypeService.findContentType(uid2);
2252
2467
  if (!contentType) {
2253
2468
  return ctx.notFound("contentType.notFound");
2254
2469
  }
2255
- if (!getService$1("permission").canConfigureContentType({ userAbility, contentType })) {
2470
+ if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
2256
2471
  return ctx.forbidden();
2257
2472
  }
2258
2473
  let input;
@@ -2285,10 +2500,10 @@ const contentTypes = {
2285
2500
  };
2286
2501
  const init = {
2287
2502
  getInitData(ctx) {
2288
- const { toDto } = getService$1("data-mapper");
2289
- const { findAllComponents } = getService$1("components");
2290
- const { getAllFieldSizes } = getService$1("field-sizes");
2291
- const { findAllContentTypes } = getService$1("content-types");
2503
+ const { toDto } = getService$2("data-mapper");
2504
+ const { findAllComponents } = getService$2("components");
2505
+ const { getAllFieldSizes } = getService$2("field-sizes");
2506
+ const { findAllContentTypes } = getService$2("content-types");
2292
2507
  ctx.body = {
2293
2508
  data: {
2294
2509
  fieldSizes: getAllFieldSizes(),
@@ -2324,7 +2539,7 @@ const addFiltersClause = (params, filtersClause) => {
2324
2539
  params.filters.$and.push(filtersClause);
2325
2540
  };
2326
2541
  const sanitizeMainField = (model, mainField, userAbility) => {
2327
- const permissionChecker2 = getService$1("permission-checker").create({
2542
+ const permissionChecker2 = getService$2("permission-checker").create({
2328
2543
  userAbility,
2329
2544
  model: model.uid
2330
2545
  });
@@ -2342,7 +2557,7 @@ const addStatusToRelations = async (targetUid, relations2) => {
2342
2557
  if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
2343
2558
  return relations2;
2344
2559
  }
2345
- const documentMetadata2 = getService$1("document-metadata");
2560
+ const documentMetadata2 = getService$2("document-metadata");
2346
2561
  if (!relations2.length) {
2347
2562
  return relations2;
2348
2563
  }
@@ -2420,7 +2635,7 @@ const relations = {
2420
2635
  ctx.request?.query?.locale
2421
2636
  );
2422
2637
  const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
2423
- const permissionChecker2 = getService$1("permission-checker").create({
2638
+ const permissionChecker2 = getService$2("permission-checker").create({
2424
2639
  userAbility,
2425
2640
  model
2426
2641
  });
@@ -2445,7 +2660,7 @@ const relations = {
2445
2660
  where.id = id;
2446
2661
  }
2447
2662
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2448
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2663
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2449
2664
  const currentEntity = await strapi.db.query(model).findOne({
2450
2665
  where,
2451
2666
  populate
@@ -2460,7 +2675,7 @@ const relations = {
2460
2675
  }
2461
2676
  entryId = currentEntity.id;
2462
2677
  }
2463
- const modelConfig = isComponent2 ? await getService$1("components").findConfiguration(sourceSchema) : await getService$1("content-types").findConfiguration(sourceSchema);
2678
+ const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
2464
2679
  const targetSchema = strapi.getModel(targetUid);
2465
2680
  const mainField = flow(
2466
2681
  prop(`metadatas.${targetField}.edit.mainField`),
@@ -2514,7 +2729,7 @@ const relations = {
2514
2729
  }
2515
2730
  } = await this.extractAndValidateRequestInfo(ctx, id);
2516
2731
  const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
2517
- const permissionChecker2 = getService$1("permission-checker").create({
2732
+ const permissionChecker2 = getService$2("permission-checker").create({
2518
2733
  userAbility: ctx.state.userAbility,
2519
2734
  model: targetUid
2520
2735
  });
@@ -2593,7 +2808,7 @@ const relations = {
2593
2808
  } = await this.extractAndValidateRequestInfo(ctx, id);
2594
2809
  const { uid: sourceUid } = sourceSchema;
2595
2810
  const { uid: targetUid } = targetSchema;
2596
- const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2811
+ const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2597
2812
  const dbQuery = strapi.db.query(sourceUid);
2598
2813
  const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2599
2814
  const filters = {};
@@ -2634,10 +2849,10 @@ const relations = {
2634
2849
  }
2635
2850
  };
2636
2851
  const buildPopulateFromQuery = async (query, model) => {
2637
- return getService$1("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
2852
+ return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
2638
2853
  };
2639
2854
  const findDocument = async (query, uid2, opts = {}) => {
2640
- const documentManager2 = getService$1("document-manager");
2855
+ const documentManager2 = getService$2("document-manager");
2641
2856
  const populate = await buildPopulateFromQuery(query, uid2);
2642
2857
  return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
2643
2858
  };
@@ -2645,8 +2860,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
2645
2860
  const { user, userAbility } = ctx.state;
2646
2861
  const { model } = ctx.params;
2647
2862
  const { body, query } = ctx.request;
2648
- const documentManager2 = getService$1("document-manager");
2649
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2863
+ const documentManager2 = getService$2("document-manager");
2864
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2650
2865
  if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
2651
2866
  throw new errors.ForbiddenError();
2652
2867
  }
@@ -2687,7 +2902,7 @@ const singleTypes = {
2687
2902
  const { userAbility } = ctx.state;
2688
2903
  const { model } = ctx.params;
2689
2904
  const { query = {} } = ctx.request;
2690
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2905
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2691
2906
  if (permissionChecker2.cannot.read()) {
2692
2907
  return ctx.forbidden();
2693
2908
  }
@@ -2721,7 +2936,7 @@ const singleTypes = {
2721
2936
  async createOrUpdate(ctx) {
2722
2937
  const { userAbility } = ctx.state;
2723
2938
  const { model } = ctx.params;
2724
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2939
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2725
2940
  const document = await createOrUpdateDocument(ctx);
2726
2941
  const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
2727
2942
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
@@ -2730,8 +2945,8 @@ const singleTypes = {
2730
2945
  const { userAbility } = ctx.state;
2731
2946
  const { model } = ctx.params;
2732
2947
  const { query = {} } = ctx.request;
2733
- const documentManager2 = getService$1("document-manager");
2734
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2948
+ const documentManager2 = getService$2("document-manager");
2949
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2735
2950
  if (permissionChecker2.cannot.delete()) {
2736
2951
  return ctx.forbidden();
2737
2952
  }
@@ -2759,8 +2974,8 @@ const singleTypes = {
2759
2974
  const { userAbility } = ctx.state;
2760
2975
  const { model } = ctx.params;
2761
2976
  const { query = {} } = ctx.request;
2762
- const documentManager2 = getService$1("document-manager");
2763
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2977
+ const documentManager2 = getService$2("document-manager");
2978
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2764
2979
  if (permissionChecker2.cannot.publish()) {
2765
2980
  return ctx.forbidden();
2766
2981
  }
@@ -2788,8 +3003,8 @@ const singleTypes = {
2788
3003
  body: { discardDraft, ...body },
2789
3004
  query = {}
2790
3005
  } = ctx.request;
2791
- const documentManager2 = getService$1("document-manager");
2792
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3006
+ const documentManager2 = getService$2("document-manager");
3007
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2793
3008
  if (permissionChecker2.cannot.unpublish()) {
2794
3009
  return ctx.forbidden();
2795
3010
  }
@@ -2823,8 +3038,8 @@ const singleTypes = {
2823
3038
  const { userAbility } = ctx.state;
2824
3039
  const { model } = ctx.params;
2825
3040
  const { body, query = {} } = ctx.request;
2826
- const documentManager2 = getService$1("document-manager");
2827
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3041
+ const documentManager2 = getService$2("document-manager");
3042
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2828
3043
  if (permissionChecker2.cannot.discard()) {
2829
3044
  return ctx.forbidden();
2830
3045
  }
@@ -2847,8 +3062,8 @@ const singleTypes = {
2847
3062
  const { userAbility } = ctx.state;
2848
3063
  const { model } = ctx.params;
2849
3064
  const { query } = ctx.request;
2850
- const documentManager2 = getService$1("document-manager");
2851
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3065
+ const documentManager2 = getService$2("document-manager");
3066
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2852
3067
  const { locale } = await getDocumentLocaleAndStatus(query, model);
2853
3068
  if (permissionChecker2.cannot.read()) {
2854
3069
  return ctx.forbidden();
@@ -2872,7 +3087,7 @@ const uid$1 = {
2872
3087
  const { query = {} } = ctx.request;
2873
3088
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2874
3089
  await validateUIDField(contentTypeUID, field);
2875
- const uidService = getService$1("uid");
3090
+ const uidService = getService$2("uid");
2876
3091
  ctx.body = {
2877
3092
  data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
2878
3093
  };
@@ -2884,7 +3099,7 @@ const uid$1 = {
2884
3099
  const { query = {} } = ctx.request;
2885
3100
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2886
3101
  await validateUIDField(contentTypeUID, field);
2887
- const uidService = getService$1("uid");
3102
+ const uidService = getService$2("uid");
2888
3103
  const isAvailable = await uidService.checkUIDAvailability({
2889
3104
  contentTypeUID,
2890
3105
  field,
@@ -2905,7 +3120,8 @@ const controllers = {
2905
3120
  relations,
2906
3121
  "single-types": singleTypes,
2907
3122
  uid: uid$1,
2908
- ...history.controllers ? history.controllers : {}
3123
+ ...history.controllers ? history.controllers : {},
3124
+ ...preview.controllers ? preview.controllers : {}
2909
3125
  };
2910
3126
  const keys = {
2911
3127
  CONFIGURATION: "configuration"
@@ -3056,12 +3272,12 @@ async function syncMetadatas(configuration, schema) {
3056
3272
  return _.assign(metasWithDefaults, updatedMetas);
3057
3273
  }
3058
3274
  const getTargetSchema = (targetModel) => {
3059
- return getService$1("content-types").findContentType(targetModel);
3275
+ return getService$2("content-types").findContentType(targetModel);
3060
3276
  };
3061
3277
  const DEFAULT_LIST_LENGTH = 4;
3062
3278
  const MAX_ROW_SIZE = 12;
3063
3279
  const isAllowedFieldSize = (type, size) => {
3064
- const { getFieldSize } = getService$1("field-sizes");
3280
+ const { getFieldSize } = getService$2("field-sizes");
3065
3281
  const fieldSize = getFieldSize(type);
3066
3282
  if (!fieldSize.isResizable && size !== fieldSize.default) {
3067
3283
  return false;
@@ -3069,7 +3285,7 @@ const isAllowedFieldSize = (type, size) => {
3069
3285
  return size <= MAX_ROW_SIZE;
3070
3286
  };
3071
3287
  const getDefaultFieldSize = (attribute) => {
3072
- const { hasFieldSize, getFieldSize } = getService$1("field-sizes");
3288
+ const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
3073
3289
  return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
3074
3290
  };
3075
3291
  async function createDefaultLayouts(schema) {
@@ -3104,7 +3320,7 @@ function syncLayouts(configuration, schema) {
3104
3320
  for (const el of row) {
3105
3321
  if (!hasEditableAttribute(schema, el.name))
3106
3322
  continue;
3107
- const { hasFieldSize } = getService$1("field-sizes");
3323
+ const { hasFieldSize } = getService$2("field-sizes");
3108
3324
  const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
3109
3325
  if (!isAllowedFieldSize(fieldType, el.size)) {
3110
3326
  elementsToReAppend.push(el.name);
@@ -3244,17 +3460,17 @@ const configurationService$1 = createConfigurationService({
3244
3460
  isComponent: true,
3245
3461
  prefix: STORE_KEY_PREFIX,
3246
3462
  getModels() {
3247
- const { toContentManagerModel } = getService$1("data-mapper");
3463
+ const { toContentManagerModel } = getService$2("data-mapper");
3248
3464
  return mapValues(toContentManagerModel, strapi.components);
3249
3465
  }
3250
3466
  });
3251
3467
  const components = ({ strapi: strapi2 }) => ({
3252
3468
  findAllComponents() {
3253
- const { toContentManagerModel } = getService$1("data-mapper");
3469
+ const { toContentManagerModel } = getService$2("data-mapper");
3254
3470
  return Object.values(strapi2.components).map(toContentManagerModel);
3255
3471
  },
3256
3472
  findComponent(uid2) {
3257
- const { toContentManagerModel } = getService$1("data-mapper");
3473
+ const { toContentManagerModel } = getService$2("data-mapper");
3258
3474
  const component = strapi2.components[uid2];
3259
3475
  return isNil$1(component) ? component : toContentManagerModel(component);
3260
3476
  },
@@ -3305,17 +3521,17 @@ const configurationService = createConfigurationService({
3305
3521
  storeUtils,
3306
3522
  prefix: "content_types",
3307
3523
  getModels() {
3308
- const { toContentManagerModel } = getService$1("data-mapper");
3524
+ const { toContentManagerModel } = getService$2("data-mapper");
3309
3525
  return mapValues(toContentManagerModel, strapi.contentTypes);
3310
3526
  }
3311
3527
  });
3312
3528
  const service = ({ strapi: strapi2 }) => ({
3313
3529
  findAllContentTypes() {
3314
- const { toContentManagerModel } = getService$1("data-mapper");
3530
+ const { toContentManagerModel } = getService$2("data-mapper");
3315
3531
  return Object.values(strapi2.contentTypes).map(toContentManagerModel);
3316
3532
  },
3317
3533
  findContentType(uid2) {
3318
- const { toContentManagerModel } = getService$1("data-mapper");
3534
+ const { toContentManagerModel } = getService$2("data-mapper");
3319
3535
  const contentType = strapi2.contentTypes[uid2];
3320
3536
  return isNil$1(contentType) ? contentType : toContentManagerModel(contentType);
3321
3537
  },
@@ -3344,7 +3560,7 @@ const service = ({ strapi: strapi2 }) => ({
3344
3560
  return this.findConfiguration(contentType);
3345
3561
  },
3346
3562
  findComponentsConfigurations(contentType) {
3347
- return getService$1("components").findComponentsConfigurations(contentType);
3563
+ return getService$2("components").findComponentsConfigurations(contentType);
3348
3564
  },
3349
3565
  syncConfigurations() {
3350
3566
  return configurationService.syncConfigurations();
@@ -3616,7 +3832,7 @@ const permission = ({ strapi: strapi2 }) => ({
3616
3832
  return userAbility.can(action);
3617
3833
  },
3618
3834
  async registerPermissions() {
3619
- const displayedContentTypes = getService$1("content-types").findDisplayedContentTypes();
3835
+ const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
3620
3836
  const contentTypesUids = displayedContentTypes.map(prop("uid"));
3621
3837
  const actions = [
3622
3838
  {
@@ -3892,7 +4108,7 @@ const getQueryPopulate = async (uid2, query) => {
3892
4108
  return populateQuery;
3893
4109
  };
3894
4110
  const buildDeepPopulate = (uid2) => {
3895
- return getService$1("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
4111
+ return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
3896
4112
  };
3897
4113
  const populateBuilder = (uid2) => {
3898
4114
  let getInitialPopulate = async () => {
@@ -4435,7 +4651,8 @@ const services = {
4435
4651
  permission,
4436
4652
  "populate-builder": populateBuilder$1,
4437
4653
  uid,
4438
- ...history.services ? history.services : {}
4654
+ ...history.services ? history.services : {},
4655
+ ...preview.services ? preview.services : {}
4439
4656
  };
4440
4657
  const index = () => {
4441
4658
  return {