Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: extract FakeTimers into a separate package #7987

Merged
merged 3 commits into from Feb 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -59,6 +59,7 @@
- `[jest-phabricator]`: Migrate to TypeScript ([#7965](https://github.com/facebook/jest/pull/7965))
- `[jest-runner]`: Migrate to TypeScript ([#7968](https://github.com/facebook/jest/pull/7968))
- `[jest-runtime]`: Migrate to TypeScript ([#7964](https://github.com/facebook/jest/pull/7964))
- `[@jest/fake-timers]`: Extract FakeTimers class from `jest-util` into a new separate package ([#7987](https://github.com/facebook/jest/pull/7987))

### Performance

Expand Down
1 change: 1 addition & 0 deletions packages/jest-environment-jsdom/package.json
Expand Up @@ -9,6 +9,7 @@
"license": "MIT",
"main": "build/index.js",
"dependencies": {
"@jest/fake-timers": "^24.1.0",
"jest-mock": "^24.0.0",
"jest-util": "^24.0.0",
"jsdom": "^11.5.1"
Expand Down
3 changes: 2 additions & 1 deletion packages/jest-environment-jsdom/src/index.js
Expand Up @@ -12,7 +12,8 @@ import type {EnvironmentContext} from 'types/Environment';
import type {Global} from 'types/Global';
import type {ModuleMocker} from 'jest-mock';

import {FakeTimers, installCommonGlobals} from 'jest-util';
import {JestFakeTimers as FakeTimers} from '@jest/fake-timers';
import {installCommonGlobals} from 'jest-util';
import mock from 'jest-mock';
import {JSDOM, VirtualConsole} from 'jsdom';

Expand Down
1 change: 1 addition & 0 deletions packages/jest-environment-node/package.json
Expand Up @@ -9,6 +9,7 @@
"license": "MIT",
"main": "build/index.js",
"dependencies": {
"@jest/fake-timers": "^24.1.0",
"jest-mock": "^24.0.0",
"jest-util": "^24.0.0"
},
Expand Down
3 changes: 2 additions & 1 deletion packages/jest-environment-node/src/index.js
Expand Up @@ -13,7 +13,8 @@ import type {Global} from 'types/Global';
import type {ModuleMocker} from 'jest-mock';

import vm from 'vm';
import {FakeTimers, installCommonGlobals} from 'jest-util';
import {JestFakeTimers as FakeTimers} from '@jest/fake-timers';
import {installCommonGlobals} from 'jest-util';
import mock from 'jest-mock';

type Timer = {|
Expand Down
1 change: 1 addition & 0 deletions packages/jest-environment/package.json
Expand Up @@ -10,6 +10,7 @@
"main": "build/index.js",
"types": "build/index.d.ts",
"dependencies": {
"@jest/fake-timers": "^24.1.0",
"@jest/transform": "^24.1.0",
"@jest/types": "^24.1.0",
"@types/node": "*",
Expand Down
29 changes: 11 additions & 18 deletions packages/jest-environment/src/index.ts
Expand Up @@ -7,8 +7,12 @@

import {Script} from 'vm';
import {Config, Global} from '@jest/types';
import moduleMocker from 'jest-mock';
import jestMock, {ModuleMocker} from 'jest-mock';
import {ScriptTransformer} from '@jest/transform';
import {JestFakeTimers as FakeTimers} from '@jest/fake-timers';

type JestMockFn = typeof jestMock.fn;
type JestMockSpyOn = typeof jestMock.spyOn;

export type EnvironmentContext = {
console?: Console;
Expand All @@ -27,21 +31,10 @@ export interface JestEnvironment {
script: Script,
): {[ScriptTransformer.EVAL_RESULT_VARIABLE]: ModuleWrapper} | null;
global: Global.Global;
// TODO: When `jest-util` is ESM, this can just be `fakeTimers: import('jest-util').FakeTimers`
fakeTimers: {
clearAllTimers(): void;
runAllImmediates(): void;
runAllTicks(): void;
runAllTimers(): void;
advanceTimersByTime(msToRun: number): void;
runOnlyPendingTimers(): void;
runWithRealTimers(callback: () => void): void;
getTimerCount(): number;
useFakeTimers(): void;
useRealTimers(): void;
};
// TODO: This is nullable, and TS doesn't understand we deal with it in `jest-runtime`. Should be fixed
fakeTimers: FakeTimers<unknown>;
testFilePath: Config.Path;
moduleMocker: typeof moduleMocker;
moduleMocker: ModuleMocker;
setup(): Promise<void>;
teardown(): Promise<void>;
}
Expand Down Expand Up @@ -112,7 +105,7 @@ export interface Jest {
/**
* Creates a mock function. Optionally takes a mock implementation.
*/
fn: typeof moduleMocker.fn;
fn: JestMockFn;
/**
* Given the name of a module, use the automatic mocking system to generate a
* mocked version of the module for you.
Expand All @@ -124,7 +117,7 @@ export interface Jest {
/**
* Determines if the given function is a mocked function.
*/
isMockFunction(fn: Function): fn is ReturnType<typeof moduleMocker.fn>;
isMockFunction(fn: Function): fn is ReturnType<JestMockFn>;
/**
* Mocks a module with an auto-mocked version when it is being required.
*/
Expand Down Expand Up @@ -235,7 +228,7 @@ export interface Jest {
* Note: By default, jest.spyOn also calls the spied method. This is
* different behavior from most other test libraries.
*/
spyOn: typeof moduleMocker.spyOn;
spyOn: JestMockSpyOn;
/**
* Indicates that the module system should never return a mocked version of
* the specified module from require() (e.g. that it should always return the
Expand Down
1 change: 1 addition & 0 deletions packages/jest-environment/tsconfig.json
Expand Up @@ -5,6 +5,7 @@
"outDir": "build"
},
"references": [
{"path": "../jest-fake-timers"},
{"path": "../jest-transform"},
{"path": "../jest-types"},
{"path": "../jest-util"}
Expand Down
3 changes: 3 additions & 0 deletions packages/jest-fake-timers/.npmignore
@@ -0,0 +1,3 @@
**/__mocks__/**
**/__tests__/**
src
22 changes: 22 additions & 0 deletions packages/jest-fake-timers/package.json
@@ -0,0 +1,22 @@
{
"name": "@jest/fake-timers",
"version": "24.1.0",
"repository": {
"type": "git",
"url": "https://github.com/facebook/jest.git",
"directory": "packages/jest-fake-timers"
},
"license": "MIT",
"main": "build/index.js",
"types": "build/index.d.ts",
"dependencies": {
"@jest/types": "^24.1.0",
"@types/node": "*",
"jest-message-util": "^24.0.0",
"jest-mock": "^24.0.0"
},
"engines": {
"node": ">= 6"
},
"gitHead": "b16789230fd45056a7f2fa199bae06c7a1780deb"
}
Expand Up @@ -7,9 +7,7 @@

import vm from 'vm';
import mock from 'jest-mock';
import FakeTimers from '../FakeTimers';
// TODO: import this type directly from jest-mock once TS migration is done
type ModuleMocker = typeof mock;
import FakeTimers from '../jestFakeTimers';

const timerConfig = {
idToRef: (id: number) => id,
Expand All @@ -22,7 +20,7 @@ const config = {
};

describe('FakeTimers', () => {
let moduleMocker: ModuleMocker;
let moduleMocker: mock.ModuleMocker;

beforeEach(() => {
const global = vm.runInNewContext('this');
Expand Down
8 changes: 8 additions & 0 deletions packages/jest-fake-timers/src/index.ts
@@ -0,0 +1,8 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

export {default as JestFakeTimers} from './jestFakeTimers';
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not default export since I want to keep the door open for Lolex as an alternative, ref #7776

Expand Up @@ -5,18 +5,10 @@
* LICENSE file in the root directory of this source tree.
*/

import mock from 'jest-mock';
import {ModuleMocker} from 'jest-mock';
import {formatStackTrace, StackTraceConfig} from 'jest-message-util';
import setGlobal from './setGlobal';

type ModuleMocker = typeof mock;

/**
* We don't know the type of arguments for a callback ahead of time which is why
* we are disabling the flowtype/no-weak-types rule here.
*/

type Callback = (...args: any) => void;
type Callback = (...args: Array<unknown>) => void;

type TimerID = string;

Expand Down Expand Up @@ -50,6 +42,16 @@ type TimerConfig<Ref> = {

const MS_IN_A_YEAR = 31536000000;

// TODO: Copied from `jest-util` to avoid cyclic dependency. Import from `jest-util` in the next major
const setGlobal = (
globalToMutate: NodeJS.Global | Window,
key: string,
value: unknown,
) => {
// @ts-ignore: no index
globalToMutate[key] = value;
};

export default class FakeTimers<TimerRef> {
private _cancelledImmediates!: {[key: string]: boolean};
private _cancelledTicks!: {[key: string]: boolean};
Expand Down
11 changes: 11 additions & 0 deletions packages/jest-fake-timers/tsconfig.json
@@ -0,0 +1,11 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "build"
},
"references": [
{"path": "../jest-message-util"},
{"path": "../jest-mock"}
]
}
3 changes: 1 addition & 2 deletions packages/jest-util/package.json
Expand Up @@ -10,14 +10,13 @@
"main": "build/index.js",
"types": "build/index.d.ts",
"dependencies": {
"@jest/fake-timers": "^24.1.0",
"@jest/types": "^24.1.0",
"@types/node": "*",
"callsites": "^3.0.0",
"chalk": "^2.0.1",
"graceful-fs": "^4.1.15",
"is-ci": "^2.0.0",
"jest-message-util": "^24.0.0",
"jest-mock": "^24.0.0",
"mkdirp": "^0.5.1",
"readable-stream": "^3.1.1",
"slash": "^2.0.0",
Expand Down
3 changes: 2 additions & 1 deletion packages/jest-util/src/index.ts
Expand Up @@ -5,12 +5,13 @@
* LICENSE file in the root directory of this source tree.
*/

// TODO: Remove this export in the next major
import {JestFakeTimers as FakeTimers} from '@jest/fake-timers';
import BufferedConsole from './BufferedConsole';
import clearLine from './clearLine';
import CustomConsole from './CustomConsole';
import createDirectory from './createDirectory';
import ErrorWithStack from './ErrorWithStack';
import FakeTimers from './FakeTimers';
import formatTestResults from './formatTestResults';
import getFailedSnapshotTests from './getFailedSnapshotTests';
import getConsoleOutput from './getConsoleOutput';
Expand Down
5 changes: 2 additions & 3 deletions packages/jest-util/tsconfig.json
Expand Up @@ -5,8 +5,7 @@
"outDir": "build"
},
"references": [
{"path": "../jest-types"},
{"path": "../jest-message-util"},
{"path": "../jest-mock"}
{"path": "../jest-fake-timers"},
{"path": "../jest-types"}
]
}