From 14df1ff9b2130e4aabe92dba2da9ae817e25e753 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sun, 11 Aug 2019 13:29:43 +0200 Subject: [PATCH 1/2] feat: add sync way of requiring and transpiling module --- .../jest-transform/src/ScriptTransformer.ts | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index aafff4c113fe..7d3137a04d49 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -9,7 +9,7 @@ import crypto from 'crypto'; import path from 'path'; import vm from 'vm'; import {Config} from '@jest/types'; -import {createDirectory} from 'jest-util'; +import {createDirectory, isPromise} from 'jest-util'; import fs from 'graceful-fs'; import {transformSync as babelTransform} from '@babel/core'; // @ts-ignore: should just be `require.resolve`, but the tests mess that up @@ -435,10 +435,18 @@ export default class ScriptTransformer { return fileSource; } - async requireAndTranspileModule( + requireAndTranspileModule( + moduleName: string, + callback?: (module: ModuleType) => void, + ): ModuleType; + requireAndTranspileModule( + moduleName: string, + callback?: (module: ModuleType) => Promise, + ): Promise; + requireAndTranspileModule( moduleName: string, callback?: (module: ModuleType) => void | Promise, - ): Promise { + ): ModuleType | Promise { // Load the transformer to avoid a cycle where we need to load a // transformer in order to transform it in the require hooks this.preloadTransformer(moduleName); @@ -467,9 +475,28 @@ export default class ScriptTransformer { ); const module: ModuleType = require(moduleName); + if (!callback) { + revertHook(); + + return module; + } + try { - if (callback) { - await callback(module); + const cbResult = callback(module); + + if (isPromise(cbResult)) { + return cbResult.then( + () => { + revertHook(); + + return module; + }, + error => { + revertHook(); + + return Promise.reject(error); + }, + ); } } finally { revertHook(); From 192893e9b416a382b7de95eaad8a068afc25ba95 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sun, 11 Aug 2019 18:48:15 +0200 Subject: [PATCH 2/2] await-finally helper --- .../jest-transform/src/ScriptTransformer.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index 7d3137a04d49..1f7506b7af0e 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -51,6 +51,17 @@ const projectCaches: WeakMap< // To reset the cache for specific changesets (rather than package version). const CACHE_VERSION = '1'; +async function waitForPromiseWithCleanup( + promise: Promise, + cleanup: () => void, +) { + try { + await promise; + } finally { + cleanup(); + } +} + export default class ScriptTransformer { static EVAL_RESULT_VARIABLE: 'Object.'; private _cache: ProjectCache; @@ -485,17 +496,8 @@ export default class ScriptTransformer { const cbResult = callback(module); if (isPromise(cbResult)) { - return cbResult.then( - () => { - revertHook(); - - return module; - }, - error => { - revertHook(); - - return Promise.reject(error); - }, + return waitForPromiseWithCleanup(cbResult, revertHook).then( + () => module, ); } } finally {