@strapi/content-releases 5.0.0-beta.0 → 5.0.0-beta.10

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 (71) hide show
  1. package/dist/_chunks/{App-IkyOz9wq.mjs → App-B2R2exNT.mjs} +257 -256
  2. package/dist/_chunks/App-B2R2exNT.mjs.map +1 -0
  3. package/dist/_chunks/{App-FuRaphre.js → App-CEwOQkKT.js} +265 -265
  4. package/dist/_chunks/App-CEwOQkKT.js.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-Be3acS2L.js} +8 -7
  6. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +9 -8
  8. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  9. package/dist/_chunks/{en-RdapH-9X.mjs → en-B9Ur3VsE.mjs} +11 -2
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-faJDuv3q.js → en-DtFJ5ViE.js} +11 -2
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-Sb3Nal8H.js → index-BrWv-zV4.js} +169 -193
  14. package/dist/_chunks/index-BrWv-zV4.js.map +1 -0
  15. package/dist/_chunks/{index-qP3rNiDS.mjs → index-DbmynICx.mjs} +170 -192
  16. package/dist/_chunks/index-DbmynICx.mjs.map +1 -0
  17. package/dist/admin/index.js +1 -1
  18. package/dist/admin/index.mjs +2 -2
  19. package/dist/admin/src/components/CMReleasesContainer.d.ts +21 -0
  20. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  21. package/dist/admin/src/components/ReleaseActionMenu.d.ts +1 -1
  22. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  23. package/dist/admin/src/components/ReleaseModal.d.ts +3 -2
  24. package/dist/admin/src/services/release.d.ts +56 -320
  25. package/dist/admin/src/utils/api.d.ts +6 -0
  26. package/dist/server/index.js +101 -52
  27. package/dist/server/index.js.map +1 -1
  28. package/dist/server/index.mjs +102 -53
  29. package/dist/server/index.mjs.map +1 -1
  30. package/dist/server/src/bootstrap.d.ts +2 -2
  31. package/dist/server/src/bootstrap.d.ts.map +1 -1
  32. package/dist/server/src/controllers/index.d.ts +1 -0
  33. package/dist/server/src/controllers/index.d.ts.map +1 -1
  34. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  35. package/dist/server/src/controllers/release.d.ts +1 -0
  36. package/dist/server/src/controllers/release.d.ts.map +1 -1
  37. package/dist/server/src/controllers/validation/release-action.d.ts +7 -2
  38. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -1
  39. package/dist/server/src/destroy.d.ts +2 -2
  40. package/dist/server/src/destroy.d.ts.map +1 -1
  41. package/dist/server/src/index.d.ts +1412 -1411
  42. package/dist/server/src/index.d.ts.map +1 -1
  43. package/dist/server/src/migrations/index.d.ts.map +1 -1
  44. package/dist/server/src/register.d.ts +2 -2
  45. package/dist/server/src/register.d.ts.map +1 -1
  46. package/dist/server/src/routes/release.d.ts.map +1 -1
  47. package/dist/server/src/services/index.d.ts +1407 -1407
  48. package/dist/server/src/services/release.d.ts +9 -9
  49. package/dist/server/src/services/release.d.ts.map +1 -1
  50. package/dist/server/src/services/scheduling.d.ts +6 -6
  51. package/dist/server/src/services/scheduling.d.ts.map +1 -1
  52. package/dist/server/src/services/validation.d.ts +2 -2
  53. package/dist/server/src/services/validation.d.ts.map +1 -1
  54. package/dist/server/src/utils/index.d.ts +10 -10
  55. package/dist/server/src/utils/index.d.ts.map +1 -1
  56. package/dist/shared/contracts/release-actions.d.ts +9 -9
  57. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  58. package/dist/shared/contracts/releases.d.ts +17 -1
  59. package/dist/shared/contracts/releases.d.ts.map +1 -1
  60. package/dist/shared/types.d.ts +2 -2
  61. package/dist/shared/types.d.ts.map +1 -1
  62. package/package.json +19 -19
  63. package/dist/_chunks/App-FuRaphre.js.map +0 -1
  64. package/dist/_chunks/App-IkyOz9wq.mjs.map +0 -1
  65. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
  66. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
  67. package/dist/_chunks/en-RdapH-9X.mjs.map +0 -1
  68. package/dist/_chunks/en-faJDuv3q.js.map +0 -1
  69. package/dist/_chunks/index-Sb3Nal8H.js.map +0 -1
  70. package/dist/_chunks/index-qP3rNiDS.mjs.map +0 -1
  71. package/dist/admin/src/services/axios.d.ts +0 -29
