From a8673487959475a60bc1d8d6b12ccdbd49958f33 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Thu, 26 Nov 2020 19:47:26 +0100 Subject: [PATCH] chore: migrate jest-haste-map to ESM --- CHANGELOG.md | 1 + e2e/__tests__/hasteMapMockChanged.test.ts | 2 +- e2e/__tests__/hasteMapSha1.test.ts | 2 +- e2e/__tests__/hasteMapSize.test.ts | 2 +- .../src/__tests__/watchFileChanges.test.ts | 2 +- packages/jest-core/src/cli/index.ts | 2 +- packages/jest-core/src/watch.ts | 7 +++-- .../src/__tests__/index.test.js | 12 ++++---- packages/jest-haste-map/src/index.ts | 30 +++++-------------- .../src/__tests__/resolve.test.ts | 2 +- packages/jest-runner/src/testWorker.ts | 6 ++-- packages/jest-runtime/src/index.ts | 4 +-- packages/jest-test-sequencer/src/index.ts | 7 +++-- .../jest-transform/src/ScriptTransformer.ts | 2 +- 14 files changed, 37 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92078e6ab849..d2ee07b09c8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ - `[jest-config]` [**BREAKING**] Remove `enabledTestsMap` config, use `filter` instead ([#10787](https://github.com/facebook/jest/pull/10787)) - `[jest-console]` [**BREAKING**] Move `root` into `config` and take `GlobalConfig` as mandatory parameter for `getConsoleOutput` ([#10126](https://github.com/facebook/jest/pull/10126)) - `[jest-fake-timers]` Clarify global behavior of `jest.useFakeTimers` and `jest.useRealTimers` ([#10867](https://github.com/facebook/jest/pull/10867)) +- `[jest-haste-map]` [**BREAKING**] Migrate to ESM ([#10875](https://github.com/facebook/jest/pull/10875)) - `[jest-resolve]` [**BREAKING**] Migrate to ESM ([#10688](https://github.com/facebook/jest/pull/10688)) - `[jest-repl, jest-runtime]` [**BREAKING**] Move the `jest-runtime` CLI into `jest-repl` ([#10016](https://github.com/facebook/jest/pull/10016)) - `[jest-util]` No longer checking `enumerable` when adding `process.domain` ([#10862](https://github.com/facebook/jest/pull/10862)) diff --git a/e2e/__tests__/hasteMapMockChanged.test.ts b/e2e/__tests__/hasteMapMockChanged.test.ts index 355534913066..1e1427b0aacd 100644 --- a/e2e/__tests__/hasteMapMockChanged.test.ts +++ b/e2e/__tests__/hasteMapMockChanged.test.ts @@ -6,7 +6,7 @@ */ import * as path from 'path'; -import JestHasteMap = require('jest-haste-map'); +import JestHasteMap from 'jest-haste-map'; import {cleanup, writeFiles} from '../Utils'; // Directory must be here for Watchman to be enabled. diff --git a/e2e/__tests__/hasteMapSha1.test.ts b/e2e/__tests__/hasteMapSha1.test.ts index b3005a4ac806..c611da6172ba 100644 --- a/e2e/__tests__/hasteMapSha1.test.ts +++ b/e2e/__tests__/hasteMapSha1.test.ts @@ -7,7 +7,7 @@ import {tmpdir} from 'os'; import * as path from 'path'; -import JestHasteMap = require('jest-haste-map'); +import JestHasteMap from 'jest-haste-map'; import {cleanup, writeFiles} from '../Utils'; const DIR = path.resolve(tmpdir(), 'haste_map_sha1'); diff --git a/e2e/__tests__/hasteMapSize.test.ts b/e2e/__tests__/hasteMapSize.test.ts index 228eb83f1e7d..290cb571652b 100644 --- a/e2e/__tests__/hasteMapSize.test.ts +++ b/e2e/__tests__/hasteMapSize.test.ts @@ -8,7 +8,7 @@ import {tmpdir} from 'os'; import * as path from 'path'; import {realpathSync} from 'graceful-fs'; -import HasteMap = require('jest-haste-map'); +import HasteMap from 'jest-haste-map'; import {cleanup, writeFiles} from '../Utils'; const DIR = path.resolve(realpathSync.native(tmpdir()), 'haste_map_size'); diff --git a/packages/jest-core/src/__tests__/watchFileChanges.test.ts b/packages/jest-core/src/__tests__/watchFileChanges.test.ts index a2866f6f9b46..50acc79be2cb 100644 --- a/packages/jest-core/src/__tests__/watchFileChanges.test.ts +++ b/packages/jest-core/src/__tests__/watchFileChanges.test.ts @@ -12,7 +12,7 @@ import * as fs from 'graceful-fs'; import rimraf = require('rimraf'); import type {AggregatedResult} from '@jest/test-result'; import {normalize} from 'jest-config'; -import HasteMap = require('jest-haste-map'); +import type HasteMap from 'jest-haste-map'; import Runtime from 'jest-runtime'; import {JestHook} from 'jest-watcher'; diff --git a/packages/jest-core/src/cli/index.ts b/packages/jest-core/src/cli/index.ts index ca67513a2d4d..639b277129ce 100644 --- a/packages/jest-core/src/cli/index.ts +++ b/packages/jest-core/src/cli/index.ts @@ -13,7 +13,7 @@ import type {AggregatedResult} from '@jest/test-result'; import type {Config} from '@jest/types'; import type {ChangedFilesPromise} from 'jest-changed-files'; import {readConfigs} from 'jest-config'; -import HasteMap = require('jest-haste-map'); +import type HasteMap from 'jest-haste-map'; import Runtime, {Context} from 'jest-runtime'; import {createDirectory, preRunMessage} from 'jest-util'; import TestWatcher from '../TestWatcher'; diff --git a/packages/jest-core/src/watch.ts b/packages/jest-core/src/watch.ts index b36c3a0b1332..60de233b8039 100644 --- a/packages/jest-core/src/watch.ts +++ b/packages/jest-core/src/watch.ts @@ -11,7 +11,10 @@ import chalk = require('chalk'); import exit = require('exit'); import slash = require('slash'); import type {Config} from '@jest/types'; -import HasteMap = require('jest-haste-map'); +import type { + ChangeEvent as HasteChangeEvent, + default as HasteMap, +} from 'jest-haste-map'; import {formatExecError} from 'jest-message-util'; import Resolver from 'jest-resolve'; import type {Context} from 'jest-runtime'; @@ -234,7 +237,7 @@ export default function watch( hasteMapInstances.forEach((hasteMapInstance, index) => { hasteMapInstance.on( 'change', - ({eventsQueue, hasteFS, moduleMap}: HasteMap.HasteChangeEvent) => { + ({eventsQueue, hasteFS, moduleMap}: HasteChangeEvent) => { const validPaths = eventsQueue.filter(({filePath}) => isValidPath(globalConfig, filePath), ); diff --git a/packages/jest-haste-map/src/__tests__/index.test.js b/packages/jest-haste-map/src/__tests__/index.test.js index a711d89c35f0..19702655fdc3 100644 --- a/packages/jest-haste-map/src/__tests__/index.test.js +++ b/packages/jest-haste-map/src/__tests__/index.test.js @@ -192,7 +192,7 @@ describe('HasteMap', () => { console.warn = jest.fn(); console.error = jest.fn(); - HasteMap = require('../'); + HasteMap = require('../').default; H = HasteMap.H; getCacheFilePath = HasteMap.getCacheFilePath; @@ -225,7 +225,7 @@ describe('HasteMap', () => { it('creates valid cache file paths', () => { jest.resetModules(); - HasteMap = require('../'); + HasteMap = require('../').default; expect( HasteMap.getCacheFilePath('/', '@scoped/package', 'random-value'), @@ -238,7 +238,7 @@ describe('HasteMap', () => { it('creates different cache file paths for different roots', () => { jest.resetModules(); - const HasteMap = require('../'); + const HasteMap = require('../').default; const hasteMap1 = new HasteMap({...defaultConfig, rootDir: '/root1'}); const hasteMap2 = new HasteMap({...defaultConfig, rootDir: '/root2'}); expect(hasteMap1.getCacheFilePath()).not.toBe(hasteMap2.getCacheFilePath()); @@ -246,7 +246,7 @@ describe('HasteMap', () => { it('creates different cache file paths for different dependency extractor cache keys', () => { jest.resetModules(); - const HasteMap = require('../'); + const HasteMap = require('../').default; const dependencyExtractor = require('./dependencyExtractor'); const config = { ...defaultConfig, @@ -261,7 +261,7 @@ describe('HasteMap', () => { it('creates different cache file paths for different hasteImplModulePath cache keys', () => { jest.resetModules(); - const HasteMap = require('../'); + const HasteMap = require('../').default; const hasteImpl = require('./haste_impl'); hasteImpl.setCacheKey('foo'); const hasteMap1 = new HasteMap(defaultConfig); @@ -272,7 +272,7 @@ describe('HasteMap', () => { it('creates different cache file paths for different projects', () => { jest.resetModules(); - const HasteMap = require('../'); + const HasteMap = require('../').default; const hasteMap1 = new HasteMap({...defaultConfig, name: '@scoped/package'}); const hasteMap2 = new HasteMap({...defaultConfig, name: '-scoped-package'}); expect(hasteMap1.getCacheFilePath()).not.toBe(hasteMap2.getCacheFilePath()); diff --git a/packages/jest-haste-map/src/index.ts b/packages/jest-haste-map/src/index.ts index c7d82bf36c0a..7beb07cf9868 100644 --- a/packages/jest-haste-map/src/index.ts +++ b/packages/jest-haste-map/src/index.ts @@ -19,9 +19,7 @@ import {escapePathForRegex} from 'jest-regex-util'; import serializer from 'jest-serializer'; import Worker from 'jest-worker'; import HasteFS from './HasteFS'; -import HasteModuleMap, { - SerializableModuleMap as HasteSerializableModuleMap, -} from './ModuleMap'; +import HasteModuleMap from './ModuleMap'; import H from './constants'; import nodeCrawl = require('./crawlers/node'); import watchmanCrawl = require('./crawlers/watchman'); @@ -106,14 +104,10 @@ type Watcher = { type WorkerInterface = {worker: typeof worker; getSha1: typeof getSha1}; -// TODO: Ditch namespace when this module exports ESM -declare namespace HasteMap { - export type ModuleMap = HasteModuleMap; - export type SerializableModuleMap = HasteSerializableModuleMap; - export type FS = HasteFS; - export type HasteMapObject = InternalHasteMapObject; - export type HasteChangeEvent = ChangeEvent; -} +export {default as ModuleMap} from './ModuleMap'; +export type {SerializableModuleMap} from './ModuleMap'; +export type {default as FS} from './HasteFS'; +export type {ChangeEvent, HasteMap as HasteMapObject} from './types'; const CHANGE_INTERVAL = 30; const MAX_WAIT_TIME = 240000; @@ -215,7 +209,7 @@ function invariant(condition: unknown, message?: string): asserts condition { * Worker processes can directly access the cache through `HasteMap.read()`. * */ -class HasteMap extends EventEmitter { +export default class HasteMap extends EventEmitter { private _buildPromise: Promise | null; private _cachePath: Config.Path; private _changeInterval?: NodeJS.Timeout; @@ -1093,12 +1087,10 @@ class HasteMap extends EventEmitter { }; } - static H: HType; - static DuplicateError: typeof DuplicateError; - static ModuleMap: typeof HasteModuleMap; + static H: HType = H; } -class DuplicateError extends Error { +export class DuplicateError extends Error { mockPath1: string; mockPath2: string; @@ -1117,9 +1109,3 @@ function copy>(object: T): T { function copyMap(input: Map): Map { return new Map(input); } - -HasteMap.H = H; -HasteMap.DuplicateError = DuplicateError; -HasteMap.ModuleMap = HasteModuleMap; - -export = HasteMap; diff --git a/packages/jest-resolve/src/__tests__/resolve.test.ts b/packages/jest-resolve/src/__tests__/resolve.test.ts index 0a7584df4f70..ff31b6765dc1 100644 --- a/packages/jest-resolve/src/__tests__/resolve.test.ts +++ b/packages/jest-resolve/src/__tests__/resolve.test.ts @@ -9,7 +9,7 @@ import * as path from 'path'; import * as fs from 'graceful-fs'; import {sync as resolveSync} from 'resolve'; -import {ModuleMap} from 'jest-haste-map'; +import HasteMap, {ModuleMap} from 'jest-haste-map'; import Resolver from '../'; import userResolver from '../__mocks__/userResolver'; import defaultResolver from '../defaultResolver'; diff --git a/packages/jest-runner/src/testWorker.ts b/packages/jest-runner/src/testWorker.ts index fff6e741e32e..919eeccd9c8f 100644 --- a/packages/jest-runner/src/testWorker.ts +++ b/packages/jest-runner/src/testWorker.ts @@ -9,7 +9,7 @@ import exit = require('exit'); import type {SerializableError, TestResult} from '@jest/test-result'; import type {Config} from '@jest/types'; -import HasteMap = require('jest-haste-map'); +import {ModuleMap, SerializableModuleMap} from 'jest-haste-map'; import {separateMessageFromStack} from 'jest-message-util'; import type Resolver from 'jest-resolve'; import Runtime from 'jest-runtime'; @@ -23,7 +23,7 @@ import type { export type SerializableResolver = { config: Config.ProjectConfig; - serializableModuleMap: HasteMap.SerializableModuleMap; + serializableModuleMap: SerializableModuleMap; }; type WorkerData = { @@ -74,7 +74,7 @@ export function setup(setupData: { config, serializableModuleMap, } of setupData.serializableResolvers) { - const moduleMap = HasteMap.ModuleMap.fromJSON(serializableModuleMap); + const moduleMap = ModuleMap.fromJSON(serializableModuleMap); resolvers.set(config.name, Runtime.createResolver(config, moduleMap)); } } diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index aa2ac41977cf..c843b74dd338 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -41,7 +41,7 @@ import { shouldInstrument, } from '@jest/transform'; import type {Config, Global} from '@jest/types'; -import HasteMap = require('jest-haste-map'); +import HasteMap, {ModuleMap} from 'jest-haste-map'; import {formatStackTrace, separateMessageFromStack} from 'jest-message-util'; import jestMock = require('jest-mock'); import {escapePathForRegex} from 'jest-regex-util'; @@ -334,7 +334,7 @@ export default class Runtime { static createResolver( config: Config.ProjectConfig, - moduleMap: HasteMap.ModuleMap, + moduleMap: ModuleMap, ): Resolver { return new Resolver(moduleMap, { defaultPlatform: config.haste.defaultPlatform, diff --git a/packages/jest-test-sequencer/src/index.ts b/packages/jest-test-sequencer/src/index.ts index 8c191843d1fc..8904c8428399 100644 --- a/packages/jest-test-sequencer/src/index.ts +++ b/packages/jest-test-sequencer/src/index.ts @@ -7,7 +7,7 @@ import * as fs from 'graceful-fs'; import type {AggregatedResult} from '@jest/test-result'; -import {getCacheFilePath} from 'jest-haste-map'; +import HasteMap from 'jest-haste-map'; import type {Test} from 'jest-runner'; import type {Context} from 'jest-runtime'; @@ -36,7 +36,10 @@ export default class TestSequencer { _getCachePath(context: Context): string { const {config} = context; - return getCacheFilePath(config.cacheDirectory, 'perf-cache-' + config.name); + return HasteMap.getCacheFilePath( + config.cacheDirectory, + 'perf-cache-' + config.name, + ); } _getCache(test: Test): Cache { diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index 61540e9d5a0e..714b699725e9 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -17,7 +17,7 @@ import {addHook} from 'pirates'; import slash = require('slash'); import {sync as writeFileAtomic} from 'write-file-atomic'; import type {Config} from '@jest/types'; -import HasteMap = require('jest-haste-map'); +import HasteMap from 'jest-haste-map'; import { createDirectory, interopRequireDefault,