@strapi/content-manager 5.0.0-rc.8 → 5.0.0

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 (119) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-D0dyDTwq.mjs → ComponentConfigurationPage-DfFSZQxe.mjs} +3 -3
  2. package/dist/_chunks/{ComponentConfigurationPage-D0dyDTwq.mjs.map → ComponentConfigurationPage-DfFSZQxe.mjs.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-DL1MHO8i.js → ComponentConfigurationPage-FqfsxQ1j.js} +3 -3
  4. package/dist/_chunks/{ComponentConfigurationPage-DL1MHO8i.js.map → ComponentConfigurationPage-FqfsxQ1j.js.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-CMaOf-A-.js → EditConfigurationPage-Cn0e8t3I.js} +3 -3
  6. package/dist/_chunks/{EditConfigurationPage-CMaOf-A-.js.map → EditConfigurationPage-Cn0e8t3I.js.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-13b7S5Cq.mjs → EditConfigurationPage-DdPNAbl3.mjs} +3 -3
  8. package/dist/_chunks/{EditConfigurationPage-13b7S5Cq.mjs.map → EditConfigurationPage-DdPNAbl3.mjs.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-C3tIZ8F5.mjs → EditViewPage-B82x_x1b.mjs} +30 -9
  10. package/dist/_chunks/EditViewPage-B82x_x1b.mjs.map +1 -0
  11. package/dist/_chunks/{EditViewPage-BSVmMpRd.js → EditViewPage-DlxEHhUt.js} +30 -9
  12. package/dist/_chunks/EditViewPage-DlxEHhUt.js.map +1 -0
  13. package/dist/_chunks/{Field-DUCVth4C.js → Field-COL25JiC.js} +174 -102
  14. package/dist/_chunks/Field-COL25JiC.js.map +1 -0
  15. package/dist/_chunks/{Field-BvuT8cGL.mjs → Field-DufHXW17.mjs} +172 -100
  16. package/dist/_chunks/Field-DufHXW17.mjs.map +1 -0
  17. package/dist/_chunks/{Form-Cpl4W1ak.js → Form-BssUwrTO.js} +36 -17
  18. package/dist/_chunks/Form-BssUwrTO.js.map +1 -0
  19. package/dist/_chunks/{Form-BZmDNVr9.mjs → Form-u_kAOhwB.mjs} +36 -17
  20. package/dist/_chunks/Form-u_kAOhwB.mjs.map +1 -0
  21. package/dist/_chunks/{History-D4U2YISB.js → History-C9t9UqpO.js} +23 -10
  22. package/dist/_chunks/History-C9t9UqpO.js.map +1 -0
  23. package/dist/_chunks/{History-Cq_Hrzuu.mjs → History-DRwA3oMM.mjs} +24 -11
  24. package/dist/_chunks/History-DRwA3oMM.mjs.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-Bny6CdWe.js → ListConfigurationPage-BXYPohh-.js} +14 -4
  26. package/dist/_chunks/ListConfigurationPage-BXYPohh-.js.map +1 -0
  27. package/dist/_chunks/{ListConfigurationPage-W-KQHmBv.mjs → ListConfigurationPage-BxfQJzPk.mjs} +14 -4
  28. package/dist/_chunks/ListConfigurationPage-BxfQJzPk.mjs.map +1 -0
  29. package/dist/_chunks/{ListViewPage-HBBnJa8K.mjs → ListViewPage-CELx2ysp.mjs} +40 -36
  30. package/dist/_chunks/ListViewPage-CELx2ysp.mjs.map +1 -0
  31. package/dist/_chunks/{ListViewPage-O8F1pBJo.js → ListViewPage-D2VD8Szg.js} +43 -39
  32. package/dist/_chunks/ListViewPage-D2VD8Szg.js.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-CQWChGPw.js → NoContentTypePage-BV9IjJSM.js} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-CQWChGPw.js.map → NoContentTypePage-BV9IjJSM.js.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-B-gIhHWM.mjs → NoContentTypePage-DtJ9jcfk.mjs} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-B-gIhHWM.mjs.map → NoContentTypePage-DtJ9jcfk.mjs.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-XhOPl8wx.mjs → NoPermissionsPage-DWleVYK7.mjs} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-XhOPl8wx.mjs.map → NoPermissionsPage-DWleVYK7.mjs.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-CY46zxnM.js → NoPermissionsPage-Dp8NpF9I.js} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-CY46zxnM.js.map → NoPermissionsPage-Dp8NpF9I.js.map} +1 -1
  41. package/dist/_chunks/{Relations-vFZ6Wasg.mjs → Relations-BTcf5xaw.mjs} +33 -24
  42. package/dist/_chunks/Relations-BTcf5xaw.mjs.map +1 -0
  43. package/dist/_chunks/{Relations-C4gGfZRv.js → Relations-DR7EUgyC.js} +33 -24
  44. package/dist/_chunks/Relations-DR7EUgyC.js.map +1 -0
  45. package/dist/_chunks/{en-uOUIxfcQ.js → en-Bm0D0IWz.js} +13 -12
  46. package/dist/_chunks/{en-uOUIxfcQ.js.map → en-Bm0D0IWz.js.map} +1 -1
  47. package/dist/_chunks/{en-BrCTWlZv.mjs → en-DKV44jRb.mjs} +13 -12
  48. package/dist/_chunks/{en-BrCTWlZv.mjs.map → en-DKV44jRb.mjs.map} +1 -1
  49. package/dist/_chunks/{index-5EMXLEM_.js → index-BdMf2lfT.js} +1899 -1742
  50. package/dist/_chunks/index-BdMf2lfT.js.map +1 -0
  51. package/dist/_chunks/{index-Dpxg3ctD.mjs → index-wnqzm4Q8.mjs} +1919 -1762
  52. package/dist/_chunks/index-wnqzm4Q8.mjs.map +1 -0
  53. package/dist/_chunks/{layout-C0INpKap.mjs → layout-2CfjL0T9.mjs} +8 -7
  54. package/dist/_chunks/layout-2CfjL0T9.mjs.map +1 -0
  55. package/dist/_chunks/{layout-P3eKO1Qy.js → layout-B2MyZU-_.js} +8 -7
  56. package/dist/_chunks/layout-B2MyZU-_.js.map +1 -0
  57. package/dist/_chunks/{relations-B1y0K6LE.js → relations-BH7JJGGe.js} +2 -2
  58. package/dist/_chunks/{relations-B1y0K6LE.js.map → relations-BH7JJGGe.js.map} +1 -1
  59. package/dist/_chunks/{relations-FBRRBWeO.mjs → relations-C0w0GcXi.mjs} +2 -2
  60. package/dist/_chunks/{relations-FBRRBWeO.mjs.map → relations-C0w0GcXi.mjs.map} +1 -1
  61. package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
  62. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
  63. package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
  64. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
  65. package/dist/admin/index.js +2 -1
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/index.mjs +5 -4
  68. package/dist/admin/src/exports.d.ts +1 -1
  69. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  70. package/dist/admin/src/hooks/useDocument.d.ts +32 -1
  71. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  72. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
  73. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +4 -48
  74. package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
  75. package/dist/admin/src/services/api.d.ts +1 -1
  76. package/dist/admin/src/services/components.d.ts +2 -2
  77. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  78. package/dist/admin/src/services/documents.d.ts +19 -17
  79. package/dist/admin/src/services/init.d.ts +1 -1
  80. package/dist/admin/src/services/relations.d.ts +2 -2
  81. package/dist/admin/src/services/uid.d.ts +3 -3
  82. package/dist/admin/src/utils/validation.d.ts +4 -1
  83. package/dist/server/index.js +77 -39
  84. package/dist/server/index.js.map +1 -1
  85. package/dist/server/index.mjs +77 -39
  86. package/dist/server/index.mjs.map +1 -1
  87. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  88. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  89. package/dist/server/src/history/services/history.d.ts.map +1 -1
  90. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  91. package/dist/server/src/history/services/utils.d.ts +1 -0
  92. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  93. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  94. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  95. package/dist/shared/contracts/collection-types.d.ts +3 -1
  96. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  97. package/package.json +12 -12
  98. package/dist/_chunks/EditViewPage-BSVmMpRd.js.map +0 -1
  99. package/dist/_chunks/EditViewPage-C3tIZ8F5.mjs.map +0 -1
  100. package/dist/_chunks/Field-BvuT8cGL.mjs.map +0 -1
  101. package/dist/_chunks/Field-DUCVth4C.js.map +0 -1
  102. package/dist/_chunks/Form-BZmDNVr9.mjs.map +0 -1
  103. package/dist/_chunks/Form-Cpl4W1ak.js.map +0 -1
  104. package/dist/_chunks/History-Cq_Hrzuu.mjs.map +0 -1
  105. package/dist/_chunks/History-D4U2YISB.js.map +0 -1
  106. package/dist/_chunks/ListConfigurationPage-Bny6CdWe.js.map +0 -1
  107. package/dist/_chunks/ListConfigurationPage-W-KQHmBv.mjs.map +0 -1
  108. package/dist/_chunks/ListViewPage-HBBnJa8K.mjs.map +0 -1
  109. package/dist/_chunks/ListViewPage-O8F1pBJo.js.map +0 -1
  110. package/dist/_chunks/Relations-C4gGfZRv.js.map +0 -1
  111. package/dist/_chunks/Relations-vFZ6Wasg.mjs.map +0 -1
  112. package/dist/_chunks/index-5EMXLEM_.js.map +0 -1
  113. package/dist/_chunks/index-Dpxg3ctD.mjs.map +0 -1
  114. package/dist/_chunks/layout-C0INpKap.mjs.map +0 -1
  115. package/dist/_chunks/layout-P3eKO1Qy.js.map +0 -1
  116. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  117. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  118. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
  119. package/strapi-server.js +0 -3
