@strapi/content-manager 0.0.0-experimental.7b750d18de359d0a42233cb8707e3c31c5983345 → 0.0.0-experimental.7bd770909ce799cf6fc76b7ebccd6d3ce2e377b5

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 (185) hide show
  1. package/dist/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
  2. package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-hLMNf7KI.mjs → ComponentConfigurationPage-BgCLcjXO.mjs} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-hLMNf7KI.mjs.map → ComponentConfigurationPage-BgCLcjXO.mjs.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-DnnZJc1F.js → ComponentConfigurationPage-DywpTZeV.js} +5 -6
  6. package/dist/_chunks/{ComponentConfigurationPage-DnnZJc1F.js.map → ComponentConfigurationPage-DywpTZeV.js.map} +1 -1
  7. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
  8. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
  9. package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
  10. package/dist/_chunks/{EditConfigurationPage-Dh6sq-G4.mjs → EditConfigurationPage-BNjOAHNS.mjs} +4 -4
  11. package/dist/_chunks/{EditConfigurationPage-Dh6sq-G4.mjs.map → EditConfigurationPage-BNjOAHNS.mjs.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-CpLj5gYZ.js → EditConfigurationPage-CxRlP5if.js} +5 -6
  13. package/dist/_chunks/{EditConfigurationPage-CpLj5gYZ.js.map → EditConfigurationPage-CxRlP5if.js.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-D2QVRr_2.js → EditViewPage-BRewdTqE.js} +50 -11
  15. package/dist/_chunks/EditViewPage-BRewdTqE.js.map +1 -0
  16. package/dist/_chunks/{EditViewPage-BU1ugeVi.mjs → EditViewPage-CD_hqc1J.mjs} +50 -10
  17. package/dist/_chunks/EditViewPage-CD_hqc1J.mjs.map +1 -0
  18. package/dist/_chunks/{Field-VSPY6uzs.mjs → Field-BPkQ-3Ku.mjs} +129 -85
  19. package/dist/_chunks/Field-BPkQ-3Ku.mjs.map +1 -0
  20. package/dist/_chunks/{Field-BEDX9i_V.js → Field-DwvmENVf.js} +130 -87
  21. package/dist/_chunks/Field-DwvmENVf.js.map +1 -0
  22. package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
  23. package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
  24. package/dist/_chunks/{Form-DCaY8xBX.js → Form-C_Gwv8P_.js} +6 -7
  25. package/dist/_chunks/Form-C_Gwv8P_.js.map +1 -0
  26. package/dist/_chunks/{Form-05Oaes1N.mjs → Form-Czi0cf_2.mjs} +4 -4
  27. package/dist/_chunks/Form-Czi0cf_2.mjs.map +1 -0
  28. package/dist/_chunks/{History-BrJ1tUvt.js → History-C1TKAig-.js} +42 -100
  29. package/dist/_chunks/History-C1TKAig-.js.map +1 -0
  30. package/dist/_chunks/{History-BqO2G3MV.mjs → History-CIQHyi4T.mjs} +43 -100
  31. package/dist/_chunks/History-CIQHyi4T.mjs.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-Eane5LKE.js → ListConfigurationPage-D-NGRLYu.js} +7 -7
  33. package/dist/_chunks/ListConfigurationPage-D-NGRLYu.js.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-C6rsFlme.mjs → ListConfigurationPage-DcZsfyEL.mjs} +7 -6
  35. package/dist/_chunks/ListConfigurationPage-DcZsfyEL.mjs.map +1 -0
  36. package/dist/_chunks/{ListViewPage-yE_zYhcI.mjs → ListViewPage-C10McTK1.mjs} +62 -39
  37. package/dist/_chunks/ListViewPage-C10McTK1.mjs.map +1 -0
  38. package/dist/_chunks/{ListViewPage-Coj-RPsx.js → ListViewPage-xv5IQoZp.js} +63 -41
  39. package/dist/_chunks/ListViewPage-xv5IQoZp.js.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-NW_FSVdY.mjs → NoContentTypePage-CPc0Cd3S.mjs} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-NW_FSVdY.mjs.map → NoContentTypePage-CPc0Cd3S.mjs.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-BDJ0dshy.js → NoContentTypePage-Dzw5Yj5u.js} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-BDJ0dshy.js.map → NoContentTypePage-Dzw5Yj5u.js.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-BOtb5FTM.js → NoPermissionsPage-DAe5CDCC.js} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-BOtb5FTM.js.map → NoPermissionsPage-DAe5CDCC.js.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-h0I3ImsX.mjs → NoPermissionsPage-wfPBh2_0.mjs} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-h0I3ImsX.mjs.map → NoPermissionsPage-wfPBh2_0.mjs.map} +1 -1
  48. package/dist/_chunks/Preview-B7LyGT_b.js +290 -0
  49. package/dist/_chunks/Preview-B7LyGT_b.js.map +1 -0
  50. package/dist/_chunks/Preview-BVFFm7uB.mjs +272 -0
  51. package/dist/_chunks/Preview-BVFFm7uB.mjs.map +1 -0
  52. package/dist/_chunks/{Relations-CVh0DOKv.js → Relations-BmYR1AjY.js} +75 -42
  53. package/dist/_chunks/Relations-BmYR1AjY.js.map +1 -0
  54. package/dist/_chunks/{Relations-FP0uWpBz.mjs → Relations-JPhWxk-s.mjs} +75 -41
  55. package/dist/_chunks/Relations-JPhWxk-s.mjs.map +1 -0
  56. package/dist/_chunks/{en-BlhnxQfj.js → en-BK8Xyl5I.js} +22 -10
  57. package/dist/_chunks/{en-BlhnxQfj.js.map → en-BK8Xyl5I.js.map} +1 -1
  58. package/dist/_chunks/{en-C8YBvRrK.mjs → en-Dtk_ot79.mjs} +22 -10
  59. package/dist/_chunks/{en-C8YBvRrK.mjs.map → en-Dtk_ot79.mjs.map} +1 -1
  60. package/dist/_chunks/{es-EUonQTon.js → es-9K52xZIr.js} +2 -2
  61. package/dist/_chunks/{ja-CcFe8diO.js.map → es-9K52xZIr.js.map} +1 -1
  62. package/dist/_chunks/{es-CeXiYflN.mjs → es-D34tqjMw.mjs} +2 -2
  63. package/dist/_chunks/{es-CeXiYflN.mjs.map → es-D34tqjMw.mjs.map} +1 -1
  64. package/dist/_chunks/{fr-CD9VFbPM.mjs → fr--pg5jUbt.mjs} +13 -3
  65. package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr--pg5jUbt.mjs.map} +1 -1
  66. package/dist/_chunks/{fr-B7kGGg3E.js → fr-B2Kyv8Z9.js} +13 -3
  67. package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-B2Kyv8Z9.js.map} +1 -1
  68. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  69. package/dist/_chunks/{index-DTKVhcla.js → index-C2Q_PLWj.js} +299 -171
  70. package/dist/_chunks/index-C2Q_PLWj.js.map +1 -0
  71. package/dist/_chunks/{index-CPCHQ3X_.mjs → index-DLIkNVnQ.mjs} +302 -174
  72. package/dist/_chunks/index-DLIkNVnQ.mjs.map +1 -0
  73. package/dist/_chunks/{ja-CcFe8diO.js → ja-7sfIbjxE.js} +2 -2
  74. package/dist/_chunks/{es-EUonQTon.js.map → ja-7sfIbjxE.js.map} +1 -1
  75. package/dist/_chunks/{ja-CtsUxOvk.mjs → ja-BHqhDq4V.mjs} +2 -2
  76. package/dist/_chunks/{ja-CtsUxOvk.mjs.map → ja-BHqhDq4V.mjs.map} +1 -1
  77. package/dist/_chunks/{layout-CWgZzMYf.js → layout-7AsWJzZJ.js} +5 -6
  78. package/dist/_chunks/{layout-CWgZzMYf.js.map → layout-7AsWJzZJ.js.map} +1 -1
  79. package/dist/_chunks/{layout-B4UhJ8MJ.mjs → layout-qE8qkNH_.mjs} +4 -4
  80. package/dist/_chunks/{layout-B4UhJ8MJ.mjs.map → layout-qE8qkNH_.mjs.map} +1 -1
  81. package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
  82. package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
  83. package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
  84. package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
  85. package/dist/_chunks/{relations-B83Ge9a7.mjs → relations-BjHH_1Am.mjs} +6 -7
  86. package/dist/_chunks/relations-BjHH_1Am.mjs.map +1 -0
  87. package/dist/_chunks/{relations-D81a_2zw.js → relations-EifVzf_2.js} +6 -7
  88. package/dist/_chunks/relations-EifVzf_2.js.map +1 -0
  89. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -1
  90. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -1
  91. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
  92. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
  93. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
  94. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
  95. package/dist/admin/index.js +1 -1
  96. package/dist/admin/index.mjs +4 -4
  97. package/dist/admin/src/hooks/useDocument.d.ts +2 -0
  98. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  99. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +2 -2
  100. package/dist/admin/src/pages/EditView/components/Header.d.ts +1 -0
  101. package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
  102. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  103. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  104. package/dist/admin/src/preview/constants.d.ts +1 -0
  105. package/dist/admin/src/preview/index.d.ts +4 -0
  106. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  107. package/dist/admin/src/preview/routes.d.ts +3 -0
  108. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  109. package/dist/admin/src/router.d.ts +1 -1
  110. package/dist/admin/src/services/documents.d.ts +0 -3
  111. package/dist/server/index.js +435 -193
  112. package/dist/server/index.js.map +1 -1
  113. package/dist/server/index.mjs +435 -192
  114. package/dist/server/index.mjs.map +1 -1
  115. package/dist/server/src/bootstrap.d.ts.map +1 -1
  116. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  117. package/dist/server/src/controllers/index.d.ts.map +1 -1
  118. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  119. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  120. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  121. package/dist/server/src/history/services/history.d.ts.map +1 -1
  122. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  123. package/dist/server/src/history/services/utils.d.ts +2 -3
  124. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  125. package/dist/server/src/index.d.ts +4 -4
  126. package/dist/server/src/preview/constants.d.ts +2 -0
  127. package/dist/server/src/preview/constants.d.ts.map +1 -0
  128. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  129. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  130. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  131. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  132. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  133. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  134. package/dist/server/src/preview/index.d.ts +4 -0
  135. package/dist/server/src/preview/index.d.ts.map +1 -0
  136. package/dist/server/src/preview/routes/index.d.ts +8 -0
  137. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  138. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  139. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  140. package/dist/server/src/preview/services/index.d.ts +16 -0
  141. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  142. package/dist/server/src/preview/services/preview-config.d.ts +32 -0
  143. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  144. package/dist/server/src/preview/services/preview.d.ts +12 -0
  145. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  146. package/dist/server/src/preview/utils.d.ts +19 -0
  147. package/dist/server/src/preview/utils.d.ts.map +1 -0
  148. package/dist/server/src/register.d.ts.map +1 -1
  149. package/dist/server/src/routes/index.d.ts.map +1 -1
  150. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  151. package/dist/server/src/services/document-metadata.d.ts +8 -8
  152. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  153. package/dist/server/src/services/index.d.ts +4 -4
  154. package/dist/server/src/services/index.d.ts.map +1 -1
  155. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  156. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  157. package/dist/server/src/utils/index.d.ts +2 -0
  158. package/dist/server/src/utils/index.d.ts.map +1 -1
  159. package/dist/shared/contracts/index.d.ts +1 -0
  160. package/dist/shared/contracts/index.d.ts.map +1 -1
  161. package/dist/shared/contracts/preview.d.ts +27 -0
  162. package/dist/shared/contracts/preview.d.ts.map +1 -0
  163. package/dist/shared/index.js +4 -0
  164. package/dist/shared/index.js.map +1 -1
  165. package/dist/shared/index.mjs +4 -0
  166. package/dist/shared/index.mjs.map +1 -1
  167. package/package.json +12 -12
  168. package/dist/_chunks/EditViewPage-BU1ugeVi.mjs.map +0 -1
  169. package/dist/_chunks/EditViewPage-D2QVRr_2.js.map +0 -1
  170. package/dist/_chunks/Field-BEDX9i_V.js.map +0 -1
  171. package/dist/_chunks/Field-VSPY6uzs.mjs.map +0 -1
  172. package/dist/_chunks/Form-05Oaes1N.mjs.map +0 -1
  173. package/dist/_chunks/Form-DCaY8xBX.js.map +0 -1
  174. package/dist/_chunks/History-BqO2G3MV.mjs.map +0 -1
  175. package/dist/_chunks/History-BrJ1tUvt.js.map +0 -1
  176. package/dist/_chunks/ListConfigurationPage-C6rsFlme.mjs.map +0 -1
  177. package/dist/_chunks/ListConfigurationPage-Eane5LKE.js.map +0 -1
  178. package/dist/_chunks/ListViewPage-Coj-RPsx.js.map +0 -1
  179. package/dist/_chunks/ListViewPage-yE_zYhcI.mjs.map +0 -1
  180. package/dist/_chunks/Relations-CVh0DOKv.js.map +0 -1
  181. package/dist/_chunks/Relations-FP0uWpBz.mjs.map +0 -1
  182. package/dist/_chunks/index-CPCHQ3X_.mjs.map +0 -1
  183. package/dist/_chunks/index-DTKVhcla.js.map +0 -1
  184. package/dist/_chunks/relations-B83Ge9a7.mjs.map +0 -1
  185. package/dist/_chunks/relations-D81a_2zw.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
