diff --git a/.flowconfig b/.flowconfig index 87fb9288f..90bdd9049 100644 --- a/.flowconfig +++ b/.flowconfig @@ -23,6 +23,7 @@ flow-typed [options] emoji=true +esproposal.export_star_as=enable esproposal.optional_chaining=enable esproposal.nullish_coalescing=enable module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' diff --git a/package.json b/package.json index 308f6ed51..52f32e509 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "glob": "^7.1.3", "jest": "^24.6.0", "lerna": "^3.13.1", + "metro-memory-fs": "^0.53.1", "micromatch": "^3.1.10", "mkdirp": "^0.5.1", "string-length": "^2.0.0" diff --git a/packages/cli/package.json b/packages/cli/package.json index a40dab5de..e3217240c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -28,10 +28,8 @@ "connect": "^3.6.5", "cosmiconfig": "^5.1.0", "deepmerge": "^3.2.0", - "denodeify": "^1.2.1", "envinfo": "^7.1.0", "errorhandler": "^1.5.0", - "escape-string-regexp": "^1.0.5", "execa": "^1.0.0", "fs-extra": "^7.0.1", "glob": "^7.1.1", @@ -39,13 +37,10 @@ "inquirer": "^3.0.6", "joi": "^14.3.1", "lodash": "^4.17.5", - "logkitty": "^0.4.0", "metro": "^0.53.1", "metro-config": "^0.53.1", "metro-core": "^0.53.1", - "metro-memory-fs": "^0.53.1", "metro-react-native-babel-transformer": "^0.53.1", - "mime": "^1.3.4", "minimist": "^1.2.0", "mkdirp": "^0.5.1", "morgan": "^1.9.0", @@ -57,10 +52,7 @@ "semver": "^5.0.3", "serve-static": "^1.13.1", "shell-quote": "1.6.1", - "slash": "^2.0.0", - "ws": "^1.1.0", - "xcode": "^2.0.0", - "xmldoc": "^0.4.0" + "ws": "^1.1.0" }, "peerDependencies": { "react-native": "^0.60.0" diff --git a/packages/cli/src/commands/index.js b/packages/cli/src/commands/index.js index 97e20dc6b..61e182705 100644 --- a/packages/cli/src/commands/index.js +++ b/packages/cli/src/commands/index.js @@ -4,8 +4,6 @@ import {type CommandT} from '../tools/config/types.flow'; import server from './server/server'; -import runIOS from './runIOS/runIOS'; -import runAndroid from './runAndroid/runAndroid'; import library from './library/library'; import bundle from './bundle/bundle'; import ramBundle from './bundle/ramBundle'; @@ -14,16 +12,12 @@ import unlink from './link/unlink'; import install from './install/install'; import uninstall from './install/uninstall'; import upgrade from './upgrade/upgrade'; -import logAndroid from './logAndroid/logAndroid'; -import logIOS from './logIOS/logIOS'; import info from './info/info'; import config from './config/config'; import init from './init'; export default ([ server, - runIOS, - runAndroid, library, bundle, ramBundle, @@ -32,8 +26,6 @@ export default ([ install, uninstall, upgrade, - logAndroid, - logIOS, info, config, init, diff --git a/packages/cli/src/commands/link/link.js b/packages/cli/src/commands/link/link.js index 2be0d3f72..60b254629 100644 --- a/packages/cli/src/commands/link/link.js +++ b/packages/cli/src/commands/link/link.js @@ -8,14 +8,11 @@ */ import {pick} from 'lodash'; -import dedent from 'dedent'; import {type ConfigT} from '../../tools/config/types.flow'; -import {CLIError} from '../../tools/errors'; - import promiseWaterfall from './promiseWaterfall'; -import {logger} from '@react-native-community/cli-tools'; +import {logger, CLIError} from '@react-native-community/cli-tools'; import commandStub from './commandStub'; import promisify from './promisify'; import getPlatformName from './getPlatformName'; @@ -61,7 +58,7 @@ function link([rawPackageName]: Array, ctx: ConfigT, opts: FlagsType) { const packageName = rawPackageName.replace(/^(.+?)(@.+?)$/gi, '$1'); if (!Object.keys(ctx.dependencies).includes(packageName)) { - throw new CLIError(dedent` + throw new CLIError(` Unknown dependency. Make sure that the package you are trying to link is already installed in your "node_modules" and present in your "package.json" dependencies. `); diff --git a/packages/cli/src/commands/link/linkAll.js b/packages/cli/src/commands/link/linkAll.js index bd9f80a80..576a98531 100644 --- a/packages/cli/src/commands/link/linkAll.js +++ b/packages/cli/src/commands/link/linkAll.js @@ -5,8 +5,7 @@ import {uniqBy, flatMap} from 'lodash'; import path from 'path'; -import type {ConfigT, PlatformsT} from '../../tools/config/types.flow'; -import {CLIError} from '../../tools/errors'; +import type {ConfigT} from '../../tools/config/types.flow'; import promiseWaterfall from './promiseWaterfall'; import commandStub from './commandStub'; @@ -15,6 +14,8 @@ import promisify from './promisify'; import linkAssets from './linkAssets'; import linkDependency from './linkDependency'; +import {CLIError} from '@react-native-community/cli-tools'; + const dedupeAssets = (assets: Array): Array => uniqBy(assets, asset => path.basename(asset)); diff --git a/packages/cli/src/commands/link/unlink.js b/packages/cli/src/commands/link/unlink.js index 3bcf48758..e7991ac72 100644 --- a/packages/cli/src/commands/link/unlink.js +++ b/packages/cli/src/commands/link/unlink.js @@ -9,8 +9,7 @@ import {flatMap, values, difference} from 'lodash'; import type {ConfigT} from '../../tools/config/types.flow'; -import dedent from 'dedent'; -import {logger} from '@react-native-community/cli-tools'; +import {logger, CLIError} from '@react-native-community/cli-tools'; import promiseWaterfall from './promiseWaterfall'; import commandStub from './commandStub'; import promisify from './promisify'; @@ -83,7 +82,7 @@ function unlink(args: Array, ctx: ConfigT) { const {[packageName]: dependency, ...otherDependencies} = ctx.dependencies; if (!dependency) { - throw new Error(dedent` + throw new CLIError(` Failed to unlink "${packageName}". It appears that the project is not linked yet. `); } @@ -136,10 +135,10 @@ function unlink(args: Array, ctx: ConfigT) { ); }) .catch(err => { - logger.error( - `It seems something went wrong while unlinking. Error:\n${err.message}`, + throw new CLIError( + `Something went wrong while unlinking. Reason ${err.message}`, + err, ); - throw err; }); } diff --git a/packages/cli/src/tools/config/__tests__/__snapshots__/index-test.js.snap b/packages/cli/src/tools/config/__tests__/__snapshots__/index-test.js.snap index 27ab9e567..7479bcbbe 100644 --- a/packages/cli/src/tools/config/__tests__/__snapshots__/index-test.js.snap +++ b/packages/cli/src/tools/config/__tests__/__snapshots__/index-test.js.snap @@ -57,64 +57,29 @@ Array [ ] `; -exports[`should merge project configuration with default values 1`] = ` +exports[`should merge project configuration with default values: snapshoting \`react-native-test\` config 1`] = ` Object { - "assets": Array [], - "commands": Array [], - "dependencies": Object { - "react-native": Object { - "assets": Array [], - "hooks": Object {}, - "name": "react-native", - "params": Array [], - "platforms": Object { - "android": null, - "ios": null, - }, - }, - "react-native-test": Object { - "assets": Array [ - "foo", - ], - "hooks": Object {}, - "name": "react-native-test", - "params": Array [], - "platforms": Object { - "android": null, - "ios": Object { - "folder": "<>/node_modules/react-native-test", - "libraryFolder": "Libraries", - "pbxprojPath": "<>/node_modules/react-native-test/ios/HelloWorld.xcodeproj/project.pbxproj", - "plist": Array [], - "podfile": null, - "podspec": null, - "projectName": "HelloWorld.xcodeproj", - "projectPath": "<>/node_modules/react-native-test/ios/HelloWorld.xcodeproj", - "sharedLibraries": Array [], - "sourceDir": "./abc", - }, - }, - }, - }, - "haste": Object { - "platforms": Array [ - "ios", - "android", - ], - "providesModuleNodeModules": Array [ - "react-native", - ], - }, + "assets": Array [ + "foo", + ], + "hooks": Object {}, + "name": "react-native-test", + "params": Array [], "platforms": Object { - "android": Object {}, - "ios": Object {}, - }, - "project": Object { "android": null, - "ios": null, + "ios": Object { + "folder": "<>/node_modules/react-native-test", + "libraryFolder": "Libraries", + "pbxprojPath": "<>/node_modules/react-native-test/ios/HelloWorld.xcodeproj/project.pbxproj", + "plist": Array [], + "podfile": null, + "podspec": null, + "projectName": "HelloWorld.xcodeproj", + "projectPath": "<>/node_modules/react-native-test/ios/HelloWorld.xcodeproj", + "sharedLibraries": Array [], + "sourceDir": "./abc", + }, }, - "reactNativePath": "<>", - "root": "<>", } `; diff --git a/packages/cli/src/tools/config/__tests__/index-test.js b/packages/cli/src/tools/config/__tests__/index-test.js index bb917ce9c..5ea4965f2 100644 --- a/packages/cli/src/tools/config/__tests__/index-test.js +++ b/packages/cli/src/tools/config/__tests__/index-test.js @@ -113,8 +113,10 @@ test('should merge project configuration with default values', () => { } }`, }); - const config = loadConfig(DIR); - expect(removeString(config, DIR)).toMatchSnapshot(); + const {dependencies} = loadConfig(DIR); + expect(removeString(dependencies['react-native-test'], DIR)).toMatchSnapshot( + 'snapshoting `react-native-test` config', + ); }); test('should read `rnpm` config from a dependency and transform it to a new format', () => { diff --git a/packages/cli/src/tools/errors.js b/packages/cli/src/tools/config/errors.js similarity index 61% rename from packages/cli/src/tools/errors.js rename to packages/cli/src/tools/config/errors.js index 6c2dfb159..3b1fbbc55 100644 --- a/packages/cli/src/tools/errors.js +++ b/packages/cli/src/tools/config/errors.js @@ -1,36 +1,7 @@ /** * @flow */ -import chalk from 'chalk'; -import dedent from 'dedent'; - -/** - * CLIError - * - * Features: - * - uses original stack trace when error object is passed - * - makes an inline string to match current styling inside CLI - */ -export class CLIError extends Error { - constructor(msg: string, error?: Error) { - super(msg.replace(/(\r\n|\n|\r)/gm, ' ')); - if (error) { - this.stack = error.stack - .split('\n') - .slice(0, 2) - .join('\n'); - } else { - Error.captureStackTrace(this, CLIError); - } - } -} - -export class ProcessError extends Error { - constructor(msg: string, processError: string) { - super(`${chalk.red(msg)}\n\n${chalk.gray(processError)}`); - Error.captureStackTrace(this, ProcessError); - } -} +import {CLIError} from '@react-native-community/cli-tools'; type JoiErrorDetails = { message: string, @@ -61,7 +32,7 @@ export class JoiError extends CLIError { switch (error.type) { case 'object.allowUnknown': { const value = JSON.stringify(error.context.value); - return dedent` + return ` Unknown option ${name} with value "${value}" was found. This is either a typing error or a user mistake. Fixing it will remove this message. `; @@ -70,7 +41,7 @@ export class JoiError extends CLIError { case 'string.base': { const expectedType = error.type.replace('.base', ''); const actualType = typeof error.context.value; - return dedent` + return ` Option ${name} must be a ${expectedType}, instead got ${actualType} `; } diff --git a/packages/cli/src/tools/config/index.js b/packages/cli/src/tools/config/index.js index c5beefef9..18ca979ac 100644 --- a/packages/cli/src/tools/config/index.js +++ b/packages/cli/src/tools/config/index.js @@ -51,6 +51,7 @@ function loadConfig(projectRoot: string = process.cwd()): ConfigT { // @todo: Move this to React Native in the future if (dependencyName === 'react-native') { config.platforms = {ios, android}; + config.commands = [...ios.commands, ...android.commands]; } const isPlatform = Object.keys(config.platforms).length > 0; diff --git a/packages/cli/src/tools/config/readConfigFromDisk.js b/packages/cli/src/tools/config/readConfigFromDisk.js index fda58d138..c4723afdf 100644 --- a/packages/cli/src/tools/config/readConfigFromDisk.js +++ b/packages/cli/src/tools/config/readConfigFromDisk.js @@ -13,7 +13,7 @@ import { type CommandT, } from './types.flow'; -import {JoiError} from '../errors'; +import {JoiError} from './errors'; import * as schema from './schema'; diff --git a/packages/cli/src/tools/config/resolveReactNativePath.js b/packages/cli/src/tools/config/resolveReactNativePath.js index bf1facd66..d814c2a6e 100644 --- a/packages/cli/src/tools/config/resolveReactNativePath.js +++ b/packages/cli/src/tools/config/resolveReactNativePath.js @@ -2,7 +2,7 @@ * @flow */ import path from 'path'; -import dedent from 'dedent'; +import {CLIError} from '@react-native-community/cli-tools'; /** * Finds path to React Native inside `node_modules` or throws @@ -17,7 +17,7 @@ export default function resolveReactNativePath(root: string) { }), ); } catch (_ignored) { - throw new Error(dedent` + throw new CLIError(` Unable to find React Native files. Make sure "react-native" module is installed in your project dependencies. diff --git a/packages/platform-android/package.json b/packages/platform-android/package.json index e5c82060c..f964633ff 100644 --- a/packages/platform-android/package.json +++ b/packages/platform-android/package.json @@ -3,6 +3,10 @@ "version": "2.0.0-alpha.5", "main": "build/index.js", "dependencies": { - "@react-native-community/cli-tools": "^2.0.0-alpha.5" + "@react-native-community/cli-tools": "^2.0.0-alpha.5", + "node-fetch": "^2.2.0", + "logkitty": "^0.4.0", + "slash": "^2.0.0", + "xmldoc": "^0.4.0" } } diff --git a/packages/platform-android/src/commands/index.js b/packages/platform-android/src/commands/index.js new file mode 100644 index 000000000..01ef421d5 --- /dev/null +++ b/packages/platform-android/src/commands/index.js @@ -0,0 +1,7 @@ +/** + * @flow + */ +import logAndroid from './logAndroid'; +import runAndroid from './runAndroid'; + +export default [logAndroid, runAndroid]; diff --git a/packages/cli/src/commands/logAndroid/logAndroid.js b/packages/platform-android/src/commands/logAndroid/index.js similarity index 100% rename from packages/cli/src/commands/logAndroid/logAndroid.js rename to packages/platform-android/src/commands/logAndroid/index.js diff --git a/packages/cli/src/commands/runAndroid/__tests__/runOnAllDevices.test.js b/packages/platform-android/src/commands/runAndroid/__tests__/runOnAllDevices.test.js similarity index 100% rename from packages/cli/src/commands/runAndroid/__tests__/runOnAllDevices.test.js rename to packages/platform-android/src/commands/runAndroid/__tests__/runOnAllDevices.test.js diff --git a/packages/cli/src/commands/runAndroid/adb.js b/packages/platform-android/src/commands/runAndroid/adb.js similarity index 100% rename from packages/cli/src/commands/runAndroid/adb.js rename to packages/platform-android/src/commands/runAndroid/adb.js diff --git a/packages/cli/src/commands/runAndroid/getAdbPath.js b/packages/platform-android/src/commands/runAndroid/getAdbPath.js similarity index 100% rename from packages/cli/src/commands/runAndroid/getAdbPath.js rename to packages/platform-android/src/commands/runAndroid/getAdbPath.js diff --git a/packages/cli/src/commands/runAndroid/runAndroid.js b/packages/platform-android/src/commands/runAndroid/index.js similarity index 97% rename from packages/cli/src/commands/runAndroid/runAndroid.js rename to packages/platform-android/src/commands/runAndroid/index.js index 9fc40a551..7a338060b 100644 --- a/packages/cli/src/commands/runAndroid/runAndroid.js +++ b/packages/platform-android/src/commands/runAndroid/index.js @@ -10,13 +10,12 @@ import path from 'path'; import {spawnSync, spawn, execFileSync} from 'child_process'; import fs from 'fs'; -import isString from 'lodash/isString'; -import isPackagerRunning from '../../tools/isPackagerRunning'; -import type {ConfigT} from '../../tools/config/types.flow'; +import type {ConfigT} from '../../../../cli/src/tools/config/types.flow'; import adb from './adb'; import runOnAllDevices from './runOnAllDevices'; +import isPackagerRunning from './isPackagerRunning'; import tryRunAdbReverse from './tryRunAdbReverse'; import tryLaunchAppOnDevice from './tryLaunchAppOnDevice'; import getAdbPath from './getAdbPath'; @@ -87,7 +86,7 @@ function buildAndRun(args) { const adbPath = getAdbPath(); if (args.deviceId) { - if (isString(args.deviceId)) { + if (typeof args.deviceId === 'string') { return runOnSpecificDevice( args, cmd, diff --git a/packages/cli/src/tools/isPackagerRunning.js b/packages/platform-android/src/commands/runAndroid/isPackagerRunning.js similarity index 100% rename from packages/cli/src/tools/isPackagerRunning.js rename to packages/platform-android/src/commands/runAndroid/isPackagerRunning.js diff --git a/packages/cli/src/commands/runAndroid/runOnAllDevices.js b/packages/platform-android/src/commands/runAndroid/runOnAllDevices.js similarity index 100% rename from packages/cli/src/commands/runAndroid/runOnAllDevices.js rename to packages/platform-android/src/commands/runAndroid/runOnAllDevices.js diff --git a/packages/cli/src/commands/runAndroid/tryLaunchAppOnDevice.js b/packages/platform-android/src/commands/runAndroid/tryLaunchAppOnDevice.js similarity index 100% rename from packages/cli/src/commands/runAndroid/tryLaunchAppOnDevice.js rename to packages/platform-android/src/commands/runAndroid/tryLaunchAppOnDevice.js diff --git a/packages/cli/src/commands/runAndroid/tryRunAdbReverse.js b/packages/platform-android/src/commands/runAndroid/tryRunAdbReverse.js similarity index 100% rename from packages/cli/src/commands/runAndroid/tryRunAdbReverse.js rename to packages/platform-android/src/commands/runAndroid/tryRunAdbReverse.js diff --git a/packages/platform-android/src/index.js b/packages/platform-android/src/index.js index 88ea2ac7e..d7cabc044 100644 --- a/packages/platform-android/src/index.js +++ b/packages/platform-android/src/index.js @@ -5,4 +5,5 @@ */ export {default as linkConfig} from './link'; +export {default as commands} from './commands'; export {projectConfig, dependencyConfig} from './config'; diff --git a/packages/platform-ios/package.json b/packages/platform-ios/package.json index 7c31f0d2b..8cfa37b8f 100644 --- a/packages/platform-ios/package.json +++ b/packages/platform-ios/package.json @@ -3,6 +3,8 @@ "version": "2.0.0-alpha.5", "main": "build/index.js", "dependencies": { - "@react-native-community/cli-tools": "^2.0.0-alpha.5" + "@react-native-community/cli-tools": "^2.0.0-alpha.5", + "chalk": "^1.1.1", + "xcode": "^2.0.0" } } diff --git a/packages/platform-ios/src/commands/index.js b/packages/platform-ios/src/commands/index.js new file mode 100644 index 000000000..dc8a7abab --- /dev/null +++ b/packages/platform-ios/src/commands/index.js @@ -0,0 +1,7 @@ +/** + * @flow + */ +import logIOS from './logIOS'; +import runIOS from './runIOS'; + +export default [logIOS, runIOS]; diff --git a/packages/cli/src/commands/logIOS/logIOS.js b/packages/platform-ios/src/commands/logIOS/index.js similarity index 100% rename from packages/cli/src/commands/logIOS/logIOS.js rename to packages/platform-ios/src/commands/logIOS/index.js diff --git a/packages/cli/src/commands/runIOS/__tests__/findMatchingSimulator-test.js b/packages/platform-ios/src/commands/runIOS/__tests__/findMatchingSimulator-test.js similarity index 100% rename from packages/cli/src/commands/runIOS/__tests__/findMatchingSimulator-test.js rename to packages/platform-ios/src/commands/runIOS/__tests__/findMatchingSimulator-test.js diff --git a/packages/cli/src/commands/runIOS/__tests__/findXcodeProject-test.js b/packages/platform-ios/src/commands/runIOS/__tests__/findXcodeProject-test.js similarity index 100% rename from packages/cli/src/commands/runIOS/__tests__/findXcodeProject-test.js rename to packages/platform-ios/src/commands/runIOS/__tests__/findXcodeProject-test.js diff --git a/packages/cli/src/commands/runIOS/__tests__/parseIOSDevicesList-test.js b/packages/platform-ios/src/commands/runIOS/__tests__/parseIOSDevicesList-test.js similarity index 100% rename from packages/cli/src/commands/runIOS/__tests__/parseIOSDevicesList-test.js rename to packages/platform-ios/src/commands/runIOS/__tests__/parseIOSDevicesList-test.js diff --git a/packages/cli/src/commands/runIOS/findMatchingSimulator.js b/packages/platform-ios/src/commands/runIOS/findMatchingSimulator.js similarity index 100% rename from packages/cli/src/commands/runIOS/findMatchingSimulator.js rename to packages/platform-ios/src/commands/runIOS/findMatchingSimulator.js diff --git a/packages/cli/src/commands/runIOS/findXcodeProject.js b/packages/platform-ios/src/commands/runIOS/findXcodeProject.js similarity index 100% rename from packages/cli/src/commands/runIOS/findXcodeProject.js rename to packages/platform-ios/src/commands/runIOS/findXcodeProject.js diff --git a/packages/cli/src/commands/runIOS/runIOS.js b/packages/platform-ios/src/commands/runIOS/index.js similarity index 94% rename from packages/cli/src/commands/runIOS/runIOS.js rename to packages/platform-ios/src/commands/runIOS/index.js index 898b6697e..d5c8f2a5e 100644 --- a/packages/cli/src/commands/runIOS/runIOS.js +++ b/packages/platform-ios/src/commands/runIOS/index.js @@ -11,12 +11,13 @@ import child_process from 'child_process'; import fs from 'fs'; import path from 'path'; -import type {ConfigT} from '../../tools/config/types.flow'; + +import type {ConfigT} from '../../../../cli/src/tools/config/types.flow'; + import findXcodeProject from './findXcodeProject'; import parseIOSDevicesList from './parseIOSDevicesList'; import findMatchingSimulator from './findMatchingSimulator'; -import {ProcessError} from '../../tools/errors'; -import {logger} from '@react-native-community/cli-tools'; +import {logger, CLIError} from '@react-native-community/cli-tools'; type FlagsT = { simulator: string, @@ -32,7 +33,7 @@ type FlagsT = { function runIOS(_: Array, ctx: ConfigT, args: FlagsT) { if (!fs.existsSync(args.projectPath)) { - throw new Error( + throw new CLIError( 'iOS project folder not found. Are you sure this is a React Native project?', ); } @@ -41,7 +42,7 @@ function runIOS(_: Array, ctx: ConfigT, args: FlagsT) { const xcodeProject = findXcodeProject(fs.readdirSync('.')); if (!xcodeProject) { - throw new Error( + throw new CLIError( `Could not find Xcode project files in "${args.projectPath}" folder`, ); } @@ -135,12 +136,12 @@ async function runOnSimulator(xcodeProject, args, scheme) { ), ); } catch (e) { - throw new Error('Could not parse the simulator list output'); + throw new CLIError('Could not parse the simulator list output'); } const selectedSimulator = findMatchingSimulator(simulators, args.simulator); if (!selectedSimulator) { - throw new Error(`Could not find ${args.simulator} simulator`); + throw new CLIError(`Could not find ${args.simulator} simulator`); } /** @@ -311,14 +312,14 @@ function buildProject( } if (code !== 0) { reject( - new ProcessError( - [ - 'Failed to build iOS project.', - `We ran "xcodebuild" command but it exited with error code ${code}.`, - `To debug build logs further, consider building your app with Xcode.app, by opening ${ - xcodeProject.name - }`, - ].join(' '), + new CLIError( + ` + Failed to build iOS project. + + We ran "xcodebuild" command but it exited with error code ${code}. To debug build + logs further, consider building your app with Xcode.app, by opening + ${xcodeProject.name}. + `, errorOutput, ), ); diff --git a/packages/cli/src/commands/runIOS/parseIOSDevicesList.js b/packages/platform-ios/src/commands/runIOS/parseIOSDevicesList.js similarity index 100% rename from packages/cli/src/commands/runIOS/parseIOSDevicesList.js rename to packages/platform-ios/src/commands/runIOS/parseIOSDevicesList.js diff --git a/packages/platform-ios/src/index.js b/packages/platform-ios/src/index.js index b0da4421c..40e87c381 100644 --- a/packages/platform-ios/src/index.js +++ b/packages/platform-ios/src/index.js @@ -5,4 +5,5 @@ */ export {default as linkConfig} from './link'; +export {default as commands} from './commands'; export {projectConfig, dependencyConfig} from './config'; diff --git a/packages/tools/src/errors.js b/packages/tools/src/errors.js new file mode 100644 index 000000000..0fdfbe82e --- /dev/null +++ b/packages/tools/src/errors.js @@ -0,0 +1,27 @@ +/** + * @flow + */ + +/** + * CLIError + * + * Features: + * - uses original stack trace when error object is passed + * - makes an inline string to match current styling inside CLI + */ +export class CLIError extends Error { + constructor(msg: string, originError?: Error | string) { + super(msg.replace(/(\s{2,})/gm, ' ').trim()); + if (originError) { + this.stack = + typeof originError === 'string' + ? originError + : originError.stack + .split('\n') + .slice(0, 2) + .join('\n'); + } else { + Error.captureStackTrace(this, CLIError); + } + } +} diff --git a/packages/tools/src/index.js b/packages/tools/src/index.js index 8568bba7e..d35508f2d 100644 --- a/packages/tools/src/index.js +++ b/packages/tools/src/index.js @@ -3,3 +3,5 @@ */ export {default as logger} from './logger'; export {default as groupFilesByType} from './groupFilesByType'; + +export * from './errors';