summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/workers/parser/frameworks.js
blob: 85011c07804ba76a3197bf3d38d7f6244c8fd708 (plain)
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
/* 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/>. */

import * as t from "@babel/types";

export function getFramework(symbols) {
  if (isReactComponent(symbols)) {
    return "React";
  }
  if (isAngularComponent(symbols)) {
    return "Angular";
  }
  if (isVueComponent(symbols)) {
    return "Vue";
  }

  return null;
}

function isReactComponent({ imports, classes, callExpressions, identifiers }) {
  return (
    importsReact(imports) ||
    requiresReact(callExpressions) ||
    extendsReactComponent(classes) ||
    isReact(identifiers) ||
    isRedux(identifiers)
  );
}

function importsReact(imports) {
  return imports.some(
    importObj =>
      importObj.source === "react" &&
      importObj.specifiers.some(specifier => specifier === "React")
  );
}

function requiresReact(callExpressions) {
  return callExpressions.some(
    callExpression =>
      callExpression.name === "require" &&
      callExpression.values.some(value => value === "react")
  );
}

function extendsReactComponent(classes) {
  return classes.some(
    classObj =>
      t.isIdentifier(classObj.parent, { name: "Component" }) ||
      t.isIdentifier(classObj.parent, { name: "PureComponent" }) ||
      (t.isMemberExpression(classObj.parent, { computed: false }) &&
        t.isIdentifier(classObj.parent, { name: "Component" }))
  );
}

function isAngularComponent({ memberExpressions }) {
  return memberExpressions.some(
    item =>
      item.expression == "angular.controller" ||
      item.expression == "angular.module"
  );
}

function isVueComponent({ identifiers }) {
  return identifiers.some(identifier => identifier.name == "Vue");
}

/* This identifies the react lib file */
function isReact(identifiers) {
  return identifiers.some(identifier => identifier.name == "isReactComponent");
}

/* This identifies the redux lib file */
function isRedux(identifiers) {
  return identifiers.some(identifier => identifier.name == "Redux");
}