lazy-helpers.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.delay = exports.DelayedConstructor = void 0;
  4. class DelayedConstructor {
  5. constructor(wrap) {
  6. this.wrap = wrap;
  7. this.reflectMethods = [
  8. "get",
  9. "getPrototypeOf",
  10. "setPrototypeOf",
  11. "getOwnPropertyDescriptor",
  12. "defineProperty",
  13. "has",
  14. "set",
  15. "deleteProperty",
  16. "apply",
  17. "construct",
  18. "ownKeys"
  19. ];
  20. }
  21. createProxy(createObject) {
  22. const target = {};
  23. let init = false;
  24. let value;
  25. const delayedObject = () => {
  26. if (!init) {
  27. value = createObject(this.wrap());
  28. init = true;
  29. }
  30. return value;
  31. };
  32. return new Proxy(target, this.createHandler(delayedObject));
  33. }
  34. createHandler(delayedObject) {
  35. const handler = {};
  36. const install = (name) => {
  37. handler[name] = (...args) => {
  38. args[0] = delayedObject();
  39. const method = Reflect[name];
  40. return method(...args);
  41. };
  42. };
  43. this.reflectMethods.forEach(install);
  44. return handler;
  45. }
  46. }
  47. exports.DelayedConstructor = DelayedConstructor;
  48. function delay(wrappedConstructor) {
  49. if (typeof wrappedConstructor === "undefined") {
  50. throw new Error("Attempt to `delay` undefined. Constructor must be wrapped in a callback");
  51. }
  52. return new DelayedConstructor(wrappedConstructor);
  53. }
  54. exports.delay = delay;