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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"}