diff --git a/__e2e__/__snapshots__/default.test.ts.snap b/__e2e__/__snapshots__/default.test.ts.snap index e93e1d88c..e72e6c249 100644 --- a/__e2e__/__snapshots__/default.test.ts.snap +++ b/__e2e__/__snapshots__/default.test.ts.snap @@ -10,5 +10,5 @@ Options: Commands: init [options] Initialize a new React Native project named in a directory of the same name. - doctor [options] [EXPERIMENTAL] Diagnose and fix common Node.js, iOS, Android & React Native issues." + doctor [options] Diagnose and fix common Node.js, iOS, Android & React Native issues." `; diff --git a/jest/setupUnitTests.js b/jest/setupUnitTests.js index 074e38aa0..6614a458b 100644 --- a/jest/setupUnitTests.js +++ b/jest/setupUnitTests.js @@ -14,5 +14,4 @@ jest.mock('@react-native-community/cli-tools', () => { }, }; }); - jest.setTimeout(20000); diff --git a/packages/cli-config/package.json b/packages/cli-config/package.json new file mode 100644 index 000000000..ecca1884b --- /dev/null +++ b/packages/cli-config/package.json @@ -0,0 +1,33 @@ +{ + "name": "@react-native-community/cli-config", + "version": "6.0.1", + "license": "MIT", + "main": "build/index.js", + "publishConfig": { + "access": "public" + }, + "types": "build/index.d.ts", + "dependencies": { + "cosmiconfig": "^5.1.0", + "deepmerge": "^3.2.0", + "@react-native-community/cli-tools": "^6.2.0", + "joi": "^17.2.1", + "glob": "^7.1.3" + }, + "files": [ + "build", + "!*.d.ts", + "!*.map" + ], + "devDependencies": { + "@types/cosmiconfig": "^5.0.3", + "@react-native-community/cli-types": "^6.0.0", + "@types/glob": "^7.1.1" + }, + "homepage": "https://github.com/react-native-community/cli/tree/master/packages/cli-config", + "repository": { + "type": "git", + "url": "https://github.com/react-native-community/cli.git", + "directory": "packages/cli-config" + } +} diff --git a/packages/cli/src/tools/config/__tests__/__snapshots__/index-test.ts.snap b/packages/cli-config/src/__tests__/__snapshots__/index-test.ts.snap similarity index 97% rename from packages/cli/src/tools/config/__tests__/__snapshots__/index-test.ts.snap rename to packages/cli-config/src/__tests__/__snapshots__/index-test.ts.snap index 5a393bfdc..4b11e87ce 100644 --- a/packages/cli/src/tools/config/__tests__/__snapshots__/index-test.ts.snap +++ b/packages/cli-config/src/__tests__/__snapshots__/index-test.ts.snap @@ -153,7 +153,7 @@ Object { exports[`should skip packages that have invalid configuration: dependencies config 1`] = `Object {}`; -exports[`should skip packages that have invalid configuration: logged warning 1`] = `"Package react-native has been ignored because it contains invalid configuration. Reason: \\"dependency.invalidProperty\\" is not allowed"`; +exports[`should skip packages that have invalid configuration: logged warning 1`] = `"warn Package react-native has been ignored because it contains invalid configuration. Reason: \\"dependency.invalidProperty\\" is not allowed"`; exports[`supports dependencies from user configuration with custom build type 1`] = ` Object { diff --git a/packages/cli/src/tools/config/__tests__/findAssets-test.ts b/packages/cli-config/src/__tests__/findAssets-test.ts similarity index 100% rename from packages/cli/src/tools/config/__tests__/findAssets-test.ts rename to packages/cli-config/src/__tests__/findAssets-test.ts diff --git a/packages/cli/src/tools/config/__tests__/findDependencies-test.ts b/packages/cli-config/src/__tests__/findDependencies-test.ts similarity index 84% rename from packages/cli/src/tools/config/__tests__/findDependencies-test.ts rename to packages/cli-config/src/__tests__/findDependencies-test.ts index 084ee49d7..90a366faf 100644 --- a/packages/cli/src/tools/config/__tests__/findDependencies-test.ts +++ b/packages/cli-config/src/__tests__/findDependencies-test.ts @@ -1,9 +1,5 @@ import findDependencies from '../findDependencies'; -import { - cleanup, - writeFiles, - getTempDirectory, -} from '../../../../../../jest/helpers'; +import {cleanup, writeFiles, getTempDirectory} from '../../../../jest/helpers'; beforeEach(async () => { await cleanup(DIR); diff --git a/packages/cli/src/tools/config/__tests__/index-test.ts b/packages/cli-config/src/__tests__/index-test.ts similarity index 94% rename from packages/cli/src/tools/config/__tests__/index-test.ts rename to packages/cli-config/src/__tests__/index-test.ts index f21f475c1..b1100fdaf 100644 --- a/packages/cli/src/tools/config/__tests__/index-test.ts +++ b/packages/cli-config/src/__tests__/index-test.ts @@ -1,17 +1,14 @@ import path from 'path'; import slash from 'slash'; import loadConfig from '..'; -import {logger} from '@react-native-community/cli-tools'; -import { - cleanup, - writeFiles, - getTempDirectory, -} from '../../../../../../jest/helpers'; - -jest.mock('../resolveNodeModuleDir'); +import {cleanup, writeFiles, getTempDirectory} from '../../../../jest/helpers'; let DIR = getTempDirectory('config_test'); +jest.dontMock('@react-native-community/cli-tools'); + +const spy = jest.spyOn(global.console, 'warn').mockImplementation(jest.fn()); + const iosPath = slash( require.resolve('@react-native-community/cli-platform-ios'), ); @@ -45,8 +42,11 @@ const REACT_NATIVE_MOCK = { const removeString = (config, str) => JSON.parse( JSON.stringify(config, (_key, value) => + // In certain cases, `str` (which is a temporary location) will be `/tmp` + // which is a symlink to `/private/tmp` on OS X. In this case, tests will fail. + // Following RegExp makes sure we strip the entire path. typeof value === 'string' - ? slash(value.replace(str, '<>')) + ? slash(value.replace(new RegExp(`(.*)${str}`), '<>')) : value, ), ); @@ -202,7 +202,6 @@ test('should skip packages that have invalid configuration', () => { } }`, }); - const spy = jest.spyOn(logger, 'warn'); const {dependencies} = loadConfig(DIR); expect(dependencies).toMatchSnapshot('dependencies config'); expect(spy.mock.calls[0][0]).toMatchSnapshot('logged warning'); @@ -220,7 +219,6 @@ test('does not use restricted "react-native" key to resolve config from package. } }`, }); - const spy = jest.spyOn(logger, 'warn'); const {dependencies} = loadConfig(DIR); expect(dependencies).toHaveProperty('react-native-netinfo'); expect(spy).not.toHaveBeenCalled(); diff --git a/packages/cli/src/tools/assign.ts b/packages/cli-config/src/assign.ts similarity index 100% rename from packages/cli/src/tools/assign.ts rename to packages/cli-config/src/assign.ts diff --git a/packages/cli/src/tools/config/errors.ts b/packages/cli-config/src/errors.ts similarity index 100% rename from packages/cli/src/tools/config/errors.ts rename to packages/cli-config/src/errors.ts diff --git a/packages/cli/src/tools/config/findAssets.ts b/packages/cli-config/src/findAssets.ts similarity index 100% rename from packages/cli/src/tools/config/findAssets.ts rename to packages/cli-config/src/findAssets.ts diff --git a/packages/cli/src/tools/config/findDependencies.ts b/packages/cli-config/src/findDependencies.ts similarity index 100% rename from packages/cli/src/tools/config/findDependencies.ts rename to packages/cli-config/src/findDependencies.ts diff --git a/packages/cli/src/tools/config/index.ts b/packages/cli-config/src/index.ts similarity index 94% rename from packages/cli/src/tools/config/index.ts rename to packages/cli-config/src/index.ts index 7f427a44a..24e5c8887 100644 --- a/packages/cli/src/tools/config/index.ts +++ b/packages/cli-config/src/index.ts @@ -7,18 +7,21 @@ import { UserConfig, Config, } from '@react-native-community/cli-types'; -import {logger, inlineString} from '@react-native-community/cli-tools'; +import { + logger, + inlineString, + findProjectRoot, + resolveNodeModuleDir, +} from '@react-native-community/cli-tools'; import findDependencies from './findDependencies'; -import findProjectRoot from './findProjectRoot'; import resolveReactNativePath from './resolveReactNativePath'; import findAssets from './findAssets'; import { readConfigFromDisk, readDependencyConfigFromDisk, } from './readConfigFromDisk'; -import assign from '../assign'; -import merge from '../merge'; -import resolveNodeModuleDir from './resolveNodeModuleDir'; +import assign from './assign'; +import merge from './merge'; function getDependencyConfig( root: string, diff --git a/packages/cli/src/tools/merge.ts b/packages/cli-config/src/merge.ts similarity index 100% rename from packages/cli/src/tools/merge.ts rename to packages/cli-config/src/merge.ts diff --git a/packages/cli/src/tools/config/readConfigFromDisk.ts b/packages/cli-config/src/readConfigFromDisk.ts similarity index 100% rename from packages/cli/src/tools/config/readConfigFromDisk.ts rename to packages/cli-config/src/readConfigFromDisk.ts diff --git a/packages/cli/src/tools/config/resolveReactNativePath.ts b/packages/cli-config/src/resolveReactNativePath.ts similarity index 83% rename from packages/cli/src/tools/config/resolveReactNativePath.ts rename to packages/cli-config/src/resolveReactNativePath.ts index 014ee0804..a3b8403b7 100644 --- a/packages/cli/src/tools/config/resolveReactNativePath.ts +++ b/packages/cli-config/src/resolveReactNativePath.ts @@ -1,6 +1,7 @@ -import {CLIError} from '@react-native-community/cli-tools'; - -import resolveNodeModuleDir from './resolveNodeModuleDir'; +import { + CLIError, + resolveNodeModuleDir, +} from '@react-native-community/cli-tools'; /** * Finds path to React Native inside `node_modules` or throws diff --git a/packages/cli/src/tools/config/schema.ts b/packages/cli-config/src/schema.ts similarity index 100% rename from packages/cli/src/tools/config/schema.ts rename to packages/cli-config/src/schema.ts diff --git a/packages/cli-config/tsconfig.json b/packages/cli-config/tsconfig.json new file mode 100644 index 000000000..1ec7ea396 --- /dev/null +++ b/packages/cli-config/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build" + }, + "references": [{"path": "../tools"}, {"path": "../cli-types"}] +} diff --git a/packages/cli-doctor/package.json b/packages/cli-doctor/package.json new file mode 100644 index 000000000..050fcecbc --- /dev/null +++ b/packages/cli-doctor/package.json @@ -0,0 +1,46 @@ +{ + "name": "@react-native-community/cli-doctor", + "version": "6.0.1", + "license": "MIT", + "main": "build/index.js", + "publishConfig": { + "access": "public" + }, + "types": "build/index.d.ts", + "dependencies": { + "@react-native-community/cli-tools": "^6.2.0", + "@react-native-community/cli-config": "^6.0.1", + "chalk": "^3.0.0", + "envinfo": "^7.7.2", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5", + "node-stream-zip": "^1.9.1", + "command-exists": "^1.2.8", + "prompts": "^2.4.0", + "semver": "^6.3.0", + "strip-ansi": "^5.2.0", + "ora": "^5.4.1", + "execa": "^1.0.0", + "wcwidth": "^1.0.1", + "sudo-prompt": "^9.0.0" + }, + "files": [ + "build", + "!*.d.ts", + "!*.map" + ], + "devDependencies": { + "@types/command-exists": "^1.2.0", + "@react-native-community/cli-types": "^6.0.0", + "@types/ip": "^1.1.0", + "@types/semver": "^6.0.2", + "@types/wcwidth": "^1.0.0", + "@types/prompts": "^2.0.9" + }, + "homepage": "https://github.com/react-native-community/cli/tree/master/packages/cli-doctor", + "repository": { + "type": "git", + "url": "https://github.com/react-native-community/cli.git", + "directory": "packages/cli-doctor" + } +} diff --git a/packages/cli/src/commands/info/__tests__/info.test.ts b/packages/cli-doctor/src/commands/__tests__/info.test.ts similarity index 86% rename from packages/cli/src/commands/info/__tests__/info.test.ts rename to packages/cli-doctor/src/commands/__tests__/info.test.ts index 28ba358b0..03ac69083 100644 --- a/packages/cli/src/commands/info/__tests__/info.test.ts +++ b/packages/cli-doctor/src/commands/__tests__/info.test.ts @@ -1,8 +1,8 @@ import info from '../info'; import {logger} from '@react-native-community/cli-tools'; -import loadConfig from '../../../tools/config'; +import loadConfig from '@react-native-community/cli-config'; -jest.mock('../../../tools/config'); +jest.mock('@react-native-community/cli-config'); beforeEach(() => { jest.resetAllMocks(); diff --git a/packages/cli/src/commands/doctor/doctor.ts b/packages/cli-doctor/src/commands/doctor.ts similarity index 85% rename from packages/cli/src/commands/doctor/doctor.ts rename to packages/cli-doctor/src/commands/doctor.ts index 3df151937..91d17e757 100644 --- a/packages/cli/src/commands/doctor/doctor.ts +++ b/packages/cli-doctor/src/commands/doctor.ts @@ -1,17 +1,17 @@ import chalk from 'chalk'; -import {logger} from '@react-native-community/cli-tools'; -import {getHealthchecks, HEALTHCHECK_TYPES} from './healthchecks'; -import {getLoader} from '../../tools/loader'; -import printFixOptions, {KEYS} from './printFixOptions'; -import runAutomaticFix, {AUTOMATIC_FIX_LEVELS} from './runAutomaticFix'; +import {logger, getLoader} from '@react-native-community/cli-tools'; +import {getHealthchecks, HEALTHCHECK_TYPES} from '../tools/healthchecks'; +import printFixOptions, {KEYS} from '../tools/printFixOptions'; +import runAutomaticFix, {AUTOMATIC_FIX_LEVELS} from '../tools/runAutomaticFix'; +import {DetachedCommandFunction} from '@react-native-community/cli-types'; import { - DetachedCommandFunction, - HealthCheckCategory, + HealthCheckCategoryResult, HealthCheckInterface, -} from '@react-native-community/cli-types'; -import {HealthCheckCategoryResult, HealthCheckResult} from './types'; -import getEnvironmentInfo from '../../tools/envinfo'; -import {logMessage} from './healthchecks/common'; + HealthCheckCategory, + HealthCheckResult, +} from '../types'; +import getEnvironmentInfo from '../tools/envinfo'; +import {logMessage} from '../tools/healthchecks/common'; const printCategory = ({label, key}: {label: string; key: number}) => { if (key > 0) { @@ -109,9 +109,8 @@ const getAutomaticFixForPlatform = ( } }; -export default (async (_, options) => { - const Loader = getLoader(); - const loader = new Loader(); +const doctorCommand = (async (_, options) => { + const loader = getLoader(); loader.start('Running diagnostics...'); @@ -264,3 +263,22 @@ export default (async (_, options) => { printFixOptions({onKeyPress}); } }) as DetachedCommandFunction; + +export default { + func: doctorCommand, + detached: true, + name: 'doctor', + description: + 'Diagnose and fix common Node.js, iOS, Android & React Native issues.', + options: [ + { + name: '--fix', + description: 'Attempt to fix all diagnosed issues.', + }, + { + name: '--contributor', + description: + 'Add healthchecks required to installations required for contributing to React Native.', + }, + ], +}; diff --git a/packages/cli/src/commands/info/info.ts b/packages/cli-doctor/src/commands/info.ts similarity index 93% rename from packages/cli/src/commands/info/info.ts rename to packages/cli-doctor/src/commands/info.ts index b2999fca3..f9a24e627 100644 --- a/packages/cli/src/commands/info/info.ts +++ b/packages/cli-doctor/src/commands/info.ts @@ -6,7 +6,7 @@ */ // @ts-ignore untyped -import getEnvironmentInfo from '../../tools/envinfo'; +import getEnvironmentInfo from '../tools/envinfo'; import {logger, releaseChecker} from '@react-native-community/cli-tools'; import {Config} from '@react-native-community/cli-types'; diff --git a/packages/cli-doctor/src/index.ts b/packages/cli-doctor/src/index.ts new file mode 100644 index 000000000..c15fcc4e5 --- /dev/null +++ b/packages/cli-doctor/src/index.ts @@ -0,0 +1,11 @@ +import doctor from './commands/doctor'; +import info from './commands/info'; + +export const commands = {info, doctor}; + +/** + * @todo + * We should not rely on this file from other packages, e.g. CLI. We probably need to + * refactor the init in order to remove that connection. + */ +export {default as installPods} from './tools/installPods'; diff --git a/packages/cli/src/tools/brewInstall.ts b/packages/cli-doctor/src/tools/brewInstall.ts similarity index 85% rename from packages/cli/src/tools/brewInstall.ts rename to packages/cli-doctor/src/tools/brewInstall.ts index 09987f817..7cc471d33 100644 --- a/packages/cli/src/tools/brewInstall.ts +++ b/packages/cli-doctor/src/tools/brewInstall.ts @@ -1,11 +1,11 @@ import execa from 'execa'; -import type {Ora} from 'ora'; -import {logError} from '../commands/doctor/healthchecks/common'; +import {Loader} from '../types'; +import {logError} from './healthchecks/common'; type InstallArgs = { pkg: string; label?: string; - loader: Ora; + loader: Loader; onSuccess?: () => void; onFail?: () => void; }; diff --git a/packages/cli/src/commands/doctor/checkInstallation.ts b/packages/cli-doctor/src/tools/checkInstallation.ts similarity index 100% rename from packages/cli/src/commands/doctor/checkInstallation.ts rename to packages/cli-doctor/src/tools/checkInstallation.ts diff --git a/packages/cli/src/tools/deleteFile.ts b/packages/cli-doctor/src/tools/deleteFile.ts similarity index 100% rename from packages/cli/src/tools/deleteFile.ts rename to packages/cli-doctor/src/tools/deleteFile.ts diff --git a/packages/cli/src/tools/downloadAndUnzip.ts b/packages/cli-doctor/src/tools/downloadAndUnzip.ts similarity index 93% rename from packages/cli/src/tools/downloadAndUnzip.ts rename to packages/cli-doctor/src/tools/downloadAndUnzip.ts index 874091d76..bd4ae20f3 100644 --- a/packages/cli/src/tools/downloadAndUnzip.ts +++ b/packages/cli-doctor/src/tools/downloadAndUnzip.ts @@ -1,6 +1,5 @@ import {fetchToTemp} from '@react-native-community/cli-tools'; - -import * as ora from 'ora'; +import {Loader} from '../types'; import {unzip} from './unzip'; import {deleteFile} from './deleteFile'; @@ -14,7 +13,7 @@ export const downloadAndUnzip = async ({ component, installPath, }: { - loader: ora.Ora; + loader: Loader; component: string; downloadUrl: string; installPath: string; diff --git a/packages/cli/src/tools/envinfo.ts b/packages/cli-doctor/src/tools/envinfo.ts similarity index 95% rename from packages/cli/src/tools/envinfo.ts rename to packages/cli-doctor/src/tools/envinfo.ts index 1d7428dc5..b26a2710a 100644 --- a/packages/cli/src/tools/envinfo.ts +++ b/packages/cli-doctor/src/tools/envinfo.ts @@ -1,7 +1,7 @@ // @ts-ignore import envinfo from 'envinfo'; -import {EnvironmentInfo} from '@react-native-community/cli-types'; import {platform} from 'os'; +import {EnvironmentInfo} from '../types'; /** * Returns information about the running system. diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts b/packages/cli-doctor/src/tools/healthchecks/__tests__/androidHomeEnvVariable.test.ts similarity index 91% rename from packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts rename to packages/cli-doctor/src/tools/healthchecks/__tests__/androidHomeEnvVariable.test.ts index d526c44b5..9f0dc22b1 100644 --- a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidHomeEnvVariable.test.ts +++ b/packages/cli-doctor/src/tools/healthchecks/__tests__/androidHomeEnvVariable.test.ts @@ -1,6 +1,6 @@ import androidHomeEnvVariables from '../androidHomeEnvVariable'; -import {NoopLoader} from '../../../../tools/loader'; -import {EnvironmentInfo} from '@react-native-community/cli-types'; +import {NoopLoader} from '@react-native-community/cli-tools'; +import {EnvironmentInfo} from '../../../types'; import * as common from '../common'; diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidNDK.test.ts b/packages/cli-doctor/src/tools/healthchecks/__tests__/androidNDK.test.ts similarity index 80% rename from packages/cli/src/commands/doctor/healthchecks/__tests__/androidNDK.test.ts rename to packages/cli-doctor/src/tools/healthchecks/__tests__/androidNDK.test.ts index 756f419aa..f8add4a5b 100644 --- a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidNDK.test.ts +++ b/packages/cli-doctor/src/tools/healthchecks/__tests__/androidNDK.test.ts @@ -1,7 +1,7 @@ import androidNDK from '../androidNDK'; -import getEnvironmentInfo from '../../../../tools/envinfo'; -import {EnvironmentInfo} from '@react-native-community/cli-types'; -import {NoopLoader} from '../../../../tools/loader'; +import getEnvironmentInfo from '../../envinfo'; +import {EnvironmentInfo} from '../../../types'; +import {NoopLoader} from '@react-native-community/cli-tools'; import * as common from '../common'; @@ -19,12 +19,6 @@ describe('androidNDK', () => { jest.resetAllMocks(); }); - it('returns a message if the Android SDK is not installed', async () => { - environmentInfo.SDKs['Android SDK'] = 'Not Found'; - const diagnostics = await androidNDK.getDiagnostics(environmentInfo); - expect(diagnostics.needsToBeFixed).toBe(true); - }); - it('returns a message if the Android NDK is not installed', async () => { // To avoid having to provide fake versions for all the Android SDK tools // @ts-ignore diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidSDK.test.ts b/packages/cli-doctor/src/tools/healthchecks/__tests__/androidSDK.test.ts similarity index 88% rename from packages/cli/src/commands/doctor/healthchecks/__tests__/androidSDK.test.ts rename to packages/cli-doctor/src/tools/healthchecks/__tests__/androidSDK.test.ts index 1af9dbd2a..4f6994e16 100644 --- a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidSDK.test.ts +++ b/packages/cli-doctor/src/tools/healthchecks/__tests__/androidSDK.test.ts @@ -1,15 +1,15 @@ import * as os from 'os'; import {join} from 'path'; import execa from 'execa'; -import {cleanup, writeFiles} from '../../../../../../../jest/helpers'; +import {cleanup, writeFiles} from '../../../../../../jest/helpers'; import androidSDK from '../androidSDK'; -import getEnvironmentInfo from '../../../../tools/envinfo'; -import * as downloadAndUnzip from '../../../../tools/downloadAndUnzip'; -import {EnvironmentInfo} from '@react-native-community/cli-types'; -import {NoopLoader} from '../../../../tools/loader'; +import getEnvironmentInfo from '../../envinfo'; +import * as downloadAndUnzip from '../../downloadAndUnzip'; +import {EnvironmentInfo} from '../../../types'; +import * as tools from '@react-native-community/cli-tools'; import * as common from '../common'; -import * as androidWinHelpers from '../../../../tools/windows/androidWinHelpers'; -import * as environmentVariables from '../../../../tools/windows/environmentVariables'; +import * as androidWinHelpers from '../../windows/androidWinHelpers'; +import * as environmentVariables from '../../windows/environmentVariables'; const logSpy = jest.spyOn(common, 'logManualInstallation'); const {logManualInstallation} = common; @@ -19,9 +19,10 @@ jest.mock('execa', () => jest.fn()); let mockWorkingDir = ''; // TODO remove when androidSDK starts getting gradle.build path from config -jest.mock('../../../../tools/config/findProjectRoot', () => () => { - return mockWorkingDir; -}); +jest.mock('@react-native-community/cli-tools', () => ({ + ...jest.requireActual('@react-native-community/cli-tools'), + findProjectRoot: () => mockWorkingDir, +})); describe('androidSDK', () => { beforeEach(() => { @@ -90,7 +91,7 @@ describe('androidSDK', () => { }); it('logs manual installation steps to the screen for the default fix', () => { - const loader = new NoopLoader(); + const loader = new tools.NoopLoader(); androidSDK.runAutomaticFix({ loader, logManualInstallation, @@ -100,7 +101,7 @@ describe('androidSDK', () => { }); it('installs the SDK if it is missing on Windows', async () => { - const loader = new NoopLoader(); + const loader = new tools.NoopLoader(); const loaderSucceedSpy = jest.spyOn(loader, 'succeed'); const loaderFailSpy = jest.spyOn(loader, 'fail'); const downloadAndUnzipSpy = jest diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidStudio.test.ts b/packages/cli-doctor/src/tools/healthchecks/__tests__/androidStudio.test.ts similarity index 89% rename from packages/cli/src/commands/doctor/healthchecks/__tests__/androidStudio.test.ts rename to packages/cli-doctor/src/tools/healthchecks/__tests__/androidStudio.test.ts index 59665b0ac..96796318b 100644 --- a/packages/cli/src/commands/doctor/healthchecks/__tests__/androidStudio.test.ts +++ b/packages/cli-doctor/src/tools/healthchecks/__tests__/androidStudio.test.ts @@ -1,10 +1,10 @@ import execa from 'execa'; import androidStudio from '../androidStudio'; -import getEnvironmentInfo from '../../../../tools/envinfo'; -import {EnvironmentInfo} from '@react-native-community/cli-types'; -import {NoopLoader} from '../../../../tools/loader'; +import getEnvironmentInfo from '../../envinfo'; +import {EnvironmentInfo} from '../../../types'; +import {NoopLoader} from '@react-native-community/cli-tools'; import * as common from '../common'; -import * as downloadAndUnzip from '../../../../tools/downloadAndUnzip'; +import * as downloadAndUnzip from '../../downloadAndUnzip'; jest.mock('execa', () => jest.fn()); diff --git a/packages/cli/src/commands/doctor/healthchecks/__tests__/jdk.test.ts b/packages/cli-doctor/src/tools/healthchecks/__tests__/jdk.test.ts similarity index 83% rename from packages/cli/src/commands/doctor/healthchecks/__tests__/jdk.test.ts rename to packages/cli-doctor/src/tools/healthchecks/__tests__/jdk.test.ts index 6748dc344..fab3cf43f 100644 --- a/packages/cli/src/commands/doctor/healthchecks/__tests__/jdk.test.ts +++ b/packages/cli-doctor/src/tools/healthchecks/__tests__/jdk.test.ts @@ -1,23 +1,18 @@ import execa from 'execa'; import jdk from '../jdk'; -import getEnvironmentInfo from '../../../../tools/envinfo'; -import {EnvironmentInfo} from '@react-native-community/cli-types'; -import {NoopLoader} from '../../../../tools/loader'; +import getEnvironmentInfo from '../../envinfo'; +import {EnvironmentInfo} from '../../../types'; +import * as tools from '@react-native-community/cli-tools'; import * as common from '../common'; -import * as unzip from '../../../../tools/unzip'; -import * as deleteFile from '../../../../tools/deleteFile'; +import * as unzip from '../../unzip'; +import * as deleteFile from '../../deleteFile'; jest.mock('execa', () => jest.fn()); jest .spyOn(deleteFile, 'deleteFile') .mockImplementation(() => Promise.resolve()); -const mockFetchToTemp = jest.fn(); -jest.mock('@react-native-community/cli-tools', () => { - return { - fetchToTemp: mockFetchToTemp, - }; -}); +jest.spyOn(tools, 'fetchToTemp').mockImplementation(jest.fn()); const logSpy = jest.spyOn(common, 'logManualInstallation'); const {logManualInstallation} = common; @@ -71,13 +66,13 @@ describe('jdk', () => { }); it('logs manual installation steps to the screen for the default fix', async () => { - const loader = new NoopLoader(); + const loader = new tools.NoopLoader(); await jdk.runAutomaticFix({loader, logManualInstallation, environmentInfo}); expect(logSpy).toHaveBeenCalledTimes(1); }); it('downloads and unzips JDK on Windows when missing', async () => { - const loader = new NoopLoader(); + const loader = new tools.NoopLoader(); const loaderSucceedSpy = jest.spyOn(loader, 'succeed'); const loaderFailSpy = jest.spyOn(loader, 'fail'); const unzipSpy = jest diff --git a/packages/cli/src/commands/doctor/healthchecks/androidHomeEnvVariable.ts b/packages/cli-doctor/src/tools/healthchecks/androidHomeEnvVariable.ts similarity index 93% rename from packages/cli/src/commands/doctor/healthchecks/androidHomeEnvVariable.ts rename to packages/cli-doctor/src/tools/healthchecks/androidHomeEnvVariable.ts index 8ea5d5cb5..198409d3a 100644 --- a/packages/cli/src/commands/doctor/healthchecks/androidHomeEnvVariable.ts +++ b/packages/cli-doctor/src/tools/healthchecks/androidHomeEnvVariable.ts @@ -1,5 +1,5 @@ import chalk from 'chalk'; -import {HealthCheckInterface} from '@react-native-community/cli-types'; +import {HealthCheckInterface} from '../../types'; // List of answers on how to set `ANDROID_HOME` for each platform const URLS = { diff --git a/packages/cli/src/commands/doctor/healthchecks/androidNDK.ts b/packages/cli-doctor/src/tools/healthchecks/androidNDK.ts similarity index 93% rename from packages/cli/src/commands/doctor/healthchecks/androidNDK.ts rename to packages/cli-doctor/src/tools/healthchecks/androidNDK.ts index ce236f268..b3809bc4a 100644 --- a/packages/cli/src/commands/doctor/healthchecks/androidNDK.ts +++ b/packages/cli-doctor/src/tools/healthchecks/androidNDK.ts @@ -1,10 +1,7 @@ import chalk from 'chalk'; import versionRanges from '../versionRanges'; import {doesSoftwareNeedToBeFixed} from '../checkInstallation'; -import { - EnvironmentInfo, - HealthCheckInterface, -} from '@react-native-community/cli-types'; +import {EnvironmentInfo, HealthCheckInterface} from '../../types'; export default { label: 'Android NDK', diff --git a/packages/cli/src/commands/doctor/healthchecks/androidSDK.ts b/packages/cli-doctor/src/tools/healthchecks/androidSDK.ts similarity index 93% rename from packages/cli/src/commands/doctor/healthchecks/androidSDK.ts rename to packages/cli-doctor/src/tools/healthchecks/androidSDK.ts index c5d3035c1..4d15a2996 100644 --- a/packages/cli/src/commands/doctor/healthchecks/androidSDK.ts +++ b/packages/cli-doctor/src/tools/healthchecks/androidSDK.ts @@ -1,13 +1,8 @@ import chalk from 'chalk'; import fs from 'fs'; import path from 'path'; -import {logger} from '@react-native-community/cli-tools'; - -import { - HealthCheckInterface, - EnvironmentInfo, -} from '@react-native-community/cli-types'; -import findProjectRoot from '../../../tools/config/findProjectRoot'; +import {logger, findProjectRoot} from '@react-native-community/cli-tools'; +import {HealthCheckInterface, EnvironmentInfo} from '../../types'; import { getAndroidSdkRootInstallation, installComponent, @@ -16,13 +11,12 @@ import { enableHAXM, enableWHPX, createAVD, -} from '../../../tools/windows/androidWinHelpers'; -import {downloadAndUnzip} from '../../../tools/downloadAndUnzip'; - +} from '../windows/androidWinHelpers'; +import {downloadAndUnzip} from '../downloadAndUnzip'; import { setEnvironment, updateEnvironment, -} from '../../../tools/windows/environmentVariables'; +} from '../windows/environmentVariables'; const getBuildToolsVersion = (): string => { let projectRoot = ''; diff --git a/packages/cli/src/commands/doctor/healthchecks/androidStudio.ts b/packages/cli-doctor/src/tools/healthchecks/androidStudio.ts similarity index 85% rename from packages/cli/src/commands/doctor/healthchecks/androidStudio.ts rename to packages/cli-doctor/src/tools/healthchecks/androidStudio.ts index 8c22ec59e..9c194b4fa 100644 --- a/packages/cli/src/commands/doctor/healthchecks/androidStudio.ts +++ b/packages/cli-doctor/src/tools/healthchecks/androidStudio.ts @@ -1,11 +1,11 @@ import {join} from 'path'; -import {HealthCheckInterface} from '@react-native-community/cli-types'; +import {HealthCheckInterface} from '../../types'; -import {downloadAndUnzip} from '../../../tools/downloadAndUnzip'; -import {executeCommand} from '../../../tools/windows/executeWinCommand'; -import {getUserAndroidPath} from '../../../tools/windows/androidWinHelpers'; -import {createShortcut} from '../../../tools/windows/create-shortcut'; +import {downloadAndUnzip} from '../downloadAndUnzip'; +import {executeCommand} from '../windows/executeWinCommand'; +import {getUserAndroidPath} from '../windows/androidWinHelpers'; +import {createShortcut} from '../windows/create-shortcut'; export default { label: 'Android Studio', diff --git a/packages/cli/src/commands/doctor/healthchecks/cocoaPods.ts b/packages/cli-doctor/src/tools/healthchecks/cocoaPods.ts similarity index 90% rename from packages/cli/src/commands/doctor/healthchecks/cocoaPods.ts rename to packages/cli-doctor/src/tools/healthchecks/cocoaPods.ts index a34ee9c13..850203459 100644 --- a/packages/cli/src/commands/doctor/healthchecks/cocoaPods.ts +++ b/packages/cli-doctor/src/tools/healthchecks/cocoaPods.ts @@ -1,12 +1,9 @@ import execa from 'execa'; import {isSoftwareNotInstalled} from '../checkInstallation'; -import { - promptCocoaPodsInstallationQuestion, - runSudo, -} from '../../../tools/installPods'; +import {promptCocoaPodsInstallationQuestion, runSudo} from '../installPods'; import {removeMessage, logError} from './common'; -import {brewInstall} from '../../../tools/brewInstall'; -import {HealthCheckInterface} from '@react-native-community/cli-types'; +import {brewInstall} from '../brewInstall'; +import {HealthCheckInterface} from '../../types'; const label = 'CocoaPods'; diff --git a/packages/cli/src/commands/doctor/healthchecks/common.ts b/packages/cli-doctor/src/tools/healthchecks/common.ts similarity index 97% rename from packages/cli/src/commands/doctor/healthchecks/common.ts rename to packages/cli-doctor/src/tools/healthchecks/common.ts index bec3c9bd2..af71f5044 100644 --- a/packages/cli/src/commands/doctor/healthchecks/common.ts +++ b/packages/cli-doctor/src/tools/healthchecks/common.ts @@ -2,8 +2,8 @@ import chalk from 'chalk'; import readline from 'readline'; import wcwidth from 'wcwidth'; import stripAnsi from 'strip-ansi'; -import type {Ora} from 'ora'; import {logger} from '@react-native-community/cli-tools'; +import {Loader} from '../../types'; // Space is necessary to keep correct ordering on screen const logMessage = (message?: string) => { @@ -62,7 +62,7 @@ const logError = ({ command, }: { healthcheck: string; - loader?: Ora; + loader?: Loader; error: Error; message?: string; command: string; diff --git a/packages/cli/src/commands/doctor/healthchecks/index.ts b/packages/cli-doctor/src/tools/healthchecks/index.ts similarity index 91% rename from packages/cli/src/commands/doctor/healthchecks/index.ts rename to packages/cli-doctor/src/tools/healthchecks/index.ts index e500fcf7c..e7c870b62 100644 --- a/packages/cli/src/commands/doctor/healthchecks/index.ts +++ b/packages/cli-doctor/src/tools/healthchecks/index.ts @@ -9,11 +9,8 @@ import androidNDK from './androidNDK'; import xcode from './xcode'; import cocoaPods from './cocoaPods'; import iosDeploy from './iosDeploy'; -import { - Healthchecks, - HealthCheckCategory, -} from '@react-native-community/cli-types'; -import loadConfig from '../../../tools/config'; +import {Healthchecks, HealthCheckCategory} from '../../types'; +import loadConfig from '@react-native-community/cli-config'; export const HEALTHCHECK_TYPES = { ERROR: 'ERROR', diff --git a/packages/cli/src/commands/doctor/healthchecks/iosDeploy.ts b/packages/cli-doctor/src/tools/healthchecks/iosDeploy.ts similarity index 96% rename from packages/cli/src/commands/doctor/healthchecks/iosDeploy.ts rename to packages/cli-doctor/src/tools/healthchecks/iosDeploy.ts index ee269ee2d..8c095b46b 100644 --- a/packages/cli/src/commands/doctor/healthchecks/iosDeploy.ts +++ b/packages/cli-doctor/src/tools/healthchecks/iosDeploy.ts @@ -4,8 +4,7 @@ import prompts from 'prompts'; import {isSoftwareNotInstalled, PACKAGE_MANAGERS} from '../checkInstallation'; import {packageManager} from './packageManagers'; import {logError, removeMessage} from './common'; -import {HealthCheckInterface} from '@react-native-community/cli-types'; -import type {Ora} from 'ora'; +import {HealthCheckInterface, Loader} from '../../types'; const label = 'ios-deploy'; @@ -31,7 +30,7 @@ const installLibrary = async ({ }: { installationCommand: string; packageManagerToUse: 'yarn' | 'npm'; - loader: Ora; + loader: Loader; }) => { try { loader.start(`${label} (installing with ${packageManagerToUse})`); diff --git a/packages/cli/src/commands/doctor/healthchecks/jdk.ts b/packages/cli-doctor/src/tools/healthchecks/jdk.ts similarity index 90% rename from packages/cli/src/commands/doctor/healthchecks/jdk.ts rename to packages/cli-doctor/src/tools/healthchecks/jdk.ts index 9dd4d3346..30d751d7a 100644 --- a/packages/cli/src/commands/doctor/healthchecks/jdk.ts +++ b/packages/cli-doctor/src/tools/healthchecks/jdk.ts @@ -1,13 +1,12 @@ import {join} from 'path'; import versionRanges from '../versionRanges'; import {doesSoftwareNeedToBeFixed} from '../checkInstallation'; -import {HealthCheckInterface} from '@react-native-community/cli-types'; - -import {downloadAndUnzip} from '../../../tools/downloadAndUnzip'; +import {HealthCheckInterface} from '../../types'; +import {downloadAndUnzip} from '../downloadAndUnzip'; import { setEnvironment, updateEnvironment, -} from '../../../tools/windows/environmentVariables'; +} from '../windows/environmentVariables'; export default { label: 'JDK', diff --git a/packages/cli/src/commands/doctor/healthchecks/nodeJS.ts b/packages/cli-doctor/src/tools/healthchecks/nodeJS.ts similarity index 89% rename from packages/cli/src/commands/doctor/healthchecks/nodeJS.ts rename to packages/cli-doctor/src/tools/healthchecks/nodeJS.ts index 6b36cbbff..63cf5a41b 100644 --- a/packages/cli/src/commands/doctor/healthchecks/nodeJS.ts +++ b/packages/cli-doctor/src/tools/healthchecks/nodeJS.ts @@ -1,6 +1,6 @@ import versionRanges from '../versionRanges'; import {doesSoftwareNeedToBeFixed} from '../checkInstallation'; -import {HealthCheckInterface} from '@react-native-community/cli-types'; +import {HealthCheckInterface} from '../../types'; export default { label: 'Node.js', diff --git a/packages/cli/src/commands/doctor/healthchecks/packageManagers.ts b/packages/cli-doctor/src/tools/healthchecks/packageManagers.ts similarity index 93% rename from packages/cli/src/commands/doctor/healthchecks/packageManagers.ts rename to packages/cli-doctor/src/tools/healthchecks/packageManagers.ts index 51b83a621..862036541 100644 --- a/packages/cli/src/commands/doctor/healthchecks/packageManagers.ts +++ b/packages/cli-doctor/src/tools/healthchecks/packageManagers.ts @@ -4,8 +4,8 @@ import { PACKAGE_MANAGERS, doesSoftwareNeedToBeFixed, } from '../checkInstallation'; -import {install} from '../../../tools/install'; -import {HealthCheckInterface} from '@react-native-community/cli-types'; +import {install} from '../install'; +import {HealthCheckInterface} from '../../types'; const packageManager = (() => { if (fs.existsSync('yarn.lock')) { diff --git a/packages/cli/src/commands/doctor/healthchecks/watchman.ts b/packages/cli-doctor/src/tools/healthchecks/watchman.ts similarity index 86% rename from packages/cli/src/commands/doctor/healthchecks/watchman.ts rename to packages/cli-doctor/src/tools/healthchecks/watchman.ts index e3e8c2074..1a5476d1c 100644 --- a/packages/cli/src/commands/doctor/healthchecks/watchman.ts +++ b/packages/cli-doctor/src/tools/healthchecks/watchman.ts @@ -1,7 +1,7 @@ import versionRanges from '../versionRanges'; import {doesSoftwareNeedToBeFixed} from '../checkInstallation'; -import {install} from '../../../tools/install'; -import {HealthCheckInterface} from '@react-native-community/cli-types'; +import {install} from '../install'; +import {HealthCheckInterface} from '../../types'; const label = 'Watchman'; diff --git a/packages/cli/src/commands/doctor/healthchecks/xcode.ts b/packages/cli-doctor/src/tools/healthchecks/xcode.ts similarity index 91% rename from packages/cli/src/commands/doctor/healthchecks/xcode.ts rename to packages/cli-doctor/src/tools/healthchecks/xcode.ts index 9d2f8c125..1fb9ac014 100644 --- a/packages/cli/src/commands/doctor/healthchecks/xcode.ts +++ b/packages/cli-doctor/src/tools/healthchecks/xcode.ts @@ -1,6 +1,6 @@ import versionRanges from '../versionRanges'; import {doesSoftwareNeedToBeFixed} from '../checkInstallation'; -import {HealthCheckInterface} from '@react-native-community/cli-types'; +import {HealthCheckInterface} from '../../types'; export default { label: 'Xcode', diff --git a/packages/cli/src/tools/install.ts b/packages/cli-doctor/src/tools/install.ts similarity index 80% rename from packages/cli/src/tools/install.ts rename to packages/cli-doctor/src/tools/install.ts index 40a81034c..4845a827a 100644 --- a/packages/cli/src/tools/install.ts +++ b/packages/cli-doctor/src/tools/install.ts @@ -1,12 +1,12 @@ -import type {Ora} from 'ora'; +import {Loader} from '../types'; import {brewInstall} from './brewInstall'; -import {logManualInstallation} from '../commands/doctor/healthchecks/common'; +import {logManualInstallation} from './healthchecks/common'; type InstallArgs = { pkg: string; label: string; url: string; - loader: Ora; + loader: Loader; }; async function install({pkg, label, url, loader}: InstallArgs) { diff --git a/packages/cli/src/tools/installPods.ts b/packages/cli-doctor/src/tools/installPods.ts similarity index 95% rename from packages/cli/src/tools/installPods.ts rename to packages/cli-doctor/src/tools/installPods.ts index 6c7629ef4..f8846c2c2 100644 --- a/packages/cli/src/tools/installPods.ts +++ b/packages/cli-doctor/src/tools/installPods.ts @@ -1,13 +1,12 @@ import fs from 'fs'; import execa from 'execa'; import chalk from 'chalk'; -import type {Ora} from 'ora'; import prompts from 'prompts'; -import {logger} from '@react-native-community/cli-tools'; -import {NoopLoader} from './loader'; +import {logger, NoopLoader} from '@react-native-community/cli-tools'; // @ts-ignore untyped import sudo from 'sudo-prompt'; import {brewInstall} from './brewInstall'; +import {Loader} from '../types'; type PromptCocoaPodsInstallation = { installMethod: 'gem' | 'homebrew'; @@ -15,7 +14,7 @@ type PromptCocoaPodsInstallation = { }; async function runPodInstall( - loader: Ora, + loader: Loader, directory: string, shouldHandleRepoUpdate: boolean = true, ) { @@ -51,7 +50,7 @@ async function runPodInstall( } } -async function runPodUpdate(loader: Ora) { +async function runPodUpdate(loader: Loader) { try { loader.start( `Updating CocoaPods repositories ${chalk.dim( @@ -128,7 +127,7 @@ async function installCocoaPodsWithGem() { } } -async function installCocoaPods(loader: Ora) { +async function installCocoaPods(loader: Loader) { loader.stop(); const {installMethod} = await promptCocoaPodsInstallationQuestion(); @@ -166,7 +165,7 @@ async function installPods({ loader, }: { directory: string; - loader?: Ora; + loader?: Loader; }) { loader = loader || new NoopLoader(); try { diff --git a/packages/cli/src/commands/doctor/printFixOptions.ts b/packages/cli-doctor/src/tools/printFixOptions.ts similarity index 100% rename from packages/cli/src/commands/doctor/printFixOptions.ts rename to packages/cli-doctor/src/tools/printFixOptions.ts diff --git a/packages/cli/src/commands/doctor/runAutomaticFix.ts b/packages/cli-doctor/src/tools/runAutomaticFix.ts similarity index 93% rename from packages/cli/src/commands/doctor/runAutomaticFix.ts rename to packages/cli-doctor/src/tools/runAutomaticFix.ts index c3fbc5edd..2bc109efd 100644 --- a/packages/cli/src/commands/doctor/runAutomaticFix.ts +++ b/packages/cli-doctor/src/tools/runAutomaticFix.ts @@ -1,10 +1,8 @@ import chalk from 'chalk'; import ora from 'ora'; -import type {Ora} from 'ora'; import {logger} from '@react-native-community/cli-tools'; +import {EnvironmentInfo, HealthCheckCategoryResult, Loader} from '../types'; import {HEALTHCHECK_TYPES} from './healthchecks'; -import {EnvironmentInfo} from '@react-native-community/cli-types'; -import {HealthCheckCategoryResult} from './types'; import {logManualInstallation} from './healthchecks/common'; export enum AUTOMATIC_FIX_LEVELS { @@ -20,7 +18,7 @@ interface RunAutomaticFixArgs { errors: number; warnings: number; }; - loader: Ora; + loader: Loader; environmentInfo: EnvironmentInfo; } @@ -81,6 +79,7 @@ export default async function ({ logger.log(`\n${chalk.dim(category.label)}`); for (const healthcheckToRun of healthchecksToRun) { + // @todo replace this with `getLoader` from `tools` const spinner = ora({ prefixText: '', text: healthcheckToRun.label, diff --git a/packages/cli/src/tools/unzip.ts b/packages/cli-doctor/src/tools/unzip.ts similarity index 100% rename from packages/cli/src/tools/unzip.ts rename to packages/cli-doctor/src/tools/unzip.ts diff --git a/packages/cli/src/commands/doctor/versionRanges.ts b/packages/cli-doctor/src/tools/versionRanges.ts similarity index 100% rename from packages/cli/src/commands/doctor/versionRanges.ts rename to packages/cli-doctor/src/tools/versionRanges.ts diff --git a/packages/cli/src/tools/windows/__tests__/androidWinHelpers.test.ts b/packages/cli-doctor/src/tools/windows/__tests__/androidWinHelpers.test.ts similarity index 100% rename from packages/cli/src/tools/windows/__tests__/androidWinHelpers.test.ts rename to packages/cli-doctor/src/tools/windows/__tests__/androidWinHelpers.test.ts diff --git a/packages/cli/src/tools/windows/androidWinHelpers.ts b/packages/cli-doctor/src/tools/windows/androidWinHelpers.ts similarity index 100% rename from packages/cli/src/tools/windows/androidWinHelpers.ts rename to packages/cli-doctor/src/tools/windows/androidWinHelpers.ts diff --git a/packages/cli/src/tools/windows/create-shortcut.ts b/packages/cli-doctor/src/tools/windows/create-shortcut.ts similarity index 100% rename from packages/cli/src/tools/windows/create-shortcut.ts rename to packages/cli-doctor/src/tools/windows/create-shortcut.ts diff --git a/packages/cli/src/tools/windows/environmentVariables.ts b/packages/cli-doctor/src/tools/windows/environmentVariables.ts similarity index 100% rename from packages/cli/src/tools/windows/environmentVariables.ts rename to packages/cli-doctor/src/tools/windows/environmentVariables.ts diff --git a/packages/cli/src/tools/windows/executeWinCommand.ts b/packages/cli-doctor/src/tools/windows/executeWinCommand.ts similarity index 100% rename from packages/cli/src/tools/windows/executeWinCommand.ts rename to packages/cli-doctor/src/tools/windows/executeWinCommand.ts diff --git a/packages/cli/src/tools/windows/processorType.ts b/packages/cli-doctor/src/tools/windows/processorType.ts similarity index 100% rename from packages/cli/src/tools/windows/processorType.ts rename to packages/cli-doctor/src/tools/windows/processorType.ts diff --git a/packages/cli-doctor/src/types.ts b/packages/cli-doctor/src/types.ts new file mode 100644 index 000000000..bf1d14893 --- /dev/null +++ b/packages/cli-doctor/src/types.ts @@ -0,0 +1,114 @@ +import type {Ora} from 'ora'; + +export type Loader = Ora; + +export type NotFound = 'Not Found'; + +type AvailableInformation = { + version: string; + path: string; +}; + +type Information = AvailableInformation | NotFound; + +export type EnvironmentInfo = { + System: { + OS: string; + CPU: string; + Memory: string; + Shell: AvailableInformation; + }; + Binaries: { + Node: AvailableInformation; + Yarn: AvailableInformation; + npm: AvailableInformation; + Watchman: AvailableInformation; + }; + SDKs: { + 'iOS SDK': { + Platforms: string[]; + }; + 'Android SDK': + | { + 'API Levels': string[] | NotFound; + 'Build Tools': string[] | NotFound; + 'System Images': string[] | NotFound; + 'Android NDK': string | NotFound; + } + | NotFound; + }; + IDEs: { + 'Android Studio': AvailableInformation | NotFound; + Emacs: AvailableInformation; + Nano: AvailableInformation; + VSCode: AvailableInformation; + Vim: AvailableInformation; + Xcode: AvailableInformation; + }; + Languages: { + Java: Information; + }; +}; + +export type HealthCheckCategory = { + label: string; + healthchecks: HealthCheckInterface[]; +}; + +export type Healthchecks = { + common: HealthCheckCategory; + android: HealthCheckCategory; + ios?: HealthCheckCategory; +}; + +export type RunAutomaticFix = (args: { + loader: Loader; + logManualInstallation: ({ + healthcheck, + url, + command, + message, + }: { + healthcheck?: string; + url?: string; + command?: string; + message?: string; + }) => void; + environmentInfo: EnvironmentInfo; +}) => Promise | void; + +export type HealthCheckInterface = { + label: string; + visible?: boolean | void; + isRequired?: boolean; + description?: string; + getDiagnostics: ( + environmentInfo: EnvironmentInfo, + ) => Promise<{ + version?: string; + versions?: [string]; + versionRange?: string; + needsToBeFixed: boolean | string; + }>; + win32AutomaticFix?: RunAutomaticFix; + darwinAutomaticFix?: RunAutomaticFix; + linuxAutomaticFix?: RunAutomaticFix; + runAutomaticFix: RunAutomaticFix; +}; + +export type HealthCheckResult = { + label: string; + needsToBeFixed: boolean; + version?: NotFound | string; + versions?: [string] | string; + versionRange?: string; + description: string | undefined; + runAutomaticFix: RunAutomaticFix; + isRequired: boolean; + type?: string; +}; + +export type HealthCheckCategoryResult = { + label: string; + healthchecks: HealthCheckResult[]; +}; diff --git a/packages/cli-doctor/tsconfig.json b/packages/cli-doctor/tsconfig.json new file mode 100644 index 000000000..227855158 --- /dev/null +++ b/packages/cli-doctor/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build" + }, + "references": [ + {"path": "../tools"}, + {"path": "../cli-types"}, + {"path": "../cli-config"} + ] +} diff --git a/packages/cli-server-api/tsconfig.json b/packages/cli-server-api/tsconfig.json index da7c59b3f..8b5ecd686 100644 --- a/packages/cli-server-api/tsconfig.json +++ b/packages/cli-server-api/tsconfig.json @@ -4,8 +4,5 @@ "rootDir": "src", "outDir": "build" }, - "references": [ - {"path": "../tools"}, - {"path": "../debugger-ui"} - ] + "references": [{"path": "../tools"}, {"path": "../debugger-ui"}] } diff --git a/packages/cli-types/package.json b/packages/cli-types/package.json index 60c95fdfb..a4de42b5e 100644 --- a/packages/cli-types/package.json +++ b/packages/cli-types/package.json @@ -5,9 +5,6 @@ "publishConfig": { "access": "public" }, - "dependencies": { - "ora": "^6.0.0" - }, "files": [ "build", "!*.map" diff --git a/packages/cli-types/src/index.ts b/packages/cli-types/src/index.ts index db58519b4..ecfa0e8fe 100644 --- a/packages/cli-types/src/index.ts +++ b/packages/cli-types/src/index.ts @@ -11,7 +11,6 @@ import { AndroidDependencyConfig, AndroidDependencyParams, } from './android'; -import type {Ora} from 'ora'; export type Prompt = any; @@ -121,99 +120,6 @@ export type ProjectConfig = { [key: string]: any; }; -export type NotFound = 'Not Found'; -type AvailableInformation = { - version: string; - path: string; -}; - -type Information = AvailableInformation | NotFound; - -export type EnvironmentInfo = { - System: { - OS: string; - CPU: string; - Memory: string; - Shell: AvailableInformation; - }; - Binaries: { - Node: AvailableInformation; - Yarn: AvailableInformation; - npm: AvailableInformation; - Watchman: AvailableInformation; - }; - SDKs: { - 'iOS SDK': { - Platforms: string[]; - }; - 'Android SDK': - | { - 'API Levels': string[] | NotFound; - 'Build Tools': string[] | NotFound; - 'System Images': string[] | NotFound; - 'Android NDK': string | NotFound; - } - | NotFound; - }; - IDEs: { - 'Android Studio': AvailableInformation | NotFound; - Emacs: AvailableInformation; - Nano: AvailableInformation; - VSCode: AvailableInformation; - Vim: AvailableInformation; - Xcode: AvailableInformation; - }; - Languages: { - Java: Information; - }; -}; - -export type HealthCheckCategory = { - label: string; - healthchecks: HealthCheckInterface[]; -}; - -export type Healthchecks = { - common: HealthCheckCategory; - android: HealthCheckCategory; - ios?: HealthCheckCategory; -}; - -export type RunAutomaticFix = (args: { - loader: Ora; - logManualInstallation: ({ - healthcheck, - url, - command, - message, - }: { - healthcheck?: string; - url?: string; - command?: string; - message?: string; - }) => void; - environmentInfo: EnvironmentInfo; -}) => Promise | void; - -export type HealthCheckInterface = { - label: string; - visible?: boolean | void; - isRequired?: boolean; - description?: string; - getDiagnostics: ( - environmentInfo: EnvironmentInfo, - ) => Promise<{ - version?: string; - versions?: [string]; - versionRange?: string; - needsToBeFixed: boolean | string; - }>; - win32AutomaticFix?: RunAutomaticFix; - darwinAutomaticFix?: RunAutomaticFix; - linuxAutomaticFix?: RunAutomaticFix; - runAutomaticFix: RunAutomaticFix; -}; - /** * @property root - Root where the configuration has been resolved from * @property reactNativePath - Path to React Native source @@ -246,7 +152,8 @@ export interface Config extends IOSNativeModulesConfig { [name: string]: PlatformConfig; }; commands: Command[]; - healthChecks: HealthCheckCategory[]; + // @todo this should be removed: https://github.com/react-native-community/cli/issues/1261 + healthChecks: []; } /** @@ -272,7 +179,7 @@ export type UserDependencyConfig = { // An array of extra platforms to load platforms: Config['platforms']; // Additional health checks - healthChecks: HealthCheckCategory[]; + healthChecks: []; }; export { diff --git a/packages/cli/package.json b/packages/cli/package.json index 8dcabe816..98810c5c2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -25,52 +25,37 @@ }, "dependencies": { "@react-native-community/cli-debugger-ui": "^6.0.0-rc.0", + "@react-native-community/cli-doctor": "^6.0.0", "@react-native-community/cli-hermes": "^6.3.0", "@react-native-community/cli-plugin-metro": "^6.4.0", "@react-native-community/cli-server-api": "^6.4.0", "@react-native-community/cli-tools": "^6.2.0", "@react-native-community/cli-types": "^6.0.0", - "appdirsjs": "^1.2.4", + "@react-native-community/cli-config": "^6.0.1", "chalk": "^4.1.2", - "command-exists": "^1.2.8", "commander": "^2.19.0", - "cosmiconfig": "^5.1.0", - "deepmerge": "^3.2.0", - "envinfo": "^7.7.2", "execa": "^1.0.0", "find-up": "^4.1.0", "fs-extra": "^8.1.0", - "glob": "^7.1.3", "graceful-fs": "^4.1.3", - "joi": "^17.2.1", "leven": "^3.1.0", "lodash": "^4.17.15", "minimist": "^1.2.0", - "node-stream-zip": "^1.9.1", - "ora": "^6.0.0", - "pretty-format": "^26.6.2", "prompts": "^2.4.0", - "semver": "^6.3.0", - "serve-static": "^1.13.1", - "strip-ansi": "^5.2.0", - "sudo-prompt": "^9.0.0", - "wcwidth": "^1.0.1" + "semver": "^6.3.0" }, "peerDependencies": { "react-native": "*" }, "devDependencies": { - "@types/command-exists": "^1.2.0", - "@types/cosmiconfig": "^5.0.3", "@types/fs-extra": "^8.1.0", - "@types/glob": "^7.1.1", "@types/graceful-fs": "^4.1.3", "@types/hapi__joi": "^17.1.6", "@types/lodash": "^4.14.149", "@types/minimist": "^1.2.0", "@types/prompts": "^2.0.9", "@types/semver": "^6.0.2", - "@types/wcwidth": "^1.0.0", + "deepmerge": "^3.2.0", "slash": "^3.0.0", "snapshot-diff": "^0.7.0" }, diff --git a/packages/cli/src/commands/doctor/index.ts b/packages/cli/src/commands/doctor/index.ts deleted file mode 100644 index f7e6119e4..000000000 --- a/packages/cli/src/commands/doctor/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import doctor from './doctor'; - -export default { - func: doctor, - detached: true, - name: 'doctor', - description: - '[EXPERIMENTAL] Diagnose and fix common Node.js, iOS, Android & React Native issues.', - options: [ - { - name: '--fix', - description: 'Attempt to fix all diagnosed issues.', - }, - { - name: '--contributor', - description: - 'Add healthchecks required to installations required for contributing to React Native.', - }, - ], -}; diff --git a/packages/cli/src/commands/doctor/types.ts b/packages/cli/src/commands/doctor/types.ts deleted file mode 100644 index ca4d7cefa..000000000 --- a/packages/cli/src/commands/doctor/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -import {RunAutomaticFix, NotFound} from '@react-native-community/cli-types'; - -export type HealthCheckResult = { - label: string; - needsToBeFixed: boolean; - version?: NotFound | string; - versions?: [string] | string; - versionRange?: string; - description: string | undefined; - runAutomaticFix: RunAutomaticFix; - isRequired: boolean; - type?: string; -}; - -export type HealthCheckCategoryResult = { - label: string; - healthchecks: HealthCheckResult[]; -}; diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index e0835bdd4..d8e5f9588 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -5,22 +5,24 @@ import unlink from './link/unlink'; import install from './install/install'; import uninstall from './install/uninstall'; import upgrade from './upgrade/upgrade'; -import info from './info/info'; +import {commands as doctorCommands} from '@react-native-community/cli-doctor'; import config from './config/config'; import init from './init'; -import doctor from './doctor'; import profileHermes from '@react-native-community/cli-hermes'; export const projectCommands = [ ...metroCommands, + doctorCommands.info, link, unlink, install, uninstall, upgrade, - info, config, profileHermes, ] as Command[]; -export const detachedCommands = [init, doctor] as DetachedCommand[]; +export const detachedCommands = [ + init, + doctorCommands.doctor, +] as DetachedCommand[]; diff --git a/packages/cli/src/commands/init/init.ts b/packages/cli/src/commands/init/init.ts index 855fdbf0f..416315a62 100644 --- a/packages/cli/src/commands/init/init.ts +++ b/packages/cli/src/commands/init/init.ts @@ -2,11 +2,15 @@ import os from 'os'; import path from 'path'; import fs from 'fs-extra'; import minimist from 'minimist'; -import type {Ora} from 'ora'; import {validateProjectName} from './validate'; import DirectoryAlreadyExistsError from './errors/DirectoryAlreadyExistsError'; import printRunInstructions from './printRunInstructions'; -import {CLIError, logger} from '@react-native-community/cli-tools'; +import { + CLIError, + logger, + getLoader, + Loader, +} from '@react-native-community/cli-tools'; import { installTemplatePackage, getTemplateConfig, @@ -15,9 +19,8 @@ import { } from './template'; import {changePlaceholderInTemplate} from './editTemplate'; import * as PackageManager from '../../tools/packageManager'; -import installPods from '../../tools/installPods'; +import {installPods} from '@react-native-community/cli-doctor'; import banner from './banner'; -import {getLoader} from '../../tools/loader'; const DEFAULT_VERSION = 'latest'; @@ -85,8 +88,7 @@ async function createFromTemplate({ const projectDirectory = await setProjectDirectory(directory); - const Loader = getLoader(); - const loader = new Loader({text: 'Downloading template'}); + const loader = getLoader({text: 'Downloading template'}); const templateSourceDir = fs.mkdtempSync( path.join(os.tmpdir(), 'rncli-init-template-'), ); @@ -156,7 +158,7 @@ async function installDependencies({ }: { directory: string; npm?: boolean; - loader: Ora; + loader: Loader; root: string; }) { loader.start('Installing dependencies'); diff --git a/packages/cli/src/commands/init/initCompat.ts b/packages/cli/src/commands/init/initCompat.ts index b93579820..22ed71d02 100644 --- a/packages/cli/src/commands/init/initCompat.ts +++ b/packages/cli/src/commands/init/initCompat.ts @@ -14,7 +14,7 @@ import printRunInstructions from './printRunInstructions'; import {createProjectFromTemplate} from '../../tools/generator/templates'; import * as PackageManager from '../../tools/packageManager'; import {logger} from '@react-native-community/cli-tools'; -import installPods from '../../tools/installPods'; +import {installPods} from '@react-native-community/cli-doctor'; /** * Creates the template for a React Native project given the provided diff --git a/packages/cli/src/commands/install/install.ts b/packages/cli/src/commands/install/install.ts index a630247f7..e65a8139f 100644 --- a/packages/cli/src/commands/install/install.ts +++ b/packages/cli/src/commands/install/install.ts @@ -8,7 +8,7 @@ import {logger} from '@react-native-community/cli-tools'; import * as PackageManager from '../../tools/packageManager'; import link from '../link/link'; -import loadConfig from '../../tools/config'; +import loadConfig from '@react-native-community/cli-config'; import {Config} from '@react-native-community/cli-types'; async function install(args: Array, ctx: Config): Promise { diff --git a/packages/cli/src/commands/link/__tests__/link.test.ts b/packages/cli/src/commands/link/__tests__/link.test.ts index 279285ca3..5c9d5d604 100644 --- a/packages/cli/src/commands/link/__tests__/link.test.ts +++ b/packages/cli/src/commands/link/__tests__/link.test.ts @@ -1,12 +1,13 @@ import {func as link} from '../link'; -import loadConfig from '../../../tools/config'; +import loadConfig from '@react-native-community/cli-config'; import makeHook from '../makeHook'; + jest.mock('chalk', () => ({ grey: jest.fn(), bold: jest.fn(), dim: {underline: jest.fn()}, })); -jest.mock('../../../tools/config'); +jest.mock('@react-native-community/cli-config'); jest.mock('../makeHook', () => { return jest.fn(() => { return jest.fn(() => Promise.resolve()); diff --git a/packages/cli/src/tools/config/__mocks__/index.ts b/packages/cli/src/commands/upgrade/__mocks__/@react-native-community/cli-config.ts similarity index 100% rename from packages/cli/src/tools/config/__mocks__/index.ts rename to packages/cli/src/commands/upgrade/__mocks__/@react-native-community/cli-config.ts diff --git a/packages/cli/src/commands/upgrade/__tests__/upgrade-testing-methods.ts b/packages/cli/src/commands/upgrade/__tests__/upgrade-testing-methods.ts index 1599bdbc1..40d45b3fe 100644 --- a/packages/cli/src/commands/upgrade/__tests__/upgrade-testing-methods.ts +++ b/packages/cli/src/commands/upgrade/__tests__/upgrade-testing-methods.ts @@ -1,19 +1,19 @@ import execa from 'execa'; import path from 'path'; +import merge from 'deepmerge'; import fs from 'fs'; import snapshotDiff from 'snapshot-diff'; import stripAnsi from 'strip-ansi'; import upgrade from '../upgrade'; import {fetch, logger} from '@react-native-community/cli-tools'; -import loadConfig from '../../../tools/config'; -import merge from '../../../tools/merge'; +import loadConfig from '@react-native-community/cli-config'; jest.mock('https'); jest.mock('fs'); jest.mock('path'); jest.mock('execa'); -jest.mock('../../../tools/config'); +jest.mock('@react-native-community/cli-config'); jest.mock('../../../tools/packageManager', () => ({ install: (args) => { mockPushLog('$ yarn add', ...args); diff --git a/packages/cli/src/commands/upgrade/upgrade.ts b/packages/cli/src/commands/upgrade/upgrade.ts index 66a1f510b..b60fc4d0f 100644 --- a/packages/cli/src/commands/upgrade/upgrade.ts +++ b/packages/cli/src/commands/upgrade/upgrade.ts @@ -6,7 +6,7 @@ import execa from 'execa'; import {Config} from '@react-native-community/cli-types'; import {logger, CLIError, fetch} from '@react-native-community/cli-tools'; import * as PackageManager from '../../tools/packageManager'; -import installPods from '../../tools/installPods'; +import {installPods} from '@react-native-community/cli-doctor'; type UpgradeError = {message: string; stderr: string}; diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 33609ee5d..baa0467e3 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -9,7 +9,7 @@ import {logger, CLIError} from '@react-native-community/cli-tools'; import {detachedCommands, projectCommands} from './commands'; import init from './commands/init/initCompat'; -import loadConfig from './tools/config'; +import loadConfig from '@react-native-community/cli-config'; const pkgJson = require('../package.json'); diff --git a/packages/cli/src/tools/config/__mocks__/resolveNodeModuleDir.ts b/packages/cli/src/tools/config/__mocks__/resolveNodeModuleDir.ts deleted file mode 100644 index 734d229a4..000000000 --- a/packages/cli/src/tools/config/__mocks__/resolveNodeModuleDir.ts +++ /dev/null @@ -1,8 +0,0 @@ -import path from 'path'; - -export default function resolveNodeModuleDir( - root: string, - packageName: string, -): string { - return path.join(root, 'node_modules', packageName); -} diff --git a/packages/cli/src/tools/config/resolveNodeModuleDir.ts b/packages/cli/src/tools/config/resolveNodeModuleDir.ts deleted file mode 100644 index 68fd4fbfa..000000000 --- a/packages/cli/src/tools/config/resolveNodeModuleDir.ts +++ /dev/null @@ -1,2 +0,0 @@ -import {resolveNodeModuleDir} from '@react-native-community/cli-tools'; -export default resolveNodeModuleDir; diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 2a6002164..baccb12a9 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -11,5 +11,7 @@ {"path": "../cli-server-api"}, {"path": "../cli-hermes"}, {"path": "../cli-plugin-metro"}, + {"path": "../cli-doctor"}, + {"path": "../cli-config"} ] } diff --git a/packages/platform-ios/package.json b/packages/platform-ios/package.json index 132399cbd..325a8f0ba 100644 --- a/packages/platform-ios/package.json +++ b/packages/platform-ios/package.json @@ -12,7 +12,7 @@ "glob": "^7.1.3", "js-yaml": "^3.13.1", "lodash": "^4.17.15", - "ora": "^6.0.0", + "ora": "^5.4.1", "plist": "^3.0.2", "xcode": "^3.0.0" }, diff --git a/packages/platform-ios/src/commands/runIOS/index.ts b/packages/platform-ios/src/commands/runIOS/index.ts index 32fec787b..e0b5487f2 100644 --- a/packages/platform-ios/src/commands/runIOS/index.ts +++ b/packages/platform-ios/src/commands/runIOS/index.ts @@ -322,6 +322,7 @@ function buildProject( '-destination', `id=${udid}`, ]; + // @todo use `getLoader` from cli-tools package const loader = ora(); logger.info( `Building ${chalk.dim( diff --git a/packages/tools/package.json b/packages/tools/package.json index 2246d14c6..a9f455e06 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -13,10 +13,12 @@ "mime": "^2.4.1", "node-fetch": "^2.6.0", "open": "^6.2.0", + "ora": "^5.4.1", "semver": "^6.3.0", "shell-quote": "^1.7.3" }, "devDependencies": { + "@react-native-community/cli-types": "^6.0.0", "@types/lodash": "^4.14.149", "@types/mime": "^2.0.1", "@types/node-fetch": "^2.5.5" diff --git a/packages/tools/src/__mocks__/logger.ts b/packages/tools/src/__mocks__/logger.ts deleted file mode 100644 index 8cc725657..000000000 --- a/packages/tools/src/__mocks__/logger.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -module.exports.out = () => jest.fn(); -module.exports.err = () => jest.fn(); diff --git a/packages/cli/src/tools/config/__tests__/findProjectRoot-test.ts b/packages/tools/src/__tests__/findProjectRoot-test.ts similarity index 89% rename from packages/cli/src/tools/config/__tests__/findProjectRoot-test.ts rename to packages/tools/src/__tests__/findProjectRoot-test.ts index a1c8ad4e2..7b1ba2cc2 100644 --- a/packages/cli/src/tools/config/__tests__/findProjectRoot-test.ts +++ b/packages/tools/src/__tests__/findProjectRoot-test.ts @@ -1,10 +1,6 @@ import path from 'path'; import findProjectRoot from '../findProjectRoot'; -import { - cleanup, - writeFiles, - getTempDirectory, -} from '../../../../../../jest/helpers'; +import {cleanup, writeFiles, getTempDirectory} from '../../../../jest/helpers'; beforeEach(async () => { await cleanup(DIR); diff --git a/packages/cli/src/tools/config/findProjectRoot.ts b/packages/tools/src/findProjectRoot.ts similarity index 92% rename from packages/cli/src/tools/config/findProjectRoot.ts rename to packages/tools/src/findProjectRoot.ts index 419bebca9..e90ffa132 100644 --- a/packages/cli/src/tools/config/findProjectRoot.ts +++ b/packages/tools/src/findProjectRoot.ts @@ -1,6 +1,6 @@ import findUp from 'find-up'; import path from 'path'; -import {CLIError} from '@react-native-community/cli-tools'; +import {CLIError} from './errors'; /** * Finds project root by looking for a closest `package.json`. diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts index 545aab8c6..3914f94c2 100644 --- a/packages/tools/src/index.ts +++ b/packages/tools/src/index.ts @@ -9,5 +9,7 @@ export {default as launchEditor} from './launchEditor'; export {default as releaseChecker} from './releaseChecker'; export {default as resolveNodeModuleDir} from './resolveNodeModuleDir'; export {default as hookStdout} from './hookStdout'; +export {getLoader, NoopLoader, Loader} from './loader'; +export {default as findProjectRoot} from './findProjectRoot'; export * from './errors'; diff --git a/packages/cli/src/tools/loader.ts b/packages/tools/src/loader.ts similarity index 64% rename from packages/cli/src/tools/loader.ts rename to packages/tools/src/loader.ts index 104da63f6..f4ef0524d 100644 --- a/packages/cli/src/tools/loader.ts +++ b/packages/tools/src/loader.ts @@ -1,8 +1,10 @@ import ora from 'ora'; -import type {Ora, Spinner, Color} from 'ora'; -import {logger} from '@react-native-community/cli-tools'; +import type {Ora, Options, Spinner, Color} from 'ora'; +import logger from './logger'; -class OraNoop implements Ora { +export type Loader = Ora; + +class OraNoop implements Loader { spinner: Spinner = {interval: 1, frames: []}; indent: number = 0; isSpinning: boolean = false; @@ -42,9 +44,8 @@ class OraNoop implements Ora { } } -export function getLoader() { - // FIXME refactor getLoader to not rely on class instantiation to avoid type conflict or implement an default Ora Loader Class definition - return logger.isVerbose() ? OraNoop : (ora as any); +export function getLoader(options?: string | Options | undefined): Loader { + return logger.isVerbose() ? new OraNoop() : ora(options); } export const NoopLoader = OraNoop; diff --git a/packages/tools/tsconfig.json b/packages/tools/tsconfig.json index 7bb06bce6..6fb5d1351 100644 --- a/packages/tools/tsconfig.json +++ b/packages/tools/tsconfig.json @@ -3,5 +3,6 @@ "compilerOptions": { "rootDir": "src", "outDir": "build" - } + }, + "references": [{"path": "../cli-types"}] } diff --git a/yarn.lock b/yarn.lock index 5147f8709..d71278683 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2821,11 +2821,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -3301,12 +3296,12 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bl@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-5.0.0.tgz#6928804a41e9da9034868e1c50ca88f21f57aea2" - integrity sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: - buffer "^6.0.3" + buffer "^5.5.0" inherits "^2.0.4" readable-stream "^3.4.0" @@ -3493,13 +3488,13 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" - ieee754 "^1.2.1" + ieee754 "^1.1.13" builtin-status-codes@^3.0.0: version "3.0.0" @@ -3692,11 +3687,6 @@ chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.0.tgz#bd96c6bb8e02b96e08c0c3ee2a9d90e050c7b832" - integrity sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ== - char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -3798,19 +3788,12 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== -cli-spinners@^2.6.0: +cli-spinners@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== @@ -6357,16 +6340,16 @@ icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore-walk@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" @@ -6780,10 +6763,10 @@ is-html@^1.1.0: dependencies: html-tags "^1.0.0" -is-interactive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" - integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== is-lambda@^1.0.1: version "1.0.1" @@ -6948,10 +6931,10 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-unicode-supported@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.1.0.tgz#9127b71f9fa82f52ca5c20e982e7bec0ee31ee1e" - integrity sha512-lDcxivp8TJpLG75/DpatAqNzOpDPSpED8XNtrpBHTdQ2InQ1PbW78jhwSxyxhhu+xbVSast2X38bwj8atwoUQA== +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-url@^1.2.2: version "1.2.4" @@ -8030,13 +8013,13 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -log-symbols@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" - integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: - chalk "^5.0.0" - is-unicode-supported "^1.1.0" + chalk "^4.1.0" + is-unicode-supported "^0.1.0" logkitty@^0.7.1: version "0.7.1" @@ -9310,19 +9293,19 @@ ora@^2.1.0: strip-ansi "^4.0.0" wcwidth "^1.0.1" -ora@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-6.0.1.tgz#68caa9fd6c485a40d6f46c50a3940fa3df99c7f3" - integrity sha512-TDdKkKHdWE6jo/6pIa5U5AWcSVfpNRFJ8sdRJpioGNVPLAzZzHs/N+QhUfF7ZbyoC+rnDuNTKzeDJUbAza9g4g== - dependencies: - bl "^5.0.0" - chalk "^4.1.2" - cli-cursor "^4.0.0" - cli-spinners "^2.6.0" - is-interactive "^2.0.0" - is-unicode-supported "^1.1.0" - log-symbols "^5.0.0" - strip-ansi "^7.0.1" +ora@^5.6.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" wcwidth "^1.0.1" os-browserify@^0.3.0: @@ -10788,14 +10771,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -11603,13 +11578,6 @@ strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"