From 159a73e32280f05ee7ec93d439292edfa17cc171 Mon Sep 17 00:00:00 2001 From: M4rk9696 Date: Sat, 27 Jul 2019 20:03:51 +0530 Subject: [PATCH 1/7] refactor: Extract transform code to @jest-transform --- packages/jest-core/package.json | 1 - packages/jest-core/src/runGlobalHook.ts | 37 ++----------------- packages/jest-transform/package.json | 1 + .../jest-transform/src/ScriptTransformer.ts | 33 +++++++++++++++++ 4 files changed, 37 insertions(+), 35 deletions(-) diff --git a/packages/jest-core/package.json b/packages/jest-core/package.json index 7986a583c215..89a8a31d4177 100644 --- a/packages/jest-core/package.json +++ b/packages/jest-core/package.json @@ -29,7 +29,6 @@ "jest-watcher": "^24.8.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", - "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", "slash": "^2.0.0", diff --git a/packages/jest-core/src/runGlobalHook.ts b/packages/jest-core/src/runGlobalHook.ts index 6b20792ba019..d2451156e230 100644 --- a/packages/jest-core/src/runGlobalHook.ts +++ b/packages/jest-core/src/runGlobalHook.ts @@ -5,9 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import {extname} from 'path'; import pEachSeries from 'p-each-series'; -import {addHook} from 'pirates'; import {Config} from '@jest/types'; import {Test} from 'jest-runner'; import {ScriptTransformer} from '@jest/transform'; @@ -47,36 +45,9 @@ export default async ({ const transformer = new ScriptTransformer(projectConfig); - // Load the transformer to avoid a cycle where we need to load a - // transformer in order to transform it in the require hooks - transformer.preloadTransformer(modulePath); - - let transforming = false; - const revertHook = addHook( - (code, filename) => { - try { - transforming = true; - return ( - transformer.transformSource(filename, code, false).code || code - ); - } finally { - transforming = false; - } - }, - { - exts: [extname(modulePath)], - ignoreNodeModules: false, - matcher: (...args) => { - if (transforming) { - // Don't transform any dependency required by the transformer itself - return false; - } - return transformer.shouldTransform(...args); - }, - }, - ); - - const globalModule = interopRequireDefault(require(modulePath)).default; + const globalModule = interopRequireDefault( + transformer.requireAndTranspileModule(modulePath), + ).default; if (typeof globalModule !== 'function') { throw new TypeError( @@ -85,8 +56,6 @@ export default async ({ } await globalModule(globalConfig); - - revertHook(); }); } diff --git a/packages/jest-transform/package.json b/packages/jest-transform/package.json index 36db7ac359b2..bf3b6f14792f 100644 --- a/packages/jest-transform/package.json +++ b/packages/jest-transform/package.json @@ -20,6 +20,7 @@ "jest-regex-util": "^24.3.0", "jest-util": "^24.8.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index aa594db3ed00..d6804a8418ac 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -20,6 +20,7 @@ import stableStringify from 'fast-json-stable-stringify'; import slash from 'slash'; import writeFileAtomic from 'write-file-atomic'; import {sync as realpath} from 'realpath-native'; +import {addHook} from 'pirates'; import { Options, Transformer, @@ -434,6 +435,38 @@ export default class ScriptTransformer { return fileSource; } + requireAndTranspileModule(moduleName: string): any { + // 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); + + let transforming = false; + const revertHook = addHook( + (code, filename) => { + try { + transforming = true; + return this.transformSource(filename, code, false).code || code; + } finally { + transforming = false; + } + }, + { + exts: [path.extname(moduleName)], + ignoreNodeModules: false, + matcher: (...args) => { + if (transforming) { + // Don't transform any dependency required by the transformer itself + return false; + } + return this.shouldTransform(...args); + }, + }, + ); + const module = require(moduleName); + revertHook(); + return module; + } + /** * @deprecated use `this.shouldTransform` instead */ From 83613778f1b116d35f5c233c18b074dd2dadaabe Mon Sep 17 00:00:00 2001 From: M4rk9696 Date: Sat, 27 Jul 2019 20:12:11 +0530 Subject: [PATCH 2/7] docs: Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64375e1d65d9..999a97251162 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ - `[jest-validate]` Allow `maxWorkers` as part of the `jest.config.js` ([#8565](https://github.com/facebook/jest/pull/8565)) - `[jest-runtime]` Allow passing configuration objects to transformers ([#7288](https://github.com/facebook/jest/pull/7288)) - `[@jest/core, @jest/test-sequencer]` Support async sort in custom `testSequencer` ([#8642](https://github.com/facebook/jest/pull/8642)) +- `[@jest-transform]` Extract transforming require logic within `jest-core` into + `@jest-transform` ([#8756](https://github.com/facebook/jest/pull/8756)) ### Fixes From 918ea885eca431caf167d98a3e2a9c30def03cdd Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sat, 27 Jul 2019 17:04:31 +0200 Subject: [PATCH 3/7] Update CHANGELOG.md --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 999a97251162..a4a03f50c266 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,8 +17,7 @@ - `[jest-validate]` Allow `maxWorkers` as part of the `jest.config.js` ([#8565](https://github.com/facebook/jest/pull/8565)) - `[jest-runtime]` Allow passing configuration objects to transformers ([#7288](https://github.com/facebook/jest/pull/7288)) - `[@jest/core, @jest/test-sequencer]` Support async sort in custom `testSequencer` ([#8642](https://github.com/facebook/jest/pull/8642)) -- `[@jest-transform]` Extract transforming require logic within `jest-core` into - `@jest-transform` ([#8756](https://github.com/facebook/jest/pull/8756)) +- `[@jest-transform]` Extract transforming require logic within `jest-core` into `@jest-transform` ([#8756](https://github.com/facebook/jest/pull/8756)) ### Fixes From 2ffeed334354ef34eb466fa992f390b7865dc28b Mon Sep 17 00:00:00 2001 From: M4rk9696 Date: Sat, 27 Jul 2019 23:36:54 +0530 Subject: [PATCH 4/7] chore: Review changes - Change arguments of matcher to single arg - Add option for callback in requireAndTranspileModule --- packages/jest-core/src/runGlobalHook.ts | 2 +- packages/jest-transform/src/ScriptTransformer.ts | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/jest-core/src/runGlobalHook.ts b/packages/jest-core/src/runGlobalHook.ts index d2451156e230..bcfd3020ce23 100644 --- a/packages/jest-core/src/runGlobalHook.ts +++ b/packages/jest-core/src/runGlobalHook.ts @@ -46,7 +46,7 @@ export default async ({ const transformer = new ScriptTransformer(projectConfig); const globalModule = interopRequireDefault( - transformer.requireAndTranspileModule(modulePath), + await transformer.requireAndTranspileModule(modulePath), ).default; if (typeof globalModule !== 'function') { diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index d6804a8418ac..30787fdbeab3 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -435,7 +435,10 @@ export default class ScriptTransformer { return fileSource; } - requireAndTranspileModule(moduleName: string): any { + async requireAndTranspileModule( + moduleName: string, + callback?: (module: any) => Promise, + ): 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); @@ -453,16 +456,19 @@ export default class ScriptTransformer { { exts: [path.extname(moduleName)], ignoreNodeModules: false, - matcher: (...args) => { + matcher: filename => { if (transforming) { // Don't transform any dependency required by the transformer itself return false; } - return this.shouldTransform(...args); + return this.shouldTransform(filename); }, }, ); const module = require(moduleName); + if (callback) { + await callback(module); + } revertHook(); return module; } From 093c8e4a126b09f07af9903652311263cc99a1d3 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sat, 27 Jul 2019 20:26:30 +0200 Subject: [PATCH 5/7] chore: move global hook into callback --- packages/jest-core/src/runGlobalHook.ts | 20 +++++++++---------- .../jest-transform/src/ScriptTransformer.ts | 13 ++++++++---- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/jest-core/src/runGlobalHook.ts b/packages/jest-core/src/runGlobalHook.ts index bcfd3020ce23..f0490863c924 100644 --- a/packages/jest-core/src/runGlobalHook.ts +++ b/packages/jest-core/src/runGlobalHook.ts @@ -45,17 +45,17 @@ export default async ({ const transformer = new ScriptTransformer(projectConfig); - const globalModule = interopRequireDefault( - await transformer.requireAndTranspileModule(modulePath), - ).default; - - if (typeof globalModule !== 'function') { - throw new TypeError( - `${moduleName} file must export a function at ${modulePath}`, - ); - } + await transformer.requireAndTranspileModule(modulePath, async m => { + const globalModule = interopRequireDefault(m).default; + + if (typeof globalModule !== 'function') { + throw new TypeError( + `${moduleName} file must export a function at ${modulePath}`, + ); + } - await globalModule(globalConfig); + await globalModule(globalConfig); + }); }); } diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index 30787fdbeab3..b9d5254c6338 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -437,7 +437,7 @@ export default class ScriptTransformer { async requireAndTranspileModule( moduleName: string, - callback?: (module: any) => Promise, + callback?: (module: any) => void | Promise, ): Promise { // Load the transformer to avoid a cycle where we need to load a // transformer in order to transform it in the require hooks @@ -466,10 +466,15 @@ export default class ScriptTransformer { }, ); const module = require(moduleName); - if (callback) { - await callback(module); + + try { + if (callback) { + await callback(module); + } + } finally { + revertHook(); } - revertHook(); + return module; } From cb35b6757d1de99b6f97f77df3e45f96507d85b0 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sat, 27 Jul 2019 20:33:17 +0200 Subject: [PATCH 6/7] chore: make function generic --- packages/jest-transform/src/ScriptTransformer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index b9d5254c6338..6390c36eefd7 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -435,10 +435,10 @@ export default class ScriptTransformer { return fileSource; } - async requireAndTranspileModule( + async requireAndTranspileModule( moduleName: string, - callback?: (module: any) => void | Promise, - ): Promise { + callback?: (module: ModuleType) => void | Promise, + ): 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); From ddb7c6a64702dece0fde11afb31972e9ec721703 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sat, 27 Jul 2019 20:35:29 +0200 Subject: [PATCH 7/7] default to unknown --- packages/jest-transform/src/ScriptTransformer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/jest-transform/src/ScriptTransformer.ts b/packages/jest-transform/src/ScriptTransformer.ts index 6390c36eefd7..aafff4c113fe 100644 --- a/packages/jest-transform/src/ScriptTransformer.ts +++ b/packages/jest-transform/src/ScriptTransformer.ts @@ -435,7 +435,7 @@ export default class ScriptTransformer { return fileSource; } - async requireAndTranspileModule( + async requireAndTranspileModule( moduleName: string, callback?: (module: ModuleType) => void | Promise, ): Promise { @@ -465,7 +465,7 @@ export default class ScriptTransformer { }, }, ); - const module = require(moduleName); + const module: ModuleType = require(moduleName); try { if (callback) {