metro 0.83.4 → 0.84.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.
Files changed (65) hide show
  1. package/package.json +17 -16
  2. package/src/Assets.js +2 -9
  3. package/src/Bundler/util.js +2 -9
  4. package/src/Bundler.js +1 -5
  5. package/src/DeltaBundler/DeltaCalculator.js +1 -5
  6. package/src/DeltaBundler/Graph.js +1 -5
  7. package/src/DeltaBundler/Serializers/baseJSBundle.js +1 -5
  8. package/src/DeltaBundler/Serializers/getAssets.js +1 -5
  9. package/src/DeltaBundler/Serializers/getRamBundleInfo.js +1 -5
  10. package/src/DeltaBundler/Serializers/helpers/js.js +2 -9
  11. package/src/DeltaBundler/Serializers/hmrJSBundle.js +2 -9
  12. package/src/DeltaBundler/Serializers/sourceMapGenerator.js +1 -5
  13. package/src/DeltaBundler/Transformer.js +1 -5
  14. package/src/DeltaBundler/Worker.flow.js +1 -5
  15. package/src/DeltaBundler/buildSubgraph.js +1 -5
  16. package/src/DeltaBundler/getTransformCacheKey.js +1 -5
  17. package/src/DeltaBundler/types.js +1 -5
  18. package/src/DeltaBundler.js +1 -5
  19. package/src/HmrServer.js +2 -9
  20. package/src/IncrementalBundler.js +2 -9
  21. package/src/ModuleGraph/worker/JsFileWrapping.js +2 -9
  22. package/src/ModuleGraph/worker/collectDependencies.js +2 -9
  23. package/src/ModuleGraph/worker/generateImportNames.js +1 -5
  24. package/src/Server/MultipartResponse.js +1 -5
  25. package/src/Server.js +37 -9
  26. package/src/Server.js.flow +48 -0
  27. package/src/cli-utils.js +1 -5
  28. package/src/commands/build.js +1 -5
  29. package/src/commands/dependencies.js +1 -5
  30. package/src/index.flow.js +2 -9
  31. package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-import.js +1 -5
  32. package/src/integration_tests/basic_bundle/build-errors/inline-requires-cannot-resolve-import.js +1 -5
  33. package/src/integration_tests/basic_bundle/import-export/index.js +2 -9
  34. package/src/integration_tests/execBundle.js +1 -5
  35. package/src/lib/BatchProcessor.js +1 -5
  36. package/src/lib/RamBundleParser.js +1 -5
  37. package/src/lib/TerminalReporter.js +2 -9
  38. package/src/lib/contextModule.js +1 -5
  39. package/src/lib/contextModuleTemplates.js +1 -4
  40. package/src/lib/createWebsocketServer.js +1 -5
  41. package/src/lib/formatBundlingError.js +1 -5
  42. package/src/lib/getAppendScripts.js +1 -5
  43. package/src/lib/getGraphId.js +1 -5
  44. package/src/lib/getPrependedScripts.js +2 -9
  45. package/src/lib/logToConsole.js +1 -5
  46. package/src/lib/parseBundleOptionsFromBundleRequestUrl.js +2 -9
  47. package/src/lib/pathUtils.js +1 -4
  48. package/src/lib/relativizeSourceMap.js +1 -5
  49. package/src/lib/reporting.js +1 -5
  50. package/src/lib/transformHelpers.js +1 -5
  51. package/src/node-haste/DependencyGraph/ModuleResolution.js +2 -9
  52. package/src/node-haste/DependencyGraph/createFileMap.js +2 -9
  53. package/src/node-haste/DependencyGraph.js +1 -5
  54. package/src/node-haste/Package.js +1 -5
  55. package/src/node-haste/PackageCache.js +1 -5
  56. package/src/node-haste/lib/AssetPaths.js +1 -5
  57. package/src/node-haste/lib/parsePlatformFilePath.js +1 -5
  58. package/src/shared/output/RamBundle/as-assets.js +1 -5
  59. package/src/shared/output/RamBundle/as-indexed-file.js +1 -5
  60. package/src/shared/output/RamBundle/util.js +1 -5
  61. package/src/shared/output/RamBundle/write-sourcemap.js +1 -5
  62. package/src/shared/output/RamBundle.js +1 -5
  63. package/src/shared/output/bundle.flow.js +1 -5
  64. package/src/shared/output/meta.js +1 -5
  65. package/src/shared/output/writeFile.js +1 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metro",
