{"version":3,"file":"index.cjs","names":[],"sources":["../src/mockDeepFn.ts","../src/mockFn.ts"],"sourcesContent":["import { mock, type Mock } from \"bun:test\";\nimport type { DeepMockProxy } from \"./types\";\n\nexport const mockDeepFn = <T extends object>(): DeepMockProxy<T> => {\n  const createDeepMock = <U extends object>(): DeepMockProxy<U> => {\n    const mocks = new Map<string | symbol, any>();\n\n    return new Proxy({} as DeepMockProxy<U>, {\n      get: (target, prop) => {\n        if (!mocks.has(prop)) {\n          const hybridMock = createHybridMock();\n          mocks.set(prop, hybridMock);\n        }\n        return mocks.get(prop);\n      },\n    });\n  };\n\n  const createHybridMock = () => {\n    const regularMock = mock();\n    const deepMock = createDeepMock();\n\n    return new Proxy(regularMock, {\n      get: (target, prop) => {\n        // If accessing mock methods, return bound methods to preserve 'this' context\n        if (typeof prop === \"string\" && prop.startsWith(\"mock\")) {\n          const method = target[prop as keyof Mock<any>];\n          // Bind the method to the original mock to preserve 'this' context\n          return typeof method === \"function\" ? method.bind(target) : method;\n        }\n\n        // Add spy() method to access the underlying mock for test assertions\n        if (prop === \"spy\") {\n          return () => target;\n        }\n\n        // For other properties, use the deep mock\n        return (deepMock as any)[prop];\n      },\n\n      apply: (target, thisArg, args) => {\n        // When called as a function, use the regular mock with proper context\n        return target.apply(target, args); // Use target as thisArg to maintain mock context\n      },\n    });\n  };\n\n  return createDeepMock<T>();\n};\n","import { type Mock, mock } from \"bun:test\";\nimport type { MockProxy } from \"./types\";\n\nexport const mockFn = <T>(): MockProxy<T> => {\n  const mocks = new Map<string | symbol, Mock<any>>();\n\n  return new Proxy({} as MockProxy<T>, {\n    get: (_, prop) => {\n      if (!mocks.has(prop)) {\n        const regularMock = mock();\n\n        // Create a proxy that adds the .spy() method\n        const mockWithSpy = new Proxy(regularMock, {\n          get: (target, spyProp) => {\n            if (spyProp === \"spy\") {\n              return () => target;\n            }\n\n            // For all other properties, return from the actual mock\n            const value = target[spyProp as keyof Mock<any>];\n            return typeof value === \"function\" ? value.bind(target) : value;\n          },\n          apply: (target, thisArg, args) => {\n            return target.apply(target, args);\n          },\n        });\n\n        mocks.set(prop, mockWithSpy);\n      }\n      return mocks.get(prop);\n    },\n  });\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAa,mBAAuD;CAClE,MAAM,uBAA2D;EAC/D,MAAM,wBAAQ,IAAI;AAElB,SAAO,IAAI,MAAM,IAAwB,EACvC,MAAM,QAAQ,SAAS;AACrB,OAAI,CAAC,MAAM,IAAI,OAAO;IACpB,MAAM,aAAa;AACnB,UAAM,IAAI,MAAM;;AAElB,UAAO,MAAM,IAAI;;;CAKvB,MAAM,yBAAyB;EAC7B,MAAM;EACN,MAAM,WAAW;AAEjB,SAAO,IAAI,MAAM,aAAa;GAC5B,MAAM,QAAQ,SAAS;AAErB,QAAI,OAAO,SAAS,YAAY,KAAK,WAAW,SAAS;KACvD,MAAM,SAAS,OAAO;AAEtB,YAAO,OAAO,WAAW,aAAa,OAAO,KAAK,UAAU;;AAI9D,QAAI,SAAS,MACX,cAAa;AAIf,WAAQ,SAAiB;;GAG3B,QAAQ,QAAQ,SAAS,SAAS;AAEhC,WAAO,OAAO,MAAM,QAAQ;;;;AAKlC,QAAO;;;;;AC5CT,MAAa,eAAgC;CAC3C,MAAM,wBAAQ,IAAI;AAElB,QAAO,IAAI,MAAM,IAAoB,EACnC,MAAM,GAAG,SAAS;AAChB,MAAI,CAAC,MAAM,IAAI,OAAO;GACpB,MAAM;GAGN,MAAM,cAAc,IAAI,MAAM,aAAa;IACzC,MAAM,QAAQ,YAAY;AACxB,SAAI,YAAY,MACd,cAAa;KAIf,MAAM,QAAQ,OAAO;AACrB,YAAO,OAAO,UAAU,aAAa,MAAM,KAAK,UAAU;;IAE5D,QAAQ,QAAQ,SAAS,SAAS;AAChC,YAAO,OAAO,MAAM,QAAQ;;;AAIhC,SAAM,IAAI,MAAM;;AAElB,SAAO,MAAM,IAAI"}