1import { ExpoConfig } from '@expo/config-types';
2
3import { resolveMetroVersionFromProject } from '../../start/server/metro/resolveFromProject';
4
5/**
6 * Get the unstable / experimental properties used within the Metro config.
7 * Note that this should match `metro-config`, but uses newer features that are not yet typed.
8 *
9 * @see https://github.com/facebook/metro/blob/1d51ffd33f54dba25c54b49ff059543dac519f21/packages/metro-config/src/configTypes.flow.js
10 */
11export function getMetroProperties(
12  projectRoot: string,
13  exp: ExpoConfig,
14  metroConfig: Record<string, any> = {}
15) {
16  return {
17    sdkVersion: exp.sdkVersion,
18    metroVersion: resolveMetroVersionFromProject(projectRoot),
19
20    fileMapCacheManagerFactory:
21      Boolean(metroConfig.unstable_fileMapCacheManagerFactory) || undefined, // CacheManagerFactory
22    perfLogger: Boolean(metroConfig.unstable_perfLogger) || undefined, // PerfLoggerFactory
23
24    resolverEnableSymlinks: metroConfig.resolver?.unstable_enableSymlinks, // boolean
25    resolverConditionNames: metroConfig.resolver?.unstable_conditionNames, // string[]
26    resolverConditionsByPlatform: metroConfig.resolver?.unstable_conditionsByPlatform, // { [platform: string]: string[] }
27    resolverEnablePackageExports: metroConfig.resolver?.unstable_enablePackageExports, // boolean
28
29    serverImportBundleSupport: metroConfig.server?.experimentalImportBundleSupport, // boolean
30    serverServerRoot: Boolean(metroConfig.server?.unstable_serverRoot) || undefined, // string | null
31
32    transformerCollectDependenciesPath: metroConfig.transformer?.unstable_collectDependenciesPath, // string
33    transformerDependencyMapReservedName:
34      metroConfig.transformer?.unstable_dependencyMapReservedName, // string | null
35    transformerDisableModuleWrapping: metroConfig.transformer?.unstable_disableModuleWrapping, // boolean
36    transformerDisableNormalizePseudoGlobals:
37      metroConfig.transformer?.unstable_disableNormalizePseudoGlobals, // boolean
38    transformerCompactOutput: metroConfig.transformer?.unstable_compactOutput, // boolean
39    transformerAllowRequireContext: metroConfig.transformer?.unstable_allowRequireContext, // boolean
40  };
41}
42