Move process.exit outside of DependencyResolver

Summary:
node-haste shouldn't ever call process.exit and should leave it up to clients to shut down properly. This change just moves it out into the `Resolver` class – I'll leave it up to David and Martin to improve error handling for the rn packager :)

public

Reviewed By: davidaurelio

Differential Revision: D2889908

fb-gh-sync-id: 6f03162c44d89e268891ef71c8db784a6f2e081d
This commit is contained in:
Christoph Pojer 2016-02-02 18:09:45 -08:00 committed by facebook-github-bot-4
parent f2cb2355b2
commit 6d8ccc318b
4 changed files with 21 additions and 18 deletions

View File

@ -1189,22 +1189,14 @@ describe('DependencyGraph', function() {
}, },
}); });
const _exit = process.exit;
const _error = console.error;
process.exit = jest.genMockFn();
console.error = jest.genMockFn();
var dgraph = new DependencyGraph({ var dgraph = new DependencyGraph({
...defaults, ...defaults,
roots: [root], roots: [root],
}); });
return dgraph.load().catch(() => { return dgraph.load().catch(err => {
expect(process.exit).toBeCalledWith(1); expect(err.message).toEqual('Failed to build DependencyGraph: Naming collision detected: /root/b.js collides with /root/index.js');
expect(console.error).toBeCalled(); expect(err.type).toEqual('DependencyGraphError');
process.exit = _exit;
console.error = _error;
}); });
}); });

View File

@ -22,6 +22,8 @@ const ResolutionResponse = require('./ResolutionResponse');
const HasteMap = require('./HasteMap'); const HasteMap = require('./HasteMap');
const DeprecatedAssetMap = require('./DeprecatedAssetMap'); const DeprecatedAssetMap = require('./DeprecatedAssetMap');
const ERROR_BUILDING_DEP_GRAPH = 'DependencyGraphError';
const defaultActivity = { const defaultActivity = {
startEvent: () => {}, startEvent: () => {},
endEvent: () => {}, endEvent: () => {},
@ -63,11 +65,7 @@ class DependencyGraph {
}; };
this._cache = cache; this._cache = cache;
this._helpers = new DependencyGraphHelpers(this._opts); this._helpers = new DependencyGraphHelpers(this._opts);
this.load().catch((err) => { this.load();
// This only happens at initialization. Live errors are easier to recover from.
console.error('Error building DependencyGraph:\n', err.stack);
process.exit(1);
});
} }
load() { load() {
@ -134,7 +132,14 @@ class DependencyGraph {
this._deprecatedAssetMap.build(), this._deprecatedAssetMap.build(),
]).then(() => ]).then(() =>
activity.endEvent(depGraphActivity) activity.endEvent(depGraphActivity)
).catch(err => {
const error = new Error(
`Failed to build DependencyGraph: ${err.message}`
); );
error.type = ERROR_BUILDING_DEP_GRAPH;
error.stack = err.stack;
throw error;
});
return this._loading; return this._loading;
} }

View File

@ -10,7 +10,6 @@
jest.dontMock('../') jest.dontMock('../')
.dontMock('underscore') .dontMock('underscore')
.dontMock('PixelRatio')
.dontMock('../../DependencyResolver/lib/extractRequires') .dontMock('../../DependencyResolver/lib/extractRequires')
.dontMock('../../DependencyResolver/lib/replacePatterns'); .dontMock('../../DependencyResolver/lib/replacePatterns');
@ -33,6 +32,8 @@ describe('Resolver', function() {
path.join.mockImpl(function(a, b) { path.join.mockImpl(function(a, b) {
return b; return b;
}); });
DependencyGraph.prototype.load.mockImpl(() => Promise.resolve());
}); });
class ResolutionResponseMock { class ResolutionResponseMock {

View File

@ -103,6 +103,11 @@ class Resolver {
}); });
this._polyfillModuleNames = opts.polyfillModuleNames || []; this._polyfillModuleNames = opts.polyfillModuleNames || [];
this._depGraph.load().catch(err => {
console.error(err.message + '\n' + err.stack);
process.exit(1);
});
} }
getShallowDependencies(entryFile) { getShallowDependencies(entryFile) {