1{"version":3,"file":"Locales.js","names":["withLocales","config","withXcodeProject","modResults","setLocalesAsync","projectRoot","modRequest","project","getLocales","locales","localesMap","getResolvedLocalesAsync","projectName","getProjectName","supportingDirectory","join","stringName","lang","localizationObj","Object","entries","dir","fs","promises","mkdir","recursive","strings","buffer","plistKey","localVersion","push","writeFile","groupName","group","ensureGroupRecursively","children","some","comment","addResourceFileToGroup","filepath","relative","isBuildFile","verbose","input","localeJsonPath","JsonFile","readAsync","addWarningIOS"],"sources":["../../src/ios/Locales.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config-types';\nimport JsonFile from '@expo/json-file';\nimport fs from 'fs';\nimport { join, relative } from 'path';\nimport { XcodeProject } from 'xcode';\n\nimport { ConfigPlugin } from '../Plugin.types';\nimport { withXcodeProject } from '../plugins/ios-plugins';\nimport { addWarningIOS } from '../utils/warnings';\nimport { addResourceFileToGroup, ensureGroupRecursively, getProjectName } from './utils/Xcodeproj';\n\ntype LocaleJson = Record<string, string>;\ntype ResolvedLocalesJson = Record<string, LocaleJson>;\ntype ExpoConfigLocales = NonNullable<ExpoConfig['locales']>;\n\nexport const withLocales: ConfigPlugin = (config) => {\n  return withXcodeProject(config, async (config) => {\n    config.modResults = await setLocalesAsync(config, {\n      projectRoot: config.modRequest.projectRoot,\n      project: config.modResults,\n    });\n    return config;\n  });\n};\n\nexport function getLocales(\n  config: Pick<ExpoConfig, 'locales'>\n): Record<string, string | LocaleJson> | null {\n  return config.locales ?? null;\n}\n\nexport async function setLocalesAsync(\n  config: Pick<ExpoConfig, 'locales'>,\n  { projectRoot, project }: { projectRoot: string; project: XcodeProject }\n): Promise<XcodeProject> {\n  const locales = getLocales(config);\n  if (!locales) {\n    return project;\n  }\n  // possibly validate CFBundleAllowMixedLocalizations is enabled\n  const localesMap = await getResolvedLocalesAsync(projectRoot, locales);\n\n  const projectName = getProjectName(projectRoot);\n  const supportingDirectory = join(projectRoot, 'ios', projectName, 'Supporting');\n\n  // TODO: Should we delete all before running? Revisit after we land on a lock file.\n  const stringName = 'InfoPlist.strings';\n\n  for (const [lang, localizationObj] of Object.entries(localesMap)) {\n    const dir = join(supportingDirectory, `${lang}.lproj`);\n    // await fs.ensureDir(dir);\n    await fs.promises.mkdir(dir, { recursive: true });\n\n    const strings = join(dir, stringName);\n    const buffer = [];\n    for (const [plistKey, localVersion] of Object.entries(localizationObj)) {\n      buffer.push(`${plistKey} = \"${localVersion}\";`);\n    }\n    // Write the file to the file system.\n    await fs.promises.writeFile(strings, buffer.join('\\n'));\n\n    const groupName = `${projectName}/Supporting/${lang}.lproj`;\n    // deep find the correct folder\n    const group = ensureGroupRecursively(project, groupName);\n\n    // Ensure the file doesn't already exist\n    if (!group?.children.some(({ comment }) => comment === stringName)) {\n      // Only write the file if it doesn't already exist.\n      project = addResourceFileToGroup({\n        filepath: relative(supportingDirectory, strings),\n        groupName,\n        project,\n        isBuildFile: true,\n        verbose: true,\n      });\n    }\n  }\n\n  return project;\n}\n\nexport async function getResolvedLocalesAsync(\n  projectRoot: string,\n  input: ExpoConfigLocales\n): Promise<ResolvedLocalesJson> {\n  const locales: ResolvedLocalesJson = {};\n  for (const [lang, localeJsonPath] of Object.entries(input)) {\n    if (typeof localeJsonPath === 'string') {\n      try {\n        locales[lang] = await JsonFile.readAsync(join(projectRoot, localeJsonPath));\n      } catch {\n        // Add a warning when a json file cannot be parsed.\n        addWarningIOS(\n          `locales.${lang}`,\n          `Failed to parse JSON of locale file for language: ${lang}`,\n          'https://docs.expo.dev/distribution/app-stores/#localizing-your-ios-app'\n        );\n      }\n    } else {\n      // In the off chance that someone defined the locales json in the config, pass it directly to the object.\n      // We do this to make the types more elegant.\n      locales[lang] = localeJsonPath;\n    }\n  }\n\n  return locales;\n}\n"],"mappings":"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"}