@strapi/content-manager 5.0.0-rc.4 → 5.0.0-rc.6

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 (74) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-5ukroXAh.js → ComponentConfigurationPage-DXYBg6Q4.js} +3 -3
  2. package/dist/_chunks/{ComponentConfigurationPage-5ukroXAh.js.map → ComponentConfigurationPage-DXYBg6Q4.js.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-BAgyHiMm.mjs → ComponentConfigurationPage-Diwy7rap.mjs} +3 -3
  4. package/dist/_chunks/{ComponentConfigurationPage-BAgyHiMm.mjs.map → ComponentConfigurationPage-Diwy7rap.mjs.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-DmoXawIh.mjs → EditConfigurationPage-C62aCKGN.mjs} +3 -3
  6. package/dist/_chunks/{EditConfigurationPage-DmoXawIh.mjs.map → EditConfigurationPage-C62aCKGN.mjs.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-Xp7lun0f.js → EditConfigurationPage-DCyvZplh.js} +3 -3
  8. package/dist/_chunks/{EditConfigurationPage-Xp7lun0f.js.map → EditConfigurationPage-DCyvZplh.js.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-BLsjc5F-.mjs → EditViewPage-D7pEHIUi.mjs} +3 -3
  10. package/dist/_chunks/{EditViewPage-BLsjc5F-.mjs.map → EditViewPage-D7pEHIUi.mjs.map} +1 -1
  11. package/dist/_chunks/{EditViewPage-C-ukDOB7.js → EditViewPage-Q1iL6Yjq.js} +3 -3
  12. package/dist/_chunks/{EditViewPage-C-ukDOB7.js.map → EditViewPage-Q1iL6Yjq.js.map} +1 -1
  13. package/dist/_chunks/{Field-Cs7duwWd.mjs → Field-B5WAARex.mjs} +3 -3
  14. package/dist/_chunks/Field-B5WAARex.mjs.map +1 -0
  15. package/dist/_chunks/{Field-Bfph5SOd.js → Field-tNsYzab8.js} +3 -3
  16. package/dist/_chunks/Field-tNsYzab8.js.map +1 -0
  17. package/dist/_chunks/{Form-CPYqIWDG.js → Form-BLOtEgdG.js} +2 -2
  18. package/dist/_chunks/{Form-CPYqIWDG.js.map → Form-BLOtEgdG.js.map} +1 -1
  19. package/dist/_chunks/{Form-Dg_GS5TQ.mjs → Form-BdgxktG0.mjs} +2 -2
  20. package/dist/_chunks/{Form-Dg_GS5TQ.mjs.map → Form-BdgxktG0.mjs.map} +1 -1
  21. package/dist/_chunks/{History-DNQkXANT.js → History-CNQ3y0Td.js} +4 -4
  22. package/dist/_chunks/{History-DNQkXANT.js.map → History-CNQ3y0Td.js.map} +1 -1
  23. package/dist/_chunks/{History-wrnHqf09.mjs → History-DCbphAxD.mjs} +4 -4
  24. package/dist/_chunks/{History-wrnHqf09.mjs.map → History-DCbphAxD.mjs.map} +1 -1
  25. package/dist/_chunks/{ListConfigurationPage-CUQxfpjT.js → ListConfigurationPage-CGiDaV99.js} +2 -2
  26. package/dist/_chunks/{ListConfigurationPage-CUQxfpjT.js.map → ListConfigurationPage-CGiDaV99.js.map} +1 -1
  27. package/dist/_chunks/{ListConfigurationPage-DScmJVkW.mjs → ListConfigurationPage-DfvPhk6u.mjs} +2 -2
  28. package/dist/_chunks/{ListConfigurationPage-DScmJVkW.mjs.map → ListConfigurationPage-DfvPhk6u.mjs.map} +1 -1
  29. package/dist/_chunks/{ListViewPage-BsLiH2-2.js → ListViewPage-BoBeCtmC.js} +9 -4
  30. package/dist/_chunks/ListViewPage-BoBeCtmC.js.map +1 -0
  31. package/dist/_chunks/{ListViewPage-C4IvrMgY.mjs → ListViewPage-D4UEitVJ.mjs} +10 -5
  32. package/dist/_chunks/ListViewPage-D4UEitVJ.mjs.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-Djg8nPlj.mjs → NoContentTypePage-Dg8RTwSG.mjs} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-Djg8nPlj.mjs.map → NoContentTypePage-Dg8RTwSG.mjs.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-BZ-PnGAf.js → NoContentTypePage-r8lNSL9g.js} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-BZ-PnGAf.js.map → NoContentTypePage-r8lNSL9g.js.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-_lUqjGW3.js → NoPermissionsPage-C-4rQU7A.js} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-_lUqjGW3.js.map → NoPermissionsPage-C-4rQU7A.js.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-DSP7R-hv.mjs → NoPermissionsPage-Kpz9mv4K.mjs} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-DSP7R-hv.mjs.map → NoPermissionsPage-Kpz9mv4K.mjs.map} +1 -1
  41. package/dist/_chunks/{Relations-CtELXYIK.js → Relations-DORNjmbK.js} +3 -3
  42. package/dist/_chunks/{Relations-CtELXYIK.js.map → Relations-DORNjmbK.js.map} +1 -1
  43. package/dist/_chunks/{Relations-BZr8tL0R.mjs → Relations-Q66m8cnC.mjs} +3 -3
  44. package/dist/_chunks/{Relations-BZr8tL0R.mjs.map → Relations-Q66m8cnC.mjs.map} +1 -1
  45. package/dist/_chunks/{index-OerGjbAN.js → index-B74KYy73.js} +28 -36
  46. package/dist/_chunks/index-B74KYy73.js.map +1 -0
  47. package/dist/_chunks/{index-c_5DdJi-.mjs → index-CW--YEA6.mjs} +29 -37
  48. package/dist/_chunks/index-CW--YEA6.mjs.map +1 -0
  49. package/dist/_chunks/{layout-oPBiO7RY.mjs → layout-CcKSoI_3.mjs} +17 -5
  50. package/dist/_chunks/{layout-oPBiO7RY.mjs.map → layout-CcKSoI_3.mjs.map} +1 -1
  51. package/dist/_chunks/{layout-Ci7qHlFb.js → layout-CwR7rEv4.js} +16 -4
  52. package/dist/_chunks/{layout-Ci7qHlFb.js.map → layout-CwR7rEv4.js.map} +1 -1
  53. package/dist/_chunks/{relations-BIdWFjdq.mjs → relations-Dsery6I2.mjs} +2 -2
  54. package/dist/_chunks/{relations-BIdWFjdq.mjs.map → relations-Dsery6I2.mjs.map} +1 -1
  55. package/dist/_chunks/{relations-COBpStiF.js → relations-S1dd0utS.js} +2 -2
  56. package/dist/_chunks/{relations-COBpStiF.js.map → relations-S1dd0utS.js.map} +1 -1
  57. package/dist/admin/index.js +1 -1
  58. package/dist/admin/index.mjs +1 -1
  59. package/dist/server/index.js +98 -58
  60. package/dist/server/index.js.map +1 -1
  61. package/dist/server/index.mjs +99 -59
  62. package/dist/server/index.mjs.map +1 -1
  63. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  64. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  65. package/dist/server/src/history/services/utils.d.ts +1 -1
  66. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  67. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  68. package/package.json +6 -6
  69. package/dist/_chunks/Field-Bfph5SOd.js.map +0 -1
  70. package/dist/_chunks/Field-Cs7duwWd.mjs.map +0 -1
  71. package/dist/_chunks/ListViewPage-BsLiH2-2.js.map +0 -1
  72. package/dist/_chunks/ListViewPage-C4IvrMgY.mjs.map +0 -1
  73. package/dist/_chunks/index-OerGjbAN.js.map +0 -1
  74. package/dist/_chunks/index-c_5DdJi-.mjs.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, intersection, pipe, propOr, isEqual, isEmpty, set, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, isNil as isNil$1, getOr, propEq, merge, groupBy, castArray } from "lodash/fp";
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";
3
3
  import "@strapi/types";
