All files / dist/helpers wrapper.js

86.57% Statements 58/67
81.13% Branches 43/53
87.5% Functions 7/8
98.25% Lines 56/57
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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127    1x     1x   1x   1x   1x   1x   1x   1x   2x                       59x   59x   59x   59x       59x 12x 12x 10x 2x 2x           57x 57x 3x 3x 3x 3x 38x 3x   38x 37x   1x     3x 1x   3x     57x   1x     57x   48x 9x   4x   4x 21x 1x 1x 1x   1x       20x       4x           4x     57x 14x     57x       1x       57x 54x 54x     57x  
'use strict';
 
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.wrap = wrap;
 
var _babelTypes = require('babel-types');
 
var t = _interopRequireWildcard(_babelTypes);
 
var _templates = require('./templates');
 
var th = _interopRequireWildcard(_templates);
 
var _ast = require('./ast');
 
var _exports = require('./exports');
 
function _interopRequireWildcard(obj) { Eif (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
function wrap(visitor, programNode, opts) {
 
  let {
    defaultExport,
    defaultExportDeclaration,
    exportGlobal,
    firstImport,
    injectDynamicImportHelper,
    imports,
    namedExports
  } = visitor;
 
  let { body } = programNode;
 
  let allExportHelperAdded = false;
 
  opts.collapse = !opts.noExportCollapse;
  // opts.extend = !opts.noExportExtend
 
  // Before adding anything, see if the named exports can be collapsed into the default export.
  if (defaultExport && namedExports.length && opts.collapse) {
    let filteredExports = (0, _exports.collapseNamedExports)(programNode, defaultExportDeclaration, namedExports, opts);
    if (!filteredExports.length) {
      namedExports = [];
    } else Eif (!opts.allowUnsafeMixedExports) {
      throw new Error(`Unsafe mixing of default and named exports. The following named exports can't be collapsed or ignored: \n(${ (0, _ast.getPropNames)(filteredExports).join(', ') }).`);
    }
  }
 
  // If the noWrapBeforeImport opt is set, split any code before the first define and afterwards into separate arrays.
  // This should be done before any interops or other vars are injected.
  const preDefine = [];
  if (opts.noWrapBeforeImport && firstImport) {
    let reachedFirstImport = false;
    const fullBody = body;
    const newBody = [];
    for (const item of fullBody) {
      if (item === firstImport) {
        reachedFirstImport = true;
      }
      if (reachedFirstImport) {
        newBody.push(item);
      } else {
        preDefine.push(item);
      }
    }
    if (preDefine.length && !hasUseStrict(programNode)) {
      programNode.directives = [t.directive(t.directiveLiteral('use strict')), ...(programNode.directives || [])];
    }
    body = newBody;
  }
 
  if (injectDynamicImportHelper) {
    // import() to sap.ui.require() w/ promise and interop
    body.unshift(th.buildDynamicImportHelper());
  }
 
  if (!namedExports.length && defaultExport) {
    // If there's no named exports, return the default export
    body.push(t.returnStatement(defaultExport));
  } else if (namedExports.length) {
 
    body.unshift(...[th.buildDeclareExports()]);
 
    for (const namedExport of namedExports) {
      if (namedExport.all) {
        Eif (!allExportHelperAdded) {
          body.push(th.buildAllExportHelper());
          allExportHelperAdded = true;
        }
        body.push(th.buildAllExport({
          LOCAL: namedExport.value
        }));
      } else {
        body.push(th.buildNamedExport(namedExport));
      }
    }
 
    Iif (defaultExport) {
      body.push(th.buildNamedExport({
        key: t.identifier('default'),
        value: defaultExport
      }));
    }
    body.push(t.returnStatement(th.exportsIdentifier));
  }
 
  if (imports.some(imp => imp.interop)) {
    body.unshift(th.buildDefaultImportInterop());
  }
 
  programNode.body = [...preDefine, generateDefine(body, imports, exportGlobal || opts.exportAllGlobal)];
}
 
function hasUseStrict(node) {
  return (node.directives || []).some(directive => directive.value.value === 'use strict');
}
 
function generateDefine(body, imports, exportGlobal) {
  const defineOpts = {
    SOURCES: imports.map(i => t.stringLiteral(i.src)),
    PARAMS: imports.map(i => t.identifier(i.tmpName)),
    BODY: body
  };
  return exportGlobal ? th.buildDefineGlobal(defineOpts) : th.buildDefine(defineOpts);
}