-
Notifications
You must be signed in to change notification settings - Fork 41
/
metro.config.js
83 lines (71 loc) · 2.43 KB
/
metro.config.js
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
const path = require('path');
const fs = require('fs');
const exclusionList = require('metro-config/src/defaults/exclusionList');
const escape = require('escape-string-regexp');
const { getDefaultConfig } = require('@expo/metro-config');
const root = path.resolve(__dirname, '..');
const packages = path.resolve(root, 'packages');
const defaultConfig = getDefaultConfig(__dirname);
// List all packages under `packages/`
const workspaces = fs
.readdirSync(packages)
.map((p) => path.join(packages, p))
.filter(
(p) =>
fs.statSync(p).isDirectory() &&
fs.existsSync(path.join(p, 'package.json'))
);
// Get the list of dependencies for all packages in the monorepo
const modules = []
.concat(
...workspaces.map((it) => {
const pak = JSON.parse(
fs.readFileSync(path.join(it, 'package.json'), 'utf8')
);
// We need to make sure that only one version is loaded for peerDependencies
// So we exclude them at the root, and alias them to the versions in example's node_modules
return pak.peerDependencies ? Object.keys(pak.peerDependencies) : [];
})
)
.sort()
.filter(
(m, i, self) =>
// Remove duplicates and package names of the packages in the monorepo
self.lastIndexOf(m) === i && !m.startsWith('@react-navigation/')
);
module.exports = {
...defaultConfig,
projectRoot: __dirname,
// We need to watch the root of the monorepo
// This lets Metro find the monorepo packages automatically using haste
// This also lets us import modules from monorepo root
watchFolders: [root],
resolver: {
...defaultConfig.resolver,
// We need to exclude the peerDependencies we've collected in packages' node_modules
blacklistRE: exclusionList(
[].concat(
...workspaces.map((it) =>
modules.map(
(m) =>
new RegExp(`^${escape(path.join(it, 'node_modules', m))}\\/.*$`)
)
)
)
),
// When we import a package from the monorepo, metro won't be able to find their deps
// We need to specify them in `extraNodeModules` to tell metro where to find them
extraNodeModules: modules.reduce((acc, name) => {
acc[name] = path.join(root, 'node_modules', name);
return acc;
}, {}),
},
// transformer: {
// getTransformOptions: async () => ({
// transform: {
// experimentalImportSupport: false,
// inlineRequires: true,
// },
// }),
// },
};