metro 0.83.3 → 0.83.5

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 (229) hide show
  1. package/package.json +28 -24
  2. package/src/Assets.d.ts +83 -0
  3. package/src/Assets.js +42 -29
  4. package/src/Assets.js.flow +26 -15
  5. package/src/Bundler/util.d.ts +27 -0
  6. package/src/Bundler/util.js +25 -21
  7. package/src/Bundler/util.js.flow +2 -2
  8. package/src/Bundler.d.ts +14 -15
  9. package/src/Bundler.js.flow +1 -1
  10. package/src/DeltaBundler/DeltaCalculator.d.ts +71 -0
  11. package/src/DeltaBundler/DeltaCalculator.js +4 -4
  12. package/src/DeltaBundler/DeltaCalculator.js.flow +8 -8
  13. package/src/DeltaBundler/Graph.d.ts +135 -8
  14. package/src/DeltaBundler/Graph.js +16 -16
  15. package/src/DeltaBundler/Graph.js.flow +30 -30
  16. package/src/DeltaBundler/Serializers/baseJSBundle.d.ts +20 -0
  17. package/src/DeltaBundler/Serializers/baseJSBundle.js.flow +1 -1
  18. package/src/DeltaBundler/Serializers/getAllFiles.d.ts +22 -0
  19. package/src/DeltaBundler/Serializers/getAllFiles.js.flow +2 -2
  20. package/src/DeltaBundler/Serializers/getAssets.d.ts +25 -0
  21. package/src/DeltaBundler/Serializers/getAssets.js.flow +2 -2
  22. package/src/DeltaBundler/Serializers/getExplodedSourceMap.js.flow +2 -2
  23. package/src/DeltaBundler/Serializers/getRamBundleInfo.d.ts +36 -6
  24. package/src/DeltaBundler/Serializers/getRamBundleInfo.js.flow +8 -8
  25. package/src/DeltaBundler/Serializers/helpers/getInlineSourceMappingURL.d.ts +12 -0
  26. package/src/DeltaBundler/Serializers/helpers/getSourceMapInfo.d.ts +33 -0
  27. package/src/DeltaBundler/Serializers/helpers/getTransitiveDependencies.d.ts +17 -0
  28. package/src/DeltaBundler/Serializers/helpers/js.d.ts +30 -0
  29. package/src/DeltaBundler/Serializers/helpers/js.js +25 -21
  30. package/src/DeltaBundler/Serializers/helpers/js.js.flow +6 -6
  31. package/src/DeltaBundler/Serializers/helpers/processModules.d.ts +25 -0
  32. package/src/DeltaBundler/Serializers/helpers/processModules.js.flow +3 -3
  33. package/src/DeltaBundler/Serializers/hmrJSBundle.d.ts +30 -0
  34. package/src/DeltaBundler/Serializers/hmrJSBundle.js +25 -21
  35. package/src/DeltaBundler/Serializers/hmrJSBundle.js.flow +5 -5
  36. package/src/DeltaBundler/Serializers/sourceMapGenerator.d.ts +29 -0
  37. package/src/DeltaBundler/Serializers/sourceMapGenerator.js.flow +6 -6
  38. package/src/DeltaBundler/Serializers/sourceMapObject.d.ts +23 -0
  39. package/src/DeltaBundler/Serializers/sourceMapObject.js.flow +2 -2
  40. package/src/DeltaBundler/Serializers/sourceMapString.d.ts +22 -0
  41. package/src/DeltaBundler/Serializers/sourceMapString.js.flow +2 -2
  42. package/src/DeltaBundler/Transformer.d.ts +38 -0
  43. package/src/DeltaBundler/Transformer.js.flow +3 -3
  44. package/src/DeltaBundler/Worker.d.ts +19 -27
  45. package/src/DeltaBundler/Worker.flow.js.flow +1 -1
  46. package/src/DeltaBundler/WorkerFarm.d.ts +70 -0
  47. package/src/DeltaBundler/WorkerFarm.js +1 -1
  48. package/src/DeltaBundler/WorkerFarm.js.flow +26 -13
  49. package/src/DeltaBundler/buildSubgraph.d.ts +30 -0
  50. package/src/DeltaBundler/buildSubgraph.js +4 -4
  51. package/src/DeltaBundler/buildSubgraph.js.flow +8 -8
  52. package/src/DeltaBundler/getTransformCacheKey.d.ts +18 -0
  53. package/src/DeltaBundler/mergeDeltas.d.ts +17 -0
  54. package/src/DeltaBundler/types.d.ts +97 -100
  55. package/src/DeltaBundler/types.js.flow +36 -34
  56. package/src/DeltaBundler.d.ts +14 -12
  57. package/src/DeltaBundler.js.flow +2 -2
  58. package/src/HmrServer.d.ts +79 -0
  59. package/src/HmrServer.js +34 -29
  60. package/src/HmrServer.js.flow +17 -12
  61. package/src/IncrementalBundler/GraphNotFoundError.d.ts +17 -0
  62. package/src/IncrementalBundler/ResourceNotFoundError.d.ts +15 -0
  63. package/src/IncrementalBundler/RevisionNotFoundError.d.ts +17 -0
  64. package/src/IncrementalBundler.d.ts +43 -45
  65. package/src/IncrementalBundler.js +29 -21
  66. package/src/IncrementalBundler.js.flow +13 -9
  67. package/src/ModuleGraph/worker/JsFileWrapping.d.ts +29 -0
  68. package/src/ModuleGraph/worker/JsFileWrapping.js +25 -21
  69. package/src/ModuleGraph/worker/JsFileWrapping.js.flow +10 -5
  70. package/src/ModuleGraph/worker/collectDependencies.d.ts +118 -14
  71. package/src/ModuleGraph/worker/collectDependencies.js +25 -21
  72. package/src/ModuleGraph/worker/collectDependencies.js.flow +27 -21
  73. package/src/ModuleGraph/worker/generateImportNames.d.ts +19 -0
  74. package/src/ModuleGraph/worker/generateImportNames.js.flow +4 -2
  75. package/src/ModuleGraph/worker/importLocationsPlugin.d.ts +26 -0
  76. package/src/ModuleGraph/worker/importLocationsPlugin.js.flow +7 -3
  77. package/src/Server/MultipartResponse.d.ts +5 -6
  78. package/src/Server/MultipartResponse.js.flow +1 -1
  79. package/src/Server/symbolicate.js.flow +4 -4
  80. package/src/Server.d.ts +220 -67
  81. package/src/Server.js +149 -45
  82. package/src/Server.js.flow +167 -57
  83. package/src/cli/parseKeyValueParamArray.d.ts +14 -0
  84. package/src/cli/parseKeyValueParamArray.js.flow +1 -1
  85. package/src/cli-utils.d.ts +19 -0
  86. package/src/cli-utils.js.flow +2 -2
  87. package/src/commands/build.d.ts +16 -0
  88. package/src/commands/build.js.flow +11 -10
  89. package/src/commands/dependencies.d.ts +16 -0
  90. package/src/commands/dependencies.js.flow +8 -4
  91. package/src/commands/serve.d.ts +16 -0
  92. package/src/commands/serve.js +2 -0
  93. package/src/commands/serve.js.flow +14 -9
  94. package/src/index.d.ts +97 -110
  95. package/src/index.flow.js +53 -35
  96. package/src/index.flow.js.flow +49 -29
  97. package/src/integration_tests/basic_bundle/AssetRegistry.js.flow +1 -1
  98. package/src/integration_tests/basic_bundle/ErrorBundle.js.flow +1 -1
  99. package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-import.js.flow +1 -1
  100. package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-multi-line-import-with-escapes.js.flow +1 -1
  101. package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-multi-line-import.js.flow +1 -1
  102. package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-require-with-embedded-comment.js.flow +1 -1
  103. package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-require.js.flow +1 -1
  104. package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-specifier-with-escapes.js.flow +1 -1
  105. package/src/integration_tests/basic_bundle/build-errors/inline-requires-cannot-resolve-import.js.flow +1 -1
  106. package/src/integration_tests/basic_bundle/build-errors/inline-requires-cannot-resolve-require.js.flow +1 -1
  107. package/src/integration_tests/basic_bundle/import-export/index.js +25 -21
  108. package/src/integration_tests/basic_bundle/import-export/index.js.flow +3 -3
  109. package/src/integration_tests/basic_bundle/import-export/utils.js.flow +2 -2
  110. package/src/integration_tests/basic_bundle/loadBundleAsyncForTest.js.flow +1 -1
  111. package/src/integration_tests/basic_bundle/optional-dependencies/index.js.flow +1 -1
  112. package/src/integration_tests/basic_bundle/require-context/conflict.js.flow +1 -1
  113. package/src/integration_tests/basic_bundle/require-context/empty.js.flow +1 -1
  114. package/src/integration_tests/basic_bundle/require-context/matching.js.flow +1 -1
  115. package/src/integration_tests/basic_bundle/require-context/mode-eager.js.flow +1 -1
  116. package/src/integration_tests/basic_bundle/require-context/mode-lazy-once.js.flow +1 -1
  117. package/src/integration_tests/basic_bundle/require-context/mode-lazy.js.flow +1 -1
  118. package/src/integration_tests/basic_bundle/require-context/mode-sync.js.flow +2 -2
  119. package/src/integration_tests/basic_bundle/require-context/utils.js.flow +1 -1
  120. package/src/integration_tests/basic_bundle/require-resolveWeak/import-and-resolveWeak.js.flow +1 -1
  121. package/src/integration_tests/basic_bundle/require-resolveWeak/multiple.js.flow +1 -1
  122. package/src/integration_tests/basic_bundle/require-resolveWeak/never-required.js.flow +1 -1
  123. package/src/integration_tests/basic_bundle/require-resolveWeak/require-and-resolveWeak.js.flow +1 -1
  124. package/src/integration_tests/execBundle.js.flow +1 -1
  125. package/src/lib/BatchProcessor.d.ts +54 -0
  126. package/src/lib/BatchProcessor.js +5 -2
  127. package/src/lib/BatchProcessor.js.flow +10 -7
  128. package/src/lib/CountingSet.d.ts +10 -10
  129. package/src/lib/CountingSet.js.flow +4 -4
  130. package/src/lib/JsonReporter.d.ts +37 -0
  131. package/src/lib/JsonReporter.js +5 -3
  132. package/src/lib/JsonReporter.js.flow +19 -17
  133. package/src/lib/RamBundleParser.d.ts +29 -0
  134. package/src/lib/RamBundleParser.js.flow +1 -1
  135. package/src/lib/TerminalReporter.d.ts +97 -6
  136. package/src/lib/TerminalReporter.js +37 -34
  137. package/src/lib/TerminalReporter.js.flow +21 -30
  138. package/src/lib/bundleProgressUtils.d.ts +26 -0
  139. package/src/lib/bundleProgressUtils.js +19 -0
  140. package/src/lib/bundleProgressUtils.js.flow +35 -0
  141. package/src/lib/bundleToString.d.ts +19 -0
  142. package/src/lib/contextModule.d.ts +20 -9
  143. package/src/lib/contextModule.js.flow +1 -1
  144. package/src/lib/contextModuleTemplates.d.ts +25 -0
  145. package/src/lib/contextModuleTemplates.js +25 -21
  146. package/src/lib/countLines.d.ts +12 -0
  147. package/src/lib/countLines.js +4 -3
  148. package/src/lib/countLines.js.flow +3 -4
  149. package/src/lib/createWebsocketServer.d.ts +43 -0
  150. package/src/lib/createWebsocketServer.js +9 -2
  151. package/src/lib/createWebsocketServer.js.flow +16 -9
  152. package/src/lib/debounceAsyncQueue.d.ts +15 -0
  153. package/src/lib/debounceAsyncQueue.js.flow +1 -1
  154. package/src/lib/formatBundlingError.d.ts +23 -0
  155. package/src/lib/formatBundlingError.js.flow +1 -1
  156. package/src/lib/getAppendScripts.d.ts +31 -0
  157. package/src/lib/getAppendScripts.js.flow +4 -4
  158. package/src/lib/getGraphId.d.ts +15 -1
  159. package/src/lib/getGraphId.js.flow +1 -1
  160. package/src/lib/getPreludeCode.d.ts +18 -0
  161. package/src/lib/getPreludeCode.js +4 -0
  162. package/src/lib/getPreludeCode.js.flow +10 -3
  163. package/src/lib/getPrependedScripts.d.ts +24 -0
  164. package/src/lib/getPrependedScripts.js +36 -22
  165. package/src/lib/getPrependedScripts.js.flow +10 -3
  166. package/src/lib/isResolvedDependency.d.ts +15 -0
  167. package/src/lib/logToConsole.d.ts +19 -0
  168. package/src/lib/logToConsole.js.flow +2 -2
  169. package/src/lib/parseBundleOptionsFromBundleRequestUrl.d.ts +17 -0
  170. package/src/lib/parseBundleOptionsFromBundleRequestUrl.js +25 -21
  171. package/src/lib/parseCustomResolverOptions.d.ts +16 -0
  172. package/src/lib/parseCustomResolverOptions.js.flow +2 -2
  173. package/src/lib/parseCustomTransformOptions.d.ts +16 -0
  174. package/src/lib/parseCustomTransformOptions.js.flow +1 -1
  175. package/src/lib/parseJsonBody.d.ts +27 -0
  176. package/src/lib/parseJsonBody.js.flow +11 -1
  177. package/src/lib/pathUtils.d.ts +14 -0
  178. package/src/lib/pathUtils.js +25 -21
  179. package/src/lib/pathUtils.js.flow +1 -1
  180. package/src/lib/relativizeSourceMap.d.ts +17 -0
  181. package/src/lib/reporting.d.ts +65 -81
  182. package/src/lib/reporting.js.flow +4 -4
  183. package/src/lib/splitBundleOptions.d.ts +16 -0
  184. package/src/lib/transformHelpers.d.ts +35 -0
  185. package/src/lib/transformHelpers.js +11 -9
  186. package/src/lib/transformHelpers.js.flow +17 -15
  187. package/src/node-haste/DependencyGraph/ModuleResolution.d.ts +126 -0
  188. package/src/node-haste/DependencyGraph/ModuleResolution.js +48 -42
  189. package/src/node-haste/DependencyGraph/ModuleResolution.js.flow +35 -32
  190. package/src/node-haste/DependencyGraph/createFileMap.d.ts +29 -0
  191. package/src/node-haste/DependencyGraph/createFileMap.js +56 -38
  192. package/src/node-haste/DependencyGraph/createFileMap.js.flow +44 -18
  193. package/src/node-haste/DependencyGraph.d.ts +57 -33
  194. package/src/node-haste/DependencyGraph.js +40 -31
  195. package/src/node-haste/DependencyGraph.js.flow +35 -37
  196. package/src/node-haste/Package.d.ts +21 -0
  197. package/src/node-haste/PackageCache.d.ts +34 -0
  198. package/src/node-haste/lib/AssetPaths.d.ts +29 -0
  199. package/src/node-haste/lib/AssetPaths.js +2 -2
  200. package/src/node-haste/lib/AssetPaths.js.flow +4 -4
  201. package/src/node-haste/lib/parsePlatformFilePath.d.ts +25 -0
  202. package/src/node-haste/lib/parsePlatformFilePath.js +6 -6
  203. package/src/node-haste/lib/parsePlatformFilePath.js.flow +4 -4
  204. package/src/shared/output/RamBundle/as-assets.d.ts +25 -0
  205. package/src/shared/output/RamBundle/as-assets.js.flow +6 -6
  206. package/src/shared/output/RamBundle/as-indexed-file.d.ts +38 -0
  207. package/src/shared/output/RamBundle/as-indexed-file.js.flow +5 -5
  208. package/src/shared/output/RamBundle/buildSourcemapWithMetadata.d.ts +23 -0
  209. package/src/shared/output/RamBundle/buildSourcemapWithMetadata.js.flow +5 -5
  210. package/src/shared/output/RamBundle/magic-number.d.ts +14 -0
  211. package/src/shared/output/RamBundle/util.d.ts +41 -0
  212. package/src/shared/output/RamBundle/util.js.flow +5 -5
  213. package/src/shared/output/RamBundle/write-sourcemap.d.ts +16 -0
  214. package/src/shared/output/RamBundle/write-sourcemap.js.flow +1 -1
  215. package/src/shared/output/RamBundle.d.ts +26 -0
  216. package/src/shared/output/RamBundle.js.flow +1 -1
  217. package/src/shared/output/bundle.d.ts +9 -17
  218. package/src/shared/output/bundle.flow.js.flow +3 -3
  219. package/src/shared/output/meta.d.ts +15 -0
  220. package/src/shared/output/meta.js +2 -2
  221. package/src/shared/output/meta.js.flow +1 -1
  222. package/src/shared/output/unbundle.d.ts +11 -0
  223. package/src/shared/output/writeFile.d.ts +16 -0
  224. package/src/shared/output/writeFile.js +8 -3
  225. package/src/shared/output/writeFile.js.flow +8 -2
  226. package/src/shared/types.d.ts +81 -66
  227. package/src/shared/types.js.flow +20 -5
  228. package/src/Asset.d.ts +0 -25
  229. package/src/ModuleGraph/test-helpers.js +0 -75
