Skip to content

Commit 95169d3

Browse files
authored
chore: support more caller options in babel-jest (#10752)
1 parent 16c082c commit 95169d3

File tree

6 files changed

+51
-11
lines changed

6 files changed

+51
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
- `[jest-config]` Throw correct error for missing preset modules ([#10737](https://github.com/facebook/jest/pull/10737))
1515
- `[jest-resolve-dependencies]` Resolve mocks as dependencies ([#10713](https://github.com/facebook/jest/pull/10713))
1616
- `[jest-runtime]` Handle file URLs in dynamic imports ([#10744](https://github.com/facebook/jest/pull/10744))
17+
- `[jest-runtime, babel-jest]` Pass more ESM options to `@jest/transform` ([#10752](https://github.com/facebook/jest/pull/10752))
1718
- `[jest-transform]` Link to ESM docs on syntax errors ([#10748](https://github.com/facebook/jest/pull/10748))
1819

1920
### Chore & Maintenance

e2e/__tests__/__snapshots__/transform.test.ts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ FAIL __tests__/ignoredFile.test.js
66
77
babel-jest: Babel ignores __tests__/ignoredFile.test.js - make sure to include the file in Jest's transformIgnorePatterns as well.
88
9-
at loadBabelConfig (../../../packages/babel-jest/build/index.js:180:13)
9+
at loadBabelConfig (../../../packages/babel-jest/build/index.js:201:13)
1010
`;
1111

1212
exports[`babel-jest instruments only specific files and collects coverage 1`] = `

packages/babel-jest/src/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ interface BabelJestTransformOptions extends TransformOptions {
4040
sourceMaps: 'both';
4141
}
4242

43+
// https://github.com/DefinitelyTyped/DefinitelyTyped/pull/49267
44+
declare module '@babel/core' {
45+
interface TransformCaller {
46+
supportsExportNamespaceFrom?: boolean;
47+
supportsTopLevelAwait?: boolean;
48+
}
49+
}
50+
4351
const createTransformer = (
4452
userOptions?: TransformOptions | null,
4553
): BabelJestTransformer => {
@@ -49,7 +57,9 @@ const createTransformer = (
4957
caller: {
5058
name: 'babel-jest',
5159
supportsDynamicImport: false,
60+
supportsExportNamespaceFrom: false,
5261
supportsStaticESM: false,
62+
supportsTopLevelAwait: false,
5363
...inputOptions.caller,
5464
},
5565
compact: false,
@@ -72,9 +82,15 @@ const createTransformer = (
7282
supportsDynamicImport:
7383
transformOptions?.supportsDynamicImport ??
7484
options.caller.supportsDynamicImport,
85+
supportsExportNamespaceFrom:
86+
transformOptions?.supportsExportNamespaceFrom ??
87+
options.caller.supportsExportNamespaceFrom,
7588
supportsStaticESM:
7689
transformOptions?.supportsStaticESM ??
7790
options.caller.supportsStaticESM,
91+
supportsTopLevelAwait:
92+
transformOptions?.supportsTopLevelAwait ??
93+
options.caller.supportsTopLevelAwait,
7894
},
7995
filename,
8096
});

packages/jest-runtime/src/index.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {formatStackTrace, separateMessageFromStack} from 'jest-message-util';
3434
import {createDirectory, deepCyclicCopy} from 'jest-util';
3535
import {escapePathForRegex} from 'jest-regex-util';
3636
import {
37+
CallerTransformOptions,
3738
ScriptTransformer,
3839
ShouldInstrumentOptions,
3940
TransformationOptions,
@@ -75,16 +76,16 @@ type HasteMapOptions = {
7576
watchman: boolean;
7677
};
7778

78-
type InternalModuleOptions = {
79+
interface InternalModuleOptions extends Required<CallerTransformOptions> {
7980
isInternalModule: boolean;
80-
supportsDynamicImport: boolean;
81-
supportsStaticESM: boolean;
82-
};
81+
}
8382

8483
const defaultTransformOptions: InternalModuleOptions = {
8584
isInternalModule: false,
8685
supportsDynamicImport: esmIsAvailable,
86+
supportsExportNamespaceFrom: false,
8787
supportsStaticESM: false,
88+
supportsTopLevelAwait: false,
8889
};
8990

9091
type InitialModule = Omit<Module, 'require' | 'parent' | 'paths'>;
@@ -141,6 +142,19 @@ type RunScriptEvalResult = {[EVAL_RESULT_VARIABLE]: ModuleWrapper};
141142

142143
const runtimeSupportsVmModules = typeof SyntheticModule === 'function';
143144

145+
const supportsTopLevelAwait =
146+
runtimeSupportsVmModules &&
147+
(() => {
148+
try {
149+
// eslint-disable-next-line no-new
150+
new SourceTextModule('await Promise.resolve()');
151+
152+
return true;
153+
} catch {
154+
return false;
155+
}
156+
})();
157+
144158
class Runtime {
145159
private _cacheFS: StringMap;
146160
private _config: Config.ProjectConfig;
@@ -378,7 +392,9 @@ class Runtime {
378392
const transformedCode = this.transformFile(modulePath, {
379393
isInternalModule: false,
380394
supportsDynamicImport: true,
395+
supportsExportNamespaceFrom: true,
381396
supportsStaticESM: true,
397+
supportsTopLevelAwait,
382398
});
383399

384400
const module = new SourceTextModule(transformedCode, {
@@ -608,7 +624,9 @@ class Runtime {
608624
return this.requireModule<T>(from, to, {
609625
isInternalModule: true,
610626
supportsDynamicImport: esmIsAvailable,
627+
supportsExportNamespaceFrom: false,
611628
supportsStaticESM: false,
629+
supportsTopLevelAwait: false,
612630
});
613631
}
614632

packages/jest-transform/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export {
1212
export {default as shouldInstrument} from './shouldInstrument';
1313
export type {
1414
CacheKeyOptions,
15+
CallerTransformOptions,
1516
Transformer,
1617
ShouldInstrumentOptions,
1718
Options as TransformationOptions,

packages/jest-transform/src/types.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ export type Options = ShouldInstrumentOptions &
2323
Partial<{
2424
isCoreModule: boolean;
2525
isInternalModule: boolean;
26-
supportsDynamicImport: boolean;
27-
supportsStaticESM: boolean;
28-
}>;
26+
}> &
27+
CallerTransformOptions;
2928

3029
// This is fixed in [email protected], but we can't upgrade yet since it's async
3130
interface FixedRawSourceMap extends Omit<RawSourceMap, 'version'> {
@@ -39,11 +38,16 @@ export type TransformedSource =
3938

4039
export type TransformResult = TransformTypes.TransformResult;
4140

42-
export interface TransformOptions {
43-
instrument: boolean;
44-
// names are copied from babel
41+
export interface CallerTransformOptions {
42+
// names are copied from babel: https://babeljs.io/docs/en/options#caller
4543
supportsDynamicImport?: boolean;
44+
supportsExportNamespaceFrom?: boolean;
4645
supportsStaticESM?: boolean;
46+
supportsTopLevelAwait?: boolean;
47+
}
48+
49+
export interface TransformOptions extends CallerTransformOptions {
50+
instrument: boolean;
4751
}
4852

4953
// TODO: For Jest 26 we should combine these into one options shape

0 commit comments

Comments
 (0)