@@ -1,4 +1,4 @@
1
- import { contentTypes as contentTypes$1, async, setCreatorFields, convertQueryParams, errors, validateYupSchema, yup as yup$1 } from "@strapi/utils";
1
+ import { contentTypes as contentTypes$1, async, setCreatorFields, errors, validateYupSchema, yup as yup$1 } from "@strapi/utils";
2
2
  import isEqual from "lodash/isEqual";
3
3
  import { difference, keys } from "lodash";
4
4
  import _ from "lodash/fp";
@@ -53,10 +53,10 @@ const ACTIONS = [
53
53
  const ALLOWED_WEBHOOK_EVENTS = {
54
54
  RELEASES_PUBLISH: "releases.publish"
55
55
  };
56
- const getService = (name, { strapi: strapi2 } = { strapi: global.strapi }) => {
56
+ const getService = (name, { strapi: strapi2 }) => {
57
57
  return strapi2.plugin("content-releases").service(name);
58
58
  };
59
- const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 } = { strapi: global.strapi }) => {
59
+ const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }) => {
60
60
  const populateBuilderService = strapi2.plugin("content-manager").service("populate-builder");
61
61
  const populate = await populateBuilderService(contentTypeUid).populateDeep(Infinity).build();
62
62
  const entry = await strapi2.db.query(contentTypeUid).findOne({
@@ -65,7 +65,7 @@ const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 } =
65
65
  });
66
66
  return entry;
67
67
  };
