/* 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 . */
// @flow
import { get, 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;
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 = get(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;
}