metro 0.63.0 → 0.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +22 -22
- package/src/Assets.js +8 -2
- package/src/Bundler/util.js +17 -10
- package/src/Bundler/util.js.flow +13 -12
- package/src/Bundler.js +4 -0
- package/src/DeltaBundler/DeltaCalculator.js +6 -1
- package/src/DeltaBundler/Serializers/baseBytecodeBundle.js +10 -0
- package/src/DeltaBundler/Serializers/baseJSBundle.js +5 -0
- package/src/DeltaBundler/Serializers/getAllFiles.js +6 -0
- package/src/DeltaBundler/Serializers/getAssets.js +4 -0
- package/src/DeltaBundler/Serializers/getRamBundleInfo.js +6 -0
- package/src/DeltaBundler/Serializers/helpers/bytecode.js +5 -0
- package/src/DeltaBundler/Serializers/helpers/getSourceMapInfo.js +5 -0
- package/src/DeltaBundler/Serializers/helpers/processBytecodeModules.js +2 -0
- package/src/DeltaBundler/Serializers/helpers/processModules.js +2 -0
- package/src/DeltaBundler/Serializers/hmrJSBundle.js +8 -2
- package/src/DeltaBundler/Serializers/sourceMapGenerator.js +4 -0
- package/src/DeltaBundler/Serializers/sourceMapObject.js +4 -0
- package/src/DeltaBundler/Transformer.js +16 -0
- package/src/DeltaBundler/Worker.js +4 -0
- package/src/DeltaBundler/WorkerFarm.js +9 -0
- package/src/DeltaBundler/computeDelta.js +5 -0
- package/src/DeltaBundler/getTransformCacheKey.js +1 -1
- package/src/DeltaBundler/mergeDeltas.js +5 -0
- package/src/DeltaBundler/traverseDependencies.js +14 -0
- package/src/DeltaBundler.js +6 -1
- package/src/HmrServer.js +18 -0
- package/src/IncrementalBundler.js +16 -0
- package/src/ModuleGraph/node-haste/Package.js +5 -0
- package/src/ModuleGraph/node-haste/node-haste.flow.js.flow +0 -2
- package/src/ModuleGraph/node-haste/node-haste.js +3 -0
- package/src/ModuleGraph/node-haste/node-haste.js.flow +4 -2
- package/src/ModuleGraph/output/indexed-ram-bundle.js +10 -0
- package/src/ModuleGraph/output/multiple-files-ram-bundle.js +10 -0
- package/src/ModuleGraph/output/reverse-dependency-map-references.js +33 -9
- package/src/ModuleGraph/output/reverse-dependency-map-references.js.flow +28 -13
- package/src/ModuleGraph/output/util.js +59 -25
- package/src/ModuleGraph/output/util.js.flow +59 -23
- package/src/ModuleGraph/test-helpers.js +74 -2
- package/src/ModuleGraph/types.flow.js.flow +13 -8
- package/src/ModuleGraph/worker/JsFileWrapping.js +90 -12
- package/src/ModuleGraph/worker/JsFileWrapping.js.flow +34 -20
- package/src/ModuleGraph/worker/collectDependencies.js +329 -205
- package/src/ModuleGraph/worker/collectDependencies.js.flow +397 -209
- package/src/ModuleGraph/worker/generate.js.flow +2 -2
- package/src/ModuleGraph/worker/generateImportNames.js +2 -1
- package/src/ModuleGraph/worker/generateImportNames.js.flow +3 -4
- package/src/ModuleGraph/worker/mergeSourceMaps.js +5 -0
- package/src/Server/symbolicate.js +14 -0
- package/src/Server.js +16 -3
- package/src/Server.js.flow +1 -0
- package/src/cli-utils.js +4 -0
- package/src/cli.js +0 -0
- package/src/commands/build.js +10 -0
- package/src/commands/build.js.flow +2 -0
- package/src/commands/dependencies.js +4 -0
- package/src/commands/serve.js +5 -0
- package/src/commands/serve.js.flow +2 -0
- package/src/index.js +13 -1
- package/src/index.js.flow +2 -0
- package/src/integration_tests/basic_bundle/import-export/index.js +19 -2
- package/src/integration_tests/execBundle.js +2 -2
- package/src/integration_tests/metro.config.js +4 -0
- package/src/lib/BatchProcessor.js +1 -1
- package/src/lib/TerminalReporter.js +10 -0
- package/src/lib/attachWebsocketServer.js +5 -1
- package/src/lib/bundleToBytecode.js +7 -3
- package/src/lib/bundleToString.js +6 -1
- package/src/lib/debounceAsyncQueue.js +4 -0
- package/src/lib/getAppendScripts.js +2 -0
- package/src/lib/getPreludeCode.js +2 -0
- package/src/lib/getPrependedScripts.js +11 -0
- package/src/lib/logToConsole.js +1 -2
- package/src/lib/parseOptionsFromUrl.js +5 -0
- package/src/lib/reporting.js +1 -1
- package/src/lib/splitBundleOptions.js +1 -1
- package/src/lib/transformHelpers.js +19 -3
- package/src/lib/transformHelpers.js.flow +4 -4
- package/src/node-haste/DependencyGraph/ModuleResolution.js +10 -2
- package/src/node-haste/DependencyGraph/ModuleResolution.js.flow +6 -5
- package/src/node-haste/DependencyGraph.js +11 -2
- package/src/node-haste/DependencyGraph.js.flow +5 -0
- package/src/node-haste/Package.js +2 -0
- package/src/shared/output/RamBundle/as-assets.js +1 -2
- package/src/shared/output/RamBundle/as-indexed-file.js +2 -0
- package/src/shared/output/RamBundle/util.js +2 -2
- package/src/shared/output/RamBundle.js +9 -0
- package/src/shared/output/bundle.js +9 -0
- package/src/ModuleGraph/worker/optimizeDependencies.js +0 -122
- package/src/ModuleGraph/worker/optimizeDependencies.js.flow +0 -128
|
@@ -45,7 +45,9 @@ function _arrayWithoutHoles(arr) {
|
|
|
45
45
|
|
|
46
46
|
function _arrayLikeToArray(arr, len) {
|
|
47
47
|
if (len == null || len > arr.length) len = arr.length;
|
|
48
|
+
|
|
48
49
|
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
50
|
+
|
|
49
51
|
return arr2;
|
|
50
52
|
}
|
|
51
53
|
|
|
@@ -57,6 +59,7 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
57
59
|
reject(error);
|
|
58
60
|
return;
|
|
59
61
|
}
|
|
62
|
+
|
|
60
63
|
if (info.done) {
|
|
61
64
|
resolve(value);
|
|
62
65
|
} else {
|
|
@@ -70,12 +73,15 @@ function _asyncToGenerator(fn) {
|
|
|
70
73
|
args = arguments;
|
|
71
74
|
return new Promise(function(resolve, reject) {
|
|
72
75
|
var gen = fn.apply(self, args);
|
|
76
|
+
|
|
73
77
|
function _next(value) {
|
|
74
78
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
75
79
|
}
|
|
80
|
+
|
|
76
81
|
function _throw(err) {
|
|
77
82
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
78
83
|
}
|
|
84
|
+
|
|
79
85
|
_next(undefined);
|
|
80
86
|
});
|
|
81
87
|
};
|
|
@@ -92,6 +98,7 @@ function _defineProperty(obj, key, value) {
|
|
|
92
98
|
} else {
|
|
93
99
|
obj[key] = value;
|
|
94
100
|
}
|
|
101
|
+
|
|
95
102
|
return obj;
|
|
96
103
|
}
|
|
97
104
|
|
|
@@ -145,6 +152,7 @@ function getOrCreate(map, field) {
|
|
|
145
152
|
}
|
|
146
153
|
|
|
147
154
|
class DependencyGraph extends EventEmitter {
|
|
155
|
+
// $FlowFixMe[value-as-type]
|
|
148
156
|
constructor(_ref) {
|
|
149
157
|
let config = _ref.config,
|
|
150
158
|
haste = _ref.haste,
|
|
@@ -199,7 +207,7 @@ class DependencyGraph extends EventEmitter {
|
|
|
199
207
|
}
|
|
200
208
|
|
|
201
209
|
return ignorePattern;
|
|
202
|
-
}
|
|
210
|
+
} // $FlowFixMe[value-as-type]
|
|
203
211
|
|
|
204
212
|
static _createHaste(config, watch) {
|
|
205
213
|
const haste = new JestHasteMap({
|
|
@@ -313,6 +321,7 @@ class DependencyGraph extends EventEmitter {
|
|
|
313
321
|
mainFields: this._config.resolver.resolverMainFields,
|
|
314
322
|
moduleCache: this._moduleCache,
|
|
315
323
|
moduleMap: this._moduleMap,
|
|
324
|
+
nodeModulesPaths: this._config.resolver.nodeModulesPaths,
|
|
316
325
|
preferNativePlatform: true,
|
|
317
326
|
projectRoot: this._config.projectRoot,
|
|
318
327
|
resolveAsset: (dirPath, assetName, extension) => {
|
|
@@ -364,7 +373,7 @@ class DependencyGraph extends EventEmitter {
|
|
|
364
373
|
}
|
|
365
374
|
|
|
366
375
|
return sha1;
|
|
367
|
-
}
|
|
376
|
+
} // $FlowFixMe[value-as-type]
|
|
368
377
|
|
|
369
378
|
getWatcher() {
|
|
370
379
|
return this._haste;
|
|
@@ -51,6 +51,7 @@ function getOrCreate<T>(
|
|
|
51
51
|
class DependencyGraph extends EventEmitter {
|
|
52
52
|
_assetExtensions: Set<string>;
|
|
53
53
|
_config: ConfigT;
|
|
54
|
+
// $FlowFixMe[value-as-type]
|
|
54
55
|
_haste: JestHasteMap;
|
|
55
56
|
_hasteFS: HasteFS;
|
|
56
57
|
_moduleCache: ModuleCache;
|
|
@@ -65,6 +66,7 @@ class DependencyGraph extends EventEmitter {
|
|
|
65
66
|
initialModuleMap,
|
|
66
67
|
}: {|
|
|
67
68
|
+config: ConfigT,
|
|
69
|
+
// $FlowFixMe[value-as-type]
|
|
68
70
|
+haste: JestHasteMap,
|
|
69
71
|
+initialHasteFS: HasteFS,
|
|
70
72
|
+initialModuleMap: ModuleMap,
|
|
@@ -113,6 +115,7 @@ class DependencyGraph extends EventEmitter {
|
|
|
113
115
|
return ignorePattern;
|
|
114
116
|
}
|
|
115
117
|
|
|
118
|
+
// $FlowFixMe[value-as-type]
|
|
116
119
|
static _createHaste(config: ConfigT, watch?: boolean): JestHasteMap {
|
|
117
120
|
const haste = new JestHasteMap({
|
|
118
121
|
cacheDirectory: config.hasteMapCacheDirectory,
|
|
@@ -212,6 +215,7 @@ class DependencyGraph extends EventEmitter {
|
|
|
212
215
|
mainFields: this._config.resolver.resolverMainFields,
|
|
213
216
|
moduleCache: this._moduleCache,
|
|
214
217
|
moduleMap: this._moduleMap,
|
|
218
|
+
nodeModulesPaths: this._config.resolver.nodeModulesPaths,
|
|
215
219
|
preferNativePlatform: true,
|
|
216
220
|
projectRoot: this._config.projectRoot,
|
|
217
221
|
resolveAsset: (dirPath: string, assetName: string, extension: string) => {
|
|
@@ -266,6 +270,7 @@ class DependencyGraph extends EventEmitter {
|
|
|
266
270
|
return sha1;
|
|
267
271
|
}
|
|
268
272
|
|
|
273
|
+
// $FlowFixMe[value-as-type]
|
|
269
274
|
getWatcher(): JestHasteMap {
|
|
270
275
|
return this._haste;
|
|
271
276
|
}
|
|
@@ -24,9 +24,8 @@ const writeFile = require("../writeFile");
|
|
|
24
24
|
const writeSourceMap = require("./write-sourcemap");
|
|
25
25
|
|
|
26
26
|
const _require = require("./util"),
|
|
27
|
-
joinModules = _require.joinModules;
|
|
27
|
+
joinModules = _require.joinModules; // must not start with a dot, as that won't go into the apk
|
|
28
28
|
|
|
29
|
-
// must not start with a dot, as that won't go into the apk
|
|
30
29
|
const MAGIC_RAM_BUNDLE_FILENAME = "UNBUNDLE";
|
|
31
30
|
const MODULES_DIR = "js-modules";
|
|
32
31
|
/**
|
|
@@ -17,8 +17,8 @@ const countLines = string => (string.match(newline) || []).length + 1;
|
|
|
17
17
|
|
|
18
18
|
function lineToLineSourceMap(source) {
|
|
19
19
|
let filename =
|
|
20
|
-
arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
21
|
-
|
|
20
|
+
arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; // The first line mapping in our package is the base64vlq code for zeros (A).
|
|
21
|
+
|
|
22
22
|
const firstLine = "AAAA;"; // Most other lines in our mappings are all zeros (for module, column etc)
|
|
23
23
|
// except for the lineno mapping: curLineno - prevLineno = 1; Which is C.
|
|
24
24
|
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
function ownKeys(object, enumerableOnly) {
|
|
13
13
|
var keys = Object.keys(object);
|
|
14
|
+
|
|
14
15
|
if (Object.getOwnPropertySymbols) {
|
|
15
16
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
16
17
|
if (enumerableOnly)
|
|
@@ -19,12 +20,14 @@ function ownKeys(object, enumerableOnly) {
|
|
|
19
20
|
});
|
|
20
21
|
keys.push.apply(keys, symbols);
|
|
21
22
|
}
|
|
23
|
+
|
|
22
24
|
return keys;
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
function _objectSpread(target) {
|
|
26
28
|
for (var i = 1; i < arguments.length; i++) {
|
|
27
29
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
30
|
+
|
|
28
31
|
if (i % 2) {
|
|
29
32
|
ownKeys(Object(source), true).forEach(function(key) {
|
|
30
33
|
_defineProperty(target, key, source[key]);
|
|
@@ -41,6 +44,7 @@ function _objectSpread(target) {
|
|
|
41
44
|
});
|
|
42
45
|
}
|
|
43
46
|
}
|
|
47
|
+
|
|
44
48
|
return target;
|
|
45
49
|
}
|
|
46
50
|
|
|
@@ -55,6 +59,7 @@ function _defineProperty(obj, key, value) {
|
|
|
55
59
|
} else {
|
|
56
60
|
obj[key] = value;
|
|
57
61
|
}
|
|
62
|
+
|
|
58
63
|
return obj;
|
|
59
64
|
}
|
|
60
65
|
|
|
@@ -66,6 +71,7 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
66
71
|
reject(error);
|
|
67
72
|
return;
|
|
68
73
|
}
|
|
74
|
+
|
|
69
75
|
if (info.done) {
|
|
70
76
|
resolve(value);
|
|
71
77
|
} else {
|
|
@@ -79,12 +85,15 @@ function _asyncToGenerator(fn) {
|
|
|
79
85
|
args = arguments;
|
|
80
86
|
return new Promise(function(resolve, reject) {
|
|
81
87
|
var gen = fn.apply(self, args);
|
|
88
|
+
|
|
82
89
|
function _next(value) {
|
|
83
90
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
84
91
|
}
|
|
92
|
+
|
|
85
93
|
function _throw(err) {
|
|
86
94
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
87
95
|
}
|
|
96
|
+
|
|
88
97
|
_next(undefined);
|
|
89
98
|
});
|
|
90
99
|
};
|
|
@@ -17,6 +17,7 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
17
17
|
reject(error);
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
+
|
|
20
21
|
if (info.done) {
|
|
21
22
|
resolve(value);
|
|
22
23
|
} else {
|
|
@@ -30,12 +31,15 @@ function _asyncToGenerator(fn) {
|
|
|
30
31
|
args = arguments;
|
|
31
32
|
return new Promise(function(resolve, reject) {
|
|
32
33
|
var gen = fn.apply(self, args);
|
|
34
|
+
|
|
33
35
|
function _next(value) {
|
|
34
36
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
35
37
|
}
|
|
38
|
+
|
|
36
39
|
function _throw(err) {
|
|
37
40
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
38
41
|
}
|
|
42
|
+
|
|
39
43
|
_next(undefined);
|
|
40
44
|
});
|
|
41
45
|
};
|
|
@@ -43,6 +47,7 @@ function _asyncToGenerator(fn) {
|
|
|
43
47
|
|
|
44
48
|
function ownKeys(object, enumerableOnly) {
|
|
45
49
|
var keys = Object.keys(object);
|
|
50
|
+
|
|
46
51
|
if (Object.getOwnPropertySymbols) {
|
|
47
52
|
var symbols = Object.getOwnPropertySymbols(object);
|
|
48
53
|
if (enumerableOnly)
|
|
@@ -51,12 +56,14 @@ function ownKeys(object, enumerableOnly) {
|
|
|
51
56
|
});
|
|
52
57
|
keys.push.apply(keys, symbols);
|
|
53
58
|
}
|
|
59
|
+
|
|
54
60
|
return keys;
|
|
55
61
|
}
|
|
56
62
|
|
|
57
63
|
function _objectSpread(target) {
|
|
58
64
|
for (var i = 1; i < arguments.length; i++) {
|
|
59
65
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
66
|
+
|
|
60
67
|
if (i % 2) {
|
|
61
68
|
ownKeys(Object(source), true).forEach(function(key) {
|
|
62
69
|
_defineProperty(target, key, source[key]);
|
|
@@ -73,6 +80,7 @@ function _objectSpread(target) {
|
|
|
73
80
|
});
|
|
74
81
|
}
|
|
75
82
|
}
|
|
83
|
+
|
|
76
84
|
return target;
|
|
77
85
|
}
|
|
78
86
|
|
|
@@ -87,6 +95,7 @@ function _defineProperty(obj, key, value) {
|
|
|
87
95
|
} else {
|
|
88
96
|
obj[key] = value;
|
|
89
97
|
}
|
|
98
|
+
|
|
90
99
|
return obj;
|
|
91
100
|
}
|
|
92
101
|
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the MIT license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*
|
|
7
|
-
* @format
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
"use strict";
|
|
11
|
-
|
|
12
|
-
const traverse = require("@babel/traverse").default;
|
|
13
|
-
|
|
14
|
-
const babelGenerate = require("@babel/generator").default;
|
|
15
|
-
|
|
16
|
-
function optimizeDependencies(
|
|
17
|
-
ast,
|
|
18
|
-
dependencies,
|
|
19
|
-
dependencyMapName,
|
|
20
|
-
requireNames
|
|
21
|
-
) {
|
|
22
|
-
const visited = new WeakSet();
|
|
23
|
-
const context = {
|
|
24
|
-
oldToNewIndex: new Map(),
|
|
25
|
-
dependencies: []
|
|
26
|
-
};
|
|
27
|
-
const visitor = {
|
|
28
|
-
CallExpression(path) {
|
|
29
|
-
const node = path.node;
|
|
30
|
-
|
|
31
|
-
if (visited.has(node)) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (isRequireCall(node.callee, requireNames)) {
|
|
36
|
-
processRequireCall(node);
|
|
37
|
-
visited.add(node);
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
|
|
41
|
-
MemberExpression(path, state) {
|
|
42
|
-
const node = path.node;
|
|
43
|
-
|
|
44
|
-
if (visited.has(node)) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (isDepMapAccess(node, dependencyMapName)) {
|
|
49
|
-
processDepMapAccess(context, node, dependencies);
|
|
50
|
-
visited.add(node);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
traverse(ast, visitor);
|
|
55
|
-
return context.dependencies;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function isRequireCall(callee, requireNames) {
|
|
59
|
-
return callee.type === "Identifier" && requireNames.has(callee.name);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function processRequireCall(node) {
|
|
63
|
-
if (node.arguments.length != 2) {
|
|
64
|
-
throw new InvalidRequireCallError(
|
|
65
|
-
"Post-transform calls to require() expect 2 arguments, the first " +
|
|
66
|
-
"of which has the shape `_dependencyMapName[123]`, " +
|
|
67
|
-
`but this was found: \`${babelGenerate(node).code}\``
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
node.arguments = [node.arguments[0]];
|
|
72
|
-
return node;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function isDepMapAccess(node, depMapName) {
|
|
76
|
-
return (
|
|
77
|
-
node.computed &&
|
|
78
|
-
node.object.type === "Identifier" &&
|
|
79
|
-
node.object.name === depMapName &&
|
|
80
|
-
node.property.type === "NumericLiteral"
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function processDepMapAccess(context, node, deps) {
|
|
85
|
-
const index = node.property.value;
|
|
86
|
-
const newIx = translateDependencyIndex(context, deps, index);
|
|
87
|
-
|
|
88
|
-
if (newIx !== node.property.value) {
|
|
89
|
-
node.property.value = newIx;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function translateDependencyIndex(context, deps, index) {
|
|
94
|
-
let newIndex = context.oldToNewIndex.get(index);
|
|
95
|
-
|
|
96
|
-
if (newIndex != null) {
|
|
97
|
-
return newIndex;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const dep = deps[index];
|
|
101
|
-
|
|
102
|
-
if (dep == null) {
|
|
103
|
-
throw new Error(
|
|
104
|
-
`${index} is not a known module index. Existing mappings: ${deps
|
|
105
|
-
.map((n, i) => `${i} => ${n.name}`)
|
|
106
|
-
.join(", ")}`
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
newIndex = context.dependencies.push(dep) - 1;
|
|
111
|
-
context.oldToNewIndex.set(index, newIndex);
|
|
112
|
-
return newIndex;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
class InvalidRequireCallError extends Error {
|
|
116
|
-
constructor(message) {
|
|
117
|
-
super(message);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
optimizeDependencies.InvalidRequireCallError = InvalidRequireCallError;
|
|
122
|
-
module.exports = optimizeDependencies;
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the MIT license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*
|
|
7
|
-
* @format
|
|
8
|
-
* @flow strict-local
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
'use strict';
|
|
12
|
-
|
|
13
|
-
const traverse = require('@babel/traverse').default;
|
|
14
|
-
|
|
15
|
-
const babelGenerate = require('@babel/generator').default;
|
|
16
|
-
|
|
17
|
-
import type {Ast} from '@babel/core';
|
|
18
|
-
import type {TransformResultDependency} from 'metro/src/DeltaBundler';
|
|
19
|
-
|
|
20
|
-
type Context = {
|
|
21
|
-
oldToNewIndex: Map<number, number>,
|
|
22
|
-
dependencies: Array<TransformResultDependency>,
|
|
23
|
-
...
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
type Dependencies = $ReadOnlyArray<TransformResultDependency>;
|
|
27
|
-
|
|
28
|
-
function optimizeDependencies(
|
|
29
|
-
ast: Ast,
|
|
30
|
-
dependencies: Dependencies,
|
|
31
|
-
dependencyMapName: string,
|
|
32
|
-
requireNames: Set<string>,
|
|
33
|
-
): $ReadOnlyArray<TransformResultDependency> {
|
|
34
|
-
const visited = new WeakSet();
|
|
35
|
-
const context = {
|
|
36
|
-
oldToNewIndex: new Map(),
|
|
37
|
-
dependencies: [],
|
|
38
|
-
};
|
|
39
|
-
const visitor = {
|
|
40
|
-
CallExpression(path) {
|
|
41
|
-
const {node} = path;
|
|
42
|
-
|
|
43
|
-
if (visited.has(node)) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
if (isRequireCall(node.callee, requireNames)) {
|
|
47
|
-
processRequireCall(node);
|
|
48
|
-
visited.add(node);
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
MemberExpression(path, state) {
|
|
52
|
-
const {node} = path;
|
|
53
|
-
if (visited.has(node)) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
if (isDepMapAccess(node, dependencyMapName)) {
|
|
57
|
-
processDepMapAccess(context, node, dependencies);
|
|
58
|
-
visited.add(node);
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
traverse(ast, visitor);
|
|
63
|
-
return context.dependencies;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function isRequireCall(callee, requireNames: Set<string>): boolean {
|
|
67
|
-
return callee.type === 'Identifier' && requireNames.has(callee.name);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function processRequireCall(node) {
|
|
71
|
-
if (node.arguments.length != 2) {
|
|
72
|
-
throw new InvalidRequireCallError(
|
|
73
|
-
'Post-transform calls to require() expect 2 arguments, the first ' +
|
|
74
|
-
'of which has the shape `_dependencyMapName[123]`, ' +
|
|
75
|
-
`but this was found: \`${babelGenerate(node).code}\``,
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
node.arguments = [node.arguments[0]];
|
|
79
|
-
return node;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function isDepMapAccess(node, depMapName: string): boolean {
|
|
83
|
-
return (
|
|
84
|
-
node.computed &&
|
|
85
|
-
node.object.type === 'Identifier' &&
|
|
86
|
-
node.object.name === depMapName &&
|
|
87
|
-
node.property.type === 'NumericLiteral'
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function processDepMapAccess(context: Context, node, deps: Dependencies): void {
|
|
92
|
-
const index = node.property.value;
|
|
93
|
-
const newIx = translateDependencyIndex(context, deps, index);
|
|
94
|
-
if (newIx !== node.property.value) {
|
|
95
|
-
node.property.value = newIx;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function translateDependencyIndex(
|
|
100
|
-
context: Context,
|
|
101
|
-
deps: Dependencies,
|
|
102
|
-
index: number,
|
|
103
|
-
): number {
|
|
104
|
-
let newIndex = context.oldToNewIndex.get(index);
|
|
105
|
-
if (newIndex != null) {
|
|
106
|
-
return newIndex;
|
|
107
|
-
}
|
|
108
|
-
const dep = deps[index];
|
|
109
|
-
if (dep == null) {
|
|
110
|
-
throw new Error(
|
|
111
|
-
`${index} is not a known module index. Existing mappings: ${deps
|
|
112
|
-
.map((n: TransformResultDependency, i: number) => `${i} => ${n.name}`)
|
|
113
|
-
.join(', ')}`,
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
newIndex = context.dependencies.push(dep) - 1;
|
|
117
|
-
context.oldToNewIndex.set(index, newIndex);
|
|
118
|
-
return newIndex;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
class InvalidRequireCallError extends Error {
|
|
122
|
-
constructor(message: string) {
|
|
123
|
-
super(message);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
optimizeDependencies.InvalidRequireCallError = InvalidRequireCallError;
|
|
127
|
-
|
|
128
|
-
module.exports = optimizeDependencies;
|