@@ -199,7 +199,9 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
199
199
  return strapi2.db.query("plugin::upload.file").findOne({ where: { id: versionRelationData.id } });
200
200
  };
201
201
  const localesService = strapi2.plugin("i18n")?.service("locales");
202
+ const i18nContentTypeService = strapi2.plugin("i18n")?.service("content-types");
202
203
  const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
204
+ const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
203
205
  const getLocaleDictionary = async () => {
204
206
  if (!localesService)
205
207
  return {};
@@ -317,6 +319,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
317
319
  getRelationRestoreValue,
318
320
  getMediaRestoreValue,
319
321
  getDefaultLocale,
322
+ isLocalizedContentType,
320
323
  getLocaleDictionary,
321
324
  getRetentionDays,
322
325
  getVersionStatus,
@@ -339,7 +342,13 @@ const createHistoryService = ({ strapi: strapi2 }) => {
339
342
  });
340
343
  },
341
344
  async findVersionsPage(params) {
342
- const locale = params.query.locale || await serviceUtils.getDefaultLocale();
345
+ const model = strapi2.getModel(params.query.contentType);
346
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
347
+ const defaultLocale = await serviceUtils.getDefaultLocale();
348
+ let locale = null;
349
+ if (isLocalizedContentType) {
350
+ locale = params.query.locale || defaultLocale;
351
+ }
343
352
  const [{ results, pagination }, localeDictionary] = await Promise.all([
344
353
  query.findPage({
345
354
  ...params.query,
@@ -384,7 +393,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
384
393
  if (userToPopulate == null) {
385
394
  return null;
386
395
  }
387
- return strapi2.query("admin::user").findOne({ where: { id: userToPopulate.id } });
396
+ return strapi2.query("admin::user").findOne({
397
+ where: {
398
+ ...userToPopulate.id ? { id: userToPopulate.id } : {},
399
+ ...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
400
+ }
401
+ });
388
402
  })
389
403
  );
390
404
  return {
@@ -555,11 +569,13 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
555
569
  }
556
570
  const uid2 = context.contentType.uid;
557
571
  const schemas = getSchemas(uid2);
572
+ const model = strapi2.getModel(uid2);
573
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
558
574
  const localeEntries = await strapi2.db.query(uid2).findMany({
559
575
  where: {
560
576
  documentId,
561
- locale: { $in: locales },
562
- publishedAt: null
577
+ ...isLocalizedContentType ? { locale: { $in: locales } } : {},
578
+ ...strapiUtils.contentTypes.hasDraftAndPublish(strapi2.contentTypes[uid2]) ? { publishedAt: null } : {}
563
579
  },
564
580
  populate: serviceUtils.getDeepPopulate(
565
581
  uid2,
@@ -1219,6 +1235,11 @@ const { createPolicy } = strapiUtils.policy;
1219
1235
  const hasPermissions = createPolicy({
1220
1236
  name: "plugin::content-manager.hasPermissions",
1221
1237
  validator: validateHasPermissionsInput,
1238
+ /**
1239
+ * NOTE: Action aliases are currently not checked at this level (policy).
1240
+ * This is currently the intended behavior to avoid changing the behavior of API related permissions.
1241
+ * If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
1242
+ */
1222
1243
  handler(ctx, config = {}) {
1223
1244
  const { actions = [], hasAtLeastOne = false } = config;
1224
1245
  const { userAbility } = ctx.state;
@@ -1699,7 +1720,7 @@ const updateDocument = async (ctx, opts) => {
1699
1720
  throw new strapiUtils.errors.ForbiddenError();
1700
1721
  }
1701
1722
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1702
- const setCreator = strapiUtils.setCreatorFields({ user, isEdition: true });
1723
+ const setCreator = documentVersion ? strapiUtils.setCreatorFields({ user, isEdition: true }) : strapiUtils.setCreatorFields({ user });
1703
1724
  const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
1704
1725
  const sanitizedBody = await sanitizeFn(body);
1705
1726
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1771,7 +1792,7 @@ const collectionTypes = {
1771
1792
  permissionChecker2,
1772
1793
  model,
1773
1794
  // @ts-expect-error TODO: fix
1774
- { id, locale, publishedAt: null },
1795
+ { documentId: id, locale, publishedAt: null },
1775
1796
  { availableLocales: true, availableStatus: false }
1776
1797
  );
1777
1798
  ctx.body = { data: {}, meta };
@@ -1908,11 +1929,17 @@ const collectionTypes = {
1908
1929
  }
1909
1930
  const isUpdate = !isCreate;
1910
1931
  if (isUpdate) {
1911
- document = await documentManager2.findOne(id, model, { populate, locale });
1912
- if (!document) {
1932
+ const documentExists = documentManager2.exists(model, id);
1933
+ if (!documentExists) {
1913
1934
  throw new strapiUtils.errors.NotFoundError("Document not found");
1914
1935
  }
1915
- if (permissionChecker2.can.update(document)) {
1936
+ document = await documentManager2.findOne(id, model, { populate, locale });
1937
+ if (!document) {
1938
+ if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
1939
+ throw new strapiUtils.errors.ForbiddenError();
1940
+ }
1941
+ document = await updateDocument(ctx);
1942
+ } else if (permissionChecker2.can.update(document)) {
1916
1943
  await updateDocument(ctx);
1917
1944
  }
1918
1945
  }
@@ -1974,7 +2001,9 @@ const collectionTypes = {
1974
2001
  if (permissionChecker2.cannot.unpublish()) {
1975
2002
  return ctx.forbidden();
1976
2003
  }
1977
- const { locale } = await getDocumentLocaleAndStatus(body, model);
2004
+ const { locale } = await getDocumentLocaleAndStatus(body, model, {
2005
+ allowMultipleLocales: true
2006
+ });
1978
2007
  const entityPromises = documentIds.map(
1979
2008
  (documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
1980
2009
  );
@@ -2325,20 +2354,13 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2325
2354
  userAbility,
2326
2355
  model: model.uid
2327
2356
  });
2328
- if (!isListable(model, mainField)) {
2357
+ const isMainFieldListable = isListable(model, mainField);
2358
+ const canReadMainField = permissionChecker2.can.read(null, mainField);
2359
+ if (!isMainFieldListable || !canReadMainField) {
2329
2360
  return "id";
2330
2361
  }
2331
- if (permissionChecker2.cannot.read(null, mainField)) {
2332
- if (model.uid === "plugin::users-permissions.role") {
2333
- const userPermissionChecker = getService$1("permission-checker").create({
2334
- userAbility,
2335
- model: "plugin::users-permissions.user"
2336
- });
2337
- if (userPermissionChecker.can.read()) {
2338
- return "name";
2339
- }
2340
- }
2341
- return "id";
2362
+ if (model.uid === "plugin::users-permissions.role") {
2363
+ return "name";
2342
2364
  }
2343
2365
  return mainField;
2344
2366
  };
@@ -2371,11 +2393,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2371
2393
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2372
2394
  const isSourceLocalized = isLocalized(sourceModel);
2373
2395
  const isTargetLocalized = isLocalized(targetModel);
2374
- let validatedLocale = locale;
2375
- if (!targetModel || !isTargetLocalized)
2376
- validatedLocale = void 0;
2377
2396
  return {
2378
- locale: validatedLocale,
2397
+ locale,
2379
2398
  isSourceLocalized,
2380
2399
  isTargetLocalized
2381
2400
  };
@@ -2478,7 +2497,7 @@ const relations = {
2478
2497
  attribute,
2479
2498
  fieldsToSelect,
2480
2499
  mainField,
2481
- source: { schema: sourceSchema },
2500
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2482
2501
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2483
2502
  sourceSchema,
2484
2503
  targetSchema,
@@ -2500,7 +2519,8 @@ const relations = {
2500
2519
  fieldsToSelect,
2501
2520
  mainField,
2502
2521
  source: {
2503
- schema: { uid: sourceUid, modelType: sourceModelType }
2522
+ schema: { uid: sourceUid, modelType: sourceModelType },
2523
+ isLocalized: isSourceLocalized
2504
2524
  },
2505
2525
  target: {
2506
2526
  schema: { uid: targetUid },
@@ -2538,12 +2558,16 @@ const relations = {
2538
2558
  } else {
2539
2559
  where.id = id;
2540
2560
  }
2541
- if (status) {
2542
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2561
+ const publishedAt = getPublishedAtClause(status, targetUid);
2562
+ if (!fp.isEmpty(publishedAt)) {
2563
+ where[`${alias}.published_at`] = publishedAt;
2543
2564
  }
2544
- if (filterByLocale) {
2565
+ if (isTargetLocalized && locale) {
2545
2566
  where[`${alias}.locale`] = locale;
2546
2567
  }
2568
+ if (isSourceLocalized && locale) {
2569
+ where.locale = locale;
2570
+ }
2547
2571
  if ((idsToInclude?.length ?? 0) !== 0) {
2548
2572
  where[`${alias}.id`].$notIn = idsToInclude;
2549
2573
  }
@@ -2561,7 +2585,8 @@ const relations = {
2561
2585
  id: { $notIn: fp.uniq(idsToOmit) }
2562
2586
  });
2563
2587
  }
2564
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2588
+ const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
2589
+ const res = await strapi.db.query(targetUid).findPage(dbQuery);
2565
2590
  ctx.body = {
2566
2591
  ...res,
2567
2592
  results: await addStatusToRelations(targetUid, res.results)
@@ -2596,9 +2621,7 @@ const relations = {
2596
2621
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
2597
2622
  const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
2598
2623
  ...strapi.get("query-params").transform(targetUid, permissionQuery),
2599
- ordering: "desc",
2600
- page: ctx.request.query.page,
2601
- pageSize: ctx.request.query.pageSize
2624
+ ordering: "desc"
2602
2625
  });
2603
2626
  const relationsUnion = fp.uniqBy("id", fp.concat(sanitizedRes.results, res.results));
2604
2627
  ctx.body = {
@@ -2685,7 +2708,7 @@ const singleTypes = {
2685
2708
  permissionChecker2,
2686
2709
  model,
2687
2710
  // @ts-expect-error - fix types
2688
- { id: document.documentId, locale, publishedAt: null },
2711
+ { documentId: document.documentId, locale, publishedAt: null },
2689
2712
  { availableLocales: true, availableStatus: false }
2690
2713
  );
2691
2714
  ctx.body = { data: {}, meta };
@@ -3504,12 +3527,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
3504
3527
  ability: userAbility,
3505
3528
  model
3506
3529
  });
3507
- const toSubject = (entity) => entity ? permissionsManager.toSubject(entity, model) : model;
3530
+ const { actionProvider } = strapi2.service("admin::permission");
3531
+ const toSubject = (entity) => {
3532
+ return entity ? permissionsManager.toSubject(entity, model) : model;
3533
+ };
3508
3534
  const can = (action, entity, field) => {
3509
- return userAbility.can(action, toSubject(entity), field);
3535
+ const subject = toSubject(entity);
3536
+ const aliases = actionProvider.unstable_aliases(action, model);
3537
+ return (
3538
+ // Test the original action to see if it passes
3539
+ userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
3540
+ aliases.some((alias) => userAbility.can(alias, subject, field))
3541
+ );
3510
3542
  };
3511
3543
  const cannot = (action, entity, field) => {
3512
- return userAbility.cannot(action, toSubject(entity), field);
3544
+ const subject = toSubject(entity);
3545
+ const aliases = actionProvider.unstable_aliases(action, model);
3546
+ return (
3547
+ // Test both the original action
3548
+ userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
3549
+ aliases.every((alias) => userAbility.cannot(alias, subject, field))
3550
+ );
3513
3551
  };
3514
3552
  const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
3515
3553
  return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });