ts-jest 26.3.0 → 26.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.ts-jest-digest +1 -1
  2. package/CHANGELOG.md +52 -0
  3. package/README.md +0 -1
  4. package/dist/cli/config/init.d.ts +0 -5
  5. package/dist/cli/config/init.js +3 -18
  6. package/dist/cli/config/migrate.js +11 -41
  7. package/dist/cli/help.js +1 -7
  8. package/dist/cli/helpers/presets.js +5 -11
  9. package/dist/cli/index.js +11 -12
  10. package/dist/compiler/instance.d.ts +2 -1
  11. package/dist/compiler/instance.js +8 -27
  12. package/dist/compiler/language-service.js +11 -62
  13. package/dist/compiler/transpiler.js +5 -10
  14. package/dist/config/config-set.d.ts +19 -26
  15. package/dist/config/config-set.js +305 -727
  16. package/dist/config/paths-to-module-name-mapper.d.ts +1 -1
  17. package/dist/config/paths-to-module-name-mapper.js +13 -12
  18. package/dist/constants.d.ts +2 -1
  19. package/dist/constants.js +1 -22
  20. package/dist/index.d.ts +4 -120
  21. package/dist/index.js +9 -87
  22. package/dist/{config → presets}/create-jest-preset.d.ts +2 -1
  23. package/dist/{config → presets}/create-jest-preset.js +1 -1
  24. package/dist/transformers/hoist-jest.js +48 -73
  25. package/dist/transformers/index.js +20 -4
  26. package/dist/transformers/path-mapping.d.ts +3 -0
  27. package/dist/transformers/path-mapping.js +121 -0
  28. package/dist/ts-jest-transformer.d.ts +5 -22
  29. package/dist/ts-jest-transformer.js +54 -103
  30. package/dist/types.d.ts +14 -90
  31. package/dist/{util → utils}/backports.d.ts +0 -0
  32. package/dist/{util → utils}/backports.js +4 -11
  33. package/dist/{util → utils}/get-package-version.d.ts +0 -0
  34. package/dist/{util → utils}/get-package-version.js +0 -3
  35. package/dist/{util → utils}/importer.d.ts +0 -0
  36. package/dist/{util → utils}/importer.js +4 -29
  37. package/dist/utils/json.d.ts +2 -0
  38. package/dist/{util → utils}/json.js +0 -14
  39. package/dist/utils/jsonable-value.d.ts +10 -0
  40. package/dist/{util → utils}/jsonable-value.js +1 -4
  41. package/dist/{util → utils}/logger.d.ts +0 -0
  42. package/dist/{util → utils}/logger.js +0 -4
  43. package/dist/{util → utils}/memoize.d.ts +0 -0
  44. package/dist/{util → utils}/memoize.js +0 -8
  45. package/dist/{util → utils}/messages.d.ts +0 -0
  46. package/dist/{util → utils}/messages.js +0 -4
  47. package/dist/{util → utils}/normalize-slashes.d.ts +0 -0
  48. package/dist/{util → utils}/normalize-slashes.js +0 -3
  49. package/dist/{util → utils}/sha1.d.ts +0 -0
  50. package/dist/{util → utils}/sha1.js +0 -10
  51. package/dist/{util → utils}/testing.d.ts +1 -1
  52. package/dist/{util → utils}/testing.js +0 -0
  53. package/dist/{util → utils}/ts-error.d.ts +0 -0
  54. package/dist/{util → utils}/ts-error.js +2 -12
  55. package/dist/{util → utils}/version-checkers.d.ts +0 -0
  56. package/dist/{util → utils}/version-checkers.js +5 -8
  57. package/jest-preset.js +1 -1
  58. package/package.json +8 -7
  59. package/presets/index.js +4 -4
  60. package/utils/index.d.ts +3 -1
  61. package/utils/index.js +15 -1
  62. package/dist/util/index.d.ts +0 -3
  63. package/dist/util/index.js +0 -9
  64. package/dist/util/json.d.ts +0 -1
  65. package/dist/util/jsonable-value.d.ts +0 -1
  66. package/presets/create.js +0 -1
  67. package/presets/index.d.ts +0 -5
@@ -1,6 +1,6 @@
1
1
  import type { Config } from '@jest/types';
2
2
  declare type JestPathMapping = Config.InitialOptions['moduleNameMapper'];
3
3
  export declare const pathsToModuleNameMapper: (mapping: import("typescript").MapLike<string[]>, { prefix }?: {
4
- prefix?: string | undefined;
4
+ prefix: string;
5
5
  }) => JestPathMapping;
6
6
  export {};
@@ -14,41 +14,42 @@ var _a;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.pathsToModuleNameMapper = void 0;
16
16
  var bs_logger_1 = require("bs-logger");
17
- var logger_1 = require("../util/logger");
18
- var messages_1 = require("../util/messages");
19
- // we don't need to escape all chars, so commented out is the real one
20
- // const escapeRegex = (str: string) => str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
17
+ var logger_1 = require("../utils/logger");
18
+ var messages_1 = require("../utils/messages");
21
19
  var escapeRegex = function (str) { return str.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&'); };
22
20
  var logger = logger_1.rootLogger.child((_a = {}, _a[bs_logger_1.LogContexts.namespace] = 'path-mapper', _a));
23
21
  exports.pathsToModuleNameMapper = function (mapping, _a) {
24
22
  var e_1, _b;
25
- var _c = (_a === void 0 ? {} : _a).prefix, prefix = _c === void 0 ? '' : _c;
23
+ var _c = (_a === void 0 ? Object.create(null) : _a).prefix, prefix = _c === void 0 ? '' : _c;
26
24
  var jestMap = {};
27
25
  try {
28
26
  for (var _d = __values(Object.keys(mapping)), _e = _d.next(); !_e.done; _e = _d.next()) {
29
27
  var fromPath = _e.value;
30
28
  var pattern = void 0;
31
29
  var toPaths = mapping[fromPath];
32
- // check that we have only one target path
33
30
  if (toPaths.length === 0) {
34
- logger.warn(messages_1.interpolate("Not mapping \"{{path}}\" because it has no target." /* NotMappingPathWithEmptyMap */, { path: fromPath }));
31
+ logger.warn(messages_1.interpolate("Not mapping \"{{path}}\" because it has no target.", { path: fromPath }));
35
32
  continue;
36
33
  }
37
- // split with '*'
38
34
  var segments = fromPath.split(/\*/g);
39
35
  if (segments.length === 1) {
40
- var paths = toPaths.map(function (target) { return "" + prefix + target; });
36
+ var paths = toPaths.map(function (target) {
37
+ var enrichedPrefix = prefix !== '' && !prefix.endsWith('/') ? prefix + "/" : prefix;
38
+ return "" + enrichedPrefix + target;
39
+ });
41
40
  pattern = "^" + escapeRegex(fromPath) + "$";
42
41
  jestMap[pattern] = paths.length === 1 ? paths[0] : paths;
43
42
  }
44
43
  else if (segments.length === 2) {
45
- var paths = toPaths.map(function (target) { return "" + prefix + target.replace(/\*/g, '$1'); });
44
+ var paths = toPaths.map(function (target) {
45
+ var enrichedPrefix = prefix !== '' && !prefix.endsWith('/') ? prefix + "/" : prefix;
46
+ return "" + enrichedPrefix + target.replace(/\*/g, '$1');
47
+ });
46
48
  pattern = "^" + escapeRegex(segments[0]) + "(.*)" + escapeRegex(segments[1]) + "$";
47
49
  jestMap[pattern] = paths.length === 1 ? paths[0] : paths;
48
50
  }
49
51
  else {
50
- logger.warn(messages_1.interpolate("Not mapping \"{{path}}\" because it has more than one star (`*`)." /* NotMappingMultiStarPath */, { path: fromPath }));
51
- continue;
52
+ logger.warn(messages_1.interpolate("Not mapping \"{{path}}\" because it has more than one star (`*`).", { path: fromPath }));
52
53
  }
53
54
  }
54
55
  }
@@ -1 +1,2 @@
1
- export {};
1
+ export declare const TS_TSX_REGEX: RegExp;
2
+ export declare const JS_JSX_REGEX: RegExp;
package/dist/constants.js CHANGED
@@ -1,28 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_JEST_TEST_MATCH = exports.JSON_REGEX = exports.JS_JSX_REGEX = exports.TS_TSX_REGEX = exports.EXTENSION_REGEX = exports.LINE_FEED = void 0;
4
- /**
5
- * @internal
6
- */
3
+ exports.DEFAULT_JEST_TEST_MATCH = exports.JS_JSX_REGEX = exports.TS_TSX_REGEX = exports.LINE_FEED = void 0;
7
4
  exports.LINE_FEED = '\n';
8
- /**
9
- * @internal
10
- */
11
- exports.EXTENSION_REGEX = /\.[^.]+$/;
12
- /**
13
- * @internal
14
- */
15
5
  exports.TS_TSX_REGEX = /\.tsx?$/;
16
- /**
17
- * @internal
18
- */
19
6
  exports.JS_JSX_REGEX = /\.jsx?$/;
20
- /**
21
- * @internal
22
- */
23
- exports.JSON_REGEX = /\.json$/i;
24
- /**
25
- * @internal
26
- * See https://jestjs.io/docs/en/configuration#testmatch-arraystring
27
- */
28
7
  exports.DEFAULT_JEST_TEST_MATCH = ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[jt]s?(x)'];
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { createJestPreset as createJestPresetCore } from './config/create-jest-preset';
1
+ import { createJestPreset as createJestPresetCore } from './presets/create-jest-preset';
2
2
  import { TsJestTransformer } from './ts-jest-transformer';
3
3
  import type { TsJestGlobalOptions } from './types';
4
- import { mocked as mockedCore } from './util/testing';
4
+ import { mocked as mockedCore } from './utils/testing';
5
5
  declare module '@jest/types' {
6
6
  namespace Config {
7
7
  interface ConfigGlobals {
@@ -9,127 +9,11 @@ declare module '@jest/types' {
9
9
  }
10
10
  }
11
11
  }
12
- /** @deprecated */
13
12
  export declare const mocked: typeof mockedCore;
14
- /** @deprecated */
15
13
  export declare const createJestPreset: typeof createJestPresetCore;
16
- /** @deprecated */
17
14
  export declare const pathsToModuleNameMapper: (mapping: import("typescript").MapLike<string[]>, { prefix }?: {
18
- prefix?: string | undefined;
15
+ prefix: string;
19
16
  }) => {
20
17
  [key: string]: string | string[];
21
18
  } | undefined;
22
- export declare function createTransformer(baseConfig?: TsJestGlobalOptions): TsJestTransformer;
23
- declare const jestPreset: Pick<Partial<{
24
- automock: boolean;
25
- bail: number | boolean;
26
- cache: boolean;
27
- cacheDirectory: string;
28
- clearMocks: boolean;
29
- changedFilesWithAncestor: boolean;
30
- changedSince: string;
31
- collectCoverage: boolean;
32
- collectCoverageFrom: string[];
33
- collectCoverageOnlyFrom: {
34
- [key: string]: boolean;
35
- };
36
- coverageDirectory: string;
37
- coveragePathIgnorePatterns: string[];
38
- coverageProvider: "babel" | "v8";
39
- coverageReporters: import("@jest/types/build/Config").CoverageReporters;
40
- coverageThreshold: {
41
- global: {
42
- [key: string]: number;
43
- };
44
- };
45
- dependencyExtractor: string;
46
- detectLeaks: boolean;
47
- detectOpenHandles: boolean;
48
- displayName: string | import("@jest/types/build/Config").DisplayName;
49
- expand: boolean;
50
- extraGlobals: string[];
51
- filter: string;
52
- findRelatedTests: boolean;
53
- forceCoverageMatch: string[];
54
- forceExit: boolean;
55
- json: boolean;
56
- globals: import("@jest/types/build/Config").ConfigGlobals;
57
- globalSetup: string | null | undefined;
58
- globalTeardown: string | null | undefined;
59
- haste: import("@jest/types/build/Config").HasteConfig;
60
- reporters: (string | import("@jest/types/build/Config").ReporterConfig)[];
61
- logHeapUsage: boolean;
62
- lastCommit: boolean;
63
- listTests: boolean;
64
- mapCoverage: boolean;
65
- maxConcurrency: number;
66
- maxWorkers: string | number;
67
- moduleDirectories: string[];
68
- moduleFileExtensions: string[];
69
- moduleLoader: string;
70
- moduleNameMapper: {
71
- [key: string]: string | string[];
72
- };
73
- modulePathIgnorePatterns: string[];
74
- modulePaths: string[];
75
- name: string;
76
- noStackTrace: boolean;
77
- notify: boolean;
78
- notifyMode: string;
79
- onlyChanged: boolean;
80
- outputFile: string;
81
- passWithNoTests: boolean;
82
- preprocessorIgnorePatterns: string[];
83
- preset: string | null | undefined;
84
- prettierPath: string | null | undefined;
85
- projects: string[];
86
- replname: string | null | undefined;
87
- resetMocks: boolean;
88
- resetModules: boolean;
89
- resolver: string | null | undefined;
90
- restoreMocks: boolean;
91
- rootDir: string;
92
- roots: string[];
93
- runner: string;
94
- runTestsByPath: boolean;
95
- scriptPreprocessor: string;
96
- setupFiles: string[];
97
- setupTestFrameworkScriptFile: string;
98
- setupFilesAfterEnv: string[];
99
- silent: boolean;
100
- skipFilter: boolean;
101
- skipNodeResolution: boolean;
102
- slowTestThreshold: number;
103
- snapshotResolver: string;
104
- snapshotSerializers: string[];
105
- errorOnDeprecated: boolean;
106
- testEnvironment: string;
107
- testEnvironmentOptions: Record<string, any>;
108
- testFailureExitCode: string | number;
109
- testLocationInResults: boolean;
110
- testMatch: string[];
111
- testNamePattern: string;
112
- testPathDirs: string[];
113
- testPathIgnorePatterns: string[];
114
- testRegex: string | string[];
115
- testResultsProcessor: string;
116
- testRunner: string;
117
- testSequencer: string;
118
- testURL: string;
119
- testTimeout: number;
120
- timers: "real" | "fake";
121
- transform: {
122
- [regex: string]: string | import("@jest/types/build/Config").TransformerConfig;
123
- };
124
- transformIgnorePatterns: string[];
125
- watchPathIgnorePatterns: string[];
126
- unmockedModulePathPatterns: string[];
127
- updateSnapshot: boolean;
128
- useStderr: boolean;
129
- verbose?: boolean | undefined;
130
- watch: boolean;
131
- watchAll: boolean;
132
- watchman: boolean;
133
- watchPlugins: (string | [string, Record<string, any>])[];
134
- }>, "moduleFileExtensions" | "testMatch" | "transform">;
135
- export { jestPreset, };
19
+ export declare function createTransformer(): TsJestTransformer;
package/dist/index.js CHANGED
@@ -1,102 +1,24 @@
1
1
  "use strict";
2
- var __read = (this && this.__read) || function (o, n) {
3
- var m = typeof Symbol === "function" && o[Symbol.iterator];
4
- if (!m) return o;
5
- var i = m.call(o), r, ar = [], e;
6
- try {
7
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8
- }
9
- catch (error) { e = { error: error }; }
10
- finally {
11
- try {
12
- if (r && !r.done && (m = i["return"])) m.call(i);
13
- }
14
- finally { if (e) throw e.error; }
15
- }
16
- return ar;
17
- };
18
- var __spread = (this && this.__spread) || function () {
19
- for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
20
- return ar;
21
- };
22
2
  var _a;
23
3
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.jestPreset = exports.__resetModule = exports.__singleton = exports.canInstrument = exports.getCacheKey = exports.process = exports.createTransformer = exports.digest = exports.version = exports.pathsToModuleNameMapper = exports.createJestPreset = exports.mocked = void 0;
4
+ exports.createTransformer = exports.pathsToModuleNameMapper = exports.createJestPreset = exports.mocked = void 0;
25
5
  var bs_logger_1 = require("bs-logger");
26
- var fs_1 = require("fs");
27
- var path_1 = require("path");
28
- var create_jest_preset_1 = require("./config/create-jest-preset");
6
+ var create_jest_preset_1 = require("./presets/create-jest-preset");
29
7
  var paths_to_module_name_mapper_1 = require("./config/paths-to-module-name-mapper");
30
8
  var ts_jest_transformer_1 = require("./ts-jest-transformer");
31
- var logger_1 = require("./util/logger");
32
- var messages_1 = require("./util/messages");
33
- var testing_1 = require("./util/testing");
34
- var version_checkers_1 = require("./util/version-checkers");
35
- // deprecate helpers
9
+ var logger_1 = require("./utils/logger");
10
+ var messages_1 = require("./utils/messages");
11
+ var testing_1 = require("./utils/testing");
12
+ var version_checkers_1 = require("./utils/version-checkers");
36
13
  var warn = logger_1.rootLogger.child((_a = {}, _a[bs_logger_1.LogContexts.logLevel] = bs_logger_1.LogLevels.warn, _a));
37
14
  var helperMoved = function (name, helper) {
38
- return warn.wrap(messages_1.interpolate("The `{{helper}}` helper has been moved to `ts-jest/utils`. Use `import { {{helper}} } from 'ts-jest/utils'` instead." /* HelperMovedToUtils */, { helper: name }), helper);
15
+ return warn.wrap(messages_1.interpolate("The `{{helper}}` helper has been moved to `ts-jest/utils`. Use `import { {{helper}} } from 'ts-jest/utils'` instead.", { helper: name }), helper);
39
16
  };
40
- /** @deprecated */
41
17
  exports.mocked = helperMoved('mocked', testing_1.mocked);
42
- /** @deprecated */
43
18
  exports.createJestPreset = helperMoved('createJestPreset', create_jest_preset_1.createJestPreset);
44
- /** @deprecated */
45
19
  exports.pathsToModuleNameMapper = helperMoved('pathsToModuleNameMapper', paths_to_module_name_mapper_1.pathsToModuleNameMapper);
46
- /**
47
- * @internal
48
- */
49
- exports.version = require('../package.json').version;
50
- /**
51
- * @internal
52
- */
53
- exports.digest = fs_1.readFileSync(path_1.resolve(__dirname, '..', '.ts-jest-digest'), 'utf8');
54
- var transformer;
55
- function defaultTransformer() {
56
- return transformer || (transformer = createTransformer());
57
- }
58
- function createTransformer(baseConfig) {
20
+ function createTransformer() {
59
21
  version_checkers_1.VersionCheckers.jest.warn();
60
- return new ts_jest_transformer_1.TsJestTransformer(baseConfig);
22
+ return new ts_jest_transformer_1.TsJestTransformer();
61
23
  }
62
24
  exports.createTransformer = createTransformer;
63
- /**
64
- * @internal
65
- */
66
- function process() {
67
- var _a;
68
- var args = [];
69
- for (var _i = 0; _i < arguments.length; _i++) {
70
- args[_i] = arguments[_i];
71
- }
72
- return (_a = defaultTransformer()).process.apply(_a, __spread(args));
73
- }
74
- exports.process = process;
75
- /**
76
- * @internal
77
- */
78
- function getCacheKey() {
79
- var _a;
80
- var args = [];
81
- for (var _i = 0; _i < arguments.length; _i++) {
82
- args[_i] = arguments[_i];
83
- }
84
- return (_a = defaultTransformer()).getCacheKey.apply(_a, __spread(args));
85
- }
86
- exports.getCacheKey = getCacheKey;
87
- /**
88
- * @internal
89
- */
90
- // we let jest doing the instrumentation, it does it well
91
- exports.canInstrument = false;
92
- var jestPreset = create_jest_preset_1.createJestPreset();
93
- exports.jestPreset = jestPreset;
94
- /**
95
- * @internal
96
- */
97
- // for tests
98
- exports.__singleton = function () { return transformer; };
99
- /**
100
- * @internal
101
- */
102
- exports.__resetModule = function () { return (transformer = undefined); };
@@ -1,6 +1,7 @@
1
1
  import type { Config } from '@jest/types';
2
2
  export declare type TsJestPresets = Pick<Config.InitialOptions, 'moduleFileExtensions' | 'transform' | 'testMatch'>;
3
- export interface CreateJestPresetOptions {
3
+ interface CreateJestPresetOptions {
4
4
  allowJs?: boolean;
5
5
  }
6
6
  export declare function createJestPreset({ allowJs }?: CreateJestPresetOptions, from?: Config.InitialOptions): TsJestPresets;
7
+ export {};
@@ -12,7 +12,7 @@ var __assign = (this && this.__assign) || function () {
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.createJestPreset = void 0;
15
- var logger_1 = require("../util/logger");
15
+ var logger_1 = require("../utils/logger");
16
16
  var logger = logger_1.rootLogger.child({ namespace: 'jest-preset' });
17
17
  function createJestPreset(_a, from) {
18
18
  var _b;
@@ -32,83 +32,53 @@ var __spread = (this && this.__spread) || function () {
32
32
  };
33
33
  Object.defineProperty(exports, "__esModule", { value: true });
34
34
  exports.factory = exports.version = exports.name = void 0;
35
- // take care of including ONLY TYPES here, for the rest use `ts`
36
35
  var bs_logger_1 = require("bs-logger");
37
- /**
38
- * What methods of `jest` should we hoist
39
- */
40
36
  var HOIST_METHODS = ['mock', 'unmock', 'enableAutomock', 'disableAutomock', 'deepUnmock'];
41
- /**
42
- * @internal
43
- */
37
+ var JEST_GLOBALS_MODULE_NAME = '@jest/globals';
38
+ var JEST_GLOBAL_NAME = 'jest';
39
+ var ROOT_LEVEL_AST = 1;
44
40
  exports.name = 'hoisting-jest-mock';
45
- // increment this each time the code is modified
46
- /**
47
- * @internal
48
- */
49
- exports.version = 1;
50
- /**
51
- * The factory of hoisting transformer factory
52
- *
53
- * @param cs Current jest configuration-set
54
- * @internal
55
- */
41
+ exports.version = 4;
56
42
  function factory(cs) {
57
43
  var logger = cs.logger.child({ namespace: 'ts-hoisting' });
58
- /**
59
- * Our compiler (typescript, or a module with typescript-like interface)
60
- * To access Program or TypeChecker, do: cs.tsCompiler.program or cs.tsCompiler.program.getTypeChecker()
61
- */
62
44
  var ts = cs.compilerModule;
63
- function shouldHoistExpression(expression) {
64
- return (ts.isCallExpression(expression) &&
65
- ts.isPropertyAccessExpression(expression.expression) &&
66
- HOIST_METHODS.includes(expression.expression.name.text) &&
67
- ((ts.isIdentifier(expression.expression.expression) && expression.expression.expression.text === 'jest') ||
68
- shouldHoistExpression(expression.expression.expression)));
45
+ var importNames = [];
46
+ function shouldHoistExpression(node) {
47
+ if (ts.isCallExpression(node) &&
48
+ ts.isPropertyAccessExpression(node.expression) &&
49
+ HOIST_METHODS.includes(node.expression.name.text)) {
50
+ if (importNames.length) {
51
+ return ((ts.isIdentifier(node.expression.expression) && importNames.includes(node.expression.expression.text)) ||
52
+ (ts.isPropertyAccessExpression(node.expression.expression) &&
53
+ ts.isIdentifier(node.expression.expression.expression) &&
54
+ importNames.includes(node.expression.expression.expression.text)) ||
55
+ shouldHoistExpression(node.expression.expression));
56
+ }
57
+ else {
58
+ return ((ts.isIdentifier(node.expression.expression) && node.expression.expression.text === JEST_GLOBAL_NAME) ||
59
+ shouldHoistExpression(node.expression.expression));
60
+ }
61
+ }
62
+ return false;
69
63
  }
70
- /**
71
- * Checks whether given node is a statement that we need to hoist
72
- *
73
- * @param node The node to test
74
- */
75
64
  function shouldHoistNode(node) {
76
65
  return ts.isExpressionStatement(node) && shouldHoistExpression(node.expression);
77
66
  }
78
- /**
79
- * Create a source file visitor which will visit all nodes in a source file
80
- *
81
- * @param ctx The typescript transformation context
82
- * @param sf The owning source file
83
- */
67
+ function isJestGlobalImport(node) {
68
+ return (ts.isImportDeclaration(node) &&
69
+ ts.isStringLiteral(node.moduleSpecifier) &&
70
+ node.moduleSpecifier.text === JEST_GLOBALS_MODULE_NAME);
71
+ }
84
72
  function createVisitor(ctx, _) {
85
- /**
86
- * Current block level
87
- */
88
73
  var level = 0;
89
- /**
90
- * List of nodes which needs to be hoisted, indexed by their owning level
91
- */
92
74
  var hoisted = [];
93
- /**
94
- * Called when we enter a block to increase the level
95
- */
96
75
  var enter = function () {
97
76
  level++;
98
- // reuse arrays
99
77
  if (hoisted[level]) {
100
78
  hoisted[level].splice(0, hoisted[level].length);
101
79
  }
102
80
  };
103
- /**
104
- * Called when we leave a block to decrease the level
105
- */
106
81
  var exit = function () { return level--; };
107
- /**
108
- * Adds a node to the list of nodes to be hoisted in the current level
109
- *
110
- * @param node The node to hoist
111
- */
112
82
  var hoist = function (node) {
113
83
  if (hoisted[level]) {
114
84
  hoisted[level].push(node);
@@ -117,37 +87,42 @@ function factory(cs) {
117
87
  hoisted[level] = [node];
118
88
  }
119
89
  };
120
- /**
121
- * Our main visitor, which will be called recursively for each node in the source file's AST
122
- *
123
- * @param node The node to be visited
124
- */
125
90
  var visitor = function (node) {
126
- // enter this level
91
+ var _a, _b;
127
92
  enter();
128
- // visit each child
129
93
  var resultNode = ts.visitEachChild(node, visitor, ctx);
130
- // check if we have something to hoist in this level
94
+ if (isJestGlobalImport(resultNode) && ((_a = resultNode.importClause) === null || _a === void 0 ? void 0 : _a.namedBindings) &&
95
+ (ts.isNamespaceImport(resultNode.importClause.namedBindings) ||
96
+ ts.isNamedImports(resultNode.importClause.namedBindings))) {
97
+ var namedBindings = resultNode.importClause.namedBindings;
98
+ var jestImportName = ts.isNamespaceImport(namedBindings)
99
+ ? namedBindings.name.text
100
+ : (_b = namedBindings.elements.find(function (element) { var _a; return element.name.text === JEST_GLOBAL_NAME || ((_a = element.propertyName) === null || _a === void 0 ? void 0 : _a.text) === JEST_GLOBAL_NAME; })) === null || _b === void 0 ? void 0 : _b.name.text;
101
+ if (jestImportName) {
102
+ importNames.push(jestImportName);
103
+ }
104
+ }
131
105
  if (hoisted[level] && hoisted[level].length) {
132
- // re-order children so that hoisted ones appear first
133
- // this is actually the main job of this transformer
134
106
  var hoistedStmts_1 = hoisted[level];
135
- var otherStmts = resultNode.statements.filter(function (s) { return !hoistedStmts_1.includes(s); });
107
+ var otherStmts = resultNode.statements.filter(function (s) { return !hoistedStmts_1.includes(s) && !isJestGlobalImport(s); });
136
108
  var newNode = ts.getMutableClone(resultNode);
137
- resultNode = __assign(__assign({}, newNode), { statements: ts.createNodeArray(__spread(hoistedStmts_1, otherStmts)) });
109
+ var newStatements = __spread(hoistedStmts_1, otherStmts);
110
+ if (level === ROOT_LEVEL_AST) {
111
+ var jestGlobalsImportStmts = resultNode.statements.filter(function (s) { return isJestGlobalImport(s); });
112
+ resultNode = __assign(__assign({}, newNode), { statements: ts.createNodeArray(__spread(jestGlobalsImportStmts, newStatements)) });
113
+ }
114
+ else {
115
+ resultNode = __assign(__assign({}, newNode), { statements: ts.createNodeArray(newStatements) });
116
+ }
138
117
  }
139
- // exit the level
140
118
  exit();
141
119
  if (shouldHoistNode(resultNode)) {
142
- // hoist into current level
143
120
  hoist(resultNode);
144
121
  }
145
- // finally returns the currently visited node
146
122
  return resultNode;
147
123
  };
148
124
  return visitor;
149
125
  }
150
- // returns the transformer factory
151
126
  return function (ctx) {
152
127
  var _a;
153
128
  return logger.wrap((_a = {}, _a[bs_logger_1.LogContexts.logLevel] = bs_logger_1.LogLevels.debug, _a.call = null, _a), 'visitSourceFileNode(): hoisting', function (sf) { return ts.visitNode(sf, createVisitor(ctx, sf)); });
@@ -1,8 +1,24 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
2
21
  Object.defineProperty(exports, "__esModule", { value: true });
3
22
  exports.internals = void 0;
4
- var hoisting = require("./hoist-jest");
5
- /**
6
- * @internal
7
- */
23
+ var hoisting = __importStar(require("./hoist-jest"));
8
24
  exports.internals = [hoisting];
@@ -0,0 +1,3 @@
1
+ import type * as _ts from 'typescript';
2
+ import type { ConfigSet } from '../config/config-set';
3
+ export declare function factory(cs: ConfigSet): (ctx: _ts.TransformationContext) => _ts.Transformer<_ts.SourceFile>;