forked from firefox-devtools/debugger
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdisplayName.js
More file actions
98 lines (85 loc) · 2.7 KB
/
displayName.js
File metadata and controls
98 lines (85 loc) · 2.7 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
/* 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
// eslint-disable-next-line max-len
import type { LocalFrame } from "../../../components/SecondaryPanes/Frames/types";
import { getFilename } from "../../source";
import { endTruncateStr } from "../../../utils/utils";
// Decodes an anonymous naming scheme that
// spider monkey implements based on "Naming Anonymous JavaScript Functions"
// http://johnjbarton.github.io/nonymous/index.html
const objectProperty = /([\w\d]+)$/;
const arrayProperty = /\[(.*?)\]$/;
const functionProperty = /([\w\d]+)[\/\.<]*?$/;
const annonymousProperty = /([\w\d]+)\(\^\)$/;
export function simplifyDisplayName(displayName: string) {
// if the display name has a space it has already been mapped
if (/\s/.exec(displayName)) {
return displayName;
}
const scenarios = [
objectProperty,
arrayProperty,
functionProperty,
annonymousProperty
];
for (const reg of scenarios) {
const match = reg.exec(displayName);
if (match) {
return match[1];
}
}
return displayName;
}
const displayNameMap = {
Babel: {
tryCatch: "Async"
},
Backbone: {
"extend/child": "Create Class",
".create": "Create Model"
},
jQuery: {
"jQuery.event.dispatch": "Dispatch Event"
},
React: {
// eslint-disable-next-line max-len
"ReactCompositeComponent._renderValidatedComponentWithoutOwnerOrContext/renderedElement<":
"Render",
_renderValidatedComponentWithoutOwnerOrContext: "Render"
},
VueJS: {
"renderMixin/Vue.prototype._render": "Render"
},
Webpack: {
// eslint-disable-next-line camelcase
__webpack_require__: "Bootstrap"
}
};
function mapDisplayNames(frame, library) {
const { displayName } = frame;
return (
(displayNameMap[library] && displayNameMap[library][displayName]) ||
displayName
);
}
type formatDisplayNameParams = { shouldMapDisplayName: boolean };
export function formatDisplayName(
frame: LocalFrame,
{ shouldMapDisplayName = true }: formatDisplayNameParams = {}
) {
let { displayName, originalDisplayName, library } = frame;
displayName = originalDisplayName || displayName;
if (library && shouldMapDisplayName) {
displayName = mapDisplayNames(frame, library);
}
displayName = simplifyDisplayName(displayName);
return endTruncateStr(displayName, 25);
}
export function formatCopyName(frame: LocalFrame) {
const displayName = formatDisplayName(frame);
const fileName = getFilename(frame.source);
const frameLocation = frame.location.line;
return `${displayName} (${fileName}#${frameLocation})`;
}