From 708dde9ea2f4864d4082cf78d06467f03ee6cfcc Mon Sep 17 00:00:00 2001 From: Tomasz Misiukiewicz Date: Tue, 29 Aug 2023 11:45:05 +0200 Subject: [PATCH] add `--dependency-check` flag --- packages/cli-config/src/loadConfig.ts | 2 +- .../src/commands/buildAndroid/index.ts | 6 ++++++ .../src/commands/runAndroid/index.ts | 5 +++++ .../src/commands/buildIOS/buildProject.ts | 1 + .../src/commands/buildIOS/index.ts | 15 ++++++++++++++- .../cli-platform-ios/src/commands/runIOS/index.ts | 5 +++++ packages/cli-tools/src/index.ts | 2 +- packages/cli-tools/src/resolveTransitiveDeps.ts | 12 ++++++------ packages/cli/src/index.ts | 8 +------- 9 files changed, 40 insertions(+), 16 deletions(-) diff --git a/packages/cli-config/src/loadConfig.ts b/packages/cli-config/src/loadConfig.ts index e2b699124..ffd3533de 100644 --- a/packages/cli-config/src/loadConfig.ts +++ b/packages/cli-config/src/loadConfig.ts @@ -12,6 +12,7 @@ import { resolveNodeModuleDir, UnknownProjectError, } from '@react-native-community/cli-tools'; +import findDependencies from './findDependencies'; import resolveReactNativePath from './resolveReactNativePath'; import { readConfigFromDisk, @@ -19,7 +20,6 @@ import { } from './readConfigFromDisk'; import assign from './assign'; import merge from './merge'; -import findDependencies from './findDependencies'; function getDependencyConfig( root: string, diff --git a/packages/cli-platform-android/src/commands/buildAndroid/index.ts b/packages/cli-platform-android/src/commands/buildAndroid/index.ts index 0f6674e67..5cfd8924e 100644 --- a/packages/cli-platform-android/src/commands/buildAndroid/index.ts +++ b/packages/cli-platform-android/src/commands/buildAndroid/index.ts @@ -17,6 +17,7 @@ export interface BuildFlags { tasks?: Array; extraParams?: Array; interactive?: boolean; + dependencyCheck?: boolean; } async function buildAndroid( @@ -123,6 +124,11 @@ export const options = [ description: 'Explicitly select build type and flavour to use before running a build', }, + { + name: '--dependency-check', + description: + 'Check if there are any transitive dependencies containing native code that are not declared as a direct dependency in your package.json.', + }, ]; export default { diff --git a/packages/cli-platform-android/src/commands/runAndroid/index.ts b/packages/cli-platform-android/src/commands/runAndroid/index.ts index 0442881c8..e95161f42 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/index.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/index.ts @@ -22,6 +22,7 @@ import { logAlreadyRunningBundler, startServerInNewWindow, handlePortUnavailable, + checkTransitiveDependencies, } from '@react-native-community/cli-tools'; import {getAndroidProject} from '../../config/getAndroidProject'; import listAndroidDevices from './listAndroidDevices'; @@ -56,6 +57,10 @@ async function runAndroid(_argv: Array, config: Config, args: Flags) { let {packager, port} = args; + if (args.dependencyCheck) { + await checkTransitiveDependencies(); + } + const packagerStatus = await isPackagerRunning(port); if ( diff --git a/packages/cli-platform-ios/src/commands/buildIOS/buildProject.ts b/packages/cli-platform-ios/src/commands/buildIOS/buildProject.ts index d3b781fd1..e1529040d 100644 --- a/packages/cli-platform-ios/src/commands/buildIOS/buildProject.ts +++ b/packages/cli-platform-ios/src/commands/buildIOS/buildProject.ts @@ -20,6 +20,7 @@ export type BuildFlags = { interactive?: boolean; destination?: string; extraParams?: string[]; + dependencyCheck?: boolean; }; export function buildProject( diff --git a/packages/cli-platform-ios/src/commands/buildIOS/index.ts b/packages/cli-platform-ios/src/commands/buildIOS/index.ts index f10f971a5..5ccb1556e 100644 --- a/packages/cli-platform-ios/src/commands/buildIOS/index.ts +++ b/packages/cli-platform-ios/src/commands/buildIOS/index.ts @@ -9,7 +9,11 @@ import path from 'path'; import chalk from 'chalk'; import {Config} from '@react-native-community/cli-types'; -import {logger, CLIError} from '@react-native-community/cli-tools'; +import { + logger, + CLIError, + checkTransitiveDependencies, +} from '@react-native-community/cli-tools'; import {Device} from '../../types'; import {BuildFlags, buildProject} from './buildProject'; import {getDestinationSimulator} from '../../tools/getDestinationSimulator'; @@ -41,6 +45,10 @@ async function buildIOS(_: Array, ctx: Config, args: FlagsT) { ); } + if (args.dependencyCheck) { + await checkTransitiveDependencies(); + } + process.chdir(sourceDir); const projectInfo = getProjectInfo(); @@ -236,6 +244,11 @@ export const iosBuildOptions = [ name: '--target ', description: 'Explicitly set Xcode target to use.', }, + { + name: '--dependency-check', + description: + 'Check if there are any transitive dependencies containing native code that are not declared as a direct dependency in your package.json.', + }, ]; export default { diff --git a/packages/cli-platform-ios/src/commands/runIOS/index.ts b/packages/cli-platform-ios/src/commands/runIOS/index.ts index 9d375293c..3eb16a795 100644 --- a/packages/cli-platform-ios/src/commands/runIOS/index.ts +++ b/packages/cli-platform-ios/src/commands/runIOS/index.ts @@ -21,6 +21,7 @@ import { isPackagerRunning, logAlreadyRunningBundler, handlePortUnavailable, + checkTransitiveDependencies, } from '@react-native-community/cli-tools'; import {BuildFlags, buildProject} from '../buildIOS/buildProject'; import {iosBuildOptions} from '../buildIOS'; @@ -88,6 +89,10 @@ async function runIOS(_: Array, ctx: Config, args: FlagsT) { ); } + if (args.dependencyCheck) { + await checkTransitiveDependencies(); + } + const {xcodeProject, sourceDir} = ctx.project.ios; if (!xcodeProject) { diff --git a/packages/cli-tools/src/index.ts b/packages/cli-tools/src/index.ts index a6a240842..f61da2a86 100644 --- a/packages/cli-tools/src/index.ts +++ b/packages/cli-tools/src/index.ts @@ -17,6 +17,6 @@ export * as link from './doclink'; export {default as startServerInNewWindow} from './startServerInNewWindow'; export {default as handlePortUnavailable} from './handlePortUnavailable'; export * from './port'; -export * as transitiveDeps from './resolveTransitiveDeps'; +export {default as checkTransitiveDependencies} from './resolveTransitiveDeps'; export * from './errors'; diff --git a/packages/cli-tools/src/resolveTransitiveDeps.ts b/packages/cli-tools/src/resolveTransitiveDeps.ts index bd008bb07..b26c0b1cc 100644 --- a/packages/cli-tools/src/resolveTransitiveDeps.ts +++ b/packages/cli-tools/src/resolveTransitiveDeps.ts @@ -17,7 +17,7 @@ interface DependencyData { duplicates?: DependencyData[]; } -export function isUsingYarn(root: string) { +function isUsingYarn(root: string) { return fs.existsSync(path.join(root, 'yarn.lock')); } @@ -62,7 +62,7 @@ function findDependencyPath( return dependencyPath; } -export function collectDependencies(root: string): Map { +function collectDependencies(root: string): Map { const dependencies = new Map(); const checkDependency = (dependencyPath: string) => { @@ -242,7 +242,7 @@ async function yarnSilentInstallPeerDeps(root: string) { } } -export default async function findPeerDepsForAutolinking(root: string) { +async function findPeerDepsForAutolinking(root: string) { const deps = collectDependencies(root); const nonEmptyPeers = filterNativeDependencies(root, deps); const nonInstalledPeers = filterInstalledPeers(root, nonEmptyPeers); @@ -340,7 +340,7 @@ function installMissingPackages( } } -export async function resolveTransitiveDeps() { +async function resolveTransitiveDeps() { const root = process.cwd(); const isYarn = isUsingYarn(root); @@ -367,7 +367,7 @@ export async function resolveTransitiveDeps() { return false; } -export async function resolvePodsInstallation() { +async function resolvePodsInstallation() { const {install} = await prompt({ type: 'confirm', name: 'install', @@ -383,7 +383,7 @@ export async function resolvePodsInstallation() { } } -export async function checkTransitiveDeps() { +export default async function checkTransitiveDependencies() { const packageJsonPath = path.join(process.cwd(), 'package.json'); const preInstallHash = generateFileHash(packageJsonPath); const areTransitiveDepsInstalled = await resolveTransitiveDeps(); diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index dd0c4d336..f3aad5735 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,9 +1,5 @@ import loadConfig from '@react-native-community/cli-config'; -import { - CLIError, - logger, - transitiveDeps, -} from '@react-native-community/cli-tools'; +import {CLIError, logger} from '@react-native-community/cli-tools'; import type { Command, Config, @@ -175,8 +171,6 @@ async function setupAndRun() { } } - await transitiveDeps.checkTransitiveDeps(); - let config: Config | undefined; try {