UNPKG

4.88 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', {
4 value: true
5});
6exports.default = defaultResolver;
7
8function _fs() {
9 const data = _interopRequireDefault(require('fs'));
10
11 _fs = function _fs() {
12 return data;
13 };
14
15 return data;
16}
17
18function _path() {
19 const data = _interopRequireDefault(require('path'));
20
21 _path = function _path() {
22 return data;
23 };
24
25 return data;
26}
27
28function _browserResolve() {
29 const data = _interopRequireDefault(require('browser-resolve'));
30
31 _browserResolve = function _browserResolve() {
32 return data;
33 };
34
35 return data;
36}
37
38function _jestPnpResolver() {
39 const data = _interopRequireDefault(require('jest-pnp-resolver'));
40
41 _jestPnpResolver = function _jestPnpResolver() {
42 return data;
43 };
44
45 return data;
46}
47
48var _isBuiltinModule = _interopRequireDefault(require('./isBuiltinModule'));
49
50var _nodeModulesPaths = _interopRequireDefault(require('./nodeModulesPaths'));
51
52function _interopRequireDefault(obj) {
53 return obj && obj.__esModule ? obj : {default: obj};
54}
55
56/**
57 * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
58 *
59 * This source code is licensed under the MIT license found in the
60 * LICENSE file in the root directory of this source tree.
61 */
62function defaultResolver(path, options) {
63 // @ts-ignore: the "pnp" version named isn't in DefinitelyTyped
64 if (process.versions.pnp) {
65 return (0, _jestPnpResolver().default)(path, options);
66 }
67
68 const resolve = options.browser
69 ? _browserResolve().default.sync
70 : resolveSync;
71 return resolve(path, {
72 basedir: options.basedir,
73 defaultResolver,
74 extensions: options.extensions,
75 moduleDirectory: options.moduleDirectory,
76 paths: options.paths,
77 rootDir: options.rootDir
78 });
79}
80
81const REGEX_RELATIVE_IMPORT = /^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/;
82
83function resolveSync(target, options) {
84 const basedir = options.basedir;
85 const extensions = options.extensions || ['.js'];
86 const paths = options.paths || [];
87
88 if (REGEX_RELATIVE_IMPORT.test(target)) {
89 // resolve relative import
90 const resolveTarget = _path().default.resolve(basedir, target);
91
92 const result = tryResolve(resolveTarget);
93
94 if (result) {
95 return result;
96 }
97 } else {
98 // otherwise search for node_modules
99 const dirs = (0, _nodeModulesPaths.default)(basedir, {
100 moduleDirectory: options.moduleDirectory,
101 paths
102 });
103
104 for (let i = 0; i < dirs.length; i++) {
105 const resolveTarget = _path().default.join(dirs[i], target);
106
107 const result = tryResolve(resolveTarget);
108
109 if (result) {
110 return result;
111 }
112 }
113 }
114
115 if ((0, _isBuiltinModule.default)(target)) {
116 return target;
117 }
118
119 const err = new Error(
120 "Cannot find module '" + target + "' from '" + basedir + "'"
121 );
122 err.code = 'MODULE_NOT_FOUND';
123 throw err;
124 /*
125 * contextual helper functions
126 */
127
128 function tryResolve(name) {
129 const dir = _path().default.dirname(name);
130
131 let result;
132
133 if (isDirectory(dir)) {
134 result = resolveAsFile(name) || resolveAsDirectory(name);
135 }
136
137 if (result) {
138 // Dereference symlinks to ensure we don't create a separate
139 // module instance depending on how it was referenced.
140 result = _fs().default.realpathSync(result);
141 }
142
143 return result;
144 }
145
146 function resolveAsFile(name) {
147 if (isFile(name)) {
148 return name;
149 }
150
151 for (let i = 0; i < extensions.length; i++) {
152 const file = name + extensions[i];
153
154 if (isFile(file)) {
155 return file;
156 }
157 }
158
159 return undefined;
160 }
161
162 function resolveAsDirectory(name) {
163 if (!isDirectory(name)) {
164 return undefined;
165 }
166
167 const pkgfile = _path().default.join(name, 'package.json');
168
169 let pkgmain;
170
171 try {
172 const body = _fs().default.readFileSync(pkgfile, 'utf8');
173
174 pkgmain = JSON.parse(body).main;
175 } catch (e) {}
176
177 if (pkgmain && !isCurrentDirectory(pkgmain)) {
178 const resolveTarget = _path().default.resolve(name, pkgmain);
179
180 const result = tryResolve(resolveTarget);
181
182 if (result) {
183 return result;
184 }
185 }
186
187 return resolveAsFile(_path().default.join(name, 'index'));
188 }
189}
190/*
191 * helper functions
192 */
193
194function isFile(file) {
195 let result;
196
197 try {
198 const stat = _fs().default.statSync(file);
199
200 result = stat.isFile() || stat.isFIFO();
201 } catch (e) {
202 if (!(e && e.code === 'ENOENT')) {
203 throw e;
204 }
205
206 result = false;
207 }
208
209 return result;
210}
211
212function isDirectory(dir) {
213 let result;
214
215 try {
216 const stat = _fs().default.statSync(dir);
217
218 result = stat.isDirectory();
219 } catch (e) {
220 if (!(e && (e.code === 'ENOENT' || e.code === 'ENOTDIR'))) {
221 throw e;
222 }
223
224 result = false;
225 }
226
227 return result;
228}
229
230function isCurrentDirectory(testPath) {
231 return _path().default.resolve('.') === _path().default.resolve(testPath);
232}