rewiremock
Version:
Advanced dependency mocking device.
100 lines (75 loc) • 3.04 kB
JavaScript
;
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();
}
}
}
};
};