1{"version":3,"file":"createBaseMod.js","names":["debug","Debug","createBaseMod","methodName","platform","modName","getFilePath","read","write","isIntrospective","withUnknown","config","_props","props","withBaseMod","mod","skipEmptyMod","saveToInternal","isProvider","action","modRequest","nextMod","results","filePath","modResults","assertModResults","error","message","Object","defineProperty","value","platformName","ensuredResults","mods","Error","JSON","stringify","upperFirst","name","charAt","toUpperCase","slice","createPlatformBaseMod","provider","withGeneratedBaseMods","providers","entries","reduce","baseMod"],"sources":["../../src/plugins/createBaseMod.ts"],"sourcesContent":["import Debug from 'debug';\n\nimport {\n  ConfigPlugin,\n  ExportedConfig,\n  ExportedConfigWithProps,\n  ModPlatform,\n} from '../Plugin.types';\nimport { BaseModOptions, withBaseMod } from './withMod';\n\nconst debug = Debug('expo:config-plugins:base-mods');\n\nexport type ForwardedBaseModOptions = Partial<\n  Pick<BaseModOptions, 'saveToInternal' | 'skipEmptyMod'>\n>;\n\nexport type BaseModProviderMethods<\n  ModType,\n  Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n> = {\n  getFilePath: (config: ExportedConfigWithProps<ModType>, props: Props) => Promise<string> | string;\n  read: (\n    filePath: string,\n    config: ExportedConfigWithProps<ModType>,\n    props: Props\n  ) => Promise<ModType> | ModType;\n  write: (\n    filePath: string,\n    config: ExportedConfigWithProps<ModType>,\n    props: Props\n  ) => Promise<void> | void;\n  /**\n   * If the mod supports introspection, and avoids making any filesystem modifications during compilation.\n   * By enabling, this mod, and all of its descendants will be run in introspection mode.\n   * This should only be used for static files like JSON or XML, and not for application files that require regexes,\n   * or complex static files that require other files to be generated like Xcode `.pbxproj`.\n   */\n  isIntrospective?: boolean;\n};\n\nexport type CreateBaseModProps<\n  ModType,\n  Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n> = {\n  methodName: string;\n  platform: ModPlatform;\n  modName: string;\n} & BaseModProviderMethods<ModType, Props>;\n\nexport function createBaseMod<\n  ModType,\n  Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n>({\n  methodName,\n  platform,\n  modName,\n  getFilePath,\n  read,\n  write,\n  isIntrospective,\n}: CreateBaseModProps<ModType, Props>): ConfigPlugin<Props | void> {\n  const withUnknown: ConfigPlugin<Props | void> = (config, _props) => {\n    const props = _props || ({} as Props);\n    return withBaseMod<ModType>(config, {\n      platform,\n      mod: modName,\n      skipEmptyMod: props.skipEmptyMod ?? true,\n      saveToInternal: props.saveToInternal ?? false,\n      isProvider: true,\n      isIntrospective,\n      async action({ modRequest: { nextMod, ...modRequest }, ...config }) {\n        try {\n          let results: ExportedConfigWithProps<ModType> = {\n            ...config,\n            modRequest,\n          };\n\n          const filePath = await getFilePath(results, props);\n          debug(`mods.${platform}.${modName}: file path: ${filePath || '[skipped]'}`);\n          const modResults = await read(filePath, results, props);\n\n          results = await nextMod!({\n            ...results,\n            modResults,\n            modRequest,\n          });\n\n          assertModResults(results, modRequest.platform, modRequest.modName);\n\n          await write(filePath, results, props);\n          return results;\n        } catch (error: any) {\n          error.message = `[${platform}.${modName}]: ${methodName}: ${error.message}`;\n          throw error;\n        }\n      },\n    });\n  };\n\n  if (methodName) {\n    Object.defineProperty(withUnknown, 'name', {\n      value: methodName,\n    });\n  }\n\n  return withUnknown;\n}\n\nexport function assertModResults(results: any, platformName: string, modName: string) {\n  // If the results came from a mod, they'd be in the form of [config, data].\n  // Ensure the results are an array and omit the data since it should've been written by a data provider plugin.\n  const ensuredResults = results;\n\n  // Sanity check to help locate non compliant mods.\n  if (!ensuredResults || typeof ensuredResults !== 'object' || !ensuredResults?.mods) {\n    throw new Error(\n      `Mod \\`mods.${platformName}.${modName}\\` evaluated to an object that is not a valid project config. Instead got: ${JSON.stringify(\n        ensuredResults\n      )}`\n    );\n  }\n  return ensuredResults;\n}\n\nfunction upperFirst(name: string): string {\n  return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\nexport function createPlatformBaseMod<\n  ModType,\n  Props extends ForwardedBaseModOptions = ForwardedBaseModOptions\n>({ modName, ...props }: Omit<CreateBaseModProps<ModType, Props>, 'methodName'>) {\n  // Generate the function name to ensure it's uniform and also to improve stack traces.\n  const methodName = `with${upperFirst(props.platform)}${upperFirst(modName)}BaseMod`;\n  return createBaseMod<ModType, Props>({\n    methodName,\n    modName,\n    ...props,\n  });\n}\n\n/** A TS wrapper for creating provides */\nexport function provider<ModType, Props extends ForwardedBaseModOptions = ForwardedBaseModOptions>(\n  props: BaseModProviderMethods<ModType, Props>\n) {\n  return props;\n}\n\n/** Plugin to create and append base mods from file providers */\nexport function withGeneratedBaseMods<ModName extends string>(\n  config: ExportedConfig,\n  {\n    platform,\n    providers,\n    ...props\n  }: ForwardedBaseModOptions & {\n    platform: ModPlatform;\n    providers: Partial<Record<ModName, BaseModProviderMethods<any, any>>>;\n  }\n): ExportedConfig {\n  return Object.entries(providers).reduce((config, [modName, value]) => {\n    const baseMod = createPlatformBaseMod({ platform, modName, ...(value as any) });\n    return baseMod(config, props);\n  }, config);\n}\n"],"mappings":"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"}