index.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // src/utils.ts
  2. function d(t, e) {
  3. if (!t)
  4. throw new Error(e);
  5. }
  6. function y(t, e) {
  7. return typeof e === t;
  8. }
  9. function w(t) {
  10. return t instanceof Promise;
  11. }
  12. function f(t, e, i) {
  13. Object.defineProperty(t, e, i);
  14. }
  15. // src/spy.ts
  16. var g = /* @__PURE__ */ new Set();
  17. function S(t) {
  18. d(y("function", t) || y("undefined", t), "cannot spy on a non-function value");
  19. let e = function(...o) {
  20. if (e.called = !0, e.callCount++, e.calls.push(o), e.next) {
  21. let [s, l] = e.next;
  22. if (e.results.push(e.next), e.next = null, s === "ok")
  23. return l;
  24. throw l;
  25. }
  26. let r, n = "ok";
  27. if (e.impl)
  28. try {
  29. r = e.impl.apply(this, o), n = "ok";
  30. } catch (s) {
  31. throw r = s, n = "error", e.results.push([n, s]), s;
  32. }
  33. let c = [n, r];
  34. if (w(r)) {
  35. let s = r.then((l) => c[1] = l).catch((l) => {
  36. throw c[0] = "error", c[1] = l, l;
  37. });
  38. Object.assign(s, r), r = s;
  39. }
  40. return e.results.push(c), r;
  41. };
  42. f(e, "_isMockFunction", { get: () => !0 }), f(e, "length", { value: t ? t.length : 0 }), f(e, "returns", {
  43. get() {
  44. return this.results.map(([, o]) => o);
  45. }
  46. }), f(e, "name", { value: t && t.name || "spy" });
  47. let i = () => {
  48. e.called = !1, e.callCount = 0, e.results = [], e.calls = [];
  49. };
  50. return i(), e.impl = t, e.reset = i, e.nextError = (o) => (e.next = ["error", o], e), e.nextResult = (o) => (e.next = ["ok", o], e), e;
  51. }
  52. // src/spyOn.ts
  53. var v = (t, e) => Object.getOwnPropertyDescriptor(t, e);
  54. function C(t, e, i) {
  55. d(!y("undefined", t), "spyOn could not find an object to spy upon"), d(y("object", t) || y("function", t), "cannot spyOn on a primitive value");
  56. let o = () => {
  57. if (typeof e != "object")
  58. return [e, "value"];
  59. if ("getter" in e && "setter" in e)
  60. throw new Error("cannot spy on both getter and setter");
  61. if ("getter" in e)
  62. return [e.getter, "get"];
  63. if ("setter" in e)
  64. return [e.setter, "set"];
  65. throw new Error("specify getter or setter to spy on");
  66. }, [r, n] = o(), c = v(t, r), s = Object.getPrototypeOf(t), l = s && v(s, r), a = c || l;
  67. d(a || r in t, `${String(r)} does not exist`);
  68. let T = !1;
  69. n === "value" && a && !a.value && a.get && (n = "get", T = !0, i = a.get());
  70. let u;
  71. a ? u = a[n] : n !== "value" ? u = () => t[r] : u = t[r], i || (i = u);
  72. let p = S(i), A = (m) => {
  73. let { value: O, ...h } = a || {
  74. configurable: !0,
  75. writable: !0
  76. };
  77. n !== "value" && delete h.writable, h[n] = m, f(t, r, h);
  78. }, k = () => A(u);
  79. return p.restore = k, p.getOriginal = () => T ? u() : u, p.willCall = (m) => (p.impl = m, p), A(T ? () => p : p), g.add(p), p;
  80. }
  81. // src/restoreAll.ts
  82. function q() {
  83. for (let t of g)
  84. t.restore();
  85. g.clear();
  86. }
  87. export {
  88. q as restoreAll,
  89. g as spies,
  90. S as spy,
  91. C as spyOn
  92. };