blob: d39a26d5746aeb1cc579545050ee5a524b98489f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
// @flow
import { findIndex } from "lodash";
// eslint-disable-next-line max-len
import type { Frame } from "../../../types";
import { getFrameUrl } from "./getFrameUrl";
function collapseLastFrames(frames) {
const index = findIndex(frames, frame =>
getFrameUrl(frame).match(/webpack\/bootstrap/i)
);
if (index == -1) {
return { newFrames: frames, lastGroup: [] };
}
const newFrames = frames.slice(0, index);
const lastGroup = frames.slice(index);
return { newFrames, lastGroup };
}
type FrameGroup = Frame[];
type GroupedFrames = Array<FrameGroup | Frame>;
export function collapseFrames(frames: Frame[]): GroupedFrames {
// We collapse groups of one so that user frames
// are not in a group of one
function addGroupToList(group, list) {
if (!group) {
return list;
}
if (group.length > 1) {
list.push(group);
} else {
list = list.concat(group);
}
return list;
}
const { newFrames, lastGroup } = collapseLastFrames(frames);
frames = newFrames;
let items = [];
let currentGroup = null;
let prevItem = null;
for (const frame of frames) {
const prevLibrary = prevItem?.library;
if (!currentGroup) {
currentGroup = [frame];
} else if (prevLibrary && prevLibrary == frame.library) {
currentGroup.push(frame);
} else {
items = addGroupToList(currentGroup, items);
currentGroup = [frame];
}
prevItem = frame;
}
items = addGroupToList(currentGroup, items);
items = addGroupToList(lastGroup, items);
return items;
}
|