68
- const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 } = { strapi: global.strapi }) => {
68
+ const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }) => {
69
69
  try {
70
70
  await strapi2.entityValidator.validateEntityCreation(
71
71
  strapi2.getModel(contentTypeUid),
@@ -213,13 +213,16 @@ async function disableContentTypeLocalized({ oldContentTypes, contentTypes: cont
213
213
  if (!oldContentTypes) {
214
214
  return;
215
215
  }
216
+ const i18nPlugin = strapi.plugin("i18n");
217
+ if (!i18nPlugin) {
218
+ return;
219
+ }
216
220
  for (const uid in contentTypes2) {
217
221
  if (!oldContentTypes[uid]) {
218
222
  continue;
219
223
  }
220
224
  const oldContentType = oldContentTypes[uid];
221
225
  const contentType = contentTypes2[uid];
222
- const i18nPlugin = strapi.plugin("i18n");
223
226
  const { isLocalizedContentType } = i18nPlugin.service("content-types");
224
227
  if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {
225
228
  await strapi.db.queryBuilder(RELEASE_ACTION_MODEL_UID).update({
@@ -232,13 +235,16 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
232
235
  if (!oldContentTypes) {
233
236
  return;
234
237
  }
238
+ const i18nPlugin = strapi.plugin("i18n");
239
+ if (!i18nPlugin) {
240
+ return;
241
+ }
235
242
  for (const uid in contentTypes2) {
236
243
  if (!oldContentTypes[uid]) {
237
244
  continue;
238
245
  }
239
246
  const oldContentType = oldContentTypes[uid];
240
247
  const contentType = contentTypes2[uid];
241
- const i18nPlugin = strapi.plugin("i18n");
242
248
  const { isLocalizedContentType } = i18nPlugin.service("content-types");
243
249
  const { getDefaultLocale } = i18nPlugin.service("locales");
244
250
  if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {
@@ -251,7 +257,7 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
251
257
  }
252
258
  const register = async ({ strapi: strapi2 }) => {
253
259
  if (strapi2.ee.features.isEnabled("cms-content-releases")) {
254
- await strapi2.admin.services.permission.actionProvider.registerMany(ACTIONS);
260
+ await strapi2.service("admin::permission").actionProvider.registerMany(ACTIONS);
255
261
  strapi2.hook("strapi::content-types.beforeSync").register(disableContentTypeLocalized).register(deleteActionsOnDisableDraftAndPublish);
256
262
  strapi2.hook("strapi::content-types.afterSync").register(deleteActionsOnDeleteContentType).register(enableContentTypeLocalized).register(revalidateChangedContentTypes).register(migrateIsValidAndStatusReleases);
257
263
  }
@@ -321,9 +327,7 @@ const bootstrap = async ({ strapi: strapi2 }) => {
321
327
  actions: {
322
328
  target_type: model.uid,
323
329
  target_id: {
324
- $in: entriesToDelete.map(
325
- (entry) => entry.id
326
- )
330
+ $in: entriesToDelete.map((entry) => entry.id)
327
331
  }
328
332
  }
329
333
  }
@@ -350,13 +354,9 @@ const bootstrap = async ({ strapi: strapi2 }) => {
350
354
  try {
351
355
  const { model, result } = event;
352
356
  if (model.kind === "collectionType" && model.options?.draftAndPublish) {
353
- const isEntryValid = await getEntryValidStatus(
354
- model.uid,
355
- result,
356
- {
357
- strapi: strapi2
358
- }
359
- );
357
+ const isEntryValid = await getEntryValidStatus(model.uid, result, {
358
+ strapi: strapi2
359
+ });
360
360
  await strapi2.db.query(RELEASE_ACTION_MODEL_UID).update({
361
361
  where: {
362
362
  target_type: model.uid,
@@ -390,7 +390,7 @@ const bootstrap = async ({ strapi: strapi2 }) => {
390
390
  throw err;
391
391
  });
392
392
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
393
- strapi2.webhookStore.addAllowedEvent(key, value);
393
+ strapi2.get("webhookStore").addAllowedEvent(key, value);
394
394
  });
395
395
  }
396
396
  };
@@ -639,7 +639,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
639
639
  return release2;
640
640
  },
641
641
  async findOne(id, query = {}) {
642
- const dbQuery = convertQueryParams.transformParamsToQuery(RELEASE_MODEL_UID, query);
642
+ const dbQuery = strapi2.get("query-params").transform(RELEASE_MODEL_UID, query);
643
643
  const release2 = await strapi2.db.query(RELEASE_MODEL_UID).findOne({
644
644
  ...dbQuery,
645
645
  where: { id }
@@ -647,7 +647,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
647
647
  return release2;
648
648
  },
649
649
  findPage(query) {
650
- const dbQuery = convertQueryParams.transformParamsToQuery(RELEASE_MODEL_UID, query ?? {});
650
+ const dbQuery = strapi2.get("query-params").transform(RELEASE_MODEL_UID, query ?? {});
651
651
  return strapi2.db.query(RELEASE_MODEL_UID).findPage({
652
652
  ...dbQuery,
653
653
  populate: {
@@ -657,12 +657,18 @@ const createReleaseService = ({ strapi: strapi2 }) => {
657
657
  }
658
658
  });
659
659
  },
660
- async findManyWithContentTypeEntryAttached(contentTypeUid, entryId) {
660
+ async findManyWithContentTypeEntryAttached(contentTypeUid, entriesIds) {
661
+ let entries = entriesIds;
662
+ if (!Array.isArray(entriesIds)) {
663
+ entries = [entriesIds];
664
+ }
661
665
  const releases = await strapi2.db.query(RELEASE_MODEL_UID).findMany({
662
666
  where: {
663
667
  actions: {
664
668
  target_type: contentTypeUid,
665
- target_id: entryId
669
+ target_id: {
670
+ $in: entries
671
+ }
666
672
  },
667
673
  releasedAt: {
668
674
  $null: true
@@ -673,18 +679,25 @@ const createReleaseService = ({ strapi: strapi2 }) => {
673
679
  actions: {
674
680
  where: {
675
681
  target_type: contentTypeUid,
676
- target_id: entryId
682
+ target_id: {
683
+ $in: entries
684
+ }
685
+ },
686
+ populate: {
687
+ entry: {
688
+ select: ["id"]
689
+ }
677
690
  }
678
691
  }
679
692
  }
680
693
  });
681
694
  return releases.map((release2) => {
682
695
  if (release2.actions?.length) {
683
- const [actionForEntry] = release2.actions;
696
+ const actionsForEntry = release2.actions;
684
697
  delete release2.actions;
685
698
  return {
686
699
  ...release2,
687
- action: actionForEntry
700
+ actions: actionsForEntry
688
701
  };
689
702
  }
690
703
  return release2;
@@ -808,10 +821,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
808
821
  if (!release2) {
809
822
  throw new errors.NotFoundError(`No release found for id ${releaseId}`);
810
823
  }
811
- const dbQuery = convertQueryParams.transformParamsToQuery(
812
- RELEASE_ACTION_MODEL_UID,
813
- query ?? {}
814
- );
824
+ const dbQuery = strapi2.get("query-params").transform(RELEASE_ACTION_MODEL_UID, query ?? {});
815
825
  return strapi2.db.query(RELEASE_ACTION_MODEL_UID).findPage({
816
826
  ...dbQuery,
817
827
  populate: {
@@ -825,10 +835,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
825
835
  });
826
836
  },
827
837
  async countActions(query) {
828
- const dbQuery = convertQueryParams.transformParamsToQuery(
829
- RELEASE_ACTION_MODEL_UID,
830
- query ?? {}
831
- );
838
+ const dbQuery = strapi2.get("query-params").transform(RELEASE_ACTION_MODEL_UID, query ?? {});
832
839
  return strapi2.db.query(RELEASE_ACTION_MODEL_UID).count(dbQuery);
833
840
  },
834
841
  async groupActions(actions, groupBy) {
@@ -838,9 +845,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
838
845
  }
839
846
  return acc;
840
847
  }, []);
841
- const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(
842
- contentTypeUids
843
- );
848
+ const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(contentTypeUids);
844
849
  const allLocalesDictionary = await this.getLocalesDataForActions();
845
850
  const formattedData = actions.map((action) => {
846
851
  const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];
@@ -962,9 +967,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
962
967
  }
963
968
  try {
964
969
  strapi2.log.info(`[Content Releases] Starting to publish release ${lockedRelease.name}`);
965
- const { collectionTypeActions, singleTypeActions } = await getFormattedActions(
966
- releaseId
967
- );
970
+ const { collectionTypeActions, singleTypeActions } = await getFormattedActions(releaseId);
968
971
  await strapi2.db.transaction(async () => {
969
972
  for (const { uid, action, id } of singleTypeActions) {
970
973
  await publishSingleTypeAction(uid, action, id);
@@ -1135,7 +1138,8 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
1135
1138
  }
1136
1139
  },
1137
1140
  async validatePendingReleasesLimit() {
1138
- const maximumPendingReleases = strapi2.ee.features.get("cms-content-releases")?.options?.maximumReleases || 3;
1141
+ const featureCfg = strapi2.ee.features.get("cms-content-releases");
1142
+ const maximumPendingReleases = typeof featureCfg === "object" && featureCfg?.options?.maximumReleases || 3;
1139
1143
  const [, pendingReleasesCount] = await strapi2.db.query(RELEASE_MODEL_UID).findWithCount({
1140
1144
  filters: {
1141
1145
  releasedAt: {
@@ -1178,7 +1182,7 @@ const createSchedulingService = ({ strapi: strapi2 }) => {
1178
1182
  }
1179
1183
  const job = scheduleJob(scheduleDate, async () => {
1180
1184
  try {
1181
- await getService("release").publish(releaseId);
1185
+ await getService("release", { strapi: strapi2 }).publish(releaseId);
1182
1186
  } catch (error) {
1183
1187
  }
1184
1188
  this.cancel(releaseId);
@@ -1248,7 +1252,7 @@ const RELEASE_SCHEMA = yup.object().shape({
1248
1252
  const validateRelease = validateYupSchema(RELEASE_SCHEMA);
1249
1253
  const releaseController = {
1250
1254
  async findMany(ctx) {
1251
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1255
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1252
1256
  ability: ctx.state.userAbility,
1253
1257
  model: RELEASE_MODEL_UID
1254
1258
  });
@@ -1298,7 +1302,7 @@ const releaseController = {
1298
1302
  });
1299
1303
  const sanitizedRelease = {
1300
1304
  ...release2,
1301
- createdBy: release2.createdBy ? strapi.admin.services.user.sanitizeUser(release2.createdBy) : null
1305
+ createdBy: release2.createdBy ? strapi.service("admin::user").sanitizeUser(release2.createdBy) : null
1302
1306
  };
1303
1307
  const data = {
1304
1308
  ...sanitizedRelease,
@@ -1310,19 +1314,48 @@ const releaseController = {
1310
1314
  };
1311
1315
  ctx.body = { data };
1312
1316
  },
1317
+ async mapEntriesToReleases(ctx) {
1318
+ const { contentTypeUid, entriesIds } = ctx.query;
1319
+ if (!contentTypeUid || !entriesIds) {
1320
+ throw new errors.ValidationError("Missing required query parameters");
1321
+ }
1322
+ const releaseService = getService("release", { strapi });
1323
+ const releasesWithActions = await releaseService.findManyWithContentTypeEntryAttached(
1324
+ contentTypeUid,
1325
+ entriesIds
1326
+ );
1327
+ const mappedEntriesInReleases = releasesWithActions.reduce(
1328
+ // TODO: Fix for v5 removed mappedEntriedToRelease
1329
+ (acc, release2) => {
1330
+ release2.actions.forEach((action) => {
1331
+ if (!acc[action.entry.id]) {
1332
+ acc[action.entry.id] = [{ id: release2.id, name: release2.name }];
1333
+ } else {
1334
+ acc[action.entry.id].push({ id: release2.id, name: release2.name });
1335
+ }
1336
+ });
1337
+ return acc;
1338
+ },
1339
+ // TODO: Fix for v5 removed mappedEntriedToRelease
1340
+ {}
1341
+ );
1342
+ ctx.body = {
1343
+ data: mappedEntriesInReleases
1344
+ };
1345
+ },
1313
1346
  async create(ctx) {
1314
1347
  const user = ctx.state.user;
1315
1348
  const releaseArgs = ctx.request.body;
1316
1349
  await validateRelease(releaseArgs);
1317
1350
  const releaseService = getService("release", { strapi });
1318
1351
  const release2 = await releaseService.create(releaseArgs, { user });
1319
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1352
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1320
1353
  ability: ctx.state.userAbility,
1321
1354
  model: RELEASE_MODEL_UID
1322
1355
  });
1323
- ctx.body = {
1356
+ ctx.created({
1324
1357
  data: await permissionsManager.sanitizeOutput(release2)
1325
- };
1358
+ });
1326
1359
  },
1327
1360
  async update(ctx) {
1328
1361
  const user = ctx.state.user;
@@ -1331,7 +1364,7 @@ const releaseController = {
1331
1364
  await validateRelease(releaseArgs);
1332
1365
  const releaseService = getService("release", { strapi });
1333
1366
  const release2 = await releaseService.update(id, releaseArgs, { user });
1334
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1367
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1335
1368
  ability: ctx.state.userAbility,
1336
1369
  model: RELEASE_MODEL_UID
1337
1370
  });
@@ -1395,9 +1428,9 @@ const releaseActionController = {
1395
1428
  await validateReleaseAction(releaseActionArgs);
1396
1429
  const releaseService = getService("release", { strapi });
1397
1430
  const releaseAction2 = await releaseService.createAction(releaseId, releaseActionArgs);
1398
- ctx.body = {
1431
+ ctx.created({
1399
1432
  data: releaseAction2
1400
- };
1433
+ });
1401
1434
  },
1402
1435
  async createMany(ctx) {
1403
1436
  const releaseId = ctx.params.releaseId;
@@ -1423,17 +1456,17 @@ const releaseActionController = {
1423
1456
  return releaseActions2;
1424
1457
  });
1425
1458
  const newReleaseActions = releaseActions.filter((action) => action !== null);
1426
- ctx.body = {
1459
+ ctx.created({
1427
1460
  data: newReleaseActions,
1428
1461
  meta: {
1429
1462
  entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
1430
1463
  totalEntries: releaseActions.length
1431
1464
  }
1432
- };
1465
+ });
1433
1466
  },
1434
1467
  async findMany(ctx) {
1435
1468
  const releaseId = ctx.params.releaseId;
1436
- const permissionsManager = strapi.admin.services.permission.createPermissionsManager({
1469
+ const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
1437
1470
  ability: ctx.state.userAbility,
1438
1471
  model: RELEASE_ACTION_MODEL_UID
1439
1472
  });
@@ -1447,7 +1480,7 @@ const releaseActionController = {
1447
1480
  if (acc[action.contentType]) {
1448
1481
  return acc;
1449
1482
  }
1450
- const contentTypePermissionsManager = strapi.admin.services.permission.createPermissionsManager({
1483
+ const contentTypePermissionsManager = strapi.service("admin::permission").createPermissionsManager({
1451
1484
  ability: ctx.state.userAbility,
1452
1485
  model: action.contentType
1453
1486
  });
@@ -1499,6 +1532,22 @@ const controllers = { release: releaseController, "release-action": releaseActio
1499
1532
  const release = {
1500
1533
  type: "admin",
1501
1534
  routes: [
1535
+ {
1536
+ method: "GET",
1537
+ path: "/mapEntriesToReleases",
1538
+ handler: "release.mapEntriesToReleases",
1539
+ config: {
1540
+ policies: [
1541
+ "admin::isAuthenticatedAdmin",
1542
+ {
1543
+ name: "admin::hasPermissions",
1544
+ config: {
1545
+ actions: ["plugin::content-releases.read"]
1546
+ }
1547
+ }
1548
+ ]
1549
+ }
1550
+ },
1502
1551
  {
1503
1552
  method: "POST",
1504
1553
  path: "/",