Skip to content

Commit

Permalink
feat: pass ESM options to tarnsformers
Browse files Browse the repository at this point in the history
  • Loading branch information
SimenB committed Apr 4, 2020
1 parent 7e5e422 commit 6aa31e9
Show file tree
Hide file tree
Showing 12 changed files with 194 additions and 33 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,8 @@

### Features

- `[@jest/transformer]`: Support passing `supportsDynamicImport` and `supportsStaticESM` ([#9597](https://github.com/facebook/jest/pull/9597))

### Fixes

### Chore & Maintenance
Expand Down
2 changes: 1 addition & 1 deletion e2e/__tests__/__snapshots__/transform.test.ts.snap
Expand Up @@ -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:191:13)
at loadBabelConfig (../../../packages/babel-jest/build/index.js:212:13)
`;

exports[`babel-jest instruments only specific files and collects coverage 1`] = `
Expand Down
2 changes: 1 addition & 1 deletion packages/babel-jest/package.json
Expand Up @@ -20,7 +20,7 @@
"dependencies": {
"@jest/transform": "^25.2.6",
"@jest/types": "^25.2.6",
"@types/babel__core": "^7.1.0",
"@types/babel__core": "^7.1.7",
"babel-plugin-istanbul": "^6.0.0",
"babel-preset-jest": "^25.2.6",
"chalk": "^3.0.0",
Expand Down
70 changes: 66 additions & 4 deletions packages/babel-jest/src/__tests__/index.ts
Expand Up @@ -5,9 +5,18 @@
* LICENSE file in the root directory of this source tree.
*/

import babelJest from '../index';
import babelJest = require('../index');
import {loadPartialConfig} from '../loadBabelConfig';
import {makeProjectConfig} from '../../../../TestUtils';

jest.mock('../loadBabelConfig', () => {
const actual = jest.requireActual('@babel/core');

return {
loadPartialConfig: jest.fn((...args) => actual.loadPartialConfig(...args)),
};
});

//Mock data for all the tests
const sourceString = `
const sum = (a, b) => a+b;
Expand All @@ -21,7 +30,11 @@ const customMultiply = (obj, mul) => {
customMultiply({a: 32, dummy: "test"}, 2);
`;

test(`Returns source string with inline maps when no transformOptions is passed`, () => {
beforeEach(() => {
jest.clearAllMocks();
});

test('Returns source string with inline maps when no transformOptions is passed', () => {
const result = babelJest.process(
sourceString,
'dummy_path.js',
Expand All @@ -32,6 +45,55 @@ 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');
expect(result.map!.sources).toEqual(['dummy_path.js']);
expect(JSON.stringify(result.map!.sourcesContent)).toMatch('customMultiply');
});

describe('caller option correctly merges from defaults and options', () => {
test.each([
[
{
supportsDynamicImport: true,
supportsStaticESM: true,
},
{
supportsDynamicImport: true,
supportsStaticESM: true,
},
],
[
{
supportsDynamicImport: false,
supportsStaticESM: false,
},
{
supportsDynamicImport: false,
supportsStaticESM: false,
},
],
[
{supportsStaticESM: false},
{
supportsDynamicImport: false,
supportsStaticESM: false,
},
],
[
{supportsDynamicImport: true},
{
supportsDynamicImport: true,
supportsStaticESM: false,
},
],
])('%j -> %j', (input, output) => {
babelJest.process(sourceString, 'dummy_path.js', makeProjectConfig(), {
instrument: false,
...input,
});

expect(loadPartialConfig).toHaveBeenCalledTimes(1);
expect(loadPartialConfig).toHaveBeenCalledWith(
expect.objectContaining({caller: {name: 'babel-jest', ...output}}),
);
});
});
38 changes: 33 additions & 5 deletions packages/babel-jest/src/index.ts
Expand Up @@ -14,8 +14,8 @@ import {
PartialConfig,
TransformOptions,
transformSync as babelTransform,
loadPartialConfig,
} from '@babel/core';
import {loadPartialConfig} from './loadBabelConfig';
import chalk = require('chalk');
import slash = require('slash');

Expand All @@ -34,7 +34,9 @@ const createTransformer = (
options = {
...options,
caller: {
...options.caller,
name: 'babel-jest',
supportsDynamicImport: false,
supportsStaticESM: false,
},
compact: false,
Expand All @@ -46,9 +48,23 @@ const createTransformer = (
function loadBabelConfig(
cwd: Config.Path,
filename: Config.Path,
supportsDynamicImport?: boolean,
supportsStaticESM?: boolean,
): PartialConfig {
// `cwd` first to allow incoming options to override it
const babelConfig = loadPartialConfig({cwd, ...options, filename});
const babelConfig = loadPartialConfig({
cwd,
...options,
caller: {
...options.caller,
name: 'babel-jest',
supportsDynamicImport:
supportsDynamicImport ?? options.caller!.supportsDynamicImport,
supportsStaticESM:
supportsStaticESM ?? options.caller!.supportsStaticESM,
},
filename,
});

if (!babelConfig) {
throw new Error(
Expand All @@ -69,9 +85,14 @@ const createTransformer = (
fileData,
filename,
configString,
{config, instrument, rootDir},
{config, instrument, rootDir, supportsDynamicImport, supportsStaticESM},
) {
const babelOptions = loadBabelConfig(config.cwd, filename);
const babelOptions = loadBabelConfig(
config.cwd,
filename,
supportsDynamicImport,
supportsStaticESM,
);
const configPath = [
babelOptions.config || '',
babelOptions.babelrc || '',
Expand All @@ -98,7 +119,14 @@ const createTransformer = (
.digest('hex');
},
process(src, filename, config, transformOptions) {
const babelOptions = {...loadBabelConfig(config.cwd, filename).options};
const babelOptions = {
...loadBabelConfig(
config.cwd,
filename,
transformOptions?.supportsDynamicImport,
transformOptions?.supportsStaticESM,
).options,
};

if (transformOptions && transformOptions.instrument) {
babelOptions.auxiliaryCommentBefore = ' istanbul ignore next ';
Expand Down
9 changes: 9 additions & 0 deletions packages/babel-jest/src/loadBabelConfig.ts
@@ -0,0 +1,9 @@
/**
* 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.
*/

// this is a separate file so it can be mocked in tests
export {loadPartialConfig} from '@babel/core';
10 changes: 5 additions & 5 deletions packages/jest-runtime/src/index.ts
Expand Up @@ -497,11 +497,9 @@ class Runtime {
): TransformationOptions {
return {
...options,
changedFiles: this._coverageOptions.changedFiles,
collectCoverage: this._coverageOptions.collectCoverage,
collectCoverageFrom: this._coverageOptions.collectCoverageFrom,
collectCoverageOnlyFrom: this._coverageOptions.collectCoverageOnlyFrom,
coverageProvider: this._coverageOptions.coverageProvider,
...this._coverageOptions,
supportsDynamicImport: false,
supportsStaticESM: false,
};
}

Expand Down Expand Up @@ -778,6 +776,8 @@ class Runtime {
filename,
this._getFullTransformationOptions(options),
this._cacheFS[filename],
false,
false,
);

// we only care about non-internal modules
Expand Down
1 change: 1 addition & 0 deletions packages/jest-runtime/tsconfig.json
Expand Up @@ -17,6 +17,7 @@
{"path": "../jest-snapshot"},
{"path": "../jest-source-map"},
{"path": "../jest-test-result"},
{"path": "../jest-transform"},
{"path": "../jest-types"},
{"path": "../jest-util"},
{"path": "../jest-validate"},
Expand Down

0 comments on commit 6aa31e9

Please sign in to comment.