{"version":3,"file":"content-types.mjs","sources":["../../../server/src/services/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { pick, pipe, has, prop, isNil, cloneDeep, isArray } from 'lodash/fp';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getService } from '../utils';\n\nconst {\n  isRelationalAttribute,\n  getVisibleAttributes,\n  isTypedAttribute,\n  getScalarAttributes,\n  getRelationalAttributes,\n} = contentTypeUtils;\nconst { ApplicationError } = errors;\n\nconst hasLocalizedOption = (modelOrAttribute: any) => {\n  return prop('pluginOptions.i18n.localized', modelOrAttribute) === true;\n};\n\nconst getValidLocale = async (locale: any) => {\n  const localesService = getService('locales');\n\n  if (isNil(locale)) {\n    return localesService.getDefaultLocale();\n  }\n\n  const foundLocale = await localesService.findByCode(locale);\n  if (!foundLocale) {\n    throw new ApplicationError('Locale not found');\n  }\n\n  return locale;\n};\n\n/**\n * Returns whether an attribute is localized or not\n * @param {*} attribute\n * @returns\n */\nconst isLocalizedAttribute = (attribute: any) => {\n  return (\n    hasLocalizedOption(attribute) ||\n    isRelationalAttribute(attribute) ||\n    isTypedAttribute(attribute, 'uid')\n  );\n};\n\n/**\n * Returns whether a model is localized or not\n * @param {*} model\n * @returns\n */\nconst isLocalizedContentType = (model: any) => {\n  return hasLocalizedOption(model);\n};\n\n/**\n * Returns the list of attribute names that are not localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getNonLocalizedAttributes = (model: any) => {\n  return getVisibleAttributes(model).filter(\n    (attrName) => !isLocalizedAttribute(model.attributes[attrName])\n  );\n};\n\nconst removeId = (value: any) => {\n  if (typeof value === 'object' && has('id', value)) {\n    delete value.id;\n  }\n};\n\nconst removeIds = (model: any) => (entry: any) => removeIdsMut(model, cloneDeep(entry));\n\nconst removeIdsMut = (model: any, entry: any): Record<string, any> => {\n  if (isNil(entry)) {\n    return entry as unknown as Record<string, any>;\n  }\n\n  removeId(entry);\n\n  _.forEach(model.attributes, (attr, attrName) => {\n    const value = entry[attrName];\n    if (attr.type === 'dynamiczone' && isArray(value)) {\n      value.forEach((compo) => {\n        if (has('__component', compo)) {\n          const model = strapi.components[compo.__component];\n          removeIdsMut(model, compo);\n        }\n      });\n    } else if (attr.type === 'component') {\n      const model = strapi.components[attr.component];\n      if (isArray(value)) {\n        value.forEach((compo) => removeIdsMut(model, compo));\n      } else {\n        removeIdsMut(model, value);\n      }\n    }\n  });\n\n  return entry;\n};\n\n/**\n * Returns a copy of an entry picking only its non localized attributes\n * @param {object} model\n * @param {object} entry\n * @returns {object}\n */\nconst copyNonLocalizedAttributes = (model: any, entry: any) => {\n  const nonLocalizedAttributes = getNonLocalizedAttributes(model);\n\n  return pipe(pick(nonLocalizedAttributes), removeIds(model))(entry);\n};\n\n/**\n * Returns the list of attribute names that are localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getLocalizedAttributes = (model: any) => {\n  return getVisibleAttributes(model).filter((attrName) =>\n    isLocalizedAttribute(model.attributes[attrName])\n  );\n};\n\n/**\n * Fill non localized fields of an entry if there are nil\n * @param {Object} entry entry to fill\n * @param {Object} relatedEntry values used to fill\n * @param {Object} options\n * @param {Object} options.model corresponding model\n */\nconst fillNonLocalizedAttributes = (entry: any, relatedEntry: any, { model }: any) => {\n  if (isNil(relatedEntry)) {\n    return;\n  }\n\n  const modelDef = strapi.getModel(model);\n  const relatedEntryCopy = copyNonLocalizedAttributes(modelDef, relatedEntry);\n\n  _.forEach(relatedEntryCopy, (value, field) => {\n    if (isNil(entry[field])) {\n      entry[field] = value;\n    }\n  });\n};\n\n/**\n * build the populate param to\n * @param {String} modelUID uid of the model, could be of a content-type or a component\n */\nconst getNestedPopulateOfNonLocalizedAttributes = (modelUID: any): string[] => {\n  const schema = strapi.getModel(modelUID);\n  const scalarAttributes = getScalarAttributes(schema);\n  const nonLocalizedAttributes = getNonLocalizedAttributes(schema);\n\n  const allAttributes = [...scalarAttributes, ...nonLocalizedAttributes];\n  if (schema.modelType === 'component') {\n    // When called recursively on a non localized component we\n    // need to explicitly populate that components relations\n    allAttributes.push(...getRelationalAttributes(schema));\n  }\n\n  const currentAttributesToPopulate = allAttributes.filter((value, index, self) => {\n    return self.indexOf(value) === index && self.lastIndexOf(value) === index;\n  });\n\n  const attributesToPopulate = [...currentAttributesToPopulate];\n  for (const attrName of currentAttributesToPopulate) {\n    const attr = schema.attributes[attrName];\n    if (attr.type === 'component') {\n      const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(attr.component).map(\n        (nestedAttr) => `${attrName}.${nestedAttr}`\n      );\n      attributesToPopulate.push(...nestedPopulate);\n    } else if (attr.type === 'dynamiczone') {\n      attr.components.forEach((componentName) => {\n        const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(componentName).map(\n          (nestedAttr) => `${attrName}.${nestedAttr}`\n        );\n        attributesToPopulate.push(...nestedPopulate);\n      });\n    }\n  }\n\n  return attributesToPopulate;\n};\n\nconst contentTypes = () => ({\n  isLocalizedContentType,\n  getValidLocale,\n  getLocalizedAttributes,\n  getNonLocalizedAttributes,\n  copyNonLocalizedAttributes,\n  fillNonLocalizedAttributes,\n  getNestedPopulateOfNonLocalizedAttributes,\n});\n\ntype ContentTypesService = typeof contentTypes;\n\nexport default contentTypes;\nexport { ContentTypesService };\n"],"names":["isRelationalAttribute","getVisibleAttributes","isTypedAttribute","getScalarAttributes","getRelationalAttributes","contentTypeUtils","ApplicationError","errors","hasLocalizedOption","modelOrAttribute","prop","getValidLocale","locale","localesService","getService","isNil","getDefaultLocale","foundLocale","findByCode","isLocalizedAttribute","attribute","isLocalizedContentType","model","getNonLocalizedAttributes","filter","attrName","attributes","removeId","value","has","id","removeIds","entry","removeIdsMut","cloneDeep","_","forEach","attr","type","isArray","compo","strapi","components","__component","component","copyNonLocalizedAttributes","nonLocalizedAttributes","pipe","pick","getLocalizedAttributes","fillNonLocalizedAttributes","relatedEntry","modelDef","getModel","relatedEntryCopy","field","getNestedPopulateOfNonLocalizedAttributes","modelUID","schema","scalarAttributes","allAttributes","modelType","push","currentAttributesToPopulate","index","self","indexOf","lastIndexOf","attributesToPopulate","nestedPopulate","map","nestedAttr","componentName","contentTypes"],"mappings":"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"}