/* 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 { parse } from "url"; import type { Node } from "./types"; import type { SourceRecord } from "../../types"; import { isPretty } from "../source"; const IGNORED_URLS = ["debugger eval code", "XStringBundle"]; export function nodeHasChildren(item: Node): boolean { return Array.isArray(item.contents); } export function isExactUrlMatch(pathPart: string, debuggeeUrl: string) { // compare to hostname with an optional 'www.' prefix const { host } = parse(debuggeeUrl); if (!host) { return false; } return host.replace(/^www\./, "") === pathPart.replace(/^www\./, ""); } export function isDirectory(url: Object) { const parts = url.path.split("/").filter(p => p !== ""); // Assume that all urls point to files except when they end with '/' // Or directory node has children return ( (parts.length === 0 || url.path.slice(-1) === "/" || nodeHasChildren(url)) && url.name != "(index)" ); } export function getExtension(source: Object): string { const parsedUrl = parse(source.get("url")).pathname; if (!parsedUrl) { return ""; } return parsedUrl.split(".").pop(); } export function isNotJavaScript(source: Object): boolean { return ["css", "svg", "png"].includes(getExtension(source)); } export function isInvalidUrl(url: Object, source: SourceRecord) { return ( IGNORED_URLS.indexOf(url) != -1 || !source.get("url") || !url.group || isPretty(source) || isNotJavaScript(source) ); } export function partIsFile(index: number, parts: Array, url: Object) { const isLastPart = index === parts.length - 1; return !isDirectory(url) && isLastPart; } export function createNode( name: string, path: string, contents: SourceRecord | Array ): Node { return { name, path, contents }; } export function createParentMap(tree: Node): WeakMap { const map = new WeakMap(); function _traverse(subtree) { if (nodeHasChildren(subtree)) { for (const child of subtree.contents) { map.set(child, subtree); _traverse(child); } } } // Don't link each top-level path to the "root" node because the // user never sees the root tree.contents.forEach(_traverse); return map; } export function getRelativePath(url: string) { const { pathname } = parse(url); if (!pathname) { return url; } const path = pathname.split("/"); path.shift(); return path.join("/"); }