From 95169d3595da596eb06432f4077729d45f0144f9 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sat, 31 Oct 2020 17:02:32 +0100 Subject: [PATCH] chore: support more caller options in babel-jest (#10752) --- CHANGELOG.md | 1 + .../__snapshots__/transform.test.ts.snap | 2 +- packages/babel-jest/src/index.ts | 16 ++++++++++++ packages/jest-runtime/src/index.ts | 26 ++++++++++++++++--- packages/jest-transform/src/index.ts | 1 + packages/jest-transform/src/types.ts | 16 +++++++----- 6 files changed, 51 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfc4ba2f0516..6c74a6b548c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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` ([#10752](https://github.com/facebook/jest/pull/10752)) - `[jest-transform]` Link to ESM docs on syntax errors ([#10748](https://github.com/facebook/jest/pull/10748)) ### Chore & Maintenance diff --git a/e2e/__tests__/__snapshots__/transform.test.ts.snap b/e2e/__tests__/__snapshots__/transform.test.ts.snap index ee94c751c5ab..98335dc0a903 100644 --- a/e2e/__tests__/__snapshots__/transform.test.ts.snap +++ b/e2e/__tests__/__snapshots__/transform.test.ts.snap @@ -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`] = ` diff --git a/packages/babel-jest/src/index.ts b/packages/babel-jest/src/index.ts index f5fbfc1d44a6..6f7d08202c5b 100644 --- a/packages/babel-jest/src/index.ts +++ b/packages/babel-jest/src/index.ts @@ -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 => { @@ -49,7 +57,9 @@ const createTransformer = ( caller: { name: 'babel-jest', supportsDynamicImport: false, + supportsExportNamespaceFrom: false, supportsStaticESM: false, + supportsTopLevelAwait: false, ...inputOptions.caller, }, compact: false, @@ -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, }); diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 03f5f8610ec8..8af7c41b0135 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -34,6 +34,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, @@ -75,16 +76,16 @@ type HasteMapOptions = { watchman: boolean; }; -type InternalModuleOptions = { +interface InternalModuleOptions extends Required { isInternalModule: boolean; - supportsDynamicImport: boolean; - supportsStaticESM: boolean; -}; +} const defaultTransformOptions: InternalModuleOptions = { isInternalModule: false, supportsDynamicImport: esmIsAvailable, + supportsExportNamespaceFrom: false, supportsStaticESM: false, + supportsTopLevelAwait: false, }; type InitialModule = Omit; @@ -141,6 +142,19 @@ type RunScriptEvalResult = {[EVAL_RESULT_VARIABLE]: ModuleWrapper}; const runtimeSupportsVmModules = typeof SyntheticModule === 'function'; +const supportsTopLevelAwait = + runtimeSupportsVmModules && + (() => { + try { + // eslint-disable-next-line no-new + new SourceTextModule('await Promise.resolve()'); + + return true; + } catch { + return false; + } + })(); + class Runtime { private _cacheFS: StringMap; private _config: Config.ProjectConfig; @@ -378,7 +392,9 @@ class Runtime { const transformedCode = this.transformFile(modulePath, { isInternalModule: false, supportsDynamicImport: true, + supportsExportNamespaceFrom: true, supportsStaticESM: true, + supportsTopLevelAwait, }); const module = new SourceTextModule(transformedCode, { @@ -608,7 +624,9 @@ class Runtime { return this.requireModule(from, to, { isInternalModule: true, supportsDynamicImport: esmIsAvailable, + supportsExportNamespaceFrom: false, supportsStaticESM: false, + supportsTopLevelAwait: false, }); } diff --git a/packages/jest-transform/src/index.ts b/packages/jest-transform/src/index.ts index a104f5197968..efcdbfc65ae4 100644 --- a/packages/jest-transform/src/index.ts +++ b/packages/jest-transform/src/index.ts @@ -12,6 +12,7 @@ export { export {default as shouldInstrument} from './shouldInstrument'; export type { CacheKeyOptions, + CallerTransformOptions, Transformer, ShouldInstrumentOptions, Options as TransformationOptions, diff --git a/packages/jest-transform/src/types.ts b/packages/jest-transform/src/types.ts index 483c8e6cc9a4..979c16c8ad42 100644 --- a/packages/jest-transform/src/types.ts +++ b/packages/jest-transform/src/types.ts @@ -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 { @@ -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