All files OpenUI5DefineDependencyParserPlugin.js

94.64% Statements 53/56
83.33% Branches 25/30
100% Functions 7/7
96.36% Lines 53/55
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    1x 1x 1x 1x       14x       7x       14x   14x     7x   1x 1x   3x 1x 1x 2x 1x 1x   1x   3x   2x 1x 1x 1x   1x 1x   2x   1x 1x 1x     7x 4x 4x 4x     7x 7x 7x           7x           7x 7x 3x   7x 7x     14x 4x 4x   4x     14x   4x     4x   4x 4x 4x       1x  
'use strict';
 
const LocalModulesHelpers = require("webpack/lib/dependencies/LocalModulesHelpers");
const LocalModuleDependency = require("webpack/lib/dependencies/LocalModuleDependency");
const OpenUI5DefineDependency = require('./OpenUI5DefineDependency');
const OpenUI5RequireItemDependency = require('./OpenUI5RequireItemDependency');
 
class OpenUI5DefineDependencyParserPlugin {
  constructor(options) {
    this.options = options;
  }
 
  newDefineDependency(range, arrayRange, functionRange, namedModule) {
    return new OpenUI5DefineDependency(range, arrayRange, functionRange, namedModule);
  }
 
  apply(parser) {
    const options = this.options;
 
    parser.plugin('call sap.ui.define', (expr) => {
      let array, fn, namedModule;
 
      switch(expr.arguments.length) {
        case 1:
          fn = expr.arguments[0];
          break;
        case 2:
          if (expr.arguments[0].type === "Literal") {
            namedModule = expr.arguments[0].value;
            fn = expr.arguments[1];
          } else if (expr.arguments[0].type === 'ArrayExpression') {
            array = expr.arguments[0];
            fn = expr.arguments[1];
          } else {
            fn = expr.arguments[0];
          }
          break;
        case 3:
          if (expr.arguments[0].type === "Literal") {
            namedModule = expr.arguments[0].value;
            array = expr.arguments[1];
            fn = expr.arguments[2];
          } else {
            array = expr.arguments[0];
            fn = expr.arguments[1];
          }
          break;
        case 4:
          namedModule = expr.arguments[0].value;
          array = expr.arguments[1];
          fn = expr.arguments[2];
      }
 
      if (array) {
        const param = parser.evaluateExpression(array);
        const result = parser.applyPluginsBailResult('call define:openui5:array', expr, param, namedModule);
        Iif (!result) return;
      }
 
      Eif (fn && fn.type === 'FunctionExpression') {
        Eif (fn.body.type === 'BlockStatement') {
          parser.walkStatement(fn.body);
        } else {
          parser.walkExpression(fn.body);
        }
      }
 
      const dep = this.newDefineDependency(
        expr.range,
        array ? array.range : null,
        fn ? fn.range : null,
        namedModule ? namedModule : null
      );
      dep.loc = expr.loc;
      if(namedModule) {
        dep.localModule = LocalModulesHelpers.addLocalModule(parser.state, namedModule);
      }
      parser.state.current.addDependency(dep);
      return true;
    });
 
    parser.plugin('call define:openui5:array', (expr, param, namedModule) => {
      param.items.forEach((param) => {
        parser.applyPluginsBailResult('call define:openui5:item', expr, param, namedModule);
      });
      return true;
    });
 
    parser.plugin('call define:openui5:item', (expr, param, namedModule) => {
      let dep, localModule;
      Iif(localModule = LocalModulesHelpers.getLocalModule(parser.state, param.string, namedModule)) {
        dep = new LocalModuleDependency(localModule, param.range);
      } else {
        dep = new OpenUI5RequireItemDependency(param.string, param.range);
      }
      dep.loc = expr.loc;
      parser.state.current.addDependency(dep);
      return true;
    });
  }
}
module.exports = OpenUI5DefineDependencyParserPlugin;