diff --git a/packages/cli/src/utils/package-manager.ts b/packages/cli/src/utils/package-manager.ts index e380bfe234..846edb6b3b 100644 --- a/packages/cli/src/utils/package-manager.ts +++ b/packages/cli/src/utils/package-manager.ts @@ -7,6 +7,7 @@ import chalk from 'chalk'; import { abort, abortIfCancelled } from './utils'; import { npm, pnpm, yarn, bun, packageManagers } from './constants'; import type { PackageManager } from '../types'; +import { isPackageInstalled } from './package-json'; /** * Detect package manager by checking if the lock file exists. @@ -28,7 +29,7 @@ export async function detectPackageManger(): Promise { return bun; default: return null; - } + } } /** @@ -37,8 +38,9 @@ export async function detectPackageManger(): Promise { export function installPackageWithPackageManager( packageManager: PackageManager, packageName: string, + flag = '' ): void { - exec(`${packageManager.installCommand} ${packageName}@latest`); + exec(`${packageManager.installCommand} ${packageName}@latest ${flag}`); } /** @@ -106,7 +108,7 @@ export async function installPackage({ } const packageManager = await getPackageManager(); - + const s = clack.spinner(); s.start( `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan( @@ -116,13 +118,44 @@ export async function installPackage({ try { installPackageWithPackageManager(packageManager, packageName); + await sleep(1000); + const installed = await isPackageInstalled() + + if(!installed) { + + s.stop(); + + const shouldUseLegacyPeerDeps = await clack.confirm({ + message: `The ${chalk.bold.cyan( + packageName, + )} package did not install, would you like to use the "--legacy-peer-deps" flag?`, + }) + + if (!shouldUseLegacyPeerDeps) { + throw new Error('Please try again or refer docs to install manually: https://million.dev/docs/install') + } + + installPackageWithPackageManager(packageManager, packageName, '--legacy-peer-deps'); + + s.start( + `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan( + packageName, + )} with ${chalk.bold(packageManager.label)} and the "--legacy-peer-deps" flag.`, + ); + + await sleep(1000); + + } + s.stop( `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan( packageName, )} with ${chalk.bold(packageManager.label)}.`, ); + + } catch (e) { clack.log.error( `${chalk.red('Error during installation.')}\n\n${chalk.dim(