@@ -141,8 +141,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
141
141
  };
142
142
  const getRelationRestoreValue = async (versionRelationData, attribute) => {
143
143
  if (Array.isArray(versionRelationData)) {
144
- if (versionRelationData.length === 0)
145
- return versionRelationData;
144
+ if (versionRelationData.length === 0) return versionRelationData;
146
145
  const existingAndMissingRelations = await Promise.all(
147
146
  versionRelationData.map((relation) => {
148
147
  return strapi2.documents(attribute.target).findOne({
@@ -177,8 +176,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
177
176
  const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
178
177
  const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
179
178
  const getLocaleDictionary = async () => {
180
- if (!localesService)
181
- return {};
179
+ if (!localesService) return {};
182
180
  const locales = await localesService.find() || [];
183
181
  return locales.reduce(
184
182
  (acc, locale) => {
@@ -202,6 +200,17 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
202
200
  const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
203
201
  return documentMetadataService.getStatus(document, meta.availableStatus);
204
202
  };
203
+ const getComponentFields = (componentUID) => {
204
+ return Object.entries(strapi2.getModel(componentUID).attributes).reduce(
205
+ (fieldsAcc, [key, attribute]) => {
206
+ if (!["relation", "media", "component", "dynamiczone"].includes(attribute.type)) {
207
+ fieldsAcc.push(key);
208
+ }
209
+ return fieldsAcc;
210
+ },
211
+ []
212
+ );
213
+ };
205
214
  const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
206
215
  const model = strapi2.getModel(uid2);
207
216
  const attributes = Object.entries(model.attributes);
@@ -225,13 +234,19 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
225
234
  }
226
235
  case "component": {
227
236
  const populate = getDeepPopulate2(attribute.component);
228
- acc[attributeName] = { populate };
237
+ acc[attributeName] = {
238
+ populate,
239
+ [fieldSelector]: getComponentFields(attribute.component)
240
+ };
229
241
  break;
230
242
  }
231
243
  case "dynamiczone": {
232
244
  const populatedComponents = (attribute.components || []).reduce(
233
245
  (acc2, componentUID) => {
234
- acc2[componentUID] = { populate: getDeepPopulate2(componentUID) };
246
+ acc2[componentUID] = {
247
+ populate: getDeepPopulate2(componentUID),
248
+ [fieldSelector]: getComponentFields(componentUID)
249
+ };
235
250
  return acc2;
236
251
  },
237
252
  {}
@@ -344,7 +359,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
344
359
  const attributeValue = entry.data[attributeKey];
345
360
  const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
346
361
  if (attributeSchema.type === "media") {
347
- const permissionChecker2 = getService$1("permission-checker").create({
362
+ const permissionChecker2 = getService$2("permission-checker").create({
348
363
  userAbility: params.state.userAbility,
349
364
  model: "plugin::upload.file"
350
365
  });
@@ -367,7 +382,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
367
382
  if (userToPopulate == null) {
368
383
  return null;
369
384
  }
370
- return strapi2.query("admin::user").findOne({ where: { id: userToPopulate.id } });
385
+ return strapi2.query("admin::user").findOne({
386
+ where: {
387
+ ...userToPopulate.id ? { id: userToPopulate.id } : {},
388
+ ...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
389
+ }
390
+ });
371
391
  })
372
392
  );
373
393
  return {
@@ -380,7 +400,7 @@ const createHistoryService = ({ strapi: strapi2 }) => {
380
400
  [attributeKey]: adminUsers
381
401
  };
382
402
  }
383
- const permissionChecker2 = getService$1("permission-checker").create({
403
+ const permissionChecker2 = getService$2("permission-checker").create({
384
404
  userAbility: params.state.userAbility,
385
405
  model: attributeSchema.target
386
406
  });
@@ -556,7 +576,7 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
556
576
  onCommit(async () => {
557
577
  for (const entry of localeEntries) {
558
578
  const status = await serviceUtils.getVersionStatus(uid2, entry);
559
- await getService(strapi2, "history").createVersion({
579
+ await getService$1(strapi2, "history").createVersion({
560
580
  contentType: uid2,
561
581
  data: omit(FIELDS_TO_IGNORE, entry),
562
582
  relatedDocumentId: documentId,
@@ -569,15 +589,19 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
569
589
  });
570
590
  return result;
571
591
  });
572
- state.deleteExpiredJob = scheduleJob("0 0 * * *", () => {
592
+ state.deleteExpiredJob = scheduleJob("historyDaily", "0 0 * * *", () => {
573
593
  const retentionDaysInMilliseconds = serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1e3;
574
594
  const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);
575
595
  strapi2.db.query(HISTORY_VERSION_UID).deleteMany({
576
596
  where: {
577
597
  created_at: {
578
- $lt: expirationDate.toISOString()
598
+ $lt: expirationDate
579
599
  }
580
600
  }
601
+ }).catch((error) => {
602
+ if (error instanceof Error) {
603
+ strapi2.log.error("Error deleting expired history versions", error.message);
604
+ }
581
605
  });
582
606
  });
583
607
  state.isInitialized = true;
@@ -589,17 +613,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
589
613
  }
590
614
  };
591
615
  };
592
- const services$1 = {
616
+ const services$2 = {
593
617
  history: createHistoryService,
594
618
  lifecycles: createLifecyclesService
595
619
  };
596
- const info = { pluginName: "content-manager", type: "admin" };
620
+ const info$1 = { pluginName: "content-manager", type: "admin" };
597
621
  const historyVersionRouter = {
598
622
  type: "admin",
599
623
  routes: [
600
624
  {
601
625
  method: "GET",
602
- info,
626
+ info: info$1,
603
627
  path: "/history-versions",
604
628
  handler: "history-version.findMany",
605
629
  config: {
@@ -608,7 +632,7 @@ const historyVersionRouter = {
608
632
  },
609
633
  {
610
634
  method: "PUT",
611
- info,
635
+ info: info$1,
612
636
  path: "/history-versions/:versionId/restore",
613
637
  handler: "history-version.restoreVersion",
614
638
  config: {
@@ -617,7 +641,7 @@ const historyVersionRouter = {
617
641
  }
618
642
  ]
619
643
  };
620
- const routes$1 = {
644
+ const routes$2 = {
621
645
  "history-version": historyVersionRouter
622
646
  };
623
647
  const historyVersion = {
@@ -664,21 +688,21 @@ const historyVersion = {
664
688
  }
665
689
  }
666
690
  };
667
- const getFeature = () => {
691
+ const getFeature$1 = () => {
668
692
  if (strapi.ee.features.isEnabled("cms-content-history")) {
669
693
  return {
670
694
  register({ strapi: strapi2 }) {
671
695
  strapi2.get("models").add(historyVersion);
672
696
  },
673
697
  bootstrap({ strapi: strapi2 }) {
674
- getService(strapi2, "lifecycles").bootstrap();
698
+ getService$1(strapi2, "lifecycles").bootstrap();
675
699
  },
676
700
  destroy({ strapi: strapi2 }) {
677
- getService(strapi2, "lifecycles").destroy();
701
+ getService$1(strapi2, "lifecycles").destroy();
678
702
  },
679
- controllers: controllers$1,
680
- services: services$1,
681
- routes: routes$1
703
+ controllers: controllers$2,
704
+ services: services$2,
705
+ routes: routes$2
682
706
  };
683
707
  }
684
708
  return {
@@ -687,9 +711,205 @@ const getFeature = () => {
687
711
  }
688
712
  };
689
713
  };
690
- const history = getFeature();
714
+ const history = getFeature$1();
715
+ const FEATURE_ID = "preview";
716
+ const info = { pluginName: "content-manager", type: "admin" };
717
+ const previewRouter = {
718
+ type: "admin",
719
+ routes: [
720
+ {
721
+ method: "GET",
722
+ info,
723
+ path: "/preview/url/:contentType",
724
+ handler: "preview.getPreviewUrl",
725
+ config: {
726
+ policies: ["admin::isAuthenticatedAdmin"]
727
+ }
728
+ }
729
+ ]
730
+ };
731
+ const routes$1 = {
732
+ preview: previewRouter
733
+ };
734
+ function getService(strapi2, name) {
735
+ return strapi2.service(`plugin::content-manager.${name}`);
736
+ }
737
+ const getPreviewUrlSchema = yup.object().shape({
738
+ // Will be undefined for single types
739
+ documentId: yup.string(),
740
+ locale: yup.string().nullable(),
741
+ status: yup.string()
742
+ }).required();
743
+ const validatePreviewUrl = async (strapi2, uid2, params) => {
744
+ await validateYupSchema(getPreviewUrlSchema)(params);
745
+ const newParams = pick(["documentId", "locale", "status"], params);
746
+ const model = strapi2.getModel(uid2);
747
+ if (!model || model.modelType !== "contentType") {
748
+ throw new errors.ValidationError("Invalid content type");
749
+ }
750
+ const isSingleType = model?.kind === "singleType";
751
+ if (!isSingleType && !params.documentId) {
752
+ throw new errors.ValidationError("documentId is required for Collection Types");
753
+ }
754
+ if (isSingleType) {
755
+ const doc = await strapi2.documents(uid2).findFirst();
756
+ if (!doc) {
757
+ throw new errors.NotFoundError("Document not found");
758
+ }
759
+ newParams.documentId = doc?.documentId;
760
+ }
761
+ if (!newParams.status) {
762
+ const isDPEnabled = model?.options?.draftAndPublish;
763
+ newParams.status = isDPEnabled ? "draft" : "published";
764
+ }
765
+ return newParams;
766
+ };
767
+ const createPreviewController = () => {
768
+ return {
769
+ /**
770
+ * Transforms an entry into a preview URL, so that it can be previewed
771
+ * in the Content Manager.
772
+ */
773
+ async getPreviewUrl(ctx) {
774
+ const uid2 = ctx.params.contentType;
775
+ const query = ctx.request.query;
776
+ const params = await validatePreviewUrl(strapi, uid2, query);
777
+ const previewService = getService(strapi, "preview");
778
+ const url = await previewService.getPreviewUrl(uid2, params);
779
+ if (!url) {
780
+ ctx.status = 204;
781
+ }
782
+ return {
783
+ data: { url }
784
+ };
785
+ }
786
+ };
787
+ };
788
+ const controllers$1 = {
789
+ preview: createPreviewController
790
+ /**
791
+ * Casting is needed because the types aren't aware that Strapi supports
792
+ * passing a controller factory as the value, instead of a controller object directly
793
+ */
794
+ };
795
+ const createPreviewService = ({ strapi: strapi2 }) => {
796
+ const config = getService(strapi2, "preview-config");
797
+ return {
798
+ async getPreviewUrl(uid2, params) {
799
+ const handler = config.getPreviewHandler();
800
+ try {
801
+ return handler(uid2, params);
802
+ } catch (error) {
803
+ strapi2.log.error(`Failed to get preview URL: ${error}`);
804
+ throw new errors.ApplicationError("Failed to get preview URL");
805
+ }
806
+ return;
807
+ }
808
+ };
809
+ };
810
+ const extendMiddlewareConfiguration = (middleware = { name: "", config: {} }) => {
811
+ const middlewares = strapi.config.get("middlewares");
812
+ const configuredMiddlewares = middlewares.map((currentMiddleware) => {
813
+ if (currentMiddleware === middleware.name) {
814
+ return middleware;
815
+ }
816
+ if (currentMiddleware.name === middleware.name) {
817
+ return mergeWith(
818
+ (objValue, srcValue) => {
819
+ if (Array.isArray(objValue)) {
820
+ return objValue.concat(srcValue);
821
+ }
822
+ return void 0;
823
+ },
824
+ currentMiddleware,
825
+ middleware
826
+ );
827
+ }
828
+ return currentMiddleware;
829
+ });
830
+ strapi.config.set("middlewares", configuredMiddlewares);
831
+ };
832
+ const createPreviewConfigService = ({ strapi: strapi2 }) => {
833
+ return {
834
+ register() {
835
+ if (!this.isEnabled()) {
836
+ return;
837
+ }
838
+ const config = strapi2.config.get("admin.preview");
839
+ if (config.config?.allowedOrigins) {
840
+ extendMiddlewareConfiguration({
841
+ name: "strapi::security",
842
+ config: {
843
+ contentSecurityPolicy: {
844
+ directives: {
845
+ "frame-src": config.config.allowedOrigins
846
+ }
847
+ }
848
+ }
849
+ });
850
+ }
851
+ },
852
+ isEnabled() {
853
+ const config = strapi2.config.get("admin.preview");
854
+ if (!config) {
855
+ return false;
856
+ }
857
+ return config?.enabled ?? true;
858
+ },
859
+ /**
860
+ * Validate if the configuration is valid
861
+ */
862
+ validate() {
863
+ if (!this.isEnabled()) {
864
+ return;
865
+ }
866
+ const handler = this.getPreviewHandler();
867
+ if (typeof handler !== "function") {
868
+ throw new errors.ValidationError(
869
+ "Preview configuration is invalid. Handler must be a function"
870
+ );
871
+ }
872
+ },
873
+ /**
874
+ * Utility to get the preview handler from the configuration
875
+ */
876
+ getPreviewHandler() {
877
+ const config = strapi2.config.get("admin.preview");
878
+ const emptyHandler = () => {
879
+ return void 0;
880
+ };
881
+ if (!this.isEnabled()) {
882
+ return emptyHandler;
883
+ }
884
+ return config?.config?.handler || emptyHandler;
885
+ }
886
+ };
887
+ };
888
+ const services$1 = {
889
+ preview: createPreviewService,
890
+ "preview-config": createPreviewConfigService
891
+ };
892
+ const getFeature = () => {
893
+ if (!strapi.features.future.isEnabled(FEATURE_ID)) {
894
+ return {};
895
+ }
896
+ return {
897
+ register() {
898
+ const config = getService(strapi, "preview-config");
899
+ config.validate();
900
+ config.register();
901
+ },
902
+ bootstrap() {
903
+ },
904
+ routes: routes$1,
905
+ controllers: controllers$1,
906
+ services: services$1
907
+ };
908
+ };
909
+ const preview = getFeature();
691
910
  const register = async ({ strapi: strapi2 }) => {
692
911
  await history.register?.({ strapi: strapi2 });
912
+ await preview.register?.({ strapi: strapi2 });
693
913
  };
694
914
  const ALLOWED_WEBHOOK_EVENTS = {
695
915
  ENTRY_PUBLISH: "entry.publish",
@@ -699,11 +919,12 @@ const bootstrap = async () => {
699
919
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
700
920
  strapi.get("webhookStore").addAllowedEvent(key, value);
701
921
  });
702
- getService$1("field-sizes").setCustomFieldInputSizes();
703
- await getService$1("components").syncConfigurations();
704
- await getService$1("content-types").syncConfigurations();
705
- await getService$1("permission").registerPermissions();
922
+ getService$2("field-sizes").setCustomFieldInputSizes();
923
+ await getService$2("components").syncConfigurations();
924
+ await getService$2("content-types").syncConfigurations();
925
+ await getService$2("permission").registerPermissions();
706
926
  await history.bootstrap?.({ strapi });
927
+ await preview.bootstrap?.({ strapi });
707
928
  };
708
929
  const destroy = async ({ strapi: strapi2 }) => {
709
930
  await history.destroy?.({ strapi: strapi2 });
@@ -1193,7 +1414,8 @@ const admin = {
1193
1414
  };
1194
1415
  const routes = {
1195
1416
  admin,
1196
- ...history.routes ? history.routes : {}
1417
+ ...history.routes ? history.routes : {},
1418
+ ...preview.routes ? preview.routes : {}
1197
1419
  };
1198
1420
  const hasPermissionsSchema = yup$1.object({
1199
1421
  actions: yup$1.array().of(yup$1.string()),
@@ -1256,8 +1478,7 @@ const isSortable = (schema, name) => {
1256
1478
  if (!_.has(schema.attributes, name)) {
1257
1479
  return false;
1258
1480
  }
1259
- if (schema.modelType === "component" && name === "id")
1260
- return false;
1481
+ if (schema.modelType === "component" && name === "id") return false;
1261
1482
  const attribute = schema.attributes[name];
1262
1483
  if (NON_SORTABLES.includes(attribute.type)) {
1263
1484
  return false;
@@ -1402,8 +1623,7 @@ const createDefaultSettings = async (schema) => {
1402
1623
  };
1403
1624
  };
1404
1625
  const syncSettings = async (configuration, schema) => {
1405
- if (isEmpty(configuration.settings))
1406
- return createDefaultSettings(schema);
1626
+ if (isEmpty(configuration.settings)) return createDefaultSettings(schema);
1407
1627
  const defaultField = getDefaultMainField(schema);
1408
1628
  const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
1409
1629
  return {
@@ -1450,7 +1670,7 @@ const createMetadasSchema = (schema) => {
1450
1670
  if (!value) {
1451
1671
  return yup$1.string();
1452
1672
  }
1453
- const targetSchema = getService$1("content-types").findContentType(
1673
+ const targetSchema = getService$2("content-types").findContentType(
1454
1674
  schema.attributes[key].targetModel
1455
1675
  );
1456
1676
  if (!targetSchema) {
@@ -1579,8 +1799,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
1579
1799
  }
1580
1800
  switch (attribute.type) {
1581
1801
  case "relation": {
1582
- if (canCreate(attributePath))
1583
- return body2;
1802
+ if (canCreate(attributePath)) return body2;
1584
1803
  return set(attributePath, { set: [] }, body2);
1585
1804
  }
1586
1805
  case "component": {
@@ -1590,8 +1809,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
1590
1809
  ]);
1591
1810
  }
1592
1811
  default: {
1593
- if (canCreate(attributePath))
1594
- return body2;
1812
+ if (canCreate(attributePath)) return body2;
1595
1813
  return set(attributePath, null, body2);
1596
1814
  }
1597
1815
  }
@@ -1619,7 +1837,7 @@ const getDocumentLocaleAndStatus = async (request, model, opts = { allowMultiple
1619
1837
  }
1620
1838
  };
1621
1839
  const formatDocumentWithMetadata = async (permissionChecker2, uid2, document, opts = {}) => {
1622
- const documentMetadata2 = getService$1("document-metadata");
1840
+ const documentMetadata2 = getService$2("document-metadata");
1623
1841
  const serviceOutput = await documentMetadata2.formatDocumentWithMetadata(uid2, document, opts);
1624
1842
  let {
1625
1843
  meta: { availableLocales, availableStatus }
@@ -1645,8 +1863,8 @@ const createDocument = async (ctx, opts) => {
1645
1863
  const { userAbility, user } = ctx.state;
1646
1864
  const { model } = ctx.params;
1647
1865
  const { body } = ctx.request;
1648
- const documentManager2 = getService$1("document-manager");
1649
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1866
+ const documentManager2 = getService$2("document-manager");
1867
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1650
1868
  if (permissionChecker2.cannot.create()) {
1651
1869
  throw new errors.ForbiddenError();
1652
1870
  }
@@ -1666,13 +1884,13 @@ const updateDocument = async (ctx, opts) => {
1666
1884
  const { userAbility, user } = ctx.state;
1667
1885
  const { id, model } = ctx.params;
1668
1886
  const { body } = ctx.request;
1669
- const documentManager2 = getService$1("document-manager");
1670
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1887
+ const documentManager2 = getService$2("document-manager");
1888
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1671
1889
  if (permissionChecker2.cannot.update()) {
1672
1890
  throw new errors.ForbiddenError();
1673
1891
  }
1674
1892
  const permissionQuery = await permissionChecker2.sanitizedQuery.update(ctx.query);
1675
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
1893
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1676
1894
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1677
1895
  const [documentVersion, documentExists] = await Promise.all([
1678
1896
  documentManager2.findOne(id, model, { populate, locale, status: "draft" }),
@@ -1689,7 +1907,7 @@ const updateDocument = async (ctx, opts) => {
1689
1907
  throw new errors.ForbiddenError();
1690
1908
  }
1691
1909
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1692
- const setCreator = setCreatorFields({ user, isEdition: true });
1910
+ const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
1693
1911
  const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
1694
1912
  const sanitizedBody = await sanitizeFn(body);
1695
1913
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1703,14 +1921,14 @@ const collectionTypes = {
1703
1921
  const { userAbility } = ctx.state;
1704
1922
  const { model } = ctx.params;
1705
1923
  const { query } = ctx.request;
1706
- const documentMetadata2 = getService$1("document-metadata");
1707
- const documentManager2 = getService$1("document-manager");
1708
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1924
+ const documentMetadata2 = getService$2("document-metadata");
1925
+ const documentManager2 = getService$2("document-manager");
1926
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1709
1927
  if (permissionChecker2.cannot.read()) {
1710
1928
  return ctx.forbidden();
1711
1929
  }
1712
1930
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(query);
1713
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1931
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(1).countRelations({ toOne: false, toMany: true }).build();
1714
1932
  const { locale, status } = await getDocumentLocaleAndStatus(query, model);
1715
1933
  const { results: documents, pagination: pagination2 } = await documentManager2.findPage(
1716
1934
  { ...permissionQuery, populate, locale, status },
@@ -1739,13 +1957,13 @@ const collectionTypes = {
1739
1957
  async findOne(ctx) {
1740
1958
  const { userAbility } = ctx.state;
1741
1959
  const { model, id } = ctx.params;
1742
- const documentManager2 = getService$1("document-manager");
1743
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1960
+ const documentManager2 = getService$2("document-manager");
1961
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1744
1962
  if (permissionChecker2.cannot.read()) {
1745
1963
  return ctx.forbidden();
1746
1964
  }
1747
1965
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
1748
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1966
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1749
1967
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
1750
1968
  const version = await documentManager2.findOne(id, model, {
1751
1969
  populate,
@@ -1776,7 +1994,7 @@ const collectionTypes = {
1776
1994
  async create(ctx) {
1777
1995
  const { userAbility } = ctx.state;
1778
1996
  const { model } = ctx.params;
1779
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
1997
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1780
1998
  const [totalEntries, document] = await Promise.all([
1781
1999
  strapi.db.query(model).count(),
1782
2000
  createDocument(ctx)
@@ -1797,7 +2015,7 @@ const collectionTypes = {
1797
2015
  async update(ctx) {
1798
2016
  const { userAbility } = ctx.state;
1799
2017
  const { model } = ctx.params;
1800
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2018
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1801
2019
  const updatedVersion = await updateDocument(ctx);
1802
2020
  const sanitizedVersion = await permissionChecker2.sanitizeOutput(updatedVersion);
1803
2021
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedVersion);
@@ -1806,13 +2024,13 @@ const collectionTypes = {
1806
2024
  const { userAbility, user } = ctx.state;
1807
2025
  const { model, sourceId: id } = ctx.params;
1808
2026
  const { body } = ctx.request;
1809
- const documentManager2 = getService$1("document-manager");
1810
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2027
+ const documentManager2 = getService$2("document-manager");
2028
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1811
2029
  if (permissionChecker2.cannot.create()) {
1812
2030
  return ctx.forbidden();
1813
2031
  }
1814
2032
  const permissionQuery = await permissionChecker2.sanitizedQuery.create(ctx.query);
1815
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2033
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1816
2034
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1817
2035
  const document = await documentManager2.findOne(id, model, {
1818
2036
  populate,
@@ -1851,13 +2069,13 @@ const collectionTypes = {
1851
2069
  async delete(ctx) {
1852
2070
  const { userAbility } = ctx.state;
1853
2071
  const { id, model } = ctx.params;
1854
- const documentManager2 = getService$1("document-manager");
1855
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2072
+ const documentManager2 = getService$2("document-manager");
2073
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1856
2074
  if (permissionChecker2.cannot.delete()) {
1857
2075
  return ctx.forbidden();
1858
2076
  }
1859
2077
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(ctx.query);
1860
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2078
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
1861
2079
  const { locale } = await getDocumentLocaleAndStatus(ctx.query, model);
1862
2080
  const documentLocales = await documentManager2.findLocales(id, model, { populate, locale });
1863
2081
  if (documentLocales.length === 0) {
@@ -1879,14 +2097,14 @@ const collectionTypes = {
1879
2097
  const { userAbility } = ctx.state;
1880
2098
  const { id, model } = ctx.params;
1881
2099
  const { body } = ctx.request;
1882
- const documentManager2 = getService$1("document-manager");
1883
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2100
+ const documentManager2 = getService$2("document-manager");
2101
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1884
2102
  if (permissionChecker2.cannot.publish()) {
1885
2103
  return ctx.forbidden();
1886
2104
  }
1887
2105
  const publishedDocument = await strapi.db.transaction(async () => {
1888
2106
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1889
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2107
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1890
2108
  let document;
1891
2109
  const { locale } = await getDocumentLocaleAndStatus(body, model);
1892
2110
  const isCreate = isNil$1(id);
@@ -1898,11 +2116,17 @@ const collectionTypes = {
1898
2116
  }
1899
2117
  const isUpdate = !isCreate;
1900
2118
  if (isUpdate) {
1901
- document = await documentManager2.findOne(id, model, { populate, locale });
1902
- if (!document) {
2119
+ const documentExists = documentManager2.exists(model, id);
2120
+ if (!documentExists) {
1903
2121
  throw new errors.NotFoundError("Document not found");
1904
2122
  }
1905
- if (permissionChecker2.can.update(document)) {
2123
+ document = await documentManager2.findOne(id, model, { populate, locale });
2124
+ if (!document) {
2125
+ if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
2126
+ throw new errors.ForbiddenError();
2127
+ }
2128
+ document = await updateDocument(ctx);
2129
+ } else if (permissionChecker2.can.update(document)) {
1906
2130
  await updateDocument(ctx);
1907
2131
  }
1908
2132
  }
@@ -1928,13 +2152,13 @@ const collectionTypes = {
1928
2152
  const { body } = ctx.request;
1929
2153
  const { documentIds } = body;
1930
2154
  await validateBulkActionInput(body);
1931
- const documentManager2 = getService$1("document-manager");
1932
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2155
+ const documentManager2 = getService$2("document-manager");
2156
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1933
2157
  if (permissionChecker2.cannot.publish()) {
1934
2158
  return ctx.forbidden();
1935
2159
  }
1936
2160
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1937
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
2161
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1938
2162
  const { locale } = await getDocumentLocaleAndStatus(body, model, {
1939
2163
  allowMultipleLocales: true
1940
2164
  });
@@ -1959,8 +2183,8 @@ const collectionTypes = {
1959
2183
  const { body } = ctx.request;
1960
2184
  const { documentIds } = body;
1961
2185
  await validateBulkActionInput(body);
1962
- const documentManager2 = getService$1("document-manager");
1963
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2186
+ const documentManager2 = getService$2("document-manager");
2187
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1964
2188
  if (permissionChecker2.cannot.unpublish()) {
1965
2189
  return ctx.forbidden();
1966
2190
  }
@@ -1989,8 +2213,8 @@ const collectionTypes = {
1989
2213
  const {
1990
2214
  body: { discardDraft, ...body }
1991
2215
  } = ctx.request;
1992
- const documentManager2 = getService$1("document-manager");
1993
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2216
+ const documentManager2 = getService$2("document-manager");
2217
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
1994
2218
  if (permissionChecker2.cannot.unpublish()) {
1995
2219
  return ctx.forbidden();
1996
2220
  }
@@ -1998,7 +2222,7 @@ const collectionTypes = {
1998
2222
  return ctx.forbidden();
1999
2223
  }
2000
2224
  const permissionQuery = await permissionChecker2.sanitizedQuery.unpublish(ctx.query);
2001
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2225
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2002
2226
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2003
2227
  const document = await documentManager2.findOne(id, model, {
2004
2228
  populate,
@@ -2029,13 +2253,13 @@ const collectionTypes = {
2029
2253
  const { userAbility } = ctx.state;
2030
2254
  const { id, model } = ctx.params;
2031
2255
  const { body } = ctx.request;
2032
- const documentManager2 = getService$1("document-manager");
2033
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2256
+ const documentManager2 = getService$2("document-manager");
2257
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2034
2258
  if (permissionChecker2.cannot.discard()) {
2035
2259
  return ctx.forbidden();
2036
2260
  }
2037
2261
  const permissionQuery = await permissionChecker2.sanitizedQuery.discard(ctx.query);
2038
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2262
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2039
2263
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2040
2264
  const document = await documentManager2.findOne(id, model, {
2041
2265
  populate,
@@ -2060,13 +2284,13 @@ const collectionTypes = {
2060
2284
  const { query, body } = ctx.request;
2061
2285
  const { documentIds } = body;
2062
2286
  await validateBulkActionInput(body);
2063
- const documentManager2 = getService$1("document-manager");
2064
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2287
+ const documentManager2 = getService$2("document-manager");
2288
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2065
2289
  if (permissionChecker2.cannot.delete()) {
2066
2290
  return ctx.forbidden();
2067
2291
  }
2068
2292
  const permissionQuery = await permissionChecker2.sanitizedQuery.delete(query);
2069
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2293
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2070
2294
  const { locale } = await getDocumentLocaleAndStatus(body, model);
2071
2295
  const documentLocales = await documentManager2.findLocales(documentIds, model, {
2072
2296
  populate,
@@ -2087,13 +2311,13 @@ const collectionTypes = {
2087
2311
  async countDraftRelations(ctx) {
2088
2312
  const { userAbility } = ctx.state;
2089
2313
  const { model, id } = ctx.params;
2090
- const documentManager2 = getService$1("document-manager");
2091
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2314
+ const documentManager2 = getService$2("document-manager");
2315
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2092
2316
  if (permissionChecker2.cannot.read()) {
2093
2317
  return ctx.forbidden();
2094
2318
  }
2095
2319
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2096
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2320
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2097
2321
  const { locale, status } = await getDocumentLocaleAndStatus(ctx.query, model);
2098
2322
  const entity = await documentManager2.findOne(id, model, { populate, locale, status });
2099
2323
  if (!entity) {
@@ -2112,8 +2336,8 @@ const collectionTypes = {
2112
2336
  const ids = ctx.request.query.documentIds;
2113
2337
  const locale = ctx.request.query.locale;
2114
2338
  const { model } = ctx.params;
2115
- const documentManager2 = getService$1("document-manager");
2116
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2339
+ const documentManager2 = getService$2("document-manager");
2340
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2117
2341
  if (permissionChecker2.cannot.read()) {
2118
2342
  return ctx.forbidden();
2119
2343
  }
@@ -2137,13 +2361,13 @@ const collectionTypes = {
2137
2361
  };
2138
2362
  const components$1 = {
2139
2363
  findComponents(ctx) {
2140
- const components2 = getService$1("components").findAllComponents();
2141
- const { toDto } = getService$1("data-mapper");
2364
+ const components2 = getService$2("components").findAllComponents();
2365
+ const { toDto } = getService$2("data-mapper");
2142
2366
  ctx.body = { data: components2.map(toDto) };
2143
2367
  },
2144
2368
  async findComponentConfiguration(ctx) {
2145
2369
  const { uid: uid2 } = ctx.params;
2146
- const componentService = getService$1("components");
2370
+ const componentService = getService$2("components");
2147
2371
  const component = componentService.findComponent(uid2);
2148
2372
  if (!component) {
2149
2373
  return ctx.notFound("component.notFound");
@@ -2160,7 +2384,7 @@ const components$1 = {
2160
2384
  async updateComponentConfiguration(ctx) {
2161
2385
  const { uid: uid2 } = ctx.params;
2162
2386
  const { body } = ctx.request;
2163
- const componentService = getService$1("components");
2387
+ const componentService = getService$2("components");
2164
2388
  const component = componentService.findComponent(uid2);
2165
2389
  if (!component) {
2166
2390
  return ctx.notFound("component.notFound");
@@ -2194,12 +2418,12 @@ const contentTypes = {
2194
2418
  } catch (error) {
2195
2419
  return ctx.send({ error }, 400);
2196
2420
  }
2197
- const contentTypes2 = getService$1("content-types").findContentTypesByKind(kind);
2198
- const { toDto } = getService$1("data-mapper");
2421
+ const contentTypes2 = getService$2("content-types").findContentTypesByKind(kind);
2422
+ const { toDto } = getService$2("data-mapper");
2199
2423
  ctx.body = { data: contentTypes2.map(toDto) };
2200
2424
  },
2201
2425
  async findContentTypesSettings(ctx) {
2202
- const { findAllContentTypes, findConfiguration } = getService$1("content-types");
2426
+ const { findAllContentTypes, findConfiguration } = getService$2("content-types");
2203
2427
  const contentTypes2 = await findAllContentTypes();
2204
2428
  const configurations = await Promise.all(
2205
2429
  contentTypes2.map(async (contentType) => {
@@ -2213,7 +2437,7 @@ const contentTypes = {
2213
2437
  },
2214
2438
  async findContentTypeConfiguration(ctx) {
2215
2439
  const { uid: uid2 } = ctx.params;
2216
- const contentTypeService = getService$1("content-types");
2440
+ const contentTypeService = getService$2("content-types");
2217
2441
  const contentType = await contentTypeService.findContentType(uid2);
2218
2442
  if (!contentType) {
2219
2443
  return ctx.notFound("contentType.notFound");
@@ -2235,13 +2459,13 @@ const contentTypes = {
2235
2459
  const { userAbility } = ctx.state;
2236
2460
  const { uid: uid2 } = ctx.params;
2237
2461
  const { body } = ctx.request;
2238
- const contentTypeService = getService$1("content-types");
2239
- const metricsService = getService$1("metrics");
2462
+ const contentTypeService = getService$2("content-types");
2463
+ const metricsService = getService$2("metrics");
2240
2464
  const contentType = await contentTypeService.findContentType(uid2);
2241
2465
  if (!contentType) {
2242
2466
  return ctx.notFound("contentType.notFound");
2243
2467
  }
2244
- if (!getService$1("permission").canConfigureContentType({ userAbility, contentType })) {
2468
+ if (!getService$2("permission").canConfigureContentType({ userAbility, contentType })) {
2245
2469
  return ctx.forbidden();
2246
2470
  }
2247
2471
  let input;
@@ -2274,10 +2498,10 @@ const contentTypes = {
2274
2498
  };
2275
2499
  const init = {
2276
2500
  getInitData(ctx) {
2277
- const { toDto } = getService$1("data-mapper");
2278
- const { findAllComponents } = getService$1("components");
2279
- const { getAllFieldSizes } = getService$1("field-sizes");
2280
- const { findAllContentTypes } = getService$1("content-types");
2501
+ const { toDto } = getService$2("data-mapper");
2502
+ const { findAllComponents } = getService$2("components");
2503
+ const { getAllFieldSizes } = getService$2("field-sizes");
2504
+ const { findAllContentTypes } = getService$2("content-types");
2281
2505
  ctx.body = {
2282
2506
  data: {
2283
2507
  fieldSizes: getAllFieldSizes(),
@@ -2313,7 +2537,7 @@ const addFiltersClause = (params, filtersClause) => {
2313
2537
  params.filters.$and.push(filtersClause);
2314
2538
  };
2315
2539
  const sanitizeMainField = (model, mainField, userAbility) => {
2316
- const permissionChecker2 = getService$1("permission-checker").create({
2540
+ const permissionChecker2 = getService$2("permission-checker").create({
2317
2541
  userAbility,
2318
2542
  model: model.uid
2319
2543
  });
@@ -2327,15 +2551,27 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2327
2551
  }
2328
2552
  return mainField;
2329
2553
  };
2330
- const addStatusToRelations = async (uid2, relations2) => {
2331
- if (!contentTypes$1.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2554
+ const addStatusToRelations = async (targetUid, relations2) => {
2555
+ if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
2556
+ return relations2;
2557
+ }
2558
+ const documentMetadata2 = getService$2("document-metadata");
2559
+ if (!relations2.length) {
2332
2560
  return relations2;
2333
2561
  }
2334
- const documentMetadata2 = getService$1("document-metadata");
2335
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
2562
+ const firstRelation = relations2[0];
2563
+ const filters = {
2564
+ documentId: { $in: relations2.map((r) => r.documentId) },
2565
+ // NOTE: find the "opposite" status
2566
+ publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
2567
+ };
2568
+ const availableStatus = await strapi.query(targetUid).findMany({
2569
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
2570
+ filters
2571
+ });
2336
2572
  return relations2.map((relation) => {
2337
- const availableStatuses = documentsAvailableStatus.filter(
2338
- (availableDocument) => availableDocument.documentId === relation.documentId
2573
+ const availableStatuses = availableStatus.filter(
2574
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2339
2575
  );
2340
2576
  return {
2341
2577
  ...relation,
@@ -2356,11 +2592,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2356
2592
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2357
2593
  const isSourceLocalized = isLocalized(sourceModel);
2358
2594
  const isTargetLocalized = isLocalized(targetModel);
2359
- let validatedLocale = locale;
2360
- if (!targetModel || !isTargetLocalized)
2361
- validatedLocale = void 0;
2362
2595
  return {
2363
- locale: validatedLocale,
2596
+ locale,
2364
2597
  isSourceLocalized,
2365
2598
  isTargetLocalized
2366
2599
  };
@@ -2369,8 +2602,7 @@ const validateStatus = (sourceUid, status) => {
2369
2602
  const sourceModel = strapi.getModel(sourceUid);
2370
2603
  const isDP = contentTypes$1.hasDraftAndPublish;
2371
2604
  const isSourceDP = isDP(sourceModel);
2372
- if (!isSourceDP)
2373
- return { status: void 0 };
2605
+ if (!isSourceDP) return { status: void 0 };
2374
2606
  switch (status) {
2375
2607
  case "published":
2376
2608
  return { status: "published" };
@@ -2400,7 +2632,7 @@ const relations = {
2400
2632
  ctx.request?.query?.locale
2401
2633
  );
2402
2634
  const { status } = validateStatus(sourceUid, ctx.request?.query?.status);
2403
- const permissionChecker2 = getService$1("permission-checker").create({
2635
+ const permissionChecker2 = getService$2("permission-checker").create({
2404
2636
  userAbility,
2405
2637
  model
2406
2638
  });
@@ -2425,7 +2657,7 @@ const relations = {
2425
2657
  where.id = id;
2426
2658
  }
2427
2659
  const permissionQuery = await permissionChecker2.sanitizedQuery.read(ctx.query);
2428
- const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).build();
2660
+ const populate = await getService$2("populate-builder")(model).populateFromQuery(permissionQuery).build();
2429
2661
  const currentEntity = await strapi.db.query(model).findOne({
2430
2662
  where,
2431
2663
  populate
@@ -2440,7 +2672,7 @@ const relations = {
2440
2672
  }
2441
2673
  entryId = currentEntity.id;
2442
2674
  }
2443
- const modelConfig = isComponent2 ? await getService$1("components").findConfiguration(sourceSchema) : await getService$1("content-types").findConfiguration(sourceSchema);
2675
+ const modelConfig = isComponent2 ? await getService$2("components").findConfiguration(sourceSchema) : await getService$2("content-types").findConfiguration(sourceSchema);
2444
2676
  const targetSchema = strapi.getModel(targetUid);
2445
2677
  const mainField = flow(
2446
2678
  prop(`metadatas.${targetField}.edit.mainField`),
@@ -2463,7 +2695,7 @@ const relations = {
2463
2695
  attribute,
2464
2696
  fieldsToSelect,
2465
2697
  mainField,
2466
- source: { schema: sourceSchema },
2698
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2467
2699
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2468
2700
  sourceSchema,
2469
2701
  targetSchema,
@@ -2485,7 +2717,8 @@ const relations = {
2485
2717
  fieldsToSelect,
2486
2718
  mainField,
2487
2719
  source: {
2488
- schema: { uid: sourceUid, modelType: sourceModelType }
2720
+ schema: { uid: sourceUid, modelType: sourceModelType },
2721
+ isLocalized: isSourceLocalized
2489
2722
  },
2490
2723
  target: {
2491
2724
  schema: { uid: targetUid },
@@ -2493,7 +2726,7 @@ const relations = {
2493
2726
  }
2494
2727
  } = await this.extractAndValidateRequestInfo(ctx, id);
2495
2728
  const { idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;
2496
- const permissionChecker2 = getService$1("permission-checker").create({
2729
+ const permissionChecker2 = getService$2("permission-checker").create({
2497
2730
  userAbility: ctx.state.userAbility,
2498
2731
  model: targetUid
2499
2732
  });
@@ -2527,9 +2760,12 @@ const relations = {
2527
2760
  if (!isEmpty(publishedAt)) {
2528
2761
  where[`${alias}.published_at`] = publishedAt;
2529
2762
  }
2530
- if (filterByLocale) {
2763
+ if (isTargetLocalized && locale) {
2531
2764
  where[`${alias}.locale`] = locale;
2532
2765
  }
2766
+ if (isSourceLocalized && locale) {
2767
+ where.locale = locale;
2768
+ }
2533
2769
  if ((idsToInclude?.length ?? 0) !== 0) {
2534
2770
  where[`${alias}.id`].$notIn = idsToInclude;
2535
2771
  }
@@ -2547,7 +2783,8 @@ const relations = {
2547
2783
  id: { $notIn: uniq(idsToOmit) }
2548
2784
  });
2549
2785
  }
2550
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2786
+ const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
2787
+ const res = await strapi.db.query(targetUid).findPage(dbQuery);
2551
2788
  ctx.body = {
2552
2789
  ...res,
2553
2790
  results: await addStatusToRelations(targetUid, res.results)
@@ -2562,21 +2799,33 @@ const relations = {
2562
2799
  attribute,
2563
2800
  targetField,
2564
2801
  fieldsToSelect,
2565
- source: {
2566
- schema: { uid: sourceUid }
2567
- },
2568
- target: {
2569
- schema: { uid: targetUid }
2570
- }
2802
+ status,
2803
+ source: { schema: sourceSchema },
2804
+ target: { schema: targetSchema }
2571
2805
  } = await this.extractAndValidateRequestInfo(ctx, id);
2572
- const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2806
+ const { uid: sourceUid } = sourceSchema;
2807
+ const { uid: targetUid } = targetSchema;
2808
+ const permissionQuery = await getService$2("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2573
2809
  const dbQuery = strapi.db.query(sourceUid);
2574
2810
  const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2811
+ const filters = {};
2812
+ if (sourceSchema?.options?.draftAndPublish) {
2813
+ if (targetSchema?.options?.draftAndPublish) {
2814
+ if (status === "published") {
2815
+ filters.publishedAt = { $notNull: true };
2816
+ } else {
2817
+ filters.publishedAt = { $null: true };
2818
+ }
2819
+ }
2820
+ } else if (targetSchema?.options?.draftAndPublish) {
2821
+ filters.publishedAt = { $null: true };
2822
+ }
2575
2823
  const res = await loadRelations({ id: entryId }, targetField, {
2576
- select: ["id", "documentId", "locale", "publishedAt"],
2824
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2577
2825
  ordering: "desc",
2578
2826
  page: ctx.request.query.page,
2579
- pageSize: ctx.request.query.pageSize
2827
+ pageSize: ctx.request.query.pageSize,
2828
+ filters
2580
2829
  });
2581
2830
  const loadedIds = res.results.map((item) => item.id);
2582
2831
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
@@ -2597,10 +2846,10 @@ const relations = {
2597
2846
  }
2598
2847
  };
2599
2848
  const buildPopulateFromQuery = async (query, model) => {
2600
- return getService$1("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
2849
+ return getService$2("populate-builder")(model).populateFromQuery(query).populateDeep(Infinity).countRelations().build();
2601
2850
  };
2602
2851
  const findDocument = async (query, uid2, opts = {}) => {
2603
- const documentManager2 = getService$1("document-manager");
2852
+ const documentManager2 = getService$2("document-manager");
2604
2853
  const populate = await buildPopulateFromQuery(query, uid2);
2605
2854
  return documentManager2.findMany({ ...opts, populate }, uid2).then((documents) => documents[0]);
2606
2855
  };
@@ -2608,8 +2857,8 @@ const createOrUpdateDocument = async (ctx, opts) => {
2608
2857
  const { user, userAbility } = ctx.state;
2609
2858
  const { model } = ctx.params;
2610
2859
  const { body, query } = ctx.request;
2611
- const documentManager2 = getService$1("document-manager");
2612
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2860
+ const documentManager2 = getService$2("document-manager");
2861
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2613
2862
  if (permissionChecker2.cannot.create() && permissionChecker2.cannot.update()) {
2614
2863
  throw new errors.ForbiddenError();
2615
2864
  }
@@ -2650,7 +2899,7 @@ const singleTypes = {
2650
2899
  const { userAbility } = ctx.state;
2651
2900
  const { model } = ctx.params;
2652
2901
  const { query = {} } = ctx.request;
2653
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2902
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2654
2903
  if (permissionChecker2.cannot.read()) {
2655
2904
  return ctx.forbidden();
2656
2905
  }
@@ -2684,7 +2933,7 @@ const singleTypes = {
2684
2933
  async createOrUpdate(ctx) {
2685
2934
  const { userAbility } = ctx.state;
2686
2935
  const { model } = ctx.params;
2687
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2936
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2688
2937
  const document = await createOrUpdateDocument(ctx);
2689
2938
  const sanitizedDocument = await permissionChecker2.sanitizeOutput(document);
2690
2939
  ctx.body = await formatDocumentWithMetadata(permissionChecker2, model, sanitizedDocument);
@@ -2693,8 +2942,8 @@ const singleTypes = {
2693
2942
  const { userAbility } = ctx.state;
2694
2943
  const { model } = ctx.params;
2695
2944
  const { query = {} } = ctx.request;
2696
- const documentManager2 = getService$1("document-manager");
2697
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2945
+ const documentManager2 = getService$2("document-manager");
2946
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2698
2947
  if (permissionChecker2.cannot.delete()) {
2699
2948
  return ctx.forbidden();
2700
2949
  }
@@ -2722,8 +2971,8 @@ const singleTypes = {
2722
2971
  const { userAbility } = ctx.state;
2723
2972
  const { model } = ctx.params;
2724
2973
  const { query = {} } = ctx.request;
2725
- const documentManager2 = getService$1("document-manager");
2726
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
2974
+ const documentManager2 = getService$2("document-manager");
2975
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2727
2976
  if (permissionChecker2.cannot.publish()) {
2728
2977
  return ctx.forbidden();
2729
2978
  }
@@ -2751,8 +3000,8 @@ const singleTypes = {
2751
3000
  body: { discardDraft, ...body },
2752
3001
  query = {}
2753
3002
  } = ctx.request;
2754
- const documentManager2 = getService$1("document-manager");
2755
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3003
+ const documentManager2 = getService$2("document-manager");
3004
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2756
3005
  if (permissionChecker2.cannot.unpublish()) {
2757
3006
  return ctx.forbidden();
2758
3007
  }
@@ -2786,8 +3035,8 @@ const singleTypes = {
2786
3035
  const { userAbility } = ctx.state;
2787
3036
  const { model } = ctx.params;
2788
3037
  const { body, query = {} } = ctx.request;
2789
- const documentManager2 = getService$1("document-manager");
2790
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3038
+ const documentManager2 = getService$2("document-manager");
3039
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2791
3040
  if (permissionChecker2.cannot.discard()) {
2792
3041
  return ctx.forbidden();
2793
3042
  }
@@ -2810,8 +3059,8 @@ const singleTypes = {
2810
3059
  const { userAbility } = ctx.state;
2811
3060
  const { model } = ctx.params;
2812
3061
  const { query } = ctx.request;
2813
- const documentManager2 = getService$1("document-manager");
2814
- const permissionChecker2 = getService$1("permission-checker").create({ userAbility, model });
3062
+ const documentManager2 = getService$2("document-manager");
3063
+ const permissionChecker2 = getService$2("permission-checker").create({ userAbility, model });
2815
3064
  const { locale } = await getDocumentLocaleAndStatus(query, model);
2816
3065
  if (permissionChecker2.cannot.read()) {
2817
3066
  return ctx.forbidden();
@@ -2835,7 +3084,7 @@ const uid$1 = {
2835
3084
  const { query = {} } = ctx.request;
2836
3085
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2837
3086
  await validateUIDField(contentTypeUID, field);
2838
- const uidService = getService$1("uid");
3087
+ const uidService = getService$2("uid");
2839
3088
  ctx.body = {
2840
3089
  data: await uidService.generateUIDField({ contentTypeUID, field, data, locale })
2841
3090
  };
@@ -2847,7 +3096,7 @@ const uid$1 = {
2847
3096
  const { query = {} } = ctx.request;
2848
3097
  const { locale } = await getDocumentLocaleAndStatus(query, contentTypeUID);
2849
3098
  await validateUIDField(contentTypeUID, field);
2850
- const uidService = getService$1("uid");
3099
+ const uidService = getService$2("uid");
2851
3100
  const isAvailable = await uidService.checkUIDAvailability({
2852
3101
  contentTypeUID,
2853
3102
  field,
@@ -2868,7 +3117,8 @@ const controllers = {
2868
3117
  relations,
2869
3118
  "single-types": singleTypes,
2870
3119
  uid: uid$1,
2871
- ...history.controllers ? history.controllers : {}
3120
+ ...history.controllers ? history.controllers : {},
3121
+ ...preview.controllers ? preview.controllers : {}
2872
3122
  };
2873
3123
  const keys = {
2874
3124
  CONFIGURATION: "configuration"
@@ -2997,18 +3247,15 @@ async function syncMetadatas(configuration, schema) {
2997
3247
  _.set(updatedMeta, ["list", "searchable"], false);
2998
3248
  _.set(acc, [key], updatedMeta);
2999
3249
  }
3000
- if (!_.has(edit, "mainField"))
3001
- return acc;
3250
+ if (!_.has(edit, "mainField")) return acc;
3002
3251
  if (!isRelation$1(attr)) {
3003
3252
  _.set(updatedMeta, "edit", _.omit(edit, ["mainField"]));
3004
3253
  _.set(acc, [key], updatedMeta);
3005
3254
  return acc;
3006
3255
  }
3007
- if (edit.mainField === "id")
3008
- return acc;
3256
+ if (edit.mainField === "id") return acc;
3009
3257
  const targetSchema = getTargetSchema(attr.targetModel);
3010
- if (!targetSchema)
3011
- return acc;
3258
+ if (!targetSchema) return acc;
3012
3259
  if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {
3013
3260
  _.set(updatedMeta, ["edit", "mainField"], getDefaultMainField(targetSchema));
3014
3261
  _.set(acc, [key], updatedMeta);
@@ -3019,12 +3266,12 @@ async function syncMetadatas(configuration, schema) {
3019
3266
  return _.assign(metasWithDefaults, updatedMetas);
3020
3267
  }
3021
3268
  const getTargetSchema = (targetModel) => {
3022
- return getService$1("content-types").findContentType(targetModel);
3269
+ return getService$2("content-types").findContentType(targetModel);
3023
3270
  };
3024
3271
  const DEFAULT_LIST_LENGTH = 4;
3025
3272
  const MAX_ROW_SIZE = 12;
3026
3273
  const isAllowedFieldSize = (type, size) => {
3027
- const { getFieldSize } = getService$1("field-sizes");
3274
+ const { getFieldSize } = getService$2("field-sizes");
3028
3275
  const fieldSize = getFieldSize(type);
3029
3276
  if (!fieldSize.isResizable && size !== fieldSize.default) {
3030
3277
  return false;
@@ -3032,7 +3279,7 @@ const isAllowedFieldSize = (type, size) => {
3032
3279
  return size <= MAX_ROW_SIZE;
3033
3280
  };
3034
3281
  const getDefaultFieldSize = (attribute) => {
3035
- const { hasFieldSize, getFieldSize } = getService$1("field-sizes");
3282
+ const { hasFieldSize, getFieldSize } = getService$2("field-sizes");
3036
3283
  return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type).default;
3037
3284
  };
3038
3285
  async function createDefaultLayouts(schema) {
@@ -3053,8 +3300,7 @@ function createDefaultEditLayout(schema) {
3053
3300
  return appendToEditLayout([], keys2, schema);
3054
3301
  }
3055
3302
  function syncLayouts(configuration, schema) {
3056
- if (_.isEmpty(configuration.layouts))
3057
- return createDefaultLayouts(schema);
3303
+ if (_.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);
3058
3304
  const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
3059
3305
  let cleanList = list.filter((attr) => isListable(schema, attr));
3060
3306
  const cleanEditRelations = editRelations.filter(
@@ -3065,9 +3311,8 @@ function syncLayouts(configuration, schema) {
3065
3311
  for (const row of edit) {
3066
3312
  const newRow = [];
3067
3313
  for (const el of row) {
3068
- if (!hasEditableAttribute(schema, el.name))
3069
- continue;
3070
- const { hasFieldSize } = getService$1("field-sizes");
3314
+ if (!hasEditableAttribute(schema, el.name)) continue;
3315
+ const { hasFieldSize } = getService$2("field-sizes");
3071
3316
  const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
3072
3317
  if (!isAllowedFieldSize(fieldType, el.size)) {
3073
3318
  elementsToReAppend.push(el.name);
@@ -3097,8 +3342,7 @@ function syncLayouts(configuration, schema) {
3097
3342
  };
3098
3343
  }
3099
3344
  const appendToEditLayout = (layout = [], keysToAppend, schema) => {
3100
- if (keysToAppend.length === 0)
3101
- return layout;
3345
+ if (keysToAppend.length === 0) return layout;
3102
3346
  let currentRowIndex = Math.max(layout.length - 1, 0);
3103
3347
  if (!layout[currentRowIndex]) {
3104
3348
  layout[currentRowIndex] = [];
@@ -3207,17 +3451,17 @@ const configurationService$1 = createConfigurationService({
3207
3451
  isComponent: true,
3208
3452
  prefix: STORE_KEY_PREFIX,
3209
3453
  getModels() {
3210
- const { toContentManagerModel } = getService$1("data-mapper");
3454
+ const { toContentManagerModel } = getService$2("data-mapper");
3211
3455
  return mapValues(toContentManagerModel, strapi.components);
3212
3456
  }
3213
3457
  });
3214
3458
  const components = ({ strapi: strapi2 }) => ({
3215
3459
  findAllComponents() {
3216
- const { toContentManagerModel } = getService$1("data-mapper");
3460
+ const { toContentManagerModel } = getService$2("data-mapper");
3217
3461
  return Object.values(strapi2.components).map(toContentManagerModel);
3218
3462
  },
3219
3463
  findComponent(uid2) {
3220
- const { toContentManagerModel } = getService$1("data-mapper");
3464
+ const { toContentManagerModel } = getService$2("data-mapper");
3221
3465
  const component = strapi2.components[uid2];
3222
3466
  return isNil$1(component) ? component : toContentManagerModel(component);
3223
3467
  },
@@ -3268,17 +3512,17 @@ const configurationService = createConfigurationService({
3268
3512
  storeUtils,
3269
3513
  prefix: "content_types",
3270
3514
  getModels() {
3271
- const { toContentManagerModel } = getService$1("data-mapper");
3515
+ const { toContentManagerModel } = getService$2("data-mapper");
3272
3516
  return mapValues(toContentManagerModel, strapi.contentTypes);
3273
3517
  }
3274
3518
  });
3275
3519
  const service = ({ strapi: strapi2 }) => ({
3276
3520
  findAllContentTypes() {
3277
- const { toContentManagerModel } = getService$1("data-mapper");
3521
+ const { toContentManagerModel } = getService$2("data-mapper");
3278
3522
  return Object.values(strapi2.contentTypes).map(toContentManagerModel);
3279
3523
  },
3280
3524
  findContentType(uid2) {
3281
- const { toContentManagerModel } = getService$1("data-mapper");
3525
+ const { toContentManagerModel } = getService$2("data-mapper");
3282
3526
  const contentType = strapi2.contentTypes[uid2];
3283
3527
  return isNil$1(contentType) ? contentType : toContentManagerModel(contentType);
3284
3528
  },
@@ -3307,7 +3551,7 @@ const service = ({ strapi: strapi2 }) => ({
3307
3551
  return this.findConfiguration(contentType);
3308
3552
  },
3309
3553
  findComponentsConfigurations(contentType) {
3310
- return getService$1("components").findComponentsConfigurations(contentType);
3554
+ return getService$2("components").findComponentsConfigurations(contentType);
3311
3555
  },
3312
3556
  syncConfigurations() {
3313
3557
  return configurationService.syncConfigurations();
@@ -3579,7 +3823,7 @@ const permission = ({ strapi: strapi2 }) => ({
3579
3823
  return userAbility.can(action);
3580
3824
  },
3581
3825
  async registerPermissions() {
3582
- const displayedContentTypes = getService$1("content-types").findDisplayedContentTypes();
3826
+ const displayedContentTypes = getService$2("content-types").findDisplayedContentTypes();
3583
3827
  const contentTypesUids = displayedContentTypes.map(prop("uid"));
3584
3828
  const actions = [
3585
3829
  {
@@ -3855,7 +4099,7 @@ const getQueryPopulate = async (uid2, query) => {
3855
4099
  return populateQuery;
3856
4100
  };
3857
4101
  const buildDeepPopulate = (uid2) => {
3858
- return getService$1("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
4102
+ return getService$2("populate-builder")(uid2).populateDeep(Infinity).countRelations().build();
3859
4103
  };
3860
4104
  const populateBuilder = (uid2) => {
3861
4105
  let getInitialPopulate = async () => {
@@ -4040,7 +4284,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4040
4284
  */
4041
4285
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4042
4286
  const versionsByLocale = groupBy("locale", allVersions);
4043
- delete versionsByLocale[version.locale];
4287
+ if (version.locale) {
4288
+ delete versionsByLocale[version.locale];
4289
+ }
4044
4290
  const model = strapi2.getModel(uid2);
4045
4291
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4046
4292
  const traversalFunction = async (localeVersion) => traverseEntity(
@@ -4087,8 +4333,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4087
4333
  const matchStatus = status === "published" ? v.publishedAt !== null : v.publishedAt === null;
4088
4334
  return matchLocale && matchStatus;
4089
4335
  });
4090
- if (!availableStatus)
4091
- return availableStatus;
4336
+ if (!availableStatus) return availableStatus;
4092
4337
  return pick(AVAILABLE_STATUS_FIELDS, availableStatus);
4093
4338
  },
4094
4339
  /**
@@ -4098,8 +4343,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4098
4343
  * @returns
4099
4344
  */
4100
4345
  async getManyAvailableStatus(uid2, documents) {
4101
- if (!documents.length)
4102
- return [];
4346
+ if (!documents.length) return [];
4103
4347
  const status = documents[0].publishedAt !== null ? "published" : "draft";
4104
4348
  const locale = documents[0]?.locale;
4105
4349
  const otherStatus = status === "published" ? "draft" : "published";
@@ -4126,10 +4370,8 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4126
4370
  } else if (otherVersion) {
4127
4371
  draftVersion = otherVersion;
4128
4372
  }
4129
- if (!draftVersion)
4130
- return CONTENT_MANAGER_STATUS.PUBLISHED;
4131
- if (!publishedVersion)
4132
- return CONTENT_MANAGER_STATUS.DRAFT;
4373
+ if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;
4374
+ if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;
4133
4375
  const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);
4134
4376
  return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;
4135
4377
  },
@@ -4396,7 +4638,8 @@ const services = {
4396
4638
  permission,
4397
4639
  "populate-builder": populateBuilder$1,
4398
4640
  uid,
4399
- ...history.services ? history.services : {}
4641
+ ...history.services ? history.services : {},
4642
+ ...preview.services ? preview.services : {}
4400
4643
  };
4401
4644
  const index = () => {
4402
4645
  return {