xref: /expo/packages/@expo/config/build/Config.js.map (revision 5ece2faf)
1{"version":3,"file":"Config.js","names":["reduceExpoObject","config","undefined","mods","expo","getSupportedPlatforms","projectRoot","platforms","resolveFrom","silent","push","getConfig","options","paths","getConfigFilePaths","rawStaticConfig","staticConfigPath","getStaticConfig","rootConfig","staticConfig","packageJson","packageJsonPath","getPackageJsonAndPath","fillAndReturnConfig","dynamicConfigObjectType","configWithDefaultValues","ensureConfigHasDefaultValues","exp","pkg","skipSDKVersionRequirement","dynamicConfigPath","isModdedConfig","withConfigPlugins","skipPlugins","isPublicConfig","_internal","hooks","ios","android","updates","codeSigningCertificate","codeSigningMetadata","getContextConfig","exportedObjectType","rawDynamicConfig","getDynamicConfig","dynamicConfig","getPackageJson","getRootPackageJsonPath","JsonFile","read","getDynamicConfigFilePath","getStaticConfigFilePath","fileName","configPath","path","join","fs","existsSync","modifyConfigAsync","modifications","readOptions","writeOptions","type","message","relative","outputConfig","dryRun","writeAsync","json5","withInternal","pkgName","name","basename","pkgVersion","version","pkgWithDefaults","slug","slugify","toLowerCase","description","expWithDefaults","sdkVersion","getExpoSDKVersion","error","DEFAULT_BUILD_PATH","getWebOutputPath","process","env","WEBPACK_BUILD_OUTPUT_PATH","web","build","output","getNameFromConfig","appManifest","appName","displayName","webName","getDefaultTarget","semver","lt","isBareWorkflowProject","dependencies","expokit","xcodeprojFiles","globSync","absolute","cwd","length","gradleFiles","getProjectConfigDescription","getProjectConfigDescriptionWithPaths","projectConfig","relativeDynamicConfigPath"],"sources":["../src/Config.ts"],"sourcesContent":["import { ModConfig } from '@expo/config-plugins';\nimport JsonFile, { JSONObject } from '@expo/json-file';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\nimport slugify from 'slugify';\n\nimport {\n  AppJSONConfig,\n  ConfigFilePaths,\n  ExpoConfig,\n  GetConfigOptions,\n  PackageJSONConfig,\n  Platform,\n  ProjectConfig,\n  ProjectTarget,\n  WriteConfigOptions,\n} from './Config.types';\nimport { getDynamicConfig, getStaticConfig } from './getConfig';\nimport { getExpoSDKVersion } from './getExpoSDKVersion';\nimport { withConfigPlugins } from './plugins/withConfigPlugins';\nimport { withInternal } from './plugins/withInternal';\nimport { getRootPackageJsonPath } from './resolvePackageJson';\n\ntype SplitConfigs = { expo: ExpoConfig; mods: ModConfig };\n\n/**\n * If a config has an `expo` object then that will be used as the config.\n * This method reduces out other top level values if an `expo` object exists.\n *\n * @param config Input config object to reduce\n */\nfunction reduceExpoObject(config?: any): SplitConfigs {\n  if (!config) return config === undefined ? null : config;\n\n  const { mods, ...expo } = config.expo ?? config;\n\n  return {\n    expo,\n    mods,\n  };\n}\n\n/**\n * Get all platforms that a project is currently capable of running.\n *\n * @param projectRoot\n * @param exp\n */\nfunction getSupportedPlatforms(projectRoot: string): Platform[] {\n  const platforms: Platform[] = [];\n  if (resolveFrom.silent(projectRoot, 'react-native')) {\n    platforms.push('ios', 'android');\n  }\n  if (resolveFrom.silent(projectRoot, 'react-native-web')) {\n    platforms.push('web');\n  }\n  return platforms;\n}\n\n/**\n * Evaluate the config for an Expo project.\n * If a function is exported from the `app.config.js` then a partial config will be passed as an argument.\n * The partial config is composed from any existing app.json, and certain fields from the `package.json` like name and description.\n *\n * If options.isPublicConfig is true, the Expo config will include only public-facing options (omitting private keys).\n * The resulting config should be suitable for hosting or embedding in a publicly readable location.\n *\n * **Example**\n * ```js\n * module.exports = function({ config }) {\n *   // mutate the config before returning it.\n *   config.slug = 'new slug'\n *   return { expo: config };\n * }\n * ```\n *\n * **Supports**\n * - `app.config.ts`\n * - `app.config.js`\n * - `app.config.json`\n * - `app.json`\n *\n * @param projectRoot the root folder containing all of your application code\n * @param options enforce criteria for a project config\n */\nexport function getConfig(projectRoot: string, options: GetConfigOptions = {}): ProjectConfig {\n  const paths = getConfigFilePaths(projectRoot);\n\n  const rawStaticConfig = paths.staticConfigPath ? getStaticConfig(paths.staticConfigPath) : null;\n  // For legacy reasons, always return an object.\n  const rootConfig = (rawStaticConfig || {}) as AppJSONConfig;\n  const staticConfig = reduceExpoObject(rawStaticConfig) || {};\n\n  // Can only change the package.json location if an app.json or app.config.json exists\n  const [packageJson, packageJsonPath] = getPackageJsonAndPath(projectRoot);\n\n  function fillAndReturnConfig(config: SplitConfigs, dynamicConfigObjectType: string | null) {\n    const configWithDefaultValues = {\n      ...ensureConfigHasDefaultValues({\n        projectRoot,\n        exp: config.expo,\n        pkg: packageJson,\n        skipSDKVersionRequirement: options.skipSDKVersionRequirement,\n        paths,\n        packageJsonPath,\n      }),\n      mods: config.mods,\n      dynamicConfigObjectType,\n      rootConfig,\n      dynamicConfigPath: paths.dynamicConfigPath,\n      staticConfigPath: paths.staticConfigPath,\n    };\n\n    if (options.isModdedConfig) {\n      // @ts-ignore: Add the mods back to the object.\n      configWithDefaultValues.exp.mods = config.mods ?? null;\n    }\n\n    // Apply static json plugins, should be done after _internal\n    configWithDefaultValues.exp = withConfigPlugins(\n      configWithDefaultValues.exp,\n      !!options.skipPlugins\n    );\n\n    if (!options.isModdedConfig) {\n      // @ts-ignore: Delete mods added by static plugins when they won't have a chance to be evaluated\n      delete configWithDefaultValues.exp.mods;\n    }\n\n    if (options.isPublicConfig) {\n      // TODD(EvanBacon): Drop plugins array after it's been resolved.\n\n      // Remove internal values with references to user's file paths from the public config.\n      delete configWithDefaultValues.exp._internal;\n\n      if (configWithDefaultValues.exp.hooks) {\n        delete configWithDefaultValues.exp.hooks;\n      }\n      if (configWithDefaultValues.exp.ios?.config) {\n        delete configWithDefaultValues.exp.ios.config;\n      }\n      if (configWithDefaultValues.exp.android?.config) {\n        delete configWithDefaultValues.exp.android.config;\n      }\n\n      delete configWithDefaultValues.exp.updates?.codeSigningCertificate;\n      delete configWithDefaultValues.exp.updates?.codeSigningMetadata;\n    }\n\n    return configWithDefaultValues;\n  }\n\n  // Fill in the static config\n  function getContextConfig(config: SplitConfigs) {\n    return ensureConfigHasDefaultValues({\n      projectRoot,\n      exp: config.expo,\n      pkg: packageJson,\n      skipSDKVersionRequirement: true,\n      paths,\n      packageJsonPath,\n    }).exp;\n  }\n\n  if (paths.dynamicConfigPath) {\n    // No app.config.json or app.json but app.config.js\n    const { exportedObjectType, config: rawDynamicConfig } = getDynamicConfig(\n      paths.dynamicConfigPath,\n      {\n        projectRoot,\n        staticConfigPath: paths.staticConfigPath,\n        packageJsonPath,\n        config: getContextConfig(staticConfig),\n      }\n    );\n    // Allow for the app.config.js to `export default null;`\n    // Use `dynamicConfigPath` to detect if a dynamic config exists.\n    const dynamicConfig = reduceExpoObject(rawDynamicConfig) || {};\n    return fillAndReturnConfig(dynamicConfig, exportedObjectType);\n  }\n\n  // No app.config.js but json or no config\n  return fillAndReturnConfig(staticConfig || {}, null);\n}\n\nexport function getPackageJson(projectRoot: string): PackageJSONConfig {\n  const [pkg] = getPackageJsonAndPath(projectRoot);\n  return pkg;\n}\n\nfunction getPackageJsonAndPath(projectRoot: string): [PackageJSONConfig, string] {\n  const packageJsonPath = getRootPackageJsonPath(projectRoot);\n  return [JsonFile.read(packageJsonPath), packageJsonPath];\n}\n\n/**\n * Get the static and dynamic config paths for a project. Also accounts for custom paths.\n *\n * @param projectRoot\n */\nexport function getConfigFilePaths(projectRoot: string): ConfigFilePaths {\n  return {\n    dynamicConfigPath: getDynamicConfigFilePath(projectRoot),\n    staticConfigPath: getStaticConfigFilePath(projectRoot),\n  };\n}\n\nfunction getDynamicConfigFilePath(projectRoot: string): string | null {\n  for (const fileName of ['app.config.ts', 'app.config.js']) {\n    const configPath = path.join(projectRoot, fileName);\n    if (fs.existsSync(configPath)) {\n      return configPath;\n    }\n  }\n  return null;\n}\n\nfunction getStaticConfigFilePath(projectRoot: string): string | null {\n  for (const fileName of ['app.config.json', 'app.json']) {\n    const configPath = path.join(projectRoot, fileName);\n    if (fs.existsSync(configPath)) {\n      return configPath;\n    }\n  }\n  return null;\n}\n\n/**\n * Attempt to modify an Expo project config.\n * This will only fully work if the project is using static configs only.\n * Otherwise 'warn' | 'fail' will return with a message about why the config couldn't be updated.\n * The potentially modified config object will be returned for testing purposes.\n *\n * @param projectRoot\n * @param modifications modifications to make to an existing config\n * @param readOptions options for reading the current config file\n * @param writeOptions If true, the static config file will not be rewritten\n */\nexport async function modifyConfigAsync(\n  projectRoot: string,\n  modifications: Partial<ExpoConfig>,\n  readOptions: GetConfigOptions = {},\n  writeOptions: WriteConfigOptions = {}\n): Promise<{\n  type: 'success' | 'warn' | 'fail';\n  message?: string;\n  config: AppJSONConfig | null;\n}> {\n  const config = getConfig(projectRoot, readOptions);\n  if (config.dynamicConfigPath) {\n    // We cannot automatically write to a dynamic config.\n    /* Currently we should just use the safest approach possible, informing the user that they'll need to manually modify their dynamic config.\n\n    if (config.staticConfigPath) {\n      // Both a dynamic and a static config exist.\n      if (config.dynamicConfigObjectType === 'function') {\n        // The dynamic config exports a function, this means it possibly extends the static config.\n      } else {\n        // Dynamic config ignores the static config, there isn't a reason to automatically write to it.\n        // Instead we should warn the user to add values to their dynamic config.\n      }\n    }\n    */\n    return {\n      type: 'warn',\n      message: `Cannot automatically write to dynamic config at: ${path.relative(\n        projectRoot,\n        config.dynamicConfigPath\n      )}`,\n      config: null,\n    };\n  } else if (config.staticConfigPath) {\n    // Static with no dynamic config, this means we can append to the config automatically.\n    let outputConfig: AppJSONConfig;\n    // If the config has an expo object (app.json) then append the options to that object.\n    if (config.rootConfig.expo) {\n      outputConfig = {\n        ...config.rootConfig,\n        expo: { ...config.rootConfig.expo, ...modifications },\n      };\n    } else {\n      // Otherwise (app.config.json) just add the config modification to the top most level.\n      outputConfig = { ...config.rootConfig, ...modifications };\n    }\n    if (!writeOptions.dryRun) {\n      await JsonFile.writeAsync(config.staticConfigPath, outputConfig, { json5: false });\n    }\n    return { type: 'success', config: outputConfig };\n  }\n\n  return { type: 'fail', message: 'No config exists', config: null };\n}\n\nfunction ensureConfigHasDefaultValues({\n  projectRoot,\n  exp,\n  pkg,\n  paths,\n  packageJsonPath,\n  skipSDKVersionRequirement = false,\n}: {\n  projectRoot: string;\n  exp: Partial<ExpoConfig> | null;\n  pkg: JSONObject;\n  skipSDKVersionRequirement?: boolean;\n  paths?: ConfigFilePaths;\n  packageJsonPath?: string;\n}): { exp: ExpoConfig; pkg: PackageJSONConfig } {\n  if (!exp) {\n    exp = {};\n  }\n  exp = withInternal(exp as any, {\n    projectRoot,\n    ...(paths ?? {}),\n    packageJsonPath,\n  });\n  // Defaults for package.json fields\n  const pkgName = typeof pkg.name === 'string' ? pkg.name : path.basename(projectRoot);\n  const pkgVersion = typeof pkg.version === 'string' ? pkg.version : '1.0.0';\n\n  const pkgWithDefaults = { ...pkg, name: pkgName, version: pkgVersion };\n\n  // Defaults for app.json/app.config.js fields\n  const name = exp.name ?? pkgName;\n  const slug = exp.slug ?? slugify(name.toLowerCase());\n  const version = exp.version ?? pkgVersion;\n  let description = exp.description;\n  if (!description && typeof pkg.description === 'string') {\n    description = pkg.description;\n  }\n\n  const expWithDefaults = { ...exp, name, slug, version, description };\n\n  let sdkVersion;\n  try {\n    sdkVersion = getExpoSDKVersion(projectRoot, expWithDefaults);\n  } catch (error) {\n    if (!skipSDKVersionRequirement) throw error;\n  }\n\n  let platforms = exp.platforms;\n  if (!platforms) {\n    platforms = getSupportedPlatforms(projectRoot);\n  }\n\n  return {\n    exp: { ...expWithDefaults, sdkVersion, platforms },\n    pkg: pkgWithDefaults,\n  };\n}\n\nconst DEFAULT_BUILD_PATH = `web-build`;\n\nexport function getWebOutputPath(config: { [key: string]: any } = {}): string {\n  if (process.env.WEBPACK_BUILD_OUTPUT_PATH) {\n    return process.env.WEBPACK_BUILD_OUTPUT_PATH;\n  }\n  const expo = config.expo || config || {};\n  return expo?.web?.build?.output || DEFAULT_BUILD_PATH;\n}\n\nexport function getNameFromConfig(exp: Record<string, any> = {}): {\n  appName?: string;\n  webName?: string;\n} {\n  // For RN CLI support\n  const appManifest = exp.expo || exp;\n  const { web = {} } = appManifest;\n\n  // rn-cli apps use a displayName value as well.\n  const appName = exp.displayName || appManifest.displayName || appManifest.name;\n  const webName = web.name || appName;\n\n  return {\n    appName,\n    webName,\n  };\n}\n\nexport function getDefaultTarget(\n  projectRoot: string,\n  exp?: Pick<ExpoConfig, 'sdkVersion'>\n): ProjectTarget {\n  exp ??= getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp;\n\n  // before SDK 37, always default to managed to preserve previous behavior\n  if (exp.sdkVersion && exp.sdkVersion !== 'UNVERSIONED' && semver.lt(exp.sdkVersion, '37.0.0')) {\n    return 'managed';\n  }\n  return isBareWorkflowProject(projectRoot) ? 'bare' : 'managed';\n}\n\nfunction isBareWorkflowProject(projectRoot: string): boolean {\n  const [pkg] = getPackageJsonAndPath(projectRoot);\n\n  // TODO: Drop this\n  if (pkg.dependencies && pkg.dependencies.expokit) {\n    return false;\n  }\n\n  const xcodeprojFiles = globSync('ios/**/*.xcodeproj', {\n    absolute: true,\n    cwd: projectRoot,\n  });\n  if (xcodeprojFiles.length) {\n    return true;\n  }\n  const gradleFiles = globSync('android/**/*.gradle', {\n    absolute: true,\n    cwd: projectRoot,\n  });\n  if (gradleFiles.length) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * Return a useful name describing the project config.\n * - dynamic: app.config.js\n * - static: app.json\n * - custom path app config relative to root folder\n * - both: app.config.js or app.json\n */\nexport function getProjectConfigDescription(projectRoot: string): string {\n  const paths = getConfigFilePaths(projectRoot);\n  return getProjectConfigDescriptionWithPaths(projectRoot, paths);\n}\n\n/**\n * Returns a string describing the configurations used for the given project root.\n * Will return null if no config is found.\n *\n * @param projectRoot\n * @param projectConfig\n */\nexport function getProjectConfigDescriptionWithPaths(\n  projectRoot: string,\n  projectConfig: ConfigFilePaths\n): string {\n  if (projectConfig.dynamicConfigPath) {\n    const relativeDynamicConfigPath = path.relative(projectRoot, projectConfig.dynamicConfigPath);\n    if (projectConfig.staticConfigPath) {\n      return `${relativeDynamicConfigPath} or ${path.relative(\n        projectRoot,\n        projectConfig.staticConfigPath\n      )}`;\n    }\n    return relativeDynamicConfigPath;\n  } else if (projectConfig.staticConfigPath) {\n    return path.relative(projectRoot, projectConfig.staticConfigPath);\n  }\n  // If a config doesn't exist, our tooling will generate a static app.json\n  return 'app.json';\n}\n\nexport * from './Config.types';\n"],"mappings":"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"}