UNPKG

rewiremock

Version:

Advanced dependency mocking device.

100 lines (75 loc) 3.04 kB
'use strict'; var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _symbol = require('babel-runtime/core-js/symbol'); var _symbol2 = _interopRequireDefault(_symbol); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var templateOptions = { placeholderPattern: /^([A-Z0-9]+)([A-Z0-9_]+)$/ }; var REWIREMOCK_GLOBAL = { name: 'rewiremock' }; var isRewiremock = function isRewiremock(expr) { var callee = expr.get('callee'); if (!callee.node) { return false; } var object = callee.get('object'); return callee.isIdentifier(REWIREMOCK_GLOBAL) || callee.isMemberExpression() && isRewiremock(object); }; module.exports = function (args) { var template = args.template; var enable = template('rewiremock.enable();\n', templateOptions); var disable = template('rewiremock.disable();global["_REWIREMOCK_HOISTED_"] = [];\n', templateOptions); var registrations = template('(function rwrmck(){\n global["_REWIREMOCK_HOISTED_"] = global["_REWIREMOCK_HOISTED_"] || [];\n global["_REWIREMOCK_HOISTED_"].push(function(rewiremock){ \n MOCKS \n });\n})(\'rwrmck\');', templateOptions); var REGISTRATIONS = (0, _symbol2.default)('registrations'); return { visitor: { Program: { enter: function enter(_ref) { var node = _ref.node; node[REGISTRATIONS] = { imports: [], mocks: [] }; }, exit: function exit(_ref2) { var node = _ref2.node; var _node$REGISTRATIONS = node[REGISTRATIONS], imports = _node$REGISTRATIONS.imports, mocks = _node$REGISTRATIONS.mocks; if (mocks.length) { var hasImportsTransformed = imports.some(function (_ref3) { var node = _ref3.node; return !node; }); if (hasImportsTransformed) { throw new Error('rewiremock: another plugin transformed `imports`. Please hoist rewiremock/babel, see https://github.com/theKashey/rewiremock/issues/102'); } var mocker = registrations({ MOCKS: [].concat((0, _toConsumableArray3.default)(mocks), [enable()]) }); node.body.push(mocker); mocker._blockHoist = Infinity; imports[imports.length - 1].insertAfter(disable()); } } }, ImportDeclaration: function ImportDeclaration(path) { path.parent[REGISTRATIONS].imports.push(path); }, ExpressionStatement: function ExpressionStatement(path) { if (!path.parent[REGISTRATIONS]) { return false; } var expr = path.get('expression'); if (!expr.isCallExpression()) { return false; } if (isRewiremock(expr)) { path.parent[REGISTRATIONS].mocks.push(path.node); path.remove(); } } } }; };