"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
function _path() {
const data = _interopRequireDefault(require("path"));
_path = function () {
return data;
};
return data;
}
function ConfigUtils() {
const data = _interopRequireWildcard(require("@expo/config"));
ConfigUtils = function () {
return data;
};
return data;
}
function _devTools() {
const data = require("@expo/dev-tools");
_devTools = function () {
return data;
};
return data;
}
function _jsonFile() {
const data = _interopRequireDefault(require("@expo/json-file"));
_jsonFile = function () {
return data;
};
return data;
}
function _xdl() {
const data = require("@expo/xdl");
_xdl = function () {
return data;
};
return data;
}
function _chalk() {
const data = _interopRequireDefault(require("chalk"));
_chalk = function () {
return data;
};
return data;
}
function _openBrowser() {
const data = _interopRequireDefault(require("react-dev-utils/openBrowser"));
_openBrowser = function () {
return data;
};
return data;
}
function _intersection() {
const data = _interopRequireDefault(require("lodash/intersection"));
_intersection = function () {
return data;
};
return data;
}
function _semver() {
const data = _interopRequireDefault(require("semver"));
_semver = function () {
return data;
};
return data;
}
function _attempt() {
const data = _interopRequireDefault(require("lodash/attempt"));
_attempt = function () {
return data;
};
return data;
}
function _isError() {
const data = _interopRequireDefault(require("lodash/isError"));
_isError = function () {
return data;
};
return data;
}
function _log() {
const data = _interopRequireDefault(require("../log"));
_log = function () {
return data;
};
return data;
}
function _sendTo() {
const data = _interopRequireDefault(require("../sendTo"));
_sendTo = function () {
return data;
};
return data;
}
function _exit() {
const data = require("../exit");
_exit = function () {
return data;
};
return data;
}
function _urlOpts() {
const data = _interopRequireDefault(require("../urlOpts"));
_urlOpts = function () {
return data;
};
return data;
}
function TerminalUI() {
const data = _interopRequireWildcard(require("./start/TerminalUI"));
TerminalUI = function () {
return data;
};
return data;
}
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function parseStartOptions(projectDir, options) {
let startOpts = {};
if (options.clear) {
startOpts.reset = true;
}
if (options.nonInteractive) {
startOpts.nonInteractive = true;
}
if (options.webOnly) {
startOpts.webOnly = true;
}
if (options.maxWorkers) {
startOpts.maxWorkers = options.maxWorkers;
}
return startOpts;
}
async function startWebAction(projectDir, options) {
const {
exp,
rootPath
} = await configureProjectAsync(projectDir, options);
const startOpts = parseStartOptions(projectDir, options);
await _xdl().Project.startAsync(rootPath, startOpts);
await _urlOpts().default.handleMobileOptsAsync(projectDir, options);
if (!options.nonInteractive && !exp.isDetached) {
await TerminalUI().startAsync(projectDir, startOpts);
}
}
async function action(projectDir, options) {
const {
exp,
pkg,
rootPath
} = await configureProjectAsync(projectDir, options);
await validateDependenciesVersions(projectDir, exp, pkg);
const startOpts = parseStartOptions(projectDir, options);
await _xdl().Project.startAsync(rootPath, startOpts);
const url = await _xdl().UrlUtils.constructManifestUrlAsync(projectDir);
const recipient = await _sendTo().default.getRecipient(options.sendTo);
if (recipient) {
await _sendTo().default.sendUrlAsync(url, recipient);
}
await _urlOpts().default.handleMobileOptsAsync(projectDir, options);
if (!startOpts.nonInteractive && !exp.isDetached) {
await TerminalUI().startAsync(projectDir, startOpts);
} else {
if (!exp.isDetached) {
_log().default.newLine();
_urlOpts().default.printQRCode(url);
}
(0, _log().default)(`Your native app is running at ${_chalk().default.underline(url)}`);
}
_log().default.nested(_chalk().default.green('Logs for your project will appear below. Press Ctrl+C to exit.'));
}
async function validateDependenciesVersions(projectDir, exp, pkg) {
if (!_xdl().Versions.gteSdkVersion(exp, '33.0.0')) {
return;
}
const bundleNativeModulesPath = (0, _attempt().default)(() => ConfigUtils().resolveModule('expo/bundledNativeModules.json', projectDir, exp));
if ((0, _isError().default)(bundleNativeModulesPath)) {
_log().default.warn(`Your project is in SDK version >= 33.0.0, but the ${_chalk().default.underline('expo')} package version seems to be older.`);
return;
}
const bundledNativeModules = await _jsonFile().default.readAsync(bundleNativeModulesPath);
const bundledNativeModulesNames = Object.keys(bundledNativeModules);
const projectDependencies = Object.keys(pkg.dependencies);
const modulesToCheck = (0, _intersection().default)(bundledNativeModulesNames, projectDependencies);
const incorrectDeps = [];
for (const moduleName of modulesToCheck) {
const expectedRange = bundledNativeModules[moduleName];
const actualRange = pkg.dependencies[moduleName];
if ((_semver().default.valid(actualRange) || _semver().default.validRange(actualRange)) && !_semver().default.intersects(expectedRange, actualRange)) {
incorrectDeps.push({
moduleName,
expectedRange,
actualRange
});
}
}
if (incorrectDeps.length > 0) {
_log().default.warn("Some of your project's dependencies are not compatible with currently installed expo package version:");
incorrectDeps.forEach(({
moduleName,
expectedRange,
actualRange
}) => {
_log().default.warn(` - ${_chalk().default.underline(moduleName)} - expected version range: ${_chalk().default.underline(expectedRange)} - actual version installed: ${_chalk().default.underline(actualRange)}`);
});
_log().default.warn('Your project may not work correctly until you install the correct versions of the packages.\n' + `To install the correct versions of these packages, please run: ${_chalk().default.inverse('expo install [package-name ...]')}`);
}
}
async function normalizeOptionsAsync(projectDir, options) {
const nonInteractive = options.parent && options.parent.nonInteractive;
let webOnly = false;
if (typeof options.webOnly !== 'undefined') {
webOnly = options.webOnly;
} else {
webOnly = await _xdl().Web.onlySupportsWebAsync(projectDir);
}
return { ...options,
webOnly,
nonInteractive
};
}
async function tryOpeningDevToolsAsync({
rootPath,
exp,
options
}) {
const devToolsUrl = await _devTools().DevToolsServer.startAsync(rootPath);
(0, _log().default)(`Expo DevTools is running at ${_chalk().default.underline(devToolsUrl)}`);
if (!options.nonInteractive && !exp.isDetached) {
if (await _xdl().UserSettings.getAsync('openDevToolsAtStartup', true)) {
(0, _log().default)(`Opening DevTools in the browser... (press ${_chalk().default.bold`shift-d`} to disable)`);
(0, _openBrowser().default)(devToolsUrl);
} else {
(0, _log().default)(`Press ${_chalk().default.bold`d`} to open DevTools now, or ${_chalk().default.bold`shift-d`} to always open it automatically.`);
}
}
}
async function configureProjectAsync(projectDir, options) {
if (options.webOnly) {
(0, _exit().installExitHooks)(projectDir, _xdl().Project.stopWebOnlyAsync);
} else {
(0, _exit().installExitHooks)(projectDir);
}
await _urlOpts().default.optsAsync(projectDir, options);
(0, _log().default)(_chalk().default.gray(`Starting project at ${projectDir}`));
const {
exp,
pkg
} = await _xdl().ProjectUtils.readConfigJsonAsync(projectDir, options.webOnly);
if (exp === null) {
_log().default.warn(`No Expo configuration found. Are you sure this is a project directory?`);
process.exit(1);
}
const rootPath = _path().default.resolve(projectDir);
await tryOpeningDevToolsAsync({
rootPath,
exp,
options
});
return {
rootPath,
exp,
pkg
};
}
var _default = program => {
program.command('start [project-dir]').alias('r').description('Starts or restarts a local server for your app and gives you a URL to it').option('-s, --send-to [dest]', 'An email address to send a link to').option('-c, --clear', 'Clear the React Native packager cache').option('--web-only', 'Only start the Webpack dev server for web. [Deprecated]: use `expo start:web`') // TODO(anp) set a default for this dynamically based on whether we're inside a container?
.option('--max-workers [num]', 'Maximum number of tasks to allow Metro to spawn.').urlOpts().allowOffline().asyncActionProjectDir(async (projectDir, options) => {
const normalizedOptions = await normalizeOptionsAsync(projectDir, options);
if (normalizedOptions.webOnly) {
return await startWebAction(projectDir, normalizedOptions);
}
return await action(projectDir, normalizedOptions);
},
/* skipProjectValidation: */
true,
/* skipAuthCheck: */
true);
program.command('start:web [project-dir]').alias('web').description('Starts the Webpack dev server for web projects').urlOpts().allowOffline().asyncActionProjectDir(async (projectDir, options) => {
return startWebAction(projectDir, (await normalizeOptionsAsync(projectDir, { ...options,
webOnly: true
})));
},
/* skipProjectValidation: */
true,
/* skipAuthCheck: */
true);
};
exports.default = _default;
//# sourceMappingURL=../__sourcemaps__/commands/start.js.map