-
Notifications
You must be signed in to change notification settings - Fork 117
Expand file tree
/
Copy pathexpoConfig.js
More file actions
65 lines (58 loc) · 2.02 KB
/
expoConfig.js
File metadata and controls
65 lines (58 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// @ts-check
/** @typedef {import("metro-config").MetroConfig} MetroConfig */
/**
* Determines whether this is an Expo config.
* @param {MetroConfig=} config
* @returns {boolean}
*/
function isExpoConfig(config) {
if (!config) {
return false;
}
// https://github.com/expo/expo/blob/sdk-51/packages/%40expo/metro-config/src/ExpoMetroConfig.ts#L256
const transformer = config.transformer;
if (transformer) {
if (
"_expoRelativeProjectRoot" in transformer ||
transformer.babelTransformerPath?.includes("@expo")
) {
return true;
}
}
return Boolean(config.transformerPath?.includes("@expo"));
}
/**
* Applies workarounds to make the Expo config work.
* @param {MetroConfig} config
* @param {MetroConfig} defaultConfig
* @returns {void}
*/
function applyExpoWorkarounds(config, defaultConfig) {
// Expo's default config is based on Metro's default config, and Metro's
// default config sets some fields (like `resolveRequest`) to `null`, which
// then overwrites our fields:
// https://github.com/facebook/metro/blob/v0.80.10/packages/metro-config/src/defaults/index.js#L51
if (config.resolver?.resolveRequest === null) {
delete config.resolver.resolveRequest;
}
// Expo _always_ sets `getModulesRunBeforeMainModule`:
// https://github.com/expo/expo/blob/sdk-51/packages/%40expo/metro-config/src/ExpoMetroConfig.ts#L207
const getModulesRunBeforeMainModule =
config.serializer?.getModulesRunBeforeMainModule;
if (getModulesRunBeforeMainModule) {
const core = /Libraries[/\\]Core[/\\]InitializeCore/;
const prelude =
defaultConfig.serializer?.getModulesRunBeforeMainModule?.("") ?? [];
config.serializer.getModulesRunBeforeMainModule = (entryFilePath) => {
const modules = prelude.slice();
for (const m of getModulesRunBeforeMainModule(entryFilePath)) {
if (!core.test(m)) {
modules.push(m);
}
}
return modules;
};
}
}
exports.applyExpoWorkarounds = applyExpoWorkarounds;
exports.isExpoConfig = isExpoConfig;