diff --git a/package.json b/package.json index 11aa5ef77..d731ffe7b 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@react-native-community/eslint-config": "^0.0.5", "@types/jest": "^24.0.11", "@types/node": "^11.13.0", + "@types/node-fetch": "^2.3.7", "babel-jest": "^24.6.0", "babel-plugin-module-resolver": "^3.2.0", "chalk": "^2.4.2", diff --git a/packages/cli/src/tools/__tests__/packageManager-test.js b/packages/cli/src/tools/__tests__/packageManager-test.js index 1e53b185f..4527091b5 100644 --- a/packages/cli/src/tools/__tests__/packageManager-test.js +++ b/packages/cli/src/tools/__tests__/packageManager-test.js @@ -55,7 +55,7 @@ describe('npm', () => { expect(execa).toHaveBeenCalledWith( 'npm', - ['install', ...PACKAGES, '--save', '--save-exact'], + ['install', '--save', '--save-exact', ...PACKAGES], EXEC_OPTS, ); }); @@ -65,7 +65,7 @@ describe('npm', () => { expect(execa).toHaveBeenCalledWith( 'npm', - ['install', ...PACKAGES, '--save-dev', '--save-exact'], + ['install', '--save-dev', '--save-exact', ...PACKAGES], EXEC_OPTS, ); }); @@ -75,7 +75,7 @@ describe('npm', () => { expect(execa).toHaveBeenCalledWith( 'npm', - ['uninstall', ...PACKAGES, '--save'], + ['uninstall', '--save', ...PACKAGES], EXEC_OPTS, ); }); @@ -87,7 +87,7 @@ it('should use npm if yarn is not available', () => { expect(execa).toHaveBeenCalledWith( 'npm', - ['install', ...PACKAGES, '--save', '--save-exact'], + ['install', '--save', '--save-exact', ...PACKAGES], EXEC_OPTS, ); }); @@ -100,7 +100,7 @@ it('should use npm if project is not using yarn', () => { expect(execa).toHaveBeenCalledWith( 'npm', - ['install', ...PACKAGES, '--save', '--save-exact'], + ['install', '--save', '--save-exact', ...PACKAGES], EXEC_OPTS, ); expect(yarn.isProjectUsingYarn).toHaveBeenCalledWith(PROJECT_ROOT); diff --git a/packages/cli/src/tools/packageManager.js b/packages/cli/src/tools/packageManager.js index b42519b68..b85e8c293 100644 --- a/packages/cli/src/tools/packageManager.js +++ b/packages/cli/src/tools/packageManager.js @@ -11,6 +11,32 @@ type Options = {| let projectDir; +const packageManagers = { + yarn: { + install: ['add'], + installDev: ['add', '-D'], + uninstall: ['remove'], + installAll: ['install'], + }, + npm: { + install: ['install', '--save', '--save-exact'], + installDev: ['install', '--save-dev', '--save-exact'], + uninstall: ['uninstall', '--save'], + installAll: ['install'], + }, +}; + +function configurePackageManager( + packageNames: Array, + options?: Options, + action: 'install' | 'installDev' | 'installAll' | 'uninstall', +) { + const pm = shouldUseYarn(options) ? 'yarn' : 'npm'; + const [executable, ...flags] = packageManagers[pm][action]; + const args = [executable, ...flags, ...packageNames]; + return executeCommand(pm, args, options); +} + function executeCommand( command: string, args: Array, @@ -36,33 +62,17 @@ export function setProjectDir(dir: string) { } export function install(packageNames: Array, options?: Options) { - return shouldUseYarn(options) - ? executeCommand('yarn', ['add', ...packageNames], options) - : executeCommand( - 'npm', - ['install', ...packageNames, '--save', '--save-exact'], - options, - ); + return configurePackageManager(packageNames, options, 'install'); } export function installDev(packageNames: Array, options?: Options) { - return shouldUseYarn(options) - ? executeCommand('yarn', ['add', '-D', ...packageNames], options) - : executeCommand( - 'npm', - ['install', ...packageNames, '--save-dev', '--save-exact'], - options, - ); + return configurePackageManager(packageNames, options, 'installDev'); } export function uninstall(packageNames: Array, options?: Options) { - return shouldUseYarn(options) - ? executeCommand('yarn', ['remove', ...packageNames], options) - : executeCommand('npm', ['uninstall', ...packageNames, '--save'], options); + return configurePackageManager(packageNames, options, 'uninstall'); } export function installAll(options?: Options) { - return shouldUseYarn(options) - ? executeCommand('yarn', ['install'], options) - : executeCommand('npm', ['install'], options); + return configurePackageManager([], options, 'installAll'); } diff --git a/yarn.lock b/yarn.lock index 52747b228..9bdd5834c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1975,6 +1975,13 @@ dependencies: "@types/node" "*" +"@types/node-fetch@^2.3.7": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.3.7.tgz#b7212e895100f8642dbdab698472bab5f3c1d2f1" + integrity sha512-+bKtuxhj/TYSSP1r4CZhfmyA0vm/aDRQNo7vbAgf6/cZajn0SAniGGST07yvI4Q+q169WTa2/x9gEHfJrkcALw== + dependencies: + "@types/node" "*" + "@types/node@*": version "12.0.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.0.tgz#d11813b9c0ff8aaca29f04cbc12817f4c7d656e5"