-
-
Notifications
You must be signed in to change notification settings - Fork 6.5k
/
Copy pathutils.js
142 lines (125 loc) · 3.47 KB
/
utils.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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/**
* Copyright (c) 2014-present, Facebook, Inc. 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.
*
* @flow
*/
import type {Path, Glob} from 'types/Config';
import path from 'path';
import {ValidationError} from 'jest-validate';
import Resolver from 'jest-resolve';
import chalk from 'chalk';
export const BULLET: string = chalk.bold('\u25cf ');
export const DOCUMENTATION_NOTE = ` ${chalk.bold(
'Configuration Documentation:',
)}
https://facebook.github.io/jest/docs/configuration.html
`;
const createValidationError = (message: string) => {
return new ValidationError(
`${BULLET}Validation Error`,
message,
DOCUMENTATION_NOTE,
);
};
export const resolve = (rootDir: string, key: string, filePath: Path) => {
const module = Resolver.findNodeModule(
replaceRootDirInPath(rootDir, filePath),
{
basedir: rootDir,
},
);
if (!module) {
throw createValidationError(
` Module ${chalk.bold(filePath)} in the ${chalk.bold(
key,
)} option was not found.
${chalk.bold('<rootDir>')} is: ${rootDir}`,
);
}
return module;
};
export const escapeGlobCharacters = (path: Path): Glob => {
return path.replace(/([()*{}\[\]!?\\])/g, '\\$1');
};
export const replaceRootDirInPath = (
rootDir: string,
filePath: Path,
): string => {
if (!/^<rootDir>/.test(filePath)) {
return filePath;
}
return path.resolve(
rootDir,
path.normalize('./' + filePath.substr('<rootDir>'.length)),
);
};
const _replaceRootDirInObject = (rootDir: string, config: any): Object => {
if (config !== null) {
const newConfig = {};
for (const configKey in config) {
newConfig[configKey] =
configKey === 'rootDir'
? config[configKey]
: _replaceRootDirTags(rootDir, config[configKey]);
}
return newConfig;
}
return config;
};
export const _replaceRootDirTags = (rootDir: string, config: any) => {
switch (typeof config) {
case 'object':
if (Array.isArray(config)) {
return config.map(item => _replaceRootDirTags(rootDir, item));
}
if (config instanceof RegExp) {
return config;
}
return _replaceRootDirInObject(rootDir, config);
case 'string':
return replaceRootDirInPath(rootDir, config);
}
return config;
};
/**
* Finds the test environment to use:
*
* 1. looks for jest-environment-<name> relative to project.
* 1. looks for jest-environment-<name> relative to Jest.
* 1. looks for <name> relative to project.
* 1. looks for <name> relative to Jest.
*/
export const getTestEnvironment = (config: Object) => {
const env = replaceRootDirInPath(config.rootDir, config.testEnvironment);
let module = Resolver.findNodeModule(`jest-environment-${env}`, {
basedir: config.rootDir,
});
if (module) {
return module;
}
try {
return require.resolve(`jest-environment-${env}`);
} catch (e) {}
module = Resolver.findNodeModule(env, {basedir: config.rootDir});
if (module) {
return module;
}
try {
return require.resolve(env);
} catch (e) {}
throw createValidationError(
` Test environment ${chalk.bold(
env,
)} cannot be found. Make sure the ${chalk.bold(
'testEnvironment',
)} configuration option points to an existing node module.`,
);
};
export const isJSONString = (text: ?string) =>
text &&
typeof text === 'string' &&
text.startsWith('{') &&
text.endsWith('}');