1{"version":3,"file":"createBaseMod.js","names":["_debug","data","_interopRequireDefault","require","_withMod","obj","__esModule","default","debug","Debug","createBaseMod","methodName","platform","modName","getFilePath","read","write","isIntrospective","withUnknown","config","_props","_props$skipEmptyMod","_props$saveToInternal","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 /** Officially supports `'ios' | 'android'` (`ModPlatform`). Arbitrary strings are supported for adding out-of-tree platforms. */\n platform: ModPlatform & string;\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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"}