Skip to content

Commit fbd0708

Browse files
tvaldcpojer
authored andcommitted
Clean up resolve() logic. Provide useful names for variables and functions. Test that a directory exists before attempting to resolve files within it. (#4325)
1 parent 482af99 commit fbd0708

1 file changed

Lines changed: 88 additions & 43 deletions

File tree

packages/jest-resolve/src/default_resolver.js

Lines changed: 88 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -46,80 +46,125 @@ import nodeModulesPaths from './node_modules_paths';
4646

4747
const REGEX_RELATIVE_IMPORT = /^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/;
4848

49-
function resolveSync(x: Path, options: ResolverOptions): Path {
50-
const readFileSync = fs.readFileSync;
51-
52-
const extensions = options.extensions || ['.js'];
49+
function resolveSync(target: Path, options: ResolverOptions): Path {
5350
const basedir = options.basedir;
51+
const extensions = options.extensions || ['.js'];
52+
const paths = options.paths || [];
5453

55-
options.paths = options.paths || [];
56-
57-
if (REGEX_RELATIVE_IMPORT.test(x)) {
54+
if (REGEX_RELATIVE_IMPORT.test(target)) {
5855
// resolve relative import
59-
let target = path.resolve(basedir, x);
60-
if (x === '..') target += '/';
61-
const m = loadAsFileSync(target) || loadAsDirectorySync(target);
62-
if (m) return m;
56+
const resolveTarget = path.resolve(basedir, target);
57+
const result = tryResolve(resolveTarget);
58+
if (result) {
59+
return result;
60+
}
6361
} else {
6462
// otherwise search for node_modules
6563
const dirs = nodeModulesPaths(basedir, {
6664
moduleDirectory: options.moduleDirectory,
67-
paths: options.paths,
65+
paths,
6866
});
6967
for (let i = 0; i < dirs.length; i++) {
70-
const dir = dirs[i];
71-
const target = path.join(dir, '/', x);
72-
const m = loadAsFileSync(target) || loadAsDirectorySync(target);
73-
if (m) return m;
68+
const resolveTarget = path.join(dirs[i], target);
69+
const result = tryResolve(resolveTarget);
70+
if (result) {
71+
return result;
72+
}
7473
}
7574
}
7675

77-
if (isBuiltinModule(x)) return x;
76+
if (isBuiltinModule(target)) {
77+
return target;
78+
}
7879

7980
const err: ErrorWithCode = new Error(
80-
"Cannot find module '" + x + "' from '" + basedir + "'",
81+
"Cannot find module '" + target + "' from '" + basedir + "'",
8182
);
8283
err.code = 'MODULE_NOT_FOUND';
8384
throw err;
8485

8586
/*
86-
* helper functions
87+
* contextual helper functions
8788
*/
88-
function isFile(file: Path): boolean {
89-
try {
90-
const stat = fs.statSync(file);
91-
return stat.isFile() || stat.isFIFO();
92-
} catch (e) {
93-
if (e && e.code === 'ENOENT') return false;
94-
throw e;
89+
function tryResolve(name: Path): ?Path {
90+
const dir = path.dirname(name);
91+
let result;
92+
if (isDirectory(dir)) {
93+
result = resolveAsFile(name) || resolveAsDirectory(name);
9594
}
95+
return result;
9696
}
9797

98-
function loadAsFileSync(x: Path): ?Path {
99-
if (isFile(x)) return x;
98+
function resolveAsFile(name: Path): ?Path {
99+
if (isFile(name)) {
100+
return name;
101+
}
100102

101103
for (let i = 0; i < extensions.length; i++) {
102-
const file = x + extensions[i];
103-
if (isFile(file)) return file;
104+
const file = name + extensions[i];
105+
if (isFile(file)) {
106+
return file;
107+
}
104108
}
105109

106110
return undefined;
107111
}
108112

109-
function loadAsDirectorySync(x: Path): ?Path {
110-
const pkgfile = path.join(x, '/package.json');
111-
if (isFile(pkgfile)) {
112-
const body = readFileSync(pkgfile, 'utf8');
113-
try {
114-
const pkgmain = JSON.parse(body).main;
115-
if (pkgmain) {
116-
const target = path.resolve(x, pkgmain);
117-
const m = loadAsFileSync(target) || loadAsDirectorySync(target);
118-
if (m) return m;
119-
}
120-
} catch (e) {}
113+
function resolveAsDirectory(name: Path): ?Path {
114+
if (!isDirectory(name)) {
115+
return undefined;
121116
}
122117

123-
return loadAsFileSync(path.join(x, '/index'));
118+
const pkgfile = path.join(name, 'package.json');
119+
let pkgmain;
120+
try {
121+
const body = fs.readFileSync(pkgfile, 'utf8');
122+
pkgmain = JSON.parse(body).main;
123+
} catch (e) {}
124+
125+
if (pkgmain) {
126+
const resolveTarget = path.resolve(name, pkgmain);
127+
const result = tryResolve(resolveTarget);
128+
if (result) {
129+
return result;
130+
}
131+
}
132+
133+
return resolveAsFile(path.join(name, 'index'));
124134
}
125135
}
136+
137+
/*
138+
* helper functions
139+
*/
140+
function isFile(file: Path): boolean {
141+
let result;
142+
143+
try {
144+
const stat = fs.statSync(file);
145+
result = stat.isFile() || stat.isFIFO();
146+
} catch (e) {
147+
if (!(e && e.code === 'ENOENT')) {
148+
throw e;
149+
}
150+
result = false;
151+
}
152+
153+
return result;
154+
}
155+
156+
function isDirectory(dir: Path): boolean {
157+
let result;
158+
159+
try {
160+
const stat = fs.statSync(dir);
161+
result = stat.isDirectory();
162+
} catch (e) {
163+
if (!(e && e.code === 'ENOENT')) {
164+
throw e;
165+
}
166+
result = false;
167+
}
168+
169+
return result;
170+
}

0 commit comments

Comments
 (0)