forked from firefox-devtools/debugger
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.js
More file actions
106 lines (90 loc) · 2.65 KB
/
utils.js
File metadata and controls
106 lines (90 loc) · 2.65 KB
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/* 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 { 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 url = source.get ? source.get("url") : source.url;
const parsedUrl = parse(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<string>, url: Object) {
const isLastPart = index === parts.length - 1;
return !isDirectory(url) && isLastPart;
}
export function createNode(
name: string,
path: string,
contents: SourceRecord | Array<Node>
): Node {
return {
name,
path,
contents
};
}
export function createParentMap(tree: Node): WeakMap<Node, Node> {
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("/");
}