diff --git a/jest/helpers.ts b/jest/helpers.ts index 4eda26e2f..1121e75b1 100644 --- a/jest/helpers.ts +++ b/jest/helpers.ts @@ -3,7 +3,7 @@ import os from 'os'; import path from 'path'; import {createDirectory} from 'jest-util'; import execa from 'execa'; -import chalk from 'chalk'; +import pico from 'picocolors'; import slash from 'slash'; const CLI_PATH = path.resolve(__dirname, '../packages/cli/build/bin.js'); @@ -121,7 +121,7 @@ function getExecaOptions(options: SpawnOptions) { const cwd = isRelative ? path.resolve(__dirname, options.cwd) : options.cwd; - let env = Object.assign({}, process.env, {FORCE_COLOR: '0'}, options.env); + let env = Object.assign({}, process.env, {NO_COLOR: 1}, options.env); if (options.nodeOptions) { env.NODE_OPTIONS = options.nodeOptions; @@ -147,12 +147,12 @@ function handleTestFailure( ) { if (!options.expectedFailure && result.exitCode !== 0) { console.log(`Running ${cmd} command failed for unexpected reason. Here's more info: -${chalk.bold('cmd:')} ${cmd} -${chalk.bold('options:')} ${JSON.stringify(options)} -${chalk.bold('args:')} ${(args || []).join(' ')} -${chalk.bold('stderr:')} ${result.stderr} -${chalk.bold('stdout:')} ${result.stdout} -${chalk.bold('exitCode:')}${result.exitCode}`); +${pico.bold('cmd:')} ${cmd} +${pico.bold('options:')} ${JSON.stringify(options)} +${pico.bold('args:')} ${(args || []).join(' ')} +${pico.bold('stderr:')} ${result.stderr} +${pico.bold('stdout:')} ${result.stdout} +${pico.bold('exitCode:')}${result.exitCode}`); } else if (options.expectedFailure && result.exitCode === 0) { throw new Error("Expected command to fail, but it didn't"); } diff --git a/package.json b/package.json index 30ff483cd..fc5eae9f8 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "@types/node": "^18.0.0", "babel-jest": "^26.6.2", "babel-plugin-module-resolver": "^3.2.0", - "chalk": "^4.1.2", "chokidar": "^3.3.1", "eslint": "^8.23.1", "eslint-import-resolver-alias": "^1.1.2", @@ -50,6 +49,7 @@ "lint-staged": "^13.1.0", "metro-memory-fs": "0.78.0", "micromatch": "^4.0.4", + "picocolors": "^1.1.1", "prettier": "2.8.8", "slash": "^3.0.0", "string-length": "^2.0.0", diff --git a/packages/cli-clean/package.json b/packages/cli-clean/package.json index dde7bec05..d80e4814b 100644 --- a/packages/cli-clean/package.json +++ b/packages/cli-clean/package.json @@ -9,9 +9,9 @@ "types": "build/index.d.ts", "dependencies": { "@react-native-community/cli-tools": "19.0.0-alpha.0", - "chalk": "^4.1.2", "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "fast-glob": "^3.3.2", + "picocolors": "^1.1.1" }, "files": [ "build", diff --git a/packages/cli-clean/src/clean.ts b/packages/cli-clean/src/clean.ts index dfc8df2c7..943a39525 100644 --- a/packages/cli-clean/src/clean.ts +++ b/packages/cli-clean/src/clean.ts @@ -1,6 +1,6 @@ import {getLoader, logger, prompt} from '@react-native-community/cli-tools'; import type {Config as CLIConfig} from '@react-native-community/cli-types'; -import chalk from 'chalk'; +import pico from 'picocolors'; import execa from 'execa'; import {existsSync as fileExists, rm} from 'fs'; import os from 'os'; @@ -62,7 +62,7 @@ async function promptForCaches( name: 'caches', message: 'Select all caches to clean', choices: Object.entries(groups).map(([cmd, group]) => ({ - title: `${cmd} ${chalk.dim(`(${group.description})`)}`, + title: `${cmd} ${pico.dim(`(${group.description})`)}`, value: cmd, selected: DEFAULT_GROUPS.includes(cmd), })), diff --git a/packages/cli-config-android/package.json b/packages/cli-config-android/package.json index 5853f1d70..cdc65b133 100644 --- a/packages/cli-config-android/package.json +++ b/packages/cli-config-android/package.json @@ -8,9 +8,9 @@ }, "dependencies": { "@react-native-community/cli-tools": "19.0.0-alpha.0", - "chalk": "^4.1.2", "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.4.1" + "fast-xml-parser": "^4.4.1", + "picocolors": "^1.1.1" }, "files": [ "build", diff --git a/packages/cli-config-android/src/config/getAndroidProject.ts b/packages/cli-config-android/src/config/getAndroidProject.ts index dc8df4506..64a099246 100644 --- a/packages/cli-config-android/src/config/getAndroidProject.ts +++ b/packages/cli-config-android/src/config/getAndroidProject.ts @@ -1,7 +1,7 @@ import {Config} from '@react-native-community/cli-types'; import {logger, CLIError} from '@react-native-community/cli-tools'; import fs from 'fs'; -import chalk from 'chalk'; +import pico from 'picocolors'; export function getAndroidProject(config: Config) { const androidProject = config.project.android; @@ -48,11 +48,11 @@ function discoverPackageName( throw new CLIError( `Failed to build the app: No package name found. - We couldn't parse the namespace from neither your build.gradle[.kts] file at ${chalk.underline.dim( - `${buildGradlePath}`, + We couldn't parse the namespace from neither your build.gradle[.kts] file at ${pico.underline( + pico.dim(`${buildGradlePath}`), )} - nor your package in the AndroidManifest at ${chalk.underline.dim( - `${manifestPath}`, + nor your package in the AndroidManifest at ${pico.underline( + pico.dim(`${manifestPath}`), )} `, ); @@ -70,10 +70,10 @@ export function getPackageName( let packageName = discoverPackageName(manifestPath, buildGradlePath); if (!validatePackageName(packageName)) { logger.warn( - `Invalid application's package name "${chalk.bgRed( + `Invalid application's package name "${pico.bgRed( packageName, - )}" in either 'AndroidManifest.xml' or 'build.gradle'. Read guidelines for setting the package name here: ${chalk.underline.dim( - 'https://developer.android.com/studio/build/application-id', + )}" in either 'AndroidManifest.xml' or 'build.gradle'. Read guidelines for setting the package name here: ${pico.underline( + pico.dim('https://developer.android.com/studio/build/application-id'), )}`, ); } diff --git a/packages/cli-config-apple/package.json b/packages/cli-config-apple/package.json index 4c4ccc7ac..76fadc701 100644 --- a/packages/cli-config-apple/package.json +++ b/packages/cli-config-apple/package.json @@ -8,9 +8,9 @@ }, "dependencies": { "@react-native-community/cli-tools": "19.0.0-alpha.0", - "chalk": "^4.1.2", "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "fast-glob": "^3.3.2", + "picocolors": "^1.1.1" }, "devDependencies": { "@react-native-community/cli-types": "19.0.0-alpha.0", diff --git a/packages/cli-config-apple/src/config/index.ts b/packages/cli-config-apple/src/config/index.ts index 96737a762..e1479c07f 100644 --- a/packages/cli-config-apple/src/config/index.ts +++ b/packages/cli-config-apple/src/config/index.ts @@ -5,8 +5,8 @@ * LICENSE file in the root directory of this source tree. * */ -import chalk from 'chalk'; import path from 'path'; +import pico from 'picocolors'; import fs from 'fs'; import findPodfilePath from './findPodfilePath'; import findXcodeProject from './findXcodeProject'; @@ -85,7 +85,7 @@ export const getDependencyConfig = } } catch { throw new CLIError( - `Failed to locate package.json file from ${chalk.underline( + `Failed to locate package.json file from ${pico.underline( folder, )}. This is most likely issue with your node_modules folder being corrupted. Please force install dependencies and try again`, ); diff --git a/packages/cli-config-apple/src/tools/installPods.ts b/packages/cli-config-apple/src/tools/installPods.ts index c9d4d1fa4..27044d0b6 100644 --- a/packages/cli-config-apple/src/tools/installPods.ts +++ b/packages/cli-config-apple/src/tools/installPods.ts @@ -1,7 +1,7 @@ import fs from 'fs'; import execa from 'execa'; import type {Ora} from 'ora'; -import chalk from 'chalk'; +import pico from 'picocolors'; import { logger, NoopLoader, @@ -26,9 +26,9 @@ async function runPodInstall(loader: Ora, options: RunPodInstallOptions) { const shouldHandleRepoUpdate = options?.shouldHandleRepoUpdate || true; try { loader.start( - `Installing CocoaPods dependencies ${chalk.bold( + `Installing CocoaPods dependencies ${pico.bold( options?.newArchEnabled ? 'with New Architecture' : '', - )} ${chalk.dim('(this may take a few minutes)')}`, + )} ${pico.dim('(this may take a few minutes)')}`, ); await execa('bundle', ['exec', 'pod', 'install'], { @@ -73,7 +73,7 @@ async function runPodInstall(loader: Ora, options: RunPodInstallOptions) { async function runPodUpdate(loader: Ora) { try { loader.start( - `Updating CocoaPods repositories ${chalk.dim( + `Updating CocoaPods repositories ${pico.dim( '(this may take a few minutes)', )}`, ); @@ -84,8 +84,8 @@ async function runPodUpdate(loader: Ora) { loader.fail(); throw new CLIError( - `Failed to update CocoaPods repositories for iOS project.\nPlease try again manually: "pod repo update".\nCocoaPods documentation: ${chalk.dim.underline( - 'https://cocoapods.org/', + `Failed to update CocoaPods repositories for iOS project.\nPlease try again manually: "pod repo update".\nCocoaPods documentation: ${pico.dim( + pico.underline('https://cocoapods.org/'), )}`, ); } @@ -117,8 +117,8 @@ async function installCocoaPods(loader: Ora) { logger.error((error as any).stderr); throw new CLIError( - `An error occured while trying to install CocoaPods, which is required by this template.\nPlease try again manually: sudo gem install cocoapods.\nCocoaPods documentation: ${chalk.dim.underline( - 'https://cocoapods.org/', + `An error occured while trying to install CocoaPods, which is required by this template.\nPlease try again manually: sudo gem install cocoapods.\nCocoaPods documentation: ${pico.dim( + pico.underline('https://cocoapods.org/'), )}`, ); } diff --git a/packages/cli-config-apple/src/tools/pods.ts b/packages/cli-config-apple/src/tools/pods.ts index 1ca5693af..76314ff89 100644 --- a/packages/cli-config-apple/src/tools/pods.ts +++ b/packages/cli-config-apple/src/tools/pods.ts @@ -1,7 +1,7 @@ import path from 'path'; import fs from 'fs-extra'; import {createHash} from 'crypto'; -import chalk from 'chalk'; +import pico from 'picocolors'; import { CLIError, cacheManager, @@ -110,7 +110,7 @@ async function install( } catch (error) { loader.fail(); throw new CLIError( - `Something when wrong while installing CocoaPods. Please run ${chalk.bold( + `Something when wrong while installing CocoaPods. Please run ${pico.bold( 'pod install', )} manually`, error as Error, @@ -206,7 +206,7 @@ export default async function resolvePods( } catch (error) { loader.fail(); throw new CLIError( - `Something when wrong while installing CocoaPods. Please run ${chalk.bold( + `Something when wrong while installing CocoaPods. Please run ${pico.bold( 'pod install', )} manually`, error as Error, diff --git a/packages/cli-config/package.json b/packages/cli-config/package.json index 402bceabb..f73653adb 100644 --- a/packages/cli-config/package.json +++ b/packages/cli-config/package.json @@ -9,11 +9,11 @@ "types": "build/index.d.ts", "dependencies": { "@react-native-community/cli-tools": "19.0.0-alpha.0", - "chalk": "^4.1.2", "cosmiconfig": "^9.0.0", "deepmerge": "^4.3.0", "fast-glob": "^3.3.2", - "joi": "^17.2.1" + "joi": "^17.2.1", + "picocolors": "^1.1.1" }, "files": [ "build", diff --git a/packages/cli-config/src/__tests__/index-test.ts b/packages/cli-config/src/__tests__/index-test.ts index 3740e8d1c..49b915e7c 100644 --- a/packages/cli-config/src/__tests__/index-test.ts +++ b/packages/cli-config/src/__tests__/index-test.ts @@ -259,7 +259,7 @@ test('should load commands from "react-native-foo" and "react-native-bar" packag }); test('should not skip packages that have invalid configuration (to avoid breaking users)', async () => { - process.env.FORCE_COLOR = '0'; // To disable chalk + process.env.NO_COLOR = '1'; // To disable colours from picocolors DIR = getTempDirectory('config_test_skip'); writeFiles(DIR, { 'node_modules/react-native/package.json': '{}', diff --git a/packages/cli-config/src/readConfigFromDisk.ts b/packages/cli-config/src/readConfigFromDisk.ts index 0a73ba47d..b972a35ec 100644 --- a/packages/cli-config/src/readConfigFromDisk.ts +++ b/packages/cli-config/src/readConfigFromDisk.ts @@ -7,7 +7,7 @@ import type { UserDependencyConfig, } from '@react-native-community/cli-types'; import {logger, inlineString} from '@react-native-community/cli-tools'; -import chalk from 'chalk'; +import pico from 'picocolors'; /** * Places to look for the configuration file. @@ -76,9 +76,9 @@ function parseDependencyConfig( const validationError = new JoiError(result.error); logger.warn( inlineString(` - Package ${chalk.bold( + Package ${pico.bold( dependencyName, - )} contains invalid configuration: ${chalk.bold( + )} contains invalid configuration: ${pico.bold( validationError.message, )}. diff --git a/packages/cli-doctor/package.json b/packages/cli-doctor/package.json index 114105e7c..6bddbf4a1 100644 --- a/packages/cli-doctor/package.json +++ b/packages/cli-doctor/package.json @@ -13,13 +13,13 @@ "@react-native-community/cli-platform-apple": "19.0.0-alpha.0", "@react-native-community/cli-platform-ios": "19.0.0-alpha.0", "@react-native-community/cli-tools": "19.0.0-alpha.0", - "chalk": "^4.1.2", "command-exists": "^1.2.8", "deepmerge": "^4.3.0", "envinfo": "^7.13.0", "execa": "^5.0.0", "node-stream-zip": "^1.9.1", "ora": "^5.4.1", + "picocolors": "^1.1.1", "semver": "^7.5.2", "wcwidth": "^1.0.1", "yaml": "^2.2.1" diff --git a/packages/cli-doctor/src/commands/doctor.ts b/packages/cli-doctor/src/commands/doctor.ts index 472768e3b..7dc3110bf 100644 --- a/packages/cli-doctor/src/commands/doctor.ts +++ b/packages/cli-doctor/src/commands/doctor.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; import {logger, getLoader, CLIError} from '@react-native-community/cli-tools'; import {getHealthchecks, HEALTHCHECK_TYPES} from '../tools/healthchecks'; import printFixOptions, {KEYS} from '../tools/printFixOptions'; @@ -18,7 +18,7 @@ const printCategory = ({label, key}: {label: string; key: number}) => { logger.log(); } - logger.log(chalk.dim(label)); + logger.log(pico.dim(label)); }; const printVersions = ({ @@ -35,16 +35,16 @@ const printVersions = ({ ? versions.join(', ') : 'N/A'; - logMessage(`- Versions found: ${chalk.red(versionsToShow)}`); - logMessage(`- Version supported: ${chalk.green(versionRange)}`); + logMessage(`- Versions found: ${pico.red(versionsToShow)}`); + logMessage(`- Version supported: ${pico.green(versionRange)}`); return; } const versionsToShow = version && version !== 'Not Found' ? version : 'N/A'; - logMessage(`- Version found: ${chalk.red(versionsToShow)}`); - logMessage(`- Version supported: ${chalk.green(versionRange)}`); + logMessage(`- Version found: ${pico.red(versionsToShow)}`); + logMessage(`- Version supported: ${pico.green(versionRange)}`); return; }; @@ -60,9 +60,9 @@ const printIssue = ({ }: HealthCheckResult) => { const symbol = needsToBeFixed ? isRequired - ? chalk.red('✖') - : chalk.yellow('●') - : chalk.green('✓'); + ? pico.red('✖') + : pico.yellow('●') + : pico.green('✓'); const descriptionToShow = description ? ` - ${description}` : ''; @@ -80,8 +80,8 @@ const printOverallStats = ({ errors: number; warnings: number; }) => { - logger.log(`\n${chalk.bold('Errors:')} ${errors}`); - logger.log(`${chalk.bold('Warnings:')} ${warnings}`); + logger.log(`\n${pico.bold('Errors:')} ${errors}`); + logger.log(`${pico.bold('Warnings:')} ${warnings}`); }; type FlagsT = { diff --git a/packages/cli-doctor/src/tools/healthchecks/androidHomeEnvVariable.ts b/packages/cli-doctor/src/tools/healthchecks/androidHomeEnvVariable.ts index 437c85206..5ca3b00b1 100644 --- a/packages/cli-doctor/src/tools/healthchecks/androidHomeEnvVariable.ts +++ b/packages/cli-doctor/src/tools/healthchecks/androidHomeEnvVariable.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; import {HealthCheckInterface} from '../../types'; // List of answers on how to set `ANDROID_HOME` for each platform @@ -16,7 +16,7 @@ const description = // for `ANDROID_HOME` for every platform NodeJS supports const platform = process.platform as 'darwin' | 'win32' | 'linux'; -const message = `Read more about how to set the ${label} at ${chalk.dim( +const message = `Read more about how to set the ${label} at ${pico.dim( URLS[platform], )}`; diff --git a/packages/cli-doctor/src/tools/healthchecks/androidNDK.ts b/packages/cli-doctor/src/tools/healthchecks/androidNDK.ts index b3809bc4a..993011b71 100644 --- a/packages/cli-doctor/src/tools/healthchecks/androidNDK.ts +++ b/packages/cli-doctor/src/tools/healthchecks/androidNDK.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; import versionRanges from '../versionRanges'; import {doesSoftwareNeedToBeFixed} from '../checkInstallation'; import {EnvironmentInfo, HealthCheckInterface} from '../../types'; @@ -29,7 +29,7 @@ export default { if (isNDKInstalled) { return logManualInstallation({ - message: `Read more about how to update Android NDK at ${chalk.dim( + message: `Read more about how to update Android NDK at ${pico.dim( 'https://developer.android.com/ndk/downloads', )}`, }); diff --git a/packages/cli-doctor/src/tools/healthchecks/androidSDK.ts b/packages/cli-doctor/src/tools/healthchecks/androidSDK.ts index 60ecafe35..44a65c98a 100644 --- a/packages/cli-doctor/src/tools/healthchecks/androidSDK.ts +++ b/packages/cli-doctor/src/tools/healthchecks/androidSDK.ts @@ -1,5 +1,5 @@ import {findProjectRoot, logger, link} from '@react-native-community/cli-tools'; -import chalk from 'chalk'; +import pico from 'picocolors'; import fs from 'fs'; import path from 'path'; import {EnvironmentInfo, HealthCheckInterface} from '../../types'; @@ -56,7 +56,7 @@ const getBuildToolsVersion = (projectRoot = ''): string => { return buildToolsVersion || 'Not Found'; }; -const installMessage = `Read more about how to update Android SDK at ${chalk.dim( +const installMessage = `Read more about how to update Android SDK at ${pico.dim( 'https://developer.android.com/studio', )}`; diff --git a/packages/cli-doctor/src/tools/healthchecks/common.ts b/packages/cli-doctor/src/tools/healthchecks/common.ts index 9bd1647d3..1a352263a 100644 --- a/packages/cli-doctor/src/tools/healthchecks/common.ts +++ b/packages/cli-doctor/src/tools/healthchecks/common.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; import readline from 'readline'; import wcwidth from 'wcwidth'; import util from 'util'; @@ -39,8 +39,8 @@ const logManualInstallation = ({ if (url) { logMessage( - `Read more about how to download ${healthcheck} at ${chalk.dim.underline( - url, + `Read more about how to download ${healthcheck} at ${pico.dim( + pico.underline(url), )}`, ); @@ -49,7 +49,7 @@ const logManualInstallation = ({ if (command) { logMessage( - `Please install ${healthcheck} by running ${chalk.bold(command)}`, + `Please install ${healthcheck} by running ${pico.bold(command)}`, ); } }; @@ -73,7 +73,7 @@ const logError = ({ addBlankLine(); - logMessage(chalk.dim(error.message)); + logMessage(pico.dim(error.message)); if (message) { logMessage(message); @@ -83,7 +83,7 @@ const logError = ({ } logMessage( - `The error above occured while trying to install ${healthcheck}. Please try again manually: ${chalk.bold( + `The error above occured while trying to install ${healthcheck}. Please try again manually: ${pico.bold( command, )}`, ); diff --git a/packages/cli-doctor/src/tools/healthchecks/ruby.ts b/packages/cli-doctor/src/tools/healthchecks/ruby.ts index 44d023fcb..b35dd60af 100644 --- a/packages/cli-doctor/src/tools/healthchecks/ruby.ts +++ b/packages/cli-doctor/src/tools/healthchecks/ruby.ts @@ -1,5 +1,5 @@ import execa from 'execa'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {logger, findProjectRoot, link} from '@react-native-community/cli-tools'; @@ -154,9 +154,9 @@ export default { description: 'Cannot find a working copy of Ruby.', }; case output.NO_GEMFILE: - fallbackResult.description = `Could not find the project ${chalk.bold( + fallbackResult.description = `Could not find the project ${pico.bold( 'Gemfile', - )} in your project folder (${chalk.dim( + )} in your project folder (${pico.dim( projectRoot, )}), guessed using my built-in version.`; break; diff --git a/packages/cli-doctor/src/tools/printFixOptions.ts b/packages/cli-doctor/src/tools/printFixOptions.ts index 8ff98bb07..d5f00504e 100644 --- a/packages/cli-doctor/src/tools/printFixOptions.ts +++ b/packages/cli-doctor/src/tools/printFixOptions.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; import {logger} from '@react-native-community/cli-tools'; const KEYS = { @@ -11,23 +11,23 @@ const KEYS = { const printOption = (option: string) => logger.log(` \u203A ${option}`); const printOptions = () => { logger.log(); - logger.log(chalk.bold('Usage')); + logger.log(pico.bold('Usage')); printOption( - `${chalk.dim('Press')} ${KEYS.FIX_ALL_ISSUES} ${chalk.dim( + `${pico.dim('Press')} ${KEYS.FIX_ALL_ISSUES} ${pico.dim( 'to try to fix issues.', )}`, ); printOption( - `${chalk.dim('Press')} ${KEYS.FIX_ERRORS} ${chalk.dim( + `${pico.dim('Press')} ${KEYS.FIX_ERRORS} ${pico.dim( 'to try to fix errors.', )}`, ); printOption( - `${chalk.dim('Press')} ${KEYS.FIX_WARNINGS} ${chalk.dim( + `${pico.dim('Press')} ${KEYS.FIX_WARNINGS} ${pico.dim( 'to try to fix warnings.', )}`, ); - printOption(`${chalk.dim('Press')} Enter ${chalk.dim('to exit.')}`); + printOption(`${pico.dim('Press')} Enter ${pico.dim('to exit.')}`); }; export {KEYS}; diff --git a/packages/cli-doctor/src/tools/runAutomaticFix.ts b/packages/cli-doctor/src/tools/runAutomaticFix.ts index ec71f4b61..71fbd2463 100644 --- a/packages/cli-doctor/src/tools/runAutomaticFix.ts +++ b/packages/cli-doctor/src/tools/runAutomaticFix.ts @@ -1,6 +1,6 @@ import {getLoader, logger} from '@react-native-community/cli-tools'; import type {Config} from '@react-native-community/cli-types'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {EnvironmentInfo, HealthCheckCategoryResult, Loader} from '../types'; import {HEALTHCHECK_TYPES} from './healthchecks'; import {logManualInstallation} from './healthchecks/common'; @@ -44,7 +44,7 @@ export default async function ({ const issuesCount = totalIssuesBasedOnFixLevel[automaticFixLevel]; logger.log( - `\nAttempting to fix ${chalk.bold(issuesCount.toString())} issue${ + `\nAttempting to fix ${pico.bold(issuesCount.toString())} issue${ issuesCount > 1 ? 's' : '' }...`, ); @@ -76,7 +76,7 @@ export default async function ({ continue; } - logger.log(`\n${chalk.dim(category.label)}`); + logger.log(`\n${pico.dim(category.label)}`); for (const healthcheckToRun of healthchecksToRun) { const spinner = getLoader({ diff --git a/packages/cli-link-assets/package.json b/packages/cli-link-assets/package.json index e7948b944..3ec6a72c1 100644 --- a/packages/cli-link-assets/package.json +++ b/packages/cli-link-assets/package.json @@ -13,10 +13,10 @@ "@react-native-community/cli-platform-apple": "19.0.0-alpha.0", "@react-native-community/cli-platform-ios": "19.0.0-alpha.0", "@react-native-community/cli-tools": "19.0.0-alpha.0", - "chalk": "^4.1.2", "fast-glob": "^3.3.2", "fast-xml-parser": "^4.4.1", "opentype.js": "^1.3.4", + "picocolors": "^1.1.1", "plist": "^3.1.0", "xcode": "^3.0.1" }, diff --git a/packages/cli-link-assets/src/linkAssets.ts b/packages/cli-link-assets/src/linkAssets.ts index 5669759b0..d2e10709a 100644 --- a/packages/cli-link-assets/src/linkAssets.ts +++ b/packages/cli-link-assets/src/linkAssets.ts @@ -8,9 +8,9 @@ import { logger, } from '@react-native-community/cli-tools'; import type {Config as CLIConfig} from '@react-native-community/cli-types'; -import chalk from 'chalk'; import fs from 'fs'; import path from 'path'; +import pico from 'picocolors'; import {audioTypes, fontTypes, imageTypes} from './fileTypes'; import cleanAndroidAssets from './tools/cleanAssets/android'; import cleanIOSAssets from './tools/cleanAssets/ios'; @@ -207,12 +207,12 @@ async function linkAssets(_argv: string[], ctx: CLIConfig): Promise { ) { logger.info( inlineString( - `It looks like you haven't configured your assets paths in ${chalk.bold( + `It looks like you haven't configured your assets paths in ${pico.bold( 'react-native.config.js', )} file. - To can learn more about ${chalk.bold( + To can learn more about ${pico.bold( 'link-assets', - )} command visit: ${chalk.underline( + )} command visit: ${pico.underline( 'https://github.com/react-native-community/cli/blob/main/packages/cli-link-assets/README.md', )}`, ), diff --git a/packages/cli-platform-android/package.json b/packages/cli-platform-android/package.json index 578d8261c..892d1c8be 100644 --- a/packages/cli-platform-android/package.json +++ b/packages/cli-platform-android/package.json @@ -9,9 +9,9 @@ "dependencies": { "@react-native-community/cli-config-android": "19.0.0-alpha.0", "@react-native-community/cli-tools": "19.0.0-alpha.0", - "chalk": "^4.1.2", "execa": "^5.0.0", - "logkitty": "^0.7.1" + "logkitty": "^0.7.1", + "picocolors": "^1.1.1" }, "files": [ "build", diff --git a/packages/cli-platform-android/src/commands/runAndroid/__tests__/listAndroidTasks.test.ts b/packages/cli-platform-android/src/commands/runAndroid/__tests__/listAndroidTasks.test.ts index 33dde75a0..5b6caa581 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/__tests__/listAndroidTasks.test.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/__tests__/listAndroidTasks.test.ts @@ -1,5 +1,5 @@ -import chalk from 'chalk'; import execa from 'execa'; +import pico from 'picocolors'; import prompts from 'prompts'; import { parseTasksFromGradleFile, @@ -117,7 +117,7 @@ describe('promptForTaskSelection', () => { expect(promptSpy).toHaveBeenCalledWith({ choices: tasksList.map((t) => ({ - title: `${chalk.bold(t.task)} - ${t.description}`, + title: `${pico.bold(t.task)} - ${t.description}`, value: t.task, })), message: 'Select install task you want to perform', diff --git a/packages/cli-platform-android/src/commands/runAndroid/index.ts b/packages/cli-platform-android/src/commands/runAndroid/index.ts index 1dee5d152..3961954c9 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/index.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/index.ts @@ -24,8 +24,8 @@ import { import {getAndroidProject} from '@react-native-community/cli-config-android'; import listAndroidDevices from './listAndroidDevices'; import tryLaunchEmulator from './tryLaunchEmulator'; -import chalk from 'chalk'; import path from 'path'; +import pico from 'picocolors'; import {build, BuildFlags, options} from '../buildAndroid'; import {promptForTaskSelection} from './listAndroidTasks'; import {getTaskNames} from './getTaskNames'; @@ -199,7 +199,7 @@ async function buildAndRun(args: Flags, androidProject: AndroidProject) { ); } throw new CLIError( - `Failed to launch emulator. Reason: ${chalk.dim(result.error || '')}`, + `Failed to launch emulator. Reason: ${pico.dim(result.error || '')}`, ); } diff --git a/packages/cli-platform-android/src/commands/runAndroid/listAndroidDevices.ts b/packages/cli-platform-android/src/commands/runAndroid/listAndroidDevices.ts index 952e1b839..8d1266d3c 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/listAndroidDevices.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/listAndroidDevices.ts @@ -4,7 +4,7 @@ import getAdbPath from './getAdbPath'; import {getEmulators} from './tryLaunchEmulator'; import {toPascalCase} from './toPascalCase'; import os from 'os'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {CLIError, prompt} from '@react-native-community/cli-tools'; type DeviceData = { @@ -60,7 +60,7 @@ async function promptForDeviceSelection( name: 'device', message: 'Select the device / emulator you want to use', choices: allDevices.map((d) => ({ - title: `${chalk.bold(`${toPascalCase(d.type)}`)} ${chalk.green( + title: `${pico.bold(`${toPascalCase(d.type)}`)} ${pico.green( `${d.readableName}`, )} (${d.connected ? 'connected' : 'disconnected'})`, value: d, diff --git a/packages/cli-platform-android/src/commands/runAndroid/listAndroidTasks.ts b/packages/cli-platform-android/src/commands/runAndroid/listAndroidTasks.ts index 983b080b7..806056a41 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/listAndroidTasks.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/listAndroidTasks.ts @@ -1,6 +1,6 @@ import {CLIError, getLoader, prompt} from '@react-native-community/cli-tools'; -import chalk from 'chalk'; import execa from 'execa'; +import pico from 'picocolors'; type GradleTask = { task: string; @@ -59,7 +59,7 @@ export const promptForTaskSelection = async ( name: 'task', message: `Select ${taskType} task you want to perform`, choices: tasks.map((t: GradleTask) => ({ - title: `${chalk.bold(t.task)} - ${t.description}`, + title: `${pico.bold(t.task)} - ${t.description}`, value: t.task, })), min: 1, diff --git a/packages/cli-platform-android/src/commands/runAndroid/runOnAllDevices.ts b/packages/cli-platform-android/src/commands/runAndroid/runOnAllDevices.ts index b18348c76..4c05befc9 100644 --- a/packages/cli-platform-android/src/commands/runAndroid/runOnAllDevices.ts +++ b/packages/cli-platform-android/src/commands/runAndroid/runOnAllDevices.ts @@ -6,8 +6,8 @@ * */ -import chalk from 'chalk'; import execa from 'execa'; +import pico from 'picocolors'; import {Config} from '@react-native-community/cli-types'; import { link, @@ -40,7 +40,7 @@ async function runOnAllDevices( devices = adb.getDevices(adbPath); } else { logger.error( - `Failed to launch emulator. Reason: ${chalk.dim(result.error || '')}.`, + `Failed to launch emulator. Reason: ${pico.dim(result.error || '')}.`, ); logger.warn( 'Please launch an emulator manually or connect a device. Otherwise app may fail to launch.', @@ -124,15 +124,17 @@ function createInstallError(error: Error & {stderr: string}) { stderr.includes('licences have not been accepted') || stderr.includes('accept the SDK license') ) { - message = `Please accept all necessary Android SDK licenses using Android SDK Manager: "${chalk.bold( + message = `Please accept all necessary Android SDK licenses using Android SDK Manager: "${pico.bold( '$ANDROID_HOME/tools/bin/sdkmanager --licenses', )}."`; } else if (stderr.includes('requires Java')) { - message = `Looks like your Android environment is not properly set. Please go to ${chalk.dim.underline( - link.docs('environment-setup', 'android', { - hash: 'jdk-studio', - guide: 'native', - }), + message = `Looks like your Android environment is not properly set. Please go to ${pico.dim( + pico.underline( + link.docs('environment-setup', 'android', { + hash: 'jdk-studio', + guide: 'native', + }), + ), )} and follow the React Native CLI QuickStart guide to install the compatible version of JDK.`; } else { message = error.message; diff --git a/packages/cli-platform-apple/package.json b/packages/cli-platform-apple/package.json index fe6b280ed..52d4550a7 100644 --- a/packages/cli-platform-apple/package.json +++ b/packages/cli-platform-apple/package.json @@ -9,9 +9,9 @@ "dependencies": { "@react-native-community/cli-config-apple": "19.0.0-alpha.0", "@react-native-community/cli-tools": "19.0.0-alpha.0", - "chalk": "^4.1.2", "execa": "^5.0.0", - "fast-xml-parser": "^4.4.1" + "fast-xml-parser": "^4.4.1", + "picocolors": "^1.1.1" }, "devDependencies": { "@react-native-community/cli-types": "19.0.0-alpha.0" diff --git a/packages/cli-platform-apple/src/commands/buildCommand/buildProject.ts b/packages/cli-platform-apple/src/commands/buildCommand/buildProject.ts index 4f68b6215..8d73f1874 100644 --- a/packages/cli-platform-apple/src/commands/buildCommand/buildProject.ts +++ b/packages/cli-platform-apple/src/commands/buildCommand/buildProject.ts @@ -2,7 +2,7 @@ import child_process, { ChildProcess, SpawnOptionsWithoutStdio, } from 'child_process'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {IOSProjectInfo} from '@react-native-community/cli-types'; import { logger, @@ -76,7 +76,7 @@ export function buildProject( const loader = getLoader(); logger.info( - `Building ${chalk.dim( + `Building ${pico.dim( `(using "xcodebuild ${xcodebuildArgs.join(' ')}")`, )}`, ); diff --git a/packages/cli-platform-apple/src/commands/buildCommand/getConfiguration.ts b/packages/cli-platform-apple/src/commands/buildCommand/getConfiguration.ts index 2a2079e83..3f1286162 100644 --- a/packages/cli-platform-apple/src/commands/buildCommand/getConfiguration.ts +++ b/packages/cli-platform-apple/src/commands/buildCommand/getConfiguration.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; import type {IOSProjectInfo} from '@react-native-community/cli-types'; import {logger} from '@react-native-community/cli-tools'; import {selectFromInteractiveMode} from '../../tools/selectFromInteractiveMode'; @@ -32,9 +32,9 @@ export async function getConfiguration( if (info?.schemes?.includes(fallbackScheme)) { logger.warn( - `Scheme "${chalk.bold( + `Scheme "${pico.bold( scheme, - )}" doesn't exist. Using fallback scheme "${chalk.bold( + )}" doesn't exist. Using fallback scheme "${pico.bold( fallbackScheme, )}"`, ); @@ -66,7 +66,7 @@ export async function getConfiguration( logger.info( `Found Xcode ${ xcodeProject.isWorkspace ? 'workspace' : 'project' - } "${chalk.bold(xcodeProject.name)}"`, + } "${pico.bold(xcodeProject.name)}"`, ); return {scheme, mode}; diff --git a/packages/cli-platform-apple/src/commands/runCommand/createRun.ts b/packages/cli-platform-apple/src/commands/runCommand/createRun.ts index a8ab42f67..9f49f665c 100644 --- a/packages/cli-platform-apple/src/commands/runCommand/createRun.ts +++ b/packages/cli-platform-apple/src/commands/runCommand/createRun.ts @@ -6,9 +6,9 @@ * */ -import path from 'path'; import fs from 'fs'; -import chalk from 'chalk'; +import path from 'path'; +import pico from 'picocolors'; import {Config, IOSProjectConfig} from '@react-native-community/cli-types'; import { logger, @@ -313,7 +313,7 @@ const createRun = const device = devices.find((d) => d.udid === args.udid); if (!device) { return logger.error( - `Could not find a device with udid: "${chalk.bold( + `Could not find a device with udid: "${pico.bold( args.udid, )}". ${printFoundDevices(devices)}`, ); @@ -344,8 +344,8 @@ const createRun = const deviceByUdid = devices.find((d) => d.udid === args.device); if (!deviceByUdid) { return logger.error( - `Could not find a physical device with name or unique device identifier: "${chalk.bold( - args.device, + `Could not find a physical device with name or unique device identifier: "${pico.bold( + typeof args.device === 'string' ? args.device : 'true', )}". ${printFoundDevices(devices, 'device')}`, ); } @@ -354,8 +354,8 @@ const createRun = if (deviceByUdid.type === 'simulator') { return logger.error( - `The device with udid: "${chalk.bold( - args.device, + `The device with udid: "${pico.bold( + typeof args.device === 'string' ? args.device : 'true', )}" is a simulator. If you want to run on a simulator, use the "--simulator" flag instead.`, ); } diff --git a/packages/cli-platform-apple/src/commands/runCommand/getBuildSettings.ts b/packages/cli-platform-apple/src/commands/runCommand/getBuildSettings.ts index 923c9d277..7bc546f65 100644 --- a/packages/cli-platform-apple/src/commands/runCommand/getBuildSettings.ts +++ b/packages/cli-platform-apple/src/commands/runCommand/getBuildSettings.ts @@ -1,6 +1,6 @@ import {CLIError, logger} from '@react-native-community/cli-tools'; import {IOSProjectInfo} from '@react-native-community/cli-types'; -import chalk from 'chalk'; +import pico from 'picocolors'; import child_process from 'child_process'; export type BuildSettings = { @@ -45,9 +45,9 @@ export async function getBuildSettings( if (target) { if (!targets.includes(target)) { logger.info( - `Target ${chalk.bold(target)} not found for scheme ${chalk.bold( + `Target ${pico.bold(target)} not found for scheme ${pico.bold( scheme, - )}, automatically selected target ${chalk.bold(selectedTarget)}`, + )}, automatically selected target ${pico.bold(selectedTarget)}`, ); } else { selectedTarget = target; diff --git a/packages/cli-platform-apple/src/commands/runCommand/installApp.ts b/packages/cli-platform-apple/src/commands/runCommand/installApp.ts index f7611fbf7..810cef4fe 100644 --- a/packages/cli-platform-apple/src/commands/runCommand/installApp.ts +++ b/packages/cli-platform-apple/src/commands/runCommand/installApp.ts @@ -1,7 +1,7 @@ import child_process from 'child_process'; import {CLIError, logger} from '@react-native-community/cli-tools'; import {IOSProjectInfo} from '@react-native-community/cli-types'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {getBuildPath} from './getBuildPath'; import {getBuildSettings} from './getBuildSettings'; import path from 'path'; @@ -71,7 +71,7 @@ export default async function installApp({ throw new CLIError('Failed to get target build directory.'); } - logger.info(`Installing "${chalk.bold(appPath)}`); + logger.info(`Installing "${pico.bold(appPath)}`); if (udid && appPath) { const installParameters = isSimulator @@ -95,7 +95,7 @@ export default async function installApp({ ) .trim(); - logger.info(`Launching "${chalk.bold(bundleID)}"`); + logger.info(`Launching "${pico.bold(bundleID)}"`); const launchParameters = isSimulator ? ['simctl', 'launch', udid, bundleID] diff --git a/packages/cli-platform-apple/src/commands/runCommand/matchingDevice.ts b/packages/cli-platform-apple/src/commands/runCommand/matchingDevice.ts index 39f734179..0ad8c04f3 100644 --- a/packages/cli-platform-apple/src/commands/runCommand/matchingDevice.ts +++ b/packages/cli-platform-apple/src/commands/runCommand/matchingDevice.ts @@ -1,5 +1,5 @@ import {logger} from '@react-native-community/cli-tools'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {Device, DeviceType} from '../../types'; export function matchingDevice( @@ -11,7 +11,7 @@ export function matchingDevice( const firstIOSDevice = devices.find((d) => d.type === 'device')!; if (firstIOSDevice) { logger.info( - `Using first available device named "${chalk.bold( + `Using first available device named "${pico.bold( firstIOSDevice.name, )}" due to lack of name supplied.`, ); diff --git a/packages/cli-platform-apple/src/commands/runCommand/openApp.ts b/packages/cli-platform-apple/src/commands/runCommand/openApp.ts index 73ed25188..c24e87d04 100644 --- a/packages/cli-platform-apple/src/commands/runCommand/openApp.ts +++ b/packages/cli-platform-apple/src/commands/runCommand/openApp.ts @@ -1,6 +1,6 @@ import {CLIError, logger} from '@react-native-community/cli-tools'; import {IOSProjectInfo} from '@react-native-community/cli-types'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {getBuildPath} from './getBuildPath'; import {getBuildSettings} from './getBuildSettings'; import execa from 'execa'; @@ -40,7 +40,7 @@ export default async function openApp({ appPath = await getBuildPath(buildSettings, 'macos'); } - logger.info(`Opening "${chalk.bold(appPath)}"`); + logger.info(`Opening "${pico.bold(appPath)}"`); try { await execa(`open ${appPath}`); diff --git a/packages/cli-platform-apple/src/tools/__tests__/getBuildConfigurationFromXcScheme.test.ts b/packages/cli-platform-apple/src/tools/__tests__/getBuildConfigurationFromXcScheme.test.ts index 94ff66291..d61d214d7 100644 --- a/packages/cli-platform-apple/src/tools/__tests__/getBuildConfigurationFromXcScheme.test.ts +++ b/packages/cli-platform-apple/src/tools/__tests__/getBuildConfigurationFromXcScheme.test.ts @@ -48,7 +48,7 @@ describe('getBuildConfigurationFromXcScheme', () => { }); it('throws CLIError when reading the shared scheme file fails', () => { - process.env.FORCE_COLOR = '0'; // To disable chalk + process.env.NO_COLOR = '1'; // To disable colours from picocolors (fs.readdirSync as jest.Mock).mockReturnValue(['Test.xcodeproj']); (fs.readFileSync as jest.Mock).mockImplementation(() => { throw new Error('File not found'); diff --git a/packages/cli-platform-apple/src/tools/getBuildConfigurationFromXcScheme.ts b/packages/cli-platform-apple/src/tools/getBuildConfigurationFromXcScheme.ts index f7976adb0..b740db868 100644 --- a/packages/cli-platform-apple/src/tools/getBuildConfigurationFromXcScheme.ts +++ b/packages/cli-platform-apple/src/tools/getBuildConfigurationFromXcScheme.ts @@ -1,5 +1,5 @@ import {CLIError} from '@react-native-community/cli-tools'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {XMLParser} from 'fast-xml-parser'; import fs from 'fs'; import path from 'path'; @@ -41,7 +41,7 @@ export function getBuildConfigurationFromXcScheme( } catch { const projectSchemes = projectInfo?.schemes && projectInfo.schemes.length > 0 - ? `${projectInfo.schemes.map((name) => chalk.bold(name)).join(', ')}` + ? `${projectInfo.schemes.map((name) => pico.bold(name)).join(', ')}` : 'No schemes'; throw new CLIError( diff --git a/packages/cli-platform-apple/src/tools/prompts.ts b/packages/cli-platform-apple/src/tools/prompts.ts index b0dbf477c..73fc8086c 100644 --- a/packages/cli-platform-apple/src/tools/prompts.ts +++ b/packages/cli-platform-apple/src/tools/prompts.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; import {Device} from '../types'; import {prompt} from '@react-native-community/cli-tools'; @@ -50,11 +50,11 @@ export async function promptForDeviceSelection( .map((d) => { const availability = !d.isAvailable && !!d.availabilityError - ? chalk.red(`(unavailable - ${d.availabilityError})`) + ? pico.red(`(unavailable - ${d.availabilityError})`) : ''; return { - title: `${chalk.bold( + title: `${pico.bold( `${d.name}${getVersionFromDevice(d)}`, )} ${availability}`, value: d, diff --git a/packages/cli-platform-apple/src/tools/selectFromInteractiveMode.ts b/packages/cli-platform-apple/src/tools/selectFromInteractiveMode.ts index 7cc348f4c..dd4d9e289 100644 --- a/packages/cli-platform-apple/src/tools/selectFromInteractiveMode.ts +++ b/packages/cli-platform-apple/src/tools/selectFromInteractiveMode.ts @@ -1,5 +1,5 @@ import {logger} from '@react-native-community/cli-tools'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {IosInfo} from '../types'; import { promptForConfigurationSelection, @@ -24,14 +24,14 @@ export async function selectFromInteractiveMode({ if (schemes && schemes.length > 1) { newScheme = await promptForSchemeSelection(schemes); } else { - logger.info(`Automatically selected ${chalk.bold(scheme)} scheme.`); + logger.info(`Automatically selected ${pico.bold(scheme)} scheme.`); } const configurations = info?.configurations; if (configurations && configurations.length > 1) { newMode = await promptForConfigurationSelection(configurations); } else { - logger.info(`Automatically selected ${chalk.bold(mode)} configuration.`); + logger.info(`Automatically selected ${pico.bold(mode)} configuration.`); } return { diff --git a/packages/cli-tools/package.json b/packages/cli-tools/package.json index 34caa6775..ceb44f2b6 100644 --- a/packages/cli-tools/package.json +++ b/packages/cli-tools/package.json @@ -9,12 +9,12 @@ "dependencies": { "@vscode/sudo-prompt": "^9.0.0", "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", "execa": "^5.0.0", "find-up": "^5.0.0", "launch-editor": "^2.9.1", "mime": "^2.4.1", "ora": "^5.4.1", + "picocolors": "^1.1.1", "prompts": "^2.4.2", "semver": "^7.5.2" }, diff --git a/packages/cli-tools/src/cacheManager.ts b/packages/cli-tools/src/cacheManager.ts index dbcf48afe..ce3043fe0 100644 --- a/packages/cli-tools/src/cacheManager.ts +++ b/packages/cli-tools/src/cacheManager.ts @@ -2,7 +2,7 @@ import path from 'path'; import fs from 'fs'; import os from 'os'; import appDirs from 'appdirsjs'; -import chalk from 'chalk'; +import pico from 'picocolors'; import logger from './logger'; type CacheKey = @@ -66,7 +66,7 @@ function removeProjectCache(name: string) { } } catch { logger.error( - `Failed to remove cache for ${name}. If you experience any issues when running freshly initialized project, please remove the "${chalk.underline( + `Failed to remove cache for ${name}. If you experience any issues when running freshly initialized project, please remove the "${pico.underline( path.join(cacheRootPath, name), )}" folder manually.`, ); diff --git a/packages/cli-tools/src/logger.ts b/packages/cli-tools/src/logger.ts index a7165acdc..f1efe76e9 100644 --- a/packages/cli-tools/src/logger.ts +++ b/packages/cli-tools/src/logger.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; const SEPARATOR = ', '; @@ -7,35 +7,41 @@ let disabled = false; let hidden = false; const formatMessages = (messages: Array) => - chalk.reset(messages.join(SEPARATOR)); + pico.reset(messages.join(SEPARATOR)); const success = (...messages: Array) => { if (!disabled) { - console.log(`${chalk.green.bold('success')} ${formatMessages(messages)}`); + console.log( + `${pico.green(pico.bold('success'))} ${formatMessages(messages)}`, + ); } }; const info = (...messages: Array) => { if (!disabled) { - console.log(`${chalk.cyan.bold('info')} ${formatMessages(messages)}`); + console.log(`${pico.cyan(pico.bold('info'))} ${formatMessages(messages)}`); } }; const warn = (...messages: Array) => { if (!disabled) { - console.warn(`${chalk.yellow.bold('warn')} ${formatMessages(messages)}`); + console.warn( + `${pico.yellow(pico.bold('warn'))} ${formatMessages(messages)}`, + ); } }; const error = (...messages: Array) => { if (!disabled) { - console.error(`${chalk.red.bold('error')} ${formatMessages(messages)}`); + console.error( + `${pico.red(pico.bold('error'))} ${formatMessages(messages)}`, + ); } }; const debug = (...messages: Array) => { if (verbose && !disabled) { - console.log(`${chalk.gray.bold('debug')} ${formatMessages(messages)}`); + console.log(`${pico.gray(pico.bold('debug'))} ${formatMessages(messages)}`); } else { hidden = true; } diff --git a/packages/cli-tools/src/printRunDoctorTip.ts b/packages/cli-tools/src/printRunDoctorTip.ts index 0158d4adf..75258e14d 100644 --- a/packages/cli-tools/src/printRunDoctorTip.ts +++ b/packages/cli-tools/src/printRunDoctorTip.ts @@ -1,5 +1,5 @@ import logger from './logger'; -import chalk from 'chalk'; +import pico from 'picocolors'; const printRunDoctorTip = () => { const linkToDocs = @@ -7,10 +7,10 @@ const printRunDoctorTip = () => { logger.log(''); logger.info( - chalk.dim( - `${chalk.dim( + pico.dim( + `${pico.dim( '💡 Tip: Make sure that you have set up your development environment correctly, by running', - )} ${chalk.reset(chalk.bold('npx react-native doctor'))}. ${chalk.dim( + )} ${pico.reset(pico.bold('npx react-native doctor'))}. ${pico.dim( `To read more about doctor command visit: ${linkToDocs} \n`, )}`, ), diff --git a/packages/cli-tools/src/releaseChecker/printNewRelease.ts b/packages/cli-tools/src/releaseChecker/printNewRelease.ts index b6a014703..4f961096e 100644 --- a/packages/cli-tools/src/releaseChecker/printNewRelease.ts +++ b/packages/cli-tools/src/releaseChecker/printNewRelease.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; import * as link from '../doclink'; @@ -17,11 +17,13 @@ export default function printNewRelease( logger.info( `React Native v${latestRelease.stable} is now available (your project is running on v${currentVersion}).`, ); - logger.info(`Changelog: ${chalk.dim.underline(latestRelease.changelogUrl)}`); - logger.info(`Diff: ${chalk.dim.underline(latestRelease.diffUrl)}`); logger.info( - `For more info, check out "${chalk.dim.underline( - link.docs('upgrading', 'none'), + `Changelog: ${pico.dim(pico.underline(latestRelease.changelogUrl))}`, + ); + logger.info(`Diff: ${pico.dim(pico.underline(latestRelease.diffUrl))}`); + logger.info( + `For more info, check out "${pico.dim( + pico.underline(link.docs('upgrading', 'none')), )}".`, ); diff --git a/packages/cli-tools/src/startServerInNewWindow.ts b/packages/cli-tools/src/startServerInNewWindow.ts index 5920c88b7..6a2180f1c 100644 --- a/packages/cli-tools/src/startServerInNewWindow.ts +++ b/packages/cli-tools/src/startServerInNewWindow.ts @@ -2,12 +2,12 @@ import path from 'path'; import fs from 'fs'; import execa from 'execa'; import logger from './logger'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {findPackageDependencyDir} from './findPackageDependencyDir'; -const ERROR = `a dev server manually by running ${chalk.bold( +const ERROR = `a dev server manually by running ${pico.bold( 'npm start', -)} or ${chalk.bold('yarn start')} in other terminal window.`; +)} or ${pico.bold('yarn start')} in other terminal window.`; function startServerInNewWindow( port: number, diff --git a/packages/cli/package.json b/packages/cli/package.json index d71a51b9e..bcba47ebd 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -30,13 +30,13 @@ "@react-native-community/cli-server-api": "19.0.0-alpha.0", "@react-native-community/cli-tools": "19.0.0-alpha.0", "@react-native-community/cli-types": "19.0.0-alpha.0", - "chalk": "^4.1.2", "commander": "^9.4.1", "deepmerge": "^4.3.0", "execa": "^5.0.0", "find-up": "^5.0.0", "fs-extra": "^8.1.0", "graceful-fs": "^4.1.3", + "picocolors": "^1.1.1", "prompts": "^2.4.2", "semver": "^7.5.2" }, diff --git a/packages/cli/src/bin.ts b/packages/cli/src/bin.ts index 4285bcec6..365a5bf7f 100755 --- a/packages/cli/src/bin.ts +++ b/packages/cli/src/bin.ts @@ -2,7 +2,7 @@ import './tools/gracefulifyFs'; import semver from 'semver'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {versionRanges} from '@react-native-community/cli-doctor'; if (semver.satisfies(process.version, versionRanges.NODE_JS)) { @@ -10,7 +10,7 @@ if (semver.satisfies(process.version, versionRanges.NODE_JS)) { run(); } else { console.error( - `${chalk.red( + `${pico.red( `React Native needs Node.js ${versionRanges.NODE_JS}. You're currently on version ${process.version}. Please upgrade Node.js to a supported version and try again.`, )}`, ); diff --git a/packages/cli/src/commands/init/banner.ts b/packages/cli/src/commands/init/banner.ts index 8de355100..c1b20923c 100644 --- a/packages/cli/src/commands/init/banner.ts +++ b/packages/cli/src/commands/init/banner.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pico from 'picocolors'; const reactLogoArray = [ ' ', @@ -40,9 +40,9 @@ const learnOnceMessage = ' Learn once, write anywhere '; export default function banner(reactNativeVersion?: string) { - return `${chalk.cyan(reactLogoArray.join('\n'))} + return `${pico.cyan(reactLogoArray.join('\n'))} -${chalk.cyanBright.bold(getWelcomeMessage(reactNativeVersion))} -${chalk.dim(learnOnceMessage)} +${pico.cyanBright(pico.bold(getWelcomeMessage(reactNativeVersion)))} +${pico.dim(learnOnceMessage)} `; } diff --git a/packages/cli/src/commands/init/init.ts b/packages/cli/src/commands/init/init.ts index 87c49f890..66301d352 100644 --- a/packages/cli/src/commands/init/init.ts +++ b/packages/cli/src/commands/init/init.ts @@ -2,7 +2,7 @@ import os from 'os'; import path from 'path'; import fs, {readdirSync} from 'fs-extra'; import {validateProjectName} from './validate'; -import chalk from 'chalk'; +import pico from 'picocolors'; import printRunInstructions from './printRunInstructions'; import { CLIError, @@ -121,7 +121,7 @@ async function setProjectDirectory( const conflicts = getConflictsForDirectory(directory); if (conflicts.length > 0) { - let warnMessage = `The directory ${chalk.bold( + let warnMessage = `The directory ${pico.bold( directory, )} contains files that will be overwritten:\n`; @@ -300,8 +300,8 @@ async function createFromTemplate({ const {installCocoapods} = await prompt({ type: 'confirm', name: 'installCocoapods', - message: `Do you want to install CocoaPods now? ${chalk.reset.dim( - 'Needed for running iOS project', + message: `Do you want to install CocoaPods now? ${pico.reset( + pico.dim('Needed for running iOS project'), )}`, }); didInstallPods = installCocoapods; @@ -479,7 +479,7 @@ export default (async function initialize( const semverVersion = semver.coerce(version)?.version ?? version; if (semver.gte(semverVersion, TEMPLATE_COMMUNITY_REACT_NATIVE_VERSION)) { logger.warn( - `Use ${chalk.bold('--template')} and ${chalk.bold( + `Use ${pico.bold('--template')} and ${pico.bold( '--version', )} only if you know what you're doing. Here be dragons 🐉.`, ); diff --git a/packages/cli/src/commands/init/printRunInstructions.ts b/packages/cli/src/commands/init/printRunInstructions.ts index 1a13a19c2..e25ed6c49 100644 --- a/packages/cli/src/commands/init/printRunInstructions.ts +++ b/packages/cli/src/commands/init/printRunInstructions.ts @@ -10,7 +10,7 @@ import path from 'path'; import fs from 'fs'; import process from 'process'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {logger} from '@react-native-community/cli-tools'; interface Options { @@ -43,7 +43,7 @@ function printRunInstructions( ); iosInstructions = ` - ${chalk.cyan(`Run instructions for ${chalk.bold('iOS')}`)}: + ${pico.cyan(`Run instructions for ${pico.bold('iOS')}`)}: • cd "${projectDir}${options.showPodsInstructions ? '/ios' : ''}" ${ options.showPodsInstructions @@ -56,14 +56,14 @@ function printRunInstructions( : '' } • npx react-native run-ios - ${chalk.dim('- or -')} + ${pico.dim('- or -')} • Open ${relativeXcodeProjectPath} in Xcode or run "xed -b ios" • Hit the Run button `; desktopInstructions = ` - ${chalk.magenta(`Run instructions for ${chalk.bold('macOS')}`)}: - • See ${chalk.underline( + ${pico.magenta(`Run instructions for ${pico.bold('macOS')}`)}: + • See ${pico.underline( 'https://aka.ms/ReactNativeGuideMacOS', )} for the latest up-to-date instructions. `; @@ -71,15 +71,15 @@ function printRunInstructions( if (process.platform === 'win32') { desktopInstructions = ` - ${chalk.cyan(`Run instructions for ${chalk.bold('Windows')}`)}: - • See ${chalk.underline( + ${pico.cyan(`Run instructions for ${pico.bold('Windows')}`)}: + • See ${pico.underline( 'https://aka.ms/ReactNativeGuideWindows', )} for the latest up-to-date instructions. `; } const androidInstructions = ` - ${chalk.green(`Run instructions for ${chalk.bold('Android')}`)}: + ${pico.green(`Run instructions for ${pico.bold('Android')}`)}: • Have an Android emulator running (quickest way to get started), or a device connected. • cd "${projectDir}" && npx react-native run-android `; diff --git a/packages/cli/src/commands/init/template.ts b/packages/cli/src/commands/init/template.ts index ee2adb537..dcc21fd12 100644 --- a/packages/cli/src/commands/init/template.ts +++ b/packages/cli/src/commands/init/template.ts @@ -5,7 +5,7 @@ import * as PackageManager from '../../tools/packageManager'; import copyFiles from '../../tools/copyFiles'; import replacePathSepForRegex from '../../tools/replacePathSepForRegex'; import fs from 'fs'; -import chalk from 'chalk'; +import pico from 'picocolors'; import {getYarnVersionIfAvailable} from '../../tools/yarn'; import {executeCommand} from '../../tools/executeCommand'; @@ -79,8 +79,10 @@ export function getTemplateConfig( if (!fs.existsSync(configFilePath)) { throw new CLIError( `Couldn't find the "${configFilePath} file inside "${templateName}" template. Please make sure the template is valid. - Read more: ${chalk.underline.dim( - 'https://github.com/react-native-community/cli/blob/main/docs/init.md#creating-custom-template', + Read more: ${pico.underline( + pico.dim( + 'https://github.com/react-native-community/cli/blob/main/docs/init.md#creating-custom-template', + ), )}`, ); } diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index c2841f402..dd8fd2223 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -5,10 +5,10 @@ import type { Config, DetachedCommand, } from '@react-native-community/cli-types'; -import chalk from 'chalk'; import childProcess from 'child_process'; import {Command as CommanderCommand} from 'commander'; import path from 'path'; +import pico from 'picocolors'; import {detachedCommands, projectCommands} from './commands'; export {createDevServerMiddleware} from '@react-native-community/cli-server-api'; @@ -34,8 +34,8 @@ const handleError = (err: Error) => { } if (!program.opts().verbose && logger.hasDebugMessages()) { logger.info( - chalk.dim( - `Run CLI with ${chalk.reset('--verbose')} ${chalk.dim( + pico.dim( + `Run CLI with ${pico.reset('--verbose')} ${pico.dim( 'flag for more details.', )}`, ), @@ -49,10 +49,10 @@ function printExamples(examples: Command['examples']) { if (examples && examples.length > 0) { const formattedUsage = examples - .map((example) => ` ${example.desc}: \n ${chalk.cyan(example.cmd)}`) + .map((example) => ` ${example.desc}: \n ${pico.cyan(example.cmd)}`) .join('\n\n'); - output = output.concat([chalk.bold('\nExample usage:'), formattedUsage]); + output = output.concat([pico.bold('\nExample usage:'), formattedUsage]); } return output.join('\n').concat('\n'); @@ -169,8 +169,8 @@ async function setupAndRun(platformName?: string) { childProcess.execFileSync(absolutePath, {stdio: 'pipe'}); } catch (error) { logger.warn( - `Failed to run environment setup script "${scriptName}"\n\n${chalk.red( - error, + `Failed to run environment setup script "${scriptName}"\n\n${pico.red( + `${error}`, )}`, ); logger.info( diff --git a/scripts/build.js b/scripts/build.js index 9fbad060a..f77bf23ca 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -22,7 +22,7 @@ const fs = require('fs'); const path = require('path'); const glob = require('fast-glob'); const babel = require('@babel/core'); -const chalk = require('chalk'); +const pico = require('picocolors'); const micromatch = require('micromatch'); const { PACKAGES_DIR, @@ -72,7 +72,7 @@ function buildFile(file, silent) { silent || process.stdout.write( `${ - chalk.dim(' \u2022 ') + path.relative(PACKAGES_DIR, file) + pico.dim(' \u2022 ') + path.relative(PACKAGES_DIR, file) } (ignore)\n`, ); return; @@ -96,9 +96,9 @@ function buildFile(file, silent) { silent || process.stdout.write( `${ - chalk.red(' \u2022 ') + + pico.red(' \u2022 ') + path.relative(PACKAGES_DIR, file) + - chalk.red(' \u21D2 ') + + pico.red(' \u21D2 ') + path.relative(PACKAGES_DIR, destPath) } (copy)\n`, ); @@ -118,9 +118,9 @@ function buildFile(file, silent) { silent || process.stdout.write( `${ - chalk.green(' \u2022 ') + + pico.green(' \u2022 ') + path.relative(PACKAGES_DIR, file) + - chalk.green(' \u21D2 ') + + pico.green(' \u21D2 ') + path.relative(PACKAGES_DIR, destPath) }\n`, ); @@ -133,7 +133,7 @@ if (files.length) { files.forEach(buildFile); } else { const packages = getPackages(); - process.stdout.write(chalk.inverse(' Building packages \n')); + process.stdout.write(pico.inverse(' Building packages \n')); packages.forEach(buildNodePackage); process.stdout.write('\n'); } diff --git a/scripts/buildTs.js b/scripts/buildTs.js index f727fca6a..6d6f150ba 100644 --- a/scripts/buildTs.js +++ b/scripts/buildTs.js @@ -10,8 +10,8 @@ const fs = require('fs'); const path = require('path'); -const chalk = require('chalk'); const execa = require('execa'); +const pico = require('picocolors'); const {getPackages, adjustToTerminalWidth, OK} = require('./helpers'); const packages = getPackages(); @@ -31,7 +31,7 @@ const args = [ ...process.argv.slice(2), ]; -console.log(chalk.inverse('Building TypeScript definition files')); +console.log(pico.inverse('Building TypeScript definition files')); process.stdout.write(adjustToTerminalWidth('Building\n')); try { @@ -40,7 +40,7 @@ try { } catch (e) { process.stdout.write('\n'); console.error( - chalk.inverse.red('Unable to build TypeScript definition files'), + pico.inverse(pico.red('Unable to build TypeScript definition files')), ); console.error(e.stack); process.exitCode = 1; diff --git a/scripts/helpers.js b/scripts/helpers.js index 21ce12199..94fddfe67 100644 --- a/scripts/helpers.js +++ b/scripts/helpers.js @@ -7,12 +7,12 @@ const fs = require('fs'); const path = require('path'); -const chalk = require('chalk'); +const pico = require('picocolors'); const stringLength = require('string-length'); const PACKAGES_DIR = path.resolve(__dirname, '../packages'); -const OK = chalk.reset.inverse.bold.green(' DONE '); +const OK = pico.reset(pico.inverse(pico.bold(pico.green(' DONE ')))); function getPackages() { return fs @@ -27,7 +27,7 @@ function adjustToTerminalWidth(str) { const strs = str.match(new RegExp(`(.{1,${WIDTH}})`, 'g')); let lastString = strs[strs.length - 1]; if (lastString.length < WIDTH) { - lastString += Array(WIDTH - lastString.length).join(chalk.dim('.')); + lastString += Array(WIDTH - lastString.length).join(pico.dim('.')); } return strs.slice(0, -1).concat(lastString).join('\n'); } diff --git a/scripts/linkPackages.js b/scripts/linkPackages.js index c0658cd1c..9284c467a 100644 --- a/scripts/linkPackages.js +++ b/scripts/linkPackages.js @@ -1,5 +1,5 @@ const execa = require('execa'); -const chalk = require('chalk'); +const pico = require('picocolors'); const path = require('path'); const glob = require('fast-glob'); @@ -7,6 +7,6 @@ const projects = glob.sync('packages/*/package.json'); projects.forEach((project) => { const cwd = path.dirname(project); - console.log(chalk.dim(`Running "yarn link" in ${cwd}`)); + console.log(pico.dim(`Running "yarn link" in ${cwd}`)); execa.sync('yarn', ['link'], {cwd, stdio: 'inherit'}); }); diff --git a/scripts/watch.js b/scripts/watch.js index 9fba951b6..de4173a25 100644 --- a/scripts/watch.js +++ b/scripts/watch.js @@ -12,7 +12,7 @@ const fs = require('fs'); const {execSync} = require('child_process'); const path = require('path'); -const chalk = require('chalk'); +const pico = require('picocolors'); const chokidar = require('chokidar'); const {getPackages} = require('./helpers'); @@ -26,7 +26,7 @@ const onChange = (srcDir) => { return (filePath) => { const filename = path.basename(filePath); - console.log(chalk.green('->'), `change: ${filename}`); + console.log(pico.green('->'), `change: ${filename}`); rebuild(filePath); }; }; @@ -41,7 +41,7 @@ const onUnlink = (srcDir) => { fs.unlinkSync(buildFile); process.stdout.write( `${ - chalk.red(' \u2022 ') + + pico.red(' \u2022 ') + path.relative(path.resolve(srcDir, '..', '..'), buildFile) } (deleted)\n`, ); @@ -80,4 +80,4 @@ setInterval(() => { } }, 100); -console.log(chalk.red('->'), chalk.cyan('Watching for changes...')); +console.log(pico.red('->'), pico.cyan('Watching for changes...')); diff --git a/yarn.lock b/yarn.lock index b2e69f3bc..db4aac3dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3301,7 +3301,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -8502,6 +8502,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.0.7, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -9701,7 +9706,16 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9796,7 +9810,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9817,6 +9831,13 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + 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" @@ -10665,7 +10686,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10683,6 +10704,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"