diff --git a/packages/babel-jest/package.json b/packages/babel-jest/package.json index a827589d2319..226e23853ce9 100644 --- a/packages/babel-jest/package.json +++ b/packages/babel-jest/package.json @@ -11,7 +11,9 @@ "main": "build/index.js", "types": "build/index.d.ts", "dependencies": { + "@jest/transform": "^24.1.0", "@jest/types": "^24.1.0", + "@types/babel__core": "^7.0.4", "babel-plugin-istanbul": "^5.1.0", "babel-preset-jest": "^24.1.0", "chalk": "^2.4.2", @@ -19,7 +21,6 @@ }, "devDependencies": { "@babel/core": "^7.1.0", - "@types/babel__core": "^7.0.4", "@types/slash": "^2.0.0" }, "peerDependencies": { diff --git a/packages/babel-jest/src/index.ts b/packages/babel-jest/src/index.ts index 346a948fa280..cacdce09a9f9 100644 --- a/packages/babel-jest/src/index.ts +++ b/packages/babel-jest/src/index.ts @@ -8,12 +8,13 @@ import crypto from 'crypto'; import fs from 'fs'; import path from 'path'; -import {Config, Transform} from '@jest/types'; +import {Transformer} from '@jest/transform'; +import {Config} from '@jest/types'; import { - transformSync as babelTransform, loadPartialConfig, - TransformOptions, PartialConfig, + TransformOptions, + transformSync as babelTransform, } from '@babel/core'; import chalk from 'chalk'; import slash from 'slash'; @@ -22,9 +23,14 @@ const THIS_FILE = fs.readFileSync(__filename); const jestPresetPath = require.resolve('babel-preset-jest'); const babelIstanbulPlugin = require.resolve('babel-plugin-istanbul'); +// Make it non-optional +type TransformerWithFactory = Transformer & { + createTransformer: (options?: TransformOptions) => TransformerWithFactory; +}; + const createTransformer = ( options: TransformOptions = {}, -): Transform.Transformer => { +): TransformerWithFactory => { options = { ...options, // @ts-ignore: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/33118 @@ -58,18 +64,15 @@ const createTransformer = ( return babelConfig; } - return { + const transformer: TransformerWithFactory = { canInstrument: true, + createTransformer, getCacheKey( - fileData: string, - filename: Config.Path, - configString: string, - { - config, - instrument, - rootDir, - }: {config: Config.ProjectConfig} & Transform.CacheKeyOptions, - ): string { + fileData, + filename, + configString, + {config, instrument, rootDir}, + ) { const babelOptions = loadBabelConfig(config.cwd, filename); const configPath = [ babelOptions.config || '', @@ -97,12 +100,7 @@ const createTransformer = ( .update(process.env.BABEL_ENV || '') .digest('hex'); }, - process( - src: string, - filename: Config.Path, - config: Config.ProjectConfig, - transformOptions?: Transform.TransformOptions, - ): string | Transform.TransformedSource { + process(src, filename, config, transformOptions) { const babelOptions = {...loadBabelConfig(config.cwd, filename).options}; if (transformOptions && transformOptions.instrument) { @@ -132,13 +130,8 @@ const createTransformer = ( return src; }, }; -}; -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; + return transformer; +}; -export = transformer; +export = createTransformer(); diff --git a/packages/babel-jest/tsconfig.json b/packages/babel-jest/tsconfig.json index 75c28b2f54a9..c11e5a122222 100644 --- a/packages/babel-jest/tsconfig.json +++ b/packages/babel-jest/tsconfig.json @@ -6,6 +6,7 @@ }, // TODO: include `babel-preset-jest` if it's ever in TS even though we don't care about its types "references": [ + {"path": "../jest-transform"}, {"path": "../jest-types"} ] } diff --git a/packages/jest-transform/package.json b/packages/jest-transform/package.json index 2fb3d06fa0cd..61152b5281f7 100644 --- a/packages/jest-transform/package.json +++ b/packages/jest-transform/package.json @@ -22,6 +22,7 @@ "micromatch": "^3.1.10", "realpath-native": "^1.1.0", "slash": "^2.0.0", + "source-map": "^0.6.1", "write-file-atomic": "2.4.1" }, "devDependencies": { diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index b91f1955db77..dda65661d94a 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -8,7 +8,7 @@ import crypto from 'crypto'; import path from 'path'; import vm from 'vm'; -import {Config, Transform} from '@jest/types'; +import {Config} from '@jest/types'; import {createDirectory} from 'jest-util'; import fs from 'graceful-fs'; import {transformSync as babelTransform} from '@babel/core'; @@ -20,14 +20,19 @@ import stableStringify from 'fast-json-stable-stringify'; import slash from 'slash'; import writeFileAtomic from 'write-file-atomic'; import {sync as realpath} from 'realpath-native'; -import {Options} from './types'; +import { + Options, + Transformer, + TransformedSource, + TransformResult, +} from './types'; import shouldInstrument from './shouldInstrument'; import enhanceUnexpectedTokenMessage from './enhanceUnexpectedTokenMessage'; type ProjectCache = { configString: string; ignorePatternsRegExp: RegExp | null; - transformedFiles: Map; + transformedFiles: Map; }; // Use `require` to avoid TS rootDir @@ -48,7 +53,7 @@ export default class ScriptTransformer { static EVAL_RESULT_VARIABLE: string; private _cache: ProjectCache; private _config: Config.ProjectConfig; - private _transformCache: Map; + private _transformCache: Map; constructor(config: Config.ProjectConfig) { this._config = config; @@ -136,7 +141,7 @@ export default class ScriptTransformer { } private _getTransformer(filename: Config.Path) { - let transform: Transform.Transformer | null = null; + let transform: Transformer | null = null; if (!this._config.transform || !this._config.transform.length) { return null; } @@ -148,7 +153,7 @@ export default class ScriptTransformer { return transformer; } - transform = require(transformPath) as Transform.Transformer; + transform = require(transformPath) as Transformer; if (typeof transform.createTransformer === 'function') { transform = transform.createTransformer(); } @@ -243,7 +248,7 @@ export default class ScriptTransformer { }; } - let transformed: Transform.TransformedSource = { + let transformed: TransformedSource = { code: content, map: null, }; @@ -305,7 +310,7 @@ export default class ScriptTransformer { options: Options | null, instrument: boolean, fileSource?: string, - ): Transform.TransformResult { + ): TransformResult { const isInternalModule = !!(options && options.isInternalModule); const isCoreModule = !!(options && options.isCoreModule); const content = stripShebang( @@ -367,10 +372,10 @@ export default class ScriptTransformer { filename: Config.Path, options: Options, fileSource?: string, - ): Transform.TransformResult | string { + ): TransformResult | string { let scriptCacheKey = null; let instrument = false; - let result: Transform.TransformResult | string | undefined = ''; + let result: TransformResult | string | undefined = ''; if (!options.isCoreModule) { instrument = shouldInstrument(filename, options, this._config); diff --git a/packages/jest-transform/src/index.ts b/packages/jest-transform/src/index.ts index 56881982c5b3..6f10151c3051 100644 --- a/packages/jest-transform/src/index.ts +++ b/packages/jest-transform/src/index.ts @@ -7,3 +7,4 @@ export {default as ScriptTransformer} from './ScriptTransformer'; export {default as shouldInstrument} from './shouldInstrument'; +export {Transformer} from './types'; diff --git a/packages/jest-transform/src/types.ts b/packages/jest-transform/src/types.ts index 0e66ae444fbf..9d3bf1dc7d6e 100644 --- a/packages/jest-transform/src/types.ts +++ b/packages/jest-transform/src/types.ts @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +import {Script} from 'vm'; +import {RawSourceMap} from 'source-map'; import {Config} from '@jest/types'; export type Options = Pick< @@ -18,3 +20,52 @@ export type Options = Pick< isCoreModule?: boolean; isInternalModule?: boolean; }; + +// 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?: FixedRawSourceMap | string | null; +}; + +export type TransformResult = { + script: Script; + mapCoverage: boolean; + sourceMapPath: string | null; +}; + +export type TransformOptions = { + instrument: boolean; +}; + +export type CacheKeyOptions = { + config: Config.ProjectConfig; + instrument: boolean; + rootDir: string; +}; + +export type Transformer = { + canInstrument?: boolean; + createTransformer?: (options?: any) => Transformer; + + getCacheKey: ( + fileData: string, + filePath: Config.Path, + configStr: string, + options: CacheKeyOptions, + ) => string; + + process: ( + sourceText: string, + sourcePath: Config.Path, + config: Config.ProjectConfig, + options?: TransformOptions, + ) => string | TransformedSource; +}; diff --git a/packages/jest-types/package.json b/packages/jest-types/package.json index 572e2b791882..86018bd9b822 100644 --- a/packages/jest-types/package.json +++ b/packages/jest-types/package.json @@ -11,8 +11,5 @@ }, "license": "MIT", "main": "build/index.js", - "types": "build/index.d.ts", - "dependencies": { - "source-map": "^0.6.1" - } + "types": "build/index.d.ts" } diff --git a/packages/jest-types/src/Transform.ts b/packages/jest-types/src/Transform.ts deleted file mode 100644 index 63bbb0bad081..000000000000 --- a/packages/jest-types/src/Transform.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * 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 {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?: FixedRawSourceMap | string | null; -}; - -export type TransformResult = { - script: Script; - mapCoverage: boolean; - sourceMapPath: string | null; -}; - -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 5f72f2e75feb..70361152f936 100644 --- a/packages/jest-types/src/index.ts +++ b/packages/jest-types/src/index.ts @@ -10,17 +10,7 @@ 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'; import * as PrettyFormat from './PrettyFormat'; import * as Matchers from './Matchers'; -export { - Config, - Console, - SourceMaps, - TestResult, - Mocks, - Transform, - PrettyFormat, - Matchers, -}; +export {Config, Console, SourceMaps, TestResult, Mocks, PrettyFormat, Matchers};