From 90800b4f508734497b26dd6cc8e6910280422560 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 12 Nov 2025 13:59:49 +0100 Subject: [PATCH 1/4] chore: add chalk library --- packages/metro-core/package.json | 1 + pnpm-lock.yaml | 13 +++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/metro-core/package.json b/packages/metro-core/package.json index 2cd6d7c3228..dede7f772e7 100644 --- a/packages/metro-core/package.json +++ b/packages/metro-core/package.json @@ -60,6 +60,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "chalk": "5.6.2", "@expo/metro-runtime": "^5.0.4", "@module-federation/runtime": "workspace:*", "@module-federation/sdk": "workspace:*" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfceca024e4..badf934bde4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3302,6 +3302,9 @@ importers: '@module-federation/sdk': specifier: workspace:* version: link:../sdk + chalk: + specifier: 5.6.2 + version: 5.6.2 devDependencies: '@rslib/core': specifier: ^0.10.0 @@ -7718,7 +7721,7 @@ packages: '@commitlint/ensure': 19.5.0 '@commitlint/load': 19.5.0(@types/node@18.16.9)(typescript@5.8.3) '@commitlint/types': 19.5.0 - chalk: 5.4.1 + chalk: 5.6.2 commitizen: 4.3.1(@types/node@18.16.9)(typescript@5.8.3) inquirer: 9.3.8(@types/node@18.16.9) lodash.isplainobject: 4.0.6 @@ -27650,7 +27653,7 @@ packages: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 - chalk: 5.0.1 + chalk: 5.6.2 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -28172,15 +28175,9 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true - /chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - /chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} From 0ca8721b183b8188f3fbec5252acb2ab3c27d5db Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 12 Nov 2025 14:03:15 +0100 Subject: [PATCH 2/4] refactor: use chalk for better compat --- .../src/commands/bundle-host/index.ts | 4 ++-- .../src/commands/bundle-remote/index.ts | 20 +++++++++---------- .../src/commands/utils/save-bundle-and-map.ts | 8 +++----- packages/metro-core/src/plugin/index.ts | 16 +++++++-------- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/packages/metro-core/src/commands/bundle-host/index.ts b/packages/metro-core/src/commands/bundle-host/index.ts index dfe3908d604..7395266de39 100644 --- a/packages/metro-core/src/commands/bundle-host/index.ts +++ b/packages/metro-core/src/commands/bundle-host/index.ts @@ -1,5 +1,5 @@ import path from 'node:path'; -import util from 'node:util'; +import chalk from 'chalk'; import Server from 'metro/src/Server'; import type { RequestOptions } from 'metro/src/shared/types'; import type { ModuleFederationConfigNormalized } from '../../types'; @@ -45,7 +45,7 @@ async function bundleFederatedHost( const hostEntryFilepath = global.__METRO_FEDERATION_HOST_ENTRY_PATH; if (!hostEntryFilepath) { logger.error( - `${util.styleText('red', 'error')} Cannot determine the host entrypoint path.`, + `${chalk.red('error')} Cannot determine the host entrypoint path.`, ); throw new CLIError('Bundling failed'); } diff --git a/packages/metro-core/src/commands/bundle-remote/index.ts b/packages/metro-core/src/commands/bundle-remote/index.ts index 946eac4eb4a..6183f963d59 100644 --- a/packages/metro-core/src/commands/bundle-remote/index.ts +++ b/packages/metro-core/src/commands/bundle-remote/index.ts @@ -1,7 +1,7 @@ import { promises as fs } from 'node:fs'; import path from 'node:path'; import { pathToFileURL } from 'node:url'; -import util from 'node:util'; +import chalk from 'chalk'; import { mergeConfig } from 'metro'; import Server from 'metro/src/Server'; import type { OutputOptions, RequestOptions } from 'metro/src/shared/types'; @@ -113,7 +113,7 @@ async function bundleFederatedRemote( const federationConfig = global.__METRO_FEDERATION_CONFIG; if (!federationConfig) { logger.error( - `${util.styleText('red', 'error')} Module Federation configuration is missing.`, + `${chalk.red('error')} Module Federation configuration is missing.`, ); logger.info( "Import the plugin 'withModuleFederation' " + @@ -127,7 +127,7 @@ async function bundleFederatedRemote( const containerEntryFilepath = global.__METRO_FEDERATION_REMOTE_ENTRY_PATH; if (!containerEntryFilepath) { logger.error( - `${util.styleText('red', 'error')} Cannot determine the container entry file path.`, + `${chalk.red('error')} Cannot determine the container entry file path.`, ); logger.info( 'To bundle a container, you need to expose at least one module ' + @@ -140,21 +140,21 @@ async function bundleFederatedRemote( const manifestFilepath = global.__METRO_FEDERATION_MANIFEST_PATH; if (!manifestFilepath) { logger.error( - `${util.styleText('red', 'error')} Cannot determine the manifest file path.`, + `${chalk.red('error')} Cannot determine the manifest file path.`, ); throw new CLIError('Bundling failed'); } if (rawConfig.resolver.platforms.indexOf(args.platform) === -1) { logger.error( - `${util.styleText('red', 'error')}: Invalid platform ${ - args.platform ? `"${util.styleText('bold', args.platform)}" ` : '' + `${chalk.red('error')}: Invalid platform ${ + args.platform ? `"${chalk.bold(args.platform)}" ` : '' }selected.`, ); logger.info( `Available platforms are: ${rawConfig.resolver.platforms - .map((x) => `"${util.styleText('bold', x)}"`) + .map((x) => `"${chalk.bold(x)}"`) .join( ', ', )}. If you are trying to bundle for an out-of-tree platform, it may not be installed.`, @@ -314,7 +314,7 @@ async function bundleFederatedRemote( try { logger.info( - `${util.styleText('blue', 'Processing remote container and exposed modules')}`, + `${chalk.blue('Processing remote container and exposed modules')}`, ); for (const { requestOpts, saveBundleOpts, targetDir } of requests) { @@ -338,11 +338,11 @@ async function bundleFederatedRemote( // ); } - logger.info(`${util.styleText('blue', 'Processing manifest')}`); + logger.info(`${chalk.blue('Processing manifest')}`); const manifestOutputFilepath = path.resolve(outputDir, 'mf-manifest.json'); await fs.copyFile(manifestFilepath, manifestOutputFilepath); logger.info( - `Done writing MF Manifest to:\n${util.styleText('dim', manifestOutputFilepath)}`, + `Done writing MF Manifest to:\n${chalk.dim(manifestOutputFilepath)}`, ); } finally { // incomplete types - this should be awaited diff --git a/packages/metro-core/src/commands/utils/save-bundle-and-map.ts b/packages/metro-core/src/commands/utils/save-bundle-and-map.ts index c059a28bf83..fdd5ec09874 100644 --- a/packages/metro-core/src/commands/utils/save-bundle-and-map.ts +++ b/packages/metro-core/src/commands/utils/save-bundle-and-map.ts @@ -1,5 +1,5 @@ import { promises as fs } from 'node:fs'; -import util from 'node:util'; +import chalk from 'chalk'; import type { MixedSourceMap } from 'metro-source-map'; import relativizeSourceMapInline from 'metro/src/lib/relativizeSourceMap'; import type { OutputOptions } from 'metro/src/shared/types'; @@ -28,7 +28,7 @@ export async function saveBundleAndMap( const writeFns = []; writeFns.push(async () => { - log(`Writing bundle output to:\n${util.styleText('dim', bundleOutput)}`); + log(`Writing bundle output to:\n${chalk.dim(bundleOutput)}`); await fs.writeFile(bundleOutput, bundle.code, encoding); log('Done writing bundle output'); }); @@ -43,9 +43,7 @@ export async function saveBundleAndMap( } writeFns.push(async () => { - log( - `Writing sourcemap output to:\n${util.styleText('dim', sourcemapOutput)}`, - ); + log(`Writing sourcemap output to:\n${chalk.dim(sourcemapOutput)}`); await fs.writeFile(sourcemapOutput, map); log('Done writing sourcemap output'); }); diff --git a/packages/metro-core/src/plugin/index.ts b/packages/metro-core/src/plugin/index.ts index 89cbc929c7c..a265cd33cbd 100644 --- a/packages/metro-core/src/plugin/index.ts +++ b/packages/metro-core/src/plugin/index.ts @@ -1,5 +1,5 @@ import path from 'node:path'; -import util from 'node:util'; +import chalk from 'chalk'; import type { ConfigT } from 'metro-config'; import type { ModuleFederationConfig, @@ -45,18 +45,16 @@ export function withModuleFederation( } console.warn( - util.styleText( - 'yellow', + chalk.yellow( 'Warning: Module Federation build is disabled for this command.\n', ) + - util.styleText( - 'yellow', + chalk.yellow( 'To enable Module Federation, please use one of the dedicated bundle commands:\n', ) + - ` ${util.styleText('dim', '•')} bundle-mf-host` + - util.styleText('dim', ' - for bundling a host application\n') + - ` ${util.styleText('dim', '•')} bundle-mf-remote` + - util.styleText('dim', ' - for bundling a remote application\n'), + ` ${chalk.dim('•')} bundle-mf-host` + + chalk.dim(' - for bundling a host application\n') + + ` ${chalk.dim('•')} bundle-mf-remote` + + chalk.dim(' - for bundling a remote application\n'), ); return config; From c1cded58f23db2244353f20044e04c67b3de176f Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 12 Nov 2025 14:41:46 +0100 Subject: [PATCH 3/4] chore: use cjs compatible chalk version --- packages/metro-core/package.json | 2 +- pnpm-lock.yaml | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/metro-core/package.json b/packages/metro-core/package.json index dede7f772e7..d85ec73bb74 100644 --- a/packages/metro-core/package.json +++ b/packages/metro-core/package.json @@ -60,7 +60,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "chalk": "5.6.2", + "chalk": "4.1.2", "@expo/metro-runtime": "^5.0.4", "@module-federation/runtime": "workspace:*", "@module-federation/sdk": "workspace:*" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index badf934bde4..9f87dc15c15 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3303,8 +3303,8 @@ importers: specifier: workspace:* version: link:../sdk chalk: - specifier: 5.6.2 - version: 5.6.2 + specifier: 4.1.2 + version: 4.1.2 devDependencies: '@rslib/core': specifier: ^0.10.0 @@ -3916,7 +3916,7 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.28.2 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 @@ -7149,6 +7149,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 + dev: false /@babel/runtime@7.28.2: resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} @@ -26374,14 +26375,9 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - /ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - dev: true /antd@4.24.14(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-hY/MPm7XI0G+9MvjhTlbDkA2sf8oHVbhtrT0XRstlm9+fXYGNXz8oEh3d5qiA3/tY5NL2Kh2tF7Guh01hwWJdg==} @@ -28178,6 +28174,7 @@ packages: /chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} @@ -45846,6 +45843,7 @@ packages: /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} @@ -47888,7 +47886,7 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 dev: true @@ -47896,7 +47894,7 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 dev: true @@ -53194,7 +53192,7 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 strip-ansi: 7.1.0 @@ -53202,7 +53200,7 @@ packages: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 strip-ansi: 7.1.2 dev: true From 8be7ef9bc8f9f249dc9d3a4dc35882eb2f38ffa3 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 12 Nov 2025 14:42:12 +0100 Subject: [PATCH 4/4] chore: add changeset --- .changeset/purple-bottles-bow.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/purple-bottles-bow.md diff --git a/.changeset/purple-bottles-bow.md b/.changeset/purple-bottles-bow.md new file mode 100644 index 00000000000..b4fcfc8ffca --- /dev/null +++ b/.changeset/purple-bottles-bow.md @@ -0,0 +1,5 @@ +--- +'@module-federation/metro': patch +--- + +fix(metro-core): replace `util.styleText` with chalk for compatibility with older node versions