/* 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 { sortBy, uniq } from "lodash";
import { createSelector } from "reselect";
import {
getSources,
getSourceInSources,
getBreakpointsList,
getSelectedSource
} from "../selectors";
import { getFilename } from "../utils/source";
import { getSelectedLocation } from "../utils/selected-location";
import { sortSelectedBreakpoints } from "../utils/breakpoint";
import type { Source, Breakpoint } from "../types";
import type { Selector, SourceResourceState } from "../reducers/types";
export type BreakpointSources = Array<{
source: Source,
breakpoints: Breakpoint[]
}>;
function getBreakpointsForSource(
source: Source,
selectedSource: ?Source,
breakpoints: Breakpoint[]
) {
return sortSelectedBreakpoints(breakpoints, selectedSource)
.filter(
bp =>
!bp.options.hidden &&
(bp.text || bp.originalText || bp.options.condition || bp.disabled)
)
.filter(
bp => getSelectedLocation(bp, selectedSource).sourceId == source.id
);
}
function findBreakpointSources(
sources: SourceResourceState,
breakpoints: Breakpoint[],
selectedSource: ?Source
): Source[] {
const sourceIds: string[] = uniq(
breakpoints.map(bp => getSelectedLocation(bp, selectedSource).sourceId)
);
const breakpointSources = sourceIds.reduce((acc, id) => {
const source = getSourceInSources(sources, id);
if (source && !source.isBlackBoxed) {
acc.push(source);
}
return acc;
}, []);
return sortBy(breakpointSources, (source: Source) => getFilename(source));
}
export const getBreakpointSources: Selector = createSelector(
getBreakpointsList,
getSources,
getSelectedSource,
(
breakpoints: Breakpoint[],
sources: SourceResourceState,
selectedSource: ?Source
) =>
findBreakpointSources(sources, breakpoints, selectedSource)
.map(source => ({
source,
breakpoints: getBreakpointsForSource(
source,
selectedSource,
breakpoints
)
}))
.filter(({ breakpoints: bpSources }) => bpSources.length > 0)
);