@bravemobile/react-native-code-push
Version:
React Native plugin for the CodePush service
44 lines (43 loc) • 3.36 kB
JavaScript
import { program, Option } from "commander";
import { findAndReadConfigFile } from "../../utils/fsUtils.js";
import { release } from "./release.js";
import { OUTPUT_BUNDLE_DIR, CONFIG_FILE_NAME, ROOT_OUTPUT_DIR, ENTRY_FILE } from "../../constant.js";
program.command('release')
.description('Deploys a new CodePush update for a target binary app.\nAfter creating the CodePush bundle, it uploads the file and updates the ReleaseHistory information.\n`bundleUploader`, `getReleaseHistory`, and `setReleaseHistory` functions should be implemented in the config file.')
.requiredOption('-b, --binary-version <string>', '(Required) The target binary version')
.requiredOption('-v, --app-version <string>', '(Required) The app version to be released. It must be greater than the binary version.')
.addOption(new Option('-f, --framework <type>', 'framework type (expo)').choices(['expo']))
.addOption(new Option('-p, --platform <type>', 'platform').choices(['ios', 'android']).default('ios'))
.option('-i, --identifier <string>', 'reserved characters to distinguish the release.')
.option('-c, --config <path>', 'set config file name (JS/TS)', CONFIG_FILE_NAME)
.option('-o, --output-path <string>', 'path to output root directory', ROOT_OUTPUT_DIR)
.option('-e, --entry-file <string>', 'path to JS/TS entry file', ENTRY_FILE)
.option('-j, --js-bundle-name <string>', 'JS bundle file name (default-ios: "main.jsbundle" / default-android: "index.android.bundle")')
.option('-m, --mandatory <bool>', 'make the release to be mandatory', parseBoolean, false)
.option('--enable <bool>', 'make the release to be enabled', parseBoolean, true)
.option('--rollout <number>', 'rollout percentage (0-100)', parseFloat)
.option('--skip-bundle <bool>', 'skip bundle process', parseBoolean, false)
.option('--hash-calc <bool>', 'calculates the bundle file hash used for packageHash in the release history (Requires setting --skip-bundle to true)', parseBoolean)
.option('--skip-cleanup <bool>', 'skip cleanup process', parseBoolean, false)
.option('--output-bundle-dir <string>', 'name of directory containing the bundle file created by the "bundle" command', OUTPUT_BUNDLE_DIR)
.action(async (options) => {
const config = findAndReadConfigFile(process.cwd(), options.config);
if (typeof options.rollout === 'number' && (options.rollout < 0 || options.rollout > 100)) {
console.error('Rollout percentage number must be between 0 and 100 (inclusive).');
process.exit(1);
}
if (options.hashCalc && !options.skipBundle) {
console.error('--hash-calc option can be used only when --skip-bundle is set to true.');
process.exit(1);
}
await release(config.bundleUploader, config.getReleaseHistory, config.setReleaseHistory, options.binaryVersion, options.appVersion, options.framework, options.platform, options.identifier, options.outputPath, options.entryFile, options.bundleName, options.mandatory, options.enable, options.rollout, options.skipBundle, options.skipCleanup, `${options.outputPath}/${options.outputBundleDir}`, options.hashCalc);
console.log('🚀 Release completed.');
});
function parseBoolean(value) {
if (value === 'true')
return true;
if (value === 'false')
return false;
else
return undefined;
}