{"version":3,"file":"index.mjs","sources":["../../server/src/utils/index.ts","../../server/src/constants/index.ts","../../server/src/bootstrap.ts","../../server/src/middlewares/routing.ts","../../server/src/routes/admin.ts","../../server/src/routes/index.ts","../../server/src/policies/has-draft-and-publish.ts","../../server/src/validation/policies/hasPermissions.ts","../../server/src/policies/hasPermissions.ts","../../server/src/policies/index.ts","../../server/src/services/utils/configuration/attributes.ts","../../server/src/services/utils/configuration/settings.ts","../../server/src/controllers/validation/model-configuration.ts","../../server/src/controllers/validation/index.ts","../../server/src/controllers/utils/clone.ts","../../server/src/controllers/collection-types.ts","../../server/src/controllers/components.ts","../../server/src/controllers/content-types.ts","../../server/src/controllers/init.ts","../../server/src/controllers/validation/relations.ts","../../server/src/controllers/relations.ts","../../server/src/controllers/single-types.ts","../../server/src/controllers/uid.ts","../../server/src/controllers/index.ts","../../server/src/services/utils/store.ts","../../server/src/services/utils/configuration/metadatas.ts","../../server/src/services/utils/configuration/layouts.ts","../../server/src/services/utils/configuration/index.ts","../../server/src/services/configuration.ts","../../server/src/services/components.ts","../../server/src/services/content-types.ts","../../server/src/services/data-mapper.ts","../../server/src/services/utils/populate.ts","../../server/src/services/utils/count.ts","../../server/src/services/utils/draft.ts","../../server/src/services/entity-manager.ts","../../server/src/services/field-sizes.ts","../../server/src/services/metrics.ts","../../server/src/services/permission-checker.ts","../../server/src/services/permission.ts","../../server/src/services/populate-builder.ts","../../server/src/services/uid.ts","../../server/src/services/index.ts","../../server/src/index.ts"],"sourcesContent":["import '@strapi/types';\n\nconst getService = (name: string) => {\n  return strapi.plugin('content-manager').service(name);\n};\n\nexport { getService };\n","const ALLOWED_WEBHOOK_EVENTS = {\n  ENTRY_PUBLISH: 'entry.publish',\n  ENTRY_UNPUBLISH: 'entry.unpublish',\n};\n\nexport { ALLOWED_WEBHOOK_EVENTS };\n","import { getService } from './utils';\nimport { ALLOWED_WEBHOOK_EVENTS } from './constants';\n\nexport default async () => {\n  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n    strapi.webhookStore.addAllowedEvent(key, value);\n  });\n\n  getService('field-sizes').setCustomFieldInputSizes();\n  await getService('components').syncConfigurations();\n  await getService('content-types').syncConfigurations();\n  await getService('permission').registerPermissions();\n};\n","import { UID, Common, Schema } from '@strapi/types';\nimport type { Context, Next } from 'koa';\nimport isNil from 'lodash/isNil';\n\ninterface ContentType extends Schema.ContentType {\n  plugin?: string;\n}\n\nexport default async (ctx: Context, next: Next) => {\n  const { model }: { model: UID.ContentType } = ctx.params;\n\n  const ct: ContentType = strapi.contentTypes[model];\n\n  if (!ct) {\n    return ctx.send({ error: 'contentType.notFound' }, 404);\n  }\n\n  let target;\n  if (!ct.plugin || ct.plugin === 'admin') {\n    target = strapi.admin;\n  } else {\n    target = strapi.plugin(ct.plugin);\n  }\n\n  const { route }: { route: Common.Route } = ctx.state;\n\n  if (typeof route.handler !== 'string') {\n    return next();\n  }\n\n  const [, action] = route.handler.split('.');\n\n  const configPath =\n    ct.plugin === 'admin'\n      ? ['admin.layout', ct.modelName, 'actions', action]\n      : ['plugin', ct.plugin, 'layout', ct.modelName, 'actions', action];\n\n  // TODO\n  // @ts-expect-error check input for strapi.config.get\n  const actionConfig: string | undefined = strapi.config.get(configPath);\n\n  if (!isNil(actionConfig)) {\n    const [controller, action] = actionConfig.split('.');\n\n    if (controller && action) {\n      return target.controllers[controller.toLowerCase()][action](ctx, next);\n    }\n  }\n\n  await next();\n};\n","import { routing } from '../middlewares';\n\nexport default {\n  type: 'admin',\n  routes: [\n    {\n      method: 'GET',\n      path: '/init',\n      handler: 'init.getInitData',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/content-types',\n      handler: 'content-types.findContentTypes',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/content-types-settings',\n      handler: 'content-types.findContentTypesSettings',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/content-types/:uid/configuration',\n      handler: 'content-types.findContentTypeConfiguration',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'PUT',\n      path: '/content-types/:uid/configuration',\n      handler: 'content-types.updateContentTypeConfiguration',\n      config: {\n        policies: ['admin::isAuthenticatedAdmin'],\n      },\n    },\n\n    {\n      method: 'GET',\n      path: '/components',\n      handler: 'components.findComponents',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/components/:uid/configuration',\n      handler: 'components.findComponentConfiguration',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'PUT',\n      path: '/components/:uid/configuration',\n      handler: 'components.updateComponentConfiguration',\n      config: {\n        policies: [],\n      },\n    },\n\n    {\n      method: 'POST',\n      path: '/uid/generate',\n      handler: 'uid.generateUID',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/uid/check-availability',\n      handler: 'uid.checkUIDAvailability',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/relations/:model/:targetField',\n      handler: 'relations.findAvailable',\n      config: {\n        policies: ['admin::isAuthenticatedAdmin'],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/relations/:model/:id/:targetField',\n      handler: 'relations.findExisting',\n      config: {\n        policies: ['admin::isAuthenticatedAdmin'],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/single-types/:model',\n      handler: 'single-types.find',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.read'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'PUT',\n      path: '/single-types/:model',\n      handler: 'single-types.createOrUpdate',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: {\n              actions: [\n                'plugin::content-manager.explorer.create',\n                'plugin::content-manager.explorer.update',\n              ],\n              hasAtLeastOne: true,\n            },\n          },\n        ],\n      },\n    },\n    {\n      method: 'DELETE',\n      path: '/single-types/:model',\n      handler: 'single-types.delete',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.delete'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/single-types/:model/actions/publish',\n      handler: 'single-types.publish',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'plugin::content-manager.has-draft-and-publish',\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.publish'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/single-types/:model/actions/unpublish',\n      handler: 'single-types.unpublish',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'plugin::content-manager.has-draft-and-publish',\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.publish'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/single-types/:model/actions/countDraftRelations',\n      handler: 'single-types.countDraftRelations',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.read'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/collection-types/:model',\n      handler: 'collection-types.find',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.read'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/collection-types/:model',\n      handler: 'collection-types.create',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.create'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/collection-types/:model/clone/:sourceId',\n      handler: 'collection-types.clone',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.create'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/collection-types/:model/auto-clone/:sourceId',\n      handler: 'collection-types.autoClone',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.create'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/collection-types/:model/:id',\n      handler: 'collection-types.findOne',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.read'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'PUT',\n      path: '/collection-types/:model/:id',\n      handler: 'collection-types.update',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.update'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'DELETE',\n      path: '/collection-types/:model/:id',\n      handler: 'collection-types.delete',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.delete'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/collection-types/:model/:id/actions/publish',\n      handler: 'collection-types.publish',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'plugin::content-manager.has-draft-and-publish',\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.publish'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/collection-types/:model/:id/actions/unpublish',\n      handler: 'collection-types.unpublish',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'plugin::content-manager.has-draft-and-publish',\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.publish'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/collection-types/:model/actions/bulkDelete',\n      handler: 'collection-types.bulkDelete',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.delete'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/collection-types/:model/actions/bulkPublish',\n      handler: 'collection-types.bulkPublish',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'plugin::content-manager.has-draft-and-publish',\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.publish'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/collection-types/:model/actions/bulkUnpublish',\n      handler: 'collection-types.bulkUnpublish',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'plugin::content-manager.has-draft-and-publish',\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.publish'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/collection-types/:model/:id/actions/countDraftRelations',\n      handler: 'collection-types.countDraftRelations',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.read'] },\n          },\n        ],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/collection-types/:model/actions/countManyEntriesDraftRelations',\n      handler: 'collection-types.countManyEntriesDraftRelations',\n      config: {\n        middlewares: [routing],\n        policies: [\n          'admin::isAuthenticatedAdmin',\n          {\n            name: 'plugin::content-manager.hasPermissions',\n            config: { actions: ['plugin::content-manager.explorer.read'] },\n          },\n        ],\n      },\n    },\n  ],\n};\n","import admin from './admin';\n\nexport default { admin };\n","import type { Context } from 'koa';\nimport { contentTypes } from '@strapi/utils';\nimport { Strapi, UID } from '@strapi/types';\n\nconst { hasDraftAndPublish } = contentTypes;\n\nexport default (ctx: Context, config: any, { strapi }: { strapi: Strapi }) => {\n  const { model: modelUID }: { model: UID.ContentType } = ctx.params;\n\n  const model = strapi.contentTypes[modelUID];\n\n  return hasDraftAndPublish(model);\n};\n","import { yup, validateYupSchemaSync } from '@strapi/utils';\n\nconst hasPermissionsSchema = yup.object({\n  actions: yup.array().of(yup.string()),\n  hasAtLeastOne: yup.boolean(),\n});\n\nexport const validateHasPermissionsInput = validateYupSchemaSync(hasPermissionsSchema);\n","import type { Context } from 'koa';\nimport { policy } from '@strapi/utils';\nimport { validateHasPermissionsInput } from '../validation/policies/hasPermissions';\n\nconst { createPolicy } = policy;\n\nexport default createPolicy({\n  name: 'plugin::content-manager.hasPermissions',\n  validator: validateHasPermissionsInput,\n  /**\n   * NOTE: Action aliases are currently not checked at this level (policy).\n   *       This is currently the intended behavior to avoid changing the behavior of API related permissions.\n   *       If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.\n   */\n  handler(ctx: Context, config = {}) {\n    const { actions = [], hasAtLeastOne = false }: { actions: string[]; hasAtLeastOne: boolean } =\n      config;\n\n    const { userAbility } = ctx.state;\n    const { model }: { model: string } = ctx.params;\n\n    const isAuthorized = hasAtLeastOne\n      ? actions.some((action) => userAbility.can(action, model))\n      : actions.every((action) => userAbility.can(action, model));\n\n    return isAuthorized;\n  },\n});\n","import hasDraftAndPublish from './has-draft-and-publish';\nimport hasPermissions from './hasPermissions';\n\nexport default {\n  'has-draft-and-publish': hasDraftAndPublish,\n  hasPermissions,\n};\n","import _ from 'lodash';\nimport { intersection } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n  contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n  if (!_.has(schema.attributes, name)) {\n    return false;\n  }\n\n  const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n  if (isHidden === true) {\n    return true;\n  }\n\n  return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n  if (!_.has(schema.attributes, name)) {\n    return false;\n  }\n\n  if (isHidden(schema, name)) {\n    return false;\n  }\n\n  const attribute = schema.attributes[name];\n  if (NON_LISTABLES.includes(attribute.type)) {\n    return false;\n  }\n\n  if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n    return false;\n  }\n\n  return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n  if (!_.has(schema.attributes, name)) {\n    return false;\n  }\n\n  if (schema.modelType === 'component' && name === 'id') return false;\n\n  const attribute = schema.attributes[name];\n  if (NON_SORTABLES.includes(attribute.type)) {\n    return false;\n  }\n\n  if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n    return false;\n  }\n\n  return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n  return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n  if (!_.has(schema.attributes, name)) {\n    return false;\n  }\n\n  if (isHidden(schema, name)) {\n    return false;\n  }\n\n  if (isTimestamp(schema, name) || name === 'id') {\n    return false;\n  }\n\n  if (isPublicationField(name)) {\n    return false;\n  }\n\n  if (isCreatorField(schema, name)) {\n    return false;\n  }\n\n  return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n  if (!_.has(schema.attributes, name)) {\n    return false;\n  }\n\n  const timestamps = contentTypesUtils.getTimestamps(schema);\n  if (!timestamps || !Array.isArray(timestamps)) {\n    return false;\n  }\n\n  if (timestamps.includes(name)) {\n    return true;\n  }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n  if (!_.has(schema.attributes, name)) {\n    return false;\n  }\n\n  const creatorFields = contentTypesUtils.getCreatorFields(schema);\n  if (!creatorFields || !Array.isArray(creatorFields)) {\n    return false;\n  }\n\n  if (creatorFields.includes(name)) {\n    return true;\n  }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n  if (!_.has(schema.attributes, name)) {\n    return false;\n  }\n\n  if (isHidden(schema, name)) {\n    return false;\n  }\n\n  if (!isVisible(schema, name)) {\n    return false;\n  }\n\n  return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n  if (!_.has(schema.attributes, name)) {\n    return false;\n  }\n\n  if (isHidden(schema, name)) {\n    return false;\n  }\n\n  if (!isVisible(schema, name)) {\n    return false;\n  }\n\n  return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n  return Object.keys(schema.attributes || {}).find((key) => {\n    const { type } = schema.attributes[key];\n    return type === 'string' && key !== 'id';\n  });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n  const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n  const model = strapi.getModel(schema.uid);\n  const nonVisibleWritableAttributes = intersection(\n    getNonVisibleAttributes(model),\n    getWritableAttributes(model)\n  );\n\n  return [\n    'id',\n    ...validAttributes,\n    ...nonVisibleWritableAttributes,\n    CREATED_BY_ATTRIBUTE,\n    UPDATED_BY_ATTRIBUTE,\n  ];\n};\n\nexport {\n  isSortable,\n  isVisible,\n  isSearchable,\n  isRelation,\n  isListable,\n  hasEditableAttribute,\n  hasRelationAttribute,\n  getDefaultMainField,\n  getSortableAttributes,\n};\n","import { isEmpty, pick, pipe, propOr, isEqual } from 'lodash/fp';\nimport { traverse } from '@strapi/utils';\nimport qs from 'qs';\nimport { isSortable, getDefaultMainField, getSortableAttributes } from './attributes';\n\n/** General settings */\nconst DEFAULT_SETTINGS = {\n  bulkable: true,\n  filterable: true,\n  searchable: true,\n  pageSize: 10,\n};\n\nconst settingsFields = [\n  'searchable',\n  'filterable',\n  'bulkable',\n  'pageSize',\n  'mainField',\n  'defaultSortBy',\n  'defaultSortOrder',\n];\n\nconst getModelSettings = pipe([propOr({}, 'config.settings'), pick(settingsFields)]);\n\nasync function isValidDefaultSort(schema: any, value: any) {\n  const parsedValue = qs.parse(value);\n\n  const omitNonSortableAttributes = ({ schema, key }: any, { remove }: any) => {\n    const sortableAttributes = getSortableAttributes(schema);\n    if (!sortableAttributes.includes(key)) {\n      remove(key);\n    }\n  };\n\n  const sanitizedValue = await traverse.traverseQuerySort(\n    omitNonSortableAttributes,\n    { schema },\n    parsedValue\n  );\n\n  // If any of the keys has been removed, the sort attribute is not valid\n  return isEqual(parsedValue, sanitizedValue);\n}\n\nconst createDefaultSettings = async (schema: any) => {\n  const defaultField = getDefaultMainField(schema);\n\n  return {\n    ...DEFAULT_SETTINGS,\n    mainField: defaultField,\n    defaultSortBy: defaultField,\n    defaultSortOrder: 'ASC',\n    ...getModelSettings(schema),\n  };\n};\n\nconst syncSettings = async (configuration: any, schema: any) => {\n  if (isEmpty(configuration.settings)) return createDefaultSettings(schema);\n\n  const defaultField = getDefaultMainField(schema);\n\n  const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};\n\n  return {\n    ...configuration.settings,\n    mainField: isSortable(schema, mainField) ? mainField : defaultField,\n    defaultSortBy: (await isValidDefaultSort(schema, defaultSortBy)) ? defaultSortBy : defaultField,\n  };\n};\n\nexport { isValidDefaultSort, createDefaultSettings, syncSettings };\n","import { yup } from '@strapi/utils';\nimport { getService } from '../../utils';\nimport { isListable, hasEditableAttribute } from '../../services/utils/configuration/attributes';\nimport { isValidDefaultSort } from '../../services/utils/configuration/settings';\n\n/**\n * Creates the validation schema for content-type configurations\n */\nexport default (schema: any, opts = {}) =>\n  yup\n    .object()\n    .shape({\n      settings: createSettingsSchema(schema).default(null).nullable(),\n      metadatas: createMetadasSchema(schema).default(null).nullable(),\n      layouts: createLayoutsSchema(schema, opts).default(null).nullable(),\n      options: yup.object().optional(),\n    })\n    .noUnknown();\n\nconst createSettingsSchema = (schema: any) => {\n  const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n  return yup\n    .object()\n    .shape({\n      bulkable: yup.boolean().required(),\n      filterable: yup.boolean().required(),\n      pageSize: yup.number().integer().min(10).max(100).required(),\n      searchable: yup.boolean().required(),\n      // should be reset when the type changes\n      mainField: yup.string().oneOf(validAttributes.concat('id')).default('id'),\n      // should be reset when the type changes\n      defaultSortBy: yup\n        .string()\n        .test('is-valid-sort-attribute', '${path} is not a valid sort attribute', async (value) =>\n          isValidDefaultSort(schema, value)\n        )\n        .default('id'),\n      defaultSortOrder: yup.string().oneOf(['ASC', 'DESC']).default('ASC'),\n    })\n    .noUnknown();\n};\n\nconst createMetadasSchema = (schema: any) => {\n  return yup.object().shape(\n    Object.keys(schema.attributes).reduce((acc: any, key) => {\n      acc[key] = yup\n        .object()\n        .shape({\n          edit: yup\n            .object()\n            .shape({\n              label: yup.string(),\n              description: yup.string(),\n              placeholder: yup.string(),\n              editable: yup.boolean(),\n              visible: yup.boolean(),\n              mainField: yup.lazy((value) => {\n                if (!value) {\n                  return yup.string();\n                }\n\n                const targetSchema = getService('content-types').findContentType(\n                  schema.attributes[key].targetModel\n                );\n\n                if (!targetSchema) {\n                  return yup.string();\n                }\n\n                const validAttributes = Object.keys(targetSchema.attributes).filter((key) =>\n                  isListable(targetSchema, key)\n                );\n\n                return yup.string().oneOf(validAttributes.concat('id')).default('id');\n              }),\n            })\n            .noUnknown()\n            .required(),\n          list: yup\n            .object()\n            .shape({\n              label: yup.string(),\n              searchable: yup.boolean(),\n              sortable: yup.boolean(),\n            })\n            .noUnknown()\n            .required(),\n        })\n        .noUnknown();\n\n      return acc;\n    }, {})\n  );\n};\n\nconst createArrayTest = ({ allowUndefined = false } = {}) => ({\n  name: 'isArray',\n  message: '${path} is required and must be an array',\n  test: (val: any) => (allowUndefined === true && val === undefined ? true : Array.isArray(val)),\n});\n\nconst createLayoutsSchema = (schema: any, opts = {}) => {\n  const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n  const editAttributes = Object.keys(schema.attributes).filter((key) =>\n    hasEditableAttribute(schema, key)\n  );\n\n  return yup.object().shape({\n    edit: yup\n      .array()\n      .of(\n        yup.array().of(\n          yup\n            .object()\n            .shape({\n              name: yup.string().oneOf(editAttributes).required(),\n              size: yup.number().integer().positive().required(),\n            })\n            .noUnknown()\n        )\n      )\n      .test(createArrayTest(opts)),\n    list: yup.array().of(yup.string().oneOf(validAttributes)).test(createArrayTest(opts)),\n  });\n};\n","import _ from 'lodash';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n  .object({\n    ids: yup.array().of(yup.strapiID()).min(1).required(),\n  })\n  .required();\n\nconst generateUIDInputSchema = yup.object({\n  contentTypeUID: yup.string().required(),\n  field: yup.string().required(),\n  data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n  contentTypeUID: yup.string().required(),\n  field: yup.string().required(),\n  value: yup\n    .string()\n    .matches(/^[A-Za-z0-9-_.~]*$/)\n    .required(),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n  const model = strapi.contentTypes[contentTypeUID];\n\n  if (!model) {\n    throw new ValidationError('ContentType not found');\n  }\n\n  if (\n    !_.has(model, ['attributes', field]) ||\n    _.get(model, ['attributes', field, 'type']) !== 'uid'\n  ) {\n    throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n  }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n  const pageNumber = parseInt(page, 10);\n  const pageSizeNumber = parseInt(pageSize, 10);\n\n  if (Number.isNaN(pageNumber) || pageNumber < 1) {\n    throw new PaginationError('invalid pageNumber param');\n  }\n  if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n    throw new PaginationError('invalid pageSize param');\n  }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = validateYupSchema(checkUIDAvailabilityInputSchema);\n\nexport {\n  createModelConfigurationSchema,\n  validateUIDField,\n  validatePagination,\n  validateKind,\n  validateBulkActionInput,\n  validateGenerateUIDInput,\n  validateCheckUIDAvailabilityInput,\n};\n","import { set } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\n\nconst { isVisibleAttribute } = strapiUtils.contentTypes;\n\n/**\n * Use an array of strings to represent the path to a field, so we can show breadcrumbs in the admin\n * We can't use special characters as delimiters, because the path includes display names\n * for dynamic zone components, which can contain any character.\n */\ntype ProhibitedCloningField = [string[], 'unique' | 'relation'];\n\nfunction checkRelation(model: any, attributeName: any, path: string[]): ProhibitedCloningField[] {\n  // we don't care about createdBy, updatedBy, localizations etc.\n  if (!isVisibleAttribute(model, attributeName)) {\n    // Return empty array and not null so we can always spread the result\n    return [];\n  }\n\n  /**\n   * Only one-to-many and one-to-one (when they're reversed, not one-way) are dangerous,\n   * because the other relations don't \"steal\" the relation from the entry we're cloning\n   */\n  const { relation, inversedBy, mappedBy } = model.attributes[attributeName];\n\n  if (\n    ['oneToOne', 'oneToMany'].includes(relation) &&\n    [mappedBy, inversedBy].some((key) => key != null)\n  ) {\n    return [[[...path, attributeName], 'relation']];\n  }\n\n  return [];\n}\n\nconst getProhibitedCloningFields = (\n  uid: any,\n  pathPrefix: string[] = []\n): ProhibitedCloningField[] => {\n  const model = strapi.getModel(uid);\n\n  const prohibitedFields = Object.keys(model.attributes).reduce<ProhibitedCloningField[]>(\n    (acc, attributeName) => {\n      const attribute: any = model.attributes[attributeName];\n      const attributePath = [...pathPrefix, attributeName];\n\n      switch (attribute.type) {\n        case 'relation':\n          return [...acc, ...checkRelation(model, attributeName, pathPrefix)];\n        case 'component':\n          return [...acc, ...getProhibitedCloningFields(attribute.component, attributePath)];\n        case 'dynamiczone':\n          return [\n            ...acc,\n            ...(attribute.components || []).flatMap((componentUID: any) =>\n              getProhibitedCloningFields(componentUID, [\n                ...attributePath,\n                strapi.getModel(componentUID).info.displayName,\n              ])\n            ),\n          ];\n        case 'uid':\n          return [...acc, [attributePath, 'unique']];\n        default:\n          if (attribute?.unique) {\n            return [...acc, [attributePath, 'unique']];\n          }\n          return acc;\n      }\n    },\n    []\n  );\n\n  return prohibitedFields;\n};\n\n/**\n * Iterates all attributes of the content type, and removes the ones that are not creatable.\n *   - If it's a relation, it sets the value to [] or null.\n *   - If it's a regular attribute, it sets the value to null.\n * When cloning, if you don't set a field it will be copied from the original entry. So we need to\n * remove the fields that the user can't create.\n */\nconst excludeNotCreatableFields =\n  (uid: any, permissionChecker: any) =>\n  (body: any, path = []): any => {\n    const model = strapi.getModel(uid);\n    const canCreate = (path: any) => permissionChecker.can.create(null, path);\n\n    return Object.keys(model.attributes).reduce((body, attributeName) => {\n      const attribute = model.attributes[attributeName];\n      const attributePath = [...path, attributeName].join('.');\n\n      // Ignore the attribute if it's not visible\n      if (!isVisibleAttribute(model, attributeName)) {\n        return body;\n      }\n\n      switch (attribute.type) {\n        // Relation should be empty if the user can't create it\n        case 'relation': {\n          if (canCreate(attributePath)) return body;\n          return set(attributePath, { set: [] }, body);\n        }\n        // Go deeper into the component\n        case 'component': {\n          return excludeNotCreatableFields(attribute.component, permissionChecker)(body, [\n            ...path,\n            attributeName,\n          ] as any);\n        }\n        // Attribute should be null if the user can't create it\n        default: {\n          if (canCreate(attributePath)) return body;\n          return set(attributePath, null, body);\n        }\n      }\n    }, body);\n  };\n\nexport { getProhibitedCloningFields, excludeNotCreatableFields };\n","import { setCreatorFields, pipeAsync } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { validateBulkActionInput } from './validation';\nimport { getProhibitedCloningFields, excludeNotCreatableFields } from './utils/clone';\n\nexport default {\n  async find(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model } = ctx.params;\n    const { query } = ctx.request;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.read()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .populateDeep(1)\n      .countRelations({ toOne: false, toMany: true })\n      .build();\n\n    const { results, pagination } = await entityManager.findPage(\n      { ...permissionQuery, populate },\n      model\n    );\n\n    const sanitizedResults = await Promise.all(\n      results.map((result: any) => permissionChecker.sanitizeOutput(result))\n    );\n\n    ctx.body = {\n      results: sanitizedResults,\n      pagination,\n    };\n  },\n\n  async findOne(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model, id } = ctx.params;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.read()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query);\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .populateDeep(Infinity)\n      .countRelations()\n      .build();\n\n    const entity = await entityManager.findOne(id, model, { populate });\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    // if the user has condition that needs populated content, it's not applied because entity don't have relations populated\n    if (permissionChecker.cannot.read(entity)) {\n      return ctx.forbidden();\n    }\n\n    // TODO: Count populated relations by permissions\n\n    ctx.body = await permissionChecker.sanitizeOutput(entity);\n  },\n\n  async create(ctx: any) {\n    const { userAbility, user } = ctx.state;\n    const { model } = ctx.params;\n    const { body } = ctx.request;\n\n    const totalEntries = await strapi.query(model).count();\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.create()) {\n      return ctx.forbidden();\n    }\n\n    const pickPermittedFields = permissionChecker.sanitizeCreateInput;\n    const setCreator = setCreatorFields({ user });\n\n    const sanitizeFn = pipeAsync(pickPermittedFields, setCreator as any);\n\n    const sanitizedBody = await sanitizeFn(body);\n\n    const entity = await entityManager.create(sanitizedBody, model);\n\n    // TODO: Revert the creation if create permission conditions are not met\n    // if (permissionChecker.cannot.create(entity)) {\n    //   return ctx.forbidden();\n    // }\n\n    ctx.body = await permissionChecker.sanitizeOutput(entity);\n\n    if (totalEntries === 0) {\n      strapi.telemetry.send('didCreateFirstContentTypeEntry', {\n        eventProperties: { model },\n      });\n    }\n  },\n\n  async update(ctx: any) {\n    const { userAbility, user } = ctx.state;\n    const { id, model } = ctx.params;\n    const { body } = ctx.request;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.update()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.update(ctx.query);\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .build();\n\n    const entity = await entityManager.findOne(id, model, { populate });\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.update(entity)) {\n      return ctx.forbidden();\n    }\n\n    const pickPermittedFields = permissionChecker.sanitizeUpdateInput(entity);\n    const setCreator = setCreatorFields({ user, isEdition: true });\n    const sanitizeFn = pipeAsync(pickPermittedFields, setCreator as any);\n    const sanitizedBody = await sanitizeFn(body);\n\n    const updatedEntity = await entityManager.update(entity, sanitizedBody, model);\n\n    ctx.body = await permissionChecker.sanitizeOutput(updatedEntity);\n  },\n\n  async clone(ctx: any) {\n    const { userAbility, user } = ctx.state;\n    const { model, sourceId: id } = ctx.params;\n    const { body } = ctx.request;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.create()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.create(ctx.query);\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .build();\n\n    const entity = await entityManager.findOne(id, model, { populate });\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    const pickPermittedFields = permissionChecker.sanitizeCreateInput;\n    const setCreator = setCreatorFields({ user });\n    const excludeNotCreatable = excludeNotCreatableFields(model, permissionChecker);\n\n    const sanitizeFn = pipeAsync(pickPermittedFields, setCreator as any, excludeNotCreatable);\n\n    const sanitizedBody = await sanitizeFn(body);\n\n    const clonedEntity = await entityManager.clone(entity, sanitizedBody, model);\n\n    ctx.body = await permissionChecker.sanitizeOutput(clonedEntity);\n  },\n\n  async autoClone(ctx: any) {\n    const { model } = ctx.params;\n\n    // Check if the model has fields that prevent auto cloning\n    const prohibitedFields = getProhibitedCloningFields(model);\n\n    if (prohibitedFields.length > 0) {\n      return ctx.badRequest(\n        'Entity could not be cloned as it has unique and/or relational fields. ' +\n          'Please edit those fields manually and save to complete the cloning.',\n        {\n          prohibitedFields,\n        }\n      );\n    }\n\n    await this.clone(ctx);\n  },\n\n  async delete(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { id, model } = ctx.params;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.delete()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.delete(ctx.query);\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .build();\n\n    const entity = await entityManager.findOne(id, model, { populate });\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.delete(entity)) {\n      return ctx.forbidden();\n    }\n\n    const result = await entityManager.delete(entity, model);\n\n    ctx.body = await permissionChecker.sanitizeOutput(result);\n  },\n\n  async publish(ctx: any) {\n    const { userAbility, user } = ctx.state;\n    const { id, model } = ctx.params;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.publish()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query);\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .populateDeep(Infinity)\n      .countRelations()\n      .build();\n\n    const entity = await entityManager.findOne(id, model, { populate });\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.publish(entity)) {\n      return ctx.forbidden();\n    }\n\n    const result = await entityManager.publish(\n      entity,\n      model,\n      setCreatorFields({ user, isEdition: true })({})\n    );\n\n    ctx.body = await permissionChecker.sanitizeOutput(result);\n  },\n\n  async bulkPublish(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model } = ctx.params;\n    const { body } = ctx.request;\n    const { ids } = body;\n\n    await validateBulkActionInput(body);\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.publish()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query);\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .populateDeep(Infinity)\n      .countRelations()\n      .build();\n\n    const entityPromises = ids.map((id: any) => entityManager.findOne(id, model, { populate }));\n    const entities = await Promise.all(entityPromises);\n\n    for (const entity of entities) {\n      if (!entity) {\n        return ctx.notFound();\n      }\n\n      if (permissionChecker.cannot.publish(entity)) {\n        return ctx.forbidden();\n      }\n    }\n\n    const { count } = await entityManager.publishMany(entities, model);\n    ctx.body = { count };\n  },\n\n  async bulkUnpublish(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model } = ctx.params;\n    const { body } = ctx.request;\n    const { ids } = body;\n\n    await validateBulkActionInput(body);\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.unpublish()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query);\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .build();\n\n    const entityPromises = ids.map((id: any) => entityManager.findOne(id, model, { populate }));\n    const entities = await Promise.all(entityPromises);\n\n    for (const entity of entities) {\n      if (!entity) {\n        return ctx.notFound();\n      }\n\n      if (permissionChecker.cannot.publish(entity)) {\n        return ctx.forbidden();\n      }\n    }\n\n    const { count } = await entityManager.unpublishMany(entities, model);\n    ctx.body = { count };\n  },\n\n  async unpublish(ctx: any) {\n    const { userAbility, user } = ctx.state;\n    const { id, model } = ctx.params;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.unpublish()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.unpublish(ctx.query);\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .build();\n\n    const entity = await entityManager.findOne(id, model, { populate });\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.unpublish(entity)) {\n      return ctx.forbidden();\n    }\n\n    const result = await entityManager.unpublish(\n      entity,\n      model,\n      setCreatorFields({ user, isEdition: true })({})\n    );\n\n    ctx.body = await permissionChecker.sanitizeOutput(result);\n  },\n\n  async bulkDelete(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model } = ctx.params;\n    const { query, body } = ctx.request;\n    const { ids } = body;\n\n    await validateBulkActionInput(body);\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.delete()) {\n      return ctx.forbidden();\n    }\n\n    // TODO: fix\n    const permissionQuery = await permissionChecker.sanitizedQuery.delete(query);\n\n    const idsWhereClause = { id: { $in: ids } };\n    const params = {\n      ...permissionQuery,\n      filters: {\n        $and: [idsWhereClause].concat(permissionQuery.filters || []),\n      },\n    };\n\n    const { count } = await entityManager.deleteMany(params, model);\n\n    ctx.body = { count };\n  },\n\n  async countDraftRelations(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model, id } = ctx.params;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.read()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query);\n    // @ts-expect-error populate builder needs to be called with a UID\n    const populate = await getService('populate-builder')(model)\n      .populateFromQuery(permissionQuery)\n      .build();\n\n    const entity = await entityManager.findOne(id, model, { populate });\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.read(entity)) {\n      return ctx.forbidden();\n    }\n\n    const number = await entityManager.countDraftRelations(id, model);\n\n    return {\n      data: number,\n    };\n  },\n\n  async countManyEntriesDraftRelations(ctx: any) {\n    const { userAbility } = ctx.state;\n    const ids = ctx.request.query.ids;\n    const locale = ctx.request.query.locale;\n    const { model } = ctx.params;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.read()) {\n      return ctx.forbidden();\n    }\n\n    const entities = await entityManager.find({ ids, locale }, model);\n\n    if (!entities) {\n      return ctx.notFound();\n    }\n\n    const number = await entityManager.countManyEntriesDraftRelations(ids, model, locale);\n\n    return {\n      data: number,\n    };\n  },\n};\n","import { getService } from '../utils';\nimport { createModelConfigurationSchema } from './validation';\n\nexport default {\n  findComponents(ctx: any) {\n    const components = getService('components').findAllComponents();\n    const { toDto } = getService('data-mapper');\n\n    ctx.body = { data: components.map(toDto) };\n  },\n\n  async findComponentConfiguration(ctx: any) {\n    const { uid } = ctx.params;\n\n    const componentService = getService('components');\n\n    const component = componentService.findComponent(uid);\n\n    if (!component) {\n      return ctx.notFound('component.notFound');\n    }\n\n    const configuration = await componentService.findConfiguration(component);\n    const componentsConfigurations = await componentService.findComponentsConfigurations(component);\n\n    ctx.body = {\n      data: {\n        component: configuration,\n        components: componentsConfigurations,\n      },\n    };\n  },\n\n  async updateComponentConfiguration(ctx: any) {\n    const { uid } = ctx.params;\n    const { body } = ctx.request;\n\n    const componentService = getService('components');\n\n    const component = componentService.findComponent(uid);\n\n    if (!component) {\n      return ctx.notFound('component.notFound');\n    }\n\n    let input;\n    try {\n      input = await createModelConfigurationSchema(component).validate(body, {\n        abortEarly: false,\n        stripUnknown: true,\n        strict: true,\n      });\n    } catch (error: any) {\n      return ctx.badRequest(null, {\n        name: 'validationError',\n        errors: error.errors,\n      });\n    }\n\n    const newConfiguration = await componentService.updateConfiguration(component, input);\n\n    ctx.body = { data: newConfiguration };\n  },\n};\n","import { has, assoc, mapValues, prop } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { createModelConfigurationSchema, validateKind } from './validation';\n\nconst hasEditMainField = has('edit.mainField');\nconst getEditMainField = prop('edit.mainField');\nconst assocListMainField = assoc('list.mainField');\n\nconst assocMainField = (metadata: any) =>\n  hasEditMainField(metadata) ? assocListMainField(getEditMainField(metadata), metadata) : metadata;\n\nexport default {\n  async findContentTypes(ctx: any) {\n    const { kind } = ctx.query;\n\n    try {\n      await validateKind(kind);\n    } catch (error) {\n      return ctx.send({ error }, 400);\n    }\n\n    const contentTypes = getService('content-types').findContentTypesByKind(kind);\n    const { toDto } = getService('data-mapper');\n\n    ctx.body = { data: contentTypes.map(toDto) };\n  },\n\n  async findContentTypesSettings(ctx: any) {\n    const { findAllContentTypes, findConfiguration } = getService('content-types');\n\n    const contentTypes = await findAllContentTypes();\n    const configurations = await Promise.all(\n      contentTypes.map(async (contentType: any) => {\n        const { uid, settings } = await findConfiguration(contentType);\n        return { uid, settings };\n      })\n    );\n\n    ctx.body = {\n      data: configurations,\n    };\n  },\n\n  async findContentTypeConfiguration(ctx: any) {\n    const { uid } = ctx.params;\n\n    const contentTypeService = getService('content-types');\n\n    const contentType = await contentTypeService.findContentType(uid);\n\n    if (!contentType) {\n      return ctx.notFound('contentType.notFound');\n    }\n\n    const configuration = await contentTypeService.findConfiguration(contentType);\n\n    const confWithUpdatedMetadata = {\n      ...configuration,\n      metadatas: mapValues(assocMainField, configuration.metadatas),\n    };\n\n    const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n    ctx.body = {\n      data: {\n        contentType: confWithUpdatedMetadata,\n        components,\n      },\n    };\n  },\n\n  async updateContentTypeConfiguration(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { uid } = ctx.params;\n    const { body } = ctx.request;\n\n    const contentTypeService = getService('content-types');\n    const metricsService = getService('metrics');\n\n    const contentType = await contentTypeService.findContentType(uid);\n\n    if (!contentType) {\n      return ctx.notFound('contentType.notFound');\n    }\n\n    if (!getService('permission').canConfigureContentType({ userAbility, contentType })) {\n      return ctx.forbidden();\n    }\n\n    let input;\n    try {\n      input = await createModelConfigurationSchema(contentType).validate(body, {\n        abortEarly: false,\n        stripUnknown: true,\n        strict: true,\n      });\n    } catch (error: any) {\n      return ctx.badRequest(null, {\n        name: 'validationError',\n        errors: error.errors,\n      });\n    }\n\n    const newConfiguration = await contentTypeService.updateConfiguration(contentType, input);\n\n    await metricsService.sendDidConfigureListView(contentType, newConfiguration);\n\n    const confWithUpdatedMetadata = {\n      ...newConfiguration,\n      metadatas: mapValues(assocMainField, newConfiguration.metadatas),\n    };\n\n    const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n    ctx.body = {\n      data: {\n        contentType: confWithUpdatedMetadata,\n        components,\n      },\n    };\n  },\n};\n","import { getService } from '../utils';\n\nexport default {\n  getInitData(ctx: any) {\n    const { toDto } = getService('data-mapper');\n    const { findAllComponents } = getService('components');\n    const { getAllFieldSizes } = getService('field-sizes');\n    const { findAllContentTypes } = getService('content-types');\n\n    ctx.body = {\n      data: {\n        fieldSizes: getAllFieldSizes(),\n        components: findAllComponents().map(toDto),\n        contentTypes: findAllContentTypes().map(toDto),\n      },\n    };\n  },\n};\n","import { yup, validateYupSchema } from '@strapi/utils';\n\nconst validateFindAvailableSchema = yup\n  .object()\n  .shape({\n    component: yup.string(),\n    entityId: yup.strapiID(),\n    _q: yup.string(),\n    idsToOmit: yup.array().of(yup.strapiID()),\n    idsToInclude: yup.array().of(yup.strapiID()),\n    page: yup.number().integer().min(1),\n    pageSize: yup.number().integer().min(1).max(100),\n  })\n  .required();\n\nconst validateFindExistingSchema = yup\n  .object()\n  .shape({\n    page: yup.number().integer().min(1),\n    pageSize: yup.number().integer().min(1).max(100),\n  })\n  .required();\n\nconst validateFindAvailable = validateYupSchema(validateFindAvailableSchema, { strict: false });\nconst validateFindExisting = validateYupSchema(validateFindExistingSchema, { strict: false });\n\nexport { validateFindAvailable, validateFindExisting };\n","import { prop, isEmpty, uniq, flow, uniqBy, concat } from 'lodash/fp';\nimport { isOperatorOfType, contentTypes, relations } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { validateFindAvailable, validateFindExisting } from './validation/relations';\nimport { isListable } from '../services/utils/configuration/attributes';\n\nconst { hasDraftAndPublish } = contentTypes;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\nconst { isAnyToMany } = relations;\n\nconst addFiltersClause = (params: any, filtersClause: any) => {\n  params.filters = params.filters || {};\n  if (params.filters.$and) {\n    params.filters.$and.push(filtersClause);\n  } else {\n    params.filters.$and = [filtersClause];\n  }\n};\n\nconst sanitizeMainField = (model: any, mainField: any, userAbility: any) => {\n  const permissionChecker = getService('permission-checker').create({\n    userAbility,\n    model: model.uid,\n  });\n\n  // Whether the main field can be displayed or not, regardless of permissions.\n  const isMainFieldListable = isListable(model, mainField);\n  // Whether the user has the permission to access the model's main field (using RBAC abilities)\n  const canReadMainField = permissionChecker.can.read(null, mainField);\n\n  if (!isMainFieldListable || !canReadMainField) {\n    // Default to 'id' if the actual main field shouldn't be displayed\n    return 'id';\n  }\n\n  // Edge cases\n\n  // 1. Enforce 'name' as the main field for users and permissions' roles\n  if (model.uid === 'plugin::users-permissions.role') {\n    return 'name';\n  }\n\n  return mainField;\n};\n\nexport default {\n  async findAvailable(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model, targetField } = ctx.params;\n\n    await validateFindAvailable(ctx.request.query);\n\n    // idsToOmit: used to exclude relations that the front already added but that were not saved yet\n    // idsToInclude: used to include relations that the front removed but not saved yes\n    const { entityId, idsToOmit, idsToInclude, _q, ...query } = ctx.request.query;\n\n    const modelSchema = strapi.getModel(model);\n    if (!modelSchema) {\n      return ctx.badRequest(\"The model doesn't exist\");\n    }\n\n    const attribute: any = modelSchema.attributes[targetField];\n    if (!attribute || attribute.type !== 'relation') {\n      return ctx.badRequest(\"This relational field doesn't exist\");\n    }\n\n    const isComponent = modelSchema.modelType === 'component';\n\n    if (!isComponent) {\n      const permissionChecker = getService('permission-checker').create({\n        userAbility,\n        model,\n      });\n\n      if (permissionChecker.cannot.read(null, targetField)) {\n        return ctx.forbidden();\n      }\n\n      if (entityId) {\n        const entityManager = getService('entity-manager');\n\n        const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query);\n        // @ts-expect-error populate builder needs to be called with a UID\n        const populate = await getService('populate-builder')(model)\n          .populateFromQuery(permissionQuery)\n          .build();\n\n        const entity = await entityManager.findOne(entityId, model, { populate });\n\n        if (!entity) {\n          return ctx.notFound();\n        }\n\n        if (permissionChecker.cannot.read(entity, targetField)) {\n          return ctx.forbidden();\n        }\n      }\n    } else {\n      // eslint-disable-next-line no-lonely-if\n      if (entityId) {\n        const entity = await strapi.entityService.findOne(model, entityId);\n\n        if (!entity) {\n          return ctx.notFound();\n        }\n      }\n    }\n\n    const targetedModel: any = strapi.getModel(attribute.target);\n\n    const modelConfig = isComponent\n      ? await getService('components').findConfiguration(modelSchema)\n      : await getService('content-types').findConfiguration(modelSchema);\n\n    const mainField = flow(\n      prop(`metadatas.${targetField}.edit.mainField`),\n      (mainField) => mainField || 'id',\n      (mainField) => sanitizeMainField(targetedModel, mainField, userAbility)\n    )(modelConfig);\n\n    const fieldsToSelect = uniq(['id', mainField]);\n    if (hasDraftAndPublish(targetedModel)) {\n      fieldsToSelect.push(PUBLISHED_AT_ATTRIBUTE);\n    }\n\n    const permissionChecker = getService('permission-checker').create({\n      userAbility,\n      model: targetedModel.uid,\n    });\n    const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n    const queryParams = {\n      sort: mainField,\n      fields: fieldsToSelect, // cannot select other fields as the user may not have the permissions\n      ...permissionQuery,\n    };\n\n    if (!isEmpty(idsToOmit)) {\n      addFiltersClause(queryParams, { id: { $notIn: idsToOmit } });\n    }\n\n    // searching should be allowed only on mainField for permission reasons\n    if (_q) {\n      const _filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';\n      addFiltersClause(queryParams, { [mainField]: { [_filter]: _q } });\n    }\n\n    if (entityId) {\n      const subQuery = strapi.db.queryBuilder(modelSchema.uid);\n\n      const alias = subQuery.getAlias();\n\n      const where = {\n        id: entityId,\n        [`${alias}.id`]: { $notNull: true },\n      };\n\n      if (!isEmpty(idsToInclude)) {\n        where[`${alias}.id`].$notIn = idsToInclude;\n      }\n\n      const knexSubQuery = subQuery\n        .where(where)\n        .join({ alias, targetField })\n        .select(`${alias}.id`)\n        .getKnexQuery();\n\n      addFiltersClause(queryParams, { id: { $notIn: knexSubQuery } });\n    }\n\n    ctx.body = await strapi.entityService.findPage(targetedModel.uid, queryParams);\n  },\n\n  async findExisting(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model, id, targetField } = ctx.params;\n\n    await validateFindExisting(ctx.request.query);\n\n    const modelSchema = strapi.getModel(model);\n    if (!modelSchema) {\n      return ctx.badRequest(\"The model doesn't exist\");\n    }\n\n    const attribute: any = modelSchema.attributes[targetField];\n    if (!attribute || attribute.type !== 'relation') {\n      return ctx.badRequest(\"This relational field doesn't exist\");\n    }\n\n    const isComponent = modelSchema.modelType === 'component';\n\n    if (!isComponent) {\n      const entityManager = getService('entity-manager');\n      const permissionChecker = getService('permission-checker').create({\n        userAbility,\n        model,\n      });\n\n      if (permissionChecker.cannot.read(null, targetField)) {\n        return ctx.forbidden();\n      }\n\n      const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query);\n      // @ts-expect-error populate builder needs to be called with a UID\n      const populate = await getService('populate-builder')(model)\n        .populateFromQuery(permissionQuery)\n        .build();\n\n      const entity = await entityManager.findOne(id, model, { populate });\n\n      if (!entity) {\n        return ctx.notFound();\n      }\n\n      if (permissionChecker.cannot.read(entity, targetField)) {\n        return ctx.forbidden();\n      }\n    } else {\n      const entity = await strapi.entityService.findOne(model, id);\n\n      if (!entity) {\n        return ctx.notFound();\n      }\n    }\n\n    const targetedModel = strapi.getModel(attribute.target);\n\n    const modelConfig = isComponent\n      ? await getService('components').findConfiguration(modelSchema)\n      : await getService('content-types').findConfiguration(modelSchema);\n\n    const mainField = flow(\n      prop(`metadatas.${targetField}.edit.mainField`),\n      (mainField) => mainField || 'id',\n      (mainField) => sanitizeMainField(targetedModel, mainField, userAbility)\n    )(modelConfig);\n\n    const fieldsToSelect = uniq(['id', mainField]);\n    if (hasDraftAndPublish(targetedModel)) {\n      fieldsToSelect.push(PUBLISHED_AT_ATTRIBUTE);\n    }\n\n    const queryParams = {\n      fields: fieldsToSelect,\n    };\n\n    const permissionChecker = getService('permission-checker').create({\n      userAbility,\n      model: targetedModel.uid,\n    });\n    const permissionQuery = await permissionChecker.sanitizedQuery.read(queryParams);\n\n    if (isAnyToMany(attribute)) {\n      const res = await strapi.entityService.loadPages(\n        model,\n        { id },\n        targetField,\n        {\n          fields: ['id'],\n          ordering: 'desc',\n        } as any,\n        {\n          page: ctx.request.query.page,\n          pageSize: ctx.request.query.pageSize,\n        }\n      );\n      const ids = res.results.map((item: any) => item.id);\n\n      addFiltersClause(permissionQuery, { id: { $in: ids } });\n\n      const sanitizedRes = await strapi.entityService.loadPages(\n        model,\n        { id },\n        targetField,\n        {\n          ...permissionQuery,\n          ordering: 'desc',\n        } as any,\n        {\n          page: 1,\n          pageSize: ids.length,\n        }\n      );\n\n      res.results = uniqBy('id', concat(sanitizedRes.results, res.results));\n\n      ctx.body = res;\n    } else {\n      const [resWithOnlyId, res] = await Promise.all([\n        strapi.entityService.load(model, { id }, targetField, {\n          fields: ['id'],\n        }),\n        strapi.entityService.load(model, { id }, targetField, {\n          ...permissionQuery,\n        }),\n      ]);\n      const result = res || resWithOnlyId;\n      ctx.body = {\n        data: result,\n      };\n    }\n  },\n};\n","import { setCreatorFields, pipeAsync } from '@strapi/utils';\n\nimport { getService } from '../utils';\n\nconst findEntity = async (query: any, model: any) => {\n  const entityManager = getService('entity-manager');\n\n  // @ts-expect-error populate builder needs to be called with a UID\n  const populate = await getService('populate-builder')(model)\n    .populateFromQuery(query)\n    .populateDeep(Infinity)\n    .countRelations()\n    .build();\n\n  return entityManager.find(query, model, { populate });\n};\n\nexport default {\n  async find(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model } = ctx.params;\n    const { query = {} } = ctx.request;\n\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.read()) {\n      return ctx.forbidden();\n    }\n\n    const permissionQuery = await permissionChecker.sanitizedQuery.read(query);\n\n    const entity = await findEntity(permissionQuery, model);\n\n    // allow user with create permission to know a single type is not created\n    if (!entity) {\n      if (permissionChecker.cannot.create()) {\n        return ctx.forbidden();\n      }\n\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.read(entity)) {\n      return ctx.forbidden();\n    }\n\n    ctx.body = await permissionChecker.sanitizeOutput(entity);\n  },\n\n  async createOrUpdate(ctx: any) {\n    const { user, userAbility } = ctx.state;\n    const { model } = ctx.params;\n    const { body, query } = ctx.request;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.create() && permissionChecker.cannot.update()) {\n      return ctx.forbidden();\n    }\n\n    const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query);\n    const entity = await findEntity(sanitizedQuery, model);\n\n    const pickPermittedFields = entity\n      ? permissionChecker.sanitizeUpdateInput(entity)\n      : permissionChecker.sanitizeCreateInput;\n\n    const setCreator = entity\n      ? setCreatorFields({ user, isEdition: true })\n      : setCreatorFields({ user });\n\n    const sanitizeFn = pipeAsync(pickPermittedFields, setCreator as any);\n\n    if (!entity) {\n      const sanitizedBody = await sanitizeFn(body);\n      const newEntity = await entityManager.create(sanitizedBody, model, {\n        params: sanitizedQuery,\n      });\n      ctx.body = await permissionChecker.sanitizeOutput(newEntity);\n\n      await strapi.telemetry.send('didCreateFirstContentTypeEntry', {\n        eventProperties: { model },\n      });\n      return;\n    }\n\n    if (permissionChecker.cannot.update(entity)) {\n      return ctx.forbidden();\n    }\n\n    const sanitizedBody = await sanitizeFn(body);\n    const updatedEntity = await entityManager.update(entity, sanitizedBody, model);\n    ctx.body = await permissionChecker.sanitizeOutput(updatedEntity);\n  },\n\n  async delete(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model } = ctx.params;\n    const { query = {} } = ctx.request;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.delete()) {\n      return ctx.forbidden();\n    }\n\n    const sanitizedQuery = await permissionChecker.sanitizedQuery.delete(query);\n\n    const entity = await findEntity(sanitizedQuery, model);\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.delete(entity)) {\n      return ctx.forbidden();\n    }\n\n    const deletedEntity = await entityManager.delete(entity, model);\n\n    ctx.body = await permissionChecker.sanitizeOutput(deletedEntity);\n  },\n\n  async publish(ctx: any) {\n    const { userAbility, user } = ctx.state;\n    const { model } = ctx.params;\n    const { query = {} } = ctx.request;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.publish()) {\n      return ctx.forbidden();\n    }\n\n    const sanitizedQuery = await permissionChecker.sanitizedQuery.publish(query);\n\n    const entity = await findEntity(sanitizedQuery, model);\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.publish(entity)) {\n      return ctx.forbidden();\n    }\n\n    const publishedEntity = await entityManager.publish(\n      entity,\n      model,\n      setCreatorFields({ user, isEdition: true })({})\n    );\n\n    ctx.body = await permissionChecker.sanitizeOutput(publishedEntity);\n  },\n\n  async unpublish(ctx: any) {\n    const { userAbility, user } = ctx.state;\n    const { model } = ctx.params;\n    const { query = {} } = ctx.request;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.unpublish()) {\n      return ctx.forbidden();\n    }\n\n    const sanitizedQuery = await permissionChecker.sanitizedQuery.unpublish(query);\n\n    const entity = await findEntity(sanitizedQuery, model);\n\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.unpublish(entity)) {\n      return ctx.forbidden();\n    }\n\n    const unpublishedEntity = await entityManager.unpublish(\n      entity,\n      model,\n      setCreatorFields({ user, isEdition: true })({})\n    );\n\n    ctx.body = await permissionChecker.sanitizeOutput(unpublishedEntity);\n  },\n\n  async countDraftRelations(ctx: any) {\n    const { userAbility } = ctx.state;\n    const { model } = ctx.params;\n\n    const entityManager = getService('entity-manager');\n    const permissionChecker = getService('permission-checker').create({ userAbility, model });\n\n    if (permissionChecker.cannot.read()) {\n      return ctx.forbidden();\n    }\n\n    const entity = await findEntity({}, model);\n    if (!entity) {\n      return ctx.notFound();\n    }\n\n    if (permissionChecker.cannot.read(entity)) {\n      return ctx.forbidden();\n    }\n\n    const number = await entityManager.countDraftRelations(entity.id, model);\n\n    return {\n      data: number,\n    };\n  },\n};\n","import { getService } from '../utils';\nimport {\n  validateGenerateUIDInput,\n  validateCheckUIDAvailabilityInput,\n  validateUIDField,\n} from './validation';\n\nexport default {\n  async generateUID(ctx: any) {\n    const { contentTypeUID, field, data } = await validateGenerateUIDInput(ctx.request.body);\n\n    await validateUIDField(contentTypeUID, field);\n\n    const uidService = getService('uid');\n\n    ctx.body = {\n      data: await uidService.generateUIDField({ contentTypeUID, field, data }),\n    };\n  },\n\n  async checkUIDAvailability(ctx: any) {\n    const { contentTypeUID, field, value } = await validateCheckUIDAvailabilityInput(\n      ctx.request.body\n    );\n\n    await validateUIDField(contentTypeUID, field);\n\n    const uidService = getService('uid');\n\n    const isAvailable = await uidService.checkUIDAvailability({ contentTypeUID, field, value });\n\n    ctx.body = {\n      isAvailable,\n      suggestion: !isAvailable\n        ? await uidService.findUniqueUID({ contentTypeUID, field, value })\n        : null,\n    };\n  },\n};\n","import collectionTypes from './collection-types';\nimport components from './components';\nimport contentTypes from './content-types';\nimport init from './init';\nimport relations from './relations';\nimport singleTypes from './single-types';\nimport uid from './uid';\n\nexport default {\n  'collection-types': collectionTypes,\n  components,\n  'content-types': contentTypes,\n  init,\n  relations,\n  'single-types': singleTypes,\n  uid,\n};\n","import _ from 'lodash';\n\nconst keys = {\n  CONFIGURATION: 'configuration',\n};\n\nconst getStore = () => strapi.store({ type: 'plugin', name: 'content_manager' });\n\n/** Model configuration */\nconst EMPTY_CONFIG = {\n  settings: {},\n  metadatas: {},\n  layouts: {},\n};\n\nconst configurationKey = (key: any) => `${keys.CONFIGURATION}_${key}`;\n\nconst getModelConfiguration = async (key: any) => {\n  const config = await getStore().get({ key: configurationKey(key) });\n  return _.merge({}, EMPTY_CONFIG, config);\n};\n\nconst setModelConfiguration = async (key: string, value: any) => {\n  const storedConfig = (await getStore().get({ key: configurationKey(key) })) || {};\n  const currentConfig = { ...storedConfig };\n\n  Object.keys(value).forEach((key) => {\n    if (value[key] !== null && value[key] !== undefined) {\n      _.set(currentConfig, key, value[key]);\n    }\n  });\n\n  if (!_.isEqual(currentConfig, storedConfig)) {\n    return getStore().set({\n      key: configurationKey(key),\n      value: currentConfig,\n    });\n  }\n};\n\nconst deleteKey = (key: any) => {\n  return strapi\n    .query('strapi::core-store')\n    .delete({ where: { key: `plugin_content_manager_configuration_${key}` } });\n};\n\nconst findByKey = async (key: any) => {\n  const results = await strapi.query('strapi::core-store').findMany({\n    where: {\n      key: {\n        $startsWith: key,\n      },\n    },\n  });\n\n  return results.map(({ value }) => JSON.parse(value));\n};\n\nconst getAllConfigurations = () => findByKey('plugin_content_manager_configuration');\n\nexport default {\n  getAllConfigurations,\n  findByKey,\n  getModelConfiguration,\n  setModelConfiguration,\n  deleteKey,\n  keys,\n};\n","import _ from 'lodash';\nimport { getService } from '../../../utils';\nimport {\n  isSortable,\n  isSearchable,\n  isVisible,\n  isListable,\n  isRelation,\n  getDefaultMainField,\n} from './attributes';\n\nfunction createDefaultMetadatas(schema: any) {\n  return {\n    ...Object.keys(schema.attributes).reduce((acc: any, name) => {\n      acc[name] = createDefaultMetadata(schema, name);\n      return acc;\n    }, {}),\n    id: {\n      edit: {},\n      list: {\n        label: 'id',\n        searchable: true,\n        sortable: true,\n      },\n    },\n  };\n}\n\nfunction createDefaultMetadata(schema: any, name: any) {\n  const edit = {\n    label: name,\n    description: '',\n    placeholder: '',\n    visible: isVisible(schema, name),\n    editable: true,\n  } as any;\n\n  const fieldAttributes = schema.attributes[name];\n  if (isRelation(fieldAttributes)) {\n    const { targetModel } = fieldAttributes;\n\n    const targetSchema = getTargetSchema(targetModel);\n\n    if (targetSchema) {\n      edit.mainField = getDefaultMainField(targetSchema);\n    }\n  }\n\n  _.assign(\n    edit,\n    _.pick(_.get(schema, ['config', 'metadatas', name, 'edit'], {}), [\n      'label',\n      'description',\n      'placeholder',\n      'visible',\n      'editable',\n      'mainField',\n    ])\n  );\n\n  const list = {\n    // @ts-expect-error we need to specify these properties\n    label: name,\n    // @ts-expect-error we need to specify these properties\n    searchable: isSearchable(schema, name),\n    // @ts-expect-error we need to specify these properties\n    sortable: isSortable(schema, name),\n    ..._.pick(_.get(schema, ['config', 'metadatas', name, 'list'], {}), [\n      'label',\n      'searchable',\n      'sortable',\n    ]),\n  };\n\n  return { edit, list };\n}\n\n/** Synchronisation functions */\n\nasync function syncMetadatas(configuration: any, schema: any) {\n  // clear all keys that do not exist anymore\n  if (_.isEmpty(configuration.metadatas)) {\n    return createDefaultMetadatas(schema);\n  }\n\n  // remove old keys\n  const metasWithValidKeys = _.pick(configuration.metadatas, Object.keys(schema.attributes));\n\n  // add new keys and missing fields\n  const metasWithDefaults = _.merge({}, createDefaultMetadatas(schema), metasWithValidKeys);\n\n  // clear the invalid mainFields\n  const updatedMetas = Object.keys(metasWithDefaults).reduce((acc, key) => {\n    const { edit, list } = metasWithDefaults[key];\n    const attr = schema.attributes[key];\n\n    const updatedMeta = { edit, list };\n    // update sortable attr\n    if (list.sortable && !isSortable(schema, key)) {\n      _.set(updatedMeta, ['list', 'sortable'], false);\n      _.set(acc, [key], updatedMeta);\n    }\n\n    if (list.searchable && !isSearchable(schema, key)) {\n      _.set(updatedMeta, ['list', 'searchable'], false);\n      _.set(acc, [key], updatedMeta);\n    }\n\n    if (!_.has(edit, 'mainField')) return acc;\n\n    // remove mainField if the attribute is not a relation anymore\n    if (!isRelation(attr)) {\n      _.set(updatedMeta, 'edit', _.omit(edit, ['mainField']));\n      _.set(acc, [key], updatedMeta);\n      return acc;\n    }\n\n    // if the mainField is id you can keep it\n    if (edit.mainField === 'id') return acc;\n\n    // check the mainField in the targetModel\n    const targetSchema = getTargetSchema(attr.targetModel);\n\n    if (!targetSchema) return acc;\n\n    if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {\n      _.set(updatedMeta, ['edit', 'mainField'], getDefaultMainField(targetSchema));\n      _.set(acc, [key], updatedMeta);\n      return acc;\n    }\n\n    return acc;\n  }, {});\n\n  return _.assign(metasWithDefaults, updatedMetas);\n}\n\nconst getTargetSchema = (targetModel: any) => {\n  return getService('content-types').findContentType(targetModel);\n};\n\nexport { createDefaultMetadatas, syncMetadatas };\n","import _ from 'lodash';\nimport { getService } from '../../../utils';\nimport { isListable, hasEditableAttribute, hasRelationAttribute } from './attributes';\n\nconst DEFAULT_LIST_LENGTH = 4;\nconst MAX_ROW_SIZE = 12;\n\nconst isAllowedFieldSize = (type: any, size: any) => {\n  const { getFieldSize } = getService('field-sizes');\n  const fieldSize = getFieldSize(type);\n\n  // Check if field was locked to another size\n  if (!fieldSize.isResizable && size !== fieldSize.default) {\n    return false;\n  }\n\n  // Otherwise allow unless it's bigger than a row\n  return size <= MAX_ROW_SIZE;\n};\n\nconst getDefaultFieldSize = (attribute: any) => {\n  const { hasFieldSize, getFieldSize } = getService('field-sizes');\n\n  // Check if it's a custom field with a custom size and get the default size for the field type\n  return getFieldSize(hasFieldSize(attribute.customField) ? attribute.customField : attribute.type)\n    .default;\n};\n\nasync function createDefaultLayouts(schema: any) {\n  return {\n    // @ts-expect-error necessary to provide this default layout\n    list: createDefaultListLayout(schema),\n    // @ts-expect-error necessary to provide this default layout\n    edit: createDefaultEditLayout(schema),\n    ..._.pick(_.get(schema, ['config', 'layouts'], {}), ['list', 'edit']),\n  };\n}\n\nfunction createDefaultListLayout(schema: any) {\n  return Object.keys(schema.attributes)\n    .filter((name) => isListable(schema, name))\n    .slice(0, DEFAULT_LIST_LENGTH);\n}\n\nconst rowSize = (els: any) => els.reduce((sum: any, el: any) => sum + el.size, 0);\n\nfunction createDefaultEditLayout(schema: any) {\n  const keys = Object.keys(schema.attributes).filter((name) => hasEditableAttribute(schema, name));\n\n  return appendToEditLayout([], keys, schema);\n}\n\n/** Synchronisation functions */\n\nfunction syncLayouts(configuration: any, schema: any) {\n  if (_.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);\n\n  const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};\n\n  let cleanList = list.filter((attr: any) => isListable(schema, attr));\n\n  // TODO V5: remove editRelations\n  const cleanEditRelations = editRelations.filter((attr: any) =>\n    hasRelationAttribute(schema, attr)\n  );\n\n  // backward compatibility with when relations were on the side of the layout\n  // it migrates the displayed relations to the main edit layout\n  const elementsToReAppend = [...cleanEditRelations];\n  let cleanEdit = [];\n  for (const row of edit) {\n    const newRow = [];\n\n    for (const el of row) {\n      if (!hasEditableAttribute(schema, el.name)) continue;\n\n      // Check if the field is a custom field with a custom size.\n      // If so, use the custom size instead of the type size\n      const { hasFieldSize } = getService('field-sizes');\n      const fieldType = hasFieldSize(schema.attributes[el.name].customField)\n        ? schema.attributes[el.name].customField\n        : schema.attributes[el.name].type;\n\n      /* if the type of a field was changed (ex: string -> json) or a new field was added in the schema\n         and the new type doesn't allow the size of the previous type, append the field at the end of layouts\n      */\n      if (!isAllowedFieldSize(fieldType, el.size)) {\n        elementsToReAppend.push(el.name);\n        continue;\n      }\n\n      newRow.push(el);\n    }\n\n    if (newRow.length > 0) {\n      cleanEdit.push(newRow);\n    }\n  }\n\n  cleanEdit = appendToEditLayout(cleanEdit as any, elementsToReAppend, schema);\n\n  const newAttributes = _.difference(\n    Object.keys(schema.attributes),\n    Object.keys(configuration.metadatas)\n  );\n\n  /** Add new attributes where they belong */\n\n  if (cleanList.length < DEFAULT_LIST_LENGTH) {\n    // add newAttributes\n    // only add valid listable attributes\n    cleanList = _.uniq(\n      cleanList\n        .concat(newAttributes.filter((key) => isListable(schema, key)))\n        .slice(0, DEFAULT_LIST_LENGTH)\n    );\n  }\n\n  // add new attributes to edit view\n  const newEditAttributes = newAttributes.filter((key) => hasEditableAttribute(schema, key));\n\n  cleanEdit = appendToEditLayout(cleanEdit, newEditAttributes, schema);\n\n  return {\n    list: cleanList.length > 0 ? cleanList : createDefaultListLayout(schema),\n    edit: cleanEdit.length > 0 ? cleanEdit : createDefaultEditLayout(schema),\n  };\n}\n\n// eslint-disable-next-line @typescript-eslint/default-param-last\nconst appendToEditLayout = (layout: any = [], keysToAppend: any, schema: any) => {\n  if (keysToAppend.length === 0) return layout;\n  let currentRowIndex = Math.max(layout.length - 1, 0);\n\n  // init currentRow if necessary\n  if (!layout[currentRowIndex]) {\n    layout[currentRowIndex] = [];\n  }\n\n  for (const key of keysToAppend) {\n    const attribute = schema.attributes[key];\n\n    const attributeSize = getDefaultFieldSize(attribute);\n    const currenRowSize = rowSize(layout[currentRowIndex]);\n\n    if (currenRowSize + attributeSize > MAX_ROW_SIZE) {\n      currentRowIndex += 1;\n      layout[currentRowIndex] = [];\n    }\n\n    layout[currentRowIndex].push({\n      name: key,\n      size: attributeSize,\n    });\n  }\n\n  return layout;\n};\n\nexport { createDefaultLayouts, syncLayouts };\n","import { createModelConfigurationSchema } from '../../../controllers/validation';\nimport { createDefaultSettings, syncSettings } from './settings';\nimport { createDefaultMetadatas, syncMetadatas } from './metadatas';\nimport { createDefaultLayouts, syncLayouts } from './layouts';\n\nasync function validateCustomConfig(schema: any) {\n  try {\n    await createModelConfigurationSchema(schema, {\n      allowUndefined: true,\n    }).validate(schema.config);\n  } catch (error: any) {\n    throw new Error(\n      `Invalid Model configuration for model ${schema.uid}. Verify your {{ modelName }}.config.js(on) file:\\n  - ${error.message}\\n`\n    );\n  }\n}\n\nasync function createDefaultConfiguration(schema: any) {\n  await validateCustomConfig(schema);\n\n  return {\n    settings: await createDefaultSettings(schema),\n    metadatas: await createDefaultMetadatas(schema),\n    layouts: await createDefaultLayouts(schema),\n  };\n}\n\nasync function syncConfiguration(conf: any, schema: any) {\n  await validateCustomConfig(schema);\n\n  return {\n    settings: await syncSettings(conf, schema),\n    layouts: await syncLayouts(conf, schema),\n    metadatas: await syncMetadatas(conf, schema),\n  };\n}\n\nexport { createDefaultConfiguration, syncConfiguration };\n","import { intersection, difference } from 'lodash';\n\nimport type { Settings, Metadatas, Layouts } from '../../../shared/contracts/content-types';\n\nimport { createDefaultConfiguration, syncConfiguration } from './utils/configuration';\n\nexport type ConfigurationUpdate = {\n  settings: Settings;\n  metadatas: Metadatas;\n  layouts: Layouts;\n  options?: Record<string, unknown>;\n};\n\nexport default ({\n  isComponent,\n  prefix,\n  storeUtils,\n  getModels,\n}: {\n  isComponent?: boolean;\n  prefix: string;\n  storeUtils: any;\n  getModels: any;\n}) => {\n  const uidToStoreKey = (uid: string) => {\n    return `${prefix}::${uid}`;\n  };\n\n  const getConfiguration = (uid: string) => {\n    const storeKey = uidToStoreKey(uid);\n\n    return storeUtils.getModelConfiguration(storeKey);\n  };\n\n  const setConfiguration = (uid: string, input: ConfigurationUpdate) => {\n    const configuration = {\n      ...input,\n      uid,\n      isComponent: isComponent ?? undefined,\n    };\n\n    const storeKey = uidToStoreKey(uid);\n    return storeUtils.setModelConfiguration(storeKey, configuration);\n  };\n\n  const deleteConfiguration = (uid: string) => {\n    const storeKey = uidToStoreKey(uid);\n\n    return storeUtils.deleteKey(storeKey);\n  };\n\n  const syncConfigurations = async () => {\n    const models = getModels();\n\n    const configurations = await storeUtils.findByKey(\n      `plugin_content_manager_configuration_${prefix}`\n    );\n\n    const updateConfiguration = async (uid: string) => {\n      const conf = configurations.find((conf: any) => conf.uid === uid);\n\n      return setConfiguration(uid, await syncConfiguration(conf, models[uid]));\n    };\n\n    const generateNewConfiguration = async (uid: string) => {\n      return setConfiguration(uid, await createDefaultConfiguration(models[uid]));\n    };\n\n    const currentUIDS = Object.keys(models);\n    const DBUIDs = configurations.map(({ uid }: any) => uid);\n\n    const contentTypesToUpdate = intersection(currentUIDS, DBUIDs);\n    const contentTypesToAdd = difference(currentUIDS, DBUIDs);\n    const contentTypesToDelete = difference(DBUIDs, currentUIDS);\n\n    // delete old schemas\n    await Promise.all(contentTypesToDelete.map((uid) => deleteConfiguration(uid)));\n\n    // create new schemas\n    await Promise.all(contentTypesToAdd.map((uid) => generateNewConfiguration(uid)));\n\n    // update current schemas\n    await Promise.all(contentTypesToUpdate.map((uid) => updateConfiguration(uid)));\n  };\n\n  return {\n    getConfiguration,\n    setConfiguration,\n    deleteConfiguration,\n    syncConfigurations,\n  };\n};\n","import { has, isNil, mapValues } from 'lodash/fp';\n\nimport { Strapi, UID, Schema } from '@strapi/types';\nimport type { Configuration } from '../../../shared/contracts/content-types';\nimport type { ConfigurationUpdate } from './configuration';\n\nimport { getService } from '../utils';\nimport storeUtils from './utils/store';\nimport createConfigurationService from './configuration';\n\nconst STORE_KEY_PREFIX = 'components';\n\nconst configurationService = createConfigurationService({\n  storeUtils,\n  isComponent: true,\n  prefix: STORE_KEY_PREFIX,\n  getModels() {\n    const { toContentManagerModel } = getService('data-mapper');\n\n    return mapValues(toContentManagerModel, strapi.components);\n  },\n});\n\nexport default ({ strapi }: { strapi: Strapi }) => ({\n  findAllComponents() {\n    const { toContentManagerModel } = getService('data-mapper');\n\n    return Object.values(strapi.components).map(toContentManagerModel);\n  },\n\n  findComponent(uid: UID.Component) {\n    const { toContentManagerModel } = getService('data-mapper');\n\n    const component = strapi.components[uid];\n\n    return isNil(component) ? component : toContentManagerModel(component);\n  },\n\n  async findConfiguration(component: Schema.Component) {\n    const configuration: Configuration = await configurationService.getConfiguration(component.uid);\n\n    return {\n      uid: component.uid,\n      category: component.category,\n      ...configuration,\n    };\n  },\n\n  async updateConfiguration(component: Schema.Component, newConfiguration: ConfigurationUpdate) {\n    await configurationService.setConfiguration(component.uid, newConfiguration);\n\n    return this.findConfiguration(component);\n  },\n\n  async findComponentsConfigurations(model: Schema.Component) {\n    const componentsMap: Record<\n      string,\n      Configuration & { category: string; isComponent: boolean }\n    > = {};\n\n    const getComponentConfigurations = async (uid: UID.Component) => {\n      const component = this.findComponent(uid);\n\n      if (has(uid, componentsMap)) {\n        return;\n      }\n\n      const componentConfiguration = await this.findConfiguration(component);\n      const componentsConfigurations = await this.findComponentsConfigurations(component);\n\n      Object.assign(componentsMap, {\n        [uid]: componentConfiguration,\n        ...componentsConfigurations,\n      });\n    };\n\n    for (const key of Object.keys(model.attributes)) {\n      const attribute = model.attributes[key];\n\n      if (attribute.type === 'component') {\n        await getComponentConfigurations(attribute.component);\n      }\n\n      if (attribute.type === 'dynamiczone') {\n        for (const componentUid of attribute.components) {\n          await getComponentConfigurations(componentUid);\n        }\n      }\n    }\n\n    return componentsMap;\n  },\n\n  syncConfigurations() {\n    return configurationService.syncConfigurations();\n  },\n});\n","import { isNil, mapValues } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport { LoadedStrapi as Strapi, UID, Schema } from '@strapi/types';\n\nimport type { ConfigurationUpdate } from './configuration';\n\nimport { getService } from '../utils';\nimport storeUtils from './utils/store';\nimport createConfigurationService from './configuration';\n\nconst configurationService = createConfigurationService({\n  storeUtils,\n  prefix: 'content_types',\n  getModels() {\n    const { toContentManagerModel } = getService('data-mapper');\n\n    return mapValues(toContentManagerModel, strapi.contentTypes);\n  },\n});\n\nconst service = ({ strapi }: { strapi: Strapi }) => ({\n  findAllContentTypes() {\n    const { toContentManagerModel } = getService('data-mapper');\n\n    return Object.values(strapi.contentTypes).map(toContentManagerModel);\n  },\n\n  findContentType(uid: UID.ContentType) {\n    const { toContentManagerModel } = getService('data-mapper');\n\n    const contentType = strapi.contentTypes[uid];\n\n    return isNil(contentType) ? contentType : toContentManagerModel(contentType);\n  },\n\n  findDisplayedContentTypes() {\n    return this.findAllContentTypes().filter(\n      // TODO\n      // @ts-expect-error should be resolved from data-mapper types\n      ({ isDisplayed }: { isDisplayed: boolean }) => isDisplayed === true\n    );\n  },\n\n  findContentTypesByKind(kind: { kind: Schema.ContentTypeKind | undefined }) {\n    if (!kind) {\n      return this.findAllContentTypes();\n    }\n\n    // @ts-expect-error TODO when adding types\n    return this.findAllContentTypes().filter(contentTypesUtils.isKind(kind));\n  },\n\n  async findConfiguration(contentType: Schema.ContentType) {\n    const configuration = await configurationService.getConfiguration(contentType.uid);\n\n    return {\n      uid: contentType.uid,\n      ...configuration,\n    };\n  },\n\n  async updateConfiguration(\n    contentType: Schema.ContentType,\n    newConfiguration: ConfigurationUpdate\n  ) {\n    await configurationService.setConfiguration(contentType.uid, newConfiguration);\n\n    return this.findConfiguration(contentType);\n  },\n\n  findComponentsConfigurations(contentType: Schema.ContentType) {\n    // delegate to componentService\n    return getService('components').findComponentsConfigurations(contentType);\n  },\n\n  syncConfigurations() {\n    return configurationService.syncConfigurations();\n  },\n});\n\nexport default service;\n","import { pick, getOr } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport { Attribute, Schema } from '@strapi/types';\n\nconst dtoFields = [\n  'uid',\n  'isDisplayed',\n  'apiID',\n  'kind',\n  'category',\n  'info',\n  'options',\n  'pluginOptions',\n  'attributes',\n  'pluginOptions',\n];\n\nexport default () => ({\n  toContentManagerModel(contentType: Schema.Component) {\n    return {\n      ...contentType,\n      apiID: contentType.modelName,\n      isDisplayed: isVisible(contentType),\n      attributes: {\n        id: {\n          type: 'integer',\n        },\n        ...formatAttributes(contentType),\n      },\n    };\n  },\n\n  toDto: pick(dtoFields),\n});\n\nconst formatAttributes = (contentType: Schema.Component) => {\n  const { getVisibleAttributes, getTimestamps, getCreatorFields } = contentTypesUtils;\n\n  // only get attributes that can be seen in the auto generated Edit view or List view\n  return getVisibleAttributes(contentType)\n    .concat(getTimestamps(contentType))\n    .concat(getCreatorFields(contentType))\n    .reduce((acc: any, key: string) => {\n      const attribute = contentType.attributes[key];\n\n      // ignore morph until they are handled in the front\n      if (attribute.type === 'relation' && attribute.relation.toLowerCase().includes('morph')) {\n        return acc;\n      }\n\n      acc[key] = formatAttribute(key, attribute);\n      return acc;\n    }, {});\n};\n\n// FIXME: not needed\nconst formatAttribute = (key: any, attribute: Attribute.Any) => {\n  if (attribute.type === 'relation') {\n    return toRelation(attribute);\n  }\n\n  return attribute;\n};\n\n// FIXME: not needed\nconst toRelation = (attribute: Attribute.Relation) => {\n  return {\n    ...attribute,\n    type: 'relation',\n    targetModel: 'target' in attribute ? attribute.target : undefined,\n    relationType: attribute.relation,\n  };\n};\n\nconst isVisible = (model: Schema.Component): boolean =>\n  getOr(true, 'pluginOptions.content-manager.visible', model) === true;\n","import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport { Common, Attribute, EntityService } from '@strapi/types';\n\nconst { hasDraftAndPublish, isVisibleAttribute } = strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n  isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = EntityService.Params.Populate.Any<Common.UID.Schema>;\n\ntype PopulateOptions = {\n  initialPopulate?: Populate;\n  countMany?: boolean;\n  countOne?: boolean;\n  maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n  attribute: Attribute.Any,\n  model: Model,\n  attributeName: string,\n  { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n  const isManyRelation = isAnyToMany(attribute);\n\n  if (initialPopulate) {\n    return initialPopulate;\n  }\n\n  // always populate createdBy, updatedBy, localizations etc.\n  if (!isVisibleAttribute(model, attributeName)) {\n    return true;\n  }\n\n  if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n    return { count: true };\n  }\n\n  return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n  attribute: Attribute.DynamicZone,\n  options: PopulateOptions,\n  level: number\n) {\n  // Use fragments to populate the dynamic zone components\n  const populatedComponents = (attribute.components || []).reduce(\n    (acc: any, componentUID: Common.UID.Component) => ({\n      ...acc,\n      [componentUID]: {\n        populate: getDeepPopulate(componentUID, options, level + 1),\n      },\n    }),\n    {}\n  );\n\n  return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n  attributeName: string,\n  model: any,\n  options: PopulateOptions,\n  level: number\n): { [key: string]: boolean | object } {\n  const attribute = model.attributes[attributeName];\n\n  switch (attribute.type) {\n    case 'relation':\n      // @ts-expect-error - TODO: support populate count typing\n      return {\n        [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n      };\n    case 'component':\n      return {\n        [attributeName]: {\n          populate: getDeepPopulate(attribute.component, options, level + 1),\n        },\n      };\n    case 'media':\n      return {\n        [attributeName]: { populate: 'folder' },\n      };\n    case 'dynamiczone':\n      return {\n        [attributeName]: getPopulateForDZ(attribute, options, level),\n      };\n    default:\n      return {};\n  }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n  uid: Common.UID.Schema,\n  {\n    initialPopulate = {} as any,\n    countMany = false,\n    countOne = false,\n    maxLevel = Infinity,\n  }: PopulateOptions = {},\n  level = 1\n) => {\n  if (level > maxLevel) {\n    return {};\n  }\n\n  const model = strapi.getModel(uid);\n\n  return Object.keys(model.attributes).reduce(\n    (populateAcc, attributeName: string) =>\n      merge(\n        populateAcc,\n        getPopulateFor(\n          attributeName,\n          model,\n          {\n            // @ts-expect-error - improve types\n            initialPopulate: initialPopulate?.[attributeName],\n            countMany,\n            countOne,\n            maxLevel,\n          },\n          level\n        )\n      ),\n    {}\n  );\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param  uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst getDeepPopulateDraftCount = (uid: Common.UID.Schema) => {\n  const model = strapi.getModel(uid);\n  let hasRelations = false;\n\n  const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n    const attribute: any = model.attributes[attributeName];\n\n    switch (attribute.type) {\n      case 'relation': {\n        const childModel = strapi.getModel(attribute.target);\n        if (hasDraftAndPublish(childModel) && isVisibleAttribute(model, attributeName)) {\n          populateAcc[attributeName] = {\n            count: true,\n            filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n          };\n          hasRelations = true;\n        }\n        break;\n      }\n      case 'component': {\n        const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n          attribute.component\n        );\n        if (childHasRelations) {\n          populateAcc[attributeName] = { populate };\n          hasRelations = true;\n        }\n        break;\n      }\n      case 'dynamiczone': {\n        const dzPopulate = (attribute.components || []).reduce((acc: any, componentUID: any) => {\n          const { populate, hasRelations: childHasRelations } =\n            getDeepPopulateDraftCount(componentUID);\n          if (childHasRelations) {\n            hasRelations = true;\n            return merge(acc, populate);\n          }\n          return acc;\n        }, {});\n\n        if (!isEmpty(dzPopulate)) {\n          populateAcc[attributeName] = { populate: dzPopulate };\n        }\n        break;\n      }\n      default:\n    }\n\n    return populateAcc;\n  }, {});\n\n  return { populate, hasRelations };\n};\n\n/**\n *  Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: Common.UID.Schema, query: object): Promise<Populate> => {\n  let populateQuery: Populate = {};\n\n  await strapiUtils.traverse.traverseQueryFilters(\n    /**\n     *\n     * @param {Object} param0\n     * @param {string} param0.key - Attribute name\n     * @param {Object} param0.attribute - Attribute definition\n     * @param {string} param0.path - Content Type path to the attribute\n     * @returns\n     */\n    ({ attribute, path }: any) => {\n      // TODO: handle dynamic zones and morph relations\n      if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n        return;\n      }\n\n      // Populate all relations, components and media\n      if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n        const populatePath = path.attribute.replace(/\\./g, '.populate.');\n        // @ts-expect-error - lodash doesn't resolve the Populate type correctly\n        populateQuery = set(populatePath, {}, populateQuery);\n      }\n    },\n    { schema: strapi.getModel(uid) },\n    query\n  );\n\n  return populateQuery;\n};\n\n/**\n * When config admin.webhooks.populateRelations is set to true,\n * populated relations will be passed to any webhook event.\n * The entity-manager response will not have the populated relations though.\n * For performance reasons, it is recommended to set it to false,\n *\n * See docs: https://docs.strapi.io/dev-docs/configurations/server\n *\n * TODO V5: Set to false by default.\n * TODO V5: Make webhooks always send the same entity data.\n */\nconst isWebhooksPopulateRelationsEnabled = () => {\n  return strapi.config.get('server.webhooks.populateRelations', true);\n};\n\nexport {\n  getDeepPopulate,\n  getDeepPopulateDraftCount,\n  getQueryPopulate,\n  isWebhooksPopulateRelationsEnabled,\n};\n","import { Common, Schema } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\nimport type { Entity } from '../entity-manager';\n\nconst { isVisibleAttribute } = contentTypes;\n\nfunction getCountForRelation(\n  attributeName: string,\n  entity: Entity[string],\n  model: Schema.ContentType | Schema.Component\n) {\n  // do not count createdBy, updatedBy, localizations etc.\n  if (!isVisibleAttribute(model, attributeName)) {\n    return entity;\n  }\n\n  if (Array.isArray(entity)) {\n    return { count: entity.length };\n  }\n\n  return entity ? { count: 1 } : { count: 0 };\n}\n\nfunction getCountForDZ(entity: Entity[string]) {\n  return entity.map((component: any) => {\n    return getDeepRelationsCount(component, component.__component);\n  });\n}\n\nfunction getCountFor(\n  attributeName: string,\n  entity: Entity[string],\n  model: Schema.ContentType | Schema.Component\n): any {\n  const attribute = model.attributes[attributeName];\n\n  switch (attribute?.type) {\n    case 'relation':\n      return getCountForRelation(attributeName, entity, model);\n    case 'component':\n      if (!entity) return null;\n      if (attribute.repeatable) {\n        return entity.map((component: any) =>\n          getDeepRelationsCount(component, attribute.component)\n        );\n      }\n      return getDeepRelationsCount(entity, attribute.component);\n    case 'dynamiczone':\n      return getCountForDZ(entity);\n    default:\n      return entity;\n  }\n}\n\nconst getDeepRelationsCount = (entity: Entity, uid: Common.UID.Schema): Entity => {\n  const model = strapi.getModel(uid);\n\n  return Object.keys(entity).reduce<Entity>(\n    (relationCountEntity, attributeName) =>\n      Object.assign(relationCountEntity, {\n        [attributeName]: getCountFor(attributeName, entity[attributeName], model),\n      }),\n    {} as Entity\n  );\n};\n\nexport { getDeepRelationsCount };\n","import { castArray } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\n\nconst { hasDraftAndPublish, isVisibleAttribute } = strapiUtils.contentTypes;\n/**\n * sumDraftCounts works recursively on the attributes of a model counting the\n * number of draft relations\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param {Object} entity containing the draft relation counts\n * @param {String} uid of the content type\n * @returns {Number} of draft relations\n */\nconst sumDraftCounts = (entity: any, uid: any): number => {\n  const model = strapi.getModel(uid);\n\n  return Object.keys(model.attributes).reduce((sum, attributeName) => {\n    const attribute: any = model.attributes[attributeName];\n    const value = entity[attributeName];\n    if (!value) {\n      return sum;\n    }\n\n    switch (attribute.type) {\n      case 'relation': {\n        const childModel = strapi.getModel(attribute.target);\n        if (hasDraftAndPublish(childModel) && isVisibleAttribute(model, attributeName)) {\n          return sum + value.count;\n        }\n        return sum;\n      }\n      case 'component': {\n        const compoSum = castArray(value).reduce((acc, componentValue) => {\n          return acc + sumDraftCounts(componentValue, attribute.component);\n        }, 0);\n        return sum + compoSum;\n      }\n      case 'dynamiczone': {\n        const dzSum = value.reduce((acc: any, componentValue: any) => {\n          return acc + sumDraftCounts(componentValue, componentValue.__component);\n        }, 0);\n        return sum + dzSum;\n      }\n      default:\n        return sum;\n    }\n  }, 0);\n};\n\nexport { sumDraftCounts };\n","import { omit } from 'lodash/fp';\nimport { mapAsync, errors, contentTypes, sanitize } from '@strapi/utils';\nimport type { LoadedStrapi as Strapi, Common, EntityService } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n  getDeepPopulate,\n  getDeepPopulateDraftCount,\n  isWebhooksPopulateRelationsEnabled,\n} from './utils/populate';\nimport { getDeepRelationsCount } from './utils/count';\nimport { sumDraftCounts } from './utils/draft';\nimport { ALLOWED_WEBHOOK_EVENTS } from '../constants';\n\nconst { ApplicationError } = errors;\nconst { ENTRY_PUBLISH, ENTRY_UNPUBLISH } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { hasDraftAndPublish } = contentTypes;\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;\n\nconst omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE);\n\n// Types reused from entity service\nexport type Entity = EntityService.Result<Common.UID.ContentType>;\ntype Body = EntityService.Params.Data.Input<Common.UID.ContentType>;\n\nconst emitEvent = async (uid: Common.UID.ContentType, event: string, entity: Entity) => {\n  const modelDef = strapi.getModel(uid);\n  const sanitizedEntity = await sanitize.sanitizers.defaultSanitizeOutput(modelDef, entity);\n\n  strapi.eventHub.emit(event, {\n    model: modelDef.modelName,\n    entry: sanitizedEntity,\n  });\n};\n\nconst buildDeepPopulate = (uid: Common.UID.ContentType) => {\n  // User can configure to populate relations, so downstream services can use them.\n  // They will be transformed into counts later if this is set to true.\n\n  return (\n    // @ts-expect-error populate builder needs to be called with a UID\n    getService('populate-builder')(uid)\n      .populateDeep(Infinity)\n      .countRelationsIf(!isWebhooksPopulateRelationsEnabled())\n      .build()\n  );\n};\n\ntype EntityManager = (opts: { strapi: Strapi }) => {\n  mapEntity<T = unknown>(entity: T): T;\n  mapEntitiesResponse(entities: any, uid: Common.UID.ContentType): any;\n  find(\n    opts: Parameters<typeof strapi.entityService.findMany>[1],\n    uid: Common.UID.ContentType\n  ): Promise<ReturnType<typeof strapi.entityService.findMany>>;\n  findPage(\n    opts: Parameters<typeof strapi.entityService.findPage>[1],\n    uid: Common.UID.ContentType\n  ): Promise<ReturnType<typeof strapi.entityService.findPage>>;\n  findOne(id: Entity['id'], uid: Common.UID.ContentType, opts?: any): Promise<Entity>;\n  create(body: Body, uid: Common.UID.ContentType): Promise<Entity>;\n  update(entity: Entity, body: Partial<Body>, uid: Common.UID.ContentType): Promise<Entity | null>;\n  clone(entity: Entity, body: Partial<Body>, uid: Common.UID.ContentType): Promise<Entity | null>;\n  delete(entity: Entity, uid: Common.UID.ContentType): Promise<Entity | null>;\n  deleteMany(\n    opts: Parameters<typeof strapi.entityService.deleteMany>[1],\n    uid: Common.UID.ContentType\n  ): Promise<{ count: number } | null>;\n  publish(entity: Entity, uid: Common.UID.ContentType, body?: any): Promise<Entity | null>;\n  publishMany(entities: Entity[], uid: Common.UID.ContentType): Promise<{ count: number } | null>;\n  unpublish(entity: Entity, uid: Common.UID.ContentType, body?: any): Promise<Entity | null>;\n  unpublishMany(entities: Entity[], uid: Common.UID.ContentType): Promise<{ count: number } | null>;\n  countDraftRelations(id: Entity['id'], uid: Common.UID.ContentType): Promise<number>;\n  countManyEntriesDraftRelations(\n    ids: number[],\n    uid: Common.UID.ContentType,\n    locale?: string\n  ): Promise<number>;\n};\n\nconst entityManager: EntityManager = ({ strapi }) => ({\n  /**\n   * Extend this function from other plugins to add custom mapping of entity\n   * responses\n   * @param {Object} entity\n   * @returns\n   */\n  mapEntity<T = unknown>(entity: T): T {\n    return entity;\n  },\n\n  /**\n   * Some entity manager functions may return multiple entities or one entity.\n   * This function maps the response in both cases\n   * @param {Array|Object|null} entities\n   * @param {string} uid\n   */\n  async mapEntitiesResponse(entities: any, uid: Common.UID.ContentType) {\n    if (entities?.results) {\n      const mappedResults = await mapAsync(entities.results, (entity: Entity) =>\n        // @ts-expect-error mapEntity can be extended\n        this.mapEntity(entity, uid)\n      );\n      return { ...entities, results: mappedResults };\n    }\n    // if entity is single type\n    // @ts-expect-error mapEntity can be extended\n    return this.mapEntity(entities, uid);\n  },\n\n  async find(\n    opts: Parameters<typeof strapi.entityService.findMany>[1],\n    uid: Common.UID.ContentType\n  ) {\n    const params = { ...opts, populate: getDeepPopulate(uid) } as typeof opts;\n    const entities = await strapi.entityService.findMany(uid, params);\n    return this.mapEntitiesResponse(entities, uid);\n  },\n\n  async findPage(\n    opts: Parameters<typeof strapi.entityService.findPage>[1],\n    uid: Common.UID.ContentType\n  ) {\n    const entities = await strapi.entityService.findPage(uid, opts);\n    return this.mapEntitiesResponse(entities, uid);\n  },\n\n  async findOne(id: Entity['id'], uid: Common.UID.ContentType, opts = {}) {\n    return (\n      strapi.entityService\n        .findOne(uid, id, opts)\n        // @ts-expect-error mapEntity can be extended\n        .then((entity: Entity) => this.mapEntity(entity, uid))\n    );\n  },\n\n  async create(body: Body, uid: Common.UID.ContentType) {\n    const modelDef = strapi.getModel(uid);\n    const publishData = { ...body } as any;\n    const populate = await buildDeepPopulate(uid);\n\n    if (hasDraftAndPublish(modelDef)) {\n      publishData[PUBLISHED_AT_ATTRIBUTE] = null;\n    }\n\n    const params = { data: publishData, populate };\n\n    const entity = await strapi.entityService\n      .create(uid, params)\n      // @ts-expect-error mapEntity can be extended\n      .then((entity: Entity) => this.mapEntity(entity, uid));\n\n    if (isWebhooksPopulateRelationsEnabled()) {\n      return getDeepRelationsCount(entity, uid);\n    }\n\n    return entity;\n  },\n\n  async update(entity: Entity, body: Partial<Body>, uid: Common.UID.ContentType) {\n    const publishData = omitPublishedAtField(body);\n    const populate = await buildDeepPopulate(uid);\n    const params = { data: publishData, populate };\n\n    const updatedEntity = await strapi.entityService\n      .update(uid, entity.id, params)\n      // @ts-expect-error mapEntity can be extended\n      .then((entity: Entity) => this.mapEntity(entity, uid));\n\n    if (isWebhooksPopulateRelationsEnabled()) {\n      return getDeepRelationsCount(updatedEntity, uid);\n    }\n\n    return updatedEntity;\n  },\n  async clone(entity: Entity, body: Partial<Body>, uid: Common.UID.ContentType) {\n    const modelDef = strapi.getModel(uid);\n    const populate = await buildDeepPopulate(uid);\n    const publishData = { ...body };\n\n    if (hasDraftAndPublish(modelDef)) {\n      publishData[PUBLISHED_AT_ATTRIBUTE] = null;\n    }\n\n    const params = {\n      data: publishData,\n      populate,\n    };\n\n    const clonedEntity = await strapi.entityService.clone(uid, entity.id, params);\n\n    // If relations were populated, relations count will be returned instead of the array of relations.\n    if (clonedEntity && isWebhooksPopulateRelationsEnabled()) {\n      return getDeepRelationsCount(clonedEntity, uid);\n    }\n\n    return clonedEntity;\n  },\n  async delete(entity: Entity, uid: Common.UID.ContentType) {\n    const populate = await buildDeepPopulate(uid);\n    const deletedEntity = await strapi.entityService.delete(uid, entity.id, { populate });\n\n    // If relations were populated, relations count will be returned instead of the array of relations.\n    if (deletedEntity && isWebhooksPopulateRelationsEnabled()) {\n      return getDeepRelationsCount(deletedEntity, uid);\n    }\n\n    return deletedEntity;\n  },\n\n  // FIXME: handle relations\n  deleteMany(\n    opts: Parameters<typeof strapi.entityService.deleteMany>[1],\n    uid: Common.UID.ContentType\n  ) {\n    return strapi.entityService.deleteMany(uid, opts);\n  },\n\n  async publish(entity: Entity, uid: Common.UID.ContentType, body = {}) {\n    if (entity[PUBLISHED_AT_ATTRIBUTE]) {\n      throw new ApplicationError('already.published');\n    }\n\n    // validate the entity is valid for publication\n    await strapi.entityValidator.validateEntityCreation(\n      strapi.getModel(uid),\n      entity,\n      undefined,\n      // @ts-expect-error - FIXME: entity here is unnecessary\n      entity\n    );\n\n    const data = { ...body, [PUBLISHED_AT_ATTRIBUTE]: new Date() };\n    const populate = await buildDeepPopulate(uid);\n\n    const params = { data, populate };\n\n    const updatedEntity = await strapi.entityService.update(uid, entity.id, params);\n\n    await emitEvent(uid, ENTRY_PUBLISH, updatedEntity!);\n\n    // @ts-expect-error mapEntity can be extended\n    const mappedEntity = await this.mapEntity(updatedEntity, uid);\n\n    // If relations were populated, relations count will be returned instead of the array of relations.\n    if (mappedEntity && isWebhooksPopulateRelationsEnabled()) {\n      return getDeepRelationsCount(mappedEntity, uid);\n    }\n\n    return mappedEntity;\n  },\n\n  async publishMany(entities: Entity[], uid: Common.UID.ContentType) {\n    if (!entities.length) {\n      return null;\n    }\n\n    // Validate entities before publishing, throw if invalid\n    await Promise.all(\n      entities.map((entity: Entity) => {\n        return strapi.entityValidator.validateEntityCreation(\n          strapi.getModel(uid),\n          entity,\n          undefined,\n          // @ts-expect-error - FIXME: entity here is unnecessary\n          entity\n        );\n      })\n    );\n\n    // Only publish entities without a published_at date\n    const entitiesToPublish = entities\n      .filter((entity: Entity) => !entity[PUBLISHED_AT_ATTRIBUTE])\n      .map((entity: Entity) => entity.id);\n\n    const filters = { id: { $in: entitiesToPublish } };\n    const data = { [PUBLISHED_AT_ATTRIBUTE]: new Date() };\n    const populate = await buildDeepPopulate(uid);\n\n    // Everything is valid, publish\n    const publishedEntitiesCount = await strapi.db.query(uid).updateMany({\n      where: filters,\n      data,\n    });\n    // Get the updated entities since updateMany only returns the count\n    const publishedEntities = await strapi.entityService.findMany(uid, { filters, populate });\n    // Emit the publish event for all updated entities\n    await Promise.all(\n      publishedEntities!.map((entity: Entity) => emitEvent(uid, ENTRY_PUBLISH, entity))\n    );\n\n    // Return the number of published entities\n    return publishedEntitiesCount;\n  },\n\n  async unpublishMany(entities: Entity[], uid: Common.UID.ContentType) {\n    if (!entities.length) {\n      return null;\n    }\n\n    // Only unpublish entities with a published_at date\n    const entitiesToUnpublish = entities\n      .filter((entity: Entity) => entity[PUBLISHED_AT_ATTRIBUTE])\n      .map((entity: Entity) => entity.id);\n\n    const filters = { id: { $in: entitiesToUnpublish } };\n    const data = { [PUBLISHED_AT_ATTRIBUTE]: null };\n    const populate = await buildDeepPopulate(uid);\n\n    // No need to validate, unpublish\n    const unpublishedEntitiesCount = await strapi.db.query(uid).updateMany({\n      where: filters,\n      data,\n    });\n    // Get the updated entities since updateMany only returns the count\n    const unpublishedEntities = await strapi.entityService.findMany(uid, { filters, populate });\n    // Emit the unpublish event for all updated entities\n    await Promise.all(\n      unpublishedEntities!.map((entity: Entity) => emitEvent(uid, ENTRY_UNPUBLISH, entity))\n    );\n\n    // Return the number of unpublished entities\n    return unpublishedEntitiesCount;\n  },\n\n  async unpublish(entity: Entity, uid: Common.UID.ContentType, body = {}) {\n    if (!entity[PUBLISHED_AT_ATTRIBUTE]) {\n      throw new ApplicationError('already.draft');\n    }\n\n    const data = { ...body, [PUBLISHED_AT_ATTRIBUTE]: null };\n    const populate = await buildDeepPopulate(uid);\n\n    const params = { data, populate };\n\n    const updatedEntity = await strapi.entityService.update(uid, entity.id, params);\n\n    await emitEvent(uid, ENTRY_UNPUBLISH, updatedEntity!);\n\n    // @ts-expect-error mapEntity can be extended\n    const mappedEntity = await this.mapEntity(updatedEntity, uid);\n\n    // If relations were populated, relations count will be returned instead of the array of relations.\n    if (mappedEntity && isWebhooksPopulateRelationsEnabled()) {\n      return getDeepRelationsCount(mappedEntity, uid);\n    }\n\n    return mappedEntity;\n  },\n\n  async countDraftRelations(id: Entity['id'], uid: Common.UID.ContentType) {\n    const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n    if (!hasRelations) {\n      return 0;\n    }\n\n    const entity = await strapi.entityService.findOne(uid, id, { populate });\n\n    return sumDraftCounts(entity, uid);\n  },\n\n  async countManyEntriesDraftRelations(\n    ids: number[],\n    uid: Common.UID.ContentType,\n    locale: string = 'en'\n  ) {\n    const { populate, hasRelations } = getDeepPopulateDraftCount(uid);\n\n    if (!hasRelations) {\n      return 0;\n    }\n\n    const entities = await strapi.entityService.findMany(uid, {\n      populate,\n      filters: { id: { $in: ids } },\n      locale,\n    });\n\n    const totalNumberDraftRelations: number = entities!.reduce(\n      (count: number, entity: Entity) => sumDraftCounts(entity, uid) + count,\n      0\n    );\n\n    return totalNumberDraftRelations;\n  },\n});\n\nexport default entityManager;\nexport type { EntityManager };\n","import { errors } from '@strapi/utils';\nimport { LoadedStrapi as Strapi, CustomFields } from '@strapi/types';\n\nconst { ApplicationError } = errors;\n\ntype FieldSize = CustomFields.CustomFieldServerOptions['inputSize'];\n\nconst needsFullSize: FieldSize = {\n  default: 12,\n  isResizable: false,\n};\n\nconst smallSize: FieldSize = {\n  default: 4,\n  isResizable: true,\n};\n\nconst defaultSize: FieldSize = {\n  default: 6,\n  isResizable: true,\n};\n\nconst fieldSizes: Record<string, FieldSize> = {\n  // Full row and not resizable\n  dynamiczone: needsFullSize,\n  component: needsFullSize,\n  json: needsFullSize,\n  richtext: needsFullSize,\n  blocks: needsFullSize,\n  // Small and resizable\n  checkbox: smallSize,\n  boolean: smallSize,\n  date: smallSize,\n  time: smallSize,\n  biginteger: smallSize,\n  decimal: smallSize,\n  float: smallSize,\n  integer: smallSize,\n  number: smallSize,\n  // Medium and resizable\n  datetime: defaultSize,\n  email: defaultSize,\n  enumeration: defaultSize,\n  media: defaultSize,\n  password: defaultSize,\n  relation: defaultSize,\n  string: defaultSize,\n  text: defaultSize,\n  timestamp: defaultSize,\n  uid: defaultSize,\n};\n\nconst createFieldSizesService = ({ strapi }: { strapi: Strapi }) => {\n  const fieldSizesService = {\n    getAllFieldSizes() {\n      return fieldSizes;\n    },\n\n    hasFieldSize(type: string) {\n      return !!fieldSizes[type];\n    },\n\n    getFieldSize(type?: string) {\n      if (!type) {\n        throw new ApplicationError('The type is required');\n      }\n\n      const fieldSize = fieldSizes[type];\n      if (!fieldSize) {\n        throw new ApplicationError(`Could not find field size for type ${type}`);\n      }\n\n      return fieldSize;\n    },\n\n    setFieldSize(type: string, size: FieldSize) {\n      if (!type) {\n        throw new ApplicationError('The type is required');\n      }\n\n      if (!size) {\n        throw new ApplicationError('The size is required');\n      }\n\n      fieldSizes[type] = size;\n    },\n\n    setCustomFieldInputSizes() {\n      // Find all custom fields already registered\n      const customFields = strapi.container.get('custom-fields').getAll();\n\n      // If they have a custom field size, register it\n      // TODO types can be inferred when customFields is typed\n      Object.entries(customFields).forEach(([uid, customField]: [string, any]) => {\n        if (customField.inputSize) {\n          fieldSizesService.setFieldSize(uid, customField.inputSize);\n        }\n      });\n    },\n  };\n\n  return fieldSizesService;\n};\n\nexport default createFieldSizesService;\n","import { intersection, prop } from 'lodash/fp';\nimport { relations } from '@strapi/utils';\nimport { LoadedStrapi as Strapi, Schema } from '@strapi/types';\nimport type { Configuration } from '../../../shared/contracts/content-types';\n\nconst { getRelationalFields } = relations;\n\nexport default ({ strapi }: { strapi: Strapi }) => {\n  const sendDidConfigureListView = async (\n    contentType: Schema.ContentType,\n    configuration: Configuration\n  ) => {\n    const displayedFields = prop('length', configuration.layouts.list);\n    const relationalFields = getRelationalFields(contentType);\n    const displayedRelationalFields = intersection(\n      relationalFields,\n      configuration.layouts.list\n    ).length;\n\n    const data = {\n      eventProperties: { containsRelationalFields: !!displayedRelationalFields },\n    };\n\n    if (data.eventProperties.containsRelationalFields) {\n      Object.assign(data.eventProperties, {\n        displayedFields,\n        displayedRelationalFields,\n      });\n    }\n\n    try {\n      await strapi.telemetry.send('didConfigureListView', data);\n    } catch (e) {\n      // silence\n    }\n  };\n\n  return {\n    sendDidConfigureListView,\n  };\n};\n","import { pipeAsync } from '@strapi/utils';\nimport { LoadedStrapi as Strapi, EntityService, Common } from '@strapi/types';\n\nconst ACTIONS = {\n  read: 'plugin::content-manager.explorer.read',\n  create: 'plugin::content-manager.explorer.create',\n  update: 'plugin::content-manager.explorer.update',\n  delete: 'plugin::content-manager.explorer.delete',\n  publish: 'plugin::content-manager.explorer.publish',\n  unpublish: 'plugin::content-manager.explorer.publish',\n} as const;\n\ntype Entity = EntityService.Result<Common.UID.ContentType>;\ntype Query = {\n  page?: string;\n  pageSize?: string;\n  sort?: string;\n};\n\nconst createPermissionChecker =\n  (strapi: Strapi) =>\n  ({ userAbility, model }: { userAbility: any; model: string }) => {\n    const permissionsManager = strapi.admin.services.permission.createPermissionsManager({\n      ability: userAbility,\n      model,\n    });\n\n    const { actionProvider } = strapi.service('admin::permission');\n\n    const toSubject = (entity?: Entity) => {\n      return entity ? permissionsManager.toSubject(entity, model) : model;\n    };\n\n    // @ts-expect-error preserve the parameter order\n    // eslint-disable-next-line @typescript-eslint/default-param-last\n    const can = (action: string, entity?: Entity, field: string) => {\n      const subject = toSubject(entity);\n      const aliases = actionProvider.unstable_aliases(action, model) as string[];\n\n      return (\n        // Test the original action to see if it passes\n        userAbility.can(action, subject, field) ||\n        // Else try every known alias if at least one of them succeed, then the user \"can\"\n        aliases.some((alias) => userAbility.can(alias, subject, field))\n      );\n    };\n\n    // @ts-expect-error preserve the parameter order\n    // eslint-disable-next-line @typescript-eslint/default-param-last\n    const cannot = (action: string, entity?: Entity, field: string) => {\n      const subject = toSubject(entity);\n      const aliases = actionProvider.unstable_aliases(action, model) as string[];\n\n      return (\n        // Test both the original action\n        userAbility.cannot(action, subject, field) &&\n        // and every known alias, if all of them fail (cannot), then the user truly \"cannot\"\n        aliases.every((alias) => userAbility.cannot(alias, subject, field))\n      );\n    };\n\n    const sanitizeOutput = (data: Entity, { action = ACTIONS.read }: { action?: string } = {}) => {\n      return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });\n    };\n\n    const sanitizeQuery = (query: Query, { action = ACTIONS.read }: { action?: string } = {}) => {\n      return permissionsManager.sanitizeQuery(query, { subject: model, action });\n    };\n\n    const sanitizeInput = (action: string, data: any, entity?: Entity) => {\n      return permissionsManager.sanitizeInput(data, {\n        subject: entity ? toSubject(entity) : model,\n        action,\n      });\n    };\n\n    const validateQuery = (query: Query, { action = ACTIONS.read }: { action?: string } = {}) => {\n      return permissionsManager.validateQuery(query, { subject: model, action });\n    };\n\n    const validateInput = (action: string, data: any, entity?: Entity) => {\n      return permissionsManager.validateInput(data, {\n        subject: entity ? toSubject(entity) : model,\n        action,\n      });\n    };\n\n    const sanitizeCreateInput = (data: any) => sanitizeInput(ACTIONS.create, data);\n    const sanitizeUpdateInput = (entity: Entity) => (data: any) =>\n      sanitizeInput(ACTIONS.update, data, entity);\n\n    const buildPermissionQuery = (query: Query, action: { action?: string } = {}) => {\n      return permissionsManager.addPermissionsQueryTo(query, action);\n    };\n\n    const sanitizedQuery = (query: Query, action: { action?: string } = {}) => {\n      return pipeAsync(\n        (q: Query) => sanitizeQuery(q, action),\n        (q: Query) => buildPermissionQuery(q, action)\n      )(query);\n    };\n\n    // Sanitized queries shortcuts\n    Object.keys(ACTIONS).forEach((action) => {\n      // @ts-expect-error TODO\n      sanitizedQuery[action] = (query: Query) => sanitizedQuery(query, ACTIONS[action]);\n    });\n\n    // Permission utils shortcuts\n    Object.keys(ACTIONS).forEach((action) => {\n      // @ts-expect-error TODO\n      can[action] = (...args: any) => can(ACTIONS[action], ...args);\n      // @ts-expect-error TODO\n      cannot[action] = (...args: any) => cannot(ACTIONS[action], ...args);\n    });\n\n    return {\n      // Permission utils\n      can, // check if you have the permission\n      cannot, // check if you don't have the permission\n      // Sanitizers\n      sanitizeOutput,\n      sanitizeQuery,\n      sanitizeCreateInput,\n      sanitizeUpdateInput,\n      // Validators\n      validateQuery,\n      validateInput,\n      // Queries Builder\n      sanitizedQuery,\n    };\n  };\n\nexport default ({ strapi }: { strapi: Strapi }) => ({\n  create: createPermissionChecker(strapi),\n});\n","import { prop } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport { LoadedStrapi as Strapi, Schema } from '@strapi/types';\n\nimport { getService } from '../utils';\n\nexport default ({ strapi }: { strapi: Strapi }) => ({\n  canConfigureContentType({\n    userAbility,\n    contentType,\n  }: {\n    userAbility: any;\n    contentType: Schema.ContentType;\n  }) {\n    const action = contentTypesUtils.isSingleType(contentType)\n      ? 'plugin::content-manager.single-types.configure-view'\n      : 'plugin::content-manager.collection-types.configure-view';\n\n    return userAbility.can(action);\n  },\n\n  async registerPermissions() {\n    const displayedContentTypes = getService('content-types').findDisplayedContentTypes();\n    const contentTypesUids = displayedContentTypes.map(prop('uid'));\n\n    const draftAndPublishContentTypesUids = displayedContentTypes\n      .filter(contentTypesUtils.hasDraftAndPublish)\n      .map(prop('uid'));\n\n    const actions = [\n      {\n        section: 'contentTypes',\n        displayName: 'Create',\n        uid: 'explorer.create',\n        pluginName: 'content-manager',\n        subjects: contentTypesUids,\n        options: {\n          applyToProperties: ['fields'],\n        },\n      },\n      {\n        section: 'contentTypes',\n        displayName: 'Read',\n        uid: 'explorer.read',\n        pluginName: 'content-manager',\n        subjects: contentTypesUids,\n        options: {\n          applyToProperties: ['fields'],\n        },\n      },\n      {\n        section: 'contentTypes',\n        displayName: 'Update',\n        uid: 'explorer.update',\n        pluginName: 'content-manager',\n        subjects: contentTypesUids,\n        options: {\n          applyToProperties: ['fields'],\n        },\n      },\n      {\n        section: 'contentTypes',\n        displayName: 'Delete',\n        uid: 'explorer.delete',\n        pluginName: 'content-manager',\n        subjects: contentTypesUids,\n      },\n      {\n        section: 'contentTypes',\n        displayName: 'Publish',\n        uid: 'explorer.publish',\n        pluginName: 'content-manager',\n        subjects: draftAndPublishContentTypesUids,\n      },\n      {\n        section: 'plugins',\n        displayName: 'Configure view',\n        uid: 'single-types.configure-view',\n        subCategory: 'single types',\n        pluginName: 'content-manager',\n      },\n      {\n        section: 'plugins',\n        displayName: 'Configure view',\n        uid: 'collection-types.configure-view',\n        subCategory: 'collection types',\n        pluginName: 'content-manager',\n      },\n      {\n        section: 'plugins',\n        displayName: 'Configure Layout',\n        uid: 'components.configure-layout',\n        subCategory: 'components',\n        pluginName: 'content-manager',\n      },\n    ];\n\n    await strapi.admin.services.permission.actionProvider.registerMany(actions);\n  },\n});\n","import { isNil } from 'lodash/fp';\nimport type { Common } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: Common.UID.Schema) => {\n  let getInitialPopulate = async (): Promise<undefined | Populate> => {\n    return undefined;\n  };\n  const deepPopulateOptions = {\n    countMany: false,\n    countOne: false,\n    maxLevel: -1,\n  };\n\n  const builder = {\n    /**\n     * Populates all attribute fields present in a query.\n     * @param query - Strapi query object\n     */\n    populateFromQuery(query: object) {\n      getInitialPopulate = async () => getQueryPopulate(uid, query);\n      return builder;\n    },\n    /**\n     * Populate relations as count if condition is true.\n     * @param condition\n     * @param [options]\n     * @param [options.toMany] - Populate XtoMany relations as count if true.\n     * @param [options.toOne] - Populate XtoOne relations as count if true.\n     */\n    countRelationsIf(condition: boolean, { toMany, toOne } = { toMany: true, toOne: true }) {\n      if (condition) {\n        return this.countRelations({ toMany, toOne });\n      }\n      return builder;\n    },\n    /**\n     * Populate relations as count.\n     * @param [options]\n     * @param [options.toMany] - Populate XtoMany relations as count if true.\n     * @param [options.toOne] - Populate XtoOne relations as count if true.\n     */\n    countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n      if (!isNil(toMany)) {\n        deepPopulateOptions.countMany = toMany;\n      }\n      if (!isNil(toOne)) {\n        deepPopulateOptions.countOne = toOne;\n      }\n      return builder;\n    },\n    /**\n     * Populate relations deeply, up to a certain level.\n     * @param [level=Infinity] - Max level of nested populate.\n     */\n    populateDeep(level = Infinity) {\n      deepPopulateOptions.maxLevel = level;\n      return builder;\n    },\n    /**\n     * Construct the populate object based on the builder options.\n     * @returns Populate object\n     */\n    async build() {\n      const initialPopulate = await getInitialPopulate();\n\n      if (deepPopulateOptions.maxLevel === -1) {\n        return initialPopulate;\n      }\n\n      return getDeepPopulate(uid, { ...deepPopulateOptions, initialPopulate });\n    },\n  };\n\n  return builder;\n};\n\nexport default () => populateBuilder;\n","import _ from 'lodash';\nimport slugify from '@sindresorhus/slugify';\n\nimport { LoadedStrapi as Strapi, UID, Attribute } from '@strapi/types';\n\nexport default ({ strapi }: { strapi: Strapi }) => ({\n  async generateUIDField({\n    contentTypeUID,\n    field,\n    data,\n  }: {\n    contentTypeUID: UID.ContentType;\n    field: string;\n    data: Record<string, any>;\n  }) {\n    const contentType = strapi.contentTypes[contentTypeUID];\n    const { attributes } = contentType;\n\n    const { targetField, default: defaultValue, options } = attributes[field] as Attribute.UID;\n    // @ts-expect-error targetField can be undefined\n    const targetValue = _.get(data, targetField);\n\n    if (!_.isEmpty(targetValue)) {\n      return this.findUniqueUID({\n        contentTypeUID,\n        field,\n        value: slugify(targetValue, options),\n      });\n    }\n\n    return this.findUniqueUID({\n      contentTypeUID,\n      field,\n      value: slugify(defaultValue || contentType.modelName, options),\n    });\n  },\n\n  async findUniqueUID({\n    contentTypeUID,\n    field,\n    value,\n  }: {\n    contentTypeUID: UID.ContentType;\n    field: string;\n    value: string;\n  }) {\n    const query = strapi.db.query(contentTypeUID);\n\n    const possibleColisions: string[] = await query\n      .findMany({\n        where: { [field]: { $contains: value } },\n      })\n      .then((results: any) => results.map((result: any) => result[field]));\n\n    if (possibleColisions.length === 0) {\n      return value;\n    }\n\n    let i = 1;\n    let tmpUId = `${value}-${i}`;\n    while (possibleColisions.includes(tmpUId)) {\n      i += 1;\n      tmpUId = `${value}-${i}`;\n    }\n\n    return tmpUId;\n  },\n\n  async checkUIDAvailability({\n    contentTypeUID,\n    field,\n    value,\n  }: {\n    contentTypeUID: UID.ContentType;\n    field: string;\n    value: string;\n  }) {\n    const query = strapi.db.query(contentTypeUID);\n\n    const count: number = await query.count({\n      where: { [field]: value },\n    });\n\n    if (count > 0) {\n      return false;\n    }\n\n    return true;\n  },\n});\n","import components from './components';\nimport contentTypes from './content-types';\nimport dataMapper from './data-mapper';\nimport entityManager from './entity-manager';\nimport fieldSizes from './field-sizes';\nimport metrics from './metrics';\nimport permissionChecker from './permission-checker';\nimport permission from './permission';\nimport populateBuilder from './populate-builder';\nimport uid from './uid';\n\nexport default {\n  components,\n  'content-types': contentTypes,\n  'data-mapper': dataMapper,\n  'entity-manager': entityManager,\n  'field-sizes': fieldSizes,\n  metrics,\n  'permission-checker': permissionChecker,\n  permission,\n  'populate-builder': populateBuilder,\n  uid,\n};\n","import bootstrap from './bootstrap';\nimport routes from './routes';\nimport policies from './policies';\nimport controllers from './controllers';\nimport services from './services';\n\nexport default () => {\n  return {\n    bootstrap,\n    controllers,\n    routes,\n    policies,\n    services,\n  };\n};\n"],"names":["action","hasDraftAndPublish","contentTypes","strapi","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","isHidden","isRelation","isVisible","schema","key","isVisibleAttribute","uid","permissionChecker","path","body","entityManager","components","isAnyToMany","relations","isComponent","permissionQuery","mainField","sanitizedBody","keys","storeUtils","conf","intersection","configurationService","isNil","populate","ApplicationError","entity","fieldSizes","populateBuilder"],"mappings":"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"}