/
createRuntime.js
120 lines (105 loc) · 3.27 KB
/
createRuntime.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import {tmpdir} from 'os';
import path from 'path';
import {makeProjectConfig} from '@jest/test-utils';
import {tryRealpath} from 'jest-util';
// Copy from jest-config (since we don't want to depend on this package)
const getCacheDirectory = () => {
const {getuid} = process;
const tmpdirPath = path.join(tryRealpath(tmpdir()), 'jest');
if (getuid == null) {
return tmpdirPath;
} else {
// On some platforms tmpdir() is `/tmp`, causing conflicts between different
// users and permission issues. Adding an additional subdivision by UID can
// help.
return `${tmpdirPath}_${getuid.call(process).toString(36)}`;
}
};
const setupModuleNameMapper = (config, rootDir) => {
if (config && config.moduleNameMapper) {
return Object.keys(config.moduleNameMapper).map(regex => {
const item = config.moduleNameMapper && config.moduleNameMapper[regex];
return item && [regex, item.replace('<rootDir>', rootDir)];
});
}
return [];
};
const setupTransform = (config, rootDir) => {
if (config?.transform) {
const transform = config.transform;
return Object.keys(transform).map(regex => [
regex,
path.resolve(rootDir, transform[regex]),
]);
}
return [['^.+\\.[jt]sx?$', require.resolve('babel-jest')]];
};
module.exports = async function createRuntime(filename, config) {
const {default: NodeEnvironment} = await import('jest-environment-node');
const {default: Runtime} = await import('../');
const rootDir = path.resolve(path.dirname(filename), 'test_root');
const moduleNameMapper = setupModuleNameMapper(config, rootDir);
const transform = setupTransform(config, rootDir);
config = makeProjectConfig({
cacheDirectory: getCacheDirectory(),
cwd: path.resolve(__dirname, '..', '..', '..', '..'),
haste: {
hasteImplModulePath: path.resolve(
__dirname,
'..',
'..',
'..',
'jest-haste-map',
'src',
'__tests__',
'haste_impl.js',
),
},
moduleDirectories: ['node_modules'],
moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'json', 'node'],
name: 'Runtime-' + filename.replace(/\W/, '-') + '.tests',
rootDir,
...config,
moduleNameMapper,
transform,
});
if (!config.roots.length) {
config.roots = [config.rootDir];
}
const environment = new NodeEnvironment(config);
environment.global.console = console;
const hasteMap = await Runtime.createHasteMap(config, {
maxWorkers: 1,
resetCache: false,
}).build();
const runtime = new Runtime(
config,
environment,
Runtime.createResolver(config, hasteMap.moduleMap),
new Map(),
undefined,
filename,
);
for (const path of config.setupFiles) {
const esm = runtime.unstable_shouldLoadAsEsm(path);
if (esm) {
await runtime.unstable_importModule(path);
} else {
runtime.requireModule(path);
}
}
runtime.__mockRootPath = path.join(config.rootDir, 'root.js');
runtime.__mockSubdirPath = path.join(
config.rootDir,
'subdir2',
'module_dir',
'module_dir_module.js',
);
return runtime;
};