Source code
Revision control
Copy as Markdown
Other Tools
/* 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
const libraryMap = [
{
label: "Backbone",
pattern: /backbone/i,
},
{
label: "Babel",
pattern: /node_modules\/@babel/i,
},
{
label: "jQuery",
pattern: /jquery/i,
},
{
label: "Preact",
pattern: /preact/i,
},
{
label: "React",
pattern:
/(node_modules\/(?:react(-dom)?(-dev)?\/))|(react(-dom)?(-dev)?(\.[a-z]+)*\.js$)/,
},
{
label: "Immutable",
pattern: /immutable/i,
},
{
label: "Webpack",
pattern: /webpack\/bootstrap/i,
},
{
label: "Express",
pattern: /node_modules\/express/,
},
{
label: "Pug",
pattern: /node_modules\/pug/,
},
{
label: "ExtJS",
pattern: /\/ext-all[\.\-]/,
},
{
label: "MobX",
pattern: /mobx/i,
},
{
label: "Underscore",
pattern: /underscore/i,
},
{
label: "Lodash",
pattern: /lodash/i,
},
{
label: "Ember",
pattern: /ember/i,
},
{
label: "Choo",
pattern: /choo/i,
},
{
label: "VueJS",
pattern: /vue(?:\.[a-z]+)*\.js/i,
},
{
label: "RxJS",
pattern: /rxjs/i,
},
{
label: "Angular",
pattern: /angular(?!.*\/app\/)/i,
contextPattern: /zone\.js/,
},
{
label: "Redux",
pattern: /redux/i,
},
{
label: "Dojo",
pattern: /dojo/i,
},
{
label: "Marko",
pattern: /marko/i,
},
{
label: "NuxtJS",
pattern: /[\._]nuxt/i,
},
{
label: "Aframe",
pattern: /aframe/i,
},
{
label: "NextJS",
pattern: /[\._]next/i,
},
];
export function getLibraryFromUrl(frame, callStack = []) {
const frameUrl = frame.location.source.url;
// Let's first check if the frame match a defined pattern.
let match = libraryMap.find(o => o.pattern.test(frameUrl));
if (match) {
return match.label;
}
// If it does not, it might still be one of the case where the file is used
// by a library but the name has not enough specificity. In such case, we want
// to only return the library name if there are frames matching the library
// pattern in the callStack (e.g. `zone.js` is used by Angular, but the name
// could be quite common and return false positive if evaluated alone. So we
// only return Angular if there are other frames matching Angular).
match = libraryMap.find(
o => o.contextPattern && o.contextPattern.test(frameUrl)
);
if (match) {
const contextMatch = callStack.some(f => {
const url = f.location.source.url;
if (!url) {
return false;
}
return libraryMap.some(o => o.pattern.test(url));
});
if (contextMatch) {
return match.label;
}
}
return null;
}