3
- "version": "0.83.4",
3
+ "version": "0.84.0",
4
4
  "description": "🚇 The JavaScript bundler for React Native.",
5
5
  "main": "src/index.js",
6
6
  "bin": "src/cli.js",
@@ -11,7 +11,8 @@
11
11
  },
12
12
  "repository": {
13
13
  "type": "git",
14
- "url": "git@github.com:facebook/metro.git"
14
+ "url": "git+https://github.com/facebook/metro.git",
15
+ "directory": "packages/metro"
15
16
  },
16
17
  "scripts": {
17
18
  "prepare-release": "test -d build && rm -rf src.real && mv src src.real && mv build src",
@@ -39,18 +40,18 @@
39
40
  "jest-worker": "^29.7.0",
40
41
  "jsc-safe-url": "^0.2.2",
41
42
  "lodash.throttle": "^4.1.1",
42
- "metro-babel-transformer": "0.83.4",
43
- "metro-cache": "0.83.4",
44
- "metro-cache-key": "0.83.4",
45
- "metro-config": "0.83.4",
46
- "metro-core": "0.83.4",
47
- "metro-file-map": "0.83.4",
48
- "metro-resolver": "0.83.4",
49
- "metro-runtime": "0.83.4",
50
- "metro-source-map": "0.83.4",
51
- "metro-symbolicate": "0.83.4",
52
- "metro-transform-plugins": "0.83.4",
53
- "metro-transform-worker": "0.83.4",
43
+ "metro-babel-transformer": "0.84.0",
44
+ "metro-cache": "0.84.0",
45
+ "metro-cache-key": "0.84.0",
46
+ "metro-config": "0.84.0",
47
+ "metro-core": "0.84.0",
48
+ "metro-file-map": "0.84.0",
49
+ "metro-resolver": "0.84.0",
50
+ "metro-runtime": "0.84.0",
51
+ "metro-source-map": "0.84.0",
52
+ "metro-symbolicate": "0.84.0",
53
+ "metro-transform-plugins": "0.84.0",
54
+ "metro-transform-worker": "0.84.0",
54
55
  "mime-types": "^3.0.1",
55
56
  "nullthrows": "^1.1.1",
56
57
  "serialize-error": "^2.1.0",
@@ -71,7 +72,7 @@
71
72
  "dedent": "^0.7.0",
72
73
  "jest-snapshot": "^29.7.0",
73
74
  "jest-snapshot-serializer-raw": "^1.2.0",
74
- "metro-babel-register": "0.83.4",
75
+ "metro-babel-register": "0.84.0",
75
76
  "metro-memory-fs": "*",
76
77
  "mock-req": "^0.2.0",
77
78
  "mock-res": "^0.6.0",
@@ -79,6 +80,6 @@
79
80
  },
80
81
  "license": "MIT",
81
82
  "engines": {
82
- "node": ">=20.19.4"
83
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
83
84
  }
84
85
  }
package/src/Assets.js CHANGED
@@ -17,11 +17,7 @@ var _fs = _interopRequireDefault(require("fs"));
17
17
  var _imageSize = _interopRequireDefault(require("image-size"));
18
18
  var _path = _interopRequireDefault(require("path"));
19
19
  function _interopRequireDefault(e) {
20
- return e && e.__esModule
21
- ? e
22
- : {
23
- default: e,
24
- };
20
+ return e && e.__esModule ? e : { default: e };
25
21
  }
