From b38137452b47befe7de75b40155667dd4bc5a696 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Mon, 11 Feb 2019 14:27:45 +0100 Subject: [PATCH 1/9] chore: migrate babel-jest to TypeScript --- CHANGELOG.md | 1 + packages/babel-jest/package.json | 2 + .../src/__tests__/{index.js => index.ts} | 14 ++-- .../babel-jest/src/{index.js => index.ts} | 65 ++++++++++++------- packages/babel-jest/tsconfig.json | 8 +++ packages/jest-types/src/Transform.ts | 58 +++++++++++++++++ packages/jest-types/src/index.ts | 3 +- 7 files changed, 122 insertions(+), 29 deletions(-) rename packages/babel-jest/src/__tests__/{index.js => index.ts} (68%) rename packages/babel-jest/src/{index.js => index.ts} (67%) create mode 100644 packages/babel-jest/tsconfig.json create mode 100644 packages/jest-types/src/Transform.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index ca91b9d179c4..8e24ec6d84c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ - `[jest-worker]`: Migrate to TypeScript ([#7853](https://github.com/facebook/jest/pull/7853)) - `[jest-haste-map]`: Migrate to TypeScript ([#7854](https://github.com/facebook/jest/pull/7854)) - `[docs]`: Fix image paths in SnapshotTesting.md for current and version 24 ([#7872](https://github.com/facebook/jest/pull/7872)) +- `[babel-jest]`: Migrate to TypeScript ([#7862](https://github.com/facebook/jest/pull/7862)) ### Performance diff --git a/packages/babel-jest/package.json b/packages/babel-jest/package.json index 48c4552b1380..a827589d2319 100644 --- a/packages/babel-jest/package.json +++ b/packages/babel-jest/package.json @@ -9,7 +9,9 @@ }, "license": "MIT", "main": "build/index.js", + "types": "build/index.d.ts", "dependencies": { + "@jest/types": "^24.1.0", "babel-plugin-istanbul": "^5.1.0", "babel-preset-jest": "^24.1.0", "chalk": "^2.4.2", diff --git a/packages/babel-jest/src/__tests__/index.js b/packages/babel-jest/src/__tests__/index.ts similarity index 68% rename from packages/babel-jest/src/__tests__/index.js rename to packages/babel-jest/src/__tests__/index.ts index 955e231c5a06..af0e84fa216b 100644 --- a/packages/babel-jest/src/__tests__/index.js +++ b/packages/babel-jest/src/__tests__/index.ts @@ -4,7 +4,9 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -const babelJest = require('../index'); + +import {Config, Transform} from '@jest/types'; +import babelJest from '../index'; //Mock data for all the tests const sourceString = ` @@ -24,12 +26,16 @@ const mockConfig = { }; test(`Returns source string with inline maps when no transformOptions is passed`, () => { - const result = babelJest.process(sourceString, 'dummy_path.js', mockConfig); + const result = babelJest.process( + sourceString, + 'dummy_path.js', + (mockConfig as unknown) as Config.ProjectConfig, + ) as Transform.TransformedSource; expect(typeof result).toBe('object'); expect(result.code).toBeDefined(); expect(result.map).toBeDefined(); expect(result.code).toMatch('//# sourceMappingURL'); expect(result.code).toMatch('customMultiply'); - expect(result.map.sources).toEqual(['dummy_path.js']); - expect(JSON.stringify(result.map.sourcesContent)).toMatch('customMultiply'); + expect(result.map!.sources).toEqual(['dummy_path.js']); + expect(JSON.stringify(result.map!.sourcesContent)).toMatch('customMultiply'); }); diff --git a/packages/babel-jest/src/index.js b/packages/babel-jest/src/index.ts similarity index 67% rename from packages/babel-jest/src/index.js rename to packages/babel-jest/src/index.ts index b659d715588f..9d6126a3b985 100644 --- a/packages/babel-jest/src/index.js +++ b/packages/babel-jest/src/index.ts @@ -3,22 +3,18 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - * - * @flow */ -import type {Path, ProjectConfig} from 'types/Config'; -import type { - CacheKeyOptions, - Transformer, - TransformOptions, - TransformedSource, -} from 'types/Transform'; - import crypto from 'crypto'; import fs from 'fs'; import path from 'path'; -import {transformSync as babelTransform, loadPartialConfig} from '@babel/core'; +import {Config, Transform} from '@jest/types'; +import { + transformSync as babelTransform, + loadPartialConfig, + TransformOptions, + PartialConfig, +} from '@babel/core'; import chalk from 'chalk'; import slash from 'slash'; @@ -26,9 +22,12 @@ const THIS_FILE = fs.readFileSync(__filename); const jestPresetPath = require.resolve('babel-preset-jest'); const babelIstanbulPlugin = require.resolve('babel-plugin-istanbul'); -const createTransformer = (options: any): Transformer => { +const createTransformer = ( + options: TransformOptions = {}, +): Transform.Transformer => { options = { ...options, + // @ts-ignore: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/32955 caller: { name: 'babel-jest', supportsStaticESM: false, @@ -39,10 +38,13 @@ const createTransformer = (options: any): Transformer => { sourceMaps: 'both', }; + // @ts-ignore: seems like this is removed. Is that true? delete options.cacheDirectory; - delete options.filename; - function loadBabelConfig(cwd, filename) { + function loadBabelConfig( + cwd: Config.Path, + filename: Config.Path, + ): PartialConfig { // `cwd` first to allow incoming options to override it const babelConfig = loadPartialConfig({cwd, ...options, filename}); @@ -63,9 +65,13 @@ const createTransformer = (options: any): Transformer => { canInstrument: true, getCacheKey( fileData: string, - filename: Path, + filename: Config.Path, configString: string, - {config, instrument, rootDir}: {config: ProjectConfig} & CacheKeyOptions, + { + config, + instrument, + rootDir, + }: {config: Config.ProjectConfig} & Transform.CacheKeyOptions, ): string { const babelOptions = loadBabelConfig(config.cwd, filename); const configPath = [ @@ -96,16 +102,16 @@ const createTransformer = (options: any): Transformer => { }, process( src: string, - filename: Path, - config: ProjectConfig, - transformOptions?: TransformOptions, - ): string | TransformedSource { + filename: Config.Path, + config: Config.ProjectConfig, + transformOptions?: Transform.TransformOptions, + ): string | Transform.TransformedSource { const babelOptions = {...loadBabelConfig(config.cwd, filename).options}; if (transformOptions && transformOptions.instrument) { babelOptions.auxiliaryCommentBefore = ' istanbul ignore next '; // Copied from jest-runtime transform.js - babelOptions.plugins = babelOptions.plugins.concat([ + babelOptions.plugins = (babelOptions.plugins || []).concat([ [ babelIstanbulPlugin, { @@ -119,10 +125,21 @@ const createTransformer = (options: any): Transformer => { const transformResult = babelTransform(src, babelOptions); - return transformResult || src; + if (transformResult && typeof transformResult.code === 'string') { + // @ts-ignore: why doesn't TS understand this? + return transformResult; + } + + return src; }, }; }; -module.exports = createTransformer(); -(module.exports: any).createTransformer = createTransformer; +const transformer = createTransformer(); + +// FIXME: This is not part of the exported TS types. When fixed, remember to +// move @types/babel__core to `dependencies` instead of `devDependencies` +// (one fix is to use ESM, maybe for Jest 25?) +transformer.createTransformer = createTransformer; + +export = transformer; diff --git a/packages/babel-jest/tsconfig.json b/packages/babel-jest/tsconfig.json new file mode 100644 index 000000000000..3046cb6b9b6a --- /dev/null +++ b/packages/babel-jest/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build" + }, + "references": [{"path": "../jest-types"}] +} diff --git a/packages/jest-types/src/Transform.ts b/packages/jest-types/src/Transform.ts new file mode 100644 index 000000000000..f303df55bdb0 --- /dev/null +++ b/packages/jest-types/src/Transform.ts @@ -0,0 +1,58 @@ +/** + * 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. + */ + +import {Script} from 'vm'; +import {Path, ProjectConfig} from './Config'; + +export type TransformedSource = { + code: string; + map?: // copied from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/363cdf403a74e0372e87bbcd15eb1668f4c5230b/types/babel__core/index.d.ts#L371-L379 + { + version: number; + sources: string[]; + names: string[]; + sourceRoot?: string; + sourcesContent?: string[]; + mappings: string; + file: string; + } | null; +}; + +export type TransformResult = { + script: Script; + mapCoverage: boolean; + sourceMapPath?: string; +}; + +export type TransformOptions = { + instrument: boolean; +}; + +export type CacheKeyOptions = { + config: ProjectConfig; + instrument: boolean; + rootDir: string; +}; + +export type Transformer = { + canInstrument?: boolean; + createTransformer?: (options: any) => Transformer; + + getCacheKey: ( + fileData: string, + filePath: Path, + configStr: string, + options: CacheKeyOptions, + ) => string; + + process: ( + sourceText: string, + sourcePath: Path, + config: ProjectConfig, + options?: TransformOptions, + ) => string | TransformedSource; +}; diff --git a/packages/jest-types/src/index.ts b/packages/jest-types/src/index.ts index 2c9054b64270..769fb97b881b 100644 --- a/packages/jest-types/src/index.ts +++ b/packages/jest-types/src/index.ts @@ -10,5 +10,6 @@ import * as Console from './Console'; import * as SourceMaps from './SourceMaps'; import * as TestResult from './TestResult'; import * as Mocks from './Mocks'; +import * as Transform from './Transform'; -export {Config, Console, SourceMaps, TestResult, Mocks}; +export {Config, Console, SourceMaps, TestResult, Mocks, Transform}; From 8a2dabd360897ba32660eb1e688f9ef61cc92070 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Mon, 11 Feb 2019 14:42:53 +0100 Subject: [PATCH 2/9] sourcemap can be a string --- packages/babel-jest/src/__tests__/index.ts | 6 ++++-- packages/jest-types/src/Transform.ts | 22 ++++++++++++---------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/babel-jest/src/__tests__/index.ts b/packages/babel-jest/src/__tests__/index.ts index af0e84fa216b..01fbd54b92c9 100644 --- a/packages/babel-jest/src/__tests__/index.ts +++ b/packages/babel-jest/src/__tests__/index.ts @@ -36,6 +36,8 @@ test(`Returns source string with inline maps when no transformOptions is passed` expect(result.map).toBeDefined(); expect(result.code).toMatch('//# sourceMappingURL'); expect(result.code).toMatch('customMultiply'); - expect(result.map!.sources).toEqual(['dummy_path.js']); - expect(JSON.stringify(result.map!.sourcesContent)).toMatch('customMultiply'); + // @ts-ignore: it's fine if we get wrong types, the tests will fail then + expect(result.map.sources).toEqual(['dummy_path.js']); + // @ts-ignore: it's fine if we get wrong types, the tests will fail then + expect(JSON.stringify(result.map.sourcesContent)).toMatch('customMultiply'); }); diff --git a/packages/jest-types/src/Transform.ts b/packages/jest-types/src/Transform.ts index f303df55bdb0..52ce5162fbe2 100644 --- a/packages/jest-types/src/Transform.ts +++ b/packages/jest-types/src/Transform.ts @@ -10,16 +10,18 @@ import {Path, ProjectConfig} from './Config'; export type TransformedSource = { code: string; - map?: // copied from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/363cdf403a74e0372e87bbcd15eb1668f4c5230b/types/babel__core/index.d.ts#L371-L379 - { - version: number; - sources: string[]; - names: string[]; - sourceRoot?: string; - sourcesContent?: string[]; - mappings: string; - file: string; - } | null; + map?: // copied from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/363cdf403a74e0372e87bbcd15eb1668f4c5230b/types/babel__core/index.d.ts#L371-L379 + | { + version: number; + sources: string[]; + names: string[]; + sourceRoot?: string; + sourcesContent?: string[]; + mappings: string; + file: string; + } + | string + | null; }; export type TransformResult = { From 5feaa8db2ccb9f4d3f415c97759627a20238abec Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Mon, 11 Feb 2019 15:08:58 +0100 Subject: [PATCH 3/9] update failing snapshots --- e2e/__tests__/__snapshots__/transform.test.js.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/__tests__/__snapshots__/transform.test.js.snap b/e2e/__tests__/__snapshots__/transform.test.js.snap index 791e7ec6ae94..b35d72f1757d 100644 --- a/e2e/__tests__/__snapshots__/transform.test.js.snap +++ b/e2e/__tests__/__snapshots__/transform.test.js.snap @@ -6,7 +6,7 @@ FAIL __tests__/ignoredFile.test.js babel-jest: Babel ignores __tests__/ignoredFile.test.js - make sure to include the file in Jest's transformIgnorePatterns as well. - at loadBabelConfig (../../../packages/babel-jest/build/index.js:134:13) + at loadBabelConfig (../../../packages/babel-jest/build/index.js:135:13) `; exports[`babel-jest instruments only specific files and collects coverage 1`] = ` From 27bc37ce000676e6fbf48cbdfcfc6162c97122d4 Mon Sep 17 00:00:00 2001 From: Tim Seckinger Date: Tue, 12 Feb 2019 23:34:19 +0100 Subject: [PATCH 4/9] work around a ts-ignore --- packages/babel-jest/src/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/babel-jest/src/index.ts b/packages/babel-jest/src/index.ts index 9d6126a3b985..08ffa139cd7b 100644 --- a/packages/babel-jest/src/index.ts +++ b/packages/babel-jest/src/index.ts @@ -126,8 +126,10 @@ const createTransformer = ( const transformResult = babelTransform(src, babelOptions); if (transformResult && typeof transformResult.code === 'string') { - // @ts-ignore: why doesn't TS understand this? - return transformResult; + const {code, map} = transformResult; + if (typeof code === 'string') { + return {code, map}; + } } return src; From d80aa6d05f08438825004400d327c4fe0f5f730d Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 13 Feb 2019 08:56:58 +0100 Subject: [PATCH 5/9] simplify --- packages/babel-jest/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-jest/src/index.ts b/packages/babel-jest/src/index.ts index 08ffa139cd7b..55b586eb6aa4 100644 --- a/packages/babel-jest/src/index.ts +++ b/packages/babel-jest/src/index.ts @@ -125,7 +125,7 @@ const createTransformer = ( const transformResult = babelTransform(src, babelOptions); - if (transformResult && typeof transformResult.code === 'string') { + if (transformResult) { const {code, map} = transformResult; if (typeof code === 'string') { return {code, map}; From 483fb49642e2689779e870ba19743b32f7c7d0dd Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 13 Feb 2019 08:58:04 +0100 Subject: [PATCH 6/9] add comment --- packages/babel-jest/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/babel-jest/tsconfig.json b/packages/babel-jest/tsconfig.json index 3046cb6b9b6a..042289e959d6 100644 --- a/packages/babel-jest/tsconfig.json +++ b/packages/babel-jest/tsconfig.json @@ -4,5 +4,6 @@ "rootDir": "src", "outDir": "build" }, + // TODO: include `babel-preset-jest` even though we don't care about its types "references": [{"path": "../jest-types"}] } From 8c69b021fd58f67ce8a2406cb8dc09d017e5094f Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 13 Feb 2019 09:05:20 +0100 Subject: [PATCH 7/9] import sourcemap type from source-map --- packages/jest-types/package.json | 5 ++++- packages/jest-types/src/Transform.ts | 23 +++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/jest-types/package.json b/packages/jest-types/package.json index 86018bd9b822..572e2b791882 100644 --- a/packages/jest-types/package.json +++ b/packages/jest-types/package.json @@ -11,5 +11,8 @@ }, "license": "MIT", "main": "build/index.js", - "types": "build/index.d.ts" + "types": "build/index.d.ts", + "dependencies": { + "source-map": "^0.6.1" + } } diff --git a/packages/jest-types/src/Transform.ts b/packages/jest-types/src/Transform.ts index 52ce5162fbe2..473434637f90 100644 --- a/packages/jest-types/src/Transform.ts +++ b/packages/jest-types/src/Transform.ts @@ -6,22 +6,21 @@ */ import {Script} from 'vm'; +import {RawSourceMap} from 'source-map'; import {Path, ProjectConfig} from './Config'; +// https://stackoverflow.com/a/48216010/1850276 +type Omit = Pick>; + +// This is fixed in a newer version, but that depends on Node 8 which is a +// breaking change (engine warning when installing) +interface FixedRawSourceMap extends Omit { + version: number; +} + export type TransformedSource = { code: string; - map?: // copied from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/363cdf403a74e0372e87bbcd15eb1668f4c5230b/types/babel__core/index.d.ts#L371-L379 - | { - version: number; - sources: string[]; - names: string[]; - sourceRoot?: string; - sourcesContent?: string[]; - mappings: string; - file: string; - } - | string - | null; + map?: FixedRawSourceMap | string | null; }; export type TransformResult = { From aa016d9c33201747336a150b6c666a70a7a4d3db Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 13 Feb 2019 09:20:24 +0100 Subject: [PATCH 8/9] remove unused delete --- packages/babel-jest/src/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/babel-jest/src/index.ts b/packages/babel-jest/src/index.ts index 55b586eb6aa4..ea8a5bde75cd 100644 --- a/packages/babel-jest/src/index.ts +++ b/packages/babel-jest/src/index.ts @@ -38,9 +38,6 @@ const createTransformer = ( sourceMaps: 'both', }; - // @ts-ignore: seems like this is removed. Is that true? - delete options.cacheDirectory; - function loadBabelConfig( cwd: Config.Path, filename: Config.Path, From fb36a69a3b17add8866344be2b7bc8d8f79580c8 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 13 Feb 2019 09:56:27 +0100 Subject: [PATCH 9/9] failing snap --- e2e/__tests__/__snapshots__/transform.test.js.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/__tests__/__snapshots__/transform.test.js.snap b/e2e/__tests__/__snapshots__/transform.test.js.snap index b35d72f1757d..00c81c270f78 100644 --- a/e2e/__tests__/__snapshots__/transform.test.js.snap +++ b/e2e/__tests__/__snapshots__/transform.test.js.snap @@ -6,7 +6,7 @@ FAIL __tests__/ignoredFile.test.js babel-jest: Babel ignores __tests__/ignoredFile.test.js - make sure to include the file in Jest's transformIgnorePatterns as well. - at loadBabelConfig (../../../packages/babel-jest/build/index.js:135:13) + at loadBabelConfig (../../../packages/babel-jest/build/index.js:133:13) `; exports[`babel-jest instruments only specific files and collects coverage 1`] = `