package/src/Server.js CHANGED
@@ -25,6 +25,7 @@ var _IncrementalBundler = _interopRequireDefault(
25
25
  var _ResourceNotFoundError = _interopRequireDefault(
26
26
  require("./IncrementalBundler/ResourceNotFoundError"),
27
27
  );
28
+ var _bundleProgressUtils = require("./lib/bundleProgressUtils");
28
29
  var _bundleToString = _interopRequireDefault(require("./lib/bundleToString"));
29
30
  var _formatBundlingError = _interopRequireDefault(
30
31
  require("./lib/formatBundlingError"),
@@ -51,7 +52,6 @@ var _symbolicate = _interopRequireDefault(require("./Server/symbolicate"));
51
52
  var _types = require("./shared/types");
52
53
  var _codeFrame = require("@babel/code-frame");
53
54
  var fs = _interopRequireWildcard(require("graceful-fs"));
54
- var _invariant = _interopRequireDefault(require("invariant"));
55
55
  var jscSafeUrl = _interopRequireWildcard(require("jsc-safe-url"));
56
56
  var _metroCore = require("metro-core");
57
57
  var _mimeTypes = _interopRequireDefault(require("mime-types"));
@@ -59,28 +59,32 @@ var _nullthrows = _interopRequireDefault(require("nullthrows"));
59
59
  var _path = _interopRequireDefault(require("path"));
60
60
  var _perf_hooks = require("perf_hooks");
61
61
  var _querystring = _interopRequireDefault(require("querystring"));
62
- function _getRequireWildcardCache(e) {
63
- if ("function" != typeof WeakMap) return null;
64
- var r = new WeakMap(),
65
- t = new WeakMap();
66
- return (_getRequireWildcardCache = function (e) {
67
- return e ? t : r;
68
- })(e);
69
- }
70
- function _interopRequireWildcard(e, r) {
71
- if (!r && e && e.__esModule) return e;
72
- if (null === e || ("object" != typeof e && "function" != typeof e))
73
- return { default: e };
74
- var t = _getRequireWildcardCache(r);
75
- if (t && t.has(e)) return t.get(e);
76
- var n = { __proto__: null },
77
- a = Object.defineProperty && Object.getOwnPropertyDescriptor;
78
- for (var u in e)
79
- if ("default" !== u && {}.hasOwnProperty.call(e, u)) {
80
- var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
81
- i && (i.get || i.set) ? Object.defineProperty(n, u, i) : (n[u] = e[u]);
62
+ function _interopRequireWildcard(e, t) {
63
+ if ("function" == typeof WeakMap)
64
+ var r = new WeakMap(),
65
+ n = new WeakMap();
66
+ return (_interopRequireWildcard = function (e, t) {
67
+ if (!t && e && e.__esModule) return e;
68
+ var o,
69
+ i,
70
+ f = { __proto__: null, default: e };
71
+ if (null === e || ("object" != typeof e && "function" != typeof e))
72
+ return f;
73
+ if ((o = t ? n : r)) {
74
+ if (o.has(e)) return o.get(e);
75
+ o.set(e, f);
82
76
  }
83
- return ((n.default = e), t && t.set(e, n), n);
77
+ for (const t in e)
78
+ "default" !== t &&
79
+ {}.hasOwnProperty.call(e, t) &&
80
+ ((i =
81
+ (o = Object.defineProperty) &&
82
+ Object.getOwnPropertyDescriptor(e, t)) &&
83
+ (i.get || i.set)
84
+ ? o(f, t, i)
85
+ : (f[t] = e[t]));
86
+ return f;
87
+ })(e, t);
84
88
  }
85
89
  function _interopRequireDefault(e) {
86
90
  return e && e.__esModule ? e : { default: e };
@@ -126,6 +130,8 @@ class Server {
126
130
  ]),
127
131
  ];
128
132
  this._isEnded = false;
133
+ this._fetchTimings = [];
134
+ this._activeFetchCount = 0;
129
135
  this._createModuleId = config.serializer.createModuleIdFactory();
130
136
  this._bundler = new _IncrementalBundler.default(config, {
131
137
  hasReducedPerformance: options && options.hasReducedPerformance,
@@ -433,12 +439,14 @@ class Server {
433
439
  }),
434
440
  );
435
441
  try {
442
+ const depGraph = await this._bundler.getBundler().getDependencyGraph();
436
443
  const data = await (0, _Assets.getAsset)(
437
444
  assetPath,
438
445
  this._config.projectRoot,
439
446
  this._config.watchFolders,
440
447
  urlObj.searchParams.get("platform"),
441
448
  this._config.resolver.assetExts,
449
+ (filePath) => depGraph.doesFileExist(filePath),
442
450
  );
443
451
  if (process.env.REACT_NATIVE_ENABLE_ASSET_CACHING === true) {
444
452
  res.setHeader("Cache-Control", "max-age=31536000");
@@ -481,6 +489,13 @@ class Server {
481
489
  debug("Rewritten to: %s", req.url);
482
490
  }
483
491
  const reqHost = req.headers["x-forwarded-host"] || req.headers["host"];
492
+ debug("Request host is: %s", req.headers["host"]);
493
+ if (req.headers["x-forwarded-host"]) {
494
+ debug(
495
+ "Request x-forwarded-host is: %s",
496
+ req.headers["x-forwarded-host"],
497
+ );
498
+ }
484
499
  if (!reqHost) {
485
500
  throw new Error("No host header was found.");
486
501
  }
@@ -665,14 +680,16 @@ class Server {
665
680
  }
666
681
  const mres = _MultipartResponse.default.wrapIfSupported(req, res);
667
682
  let onProgress = null;
668
- let lastProgress = -1;
683
+ let lastRatio = -1;
669
684
  if (this._config.reporter) {
670
685
  onProgress = (transformedFileCount, totalFileCount) => {
671
- const currentProgress = parseInt(
672
- (transformedFileCount / totalFileCount) * 100,
673
- 10,
686
+ const newRatio = (0,
687
+ _bundleProgressUtils.calculateBundleProgressRatio)(
688
+ transformedFileCount,
689
+ totalFileCount,
690
+ lastRatio,
674
691
  );
675
- if (currentProgress > lastProgress || totalFileCount < 10) {
692
+ if (newRatio > lastRatio) {
676
693
  if (mres instanceof _MultipartResponse.default) {
677
694
  mres.writeChunk(
678
695
  {
@@ -681,13 +698,14 @@ class Server {
681
698
  JSON.stringify({
682
699
  done: transformedFileCount,
683
700
  total: totalFileCount,
701
+ percent: Math.floor(newRatio * 100),
684
702
  }),
685
703
  );
686
704
  }
687
705
  if (res.socket != null && res.socket.uncork != null) {
688
706
  res.socket.uncork();
689
707
  }
690
- lastProgress = currentProgress;
708
+ lastRatio = newRatio;
691
709
  }
692
710
  this._reporter.update({
693
711
  buildID: getBuildID(buildNumber),
@@ -729,8 +747,16 @@ class Server {
729
747
  const logEntry = log(
730
748
  createActionStartEntry(createStartEntry(startContext)),
731
749
  );
750
+ const fetchTiming = {
751
+ graphId,
752
+ startTime: requestStartTimestamp,
753
+ endTime: null,
754
+ isPrefetch: req.method === "HEAD",
755
+ };
732
756
  let result;
733
757
  try {
758
+ this._fetchTimings.push(fetchTiming);
759
+ this._activeFetchCount++;
734
760
  result = await build(startContext);
735
761
  } catch (error) {
736
762
  const formattedError = (0, _formatBundlingError.default)(error);
@@ -760,6 +786,31 @@ class Server {
760
786
  debug("Bundling error", error);
761
787
  buildContext.bundlePerfLogger.end("FAIL");
762
788
  return;
789
+ } finally {
790
+ fetchTiming.endTime =
791
+ _perf_hooks.performance.timeOrigin + _perf_hooks.performance.now();
792
+ if (!fetchTiming.isPrefetch) {
793
+ buildContext.bundlePerfLogger.annotate({
794
+ bool: {
795
+ had_competing_prefetch: this._fetchTimings
796
+ .filter((t) => t.isPrefetch && t.graphId !== graphId)
797
+ .some((prefetch) => {
798
+ const prefetchEndTime =
799
+ prefetch.endTime ?? Number.MAX_SAFE_INTEGER;
800
+ const fetchEndTime =
801
+ fetchTiming.endTime ?? Number.MAX_SAFE_INTEGER;
802
+ return (
803
+ prefetch.startTime < fetchEndTime &&
804
+ prefetchEndTime > fetchTiming.startTime
805
+ );
806
+ }),
807
+ },
808
+ });
809
+ }
810
+ this._activeFetchCount--;
811
+ if (this._activeFetchCount === 0) {
812
+ this._fetchTimings = [];
813
+ }
763
814
  }
764
815
  const endContext = {
765
816
  ...startContext,
@@ -784,6 +835,7 @@ class Server {
784
835
  return {
785
836
  action_name: "Requesting bundle",
786
837
  bundle_url: context.req.url,
838
+ bundle_original_url: context.req.originalUrl ?? "unknown",
787
839
  entry_point: context.entryFile,
788
840
  bundler: "delta",
789
841
  build_id: getBuildID(context.buildNumber),
@@ -1068,6 +1120,7 @@ class Server {
1068
1120
  },
1069
1121
  });
1070
1122
  async _symbolicate(req, res) {
1123
+ const depGraph = await this._bundler.getBundler().getDependencyGraph();
1071
1124
  const getCodeFrame = (urls, symbolicatedStack) => {
1072
1125
  const allFramesCollapsed = symbolicatedStack.every(
1073
1126
  ({ collapse }) => collapse,
@@ -1085,6 +1138,13 @@ class Server {
1085
1138
  this._config.projectRoot,
1086
1139
  file ?? "",
1087
1140
  );
1141
+ if (!depGraph.doesFileExist(fileAbsolute)) {
1142
+ debug(
1143
+ "Skipping code frame for file not in dependency graph.",
1144
+ fileAbsolute,
1145
+ );
1146
+ continue;
1147
+ }
1088
1148
  try {
1089
1149
  return {
1090
1150
  content: (0, _codeFrame.codeFrameColumns)(
@@ -1115,6 +1175,7 @@ class Server {
1115
1175
  }
1116
1176
  return null;
1117
1177
  };
1178
+ let inputValidated = false;
1118
1179
  try {
1119
1180
  const symbolicatingLogEntry = log(
1120
1181
  createActionStartEntry("Symbolicating"),
@@ -1125,25 +1186,68 @@ class Server {
1125
1186
  const body = await req.rawBody;
1126
1187
  parsedBody = JSON.parse(body);
1127
1188
  } else {
1128
- parsedBody = await (0, _parseJsonBody.default)(req);
1189
+ parsedBody = await (0, _parseJsonBody.default)(req, {
1190
+ strict: false,
1191
+ });
1129
1192
  }
1130
- const rewriteAndNormalizeStackFrame = (frame, lineNumber) => {
1131
- (0, _invariant.default)(
1132
- frame != null && typeof frame === "object",
1133
- "Bad stack frame at line %d, expected object, received: %s",
1134
- lineNumber,
1135
- typeof frame,
1193
+ let validatedBody;
1194
+ if (
1195
+ parsedBody != null &&
1196
+ typeof parsedBody === "object" &&
1197
+ !Array.isArray(parsedBody) &&
1198
+ Array.isArray(parsedBody["stack"])
1199
+ ) {
1200
+ const maybeStack = parsedBody["stack"];
1201
+ const extraData = parsedBody["extraData"];
1202
+ validatedBody = {
1203
+ stack: maybeStack,
1204
+ extraData,
1205
+ };
1206
+ } else {
1207
+ throw new Error(
1208
+ `Bad symbolication input, expected object with stack array, got: ${JSON.stringify(parsedBody)}`,
1136
1209
  );
1137
- const frameFile = frame.file;
1138
- if (typeof frameFile === "string" && frameFile.includes("://")) {
1139
- return {
1140
- ...frame,
1141
- file: this._rewriteAndNormalizeUrl(frameFile),
1142
- };
1210
+ }
1211
+ const validateAndNormalizeStackFrame = (frame) => {
1212
+ if (
1213
+ frame == null ||
1214
+ typeof frame !== "object" ||
1215
+ Array.isArray(frame)
1216
+ ) {
1217
+ throw new Error("Expected frame to be a JSON object");
1143
1218
  }
1144
- return frame;
1219
+ if (frame.file != null && typeof frame.file !== "string") {
1220
+ throw new Error("Expected file to be string or nullish");
1221
+ }
1222
+ let frameFile = frame.file;
1223
+ if (frameFile != null && frameFile.includes("://")) {
1224
+ frameFile = this._rewriteAndNormalizeUrl(frameFile);
1225
+ }
1226
+ if (frame.methodName != null && typeof frame.methodName !== "string") {
1227
+ throw new Error("Expected methodName to be string or nullish");
1228
+ }
1229
+ if (frame.lineNumber != null && typeof frame.lineNumber !== "number") {
1230
+ throw new Error("Expected lineNumber to be number or nullish");
1231
+ }
1232
+ if (frame.column != null && typeof frame.column !== "number") {
1233
+ throw new Error("Expected column to be number or nullish");
1234
+ }
1235
+ return {
1236
+ ...frame,
1237
+ file: frameFile,
1238
+ lineNumber: frame.lineNumber,
1239
+ column: frame.column,
1240
+ methodName: frame.methodName,
1241
+ };
1145
1242
  };
1146
- const stack = parsedBody.stack.map(rewriteAndNormalizeStackFrame);
1243
+ const stack = validatedBody.stack.map((frame, lineNumber) => {
1244
+ try {
1245
+ return validateAndNormalizeStackFrame(frame);
1246
+ } catch (e) {
1247
+ throw new Error(`Bad frame at line ${lineNumber}: ${e.message}`);
1248
+ }
1249
+ });
1250
+ inputValidated = true;
1147
1251
  const urls = new Set();
1148
1252
  stack.forEach((frame) => {
1149
1253
  const sourceUrl = frame.file;
@@ -1169,7 +1273,7 @@ class Server {
1169
1273
  stack,
1170
1274
  zip(urls.values(), sourceMaps),
1171
1275
  this._config,
1172
- parsedBody.extraData ?? {},
1276
+ validatedBody.extraData ?? {},
1173
1277
  );
1174
1278
  debug("Symbolication done");
1175
1279
  res.end(
@@ -1183,7 +1287,7 @@ class Server {
1183
1287
  });
1184
1288
  } catch (error) {
1185
1289
  debug("Symbolication failed", error.stack || error);
1186
- res.statusCode = 500;
1290
+ res.statusCode = inputValidated ? 500 : 400;
1187
1291
  res.end(
1188
1292
  JSON.stringify({
1189
1293
  error: error.message,