{"version":3,"sources":["../../src/utilities/filterDataToSelectedLocales.ts"],"sourcesContent":["import type { Block, Field, FlattenedBlock } from '../fields/config/types.js'\nimport type { SanitizedConfig } from '../index.js'\nimport type { JsonObject } from '../types/index.js'\n\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js'\n\ntype FilterDataToSelectedLocalesArgs = {\n  configBlockReferences: SanitizedConfig['blocks']\n  docWithLocales: JsonObject\n  fields: Field[]\n  parentIsLocalized?: boolean\n  selectedLocales: string[]\n}\n\n/**\n * Filters a locale map to selected locales and applies a transform to each locale's value.\n */\nfunction filterLocaleMap(\n  localeMap: Record<string, unknown>,\n  selectedLocales: string[],\n  transform: (value: unknown) => unknown,\n): Record<string, unknown> {\n  const filtered: Record<string, unknown> = {}\n  const localesToInclude =\n    selectedLocales && selectedLocales.length > 0 ? selectedLocales : Object.keys(localeMap)\n\n  for (const locale of localesToInclude) {\n    if (locale in localeMap) {\n      filtered[locale] = transform(localeMap[locale])\n    }\n  }\n\n  return Object.keys(filtered).length > 0 ? filtered : {}\n}\n\n/**\n * Filters localized field data to only include specified locales.\n * For non-localized fields, returns all data as-is.\n * For localized fields, if selectedLocales is provided, returns only those locales.\n * If selectedLocales is not provided and field is localized, returns all locales.\n */\nexport function filterDataToSelectedLocales({\n  configBlockReferences,\n  docWithLocales,\n  fields,\n  parentIsLocalized = false,\n  selectedLocales,\n}: FilterDataToSelectedLocalesArgs): JsonObject {\n  if (!docWithLocales || typeof docWithLocales !== 'object') {\n    return docWithLocales\n  }\n\n  const result: JsonObject = {}\n\n  for (const field of fields) {\n    if (fieldAffectsData(field)) {\n      const fieldIsLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n      switch (field.type) {\n        case 'array': {\n          if (!(field.name in docWithLocales)) {\n            break\n          }\n\n          const arrayValue = docWithLocales[field.name]\n\n          if (fieldIsLocalized) {\n            if (arrayValue && typeof arrayValue === 'object' && !Array.isArray(arrayValue)) {\n              result[field.name] = filterLocaleMap(arrayValue, selectedLocales, (localeRows) =>\n                Array.isArray(localeRows)\n                  ? localeRows.map((item: JsonObject) =>\n                      filterDataToSelectedLocales({\n                        configBlockReferences,\n                        docWithLocales: item,\n                        fields: field.fields,\n                        parentIsLocalized: fieldIsLocalized,\n                        selectedLocales,\n                      }),\n                    )\n                  : localeRows,\n              )\n            }\n          } else if (Array.isArray(arrayValue)) {\n            result[field.name] = arrayValue.map((item: JsonObject) =>\n              filterDataToSelectedLocales({\n                configBlockReferences,\n                docWithLocales: item,\n                fields: field.fields,\n                parentIsLocalized: fieldIsLocalized,\n                selectedLocales,\n              }),\n            )\n          }\n\n          break\n        }\n\n        case 'blocks': {\n          if (!(field.name in docWithLocales)) {\n            break\n          }\n\n          const blocksValue = docWithLocales[field.name]\n\n          const processBlockRows = (rows: unknown): unknown => {\n            if (!Array.isArray(rows)) {\n              return rows\n            }\n\n            return rows.map((blockData: JsonObject) => {\n              let block: Block | FlattenedBlock | undefined\n              if (configBlockReferences && field.blockReferences) {\n                for (const blockOrReference of field.blockReferences) {\n                  if (typeof blockOrReference === 'string') {\n                    block = configBlockReferences.find((b) => b.slug === blockData.blockType)\n                  } else {\n                    block = blockOrReference\n                  }\n                }\n              } else if (field.blocks) {\n                block = field.blocks.find((b) => b.slug === blockData.blockType)\n              }\n\n              if (block) {\n                const filtered = filterDataToSelectedLocales({\n                  configBlockReferences,\n                  docWithLocales: blockData,\n                  fields: block?.fields || [],\n                  parentIsLocalized: fieldIsLocalized,\n                  selectedLocales,\n                })\n\n                // blockType, id, blockName are set by Payload internally\n                // and not part of block.fields, so they must be preserved explicitly\n                filtered.blockType = blockData.blockType\n                filtered.id = blockData.id\n                filtered.blockName = blockData.blockName\n\n                return filtered\n              }\n\n              return blockData\n            })\n          }\n\n          if (fieldIsLocalized) {\n            if (blocksValue && typeof blocksValue === 'object' && !Array.isArray(blocksValue)) {\n              result[field.name] = filterLocaleMap(blocksValue, selectedLocales, (localeRows) =>\n                processBlockRows(localeRows),\n              )\n            }\n          } else if (Array.isArray(blocksValue)) {\n            result[field.name] = processBlockRows(blocksValue)\n          }\n\n          break\n        }\n\n        case 'group': {\n          if (field.name in docWithLocales && typeof docWithLocales[field.name] === 'object') {\n            const groupValue = docWithLocales[field.name]\n\n            if (fieldIsLocalized) {\n              if (groupValue && typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n                result[field.name] = filterLocaleMap(groupValue, selectedLocales, (localeValue) => {\n                  if (\n                    localeValue &&\n                    typeof localeValue === 'object' &&\n                    !Array.isArray(localeValue)\n                  ) {\n                    return filterDataToSelectedLocales({\n                      configBlockReferences,\n                      docWithLocales: localeValue as JsonObject,\n                      fields: field.fields,\n                      parentIsLocalized: fieldIsLocalized,\n                      selectedLocales,\n                    })\n                  }\n                  return localeValue\n                })\n              }\n            } else if (typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n              result[field.name] = filterDataToSelectedLocales({\n                configBlockReferences,\n                docWithLocales: groupValue as JsonObject,\n                fields: field.fields,\n                parentIsLocalized: fieldIsLocalized,\n                selectedLocales,\n              })\n            }\n          } else {\n            // Unnamed groups pass through the same data level\n            const nestedResult = filterDataToSelectedLocales({\n              configBlockReferences,\n              docWithLocales,\n              fields: field.fields,\n              parentIsLocalized,\n              selectedLocales,\n            })\n            Object.assign(result, nestedResult)\n          }\n          break\n        }\n\n        default: {\n          if (field.name in docWithLocales) {\n            const value = docWithLocales[field.name]\n\n            if (fieldIsLocalized) {\n              if (value && typeof value === 'object' && !Array.isArray(value)) {\n                result[field.name] = filterLocaleMap(\n                  value,\n                  selectedLocales,\n                  (localeValue) => localeValue,\n                )\n              }\n            } else {\n              result[field.name] = value\n            }\n          }\n          break\n        }\n      }\n    } else {\n      // Layout-only fields that don't affect data structure\n      switch (field.type) {\n        case 'collapsible':\n        case 'group':\n        case 'row': {\n          // These pass through the same data level\n          const nestedResult = filterDataToSelectedLocales({\n            configBlockReferences,\n            docWithLocales,\n            fields: field.fields,\n            parentIsLocalized,\n            selectedLocales,\n          })\n          Object.assign(result, nestedResult)\n          break\n        }\n\n        case 'tabs': {\n          for (const tab of field.tabs) {\n            if (tabHasName(tab)) {\n              // Named tabs create a nested data structure\n              if (tab.name in docWithLocales && typeof docWithLocales[tab.name] === 'object') {\n                result[tab.name] = filterDataToSelectedLocales({\n                  configBlockReferences,\n                  docWithLocales: docWithLocales[tab.name],\n                  fields: tab.fields,\n                  parentIsLocalized,\n                  selectedLocales,\n                })\n              }\n            } else {\n              // Unnamed tabs pass through the same data level\n              const nestedResult = filterDataToSelectedLocales({\n                configBlockReferences,\n                docWithLocales,\n                fields: tab.fields,\n                parentIsLocalized,\n                selectedLocales,\n              })\n              Object.assign(result, nestedResult)\n            }\n          }\n          break\n        }\n      }\n    }\n  }\n\n  return result\n}\n"],"names":["fieldAffectsData","fieldShouldBeLocalized","tabHasName","filterLocaleMap","localeMap","selectedLocales","transform","filtered","localesToInclude","length","Object","keys","locale","filterDataToSelectedLocales","configBlockReferences","docWithLocales","fields","parentIsLocalized","result","field","fieldIsLocalized","type","name","arrayValue","Array","isArray","localeRows","map","item","blocksValue","processBlockRows","rows","blockData","block","blockReferences","blockOrReference","find","b","slug","blockType","blocks","id","blockName","groupValue","localeValue","nestedResult","assign","value","tab","tabs"],"mappings":"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"}