Skip to content

Commit 98b2410

Browse files
committed
fix: gracefully load @babel/core or babel-core
1 parent a65079f commit 98b2410

5 files changed

Lines changed: 114 additions & 23 deletions

File tree

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,17 @@
8181
"@babel/core": "^7.0.0-beta.54",
8282
"@babel/preset-env": "^7.0.0-beta.54",
8383
"@types/babel-core": "^6.25.5",
84+
"@types/babel__core": "^7.0.1",
8485
"@types/es6-shim": "0.31.37",
8586
"@types/fs-extra": "5.0.4",
8687
"@types/jest": "^23.3.0",
8788
"@types/lodash": "^4.14.109",
8889
"@types/node": "10.5.5",
8990
"@types/react": "16.4.7",
9091
"@types/yargs": "^11.0.0",
92+
"babel-core": "^7.0.0-0",
9193
"babel-jest": "^23.4.0",
9294
"babel-preset-jest": "^23.2.0",
93-
"babel-core": "^7.0.0-0",
9495
"cpx": "^1.5.0",
9596
"cross-spawn": "latest",
9697
"cross-spawn-with-kill": "latest",

src/postprocess.ts

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,32 @@
22
* Postprocess step. Based on babel-jest: https://github.com/facebook/jest/blob/master/packages/babel-jest/src/index.js
33
* https://github.com/facebook/jest/blob/9b157c3a7c325c3971b2aabbe4c8ab4ce0b0c56d/packages/babel-jest/src/index.js
44
*/
5-
import * as __types__babel from 'babel-core';
6-
import __types__istanbulPlugin from 'babel-plugin-istanbul';
7-
import * as __types__jestPreset from 'babel-preset-jest';
85
import {
96
BabelTransformOptions,
107
PostProcessHook,
11-
JestCacheKeyOptions,
8+
TBabel,
9+
TBabelPluginIstanbul,
10+
TBabelPresetJest,
1211
} from './types';
1312
import { logOnce } from './utils/logger';
1413
import getTSJestConfig from './utils/get-ts-jest-config';
14+
import {
15+
importBabelCore,
16+
importBabelPluginIstanbul,
17+
importBabelPresetJest,
18+
} from './utils/imports';
19+
import { TransformOptions } from '@babel/core';
1520

16-
let babel: typeof __types__babel;
17-
let istanbulPlugin: typeof __types__istanbulPlugin;
18-
let jestPreset: typeof __types__jestPreset;
21+
let babel: TBabel;
22+
let istanbulPlugin: TBabelPluginIstanbul;
23+
let jestPreset: TBabelPresetJest;
1924

2025
function importBabelDeps() {
2126
if (babel) return; // tslint:disable-line
2227
// we must use babel until we handle hoisting of jest.mock() internally
23-
babel = require('@babel/core');
24-
istanbulPlugin = require('babel-plugin-istanbul').default;
25-
jestPreset = require('babel-preset-jest');
28+
babel = importBabelCore();
29+
istanbulPlugin = importBabelPluginIstanbul();
30+
jestPreset = importBabelPresetJest();
2631
}
2732

