vitest-auto-spy 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auto-spy.ts"],"names":["stringify","ReplaySubject","from","concatMap","of","delay","takeWhile","timer","switchMap","throwError","EMPTY","merge","takeUntil","take","defer","vi","TestBed"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * vitest-auto-spy\n * ===============\n *\n * Create automatic, fully-typed test spies from a class — powered by Vitest's\n * `vi.fn()`. A drop-in replacement for [`jest-auto-spies`](https://www.npmjs.com/package/jest-auto-spies),\n * with the exact same API surface but spying only on Vitest.\n *\n * ```ts\n * import { createSpyFromClass, provideAutoSpy } from 'vitest-auto-spy';\n * ```\n *\n * --------------------------------------------------------------------------\n * ## createSpyFromClass — the core\n * --------------------------------------------------------------------------\n *\n * ```ts\n * let myService: Spy<MyService>;\n *\n * beforeEach(() => {\n * // every method of MyService becomes a vi.fn()\n * myService = createSpyFromClass(MyService);\n * });\n * ```\n *\n * Restrict what gets spied, or add observable/getter/setter spies:\n *\n * ```ts\n * createSpyFromClass(MyService, ['getName', 'getAge']);\n *\n * createSpyFromClass(MyService, {\n * methodsToSpyOn: ['getName'],\n * observablePropsToSpyOn: ['products$'],\n * gettersToSpyOn: ['userName'],\n * settersToSpyOn: ['userName'],\n * });\n * ```\n *\n * --------------------------------------------------------------------------\n * ## Synchronous methods\n * --------------------------------------------------------------------------\n *\n * ```ts\n * // standard vi.fn() API\n * myService.getName.mockReturnValue('Fake Name');\n *\n * // conditional return by arguments\n * myService.getName.calledWith(1).mockReturnValue('Fake Name');\n *\n * // throw if called with the \"wrong\" arguments\n * myService.getName.mustBeCalledWith(1).mockReturnValue('Fake Name');\n * ```\n *\n * --------------------------------------------------------------------------\n * ## Promise-returning methods\n * --------------------------------------------------------------------------\n *\n * ```ts\n * myService.getProducts.resolveWith([{ name: 'Product 1' }]);\n * myService.getProducts.rejectWith('FAKE ERROR');\n *\n * myService.getProducts.calledWith(1).resolveWith([{ name: 'Product 1' }]);\n * ```\n *\n * --------------------------------------------------------------------------\n * ## Observable-returning methods / observable properties\n * --------------------------------------------------------------------------\n *\n * ```ts\n * myService.getProducts$.nextWith([{ name: 'Product 1' }]); // emit, stays open\n * myService.getProducts$.nextOneTimeWith([{ name: 'X' }]); // emit + complete\n * myService.getProducts$.throwWith('FAKE ERROR'); // error the stream\n * myService.getProducts$.complete(); // complete the stream\n *\n * // emit a precise sequence (values, errors, completion, delays)\n * myService.getProducts$.nextWithValues([\n * { value: [{ name: 'Product 1' }] },\n * { errorValue: 'FAKE ERROR' },\n * { complete: true },\n * ]);\n *\n * // grab the underlying Subject for manual control\n * const subject = myService.getProducts$.returnSubject();\n * ```\n *\n * --------------------------------------------------------------------------\n * ## Getters & setters\n * --------------------------------------------------------------------------\n *\n * ```ts\n * const spy = createSpyFromClass(MyService, {\n * gettersToSpyOn: ['userName'],\n * settersToSpyOn: ['userName'],\n * });\n *\n * spy.accessorSpies.getters.userName.mockReturnValue('Fake Name');\n * expect(spy.userName).toBe('Fake Name');\n *\n * spy.userName = 'New Name';\n * expect(spy.accessorSpies.setters.userName).toHaveBeenCalledWith('New Name');\n * ```\n *\n * --------------------------------------------------------------------------\n * ## Angular helpers (bonus)\n * --------------------------------------------------------------------------\n *\n * ```ts\n * TestBed.configureTestingModule({\n * providers: [provideAutoSpy(MyService)],\n * });\n *\n * const service = injectSpy(MyService);\n *\n * // signals / readonly / accessor property mocking\n * mockReadonlyProp(service, 'isReady', true);\n * mockReadonlyPropGetter(service, 'label', () => 'A');\n * mockAccessorsProp(service, 'theme');\n * ```\n */\n\nimport { defer, EMPTY, from, merge, Observable, of, ReplaySubject, Subject, throwError, timer } from 'rxjs';\nimport { concatMap, delay, switchMap, take, takeUntil, takeWhile } from 'rxjs/operators';\nimport { TestBed } from '@angular/core/testing';\nimport { stringify } from 'javascript-stringify';\nimport { type Mock, type MockInstance, vi } from 'vitest';\n\n// ===========================================================================\n// Shared types (mirrors @hirez_io/auto-spies-core)\n// ===========================================================================\n\nexport type Func = (...args: any[]) => any;\n\nexport type ClassType<T> = { new (...args: any[]): T; [key: string]: any };\n\ntype StringKeysForPropertyType<ObjectType, PropType> = Extract<\n { [Key in keyof ObjectType]: ObjectType[Key] extends PropType ? Key : never }[keyof ObjectType],\n string\n>;\n\nexport type OnlyMethodKeysOf<T> = StringKeysForPropertyType<T, (...args: any[]) => any>;\nexport type OnlyObservablePropsOf<T> = StringKeysForPropertyType<T, Observable<any>>;\nexport type OnlyPropsOf<ObjectType> = Extract<\n { [Key in keyof ObjectType]: ObjectType[Key] extends Func ? never : Key }[keyof ObjectType],\n string\n>;\n\nexport type ValueConfigPerCall<T> = { value: T; delay?: number; doNotComplete?: boolean };\n\nexport type NextValueConfig<T> = { value: T; delay?: number };\nexport type ErrorValueConfig = { errorValue: any; delay?: number };\nexport type CompleteValueConfig = { complete?: boolean; delay?: number };\nexport type ValueConfig<T> = NextValueConfig<T> | ErrorValueConfig | CompleteValueConfig;\n\nexport interface AddObservableSpyMethods<T> {\n nextWith(value?: T): void;\n /** emit one value then complete */\n nextOneTimeWith(value?: T): void;\n nextWithValues(valuesConfigs: ValueConfig<T>[]): void;\n nextWithPerCall(valuesPerCall?: ValueConfigPerCall<T>[]): Subject<T>[];\n throwWith(value: any): void;\n complete(): void;\n returnSubject(): Subject<T>;\n}\n\nexport interface AddPromiseSpyMethods<T> {\n resolveWith(value?: T): void;\n rejectWith(value?: any): void;\n resolveWithPerCall(valuesPerCall: ValueConfigPerCall<T>[]): void;\n}\n\nexport interface AddCalledWithSpyMethods<Method extends Func> {\n calledWith(...args: Parameters<Method>): { mockReturnValue: (value: ReturnType<Method>) => void };\n mustBeCalledWith(...args: Parameters<Method>): { mockReturnValue: (value: ReturnType<Method>) => void };\n}\n\ntype AddCalledWithObservable<O> = {\n calledWith(...args: any[]): AddObservableSpyMethods<O>;\n mustBeCalledWith(...args: any[]): AddObservableSpyMethods<O>;\n};\ntype AddCalledWithPromise<P> = {\n calledWith(...args: any[]): AddPromiseSpyMethods<P>;\n mustBeCalledWith(...args: any[]): AddPromiseSpyMethods<P>;\n};\n\n/** Wrap a method's spy with helpers chosen by its return type. */\nexport type AddSpyMethodsByReturnTypes<Method extends Func> = Method &\n Mock &\n (Method extends (...args: any[]) => infer ReturnType\n ? ReturnType extends Promise<infer P>\n ? AddPromiseSpyMethods<P> & AddCalledWithPromise<P>\n : ReturnType extends Observable<infer O>\n ? AddObservableSpyMethods<O> & AddCalledWithObservable<O>\n : AddCalledWithSpyMethods<Method>\n : never);\n\nexport type AddAccessorsSpies<T> = {\n accessorSpies: {\n getters: { [K in keyof T]: Mock };\n setters: { [K in keyof T]: Mock };\n };\n};\n\n/** Fully-typed spy of `T`. */\nexport type Spy<T> = {\n [K in keyof T]: T[K] extends Func\n ? AddSpyMethodsByReturnTypes<T[K]>\n : T[K] extends Observable<infer O>\n ? T[K] & AddObservableSpyMethods<O>\n : T[K];\n} & AddAccessorsSpies<T>;\n\nexport interface ClassSpyConfiguration<T> {\n methodsToSpyOn?: OnlyMethodKeysOf<T>[];\n observablePropsToSpyOn?: OnlyObservablePropsOf<T>[];\n settersToSpyOn?: OnlyPropsOf<T>[];\n gettersToSpyOn?: OnlyPropsOf<T>[];\n}\n\n// ===========================================================================\n// ArgsMap — serialize argument lists into stable keys\n// ===========================================================================\n\nclass ArgsMap {\n private map: { [key: string]: any } = {};\n\n // `stringify` always serializes an argument array to a string, so the cast is safe.\n set(key: unknown, value: unknown): void {\n this.map[stringify(key) as string] = value;\n }\n\n get(key: unknown): any {\n return this.map[stringify(key) as string];\n }\n}\n\n// ===========================================================================\n// Error handler — used by mustBeCalledWith\n// ===========================================================================\n\nexport const errorHandler = {\n throwArgumentsError(actualArgs: any[], functionName: string): void {\n let errorMessage =\n `The function '${functionName}' was configured with 'mustBeCalledWith' ` +\n `and expects to be called with specific arguments. `;\n\n if (actualArgs.length === 0) {\n errorMessage += `But the function was called without any arguments.`;\n } else {\n let formattedArgs = stringify(actualArgs) as string;\n formattedArgs = formattedArgs.substring(1, formattedArgs.length - 1);\n errorMessage += `But the actual arguments were: ${formattedArgs}`;\n }\n\n throw new Error(errorMessage);\n },\n};\n\n// ===========================================================================\n// Internal value containers\n// ===========================================================================\n\ninterface ReturnValueContainer {\n value: any;\n _isRejectedPromise?: boolean;\n valuesPerCalls?: { wrappedValue: Promise<any> | Observable<any>; delay?: number }[];\n}\n\ninterface CalledWithObject {\n wasConfigured: boolean;\n argsToValuesMap: ArgsMap;\n [extra: string]: any;\n}\n\n// ===========================================================================\n// Observable helpers\n// ===========================================================================\n\nfunction createReplaySubject<T>(): ReplaySubject<T> {\n return new ReplaySubject<T>(1);\n}\n\nfunction mergeSubjectWithDefaultValues<T>(\n subject: ReplaySubject<T>,\n valuesConfigs: ValueConfig<T>[],\n): Observable<T> {\n const onCompleteSubject = new ReplaySubject<void>(1);\n const results$ = from(valuesConfigs).pipe(\n concatMap((valueConfig) => {\n if ('complete' in valueConfig && valueConfig.complete && valueConfig.delay) {\n return of(valueConfig).pipe(delay(valueConfig.delay));\n }\n return of(valueConfig);\n }),\n takeWhile((valueConfig) => {\n if (!('complete' in valueConfig)) {\n return true;\n }\n if (valueConfig.complete) {\n onCompleteSubject.next();\n return false;\n }\n return true;\n }),\n concatMap((valueConfig) => {\n if ('value' in valueConfig && valueConfig.value) {\n if (valueConfig.delay) {\n return of(valueConfig.value).pipe(delay(valueConfig.delay));\n }\n return of(valueConfig.value);\n }\n if ('errorValue' in valueConfig && valueConfig.errorValue) {\n if (valueConfig.delay) {\n return timer(valueConfig.delay).pipe(switchMap(() => throwError(() => valueConfig.errorValue)));\n }\n return throwError(() => valueConfig.errorValue);\n }\n return EMPTY;\n }),\n );\n return merge(results$, subject.pipe(takeUntil(onCompleteSubject)));\n}\n\nfunction addObservableHelpers<T>(\n objectToDecorate: any,\n providedSubject: ReplaySubject<T>,\n onSubjectConfigured: (subject: Observable<T>) => void,\n): void {\n objectToDecorate.nextWith = (value: T): void => {\n providedSubject.next(value);\n onSubjectConfigured(providedSubject);\n };\n objectToDecorate.nextOneTimeWith = (value: T): void => {\n providedSubject.next(value);\n providedSubject.complete();\n onSubjectConfigured(providedSubject);\n };\n objectToDecorate.nextWithValues = (valuesConfigs: ValueConfig<T>[]): void => {\n if (valuesConfigs.length === 0) {\n return;\n }\n onSubjectConfigured(mergeSubjectWithDefaultValues(providedSubject, valuesConfigs));\n };\n objectToDecorate.throwWith = (value: any): void => {\n providedSubject.error(value);\n onSubjectConfigured(providedSubject);\n };\n objectToDecorate.complete = (): void => {\n providedSubject.complete();\n onSubjectConfigured(providedSubject);\n };\n objectToDecorate.returnSubject = (): ReplaySubject<T> => {\n onSubjectConfigured(providedSubject);\n return providedSubject;\n };\n}\n\nfunction addNextWithPerCall(\n objectToDecorate: any,\n returnValueContainer: ReturnValueContainer,\n onConfigured: (c: ReturnValueContainer) => void = () => undefined,\n): void {\n objectToDecorate.nextWithPerCall = (valueConfigsPerCall: ValueConfigPerCall<any>[]): ReplaySubject<any>[] => {\n const returnedSubjects: ReplaySubject<any>[] = [];\n if (valueConfigsPerCall.length === 0) {\n return returnedSubjects;\n }\n returnValueContainer.valuesPerCalls = [];\n valueConfigsPerCall.forEach((valueConfiguration) => {\n const replaySubject = new ReplaySubject<any>(1);\n replaySubject.next(valueConfiguration.value);\n returnedSubjects.push(replaySubject);\n\n let returnedObservable: Observable<any> = replaySubject.asObservable();\n if (valueConfiguration.delay) {\n returnedObservable = returnedObservable.pipe(delay(valueConfiguration.delay));\n }\n if (!valueConfiguration.doNotComplete) {\n returnedObservable = returnedObservable.pipe(take(1));\n }\n returnValueContainer.valuesPerCalls!.push({ wrappedValue: returnedObservable });\n });\n onConfigured(returnValueContainer);\n return returnedSubjects;\n };\n}\n\nfunction addObservableHelpersToFunctionSpy(spyFunction: any, valueContainer: ReturnValueContainer): void {\n const subject = createReplaySubject();\n addObservableHelpers(spyFunction, subject, (configuredSubject) => {\n valueContainer.value = configuredSubject;\n });\n addNextWithPerCall(spyFunction, valueContainer);\n}\n\nfunction addObservableHelpersToCalledWithObject(calledWithObject: CalledWithObject, calledWithArgs: any[]): void {\n const subject = createReplaySubject();\n const returnValueContainer: ReturnValueContainer = { value: undefined };\n addObservableHelpers(calledWithObject, subject, (configuredSubject) => {\n returnValueContainer.value = configuredSubject;\n calledWithObject.argsToValuesMap.set(calledWithArgs, returnValueContainer);\n });\n addNextWithPerCall(calledWithObject, returnValueContainer, (configured) => {\n calledWithObject.argsToValuesMap.set(calledWithArgs, configured);\n });\n}\n\n/** Build a standalone Observable that emits the provided value configs. */\nexport function createObservableWithValues<T>(valuesConfigs: ValueConfig<T>[]): Observable<T>;\nexport function createObservableWithValues<T>(\n valuesConfigs: ValueConfig<T>[],\n config: { returnSubject: true },\n): { values$: Observable<T>; subject: ReplaySubject<T> };\nexport function createObservableWithValues<T>(\n valuesConfigs: ValueConfig<T>[],\n config?: { returnSubject: boolean },\n): Observable<T> | { values$: Observable<T>; subject: ReplaySubject<T> } {\n const subject = createReplaySubject<T>();\n const values$ = mergeSubjectWithDefaultValues(subject, valuesConfigs);\n if (config && config.returnSubject) {\n return { values$, subject };\n }\n return values$;\n}\n\n/** Create an observable property spy (deferred subscription to a controllable subject). */\nfunction createObservablePropSpy<T>(): Observable<T> & AddObservableSpyMethods<T> {\n let subject = createReplaySubject<T>();\n const observableSpy: any = defer(() => subject);\n addObservableHelpers(observableSpy, subject, (configuredSubject) => {\n subject = configuredSubject as ReplaySubject<T>;\n });\n return observableSpy;\n}\n\n// ===========================================================================\n// Promise helpers\n// ===========================================================================\n\nfunction addPromiseHelpersToFunctionSpy(spyFunction: any, valueContainer: ReturnValueContainer): void {\n spyFunction.resolveWith = (value?: any): void => {\n valueContainer.value = Promise.resolve(value);\n };\n spyFunction.rejectWith = (value?: any): void => {\n valueContainer.value = value;\n valueContainer._isRejectedPromise = true;\n };\n spyFunction.resolveWithPerCall = (valueConfigsPerCall: ValueConfigPerCall<any>[]): void => {\n if (valueConfigsPerCall.length === 0) {\n return;\n }\n valueContainer.valuesPerCalls = [];\n valueConfigsPerCall.forEach((valueConfiguration) => {\n valueContainer.valuesPerCalls!.push({\n wrappedValue: Promise.resolve(valueConfiguration.value),\n delay: valueConfiguration.delay,\n });\n });\n };\n}\n\nfunction addPromiseHelpersToCalledWithObject(calledWithObject: CalledWithObject, calledWithArgs: any[]): void {\n calledWithObject.resolveWith = (value?: any): void => {\n calledWithObject.argsToValuesMap.set(calledWithArgs, { value: Promise.resolve(value) });\n };\n calledWithObject.rejectWith = (value?: any): void => {\n calledWithObject.argsToValuesMap.set(calledWithArgs, { value, _isRejectedPromise: true });\n };\n calledWithObject.resolveWithPerCall = (valueConfigsPerCall: ValueConfigPerCall<any>[]): void => {\n if (valueConfigsPerCall.length === 0) {\n return;\n }\n const valueContainer: ReturnValueContainer = { value: undefined, valuesPerCalls: [] };\n valueConfigsPerCall.forEach((valueConfiguration) => {\n valueContainer.valuesPerCalls!.push({\n wrappedValue: Promise.resolve(valueConfiguration.value),\n delay: valueConfiguration.delay,\n });\n });\n calledWithObject.argsToValuesMap.set(calledWithArgs, valueContainer);\n };\n}\n\n// ===========================================================================\n// Function spy factory\n// ===========================================================================\n\nfunction getNextCallValue(valueContainer: ReturnValueContainer): any {\n const wrapped = valueContainer.valuesPerCalls!.shift();\n let returnedValue = wrapped?.wrappedValue;\n if (wrapped && wrapped.delay) {\n returnedValue = (returnedValue as Promise<any>).then(\n (value) => new Promise((resolve) => setTimeout(() => resolve(value), wrapped.delay)),\n );\n }\n return returnedValue;\n}\n\nfunction returnTheCorrectFakeValue(\n calledWithObject: CalledWithObject,\n mustBeCalledWithObject: CalledWithObject,\n valueContainer: ReturnValueContainer,\n actualArgs: any[],\n functionName: string,\n): any {\n if (calledWithObject.wasConfigured) {\n const configured = calledWithObject.argsToValuesMap.get(actualArgs);\n if (configured) {\n return unwrapContainer(configured);\n }\n }\n\n if (mustBeCalledWithObject.wasConfigured) {\n const configured = mustBeCalledWithObject.argsToValuesMap.get(actualArgs);\n if (configured) {\n return unwrapContainer(configured);\n }\n errorHandler.throwArgumentsError(actualArgs, functionName);\n }\n\n return unwrapContainer(valueContainer);\n}\n\nfunction unwrapContainer(container: ReturnValueContainer): any {\n if (container._isRejectedPromise) {\n return Promise.reject(container.value);\n }\n if (container.valuesPerCalls?.length) {\n return getNextCallValue(container);\n }\n return container.value;\n}\n\nfunction addMethodsToCalledWith(calledWith: CalledWithObject, calledWithArgs: any[]): CalledWithObject {\n calledWith.wasConfigured = true;\n calledWith.mockReturnValue = (value: any): void => {\n calledWith.argsToValuesMap.set(calledWithArgs, { value });\n };\n addPromiseHelpersToCalledWithObject(calledWith, calledWithArgs);\n addObservableHelpersToCalledWithObject(calledWith, calledWithArgs);\n return calledWith;\n}\n\n/** Create a single Vitest-backed function spy with all return-type helpers attached. */\nexport function createFunctionSpy<FunctionType extends Func>(name: string): AddSpyMethodsByReturnTypes<FunctionType> {\n const calledWithObject: CalledWithObject = { wasConfigured: false, argsToValuesMap: new ArgsMap() };\n const mustBeCalledWithObject: CalledWithObject = { wasConfigured: false, argsToValuesMap: new ArgsMap() };\n const valueContainer: ReturnValueContainer = { value: undefined };\n\n const functionSpy = vi.fn((...actualArgs: any[]) =>\n returnTheCorrectFakeValue(calledWithObject, mustBeCalledWithObject, valueContainer, actualArgs, name),\n );\n functionSpy.mockName(name);\n\n addPromiseHelpersToFunctionSpy(functionSpy, valueContainer);\n addObservableHelpersToFunctionSpy(functionSpy, valueContainer);\n\n (functionSpy as any).calledWith = (...calledWithArgs: any[]) =>\n addMethodsToCalledWith(calledWithObject, calledWithArgs);\n (functionSpy as any).mustBeCalledWith = (...calledWithArgs: any[]) =>\n addMethodsToCalledWith(mustBeCalledWithObject, calledWithArgs);\n\n return functionSpy as unknown as AddSpyMethodsByReturnTypes<FunctionType>;\n}\n\n// ===========================================================================\n// Accessor (getter / setter) spies\n// ===========================================================================\n\nfunction defineWithEmptyAccessors(obj: any, prop: string): void {\n Object.defineProperty(obj, prop, {\n get() {\n return undefined;\n },\n set(_value: unknown) {\n /* noop */\n },\n configurable: true,\n });\n}\n\nfunction accessorSpyFactory(autoSpy: any, accessorName: string, accessorType: 'getter' | 'setter'): MockInstance {\n if (accessorType === 'setter') {\n return vi.spyOn(autoSpy, accessorName as never, 'set');\n }\n return vi.spyOn(autoSpy, accessorName as never, 'get');\n}\n\nfunction createAccessorsSpies(autoSpy: any, gettersToSpyOn: string[], settersToSpyOn: string[]): void {\n autoSpy.accessorSpies = { getters: {}, setters: {} };\n\n gettersToSpyOn.forEach((getterName) => {\n defineWithEmptyAccessors(autoSpy, getterName);\n autoSpy.accessorSpies.getters[getterName] = accessorSpyFactory(autoSpy, getterName, 'getter');\n });\n\n settersToSpyOn.forEach((setterName) => {\n if (!Object.prototype.hasOwnProperty.call(autoSpy, setterName)) {\n defineWithEmptyAccessors(autoSpy, setterName);\n }\n autoSpy.accessorSpies.setters[setterName] = accessorSpyFactory(autoSpy, setterName, 'setter');\n });\n}\n\n// ===========================================================================\n// createSpyFromClass — assemble the full auto-spy\n// ===========================================================================\n\nfunction extractMethodsFromObject(obj: any): string[] {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n return Object.keys(descriptors).reduce<string[]>((names, name) => {\n if (name !== 'constructor' && !descriptors[name].get) {\n names.push(name);\n }\n return names;\n }, []);\n}\n\nfunction getAllMethodNames(obj: any): string[] {\n let methods: string[] = [];\n while (obj) {\n const parentObj = Object.getPrototypeOf(obj);\n if (parentObj) {\n methods = methods.concat(extractMethodsFromObject(obj));\n }\n obj = parentObj;\n }\n return methods;\n}\n\n/** Generate a fully-typed auto-spy from a class. */\nexport function createSpyFromClass<T>(\n ObjectClass: ClassType<T>,\n methodsToSpyOnOrConfig?: OnlyMethodKeysOf<T>[] | ClassSpyConfiguration<T>,\n): Spy<T> {\n const methodNames = getAllMethodNames(ObjectClass.prototype);\n\n let methodsToSpyOn: string[] = [];\n let observablePropsToSpyOn: string[] = [];\n let settersToSpyOn: string[] = [];\n let gettersToSpyOn: string[] = [];\n\n if (methodsToSpyOnOrConfig) {\n if (Array.isArray(methodsToSpyOnOrConfig)) {\n methodsToSpyOn = methodsToSpyOnOrConfig as string[];\n } else {\n methodsToSpyOn = (methodsToSpyOnOrConfig.methodsToSpyOn as string[]) || [];\n observablePropsToSpyOn = (methodsToSpyOnOrConfig.observablePropsToSpyOn as string[]) || [];\n settersToSpyOn = (methodsToSpyOnOrConfig.settersToSpyOn as string[]) || [];\n gettersToSpyOn = (methodsToSpyOnOrConfig.gettersToSpyOn as string[]) || [];\n }\n }\n if (methodsToSpyOn.length > 0) {\n methodNames.push(...methodsToSpyOn);\n }\n\n const autoSpy: any = {};\n\n observablePropsToSpyOn.forEach((observablePropName) => {\n autoSpy[observablePropName] = createObservablePropSpy();\n });\n\n createAccessorsSpies(autoSpy, gettersToSpyOn, settersToSpyOn);\n\n methodNames.forEach((methodName) => {\n autoSpy[methodName] = createFunctionSpy(methodName);\n });\n\n return autoSpy as Spy<T>;\n}\n\n// ===========================================================================\n// Angular helpers\n// ===========================================================================\n\nexport type AngularValueProvider<T> = { provide: ClassType<T>; useValue: Spy<T> };\n\n/** Shorthand Angular provider: `{ provide, useValue: createSpyFromClass(...) }`. */\nexport function provideAutoSpy<T>(\n ObjectClass: ClassType<T>,\n methodsToSpyOnOrConfig?: OnlyMethodKeysOf<T>[] | ClassSpyConfiguration<T>,\n): AngularValueProvider<T> {\n return {\n provide: ObjectClass,\n useValue: createSpyFromClass(ObjectClass, methodsToSpyOnOrConfig),\n };\n}\n\n// ===========================================================================\n// Bonus: TestBed + property mocking helpers\n// ===========================================================================\n\n/** Inject a service from Angular's `TestBed`, already typed as `Spy<T>`. */\nexport function injectSpy<T>(token: ClassType<T> | (abstract new (...args: never[]) => T)): Spy<T> {\n return TestBed.inject(token as never) as Spy<T>;\n}\n\n/** Override a readonly property (incl. `signal()` / `computed()`) with a static value. */\nexport function mockReadonlyProp<T, K extends keyof T>(object: T, property: K, value: unknown): void {\n Object.defineProperty(object, property, { get: () => value, configurable: true });\n}\n\n/** Override a readonly property with a dynamic getter. */\nexport function mockReadonlyPropGetter<T, K extends keyof T>(object: T, property: K, getter: () => unknown): void {\n Object.defineProperty(object, property, { get: getter, configurable: true });\n}\n\n/** Replace a property with spied `get`/`set` accessors (`vi.fn()`). */\nexport function mockAccessorsProp<T, K extends keyof T>(object: T, property: K): void {\n Object.defineProperty(object, property, { get: vi.fn(), set: vi.fn(), configurable: true });\n}\n"]}
@@ -0,0 +1,238 @@
1
+ import { Subject, Observable, ReplaySubject } from 'rxjs';
2
+ import { Mock } from 'vitest';
3
+
4
+ /**
5
+ * vitest-auto-spy
6
+ * ===============
7
+ *
8
+ * Create automatic, fully-typed test spies from a class — powered by Vitest's
9
+ * `vi.fn()`. A drop-in replacement for [`jest-auto-spies`](https://www.npmjs.com/package/jest-auto-spies),
10
+ * with the exact same API surface but spying only on Vitest.
11
+ *
12
+ * ```ts
13
+ * import { createSpyFromClass, provideAutoSpy } from 'vitest-auto-spy';
14
+ * ```
15
+ *
16
+ * --------------------------------------------------------------------------
17
+ * ## createSpyFromClass — the core
18
+ * --------------------------------------------------------------------------
19
+ *
20
+ * ```ts
21
+ * let myService: Spy<MyService>;
22
+ *
23
+ * beforeEach(() => {
24
+ * // every method of MyService becomes a vi.fn()
25
+ * myService = createSpyFromClass(MyService);
26
+ * });
27
+ * ```
28
+ *
29
+ * Restrict what gets spied, or add observable/getter/setter spies:
30
+ *
31
+ * ```ts
32
+ * createSpyFromClass(MyService, ['getName', 'getAge']);
33
+ *
34
+ * createSpyFromClass(MyService, {
35
+ * methodsToSpyOn: ['getName'],
36
+ * observablePropsToSpyOn: ['products$'],
37
+ * gettersToSpyOn: ['userName'],
38
+ * settersToSpyOn: ['userName'],
39
+ * });
40
+ * ```
41
+ *
42
+ * --------------------------------------------------------------------------
43
+ * ## Synchronous methods
44
+ * --------------------------------------------------------------------------
45
+ *
46
+ * ```ts
47
+ * // standard vi.fn() API
48
+ * myService.getName.mockReturnValue('Fake Name');
49
+ *
50
+ * // conditional return by arguments
51
+ * myService.getName.calledWith(1).mockReturnValue('Fake Name');
52
+ *
53
+ * // throw if called with the "wrong" arguments
54
+ * myService.getName.mustBeCalledWith(1).mockReturnValue('Fake Name');
55
+ * ```
56
+ *
57
+ * --------------------------------------------------------------------------
58
+ * ## Promise-returning methods
59
+ * --------------------------------------------------------------------------
60
+ *
61
+ * ```ts
62
+ * myService.getProducts.resolveWith([{ name: 'Product 1' }]);
63
+ * myService.getProducts.rejectWith('FAKE ERROR');
64
+ *
65
+ * myService.getProducts.calledWith(1).resolveWith([{ name: 'Product 1' }]);
66
+ * ```
67
+ *
68
+ * --------------------------------------------------------------------------
69
+ * ## Observable-returning methods / observable properties
70
+ * --------------------------------------------------------------------------
71
+ *
72
+ * ```ts
73
+ * myService.getProducts$.nextWith([{ name: 'Product 1' }]); // emit, stays open
74
+ * myService.getProducts$.nextOneTimeWith([{ name: 'X' }]); // emit + complete
75
+ * myService.getProducts$.throwWith('FAKE ERROR'); // error the stream
76
+ * myService.getProducts$.complete(); // complete the stream
77
+ *
78
+ * // emit a precise sequence (values, errors, completion, delays)
79
+ * myService.getProducts$.nextWithValues([
80
+ * { value: [{ name: 'Product 1' }] },
81
+ * { errorValue: 'FAKE ERROR' },
82
+ * { complete: true },
83
+ * ]);
84
+ *
85
+ * // grab the underlying Subject for manual control
86
+ * const subject = myService.getProducts$.returnSubject();
87
+ * ```
88
+ *
89
+ * --------------------------------------------------------------------------
90
+ * ## Getters & setters
91
+ * --------------------------------------------------------------------------
92
+ *
93
+ * ```ts
94
+ * const spy = createSpyFromClass(MyService, {
95
+ * gettersToSpyOn: ['userName'],
96
+ * settersToSpyOn: ['userName'],
97
+ * });
98
+ *
99
+ * spy.accessorSpies.getters.userName.mockReturnValue('Fake Name');
100
+ * expect(spy.userName).toBe('Fake Name');
101
+ *
102
+ * spy.userName = 'New Name';
103
+ * expect(spy.accessorSpies.setters.userName).toHaveBeenCalledWith('New Name');
104
+ * ```
105
+ *
106
+ * --------------------------------------------------------------------------
107
+ * ## Angular helpers (bonus)
108
+ * --------------------------------------------------------------------------
109
+ *
110
+ * ```ts
111
+ * TestBed.configureTestingModule({
112
+ * providers: [provideAutoSpy(MyService)],
113
+ * });
114
+ *
115
+ * const service = injectSpy(MyService);
116
+ *
117
+ * // signals / readonly / accessor property mocking
118
+ * mockReadonlyProp(service, 'isReady', true);
119
+ * mockReadonlyPropGetter(service, 'label', () => 'A');
120
+ * mockAccessorsProp(service, 'theme');
121
+ * ```
122
+ */
123
+
124
+ type Func = (...args: any[]) => any;
125
+ type ClassType<T> = {
126
+ new (...args: any[]): T;
127
+ [key: string]: any;
128
+ };
129
+ type StringKeysForPropertyType<ObjectType, PropType> = Extract<{
130
+ [Key in keyof ObjectType]: ObjectType[Key] extends PropType ? Key : never;
131
+ }[keyof ObjectType], string>;
132
+ type OnlyMethodKeysOf<T> = StringKeysForPropertyType<T, (...args: any[]) => any>;
133
+ type OnlyObservablePropsOf<T> = StringKeysForPropertyType<T, Observable<any>>;
134
+ type OnlyPropsOf<ObjectType> = Extract<{
135
+ [Key in keyof ObjectType]: ObjectType[Key] extends Func ? never : Key;
136
+ }[keyof ObjectType], string>;
137
+ type ValueConfigPerCall<T> = {
138
+ value: T;
139
+ delay?: number;
140
+ doNotComplete?: boolean;
141
+ };
142
+ type NextValueConfig<T> = {
143
+ value: T;
144
+ delay?: number;
145
+ };
146
+ type ErrorValueConfig = {
147
+ errorValue: any;
148
+ delay?: number;
149
+ };
150
+ type CompleteValueConfig = {
151
+ complete?: boolean;
152
+ delay?: number;
153
+ };
154
+ type ValueConfig<T> = NextValueConfig<T> | ErrorValueConfig | CompleteValueConfig;
155
+ interface AddObservableSpyMethods<T> {
156
+ nextWith(value?: T): void;
157
+ /** emit one value then complete */
158
+ nextOneTimeWith(value?: T): void;
159
+ nextWithValues(valuesConfigs: ValueConfig<T>[]): void;
160
+ nextWithPerCall(valuesPerCall?: ValueConfigPerCall<T>[]): Subject<T>[];
161
+ throwWith(value: any): void;
162
+ complete(): void;
163
+ returnSubject(): Subject<T>;
164
+ }
165
+ interface AddPromiseSpyMethods<T> {
166
+ resolveWith(value?: T): void;
167
+ rejectWith(value?: any): void;
168
+ resolveWithPerCall(valuesPerCall: ValueConfigPerCall<T>[]): void;
169
+ }
170
+ interface AddCalledWithSpyMethods<Method extends Func> {
171
+ calledWith(...args: Parameters<Method>): {
172
+ mockReturnValue: (value: ReturnType<Method>) => void;
173
+ };
174
+ mustBeCalledWith(...args: Parameters<Method>): {
175
+ mockReturnValue: (value: ReturnType<Method>) => void;
176
+ };
177
+ }
178
+ type AddCalledWithObservable<O> = {
179
+ calledWith(...args: any[]): AddObservableSpyMethods<O>;
180
+ mustBeCalledWith(...args: any[]): AddObservableSpyMethods<O>;
181
+ };
182
+ type AddCalledWithPromise<P> = {
183
+ calledWith(...args: any[]): AddPromiseSpyMethods<P>;
184
+ mustBeCalledWith(...args: any[]): AddPromiseSpyMethods<P>;
185
+ };
186
+ /** Wrap a method's spy with helpers chosen by its return type. */
187
+ type AddSpyMethodsByReturnTypes<Method extends Func> = Method & Mock & (Method extends (...args: any[]) => infer ReturnType ? ReturnType extends Promise<infer P> ? AddPromiseSpyMethods<P> & AddCalledWithPromise<P> : ReturnType extends Observable<infer O> ? AddObservableSpyMethods<O> & AddCalledWithObservable<O> : AddCalledWithSpyMethods<Method> : never);
188
+ type AddAccessorsSpies<T> = {
189
+ accessorSpies: {
190
+ getters: {
191
+ [K in keyof T]: Mock;
192
+ };
193
+ setters: {
194
+ [K in keyof T]: Mock;
195
+ };
196
+ };
197
+ };
198
+ /** Fully-typed spy of `T`. */
199
+ type Spy<T> = {
200
+ [K in keyof T]: T[K] extends Func ? AddSpyMethodsByReturnTypes<T[K]> : T[K] extends Observable<infer O> ? T[K] & AddObservableSpyMethods<O> : T[K];
201
+ } & AddAccessorsSpies<T>;
202
+ interface ClassSpyConfiguration<T> {
203
+ methodsToSpyOn?: OnlyMethodKeysOf<T>[];
204
+ observablePropsToSpyOn?: OnlyObservablePropsOf<T>[];
205
+ settersToSpyOn?: OnlyPropsOf<T>[];
206
+ gettersToSpyOn?: OnlyPropsOf<T>[];
207
+ }
208
+ declare const errorHandler: {
209
+ throwArgumentsError(actualArgs: any[], functionName: string): void;
210
+ };
211
+ /** Build a standalone Observable that emits the provided value configs. */
212
+ declare function createObservableWithValues<T>(valuesConfigs: ValueConfig<T>[]): Observable<T>;
213
+ declare function createObservableWithValues<T>(valuesConfigs: ValueConfig<T>[], config: {
214
+ returnSubject: true;
215
+ }): {
216
+ values$: Observable<T>;
217
+ subject: ReplaySubject<T>;
218
+ };
219
+ /** Create a single Vitest-backed function spy with all return-type helpers attached. */
220
+ declare function createFunctionSpy<FunctionType extends Func>(name: string): AddSpyMethodsByReturnTypes<FunctionType>;
221
+ /** Generate a fully-typed auto-spy from a class. */
222
+ declare function createSpyFromClass<T>(ObjectClass: ClassType<T>, methodsToSpyOnOrConfig?: OnlyMethodKeysOf<T>[] | ClassSpyConfiguration<T>): Spy<T>;
223
+ type AngularValueProvider<T> = {
224
+ provide: ClassType<T>;
225
+ useValue: Spy<T>;
226
+ };
227
+ /** Shorthand Angular provider: `{ provide, useValue: createSpyFromClass(...) }`. */
228
+ declare function provideAutoSpy<T>(ObjectClass: ClassType<T>, methodsToSpyOnOrConfig?: OnlyMethodKeysOf<T>[] | ClassSpyConfiguration<T>): AngularValueProvider<T>;
229
+ /** Inject a service from Angular's `TestBed`, already typed as `Spy<T>`. */
230
+ declare function injectSpy<T>(token: ClassType<T> | (abstract new (...args: never[]) => T)): Spy<T>;
231
+ /** Override a readonly property (incl. `signal()` / `computed()`) with a static value. */
232
+ declare function mockReadonlyProp<T, K extends keyof T>(object: T, property: K, value: unknown): void;
233
+ /** Override a readonly property with a dynamic getter. */
234
+ declare function mockReadonlyPropGetter<T, K extends keyof T>(object: T, property: K, getter: () => unknown): void;
235
+ /** Replace a property with spied `get`/`set` accessors (`vi.fn()`). */
236
+ declare function mockAccessorsProp<T, K extends keyof T>(object: T, property: K): void;
237
+
238
+ export { type AddAccessorsSpies, type AddCalledWithSpyMethods, type AddObservableSpyMethods, type AddPromiseSpyMethods, type AddSpyMethodsByReturnTypes, type AngularValueProvider, type ClassSpyConfiguration, type ClassType, type CompleteValueConfig, type ErrorValueConfig, type Func, type NextValueConfig, type OnlyMethodKeysOf, type OnlyObservablePropsOf, type OnlyPropsOf, type Spy, type ValueConfig, type ValueConfigPerCall, createFunctionSpy, createObservableWithValues, createSpyFromClass, errorHandler, injectSpy, mockAccessorsProp, mockReadonlyProp, mockReadonlyPropGetter, provideAutoSpy };
@@ -0,0 +1,238 @@
1
+ import { Subject, Observable, ReplaySubject } from 'rxjs';
2
+ import { Mock } from 'vitest';
3
+
4
+ /**
5
+ * vitest-auto-spy
6
+ * ===============
7
+ *
8
+ * Create automatic, fully-typed test spies from a class — powered by Vitest's
9
+ * `vi.fn()`. A drop-in replacement for [`jest-auto-spies`](https://www.npmjs.com/package/jest-auto-spies),
10
+ * with the exact same API surface but spying only on Vitest.
11
+ *
12
+ * ```ts
13
+ * import { createSpyFromClass, provideAutoSpy } from 'vitest-auto-spy';
14
+ * ```
15
+ *
16
+ * --------------------------------------------------------------------------
17
+ * ## createSpyFromClass — the core
18
+ * --------------------------------------------------------------------------
19
+ *
20
+ * ```ts
21
+ * let myService: Spy<MyService>;
22
+ *
23
+ * beforeEach(() => {
24
+ * // every method of MyService becomes a vi.fn()
25
+ * myService = createSpyFromClass(MyService);
26
+ * });
27
+ * ```
28
+ *
29
+ * Restrict what gets spied, or add observable/getter/setter spies:
30
+ *
31
+ * ```ts
32
+ * createSpyFromClass(MyService, ['getName', 'getAge']);
33
+ *
34
+ * createSpyFromClass(MyService, {
35
+ * methodsToSpyOn: ['getName'],
36
+ * observablePropsToSpyOn: ['products$'],
37
+ * gettersToSpyOn: ['userName'],
38
+ * settersToSpyOn: ['userName'],
39
+ * });
40
+ * ```
41
+ *
42
+ * --------------------------------------------------------------------------
43
+ * ## Synchronous methods
44
+ * --------------------------------------------------------------------------
45
+ *
46
+ * ```ts
47
+ * // standard vi.fn() API
48
+ * myService.getName.mockReturnValue('Fake Name');
49
+ *
50
+ * // conditional return by arguments
51
+ * myService.getName.calledWith(1).mockReturnValue('Fake Name');
52
+ *
53
+ * // throw if called with the "wrong" arguments
54
+ * myService.getName.mustBeCalledWith(1).mockReturnValue('Fake Name');
55
+ * ```
56
+ *
57
+ * --------------------------------------------------------------------------
58
+ * ## Promise-returning methods
59
+ * --------------------------------------------------------------------------
60
+ *
61
+ * ```ts
62
+ * myService.getProducts.resolveWith([{ name: 'Product 1' }]);
63
+ * myService.getProducts.rejectWith('FAKE ERROR');
64
+ *
65
+ * myService.getProducts.calledWith(1).resolveWith([{ name: 'Product 1' }]);
66
+ * ```
67
+ *
68
+ * --------------------------------------------------------------------------
69
+ * ## Observable-returning methods / observable properties
70
+ * --------------------------------------------------------------------------
71
+ *
72
+ * ```ts
73
+ * myService.getProducts$.nextWith([{ name: 'Product 1' }]); // emit, stays open
74
+ * myService.getProducts$.nextOneTimeWith([{ name: 'X' }]); // emit + complete
75
+ * myService.getProducts$.throwWith('FAKE ERROR'); // error the stream
76
+ * myService.getProducts$.complete(); // complete the stream
77
+ *
78
+ * // emit a precise sequence (values, errors, completion, delays)
79
+ * myService.getProducts$.nextWithValues([
80
+ * { value: [{ name: 'Product 1' }] },
81
+ * { errorValue: 'FAKE ERROR' },
82
+ * { complete: true },
83
+ * ]);
84
+ *
85
+ * // grab the underlying Subject for manual control
86
+ * const subject = myService.getProducts$.returnSubject();
87
+ * ```
88
+ *
89
+ * --------------------------------------------------------------------------
90
+ * ## Getters & setters
91
+ * --------------------------------------------------------------------------
92
+ *
93
+ * ```ts
94
+ * const spy = createSpyFromClass(MyService, {
95
+ * gettersToSpyOn: ['userName'],
96
+ * settersToSpyOn: ['userName'],
97
+ * });
98
+ *
99
+ * spy.accessorSpies.getters.userName.mockReturnValue('Fake Name');
100
+ * expect(spy.userName).toBe('Fake Name');
101
+ *
102
+ * spy.userName = 'New Name';
103
+ * expect(spy.accessorSpies.setters.userName).toHaveBeenCalledWith('New Name');
104
+ * ```
105
+ *
106
+ * --------------------------------------------------------------------------
107
+ * ## Angular helpers (bonus)
108
+ * --------------------------------------------------------------------------
109
+ *
110
+ * ```ts
111
+ * TestBed.configureTestingModule({
112
+ * providers: [provideAutoSpy(MyService)],
113
+ * });
114
+ *
115
+ * const service = injectSpy(MyService);
116
+ *
117
+ * // signals / readonly / accessor property mocking
118
+ * mockReadonlyProp(service, 'isReady', true);
119
+ * mockReadonlyPropGetter(service, 'label', () => 'A');
120
+ * mockAccessorsProp(service, 'theme');
121
+ * ```
122
+ */
123
+
124
+ type Func = (...args: any[]) => any;
125
+ type ClassType<T> = {
126
+ new (...args: any[]): T;
127
+ [key: string]: any;
128
+ };
129
+ type StringKeysForPropertyType<ObjectType, PropType> = Extract<{
130
+ [Key in keyof ObjectType]: ObjectType[Key] extends PropType ? Key : never;
131
+ }[keyof ObjectType], string>;
132
+ type OnlyMethodKeysOf<T> = StringKeysForPropertyType<T, (...args: any[]) => any>;
133
+ type OnlyObservablePropsOf<T> = StringKeysForPropertyType<T, Observable<any>>;
134
+ type OnlyPropsOf<ObjectType> = Extract<{
135
+ [Key in keyof ObjectType]: ObjectType[Key] extends Func ? never : Key;
136
+ }[keyof ObjectType], string>;
137
+ type ValueConfigPerCall<T> = {
138
+ value: T;
139
+ delay?: number;
140
+ doNotComplete?: boolean;
141
+ };
142
+ type NextValueConfig<T> = {
143
+ value: T;
144
+ delay?: number;
145
+ };
146
+ type ErrorValueConfig = {
147
+ errorValue: any;
148
+ delay?: number;
149
+ };
150
+ type CompleteValueConfig = {
151
+ complete?: boolean;
152
+ delay?: number;
153
+ };
154
+ type ValueConfig<T> = NextValueConfig<T> | ErrorValueConfig | CompleteValueConfig;
155
+ interface AddObservableSpyMethods<T> {
156
+ nextWith(value?: T): void;
157
+ /** emit one value then complete */
158
+ nextOneTimeWith(value?: T): void;
159
+ nextWithValues(valuesConfigs: ValueConfig<T>[]): void;
160
+ nextWithPerCall(valuesPerCall?: ValueConfigPerCall<T>[]): Subject<T>[];
161
+ throwWith(value: any): void;
162
+ complete(): void;
163
+ returnSubject(): Subject<T>;
164
+ }
165
+ interface AddPromiseSpyMethods<T> {
166
+ resolveWith(value?: T): void;
167
+ rejectWith(value?: any): void;
168
+ resolveWithPerCall(valuesPerCall: ValueConfigPerCall<T>[]): void;
169
+ }
170
+ interface AddCalledWithSpyMethods<Method extends Func> {
171
+ calledWith(...args: Parameters<Method>): {
172
+ mockReturnValue: (value: ReturnType<Method>) => void;
173
+ };
174
+ mustBeCalledWith(...args: Parameters<Method>): {
175
+ mockReturnValue: (value: ReturnType<Method>) => void;
176
+ };
177
+ }
178
+ type AddCalledWithObservable<O> = {
179
+ calledWith(...args: any[]): AddObservableSpyMethods<O>;
180
+ mustBeCalledWith(...args: any[]): AddObservableSpyMethods<O>;
181
+ };
182
+ type AddCalledWithPromise<P> = {
183
+ calledWith(...args: any[]): AddPromiseSpyMethods<P>;
184
+ mustBeCalledWith(...args: any[]): AddPromiseSpyMethods<P>;
185
+ };
186
+ /** Wrap a method's spy with helpers chosen by its return type. */
187
+ type AddSpyMethodsByReturnTypes<Method extends Func> = Method & Mock & (Method extends (...args: any[]) => infer ReturnType ? ReturnType extends Promise<infer P> ? AddPromiseSpyMethods<P> & AddCalledWithPromise<P> : ReturnType extends Observable<infer O> ? AddObservableSpyMethods<O> & AddCalledWithObservable<O> : AddCalledWithSpyMethods<Method> : never);
188
+ type AddAccessorsSpies<T> = {
189
+ accessorSpies: {
190
+ getters: {
191
+ [K in keyof T]: Mock;
192
+ };
193
+ setters: {
194
+ [K in keyof T]: Mock;
195
+ };
196
+ };
197
+ };
198
+ /** Fully-typed spy of `T`. */
199
+ type Spy<T> = {
200
+ [K in keyof T]: T[K] extends Func ? AddSpyMethodsByReturnTypes<T[K]> : T[K] extends Observable<infer O> ? T[K] & AddObservableSpyMethods<O> : T[K];
201
+ } & AddAccessorsSpies<T>;
202
+ interface ClassSpyConfiguration<T> {
203
+ methodsToSpyOn?: OnlyMethodKeysOf<T>[];
204
+ observablePropsToSpyOn?: OnlyObservablePropsOf<T>[];
205
+ settersToSpyOn?: OnlyPropsOf<T>[];
206
+ gettersToSpyOn?: OnlyPropsOf<T>[];
207
+ }
208
+ declare const errorHandler: {
209
+ throwArgumentsError(actualArgs: any[], functionName: string): void;
210
+ };
211
+ /** Build a standalone Observable that emits the provided value configs. */
212
+ declare function createObservableWithValues<T>(valuesConfigs: ValueConfig<T>[]): Observable<T>;
213
+ declare function createObservableWithValues<T>(valuesConfigs: ValueConfig<T>[], config: {
214
+ returnSubject: true;
215
+ }): {
216
+ values$: Observable<T>;
217
+ subject: ReplaySubject<T>;
218
+ };
219
+ /** Create a single Vitest-backed function spy with all return-type helpers attached. */
220
+ declare function createFunctionSpy<FunctionType extends Func>(name: string): AddSpyMethodsByReturnTypes<FunctionType>;
221
+ /** Generate a fully-typed auto-spy from a class. */
222
+ declare function createSpyFromClass<T>(ObjectClass: ClassType<T>, methodsToSpyOnOrConfig?: OnlyMethodKeysOf<T>[] | ClassSpyConfiguration<T>): Spy<T>;
223
+ type AngularValueProvider<T> = {
224
+ provide: ClassType<T>;
225
+ useValue: Spy<T>;
226
+ };
227
+ /** Shorthand Angular provider: `{ provide, useValue: createSpyFromClass(...) }`. */
228
+ declare function provideAutoSpy<T>(ObjectClass: ClassType<T>, methodsToSpyOnOrConfig?: OnlyMethodKeysOf<T>[] | ClassSpyConfiguration<T>): AngularValueProvider<T>;
229
+ /** Inject a service from Angular's `TestBed`, already typed as `Spy<T>`. */
230
+ declare function injectSpy<T>(token: ClassType<T> | (abstract new (...args: never[]) => T)): Spy<T>;
231
+ /** Override a readonly property (incl. `signal()` / `computed()`) with a static value. */
232
+ declare function mockReadonlyProp<T, K extends keyof T>(object: T, property: K, value: unknown): void;
233
+ /** Override a readonly property with a dynamic getter. */
234
+ declare function mockReadonlyPropGetter<T, K extends keyof T>(object: T, property: K, getter: () => unknown): void;
235
+ /** Replace a property with spied `get`/`set` accessors (`vi.fn()`). */
236
+ declare function mockAccessorsProp<T, K extends keyof T>(object: T, property: K): void;
237
+
238
+ export { type AddAccessorsSpies, type AddCalledWithSpyMethods, type AddObservableSpyMethods, type AddPromiseSpyMethods, type AddSpyMethodsByReturnTypes, type AngularValueProvider, type ClassSpyConfiguration, type ClassType, type CompleteValueConfig, type ErrorValueConfig, type Func, type NextValueConfig, type OnlyMethodKeysOf, type OnlyObservablePropsOf, type OnlyPropsOf, type Spy, type ValueConfig, type ValueConfigPerCall, createFunctionSpy, createObservableWithValues, createSpyFromClass, errorHandler, injectSpy, mockAccessorsProp, mockReadonlyProp, mockReadonlyPropGetter, provideAutoSpy };