{"version":3,"file":"apply-function-replacements.mjs","names":[],"sources":["../../src/utils/apply-function-replacements.ts"],"sourcesContent":["/* eslint-disable ts/no-explicit-any */\nexport type SomeFunction = (...args: unknown[]) => unknown;\n\nexport type OverrideFunction<\n  S,\n  T extends Record<string, any>,\n  K extends keyof T,\n> = (this: S, oldFunction: T[K], ...args: Parameters<T[K]>) => ReturnType<T[K]>;\n\nexport function applyReplacement<\n  S,\n  T extends Record<string, any>,\n  K extends keyof T,\n>(self: S, target: T, key: K, newFunction: OverrideFunction<S, T, K>): void {\n  const oldFunction: T[K] = Reflect.get(target, key);\n\n  // build a new replacement function that is called instead of\n  // the original function\n  // it then purely delegates to \"newFn\", except the first parameter\n  // is additionally the old function.\n  function replacementFunction(\n    this: T,\n    ...args: Parameters<typeof oldFunction>\n  ): ReturnType<typeof oldFunction> {\n    // eslint-disable-next-line ts/no-unsafe-call\n    return newFunction.call(self, oldFunction.bind(this), ...args);\n  }\n\n  // define the new fn as not enumerable\n  Object.defineProperty(target, key, {\n    value: replacementFunction,\n    writable: true,\n    enumerable: false,\n    configurable: true,\n  });\n}\n\nexport type OverrideFunctions<S, T extends Record<string, any>> = {\n  [K in keyof T as T[K] extends (...args: any) => any\n    ? K\n    : never]?: OverrideFunction<S, T, K>;\n};\n\nexport function applyReplacements<S, T extends Record<string, any>>(\n  self: S,\n  target: T,\n  replacements: OverrideFunctions<S, T>,\n): void {\n  for (const [key, newFunction] of Object.entries(replacements)) {\n    // eslint-disable-next-line ts/no-unsafe-argument\n    applyReplacement(self, target, key as any, newFunction as any);\n  }\n}\n"],"mappings":";AASA,SAAgB,iBAId,MAAS,QAAW,KAAQ,aAA8C;CAC1E,MAAM,cAAoB,QAAQ,IAAI,QAAQ,IAAI;CAMlD,SAAS,oBAEP,GAAG,MAC6B;AAEhC,SAAO,YAAY,KAAK,MAAM,YAAY,KAAK,KAAK,EAAE,GAAG,KAAK;;AAIhE,QAAO,eAAe,QAAQ,KAAK;EACjC,OAAO;EACP,UAAU;EACV,YAAY;EACZ,cAAc;EACf,CAAC;;AASJ,SAAgB,kBACd,MACA,QACA,cACM;AACN,MAAK,MAAM,CAAC,KAAK,gBAAgB,OAAO,QAAQ,aAAa,CAE3D,kBAAiB,MAAM,QAAQ,KAAY,YAAmB"}