"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.startAsync = exports.printServerInfo = void 0; 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 _trimStart() { const data = _interopRequireDefault(require("lodash/trimStart")); _trimStart = function () { return data; }; return data; } function _openBrowser() { const data = _interopRequireDefault(require("react-dev-utils/openBrowser")); _openBrowser = function () { return data; }; return data; } function _readline() { const data = _interopRequireDefault(require("readline")); _readline = function () { return data; }; return data; } function _wordwrap() { const data = _interopRequireDefault(require("wordwrap")); _wordwrap = function () { return data; }; return data; } function _accounts() { const data = require("../../accounts"); _accounts = function () { return data; }; return data; } function _log() { const data = _interopRequireDefault(require("../../log")); _log = function () { return data; }; return data; } function _urlOpts() { const data = _interopRequireDefault(require("../../urlOpts")); _urlOpts = function () { return data; }; return data; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const CTRL_C = '\u0003'; const CTRL_D = '\u0004'; const CTRL_L = '\u000C'; const { bold: b, italic: i, underline: u } = _chalk().default; const clearConsole = () => { process.stdout.write(process.platform === 'win32' ? '\x1Bc' : '\x1B[2J\x1B[3J\x1B[H'); }; const printHelp = () => { const PLATFORM_TAG = _xdl().ProjectUtils.getPlatformTag('Expo'); _log().default.newLine(); _log().default.nested(`${PLATFORM_TAG} Press ${b('?')} to show a list of all available commands.`); }; const printUsage = async (projectDir, options = {}) => { const { dev } = await _xdl().ProjectSettings.readAsync(projectDir); const { exp } = await _xdl().ProjectUtils.readConfigJsonAsync(projectDir); const openDevToolsAtStartup = await _xdl().UserSettings.getAsync('openDevToolsAtStartup', true); const username = await _xdl().UserManager.getCurrentUsernameAsync(); const devMode = dev ? 'development' : 'production'; const androidInfo = `${b`a`} to run on ${u`A`}ndroid device/emulator`; const iosInfo = process.platform === 'darwin' ? `${b`i`} to run on ${u`i`}OS simulator` : ''; const webInfo = exp.platforms.includes('web') ? `${b`w`} to run on ${u`w`}eb` : ''; const platformInfo = [androidInfo, iosInfo, webInfo].filter(Boolean).join(', or '); _log().default.nested(` \u203A Press ${platformInfo}. \u203A Press ${b`c`} to show info on ${u`c`}onnecting new devices. \u203A Press ${b`d`} to open DevTools in the default web browser. \u203A Press ${b`shift-d`} to ${openDevToolsAtStartup ? 'disable' : 'enable'} automatically opening ${u`D`}evTools at startup.${options.webOnly ? '' : `\n \u203A Press ${b`e`} to send an app link with ${u`e`}mail.`} \u203A Press ${b`p`} to toggle ${u`p`}roduction mode. (current mode: ${i(devMode)}) \u203A Press ${b`r`} to ${u`r`}estart bundler, or ${b`shift-r`} to restart and clear cache. \u203A Press ${b`s`} to ${u`s`}ign ${username ? `out. (Signed in as ${i('@' + username)}.)` : 'in.'} `); }; const printServerInfo = async (projectDir, options = {}) => { if (options.webOnly) { _xdl().Webpack.printConnectionInstructions(projectDir); printHelp(); return; } const url = await _xdl().UrlUtils.constructManifestUrlAsync(projectDir); const username = await _xdl().UserManager.getCurrentUsernameAsync(); _log().default.newLine(); _log().default.nested(` ${u(url)}`); _log().default.newLine(); _urlOpts().default.printQRCode(url); const wrap = (0, _wordwrap().default)(2, process.stdout.columns || 80); const wrapItem = (0, _wordwrap().default)(4, process.stdout.columns || 80); const item = text => ' \u2022 ' + (0, _trimStart().default)(wrapItem(text)); const iosInfo = process.platform === 'darwin' ? `, or ${b('i')} for iOS simulator` : ''; _log().default.nested(wrap(u('To run the app with live reloading, choose one of:'))); if (username) { _log().default.nested(item(`Sign in as ${i('@' + username)} in Expo Client on Android or iOS. Your projects will automatically appear in the "Projects" tab.`)); } _log().default.nested(item(`Scan the QR code above with the Expo app (Android) or the Camera app (iOS).`)); _log().default.nested(item(`Press ${b`a`} for Android emulator${iosInfo}.`)); _log().default.nested(item(`Press ${b`e`} to send a link to your phone with email.`)); if (!username) { _log().default.nested(item(`Press ${b`s`} to sign in and enable more options.`)); } _xdl().Webpack.printConnectionInstructions(projectDir); printHelp(); }; exports.printServerInfo = printServerInfo; const startAsync = async (projectDir, options) => { const { stdin } = process; const startWaitingForCommand = () => { stdin.setRawMode(true); stdin.resume(); stdin.setEncoding('utf8'); stdin.on('data', handleKeypress); }; const stopWaitingForCommand = () => { stdin.removeListener('data', handleKeypress); stdin.setRawMode(false); stdin.resume(); }; startWaitingForCommand(); await printServerInfo(projectDir, options); async function handleKeypress(key) { if (options.webOnly) { switch (key) { case 'a': clearConsole(); (0, _log().default)('Trying to open the web project in Chrome on Android...'); await _xdl().Android.openWebProjectAsync(projectDir); printHelp(); break; case 'i': clearConsole(); (0, _log().default)('Trying to open the web project in Safari on the iOS simulator...'); await _xdl().Simulator.openWebProjectAsync(projectDir); printHelp(); break; case 'e': (0, _log().default)(_chalk().default.red` \u203A Sending a URL is not supported in web-only mode`); break; } } else { switch (key) { case 'a': { clearConsole(); (0, _log().default)('Trying to open the project on Android...'); await _xdl().Android.openProjectAsync(projectDir); printHelp(); break; } case 'i': { clearConsole(); (0, _log().default)('Trying to open the project in iOS simulator...'); await _xdl().Simulator.openProjectAsync(projectDir); printHelp(); break; } case 'e': { stopWaitingForCommand(); const lanAddress = await _xdl().UrlUtils.constructManifestUrlAsync(projectDir, { hostType: 'lan' }); const defaultRecipient = await _xdl().UserSettings.getAsync('sendTo', null); const rl = _readline().default.createInterface({ input: process.stdin, output: process.stdout }); const handleKeypress = (chr, key) => { if (key && key.name === 'escape') { cleanup(); cancel(); } }; const cleanup = () => { rl.close(); process.stdin.removeListener('keypress', handleKeypress); startWaitingForCommand(); }; const cancel = async () => { clearConsole(); printHelp(); }; clearConsole(); process.stdin.addListener('keypress', handleKeypress); (0, _log().default)('Please enter your email address (press ESC to cancel) '); rl.question(defaultRecipient ? `[default: ${defaultRecipient}]> ` : '> ', async sendTo => { cleanup(); if (!sendTo && defaultRecipient) { sendTo = defaultRecipient; } sendTo = sendTo && sendTo.trim(); if (!sendTo) { cancel(); return; } (0, _log().default)(`Sending ${lanAddress} to ${sendTo}...`); let sent = false; try { await _xdl().Exp.sendAsync(sendTo, lanAddress); (0, _log().default)(`Sent link successfully.`); sent = true; } catch (err) { (0, _log().default)(`Could not send link. ${err}`); } printHelp(); if (sent) { await _xdl().UserSettings.setAsync('sendTo', sendTo); } }); break; } } } switch (key) { case CTRL_C: case CTRL_D: { process.emit('SIGINT'); break; } case CTRL_L: { clearConsole(); break; } case '?': { await printUsage(projectDir, options); break; } case 'w': { clearConsole(); (0, _log().default)('Attempting to open the project in a web browser...'); await _xdl().Webpack.openAsync(projectDir); await printServerInfo(projectDir, options); break; } case 'c': { clearConsole(); await printServerInfo(projectDir, options); break; } case 'd': { const { devToolsPort } = await _xdl().ProjectSettings.readPackagerInfoAsync(projectDir); (0, _log().default)('Opening DevTools in the browser...'); (0, _openBrowser().default)(`http://localhost:${devToolsPort}`); printHelp(); break; } case 'D': { clearConsole(); const enabled = !(await _xdl().UserSettings.getAsync('openDevToolsAtStartup', true)); await _xdl().UserSettings.setAsync('openDevToolsAtStartup', enabled); (0, _log().default)(`Automatically opening DevTools ${b(enabled ? 'enabled' : 'disabled')}.\nPress ${b`d`} to open DevTools now.`); printHelp(); break; } case 'p': { clearConsole(); const projectSettings = await _xdl().ProjectSettings.readAsync(projectDir); const dev = !projectSettings.dev; await _xdl().ProjectSettings.setAsync(projectDir, { dev, minify: !dev }); (0, _log().default)(`Metro Bundler is now running in ${_chalk().default.bold(dev ? 'development' : 'production')}${_chalk().default.reset(` mode.`)} Please reload the project in the Expo app for the change to take effect.`); printHelp(); break; } case 'r': case 'R': { clearConsole(); const reset = key === 'R'; if (reset) { (0, _log().default)('Restarting Metro Bundler and clearing cache...'); } else { (0, _log().default)('Restarting Metro Bundler...'); } _xdl().Project.startAsync(projectDir, { ...options, reset }); break; } case 's': { const authSession = await _xdl().UserManager.getSessionAsync(); if (authSession) { await _xdl().UserManager.logoutAsync(); (0, _log().default)('Signed out.'); } else { stopWaitingForCommand(); try { await (0, _accounts().loginOrRegisterIfLoggedOut)(); } catch (e) { _log().default.error(e); } finally { startWaitingForCommand(); } } printHelp(); break; } } } }; exports.startAsync = startAsync; //# sourceMappingURL=../../__sourcemaps__/commands/start/TerminalUI.js.map