diff --git a/types/jest-sinon/tsconfig.json b/types/jest-sinon/tsconfig.json index 55fec5cf1f..0914011e88 100644 --- a/types/jest-sinon/tsconfig.json +++ b/types/jest-sinon/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/karma-chai-sinon/tsconfig.json b/types/karma-chai-sinon/tsconfig.json index 80f6619b0e..265b629af7 100644 --- a/types/karma-chai-sinon/tsconfig.json +++ b/types/karma-chai-sinon/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/mochaccino/tsconfig.json b/types/mochaccino/tsconfig.json index 3018a827ec..f896a11f98 100644 --- a/types/mochaccino/tsconfig.json +++ b/types/mochaccino/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, @@ -20,4 +25,4 @@ "index.d.ts", "mochaccino-tests.ts" ] -} \ No newline at end of file +} diff --git a/types/mock-req-res/tsconfig.json b/types/mock-req-res/tsconfig.json index 443bd8a717..fb239002c8 100644 --- a/types/mock-req-res/tsconfig.json +++ b/types/mock-req-res/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/should-sinon/tsconfig.json b/types/should-sinon/tsconfig.json index 33eb26e8c4..bcbed14768 100644 --- a/types/should-sinon/tsconfig.json +++ b/types/should-sinon/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, @@ -20,4 +25,4 @@ "index.d.ts", "should-sinon-tests.ts" ] -} \ No newline at end of file +} diff --git a/types/sinon-as-promised/tsconfig.json b/types/sinon-as-promised/tsconfig.json index cf85ab683e..760df89f4a 100644 --- a/types/sinon-as-promised/tsconfig.json +++ b/types/sinon-as-promised/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/sinon-chai/tsconfig.json b/types/sinon-chai/tsconfig.json index 76623c9b4a..9ca5fbff55 100644 --- a/types/sinon-chai/tsconfig.json +++ b/types/sinon-chai/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/sinon-chai/v2/tsconfig.json b/types/sinon-chai/v2/tsconfig.json index 70ba02b100..696aa085fa 100644 --- a/types/sinon-chai/v2/tsconfig.json +++ b/types/sinon-chai/v2/tsconfig.json @@ -16,7 +16,8 @@ "noEmit": true, "forceConsistentCasingInFileNames": true, "paths": { - "sinon-chai": [ "sinon-chai/v2" ] + "sinon-chai": [ "sinon-chai/v2" ], + "@sinonjs/fake-timers": [ "sinonjs__fake-timers" ] } }, "files": [ diff --git a/types/sinon-chrome/tsconfig.json b/types/sinon-chrome/tsconfig.json index 70b13de66b..2213ca71c8 100644 --- a/types/sinon-chrome/tsconfig.json +++ b/types/sinon-chrome/tsconfig.json @@ -14,6 +14,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/sinon-express-mock/tsconfig.json b/types/sinon-express-mock/tsconfig.json index 87074c925a..15f11dc365 100644 --- a/types/sinon-express-mock/tsconfig.json +++ b/types/sinon-express-mock/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, @@ -20,4 +25,4 @@ "index.d.ts", "sinon-express-mock-tests.ts" ] -} \ No newline at end of file +} diff --git a/types/sinon-mongoose/tsconfig.json b/types/sinon-mongoose/tsconfig.json index 31123d641b..8d74c638f4 100644 --- a/types/sinon-mongoose/tsconfig.json +++ b/types/sinon-mongoose/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, @@ -20,4 +25,4 @@ "index.d.ts", "sinon-mongoose-tests.ts" ] -} \ No newline at end of file +} diff --git a/types/sinon-stub-promise/tsconfig.json b/types/sinon-stub-promise/tsconfig.json index 507008f2cf..97228f015a 100644 --- a/types/sinon-stub-promise/tsconfig.json +++ b/types/sinon-stub-promise/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/sinon-test/tsconfig.json b/types/sinon-test/tsconfig.json index 47e0e148c0..c205f10af3 100644 --- a/types/sinon-test/tsconfig.json +++ b/types/sinon-test/tsconfig.json @@ -13,6 +13,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/sinon/index.d.ts b/types/sinon/index.d.ts index af518c32d4..9776db3aa5 100644 --- a/types/sinon/index.d.ts +++ b/types/sinon/index.d.ts @@ -1,4 +1,4 @@ -// Type definitions for Sinon 7.5 +// Type definitions for Sinon 9.0 // Project: https://sinonjs.org // Definitions by: William Sears // Jonathan Little @@ -14,6 +14,8 @@ // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.8 +import * as FakeTimers from '@sinonjs/fake-timers'; + // sinon uses DOM dependencies which are absent in browser-less environment like node.js // to avoid compiler errors this monkey patch is used // see more details in https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11351 @@ -725,84 +727,17 @@ declare namespace Sinon { (obj: any): SinonMock; } - type SinonTimerId = number | { id: number }; + type SinonTimerId = FakeTimers.TimerId; - interface SinonFakeTimers { - now: number; - loopLimit: number; - - setTimeout(callback: (...args: any[]) => void, timeout: number, ...args: any[]): SinonTimerId; - clearTimeout(id: SinonTimerId): void; - - setInterval(callback: (...args: any[]) => void, timeout: number, ...args: any[]): SinonTimerId; - clearInterval(id: SinonTimerId): void; - - setImmediate(callback: (...args: any[]) => void, ...args: any[]): SinonTimerId; - clearImmediate(id: SinonTimerId): void; - - requestAnimationFrame(callback: (time: number) => void): SinonTimerId; - cancelAnimationFrame(id: SinonTimerId): void; - - nextTick(callback: (...args: any[]) => void, ...args: any[]): void; - queueMicrotask(callback: () => void): void; - - requestIdleCallback(func: (...args: any[]) => void, timeout?: number, ...args: any[]): SinonTimerId; - cancelIdleCallback(timerId: SinonTimerId): void; - - /** - * Tick the clock ahead time milliseconds. - * Causes all timers scheduled within the affected time range to be called. - * time may be the number of milliseconds to advance the clock by or a human-readable string. - * Valid string formats are “08” for eight seconds, “01:00” for one minute and “02:34:10” for two hours, 34 minutes and ten seconds. - * time may be negative, which causes the clock to change but won’t fire any callbacks. - * @param ms - */ - tick(ms: number | string): number; - /** - * Advances the clock to the the moment of the first scheduled timer, firing it. - */ - next(): number; - /** - * This runs all pending timers until there are none remaining. If new timers are added while it is executing they will be run as well. - * This makes it easier to run asynchronous tests to completion without worrying about the number of timers they use, or the delays in those timers. - */ - runAll(): number; - runToLast(): number; - reset(): void; - runMicrotasks(): void; - runToFrame(): number; - - Date(): Date; - Date(year: number): Date; - Date(year: number, month: number): Date; - Date(year: number, month: number, day: number): Date; - Date(year: number, month: number, day: number, hour: number): Date; - Date(year: number, month: number, day: number, hour: number, minute: number): Date; - Date(year: number, month: number, day: number, hour: number, minute: number, second: number): Date; - Date(year: number, month: number, day: number, hour: number, minute: number, second: number, ms: number): Date; - - /** - * Restore the faked methods. - * Call in e.g. tearDown. - */ - restore(): void; - uninstall(): void; - - /** - * Simulate the user changing the system clock while your program is running. It changes the 'now' timestamp - * without affecting timers, intervals or immediates. - * @param now The new 'now' in unix milliseconds - */ - setSystemTime(now: number): void; - /** - * Simulate the user changing the system clock while your program is running. It changes the 'now' timestamp - * without affecting timers, intervals or immediates. - * @param now The new 'now' as a JavaScript Date - */ - setSystemTime(date: Date): void; - - countTimers(): number; - } + type SinonFakeTimers = FakeTimers.InstalledMethods & + FakeTimers.NodeClock & + FakeTimers.BrowserClock & { + /** + * Restore the faked methods. + * Call in e.g. tearDown. + */ + restore(): void; + }; interface SinonFakeTimersConfig { now: number | Date; diff --git a/types/sinon/sinon-tests.ts b/types/sinon/sinon-tests.ts index d60fd4e5ad..fa02e5c00a 100644 --- a/types/sinon/sinon-tests.ts +++ b/types/sinon/sinon-tests.ts @@ -153,11 +153,21 @@ function testClock() { clock.cancelAnimationFrame(animTimer); clock.nextTick(fn); + clock.tick(1); clock.tick('00:10'); + clock.tickAsync(500).then(val => val.toExponential()); + clock.tickAsync('500').then(val => val.toExponential()); + clock.next(); + clock.nextAsync().then(val => val.toExponential()); + clock.runAll(); + clock.runAllAsync().then(val => val.toExponential()); + clock.runToLast(); + clock.runToLastAsync().then(val => val.toExponential()); + clock.reset(); clock.runMicrotasks(); clock.runToFrame(); diff --git a/types/sinon/ts3.1/index.d.ts b/types/sinon/ts3.1/index.d.ts index cc9b427bbb..92ea4c185c 100644 --- a/types/sinon/ts3.1/index.d.ts +++ b/types/sinon/ts3.1/index.d.ts @@ -1,3 +1,5 @@ +import * as FakeTimers from '@sinonjs/fake-timers'; + // sinon uses DOM dependencies which are absent in browser-less environment like node.js // to avoid compiler errors this monkey patch is used // see more details in https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11351 @@ -758,119 +760,17 @@ declare namespace Sinon { (obj: any): SinonMock; } - type SinonTimerId = number | { id: number }; + type SinonTimerId = FakeTimers.TimerId; - interface SinonFakeTimers { - now: number; - loopLimit: number; - - setTimeout( - callback: (...args: TArgs) => void, - timeout: number, - ...args: TArgs - ): SinonTimerId; - clearTimeout(id: SinonTimerId): void; - - setInterval( - callback: (...args: TArgs) => void, - timeout: number, - ...args: TArgs - ): SinonTimerId; - clearInterval(id: SinonTimerId): void; - - setImmediate( - callback: (...args: TArgs) => void, - ...args: TArgs - ): SinonTimerId; - clearImmediate(id: SinonTimerId): void; - - requestAnimationFrame(callback: (time: number) => void): SinonTimerId; - cancelAnimationFrame(id: SinonTimerId): void; - - nextTick( - callback: (...args: TArgs) => void, - ...args: TArgs): void; - queueMicrotask(callback: () => void): void; - - requestIdleCallback(func: (...args: TArgs) => void, timeout?: number, ...args: - TArgs): SinonTimerId; - cancelIdleCallback(timerId: SinonTimerId): void; - - /** - * Tick the clock ahead time milliseconds. - * Causes all timers scheduled within the affected time range to be called. - * time may be the number of milliseconds to advance the clock by or a human-readable string. - * Valid string formats are “08” for eight seconds, “01:00” for one minute and “02:34:10” for two hours, 34 minutes and ten seconds. - * time may be negative, which causes the clock to change but won’t fire any callbacks. - * @param ms - */ - tick(ms: number | string): number; - /** - * Advances the clock to the the moment of the first scheduled timer, firing it. - */ - next(): number; - /** - * This runs all pending timers until there are none remaining. If new timers are added while it is executing they will be run as well. - * This makes it easier to run asynchronous tests to completion without worrying about the number of timers they use, or the delays in those timers. - */ - runAll(): number; - runToLast(): number; - reset(): void; - runMicrotasks(): void; - runToFrame(): number; - - Date(): Date; - Date(year: number): Date; - Date(year: number, month: number): Date; - Date(year: number, month: number, day: number): Date; - Date(year: number, month: number, day: number, hour: number): Date; - Date( - year: number, - month: number, - day: number, - hour: number, - minute: number - ): Date; - Date( - year: number, - month: number, - day: number, - hour: number, - minute: number, - second: number - ): Date; - Date( - year: number, - month: number, - day: number, - hour: number, - minute: number, - second: number, - ms: number - ): Date; - - /** - * Restore the faked methods. - * Call in e.g. tearDown. - */ - restore(): void; - uninstall(): void; - - /** - * Simulate the user changing the system clock while your program is running. It changes the 'now' timestamp - * without affecting timers, intervals or immediates. - * @param now The new 'now' in unix milliseconds - */ - setSystemTime(now: number): void; - /** - * Simulate the user changing the system clock while your program is running. It changes the 'now' timestamp - * without affecting timers, intervals or immediates. - * @param now The new 'now' as a JavaScript Date - */ - setSystemTime(date: Date): void; - - countTimers(): number; - } + type SinonFakeTimers = FakeTimers.InstalledMethods & + FakeTimers.NodeClock & + FakeTimers.BrowserClock & { + /** + * Restore the faked methods. + * Call in e.g. tearDown. + */ + restore(): void; + }; interface SinonFakeTimersConfig { now: number | Date; diff --git a/types/sinon/ts3.1/sinon-tests.ts b/types/sinon/ts3.1/sinon-tests.ts index cb02400ae6..e999c203e4 100644 --- a/types/sinon/ts3.1/sinon-tests.ts +++ b/types/sinon/ts3.1/sinon-tests.ts @@ -160,11 +160,21 @@ function testClock() { clock.cancelAnimationFrame(animTimer); clock.nextTick(fn); + clock.tick(1); clock.tick('00:10'); + clock.tickAsync(500).then(val => val.toExponential()); + clock.tickAsync('500').then(val => val.toExponential()); + clock.next(); + clock.nextAsync().then(val => val.toExponential()); + clock.runAll(); + clock.runAllAsync().then(val => val.toExponential()); + clock.runToLast(); + clock.runToLastAsync().then(val => val.toExponential()); + clock.reset(); clock.runMicrotasks(); clock.runToFrame(); diff --git a/types/sinon/ts3.1/tsconfig.json b/types/sinon/ts3.1/tsconfig.json index 7468efa8bf..d4f7b161c2 100644 --- a/types/sinon/ts3.1/tsconfig.json +++ b/types/sinon/ts3.1/tsconfig.json @@ -15,6 +15,11 @@ "../../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/sinon/tsconfig.json b/types/sinon/tsconfig.json index 3a554d52cc..335632e3c4 100644 --- a/types/sinon/tsconfig.json +++ b/types/sinon/tsconfig.json @@ -15,6 +15,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true }, diff --git a/types/sinonjs__fake-timers/index.d.ts b/types/sinonjs__fake-timers/index.d.ts index bc7197c4a1..c66492b672 100644 --- a/types/sinonjs__fake-timers/index.d.ts +++ b/types/sinonjs__fake-timers/index.d.ts @@ -38,14 +38,14 @@ export interface GlobalTimers { * @param args Any extra arguments to pass to the callback. * @returns Time identifier for cancellation. */ - setTimeout: (callback: () => void, timeout: number, ...args: any[]) => TTimerId; + setTimeout: (callback: (...args: any[]) => void, timeout: number, ...args: any[]) => TTimerId; /** * Clears a timer, as long as it was created using setTimeout. * * @param id Timer ID or object. */ - clearTimeout: (id: TimerId) => void; + clearTimeout: (id: TTimerId) => void; /** * Schedules a callback to be fired every time timeout milliseconds have ticked by. @@ -55,7 +55,7 @@ export interface GlobalTimers { * @param args Any extra arguments to pass to the callback. * @returns Time identifier for cancellation. */ - setInterval: (callback: () => void, timeout: number, ...args: any[]) => TTimerId; + setInterval: (callback: (...args: any[]) => void, timeout: number, ...args: any[]) => TTimerId; /** * Clears a timer, as long as it was created using setInterval. @@ -68,10 +68,11 @@ export interface GlobalTimers { * Schedules the callback to be fired once 0 milliseconds have ticked by. * * @param callback Callback to be fired. + * @param args Any extra arguments to pass to the callback. * @remarks You'll still have to call clock.tick() for the callback to fire. * @remarks If called during a tick the callback won't fire until 1 millisecond has ticked by. */ - setImmediate: (callback: () => void) => TTimerId; + setImmediate: (callback: (...args: any[]) => void, ...args: any[]) => TTimerId; /** * Clears a timer, as long as it was created using setImmediate. @@ -166,22 +167,25 @@ export interface FakeClock extends GlobalTimers void; + next: () => number; /** * Advances the clock to the the moment of the first scheduled timer, firing it. * * Also breaks the event loop, allowing any scheduled promise callbacks to execute _before_ running the timers. + * @returns Fake milliseconds since the unix epoch. */ - nextAsync: () => Promise; + nextAsync: () => Promise; /** * Advance the clock, firing callbacks if necessary. * * @param time How many ticks to advance by. + * @returns Fake milliseconds since the unix epoch. */ - tick: (time: number | string) => void; + tick: (time: number | string) => number; /** * Advance the clock, firing callbacks if necessary. @@ -189,8 +193,9 @@ export interface FakeClock extends GlobalTimers Promise; + tickAsync: (time: number | string) => Promise; /** * Removes all timers and tick without firing them and restore now to its original value. @@ -201,8 +206,9 @@ export interface FakeClock extends GlobalTimers void; + runAll: () => number; /** * Runs all pending timers until there are none remaining. @@ -210,27 +216,31 @@ export interface FakeClock extends GlobalTimers Promise; + runAllAsync: () => Promise; /** * Advanced the clock to the next animation frame while firing all scheduled callbacks. + * @returns Fake milliseconds since the unix epoch. */ - runToFrame: () => void; + runToFrame: () => number; /** * Takes note of the last scheduled timer when it is run, and advances the clock to * that time firing callbacks as necessary. + * @returns Fake milliseconds since the unix epoch. */ - runToLast: () => void; + runToLast: () => number; /** * Takes note of the last scheduled timer when it is run, and advances the clock to * that time firing callbacks as necessary. * * Also breaks the event loop, allowing any scheduled promise callbacks to execute _before_ running the timers. + * @returns Fake milliseconds since the unix epoch. */ - runToLastAsync: () => Promise; + runToLastAsync: () => Promise; /** * Simulates a user changing the system clock. @@ -273,7 +283,7 @@ export type NodeClock = FakeClock & { /** * Simulates process.nextTick(). */ - nextTick: (callback: () => void) => void; + nextTick: (callback: (...args: any[]) => void, ...args: any[]) => void; /** * Run all pending microtasks scheduled with nextTick. @@ -353,8 +363,7 @@ export interface FakeTimerInstallOpts { /** * Creates a clock and installs it globally. * - * @param now Current time for the clock, as with FakeTimers.createClock(). - * @param toFake Names of methods that should be faked. + * @param [opts] Options for the fake timer. */ export function install(opts?: FakeTimerInstallOpts): InstalledClock; diff --git a/types/sinonjs__fake-timers/sinonjs__fake-timers-tests.ts b/types/sinonjs__fake-timers/sinonjs__fake-timers-tests.ts index 7b778baccd..ecfe44e213 100644 --- a/types/sinonjs__fake-timers/sinonjs__fake-timers-tests.ts +++ b/types/sinonjs__fake-timers/sinonjs__fake-timers-tests.ts @@ -1,4 +1,4 @@ -import FakeTimers = require('sinonjs__fake-timers'); +import * as FakeTimers from '@sinonjs/fake-timers'; const global: FakeTimers.FakeTimerWithContext = FakeTimers.withGlobal({}); const timers: FakeTimers.GlobalTimers = FakeTimers.timers; @@ -86,17 +86,17 @@ browserClock.tick('08'); nodeClock.tick(7); nodeClock.tick('08:03'); -browserClock.tickAsync(7).then(() => {}); -browserClock.tickAsync('08').then(() => {}); +browserClock.tickAsync(7).then(val => val.toExponential()); +browserClock.tickAsync('08').then(val => val.toExponential()); -nodeClock.tickAsync(7).then(() => {}); -nodeClock.tickAsync('08:03').then(() => {}); +nodeClock.tickAsync(7).then(val => val.toExponential()); +nodeClock.tickAsync('08:03').then(val => val.toExponential()); browserClock.next(); nodeClock.next(); -browserClock.nextAsync().then(() => {}); -nodeClock.nextAsync().then(() => {}); +browserClock.nextAsync().then(val => val.toExponential()); +nodeClock.nextAsync().then(val => val.toExponential()); browserClock.reset(); nodeClock.reset(); @@ -104,8 +104,8 @@ nodeClock.reset(); browserClock.runAll(); nodeClock.runAll(); -browserClock.runAllAsync().then(() => {}); -nodeClock.runAllAsync().then(() => {}); +browserClock.runAllAsync().then(val => val.toExponential()); +nodeClock.runAllAsync().then(val => val.toExponential()); nodeClock.runMicrotasks(); @@ -115,8 +115,8 @@ nodeClock.runToFrame(); browserClock.runToLast(); nodeClock.runToLast(); -browserClock.runToLastAsync().then(() => {}); -nodeClock.runToLastAsync().then(() => {}); +browserClock.runToLastAsync().then(val => val.toExponential()); +nodeClock.runToLastAsync().then(val => val.toExponential()); browserClock.setSystemTime(); browserClock.setSystemTime(7); diff --git a/types/sinonjs__fake-timers/tsconfig.json b/types/sinonjs__fake-timers/tsconfig.json index 3326eb7550..2e019232b0 100644 --- a/types/sinonjs__fake-timers/tsconfig.json +++ b/types/sinonjs__fake-timers/tsconfig.json @@ -14,6 +14,11 @@ "../" ], "types": [], + "paths": { + "@sinonjs/fake-timers": [ + "sinonjs__fake-timers" + ] + }, "noEmit": true, "forceConsistentCasingInFileNames": true },