@@ -15,26 +15,17 @@ import type { Config } from '@jest/types'
15
15
import { LogContexts , Logger } from 'bs-logger'
16
16
import { globsToMatcher } from 'jest-util'
17
17
import json5 from 'json5'
18
- import {
19
- CompilerOptions ,
20
- CustomTransformers ,
21
- Diagnostic ,
22
- FormatDiagnosticsHost ,
23
- ParsedCommandLine ,
24
- DiagnosticCategory ,
25
- ModuleKind ,
26
- ScriptTarget ,
27
- } from 'typescript'
18
+ import type { CompilerOptions , Diagnostic , FormatDiagnosticsHost , ParsedCommandLine } from 'typescript'
28
19
29
20
import { DEFAULT_JEST_TEST_MATCH , JS_JSX_EXTENSIONS } from '../constants'
30
- import { factory as hoisting } from '../transformers/hoist-jest'
31
21
import type {
32
22
AstTransformer ,
23
+ AstTransformerDesc ,
33
24
BabelConfig ,
34
25
BabelJestTransformer ,
26
+ ProjectConfigTsJest ,
35
27
TsJestDiagnosticsCfg ,
36
28
TsJestGlobalOptions ,
37
- ProjectConfigTsJest ,
38
29
TTypeScript ,
39
30
} from '../types'
40
31
import { backportJestConfig } from '../utils/backports'
@@ -64,13 +55,6 @@ export const IGNORE_DIAGNOSTIC_CODES = [
64
55
*/
65
56
export const TS_JEST_OUT_DIR = '$$ts-jest$$'
66
57
67
- const TARGET_TO_VERSION_MAPPING : Record < number , string > = {
68
- [ ScriptTarget . ES2018 ] : 'es2018' ,
69
- [ ScriptTarget . ES2019 ] : 'es2019' ,
70
- [ ScriptTarget . ES2020 ] : 'es2020' ,
71
- [ ScriptTarget . ESNext ] : 'ESNext' ,
72
- }
73
-
74
58
/**
75
59
* @internal
76
60
*/
@@ -106,6 +90,12 @@ const toDiagnosticCodeList = (items: (string | number)[], into: number[] = []):
106
90
return into
107
91
}
108
92
93
+ interface TsJestAstTransformer {
94
+ before : AstTransformerDesc [ ]
95
+ after : AstTransformerDesc [ ]
96
+ afterDeclarations : AstTransformerDesc [ ]
97
+ }
98
+
109
99
export class ConfigSet {
110
100
/**
111
101
* Use by e2e, don't mark as internal
@@ -118,7 +108,11 @@ export class ConfigSet {
118
108
readonly rootDir : string
119
109
tsCacheDir : string | undefined
120
110
parsedTsConfig ! : ParsedCommandLine | Record < string , any >
121
- customTransformers : CustomTransformers = Object . create ( null )
111
+ resolvedTransformers : TsJestAstTransformer = {
112
+ before : [ ] ,
113
+ after : [ ] ,
114
+ afterDeclarations : [ ] ,
115
+ }
122
116
useESM = false
123
117
/**
124
118
* @internal
@@ -305,44 +299,40 @@ export class ConfigSet {
305
299
this . logger . debug ( { tsconfig : this . parsedTsConfig } , 'normalized typescript config via ts-jest option' )
306
300
307
301
// transformers
302
+ this . resolvedTransformers . before = [ require ( '../transformers/hoist-jest' ) ]
308
303
const { astTransformers } = options
309
- this . customTransformers = {
310
- before : [ hoisting ( this ) ] ,
311
- }
312
304
if ( astTransformers ) {
313
- const resolveTransformers = ( transformers : ( string | AstTransformer ) [ ] ) =>
305
+ const resolveTransformers = ( transformers : ( string | AstTransformer ) [ ] ) : AstTransformerDesc [ ] =>
314
306
transformers . map ( ( transformer ) => {
315
- let transformerPath : string
316
307
if ( typeof transformer === 'string' ) {
317
- transformerPath = this . resolvePath ( transformer , { nodeResolve : true } )
318
-
319
- return require ( transformerPath ) . factory ( this )
308
+ return require ( this . resolvePath ( transformer , { nodeResolve : true } ) )
320
309
} else {
321
- transformerPath = this . resolvePath ( transformer . path , { nodeResolve : true } )
322
-
323
- return require ( transformerPath ) . factory ( this , transformer . options )
310
+ return {
311
+ ...require ( this . resolvePath ( transformer . path , { nodeResolve : true } ) ) ,
312
+ options : transformer . options ,
313
+ }
324
314
}
325
315
} )
326
316
if ( astTransformers . before ) {
327
317
/* istanbul ignore next (already covered in unit test) */
328
- this . customTransformers . before ?. push ( ...resolveTransformers ( astTransformers . before ) )
318
+ this . resolvedTransformers . before ?. push ( ...resolveTransformers ( astTransformers . before ) )
329
319
}
330
320
if ( astTransformers . after ) {
331
- this . customTransformers = {
332
- ...this . customTransformers ,
321
+ this . resolvedTransformers = {
322
+ ...this . resolvedTransformers ,
333
323
after : resolveTransformers ( astTransformers . after ) ,
334
324
}
335
325
}
336
326
if ( astTransformers . afterDeclarations ) {
337
- this . customTransformers = {
338
- ...this . customTransformers ,
327
+ this . resolvedTransformers = {
328
+ ...this . resolvedTransformers ,
339
329
afterDeclarations : resolveTransformers ( astTransformers . afterDeclarations ) ,
340
330
}
341
331
}
342
332
}
343
333
344
334
this . logger . debug (
345
- { customTransformers : this . customTransformers } ,
335
+ { customTransformers : this . resolvedTransformers } ,
346
336
'normalized custom AST transformers via ts-jest option' ,
347
337
)
348
338
@@ -394,25 +384,25 @@ export class ConfigSet {
394
384
const finalOptions = result . options
395
385
// Target ES2015 output by default (instead of ES3).
396
386
if ( finalOptions . target === undefined ) {
397
- finalOptions . target = ScriptTarget . ES2015
387
+ finalOptions . target = this . compilerModule . ScriptTarget . ES2015
398
388
}
399
389
400
390
// check the module interoperability
401
391
const target = finalOptions . target
402
392
// compute the default if not set
403
- const defaultModule = [ ScriptTarget . ES3 , ScriptTarget . ES5 ] . includes ( target )
404
- ? ModuleKind . CommonJS
405
- : ModuleKind . ESNext
393
+ const defaultModule = [ this . compilerModule . ScriptTarget . ES3 , this . compilerModule . ScriptTarget . ES5 ] . includes ( target )
394
+ ? this . compilerModule . ModuleKind . CommonJS
395
+ : this . compilerModule . ModuleKind . ESNext
406
396
const moduleValue = finalOptions . module ?? defaultModule
407
397
if (
408
398
! this . babelConfig &&
409
- moduleValue !== ModuleKind . CommonJS &&
399
+ moduleValue !== this . compilerModule . ModuleKind . CommonJS &&
410
400
! ( finalOptions . esModuleInterop || finalOptions . allowSyntheticDefaultImports )
411
401
) {
412
402
result . errors . push ( {
413
403
code : DiagnosticCodes . ConfigModuleOption ,
414
404
messageText : Errors . ConfigNoModuleInterop ,
415
- category : DiagnosticCategory . Message ,
405
+ category : this . compilerModule . DiagnosticCategory . Message ,
416
406
file : undefined ,
417
407
start : undefined ,
418
408
length : undefined ,
@@ -443,12 +433,18 @@ export class ConfigSet {
443
433
*/
444
434
const nodeJsVer = process . version
445
435
const compilationTarget = result . options . target
436
+ const TARGET_TO_VERSION_MAPPING : Record < number , string > = {
437
+ [ this . compilerModule . ScriptTarget . ES2018 ] : 'es2018' ,
438
+ [ this . compilerModule . ScriptTarget . ES2019 ] : 'es2019' ,
439
+ [ this . compilerModule . ScriptTarget . ES2020 ] : 'es2020' ,
440
+ [ this . compilerModule . ScriptTarget . ESNext ] : 'ESNext' ,
441
+ }
446
442
/* istanbul ignore next (cover by e2e) */
447
443
if (
448
444
compilationTarget &&
449
445
! this . babelConfig &&
450
- ( ( nodeJsVer . startsWith ( 'v10' ) && compilationTarget > ScriptTarget . ES2018 ) ||
451
- ( nodeJsVer . startsWith ( 'v12' ) && compilationTarget > ScriptTarget . ES2019 ) )
446
+ ( ( nodeJsVer . startsWith ( 'v10' ) && compilationTarget > this . compilerModule . ScriptTarget . ES2018 ) ||
447
+ ( nodeJsVer . startsWith ( 'v12' ) && compilationTarget > this . compilerModule . ScriptTarget . ES2019 ) )
452
448
) {
453
449
const message = interpolate ( Errors . MismatchNodeTargetMapping , {
454
450
nodeJsVer : process . version ,
0 commit comments