2833
// Function that takes the transpiled typescript and runs it through babel/whatever.
@@ -62,13 +67,17 @@ function createBabelTransformer(
6267
codeSourcemapPair: jest.TransformedSource,
6368
filename: string,
6469
config: jest.ProjectConfig,
65-
transformOptions: JestCacheKeyOptions,
70+
transformOptions: jest.TransformOptions,
6671
): jest.TransformedSource => {
6772
const inputSourceMap =
6873
typeof codeSourcemapPair.map === 'string'
6974
? JSON.parse(codeSourcemapPair.map)
7075
: codeSourcemapPair.map;
71-
const theseOptions = { ...optionsBase, filename, inputSourceMap };
76+
const theseOptions = {
77+
...optionsBase,
78+
filename,
79+
inputSourceMap,
80+
} as TransformOptions;
7281
if (transformOptions && transformOptions.instrument) {
7382
theseOptions.auxiliaryCommentBefore = ' istanbul ignore next ';
7483
// Copied from jest-runtime transform.js

src/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
import { TransformOptions as BabelTransformOpts } from 'babel-core';
22

3+
import * as _babel from '@babel/core';
4+
import * as _babelEnv from '@babel/preset-env';
5+
import * as _babelJest from 'babel-preset-jest';
6+
import _babelIstanbul from 'babel-plugin-istanbul';
7+
8+
export type TBabel = typeof _babel;
9+
export type TBabelPluginIstanbul = typeof _babelIstanbul;
10+
export type TBabelPresetEnv = typeof _babelEnv;
11+
export type TBabelPresetJest = typeof _babelJest;
12+
313
export interface JestCacheKeyOptions {
414
rootDir: string;
515
instrument: boolean;

src/utils/imports.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import {
2+
TBabel,
3+
TBabelPresetEnv,
4+
TBabelPluginIstanbul,
5+
TBabelPresetJest,
6+
} from '../types';
7+
8+
export function importBabelCore(): TBabel {
9+
const mod = tryRequire('@babel/core') || tryRequire('babel-core');
10+
if (!mod) {
11+
throw new Error(
12+
`[ts-jest] You must install the '@babel/core' or 'babel-core'` +
13+
` package (depending on the version you want to use).`,
14+
);
15+
}
16+
return mod;
17+
}
18+
19+
export function importBabelPresetEnv(): TBabelPresetEnv {
20+
const mod = tryRequire('@babel/preset-env') || tryRequire('babel-preset-env');
21+
if (!mod) {
22+
throw new Error( // babel-jest has the env preset as a dep
23+
`[ts-jest] You must install the 'babel-jest' package if you're using babel.`,
24+
);
25+
}
26+
return mod;
27+
}
28+
29+
export function importBabelPresetJest(): TBabelPresetJest {
30+
const mod = tryRequire('babel-preset-jest');
31+
if (!mod) {
32+
throw new Error( // babel-jest has the jest preset as a dep
33+
`[ts-jest] You must install the 'babel-jest' package if you're using babel.`,
34+
);
35+
}
36+
return mod;
37+
}
38+
39+
export function importBabelPluginIstanbul(): TBabelPluginIstanbul {
40+
const mod = tryRequire('babel-plugin-istanbul');
41+
if (!mod) {
42+
throw new Error( // babel-jest has the istanbul plugin as a dep
43+
`[ts-jest] You must install the 'babel-jest' package if you're using babel.`,
44+
);
45+
}
46+
return mod.default;
47+
}
48+
49+
function tryRequire<T = any>(packageName: string): T | void {
50+
let mod: T;
51+
try {
52+
mod = require(packageName);
53+
} catch (err) {
54+
if (err.code !== 'ENOENT') throw err; // tslint:disable-line
55+
}
56+
return mod;
57+
}

yarn.lock

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,14 @@
515515
lodash "^4.17.5"
516516
to-fast-properties "^2.0.0"
517517

518+
"@babel/types@^7.0.0-beta.54":
519+
version "7.0.0-beta.55"
520+
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.55.tgz#7755c9d2e58315a64f05d8cf3322379be16d9199"
521+
dependencies:
522+
esutils "^2.0.2"
523+
lodash "^4.17.10"
524+
to-fast-properties "^2.0.0"
525+
518526
"@samverschueren/stream-to-observable@^0.3.0":
519527
version "0.3.0"
520528
resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
@@ -554,6 +562,12 @@
554562
version "7.0.4"
555563
resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.4.tgz#bfd5b0d0d1ba13e351dff65b6e52783b816826c8"
556564

565+
"@types/babel__core@^7.0.1":
566+
version "7.0.1"
567+
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.0.1.tgz#8b608a1c55cb4c752352cc6c78f7beb61a3fd51f"
568+
dependencies:
569+
"@babel/types" "^7.0.0-beta.54"
570+
557571
"@types/babylon@*":
558572
version "6.16.3"
559573
resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb"
@@ -3979,22 +3993,22 @@ rc@^1.1.7:
39793993
minimist "^1.2.0"
39803994
strip-json-comments "~2.0.1"
39813995

3982-
react-is@^16.4.1:
3983-
version "16.4.1"
3984-
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e"
3996+
react-is@^16.4.2:
3997+
version "16.4.2"
3998+
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88"
39853999

3986-
react-test-renderer@16.4.1:
3987-
version "16.4.1"
3988-
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70"
4000+
react-test-renderer@16.4.2:
4001+
version "16.4.2"
4002+
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.2.tgz#4e03eca9359bb3210d4373f7547d1364218ef74e"
39894003
dependencies:
39904004
fbjs "^0.8.16"
39914005
object-assign "^4.1.1"
39924006
prop-types "^15.6.0"
3993-
react-is "^16.4.1"
4007+
react-is "^16.4.2"
39944008

3995-
react@16.4.1:
3996-
version "16.4.1"
3997-
resolved "https://registry.yarnpkg.com/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32"
4009+
react@16.4.2:
4010+
version "16.4.2"
4011+
resolved "https://registry.yarnpkg.com/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f"
39984012
dependencies:
39994013
fbjs "^0.8.16"
40004014
loose-envify "^1.1.0"

0 commit comments

Comments
 (0)