metro 0.83.3 → 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.
- package/package.json +28 -25
- package/src/Assets.js +42 -29
- package/src/Assets.js.flow +26 -15
- package/src/Bundler/util.js +25 -21
- package/src/Bundler/util.js.flow +2 -2
- package/src/Bundler.js.flow +1 -1
- package/src/DeltaBundler/DeltaCalculator.js +4 -4
- package/src/DeltaBundler/DeltaCalculator.js.flow +8 -8
- package/src/DeltaBundler/Graph.js +16 -16
- package/src/DeltaBundler/Graph.js.flow +30 -30
- package/src/DeltaBundler/Serializers/baseJSBundle.js.flow +1 -1
- package/src/DeltaBundler/Serializers/getAllFiles.js.flow +2 -2
- package/src/DeltaBundler/Serializers/getAssets.js.flow +2 -2
- package/src/DeltaBundler/Serializers/getExplodedSourceMap.js.flow +2 -2
- package/src/DeltaBundler/Serializers/getRamBundleInfo.js.flow +8 -8
- package/src/DeltaBundler/Serializers/helpers/js.js +25 -21
- package/src/DeltaBundler/Serializers/helpers/js.js.flow +6 -6
- package/src/DeltaBundler/Serializers/helpers/processModules.js.flow +3 -3
- package/src/DeltaBundler/Serializers/hmrJSBundle.js +25 -21
- package/src/DeltaBundler/Serializers/hmrJSBundle.js.flow +5 -5
- package/src/DeltaBundler/Serializers/sourceMapGenerator.js.flow +6 -6
- package/src/DeltaBundler/Serializers/sourceMapObject.js.flow +2 -2
- package/src/DeltaBundler/Serializers/sourceMapString.js.flow +2 -2
- package/src/DeltaBundler/Transformer.js.flow +3 -3
- package/src/DeltaBundler/Worker.flow.js.flow +1 -1
- package/src/DeltaBundler/WorkerFarm.js +1 -1
- package/src/DeltaBundler/WorkerFarm.js.flow +26 -13
- package/src/DeltaBundler/buildSubgraph.js +4 -4
- package/src/DeltaBundler/buildSubgraph.js.flow +8 -8
- package/src/DeltaBundler/types.js.flow +36 -34
- package/src/DeltaBundler.js.flow +2 -2
- package/src/HmrServer.js +34 -29
- package/src/HmrServer.js.flow +17 -12
- package/src/IncrementalBundler.js +29 -21
- package/src/IncrementalBundler.js.flow +13 -9
- package/src/ModuleGraph/worker/JsFileWrapping.js +25 -21
- package/src/ModuleGraph/worker/JsFileWrapping.js.flow +10 -5
- package/src/ModuleGraph/worker/collectDependencies.js +25 -21
- package/src/ModuleGraph/worker/collectDependencies.js.flow +27 -21
- package/src/ModuleGraph/worker/generateImportNames.js.flow +4 -2
- package/src/ModuleGraph/worker/importLocationsPlugin.js.flow +7 -3
- package/src/Server/MultipartResponse.js.flow +1 -1
- package/src/Server/symbolicate.js.flow +4 -4
- package/src/Server.js +139 -39
- package/src/Server.js.flow +158 -47
- package/src/cli/parseKeyValueParamArray.js.flow +1 -1
- package/src/cli-utils.js.flow +2 -2
- package/src/commands/build.js.flow +11 -10
- package/src/commands/dependencies.js.flow +8 -4
- package/src/commands/serve.js +2 -0
- package/src/commands/serve.js.flow +14 -9
- package/src/index.flow.js +30 -26
- package/src/index.flow.js.flow +25 -20
- package/src/integration_tests/basic_bundle/AssetRegistry.js.flow +1 -1
- package/src/integration_tests/basic_bundle/ErrorBundle.js.flow +1 -1
- package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-import.js.flow +1 -1
- package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-multi-line-import-with-escapes.js.flow +1 -1
- package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-multi-line-import.js.flow +1 -1
- package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-require-with-embedded-comment.js.flow +1 -1
- package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-require.js.flow +1 -1
- package/src/integration_tests/basic_bundle/build-errors/cannot-resolve-specifier-with-escapes.js.flow +1 -1
- package/src/integration_tests/basic_bundle/build-errors/inline-requires-cannot-resolve-import.js.flow +1 -1
- package/src/integration_tests/basic_bundle/build-errors/inline-requires-cannot-resolve-require.js.flow +1 -1
- package/src/integration_tests/basic_bundle/import-export/index.js +25 -21
- package/src/integration_tests/basic_bundle/import-export/index.js.flow +3 -3
- package/src/integration_tests/basic_bundle/import-export/utils.js.flow +2 -2
- package/src/integration_tests/basic_bundle/loadBundleAsyncForTest.js.flow +1 -1
- package/src/integration_tests/basic_bundle/optional-dependencies/index.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-context/conflict.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-context/empty.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-context/matching.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-context/mode-eager.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-context/mode-lazy-once.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-context/mode-lazy.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-context/mode-sync.js.flow +2 -2
- package/src/integration_tests/basic_bundle/require-context/utils.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-resolveWeak/import-and-resolveWeak.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-resolveWeak/multiple.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-resolveWeak/never-required.js.flow +1 -1
- package/src/integration_tests/basic_bundle/require-resolveWeak/require-and-resolveWeak.js.flow +1 -1
- package/src/integration_tests/execBundle.js.flow +1 -1
- package/src/lib/BatchProcessor.js +5 -2
- package/src/lib/BatchProcessor.js.flow +10 -7
- package/src/lib/CountingSet.js.flow +4 -4
- package/src/lib/JsonReporter.js +5 -3
- package/src/lib/JsonReporter.js.flow +19 -17
- package/src/lib/RamBundleParser.js.flow +1 -1
- package/src/lib/TerminalReporter.js +31 -27
- package/src/lib/TerminalReporter.js.flow +15 -15
- package/src/lib/contextModule.js.flow +1 -1
- package/src/lib/contextModuleTemplates.js +25 -21
- package/src/lib/countLines.js +4 -3
- package/src/lib/countLines.js.flow +3 -4
- package/src/lib/createWebsocketServer.js +9 -2
- package/src/lib/createWebsocketServer.js.flow +16 -9
- package/src/lib/debounceAsyncQueue.js.flow +1 -1
- package/src/lib/formatBundlingError.js.flow +1 -1
- package/src/lib/getAppendScripts.js.flow +4 -4
- package/src/lib/getGraphId.js.flow +1 -1
- package/src/lib/getPreludeCode.js +4 -0
- package/src/lib/getPreludeCode.js.flow +10 -3
- package/src/lib/getPrependedScripts.js +36 -22
- package/src/lib/getPrependedScripts.js.flow +10 -3
- package/src/lib/logToConsole.js.flow +2 -2
- package/src/lib/parseBundleOptionsFromBundleRequestUrl.js +25 -21
- package/src/lib/parseCustomResolverOptions.js.flow +2 -2
- package/src/lib/parseCustomTransformOptions.js.flow +1 -1
- package/src/lib/parseJsonBody.js.flow +11 -1
- package/src/lib/pathUtils.js +25 -21
- package/src/lib/pathUtils.js.flow +1 -1
- package/src/lib/reporting.js.flow +4 -4
- package/src/lib/transformHelpers.js +11 -9
- package/src/lib/transformHelpers.js.flow +17 -15
- package/src/node-haste/DependencyGraph/ModuleResolution.js +48 -42
- package/src/node-haste/DependencyGraph/ModuleResolution.js.flow +35 -32
- package/src/node-haste/DependencyGraph/createFileMap.js +56 -38
- package/src/node-haste/DependencyGraph/createFileMap.js.flow +44 -18
- package/src/node-haste/DependencyGraph.js +40 -31
- package/src/node-haste/DependencyGraph.js.flow +35 -37
- package/src/node-haste/lib/AssetPaths.js +2 -2
- package/src/node-haste/lib/AssetPaths.js.flow +4 -4
- package/src/node-haste/lib/parsePlatformFilePath.js +6 -6
- package/src/node-haste/lib/parsePlatformFilePath.js.flow +4 -4
- package/src/shared/output/RamBundle/as-assets.js.flow +6 -6
- package/src/shared/output/RamBundle/as-indexed-file.js.flow +5 -5
- package/src/shared/output/RamBundle/buildSourcemapWithMetadata.js.flow +5 -5
- package/src/shared/output/RamBundle/util.js.flow +5 -5
- package/src/shared/output/RamBundle/write-sourcemap.js.flow +1 -1
- package/src/shared/output/RamBundle.js.flow +1 -1
- package/src/shared/output/bundle.flow.js.flow +3 -3
- package/src/shared/output/meta.js +2 -2
- package/src/shared/output/meta.js.flow +1 -1
- package/src/shared/output/writeFile.js +8 -3
- package/src/shared/output/writeFile.js.flow +8 -2
- package/src/shared/types.js.flow +20 -5
- package/src/Asset.d.ts +0 -25
- package/src/Bundler.d.ts +0 -39
- package/src/DeltaBundler/Graph.d.ts +0 -40
- package/src/DeltaBundler/Serializers/getExplodedSourceMap.d.ts +0 -26
- package/src/DeltaBundler/Serializers/getRamBundleInfo.d.ts +0 -18
- package/src/DeltaBundler/Worker.d.ts +0 -45
- package/src/DeltaBundler/types.d.ts +0 -166
- package/src/DeltaBundler.d.ts +0 -58
- package/src/IncrementalBundler.d.ts +0 -98
- package/src/ModuleGraph/test-helpers.js +0 -75
- package/src/ModuleGraph/worker/collectDependencies.d.ts +0 -27
- package/src/Server/MultipartResponse.d.ts +0 -31
- package/src/Server/symbolicate.d.ts +0 -31
- package/src/Server.d.ts +0 -118
- package/src/index.d.ts +0 -193
- package/src/lib/CountingSet.d.ts +0 -48
- package/src/lib/TerminalReporter.d.ts +0 -27
- package/src/lib/contextModule.d.ts +0 -22
- package/src/lib/getGraphId.d.ts +0 -11
- package/src/lib/reporting.d.ts +0 -144
- package/src/node-haste/DependencyGraph.d.ts +0 -62
- package/src/shared/output/bundle.d.ts +0 -35
- package/src/shared/types.d.ts +0 -130
package/src/Server.js
CHANGED
|
@@ -51,7 +51,6 @@ var _symbolicate = _interopRequireDefault(require("./Server/symbolicate"));
|
|
|
51
51
|
var _types = require("./shared/types");
|
|
52
52
|
var _codeFrame = require("@babel/code-frame");
|
|
53
53
|
var fs = _interopRequireWildcard(require("graceful-fs"));
|
|
54
|
-
var _invariant = _interopRequireDefault(require("invariant"));
|
|
55
54
|
var jscSafeUrl = _interopRequireWildcard(require("jsc-safe-url"));
|
|
56
55
|
var _metroCore = require("metro-core");
|
|
57
56
|
var _mimeTypes = _interopRequireDefault(require("mime-types"));
|
|
@@ -59,28 +58,32 @@ var _nullthrows = _interopRequireDefault(require("nullthrows"));
|
|
|
59
58
|
var _path = _interopRequireDefault(require("path"));
|
|
60
59
|
var _perf_hooks = require("perf_hooks");
|
|
61
60
|
var _querystring = _interopRequireDefault(require("querystring"));
|
|
62
|
-
function
|
|
63
|
-
if ("function"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return (
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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]);
|
|
61
|
+
function _interopRequireWildcard(e, t) {
|
|
62
|
+
if ("function" == typeof WeakMap)
|
|
63
|
+
var r = new WeakMap(),
|
|
64
|
+
n = new WeakMap();
|
|
65
|
+
return (_interopRequireWildcard = function (e, t) {
|
|
66
|
+
if (!t && e && e.__esModule) return e;
|
|
67
|
+
var o,
|
|
68
|
+
i,
|
|
69
|
+
f = { __proto__: null, default: e };
|
|
70
|
+
if (null === e || ("object" != typeof e && "function" != typeof e))
|
|
71
|
+
return f;
|
|
72
|
+
if ((o = t ? n : r)) {
|
|
73
|
+
if (o.has(e)) return o.get(e);
|
|
74
|
+
o.set(e, f);
|
|
82
75
|
}
|
|
83
|
-
|
|
76
|
+
for (const t in e)
|
|
77
|
+
"default" !== t &&
|
|
78
|
+
{}.hasOwnProperty.call(e, t) &&
|
|
79
|
+
((i =
|
|
80
|
+
(o = Object.defineProperty) &&
|
|
81
|
+
Object.getOwnPropertyDescriptor(e, t)) &&
|
|
82
|
+
(i.get || i.set)
|
|
83
|
+
? o(f, t, i)
|
|
84
|
+
: (f[t] = e[t]));
|
|
85
|
+
return f;
|
|
86
|
+
})(e, t);
|
|
84
87
|
}
|
|
85
88
|
function _interopRequireDefault(e) {
|
|
86
89
|
return e && e.__esModule ? e : { default: e };
|
|
@@ -126,6 +129,8 @@ class Server {
|
|
|
126
129
|
]),
|
|
127
130
|
];
|
|
128
131
|
this._isEnded = false;
|
|
132
|
+
this._fetchTimings = [];
|
|
133
|
+
this._activeFetchCount = 0;
|
|
129
134
|
this._createModuleId = config.serializer.createModuleIdFactory();
|
|
130
135
|
this._bundler = new _IncrementalBundler.default(config, {
|
|
131
136
|
hasReducedPerformance: options && options.hasReducedPerformance,
|
|
@@ -433,12 +438,14 @@ class Server {
|
|
|
433
438
|
}),
|
|
434
439
|
);
|
|
435
440
|
try {
|
|
441
|
+
const depGraph = await this._bundler.getBundler().getDependencyGraph();
|
|
436
442
|
const data = await (0, _Assets.getAsset)(
|
|
437
443
|
assetPath,
|
|
438
444
|
this._config.projectRoot,
|
|
439
445
|
this._config.watchFolders,
|
|
440
446
|
urlObj.searchParams.get("platform"),
|
|
441
447
|
this._config.resolver.assetExts,
|
|
448
|
+
(filePath) => depGraph.doesFileExist(filePath),
|
|
442
449
|
);
|
|
443
450
|
if (process.env.REACT_NATIVE_ENABLE_ASSET_CACHING === true) {
|
|
444
451
|
res.setHeader("Cache-Control", "max-age=31536000");
|
|
@@ -481,6 +488,13 @@ class Server {
|
|
|
481
488
|
debug("Rewritten to: %s", req.url);
|
|
482
489
|
}
|
|
483
490
|
const reqHost = req.headers["x-forwarded-host"] || req.headers["host"];
|
|
491
|
+
debug("Request host is: %s", req.headers["host"]);
|
|
492
|
+
if (req.headers["x-forwarded-host"]) {
|
|
493
|
+
debug(
|
|
494
|
+
"Request x-forwarded-host is: %s",
|
|
495
|
+
req.headers["x-forwarded-host"],
|
|
496
|
+
);
|
|
497
|
+
}
|
|
484
498
|
if (!reqHost) {
|
|
485
499
|
throw new Error("No host header was found.");
|
|
486
500
|
}
|
|
@@ -729,8 +743,16 @@ class Server {
|
|
|
729
743
|
const logEntry = log(
|
|
730
744
|
createActionStartEntry(createStartEntry(startContext)),
|
|
731
745
|
);
|
|
746
|
+
const fetchTiming = {
|
|
747
|
+
graphId,
|
|
748
|
+
startTime: requestStartTimestamp,
|
|
749
|
+
endTime: null,
|
|
750
|
+
isPrefetch: req.method === "HEAD",
|
|
751
|
+
};
|
|
732
752
|
let result;
|
|
733
753
|
try {
|
|
754
|
+
this._fetchTimings.push(fetchTiming);
|
|
755
|
+
this._activeFetchCount++;
|
|
734
756
|
result = await build(startContext);
|
|
735
757
|
} catch (error) {
|
|
736
758
|
const formattedError = (0, _formatBundlingError.default)(error);
|
|
@@ -760,6 +782,31 @@ class Server {
|
|
|
760
782
|
debug("Bundling error", error);
|
|
761
783
|
buildContext.bundlePerfLogger.end("FAIL");
|
|
762
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
|
+
}
|
|
763
810
|
}
|
|
764
811
|
const endContext = {
|
|
765
812
|
...startContext,
|
|
@@ -784,6 +831,7 @@ class Server {
|
|
|
784
831
|
return {
|
|
785
832
|
action_name: "Requesting bundle",
|
|
786
833
|
bundle_url: context.req.url,
|
|
834
|
+
bundle_original_url: context.req.originalUrl ?? "unknown",
|
|
787
835
|
entry_point: context.entryFile,
|
|
788
836
|
bundler: "delta",
|
|
789
837
|
build_id: getBuildID(context.buildNumber),
|
|
@@ -1068,6 +1116,7 @@ class Server {
|
|
|
1068
1116
|
},
|
|
1069
1117
|
});
|
|
1070
1118
|
async _symbolicate(req, res) {
|
|
1119
|
+
const depGraph = await this._bundler.getBundler().getDependencyGraph();
|
|
1071
1120
|
const getCodeFrame = (urls, symbolicatedStack) => {
|
|
1072
1121
|
const allFramesCollapsed = symbolicatedStack.every(
|
|
1073
1122
|
({ collapse }) => collapse,
|
|
@@ -1085,6 +1134,13 @@ class Server {
|
|
|
1085
1134
|
this._config.projectRoot,
|
|
1086
1135
|
file ?? "",
|
|
1087
1136
|
);
|
|
1137
|
+
if (!depGraph.doesFileExist(fileAbsolute)) {
|
|
1138
|
+
debug(
|
|
1139
|
+
"Skipping code frame for file not in dependency graph.",
|
|
1140
|
+
fileAbsolute,
|
|
1141
|
+
);
|
|
1142
|
+
continue;
|
|
1143
|
+
}
|
|
1088
1144
|
try {
|
|
1089
1145
|
return {
|
|
1090
1146
|
content: (0, _codeFrame.codeFrameColumns)(
|
|
@@ -1115,6 +1171,7 @@ class Server {
|
|
|
1115
1171
|
}
|
|
1116
1172
|
return null;
|
|
1117
1173
|
};
|
|
1174
|
+
let inputValidated = false;
|
|
1118
1175
|
try {
|
|
1119
1176
|
const symbolicatingLogEntry = log(
|
|
1120
1177
|
createActionStartEntry("Symbolicating"),
|
|
@@ -1125,25 +1182,68 @@ class Server {
|
|
|
1125
1182
|
const body = await req.rawBody;
|
|
1126
1183
|
parsedBody = JSON.parse(body);
|
|
1127
1184
|
} else {
|
|
1128
|
-
parsedBody = await (0, _parseJsonBody.default)(req
|
|
1185
|
+
parsedBody = await (0, _parseJsonBody.default)(req, {
|
|
1186
|
+
strict: false,
|
|
1187
|
+
});
|
|
1129
1188
|
}
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1189
|
+
let validatedBody;
|
|
1190
|
+
if (
|
|
1191
|
+
parsedBody != null &&
|
|
1192
|
+
typeof parsedBody === "object" &&
|
|
1193
|
+
!Array.isArray(parsedBody) &&
|
|
1194
|
+
Array.isArray(parsedBody["stack"])
|
|
1195
|
+
) {
|
|
1196
|
+
const maybeStack = parsedBody["stack"];
|
|
1197
|
+
const extraData = parsedBody["extraData"];
|
|
1198
|
+
validatedBody = {
|
|
1199
|
+
stack: maybeStack,
|
|
1200
|
+
extraData,
|
|
1201
|
+
};
|
|
1202
|
+
} else {
|
|
1203
|
+
throw new Error(
|
|
1204
|
+
`Bad symbolication input, expected object with stack array, got: ${JSON.stringify(parsedBody)}`,
|
|
1136
1205
|
);
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1206
|
+
}
|
|
1207
|
+
const validateAndNormalizeStackFrame = (frame) => {
|
|
1208
|
+
if (
|
|
1209
|
+
frame == null ||
|
|
1210
|
+
typeof frame !== "object" ||
|
|
1211
|
+
Array.isArray(frame)
|
|
1212
|
+
) {
|
|
1213
|
+
throw new Error("Expected frame to be a JSON object");
|
|
1143
1214
|
}
|
|
1144
|
-
|
|
1215
|
+
if (frame.file != null && typeof frame.file !== "string") {
|
|
1216
|
+
throw new Error("Expected file to be string or nullish");
|
|
1217
|
+
}
|
|
1218
|
+
let frameFile = frame.file;
|
|
1219
|
+
if (frameFile != null && frameFile.includes("://")) {
|
|
1220
|
+
frameFile = this._rewriteAndNormalizeUrl(frameFile);
|
|
1221
|
+
}
|
|
1222
|
+
if (frame.methodName != null && typeof frame.methodName !== "string") {
|
|
1223
|
+
throw new Error("Expected methodName to be string or nullish");
|
|
1224
|
+
}
|
|
1225
|
+
if (frame.lineNumber != null && typeof frame.lineNumber !== "number") {
|
|
1226
|
+
throw new Error("Expected lineNumber to be number or nullish");
|
|
1227
|
+
}
|
|
1228
|
+
if (frame.column != null && typeof frame.column !== "number") {
|
|
1229
|
+
throw new Error("Expected column to be number or nullish");
|
|
1230
|
+
}
|
|
1231
|
+
return {
|
|
1232
|
+
...frame,
|
|
1233
|
+
file: frameFile,
|
|
1234
|
+
lineNumber: frame.lineNumber,
|
|
1235
|
+
column: frame.column,
|
|
1236
|
+
methodName: frame.methodName,
|
|
1237
|
+
};
|
|
1145
1238
|
};
|
|
1146
|
-
const stack =
|
|
1239
|
+
const stack = validatedBody.stack.map((frame, lineNumber) => {
|
|
1240
|
+
try {
|
|
1241
|
+
return validateAndNormalizeStackFrame(frame);
|
|
1242
|
+
} catch (e) {
|
|
1243
|
+
throw new Error(`Bad frame at line ${lineNumber}: ${e.message}`);
|
|
1244
|
+
}
|
|
1245
|
+
});
|
|
1246
|
+
inputValidated = true;
|
|
1147
1247
|
const urls = new Set();
|
|
1148
1248
|
stack.forEach((frame) => {
|
|
1149
1249
|
const sourceUrl = frame.file;
|
|
@@ -1169,7 +1269,7 @@ class Server {
|
|
|
1169
1269
|
stack,
|
|
1170
1270
|
zip(urls.values(), sourceMaps),
|
|
1171
1271
|
this._config,
|
|
1172
|
-
|
|
1272
|
+
validatedBody.extraData ?? {},
|
|
1173
1273
|
);
|
|
1174
1274
|
debug("Symbolication done");
|
|
1175
1275
|
res.end(
|
|
@@ -1183,7 +1283,7 @@ class Server {
|
|
|
1183
1283
|
});
|
|
1184
1284
|
} catch (error) {
|
|
1185
1285
|
debug("Symbolication failed", error.stack || error);
|
|
1186
|
-
res.statusCode = 500;
|
|
1286
|
+
res.statusCode = inputValidated ? 500 : 400;
|
|
1187
1287
|
res.end(
|
|
1188
1288
|
JSON.stringify({
|
|
1189
1289
|
error: error.message,
|