domHook.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.spyElementPrototype = spyElementPrototype;
  7. exports.spyElementPrototypes = spyElementPrototypes;
  8. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. /* eslint-disable no-param-reassign */
  11. var NO_EXIST = {
  12. __NOT_EXIST: true
  13. };
  14. function spyElementPrototypes(elementClass, properties) {
  15. var propNames = Object.keys(properties);
  16. var originDescriptors = {};
  17. propNames.forEach(function (propName) {
  18. var originDescriptor = Object.getOwnPropertyDescriptor(elementClass.prototype, propName);
  19. originDescriptors[propName] = originDescriptor || NO_EXIST;
  20. var spyProp = properties[propName];
  21. if (typeof spyProp === 'function') {
  22. // If is a function
  23. elementClass.prototype[propName] = function spyFunc() {
  24. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  25. args[_key] = arguments[_key];
  26. }
  27. return spyProp.call.apply(spyProp, [this, originDescriptor].concat(args));
  28. };
  29. } else {
  30. // Otherwise tread as a property
  31. Object.defineProperty(elementClass.prototype, propName, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, spyProp), {}, {
  32. set: function set(value) {
  33. if (spyProp.set) {
  34. return spyProp.set.call(this, originDescriptor, value);
  35. }
  36. return originDescriptor.set(value);
  37. },
  38. get: function get() {
  39. if (spyProp.get) {
  40. return spyProp.get.call(this, originDescriptor);
  41. }
  42. return originDescriptor.get();
  43. },
  44. configurable: true
  45. }));
  46. }
  47. });
  48. return {
  49. mockRestore: function mockRestore() {
  50. propNames.forEach(function (propName) {
  51. var originDescriptor = originDescriptors[propName];
  52. if (originDescriptor === NO_EXIST) {
  53. delete elementClass.prototype[propName];
  54. } else if (typeof originDescriptor === 'function') {
  55. elementClass.prototype[propName] = originDescriptor;
  56. } else {
  57. Object.defineProperty(elementClass.prototype, propName, originDescriptor);
  58. }
  59. });
  60. }
  61. };
  62. }
  63. function spyElementPrototype(Element, propName, property) {
  64. return spyElementPrototypes(Element, (0, _defineProperty2.default)({}, propName, property));
  65. }
  66. /* eslint-enable */