26
22
  function _interopRequireWildcard(e, t) {
27
23
  if ("function" == typeof WeakMap)
@@ -31,10 +27,7 @@ function _interopRequireWildcard(e, t) {
31
27
  if (!t && e && e.__esModule) return e;
32
28
  var o,
33
29
  i,
34
- f = {
35
- __proto__: null,
36
- default: e,
37
- };
30
+ f = { __proto__: null, default: e };
38
31
  if (null === e || ("object" != typeof e && "function" != typeof e))
39
32
  return f;
40
33
  if ((o = t ? n : r)) {
@@ -9,11 +9,7 @@ var babylon = _interopRequireWildcard(require("@babel/parser"));
9
9
  var _template = _interopRequireDefault(require("@babel/template"));
10
10
  var babelTypes = _interopRequireWildcard(require("@babel/types"));
11
11
  function _interopRequireDefault(e) {
12
- return e && e.__esModule
13
- ? e
14
- : {
15
- default: e,
16
- };
12
+ return e && e.__esModule ? e : { default: e };
17
13
  }
18
14
  function _interopRequireWildcard(e, t) {
19
15
  if ("function" == typeof WeakMap)
@@ -23,10 +19,7 @@ function _interopRequireWildcard(e, t) {
23
19
  if (!t && e && e.__esModule) return e;
24
20
  var o,
25
21
  i,
26
- f = {
27
- __proto__: null,
28
- default: e,
29
- };
22
+ f = { __proto__: null, default: e };
30
23
  if (null === e || ("object" != typeof e && "function" != typeof e))
31
24
  return f;
32
25
  if ((o = t ? n : r)) {
package/src/Bundler.js CHANGED
@@ -11,11 +11,7 @@ var _DependencyGraph = _interopRequireDefault(
11
11
  require("./node-haste/DependencyGraph"),
12
12
  );
13
13
  function _interopRequireDefault(e) {
14
- return e && e.__esModule
15
- ? e
16
- : {
17
- default: e,
18
- };
14
+ return e && e.__esModule ? e : { default: e };
19
15
  }
20
16
  class Bundler {
21
17
  constructor(config, options) {
@@ -8,11 +8,7 @@ var _Graph = require("./Graph");
8
8
  var _events = _interopRequireDefault(require("events"));
9
9
  var _path = _interopRequireDefault(require("path"));
10
10
  function _interopRequireDefault(e) {
11
- return e && e.__esModule
12
- ? e
13
- : {
14
- default: e,
15
- };
11
+ return e && e.__esModule ? e : { default: e };
16
12
  }
17
13
  const debug = require("debug")("Metro:DeltaCalculator");
18
14
  class DeltaCalculator extends _events.default {
@@ -11,11 +11,7 @@ var _buildSubgraph = require("./buildSubgraph");
11
11
  var _invariant = _interopRequireDefault(require("invariant"));
12
12
  var _nullthrows = _interopRequireDefault(require("nullthrows"));
13
13
  function _interopRequireDefault(e) {
14
- return e && e.__esModule
15
- ? e
16
- : {
17
- default: e,
18
- };
14
+ return e && e.__esModule ? e : { default: e };
19
15
  }
20
16
  function getInternalOptions({ transform, resolve, onProgress, lazy, shallow }) {
21
17
  let numProcessed = 0;
@@ -11,11 +11,7 @@ var _processModules = _interopRequireDefault(
11
11
  require("./helpers/processModules"),
12
12
  );
13
13
  function _interopRequireDefault(e) {
14
- return e && e.__esModule
15
- ? e
16
- : {
17
- default: e,
18
- };
14
+ return e && e.__esModule ? e : { default: e };
19
15
  }
20
16
  function baseJSBundle(entryPoint, preModules, graph, options) {
21
17
  for (const module of graph.dependencies.values()) {
@@ -8,11 +8,7 @@ var _Assets = require("../../Assets");
8
8
  var _js = require("./helpers/js");
9
9
  var _path = _interopRequireDefault(require("path"));
10
10
  function _interopRequireDefault(e) {
11
- return e && e.__esModule
12
- ? e
13
- : {
14
- default: e,
15
- };
11
+ return e && e.__esModule ? e : { default: e };
16
12
  }
17
13
  async function getAssets(dependencies, options) {
18
14
  const promises = [];
@@ -16,11 +16,7 @@ var _sourceMapObject = require("./sourceMapObject");
16
16
  var _nullthrows = _interopRequireDefault(require("nullthrows"));
17
17
  var _path = _interopRequireDefault(require("path"));
18
18
  function _interopRequireDefault(e) {
19
- return e && e.__esModule
20
- ? e
21
- : {
22
- default: e,
23
- };
19
+ return e && e.__esModule ? e : { default: e };
24
20
  }
25
21
  async function getRamBundleInfo(entryPoint, pre, graph, options) {
26
22
  let modules = [...pre, ...graph.dependencies.values()];
@@ -21,10 +21,7 @@ function _interopRequireWildcard(e, t) {
21
21
  if (!t && e && e.__esModule) return e;
22
22
  var o,
23
23
  i,
24
- f = {
25
- __proto__: null,
26
- default: e,
27
- };
24
+ f = { __proto__: null, default: e };
28
25
  if (null === e || ("object" != typeof e && "function" != typeof e))
29
26
  return f;
30
27
  if ((o = t ? n : r)) {
@@ -44,11 +41,7 @@ function _interopRequireWildcard(e, t) {
44
41
  })(e, t);
45
42
  }
46
43
  function _interopRequireDefault(e) {
47
- return e && e.__esModule
48
- ? e
49
- : {
50
- default: e,
51
- };
44
+ return e && e.__esModule ? e : { default: e };
52
45
  }
53
46
  function wrapModule(module, options) {
54
47
  const output = getJsOutput(module);
@@ -9,11 +9,7 @@ var jscSafeUrl = _interopRequireWildcard(require("jsc-safe-url"));
9
9
  var _metroTransformPlugins = require("metro-transform-plugins");
10
10
  var _path = _interopRequireDefault(require("path"));
11
11
  function _interopRequireDefault(e) {
12
- return e && e.__esModule
13
- ? e
14
- : {
15
- default: e,
16
- };
12
+ return e && e.__esModule ? e : { default: e };
17
13
  }
18
14
  function _interopRequireWildcard(e, t) {
19
15
  if ("function" == typeof WeakMap)
@@ -23,10 +19,7 @@ function _interopRequireWildcard(e, t) {
23
19
  if (!t && e && e.__esModule) return e;
24
20
  var o,
25
21
  i,
26
- f = {
27
- __proto__: null,
28
- default: e,
29
- };
22
+ f = { __proto__: null, default: e };
30
23
  if (null === e || ("object" != typeof e && "function" != typeof e))
31
24
  return f;
32
25
  if ((o = t ? n : r)) {
@@ -11,11 +11,7 @@ var _getSourceMapInfo = _interopRequireDefault(
11
11
  var _js = require("./helpers/js");
12
12
  var _metroSourceMap = require("metro-source-map");
13
13
  function _interopRequireDefault(e) {
14
- return e && e.__esModule
15
- ? e
16
- : {
17
- default: e,
18
- };
14
+ return e && e.__esModule ? e : { default: e };
19
15
  }
20
16
  function getSourceMapInfosImpl(isBlocking, onDone, modules, options) {
21
17
  const sourceMapInfos = [];
@@ -15,11 +15,7 @@ var _fs = _interopRequireDefault(require("fs"));
15
15
  var _metroCache = require("metro-cache");
16
16
  var _path = _interopRequireDefault(require("path"));
17
17
  function _interopRequireDefault(e) {
18
- return e && e.__esModule
19
- ? e
20
- : {
21
- default: e,
22
- };
18
+ return e && e.__esModule ? e : { default: e };
23
19
  }
24
20
  const debug = require("debug")("Metro:Transformer");
25
21
  class Transformer {
@@ -9,11 +9,7 @@ var _crypto = _interopRequireDefault(require("crypto"));
9
9
  var _fs = _interopRequireDefault(require("fs"));
10
10
  var _path = _interopRequireDefault(require("path"));
11
11
  function _interopRequireDefault(e) {
12
- return e && e.__esModule
13
- ? e
14
- : {
15
- default: e,
16
- };
12
+ return e && e.__esModule ? e : { default: e };
17
13
  }
18
14
  function asDeserializedBuffer(value) {
19
15
  if (Buffer.isBuffer(value)) {
@@ -8,11 +8,7 @@ var _contextModule = require("../lib/contextModule");
8
8
  var _isResolvedDependency = require("../lib/isResolvedDependency");
9
9
  var _path = _interopRequireDefault(require("path"));
10
10
  function _interopRequireDefault(e) {
11
- return e && e.__esModule
12
- ? e
13
- : {
14
- default: e,
15
- };
11
+ return e && e.__esModule ? e : { default: e };
16
12
  }
17
13
  function resolveDependencies(parentPath, dependencies, resolve) {
18
14
  const maybeResolvedDeps = new Map();
@@ -7,11 +7,7 @@ exports.default = getTransformCacheKey;
7
7
  var _crypto = _interopRequireDefault(require("crypto"));
8
8
  var _metroCacheKey = require("metro-cache-key");
9
9
  function _interopRequireDefault(e) {
10
- return e && e.__esModule
11
- ? e
12
- : {
13
- default: e,
14
- };
10
+ return e && e.__esModule ? e : { default: e };
15
11
  }
16
12
  const VERSION = require("../../package.json").version;
17
13
  function getTransformCacheKey(opts) {
@@ -2,9 +2,5 @@
2
2
 
3
3
  var _CountingSet = _interopRequireDefault(require("../lib/CountingSet"));
4
4
  function _interopRequireDefault(e) {
5
- return e && e.__esModule
6
- ? e
7
- : {
8
- default: e,
9
- };
5
+ return e && e.__esModule ? e : { default: e };
10
6
  }
@@ -8,11 +8,7 @@ var _DeltaCalculator = _interopRequireDefault(
8
8
  require("./DeltaBundler/DeltaCalculator"),
9
9
  );
10
10
  function _interopRequireDefault(e) {
11
- return e && e.__esModule
12
- ? e
13
- : {
14
- default: e,
15
- };
11
+ return e && e.__esModule ? e : { default: e };
16
12
  }
17
13
  class DeltaBundler {
18
14
  _deltaCalculators = new Map();
package/src/HmrServer.js CHANGED
@@ -39,10 +39,7 @@ function _interopRequireWildcard(e, t) {
39
39
  if (!t && e && e.__esModule) return e;
40
40
  var o,
41
41
  i,
42
- f = {
43
- __proto__: null,
44
- default: e,
45
- };
42
+ f = { __proto__: null, default: e };
46
43
  if (null === e || ("object" != typeof e && "function" != typeof e))
47
44
  return f;
48
45
  if ((o = t ? n : r)) {
@@ -62,11 +59,7 @@ function _interopRequireWildcard(e, t) {
62
59
  })(e, t);
63
60
  }
64
61
  function _interopRequireDefault(e) {
65
- return e && e.__esModule
66
- ? e
67
- : {
68
- default: e,
69
- };
62
+ return e && e.__esModule ? e : { default: e };
70
63
  }
71
64
  const debug = require("debug")("Metro:HMR");
72
65
  const { createActionStartEntry, createActionEndEntry, log } = _metroCore.Logger;
@@ -27,10 +27,7 @@ function _interopRequireWildcard(e, t) {
27
27
  if (!t && e && e.__esModule) return e;
28
28
  var o,
29
29
  i,
30
- f = {
31
- __proto__: null,
32
- default: e,
33
- };
30
+ f = { __proto__: null, default: e };
34
31
  if (null === e || ("object" != typeof e && "function" != typeof e))
35
32
  return f;
36
33
  if ((o = t ? n : r)) {
@@ -50,11 +47,7 @@ function _interopRequireWildcard(e, t) {
50
47
  })(e, t);
51
48
  }
52
49
  function _interopRequireDefault(e) {
53
- return e && e.__esModule
54
- ? e
55
- : {
56
- default: e,
57
- };
50
+ return e && e.__esModule ? e : { default: e };
58
51
  }
59
52
  function createRevisionId() {
60
53
  return _crypto.default.randomBytes(8).toString("hex");
@@ -20,10 +20,7 @@ function _interopRequireWildcard(e, t) {
20
20
  if (!t && e && e.__esModule) return e;
21
21
  var o,
22
22
  i,
23
- f = {
24
- __proto__: null,
25
- default: e,
26
- };
23
+ f = { __proto__: null, default: e };
27
24
  if (null === e || ("object" != typeof e && "function" != typeof e))
28
25
  return f;
29
26
  if ((o = t ? n : r)) {
@@ -43,11 +40,7 @@ function _interopRequireWildcard(e, t) {
43
40
  })(e, t);
44
41
  }
45
42
  function _interopRequireDefault(e) {
46
- return e && e.__esModule
47
- ? e
48
- : {
49
- default: e,
50
- };
43
+ return e && e.__esModule ? e : { default: e };
51
44
  }
52
45
  const WRAP_NAME = (exports.WRAP_NAME = "$$_REQUIRE");
53
46
  const IIFE_PARAM = _template.default.expression(
@@ -20,10 +20,7 @@ function _interopRequireWildcard(e, t) {
20
20
  if (!t && e && e.__esModule) return e;
21
21
  var o,
22
22
  i,
23
- f = {
24
- __proto__: null,
25
- default: e,
26
- };
23
+ f = { __proto__: null, default: e };
27
24
  if (null === e || ("object" != typeof e && "function" != typeof e))
28
25
  return f;
29
26
  if ((o = t ? n : r)) {
@@ -43,11 +40,7 @@ function _interopRequireWildcard(e, t) {
43
40
  })(e, t);
44
41
  }
45
42
  function _interopRequireDefault(e) {
46
- return e && e.__esModule
47
- ? e
48
- : {
49
- default: e,
50
- };
43
+ return e && e.__esModule ? e : { default: e };
51
44
  }
52
45
  function collectDependencies(ast, options) {
53
46
  const visited = new WeakSet();
@@ -7,11 +7,7 @@ exports.default = generateImportNames;
7
7
  var _traverse = _interopRequireDefault(require("@babel/traverse"));
8
8
  var _nullthrows = _interopRequireDefault(require("nullthrows"));
9
9
  function _interopRequireDefault(e) {
10
- return e && e.__esModule
11
- ? e
12
- : {
13
- default: e,
14
- };
10
+ return e && e.__esModule ? e : { default: e };
15
11
  }
16
12
  function generateImportNames(ast) {
17
13
  let importDefault;
@@ -6,11 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _accepts = _interopRequireDefault(require("accepts"));
8
8
  function _interopRequireDefault(e) {
9
- return e && e.__esModule
10
- ? e
11
- : {
12
- default: e,
13
- };
9
+ return e && e.__esModule ? e : { default: e };
14
10
  }
15
11
  const CRLF = "\r\n";
16
12
  const BOUNDARY = "3beqjf3apnqeu3h5jqorms4i";
package/src/Server.js CHANGED
@@ -66,10 +66,7 @@ function _interopRequireWildcard(e, t) {
66
66
  if (!t && e && e.__esModule) return e;
67
67
  var o,
68
68
  i,
69
- f = {
70
- __proto__: null,
71
- default: e,
72
- };
69
+ f = { __proto__: null, default: e };
73
70
  if (null === e || ("object" != typeof e && "function" != typeof e))
74
71
  return f;
75
72
  if ((o = t ? n : r)) {
@@ -89,11 +86,7 @@ function _interopRequireWildcard(e, t) {
89
86
  })(e, t);
90
87
  }
91
88
  function _interopRequireDefault(e) {
92
- return e && e.__esModule
93
- ? e
94
- : {
95
- default: e,
96
- };
89
+ return e && e.__esModule ? e : { default: e };
97
90
  }
98
91
  const debug = require("debug")("Metro:Server");
99
92
  const { createActionStartEntry, createActionEndEntry, log } = _metroCore.Logger;
@@ -136,6 +129,8 @@ class Server {
136
129
  ]),
137
130
  ];
138
131
  this._isEnded = false;
132
+ this._fetchTimings = [];
133
+ this._activeFetchCount = 0;
139
134
  this._createModuleId = config.serializer.createModuleIdFactory();
140
135
  this._bundler = new _IncrementalBundler.default(config, {
141
136
  hasReducedPerformance: options && options.hasReducedPerformance,
@@ -748,8 +743,16 @@ class Server {
748
743
  const logEntry = log(
749
744
  createActionStartEntry(createStartEntry(startContext)),
750
745
  );
746
+ const fetchTiming = {
747
+ graphId,
748
+ startTime: requestStartTimestamp,
749
+ endTime: null,
750
+ isPrefetch: req.method === "HEAD",
751
+ };
751
752
  let result;
752
753
  try {
754
+ this._fetchTimings.push(fetchTiming);
755
+ this._activeFetchCount++;
753
756
  result = await build(startContext);
754
757
  } catch (error) {
755
758
  const formattedError = (0, _formatBundlingError.default)(error);
@@ -779,6 +782,31 @@ class Server {
779
782
  debug("Bundling error", error);
780
783
  buildContext.bundlePerfLogger.end("FAIL");
781
784
  return;
785
+ } finally {
786
+ fetchTiming.endTime =
787
+ _perf_hooks.performance.timeOrigin + _perf_hooks.performance.now();
788
+ if (!fetchTiming.isPrefetch) {
789
+ buildContext.bundlePerfLogger.annotate({
790
+ bool: {
791
+ had_competing_prefetch: this._fetchTimings
792
+ .filter((t) => t.isPrefetch && t.graphId !== graphId)
793
+ .some((prefetch) => {
794
+ const prefetchEndTime =
795
+ prefetch.endTime ?? Number.MAX_SAFE_INTEGER;
796
+ const fetchEndTime =
797
+ fetchTiming.endTime ?? Number.MAX_SAFE_INTEGER;
798
+ return (
799
+ prefetch.startTime < fetchEndTime &&
800
+ prefetchEndTime > fetchTiming.startTime
801
+ );
802
+ }),
803
+ },
804
+ });
805
+ }
806
+ this._activeFetchCount--;
807
+ if (this._activeFetchCount === 0) {
808
+ this._fetchTimings = [];
809
+ }
782
810
  }
783
811
  const endContext = {
784
812
  ...startContext,
@@ -130,6 +130,13 @@ export type ServerOptions = Readonly<{
130
130
  const DELTA_ID_HEADER = 'X-Metro-Delta-ID';
131
131
  const FILES_CHANGED_COUNT_HEADER = 'X-Metro-Files-Changed-Count';
132
132
 
133
+ type FetchTiming = {
134
+ graphId: GraphId,
135
+ startTime: number,
136
+ endTime: number | null,
137
+ isPrefetch: boolean,
138
+ };
139
+
133
140
  export default class Server {
134
141
  _bundler: IncrementalBundler;
135
142
  _config: ConfigT;
@@ -144,6 +151,8 @@ export default class Server {
144
151
  _sourceRequestRoutingMap: ReadonlyArray<
145
152
  [pathnamePrefix: string, normalizedRootDir: string],
146
153
  >;
154
+ _fetchTimings: Array<FetchTiming>;
155
+ _activeFetchCount: number;
147
156
 
148
157
  constructor(config: ConfigT, options?: ServerOptions) {
149
158
  this._config = config;
@@ -176,6 +185,8 @@ export default class Server {
176
185
  ]),
177
186
  ];
178
187
  this._isEnded = false;
188
+ this._fetchTimings = [];
189
+ this._activeFetchCount = 0;
179
190
 
180
191
  // TODO(T34760917): These two properties should eventually be instantiated
181
192
  // elsewhere and passed as parameters, since they are also needed by
@@ -926,8 +937,18 @@ export default class Server {
926
937
  createActionStartEntry(createStartEntry(startContext)),
927
938
  );
928
939
 
940
+ const fetchTiming: FetchTiming = {
941
+ graphId,
942
+ startTime: requestStartTimestamp,
943
+ endTime: null,
944
+ isPrefetch: req.method === 'HEAD',
945
+ };
946
+
929
947
  let result;
930
948
  try {
949
+ this._fetchTimings.push(fetchTiming);
950
+ this._activeFetchCount++;
951
+
931
952
  result = await build(startContext);
932
953
  } catch (error) {
933
954
  const formattedError = formatBundlingError(error);
@@ -960,6 +981,33 @@ export default class Server {
960
981
  buildContext.bundlePerfLogger.end('FAIL');
961
982
 
962
983
  return;
984
+ } finally {
985
+ fetchTiming.endTime = performance.timeOrigin + performance.now();
986
+
987
+ if (!fetchTiming.isPrefetch) {
988
+ buildContext.bundlePerfLogger.annotate({
989
+ bool: {
990
+ had_competing_prefetch: this._fetchTimings
991
+ // fetching the same bundle as a prefetch don't compete, since they resolve a shared promise for the same graph id
992
+ .filter(t => t.isPrefetch && t.graphId !== graphId)
993
+ .some(prefetch => {
994
+ const prefetchEndTime =
995
+ prefetch.endTime ?? Number.MAX_SAFE_INTEGER;
996
+ const fetchEndTime =
997
+ fetchTiming.endTime ?? Number.MAX_SAFE_INTEGER;
998
+ return (
999
+ prefetch.startTime < fetchEndTime &&
1000
+ prefetchEndTime > fetchTiming.startTime
1001
+ );
1002
+ }),
1003
+ },
1004
+ });
1005
+ }
1006
+
1007
+ this._activeFetchCount--;
1008
+ if (this._activeFetchCount === 0) {
1009
+ this._fetchTimings = [];
1010
+ }
963
1011
  }
964
1012
 
965
1013
  const endContext: ProcessEndContext<T> = {
package/src/cli-utils.js CHANGED
@@ -6,11 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.watchFile = exports.makeAsyncCommand = void 0;
7
7
  var _fs = _interopRequireDefault(require("fs"));
8
8
  function _interopRequireDefault(e) {
9
- return e && e.__esModule
10
- ? e
11
- : {
12
- default: e,
13
- };
9
+ return e && e.__esModule ? e : { default: e };
14
10
  }
15
11
  const watchFile = async function (filename, callback) {
16
12
  _fs.default.watchFile(filename, () => {
@@ -14,11 +14,7 @@ var _TerminalReporter = _interopRequireDefault(
14
14
  var _metroConfig = require("metro-config");
15
15
  var _metroCore = require("metro-core");
16
16
  function _interopRequireDefault(e) {
17
- return e && e.__esModule
18
- ? e
19
- : {
20
- default: e,
21
- };
17
+ return e && e.__esModule ? e : { default: e };
22
18
  }
23
19
  const term = new _metroCore.Terminal(process.stdout);
24
20
  const updateReporter = new _TerminalReporter.default(term);