4
4
  import * as yup from "yup";
5
5
  import { scheduleJob } from "node-schedule";
@@ -200,9 +200,10 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
200
200
  const meta = await documentMetadataService.getMetadata(contentTypeUid, document);
201
201
  return documentMetadataService.getStatus(document, meta.availableStatus);
202
202
  };
203
- const getDeepPopulate2 = (uid2) => {
203
+ const getDeepPopulate2 = (uid2, useDatabaseSyntax = false) => {
204
204
  const model = strapi2.getModel(uid2);
205
205
  const attributes = Object.entries(model.attributes);
206
+ const fieldSelector = useDatabaseSyntax ? "select" : "fields";
206
207
  return attributes.reduce((acc, [attributeName, attribute]) => {
207
208
  switch (attribute.type) {
208
209
  case "relation": {
@@ -212,12 +213,12 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
212
213
  }
213
214
  const isVisible2 = contentTypes$1.isVisibleAttribute(model, attributeName);
214
215
  if (isVisible2) {
215
- acc[attributeName] = { fields: ["documentId", "locale", "publishedAt"] };
216
+ acc[attributeName] = { [fieldSelector]: ["documentId", "locale", "publishedAt"] };
216
217
  }
217
218
  break;
218
219
  }
219
220
  case "media": {
220
- acc[attributeName] = { fields: ["id"] };
221
+ acc[attributeName] = { [fieldSelector]: ["id"] };
221
222
  break;
222
223
  }
223
224
  case "component": {
@@ -468,6 +469,42 @@ const createHistoryService = ({ strapi: strapi2 }) => {
468
469
  }
469
470
  };
470
471
  };
472
+ const shouldCreateHistoryVersion = (context) => {
473
+ if (!strapi.requestContext.get()?.request.url.startsWith("/content-manager")) {
474
+ return false;
475
+ }
476
+ if (context.action !== "create" && context.action !== "update" && context.action !== "clone" && context.action !== "publish" && context.action !== "unpublish" && context.action !== "discardDraft") {
477
+ return false;
478
+ }
479
+ if (context.action === "update" && strapi.requestContext.get()?.request.url.endsWith("/actions/publish")) {
480
+ return false;
481
+ }
482
+ if (!context.contentType.uid.startsWith("api::")) {
483
+ return false;
484
+ }
485
+ return true;
486
+ };
487
+ const getSchemas = (uid2) => {
488
+ const attributesSchema = strapi.getModel(uid2).attributes;
489
+ const componentsSchemas = Object.keys(attributesSchema).reduce(
490
+ (currentComponentSchemas, key) => {
491
+ const fieldSchema = attributesSchema[key];
492
+ if (fieldSchema.type === "component") {
493
+ const componentSchema = strapi.getModel(fieldSchema.component).attributes;
494
+ return {
495
+ ...currentComponentSchemas,
496
+ [fieldSchema.component]: componentSchema
497
+ };
498
+ }
499
+ return currentComponentSchemas;
500
+ },
501
+ {}
502
+ );
503
+ return {
504
+ schema: omit(FIELDS_TO_IGNORE, attributesSchema),
505
+ componentsSchemas
506
+ };
507
+ };
471
508
  const createLifecyclesService = ({ strapi: strapi2 }) => {
472
509
  const state = {
473
510
  deleteExpiredJob: null,
@@ -480,63 +517,43 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
480
517
  return;
481
518
  }
482
519
  strapi2.documents.use(async (context, next) => {
483
- if (!strapi2.requestContext.get()?.request.url.startsWith("/content-manager")) {
484
- return next();
485
- }
486
- if (context.action !== "create" && context.action !== "update" && context.action !== "clone" && context.action !== "publish" && context.action !== "unpublish" && context.action !== "discardDraft") {
487
- return next();
488
- }
489
- if (context.action === "update" && strapi2.requestContext.get()?.request.url.endsWith("/actions/publish")) {
490
- return next();
491
- }
492
- const contentTypeUid = context.contentType.uid;
493
- if (!contentTypeUid.startsWith("api::")) {
494
- return next();
495
- }
496
520
  const result = await next();
497
- const documentContext = {
498
- documentId: context.action === "create" || context.action === "clone" ? result.documentId : context.params.documentId,
499
- locale: context.params?.locale
500
- };
521
+ if (!shouldCreateHistoryVersion(context)) {
522
+ return result;
523
+ }
524
+ const documentId = context.action === "create" || context.action === "clone" ? result.documentId : context.params.documentId;
501
525
  const defaultLocale = await serviceUtils.getDefaultLocale();
502
- const locale = documentContext.locale || defaultLocale;
503
- if (Array.isArray(locale)) {
504
- strapi2.log.warn(
505
- "[Content manager history middleware]: An array of locales was provided, but only a single locale is supported for the findOne operation."
506
- );
507
- return next();
526
+ const locales = castArray(context.params?.locale || defaultLocale);
527
+ if (!locales.length) {
528
+ return result;
508
529
  }
509
- const document = await strapi2.documents(contentTypeUid).findOne({
510
- documentId: documentContext.documentId,
511
- locale,
512
- populate: serviceUtils.getDeepPopulate(contentTypeUid)
530
+ const uid2 = context.contentType.uid;
531
+ const schemas = getSchemas(uid2);
532
+ const localeEntries = await strapi2.db.query(uid2).findMany({
533
+ where: {
534
+ documentId,
535
+ locale: { $in: locales },
536
+ publishedAt: null
537
+ },
538
+ populate: serviceUtils.getDeepPopulate(
539
+ uid2,
540
+ true
541
+ /* use database syntax */
542
+ )
513
543
  });
514
- const status = await serviceUtils.getVersionStatus(contentTypeUid, document);
515
- const attributesSchema = strapi2.getModel(contentTypeUid).attributes;
516
- const componentsSchemas = Object.keys(
517
- attributesSchema
518
- ).reduce((currentComponentSchemas, key) => {
519
- const fieldSchema = attributesSchema[key];
520
- if (fieldSchema.type === "component") {
521
- const componentSchema = strapi2.getModel(fieldSchema.component).attributes;
522
- return {
523
- ...currentComponentSchemas,
524
- [fieldSchema.component]: componentSchema
525
- };
526
- }
527
- return currentComponentSchemas;
528
- }, {});
529
544
  await strapi2.db.transaction(async ({ onCommit }) => {
530
- onCommit(() => {
531
- getService(strapi2, "history").createVersion({
532
- contentType: contentTypeUid,
533
- data: omit(FIELDS_TO_IGNORE, document),
534
- schema: omit(FIELDS_TO_IGNORE, attributesSchema),
535
- componentsSchemas,
536
- relatedDocumentId: documentContext.documentId,
537
- locale,
538
- status
539
- });
545
+ onCommit(async () => {
546
+ for (const entry of localeEntries) {
547
+ const status = await serviceUtils.getVersionStatus(uid2, entry);
548
+ await getService(strapi2, "history").createVersion({
549
+ contentType: uid2,
550
+ data: omit(FIELDS_TO_IGNORE, entry),
551
+ relatedDocumentId: documentId,
552
+ locale: entry.locale,
553
+ status,
554
+ ...schemas
555
+ });
556
+ }
540
557
  });
541
558
  });
542
559
  return result;
@@ -1854,11 +1871,28 @@ const collectionTypes = {
1854
1871
  const publishedDocument = await strapi.db.transaction(async () => {
1855
1872
  const permissionQuery = await permissionChecker2.sanitizedQuery.publish(ctx.query);
1856
1873
  const populate = await getService$1("populate-builder")(model).populateFromQuery(permissionQuery).populateDeep(Infinity).countRelations().build();
1857
- const document = id ? await updateDocument(ctx, { populate }) : await createDocument(ctx, { populate });
1874
+ let document;
1875
+ const { locale } = await getDocumentLocaleAndStatus(body, model);
1876
+ const isCreate = isNil$1(id);
1877
+ if (isCreate) {
1878
+ if (permissionChecker2.cannot.create()) {
1879
+ throw new errors.ForbiddenError();
1880
+ }
1881
+ document = await createDocument(ctx, { populate });
1882
+ }
1883
+ const isUpdate = !isCreate;
1884
+ if (isUpdate) {
1885
+ document = await documentManager2.findOne(id, model, { populate, locale });
1886
+ if (!document) {
1887
+ throw new errors.NotFoundError("Document not found");
1888
+ }
1889
+ if (permissionChecker2.can.update(document)) {
1890
+ await updateDocument(ctx);
1891
+ }
1892
+ }
1858
1893
  if (permissionChecker2.cannot.publish(document)) {
1859
1894
  throw new errors.ForbiddenError();
1860
1895
  }
1861
- const { locale } = await getDocumentLocaleAndStatus(body, model);
1862
1896
  const publishResult = await documentManager2.publish(document.documentId, model, {
1863
1897
  locale
1864
1898
  // TODO: Allow setting creator fields on publish
@@ -4107,7 +4141,13 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4107
4141
  */
4108
4142
  async formatDocumentWithMetadata(uid2, document, opts = {}) {
4109
4143
  if (!document) {
4110
- return document;
4144
+ return {
4145
+ data: document,
4146
+ meta: {
4147
+ availableLocales: [],
4148
+ availableStatus: []
4149
+ }
4150
+ };
4111
4151
  }
4112
4152
  const hasDraftAndPublish = contentTypes$1.hasDraftAndPublish(strapi2.getModel(uid2));
4113
4153
  if (!hasDraftAndPublish) {