@expo/cli
Version:
134 lines (133 loc) • 5.12 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
AbortCommandError: function() {
return AbortCommandError;
},
CommandError: function() {
return CommandError;
},
SilentError: function() {
return SilentError;
},
UnimplementedError: function() {
return UnimplementedError;
},
logCmdError: function() {
return logCmdError;
}
});
function _assert() {
const data = require("assert");
_assert = function() {
return data;
};
return data;
}
function _chalk() {
const data = /*#__PURE__*/ _interop_require_default(require("chalk"));
_chalk = function() {
return data;
};
return data;
}
function _child_process() {
const data = require("child_process");
_child_process = function() {
return data;
};
return data;
}
const _log = require("../log");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const ERROR_PREFIX = 'Error: ';
class CommandError extends Error {
constructor(code, message = ''){
super(''), this.code = code, this.name = 'CommandError', this.isCommandError = true;
// If e.toString() was called to get `message` we don't want it to look
// like "Error: Error:".
if (message.startsWith(ERROR_PREFIX)) {
message = message.substring(ERROR_PREFIX.length);
}
this.message = message || code;
}
}
class AbortCommandError extends CommandError {
constructor(){
super('ABORTED', 'Interactive prompt was cancelled.');
}
}
class SilentError extends CommandError {
constructor(messageOrError){
const message = (typeof messageOrError === 'string' ? messageOrError : messageOrError == null ? void 0 : messageOrError.message) ?? 'This error should fail silently in the CLI';
super('SILENT', message);
if (typeof messageOrError !== 'string') {
// forward the props of the incoming error for tests or processes outside of expo-cli that use expo cli internals.
this.stack = (messageOrError == null ? void 0 : messageOrError.stack) ?? this.stack;
this.name = (messageOrError == null ? void 0 : messageOrError.name) ?? this.name;
}
}
}
function logCmdError(error) {
if (!(error instanceof Error)) {
throw error;
}
if (error instanceof AbortCommandError || error instanceof SilentError) {
// Do nothing, this is used for prompts or other cases that were custom logged.
process.exit(0);
} else if (error instanceof CommandError || error instanceof _assert().AssertionError || error.name === 'ApiV2Error' || error.name === 'ConfigError') {
// Print the stack trace in debug mode only.
(0, _log.exit)(error);
}
const errorDetails = error.stack ? '\n' + _chalk().default.gray(error.stack) : '';
(0, _log.exit)(_chalk().default.red(error.toString()) + errorDetails);
}
class UnimplementedError extends Error {
constructor(){
super('Unimplemented');
this.name = 'UnimplementedError';
}
}
/**
* Add additional information when EMFILE errors are encountered.
* These errors originate from Metro's FSEventsWatcher due to `fsevents` going over MacOS system limit.
* Unfortunately, these limits in macOS are relatively low compared to an average React Native project.
*
* @see https://github.com/expo/expo/issues/29083
* @see https://github.com/facebook/metro/issues/834
* @see https://github.com/fsevents/fsevents/issues/42#issuecomment-62632234
*/ function handleTooManyOpenFileErrors(error) {
// Only enable special logging when running on macOS and are running into the `EMFILE` error
if ('code' in error && error.code === 'EMFILE' && process.platform === 'darwin') {
try {
// Try to recover watchman, if it's not installed this will throw
(0, _child_process().execSync)('watchman shutdown-server', {
stdio: 'ignore'
});
// NOTE(cedric): this both starts the watchman server and resets all watchers
(0, _child_process().execSync)('watchman watch-del-all', {
stdio: 'ignore'
});
(0, _log.warn)('Watchman is installed but was likely not enabled when starting Metro, try starting your project again.\nIf this problem persists, follow the troubleshooting guide of Watchman: https://facebook.github.io/watchman/docs/troubleshooting');
} catch {
(0, _log.warn)(`Your macOS system limit does not allow enough watchers for Metro, install Watchman instead. Learn more: https://facebook.github.io/watchman/docs/install`);
}
(0, _log.exception)(error);
process.exit(1);
}
throw error;
}
process.on('uncaughtException', handleTooManyOpenFileErrors);
//# sourceMappingURL=errors.js.map
;