/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow strict-local * @format */ import type {DebuggerShellPreparationResult} from '../'; const {spawn} = require('cross-spawn'); async function spawnAndGetStderr( command: string, args: string[], ): Promise<{ code: number, stderr: string, }> { return new Promise((resolve, reject) => { const child = spawn(command, args, { stdio: ['ignore', 'ignore', 'pipe'], encoding: 'utf8', windowsHide: true, }); let stderr = ''; child.stderr.on('data', data => { stderr += data; }); child.on('error', error => { reject(error); }); child.on('close', (code, signal) => { resolve({ code, stderr, }); }); }); } async function prepareDebuggerShellFromDotSlashFile( filePath: string, ): Promise { const {code, stderr} = await spawnAndGetStderr( // $FlowFixMe[cannot-resolve-module] fb-dotslash includes Flow types but Flow does not pick them up require('fb-dotslash'), ['--', 'fetch', filePath], ); if (code === 0) { return {code: 'success'}; } if ( stderr.includes('dotslash error') && stderr.includes('no providers succeeded') ) { if (stderr.includes('failed to verify artifact')) { return { code: 'possible_corruption', humanReadableMessage: 'Failed to verify the latest version of React Native DevTools. ' + 'Using a fallback version instead. ', verboseInfo: stderr, }; } return { code: 'likely_offline', humanReadableMessage: 'Failed to download the latest version of React Native DevTools. ' + 'Using a fallback version instead. ' + 'Connect to the internet or check your network settings.', verboseInfo: stderr, }; } if ( stderr.includes('dotslash error') && stderr.includes('platform not supported') ) { return { code: 'platform_not_supported', humanReadableMessage: 'The latest version of React Native DevTools is not supported on this platform. ' + 'Using a fallback version instead.', verboseInfo: stderr, }; } return { code: 'unexpected_error', humanReadableMessage: 'An unexpected error occured while installing the latest version of React Native DevTools. ' + 'Using a fallback version instead.', verboseInfo: stderr, }; } export {spawnAndGetStderr, prepareDebuggerShellFromDotSlashFile};