diff --git a/packages/cli-plugin-metro/src/commands/bundle/buildBundle.ts b/packages/cli-plugin-metro/src/commands/bundle/buildBundle.ts index 101193f72..5e4544744 100644 --- a/packages/cli-plugin-metro/src/commands/bundle/buildBundle.ts +++ b/packages/cli-plugin-metro/src/commands/bundle/buildBundle.ts @@ -6,17 +6,18 @@ * */ +import {logger} from '@react-native-community/cli-tools'; +import type {Config} from '@react-native-community/cli-types'; +import chalk from 'chalk'; +import fs from 'fs'; +import type {ConfigT} from 'metro-config'; import Server from 'metro/src/Server'; import outputBundle from 'metro/src/shared/output/bundle'; import type {BundleOptions} from 'metro/src/shared/types'; -import type {ConfigT} from 'metro-config'; import path from 'path'; -import chalk from 'chalk'; +import {default as loadMetroConfig} from '../../tools/loadMetroConfig'; import {CommandLineArgs} from './bundleCommandLineArgs'; -import type {Config} from '@react-native-community/cli-types'; import saveAssets from './saveAssets'; -import {default as loadMetroConfig} from '../../tools/loadMetroConfig'; -import {logger} from '@react-native-community/cli-tools'; interface RequestOptions { entryFile: string; @@ -91,6 +92,10 @@ export async function buildBundleWithConfig( try { const bundle = await output.build(server, requestOpts); + // Ensure destination directory exists before saving the bundle + const mkdirOptions = {recursive: true, mode: 0o755} as const; + fs.mkdirSync(path.dirname(args.bundleOutput), mkdirOptions); + await output.save(bundle, args, logger.info); // Save the assets of the bundle