{"version":3,"file":"internationalization.mjs","sources":["../../../src/services/document-service/internationalization.ts"],"sourcesContent":["import type { Struct, Modules } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { curry, assoc } from 'lodash/fp';\n\ntype Transform = (\n  contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n  params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\ntype AsyncTransform = (\n  contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n  params: Modules.Documents.Params.All\n) => Promise<Modules.Documents.Params.All>;\n\nconst getDefaultLocale = async (): Promise<string> => {\n  return strapi.plugin('i18n').service('locales').getDefaultLocale();\n};\n\nconst defaultLocale: AsyncTransform = async (contentType, params) => {\n  if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n    return params;\n  }\n\n  if (!params.locale) {\n    return assoc('locale', await getDefaultLocale(), params);\n  }\n\n  return params;\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst localeToLookup: Transform = (contentType, params) => {\n  if (\n    !params.locale ||\n    !strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)\n  ) {\n    return params;\n  }\n\n  if (typeof params.locale !== 'string') {\n    // localeToLookup accepts locales of '*'. This is because the document\n    // service functions that use this transform work with the '*' locale\n    // to return all locales.\n    throw new errors.ValidationError(\n      `Invalid locale param ${String(params.locale)} provided. Document locales must be strings.`\n    );\n  }\n\n  return assoc(['lookup', 'locale'], params.locale, params);\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst multiLocaleToLookup: Transform = (contentType, params) => {\n  if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n    return params;\n  }\n\n  if (params.locale) {\n    if (params.locale === '*') {\n      return params;\n    }\n\n    return assoc(['lookup', 'locale'], params.locale, params);\n  }\n\n  return params;\n};\n\n/**\n * Translate locale status parameter into the data that will be saved\n */\nconst localeToData: Transform = (contentType, params) => {\n  if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n    return params;\n  }\n\n  if (params.locale) {\n    const isValidLocale = typeof params.locale === 'string' && params.locale !== '*';\n    if (isValidLocale) {\n      return assoc(['data', 'locale'], params.locale, params);\n    }\n\n    throw new errors.ValidationError(\n      `Invalid locale param ${params.locale} provided. Document locales must be strings.`\n    );\n  }\n\n  return params;\n};\n\n/**\n * Copy non-localized fields from an existing entry to a new entry being created\n * for a different locale of the same document. Returns a new object with the merged data.\n */\nconst copyNonLocalizedFields = async (\n  contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n  documentId: string,\n  dataToCreate: Record<string, any>\n): Promise<Record<string, any>> => {\n  // Check if this is a localized content type and if i18n plugin is available\n  const i18nService = strapi.plugin('i18n')?.service('content-types');\n  if (!i18nService?.isLocalizedContentType(contentType)) {\n    return dataToCreate;\n  }\n\n  // Find an existing entry for the same document to copy unlocalized fields from\n  const existingEntry = await strapi.db.query(contentType.uid).findOne({\n    where: { documentId },\n    // Prefer published entry, but fall back to any entry\n    orderBy: { publishedAt: 'desc' },\n  });\n\n  // If an entry exists in another locale, copy its non-localized fields\n  if (existingEntry) {\n    const mergedData = { ...dataToCreate };\n    i18nService.fillNonLocalizedAttributes(mergedData, existingEntry, {\n      model: contentType.uid,\n    });\n    return mergedData;\n  }\n\n  return dataToCreate;\n};\n\nconst defaultLocaleCurry = curry(defaultLocale);\nconst localeToLookupCurry = curry(localeToLookup);\nconst multiLocaleToLookupCurry = curry(multiLocaleToLookup);\nconst localeToDataCurry = curry(localeToData);\n\nexport {\n  defaultLocaleCurry as defaultLocale,\n  localeToLookupCurry as localeToLookup,\n  localeToDataCurry as localeToData,\n  multiLocaleToLookupCurry as multiLocaleToLookup,\n  copyNonLocalizedFields,\n};\n"],"names":["getDefaultLocale","strapi","plugin","service","defaultLocale","contentType","params","isLocalizedContentType","locale","assoc","localeToLookup","errors","ValidationError","String","multiLocaleToLookup","localeToData","isValidLocale","copyNonLocalizedFields","documentId","dataToCreate","i18nService","existingEntry","db","query","uid","findOne","where","orderBy","publishedAt","mergedData","fillNonLocalizedAttributes","model","defaultLocaleCurry","curry","localeToLookupCurry","multiLocaleToLookupCurry","localeToDataCurry"],"mappings":"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"}