packager: ResolutionRequest.js: sync _resolveNodeDependency()

Summary: Moar synchronicity.

Reviewed By: davidaurelio

Differential Revision: D4756495

fbshipit-source-id: 4e0758ba8b55bd25a24d79dcc8ac4ace101e2ae8
This commit is contained in:
Jean Lauliac 2017-03-27 09:43:11 -07:00 committed by Facebook Github Bot
parent 4d9826eb64
commit 62c07e39dc
1 changed files with 79 additions and 75 deletions

View File

@ -132,11 +132,12 @@ class ResolutionRequest {
&& !(isRelativeImport(toModuleName) || isAbsolutePath(toModuleName))) { && !(isRelativeImport(toModuleName) || isAbsolutePath(toModuleName))) {
return this._tryResolve( return this._tryResolve(
() => Promise.resolve().then(() => this._resolveHasteDependency(fromModule, toModuleName)), () => Promise.resolve().then(() => this._resolveHasteDependency(fromModule, toModuleName)),
() => this._resolveNodeDependency(fromModule, toModuleName) () => Promise.resolve().then(() => this._resolveNodeDependency(fromModule, toModuleName))
).then(cacheResult); ).then(cacheResult);
} }
return this._resolveNodeDependency(fromModule, toModuleName) return Promise.resolve()
.then(() => this._resolveNodeDependency(fromModule, toModuleName))
.then(cacheResult); .then(cacheResult);
} }
@ -329,87 +330,90 @@ class ResolutionRequest {
); );
} }
_resolveNodeDependency(fromModule: Module, toModuleName: string): Promise<Module> { _resolveNodeDependency(fromModule: Module, toModuleName: string): Module {
return Promise.resolve().then(() => { if (isRelativeImport(toModuleName) || isAbsolutePath(toModuleName)) {
if (isRelativeImport(toModuleName) || isAbsolutePath(toModuleName)) { return this._resolveFileOrDir(fromModule, toModuleName);
return this._resolveFileOrDir(fromModule, toModuleName); }
} const realModuleName = this._redirectRequire(fromModule, toModuleName);
const realModuleName = this._redirectRequire(fromModule, toModuleName); // exclude
// exclude if (realModuleName === false) {
if (realModuleName === false) { return this._loadAsFile(
return this._loadAsFile( ResolutionRequest.emptyModule,
ResolutionRequest.emptyModule, fromModule,
fromModule, toModuleName,
toModuleName, );
}
if (isRelativeImport(realModuleName) || isAbsolutePath(realModuleName)) {
// derive absolute path /.../node_modules/fromModuleDir/realModuleName
const fromModuleParentIdx = fromModule.path.lastIndexOf('node_modules' + path.sep) + 13;
const fromModuleDir = fromModule.path.slice(
0,
fromModule.path.indexOf(path.sep, fromModuleParentIdx),
);
const absPath = path.join(fromModuleDir, realModuleName);
return this._resolveFileOrDir(fromModule, absPath);
}
const searchQueue = [];
for (let currDir = path.dirname(fromModule.path);
currDir !== '.' && currDir !== realPath.parse(fromModule.path).root;
currDir = path.dirname(currDir)) {
const searchPath = path.join(currDir, 'node_modules');
if (this._dirExists(searchPath)) {
searchQueue.push(
path.join(searchPath, realModuleName)
); );
} }
}
if (isRelativeImport(realModuleName) || isAbsolutePath(realModuleName)) { if (this._extraNodeModules) {
// derive absolute path /.../node_modules/fromModuleDir/realModuleName const {_extraNodeModules} = this;
const fromModuleParentIdx = fromModule.path.lastIndexOf('node_modules' + path.sep) + 13; const bits = toModuleName.split(path.sep);
const fromModuleDir = fromModule.path.slice( const packageName = bits[0];
0, if (_extraNodeModules[packageName]) {
fromModule.path.indexOf(path.sep, fromModuleParentIdx), bits[0] = _extraNodeModules[packageName];
); searchQueue.push(path.join.apply(path, bits));
const absPath = path.join(fromModuleDir, realModuleName);
return this._resolveFileOrDir(fromModule, absPath);
} }
}
const searchQueue = []; for (let i = 0; i < searchQueue.length; ++i) {
for (let currDir = path.dirname(fromModule.path); const resolvedModule = this._tryResolveNodeDep(searchQueue[i], fromModule, toModuleName);
currDir !== '.' && currDir !== realPath.parse(fromModule.path).root; if (resolvedModule != null) {
currDir = path.dirname(currDir)) { return resolvedModule;
const searchPath = path.join(currDir, 'node_modules');
if (this._dirExists(searchPath)) {
searchQueue.push(
path.join(searchPath, realModuleName)
);
}
} }
}
if (this._extraNodeModules) { const hint = searchQueue.length ? ' or in these directories:' : '';
const {_extraNodeModules} = this; throw new UnableToResolveError(
const bits = toModuleName.split(path.sep); fromModule,
const packageName = bits[0]; toModuleName,
if (_extraNodeModules[packageName]) { `Module does not exist in the module map${hint}\n` +
bits[0] = _extraNodeModules[packageName]; searchQueue.map(searchPath => ` ${path.dirname(searchPath)}\n`).join(', ') + '\n' +
searchQueue.push(path.join.apply(path, bits)); `This might be related to https://github.com/facebook/react-native/issues/4968\n` +
} `To resolve try the following:\n` +
` 1. Clear watchman watches: \`watchman watch-del-all\`.\n` +
` 2. Delete the \`node_modules\` folder: \`rm -rf node_modules && npm install\`.\n` +
' 3. Reset packager cache: `rm -fr $TMPDIR/react-*` or `npm start -- --reset-cache`.'
);
}
/**
* This is written as a separate function because "try..catch" blocks cause
* the entire surrounding function to be deoptimized.
*/
_tryResolveNodeDep(searchPath: string, fromModule: Module, toModuleName: string): ?Module {
try {
return tryResolveSync(
() => this._loadAsFile(searchPath, fromModule, toModuleName),
() => this._loadAsDir(searchPath, fromModule, toModuleName),
);
} catch (error) {
if (error.type !== 'UnableToResolveError') {
throw error;
} }
return null;
let p = Promise.reject(new UnableToResolveError(fromModule, toModuleName)); }
searchQueue.forEach(potentialModulePath => {
p = this._tryResolve(
() => this._tryResolve(
() => p,
() => Promise.resolve().then(
() => this._loadAsFile(potentialModulePath, fromModule, toModuleName),
),
),
() => Promise.resolve().then(
() => this._loadAsDir(potentialModulePath, fromModule, toModuleName),
),
);
});
return p.catch(error => {
if (error.type !== 'UnableToResolveError') {
throw error;
}
const hint = searchQueue.length ? ' or in these directories:' : '';
throw new UnableToResolveError(
fromModule,
toModuleName,
`Module does not exist in the module map${hint}\n` +
searchQueue.map(searchPath => ` ${path.dirname(searchPath)}\n`).join(', ') + '\n' +
`This might be related to https://github.com/facebook/react-native/issues/4968\n` +
`To resolve try the following:\n` +
` 1. Clear watchman watches: \`watchman watch-del-all\`.\n` +
` 2. Delete the \`node_modules\` folder: \`rm -rf node_modules && npm install\`.\n` +
' 3. Reset packager cache: `rm -fr $TMPDIR/react-*` or `npm start -- --reset-cache`.'
);
});
});
} }
_loadAsFile(potentialModulePath: string, fromModule: Module, toModule: string): Module { _loadAsFile(potentialModulePath: string, fromModule: Module, toModule: string): Module {