Skip to content

Commit

Permalink
chore: support more caller options in babel-jest
Browse files Browse the repository at this point in the history
  • Loading branch information
SimenB committed Oct 31, 2020
1 parent 1a06c2c commit 58e1fb1
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -14,6 +14,7 @@
- `[jest-config]` Throw correct error for missing preset modules ([#10737](https://github.com/facebook/jest/pull/10737))
- `[jest-resolve-dependencies]` Resolve mocks as dependencies ([#10713](https://github.com/facebook/jest/pull/10713))
- `[jest-runtime]` Handle file URLs in dynamic imports ([#10744](https://github.com/facebook/jest/pull/10744))
- `[jest-runtime, babel-jest]` Pass more ESM options to `@jest/transform` ([#10751](https://github.com/facebook/jest/pull/10751))
- `[jest-transform]` Link to ESM docs on syntax errors ([#10748](https://github.com/facebook/jest/pull/10748))

### 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:180:13)
at loadBabelConfig (../../../packages/babel-jest/build/index.js:201:13)
`;

exports[`babel-jest instruments only specific files and collects coverage 1`] = `
Expand Down
16 changes: 16 additions & 0 deletions packages/babel-jest/src/index.ts
Expand Up @@ -40,6 +40,14 @@ interface BabelJestTransformOptions extends TransformOptions {
sourceMaps: 'both';
}

// https://github.com/DefinitelyTyped/DefinitelyTyped/pull/49267
declare module '@babel/core' {
interface TransformCaller {
supportsExportNamespaceFrom?: boolean;
supportsTopLevelAwait?: boolean;
}
}

const createTransformer = (
userOptions?: TransformOptions | null,
): BabelJestTransformer => {
Expand All @@ -49,7 +57,9 @@ const createTransformer = (
caller: {
name: 'babel-jest',
supportsDynamicImport: false,
supportsExportNamespaceFrom: false,
supportsStaticESM: false,
supportsTopLevelAwait: false,
...inputOptions.caller,
},
compact: false,
Expand All @@ -72,9 +82,15 @@ const createTransformer = (
supportsDynamicImport:
transformOptions?.supportsDynamicImport ??
options.caller.supportsDynamicImport,
supportsExportNamespaceFrom:
transformOptions?.supportsExportNamespaceFrom ??
options.caller.supportsExportNamespaceFrom,
supportsStaticESM:
transformOptions?.supportsStaticESM ??
options.caller.supportsStaticESM,
supportsTopLevelAwait:
transformOptions?.supportsTopLevelAwait ??
options.caller.supportsTopLevelAwait,
},
filename,
});
Expand Down
2 changes: 2 additions & 0 deletions packages/jest-runtime/package.json
Expand Up @@ -34,6 +34,7 @@
"jest-snapshot": "^26.6.1",
"jest-util": "^26.6.1",
"jest-validate": "^26.6.1",
"semver": "^7.3.2",
"slash": "^3.0.0",
"strip-bom": "^4.0.0",
"yargs": "^15.4.1"
Expand All @@ -44,6 +45,7 @@
"@types/glob": "^7.1.1",
"@types/graceful-fs": "^4.1.2",
"@types/node": "^14.0.27",
"@types/semver": "^7.3.4",
"execa": "^4.0.0",
"jest-environment-node": "^26.6.1",
"jest-snapshot-serializer-raw": "^1.1.0"
Expand Down
16 changes: 12 additions & 4 deletions packages/jest-runtime/src/index.ts
Expand Up @@ -18,6 +18,7 @@ import {
Module as VMModule,
} from 'vm';
import * as nativeModule from 'module';
import * as semver from 'semver';
// @ts-expect-error
import parseCjs = require('cjs-module-lexer');
import type {Config, Global} from '@jest/types';
Expand All @@ -34,6 +35,7 @@ import {formatStackTrace, separateMessageFromStack} from 'jest-message-util';
import {createDirectory, deepCyclicCopy} from 'jest-util';
import {escapePathForRegex} from 'jest-regex-util';
import {
CallerTransformOptions,
ScriptTransformer,
ShouldInstrumentOptions,
TransformationOptions,
Expand Down Expand Up @@ -75,18 +77,20 @@ type HasteMapOptions = {
watchman: boolean;
};

type InternalModuleOptions = {
interface InternalModuleOptions extends Required<CallerTransformOptions> {
isInternalModule: boolean;
supportsDynamicImport: boolean;
supportsStaticESM: boolean;
};
}

const defaultTransformOptions: InternalModuleOptions = {
isInternalModule: false,
supportsDynamicImport: esmIsAvailable,
supportsExportNamespaceFrom: false,
supportsStaticESM: false,
supportsTopLevelAwait: false,
};

const nodeVersionSupportsTla = semver.satisfies(process.version, '>=14.3.0');

type InitialModule = Omit<Module, 'require' | 'parent' | 'paths'>;
type ModuleRegistry = Map<string, InitialModule | Module>;

Expand Down Expand Up @@ -378,7 +382,9 @@ class Runtime {
const transformedCode = this.transformFile(modulePath, {
isInternalModule: false,
supportsDynamicImport: true,
supportsExportNamespaceFrom: true,
supportsStaticESM: true,
supportsTopLevelAwait: nodeVersionSupportsTla,
});

const module = new SourceTextModule(transformedCode, {
Expand Down Expand Up @@ -608,7 +614,9 @@ class Runtime {
return this.requireModule<T>(from, to, {
isInternalModule: true,
supportsDynamicImport: esmIsAvailable,
supportsExportNamespaceFrom: false,
supportsStaticESM: false,
supportsTopLevelAwait: false,
});
}

Expand Down
1 change: 1 addition & 0 deletions packages/jest-transform/src/index.ts
Expand Up @@ -12,6 +12,7 @@ export {
export {default as shouldInstrument} from './shouldInstrument';
export type {
CacheKeyOptions,
CallerTransformOptions,
Transformer,
ShouldInstrumentOptions,
Options as TransformationOptions,
Expand Down
16 changes: 10 additions & 6 deletions packages/jest-transform/src/types.ts
Expand Up @@ -23,9 +23,8 @@ export type Options = ShouldInstrumentOptions &
Partial<{
isCoreModule: boolean;
isInternalModule: boolean;
supportsDynamicImport: boolean;
supportsStaticESM: boolean;
}>;
}> &
CallerTransformOptions;

// This is fixed in source-map@0.7.x, but we can't upgrade yet since it's async
interface FixedRawSourceMap extends Omit<RawSourceMap, 'version'> {
Expand All @@ -39,11 +38,16 @@ export type TransformedSource =

export type TransformResult = TransformTypes.TransformResult;

export interface TransformOptions {
instrument: boolean;
// names are copied from babel
export interface CallerTransformOptions {
// names are copied from babel: https://babeljs.io/docs/en/options#caller
supportsDynamicImport?: boolean;
supportsExportNamespaceFrom?: boolean;
supportsStaticESM?: boolean;
supportsTopLevelAwait?: boolean;
}

export interface TransformOptions extends CallerTransformOptions {
instrument: boolean;
}

// TODO: For Jest 26 we should combine these into one options shape
Expand Down
4 changes: 3 additions & 1 deletion yarn.lock
Expand Up @@ -3747,7 +3747,7 @@ __metadata:
languageName: node
linkType: hard

"@types/semver@npm:^7.1.0":
"@types/semver@npm:^7.1.0, @types/semver@npm:^7.3.4":
version: 7.3.4
resolution: "@types/semver@npm:7.3.4"
checksum: 7e8588aa55ecb344eda6954674b83a3c568d97d478e70e4617bd3ab22902590ac416ccf2cea48b58fb2f0fbd80f9ad1896332c9b3c3189ffd24e4350ff22094a
Expand Down Expand Up @@ -11957,6 +11957,7 @@ fsevents@^1.2.7:
"@types/glob": ^7.1.1
"@types/graceful-fs": ^4.1.2
"@types/node": ^14.0.27
"@types/semver": ^7.3.4
"@types/yargs": ^15.0.0
chalk: ^4.0.0
cjs-module-lexer: ^0.4.2
Expand All @@ -11976,6 +11977,7 @@ fsevents@^1.2.7:
jest-snapshot-serializer-raw: ^1.1.0
jest-util: ^26.6.1
jest-validate: ^26.6.1
semver: ^7.3.2
slash: ^3.0.0
strip-bom: ^4.0.0
yargs: ^15.4.1
Expand Down

0 comments on commit 58e1fb1

Please sign in to comment.