UNPKG

rewiremock

Version:

Advanced dependency mocking device.

90 lines (70 loc) 2.84 kB
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } 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 = Symbol('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(_toConsumableArray(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(); } } } }; };