Skip to content

Commit

Permalink
Refactor CLI command entry points (facebook#39075)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: facebook#39075

Small refactor: reorganise command entry points and types into a consistent pattern.

Changelog: [Internal]

Reviewed By: blakef

Differential Revision: D48433284

fbshipit-source-id: 02c0a2799a7c62444066538ace3095d5dd9d6c2a
  • Loading branch information
huntie authored and facebook-github-bot committed Aug 21, 2023
1 parent 77bc0a4 commit c1787a8
Showing 8 changed files with 182 additions and 202 deletions.
45 changes: 35 additions & 10 deletions packages/community-cli-plugin/src/commands/bundle/buildBundle.js
Original file line number Diff line number Diff line change
@@ -12,34 +12,57 @@
import type {Config} from '@react-native-community/cli-types';
import type {RequestOptions} from 'metro/src/shared/types.flow';
import type {ConfigT} from 'metro-config';
import type {CommandLineArgs} from './bundleCommandLineArgs';

import Server from 'metro/src/Server';
const outputBundle = require('metro/src/shared/output/bundle');
import metroBundle from 'metro/src/shared/output/bundle';
import metroRamBundle from 'metro/src/shared/output/RamBundle';
import path from 'path';
import chalk from 'chalk';
import saveAssets from './saveAssets';
import {default as loadMetroConfig} from '../../utils/loadMetroConfig';
import loadMetroConfig from '../../utils/loadMetroConfig';
import {logger} from '@react-native-community/cli-tools';

export type BundleCommandArgs = {
assetsDest?: string,
assetCatalogDest?: string,
entryFile: string,
resetCache: boolean,
resetGlobalCache: boolean,
transformer?: string,
minify?: boolean,
config?: string,
platform: string,
dev: boolean,
bundleOutput: string,
bundleEncoding?: 'utf8' | 'utf16le' | 'ascii',
maxWorkers?: number,
sourcemapOutput?: string,
sourcemapSourcesRoot?: string,
sourcemapUseAbsolutePath: boolean,
verbose: boolean,
unstableTransformProfile: string,
indexedRamBundle?: boolean,
};

async function buildBundle(
args: CommandLineArgs,
_argv: Array<string>,
ctx: Config,
output: typeof outputBundle = outputBundle,
args: BundleCommandArgs,
bundleImpl: typeof metroBundle | typeof metroRamBundle = metroBundle,
): Promise<void> {
const config = await loadMetroConfig(ctx, {
maxWorkers: args.maxWorkers,
resetCache: args.resetCache,
config: args.config,
});

return buildBundleWithConfig(args, config, output);
return buildBundleWithConfig(args, config, bundleImpl);
}

async function buildBundleWithConfig(
args: CommandLineArgs,
args: BundleCommandArgs,
config: ConfigT,
output: typeof outputBundle = outputBundle,
bundleImpl: typeof metroBundle | typeof metroRamBundle = metroBundle,
): Promise<void> {
if (config.resolver.platforms.indexOf(args.platform) === -1) {
logger.error(
@@ -80,11 +103,13 @@ async function buildBundleWithConfig(
const server = new Server(config);

try {
const bundle = await output.build(server, requestOpts);
const bundle = await bundleImpl.build(server, requestOpts);

// $FlowIgnore[class-object-subtyping]
// $FlowIgnore[incompatible-call]
await output.save(bundle, args, logger.info);
// $FlowIgnore[prop-missing]
// $FlowIgnore[incompatible-exact]
await bundleImpl.save(bundle, args, logger.info);

// Save the assets of the bundle
const outputAssets = await server.getAssets({
38 changes: 0 additions & 38 deletions packages/community-cli-plugin/src/commands/bundle/bundle.js

This file was deleted.

This file was deleted.

120 changes: 120 additions & 0 deletions packages/community-cli-plugin/src/commands/bundle/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/

import type {Command} from '@react-native-community/cli-types';

import path from 'path';
import buildBundle from './buildBundle';

export type {BundleCommandArgs} from './buildBundle';

const bundleCommand: Command = {
name: 'bundle',
description: 'Build the bundle for the provided JavaScript entry file.',
func: buildBundle,
options: [
{
name: '--entry-file <path>',
description:
'Path to the root JS file, either absolute or relative to JS root',
},
{
name: '--platform <string>',
description: 'Either "ios" or "android"',
default: 'ios',
},
{
name: '--transformer <string>',
description: 'Specify a custom transformer to be used',
},
{
name: '--dev [boolean]',
description: 'If false, warnings are disabled and the bundle is minified',
parse: (val: string): boolean => val !== 'false',
default: true,
},
{
name: '--minify [boolean]',
description:
'Allows overriding whether bundle is minified. This defaults to ' +
'false if dev is true, and true if dev is false. Disabling minification ' +
'can be useful for speeding up production builds for testing purposes.',
parse: (val: string): boolean => val !== 'false',
},
{
name: '--bundle-output <string>',
description:
'File name where to store the resulting bundle, ex. /tmp/groups.bundle',
},
{
name: '--bundle-encoding <string>',
description:
'Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer).',
default: 'utf8',
},
{
name: '--max-workers <number>',
description:
'Specifies the maximum number of workers the worker-pool ' +
'will spawn for transforming files. This defaults to the number of the ' +
'cores available on your machine.',
parse: (workers: string): number => Number(workers),
},
{
name: '--sourcemap-output <string>',
description:
'File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map',
},
{
name: '--sourcemap-sources-root <string>',
description:
"Path to make sourcemap's sources entries relative to, ex. /root/dir",
},
{
name: '--sourcemap-use-absolute-path',
description: 'Report SourceMapURL using its full path',
default: false,
},
{
name: '--assets-dest <string>',
description:
'Directory name where to store assets referenced in the bundle',
},
{
name: '--unstable-transform-profile <string>',
description:
'Experimental, transform JS for a specific JS engine. Currently supported: hermes, hermes-canary, default',
default: 'default',
},
{
name: '--asset-catalog-dest [string]',
description: 'Path where to create an iOS Asset Catalog for images',
},
{
name: '--reset-cache',
description: 'Removes cached files',
default: false,
},
{
name: '--read-global-cache',
description:
'Try to fetch transformed JS code from the global cache, if configured.',
default: false,
},
{
name: '--config <string>',
description: 'Path to the CLI configuration file',
parse: (val: string): string => path.resolve(val),
},
],
};

export default bundleCommand;
Loading

0 comments on commit c1787a8

Please sign in to comment.