Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
"name": "@revopush/code-push-cli",
"version": "0.0.15",
"description": "Management CLI for the CodePush service",
"main": "./script/cli.js",
"scripts": {
"start": "node ./bin/script/cli.js",
"build": "tsc",
Expand Down
2 changes: 1 addition & 1 deletion script/binary-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as path from "path";
import * as fs from "fs";
import * as crypto from "crypto";
import * as chalk from "chalk";
import { log } from "./command-executor";
import { log } from "./ui/log";
import * as os from "os";
import * as yazl from "yazl";
import * as yauzl from "yauzl";
Expand Down
96 changes: 7 additions & 89 deletions script/command-executor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import {
PackageInfo,
Session,
UpdateMetrics,
} from "../script/types";
} from "./types";
import {
getMinifyParams,
getReactNativePackagePath,
Expand All @@ -53,12 +53,13 @@ import AccountManager = require("./management-sdk");
import wordwrap = require("wordwrap");
import { ReactNativePackageInfo } from "./types/rest-definitions";
import { getExpoCliPath } from "./expo-utils";
import { log } from "./ui/log";
import { confirm, requestAccessKey } from "./ui/prompt";
import { createUploadProgress } from "./ui/progress";

const opener = require("opener");

const plist = require("plist");
const progress = require("progress");
const prompt = require("prompt");

const Table = require("cli-table");

Expand Down Expand Up @@ -91,46 +92,12 @@ export interface PackageWithMetrics {
metrics?: UpdateMetricsWithTotalActive;
}

export const log = (message: string | any): void => console.log(message);
export let sdk: AccountManager;
export const spawn = childProcess.spawn;
export const execSync = childProcess.execSync;

let connectionInfo: ILoginConnectionInfo;

export const confirm = (message: string = "Are you sure?"): Promise<boolean> => {
message += " (y/N):";
return new Promise<boolean>((resolve): void => {
prompt.message = "";
prompt.delimiter = "";

prompt.start();

prompt.get(
{
properties: {
response: {
description: chalk.cyan(message),
},
},
},
(err: any, result: any): void => {
const accepted = result.response && result.response.toLowerCase() === "y";
const rejected = !result.response || result.response.toLowerCase() === "n";

if (accepted) {
resolve(true);
} else {
if (!rejected) {
console.log('Invalid response: "' + result.response + '"');
}
resolve(false);
}
}
);
});
};

async function accessKeyAdd(command: cli.IAccessKeyAddCommand): Promise<void> {
const accessKey: AccessKey = await sdk.addAccessKey(command.name, command.ttl);
log(`Successfully created the "${command.name}" access key: ${accessKey.key}`);
Expand Down Expand Up @@ -1274,7 +1241,7 @@ async function compileHermesBundle(
baseReleaseTmpFolder: string
): Promise<void> {
await createEmptyTempReleaseFolder(baseReleaseTmpFolder);
const baseBytecode = await takeHermesBaseBytecode(command, baseReleaseTmpFolder, outputFolder, bundleName);
const baseBytecode = await takeHermesBaseBytecode(sdk, command, baseReleaseTmpFolder, outputFolder, bundleName);

log(chalk.cyan("\nRunning hermes compiler...\n"));
const bundle = path.join(outputFolder, bundleName);
Expand Down Expand Up @@ -1581,18 +1548,7 @@ const doRelease = async (
isSingleFilePackage = false;
}

let lastTotalProgress = 0;
const progressBar = new progress("Upload progress:[:bar] :percent :etas", {
complete: "=",
incomplete: " ",
width: 50,
total: 100,
});

const uploadProgress = (currentProgress: number): void => {
progressBar.tick(currentProgress - lastTotalProgress);
lastTotalProgress = currentProgress;
};
const uploadProgress = createUploadProgress();

try {
await sdk.isAuthenticated(true);
Expand Down Expand Up @@ -1636,19 +1592,7 @@ const doNativeRelease = async (releaseCommand: cli.IReleaseReactCommand): Promis
buildNumber: releaseCommand.buildNumber,
};

let lastTotalProgress = 0;

const progressBar = new progress("Upload progress:[:bar] :percent :etas", {
complete: "=",
incomplete: " ",
width: 50,
total: 100,
});

const uploadProgress = (currentProgress: number): void => {
progressBar.tick(currentProgress - lastTotalProgress);
lastTotalProgress = currentProgress;
};
const uploadProgress = createUploadProgress();

try {
await sdk.isAuthenticated(true);
Expand Down Expand Up @@ -1679,32 +1623,6 @@ async function rollback(command: cli.IRollbackCommand): Promise<void> {
log('Successfully performed a rollback on the "' + command.deploymentName + '" deployment of the "' + command.appName + '" app.');
}

function requestAccessKey(): Promise<string> {
return new Promise<string>((resolve): void => {
prompt.message = "";
prompt.delimiter = "";

prompt.start();

prompt.get(
{
properties: {
response: {
description: chalk.cyan("Enter your access key: "),
},
},
},
(err: any, result: any): void => {
if (err) {
resolve(null);
} else {
resolve(result.response.trim());
}
}
);
});
}

export const runReactNativeBundleCommand = async (
{ platform, development, outputFolder, bundleName, packagerSourceMap, extraBundlerOptions }: BundleOptions,
entryFile: string,
Expand Down
5 changes: 0 additions & 5 deletions script/index.ts

This file was deleted.

4 changes: 3 additions & 1 deletion script/react-native-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import { findHermesc, isBaseBytecodeCompatible } from "./utils/hermes-utils";
import { restoreSourceMapMetadata } from "./utils/source-map-utils";
import * as dotenv from "dotenv";
import * as cli from "./types/cli";
import { log, sdk } from "./command-executor";
import { log } from "./ui/log";
import type AccountManager = require("./management-sdk");

export function isValidVersion(version: string): boolean {
return !!valid(version) || /^\d+\.\d+$/.test(version);
Expand Down Expand Up @@ -46,6 +47,7 @@ export function getSourceMapPaths(
type BaseRelease = Pick<cli.IReleaseReactCommand, "appName" | "deploymentName" | "appStoreVersion" | "buildNumber">;

export async function takeHermesBaseBytecode(
sdk: Pick<AccountManager, "getBaseRelease">,
{ appName, deploymentName, appStoreVersion, buildNumber }: BaseRelease,
baseReleaseTmpFolder: string,
outputFolder: string,
Expand Down
2 changes: 1 addition & 1 deletion script/types.ts → script/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export {
AccessKey as ServerAccessKey,
UpdateMetrics,
BaseRelease,
} from "../script/types/rest-definitions";
} from "./rest-definitions";

export interface CodePushError {
message: string;
Expand Down
3 changes: 3 additions & 0 deletions script/ui/log.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function log(message: unknown): void {
console.log(message);
}
17 changes: 17 additions & 0 deletions script/ui/progress.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const ProgressBar = require("progress");

/** Returns a callback that draws upload progress, given the percentage uploaded so far */
export function createUploadProgress(): (currentProgress: number) => void {
let lastTotalProgress = 0;
const progressBar = new ProgressBar("Upload progress:[:bar] :percent :etas", {
complete: "=",
incomplete: " ",
width: 50,
total: 100,
});

return (currentProgress: number): void => {
progressBar.tick(currentProgress - lastTotalProgress);
lastTotalProgress = currentProgress;
};
}
62 changes: 62 additions & 0 deletions script/ui/prompt.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import * as chalk from "chalk";

const prompt = require("prompt");

export const confirm = (message: string = "Are you sure?"): Promise<boolean> => {
message += " (y/N):";
return new Promise<boolean>((resolve): void => {
prompt.message = "";
prompt.delimiter = "";

prompt.start();

prompt.get(
{
properties: {
response: {
description: chalk.cyan(message),
},
},
},
(err: any, result: any): void => {
const accepted = result.response && result.response.toLowerCase() === "y";
const rejected = !result.response || result.response.toLowerCase() === "n";

if (accepted) {
resolve(true);
} else {
if (!rejected) {
console.log('Invalid response: "' + result.response + '"');
}
resolve(false);
}
}
);
});
};

export function requestAccessKey(): Promise<string> {
return new Promise<string>((resolve): void => {
prompt.message = "";
prompt.delimiter = "";

prompt.start();

prompt.get(
{
properties: {
response: {
description: chalk.cyan("Enter your access key: "),
},
},
},
(err: any, result: any): void => {
if (err) {
resolve(null);
} else {
resolve(result.response.trim());
}
}
);
});
}
2 changes: 1 addition & 1 deletion script/utils/hermes-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import * as chalk from "chalk";
import { coerce, gte } from "semver";

import * as cli from "../types/cli";
import { log } from "../command-executor";
import { log } from "../ui/log";
import { fileExists } from "./file-utils";
import { getGradleHermesCommand, getGradleHermesEnabled, readGradleProperty } from "./gradle-utils";
import { getReactNativePackagePath, getReactNativeVersion, getXcodeDotEnvValue } from "../react-native-utils";
Expand Down
6 changes: 4 additions & 2 deletions test/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import * as path from "path";
import * as sinon from "sinon";
import * as cmdexec from "../script/command-executor";
import * as cli from "../script/types/cli";
import * as uiLog from "../script/ui/log";
import * as uiPrompt from "../script/ui/prompt";
import { argValue, fakeBundlerProcess } from "./helpers/bundler";
import { restoreEnvAfterEach } from "./helpers/env";
import { DEFAULT_ACCESS_KEY_MAX_AGE, NOW, SdkStub, TEST_MACHINE_NAME } from "./helpers/sdk-stub";
Expand Down Expand Up @@ -99,9 +101,9 @@ describe("CLI", () => {

beforeEach(() => {
sinon.stub(cmdexec, "sdk").value(new SdkStub());
confirm = sinon.stub(cmdexec, "confirm").resolves(true);
confirm = sinon.stub(uiPrompt, "confirm").resolves(true);
sinon.stub(cmdexec, "createEmptyTempReleaseFolder").resolves();
log = sinon.stub(cmdexec, "log");
log = sinon.stub(uiLog, "log");
spawn = sinon.stub(cmdexec, "spawn").callsFake(fakeBundler);
});

Expand Down
6 changes: 3 additions & 3 deletions test/hermes-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { strict as assert } from "assert";
import * as fs from "fs";
import * as path from "path";
import * as sinon from "sinon";
import * as cmdexec from "../script/command-executor";
import * as uiLog from "../script/ui/log";
import { findHermesc, getHermescBytecodeVersion, isBaseBytecodeCompatible, isHermesEnabled } from "../script/utils/hermes-utils";
import { restoreEnvAfterEach } from "./helpers/env";
import { useTempDirectory } from "./helpers/temp-directory";
Expand Down Expand Up @@ -108,7 +108,7 @@ describe("hermes-utils", () => {
"android/app/build.gradle",
'react {\n hermesCommand = new File(["node", "--print", "require.resolve(\'hermes-compiler/package.json\', { paths: [require.resolve(\'react-native/package.json\')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/hermesc/%OS-BIN%/hermesc"\n}\n'
);
const log = sinon.stub(cmdexec, "log");
const log = sinon.stub(uiLog, "log");

assert.equal(await resolvedHermesc({ platform: "android" }), compiler);
sinon.assert.notCalled(log);
Expand Down Expand Up @@ -274,7 +274,7 @@ describe("hermes-utils", () => {
let log: sinon.SinonStub;

beforeEach(() => {
log = sinon.stub(cmdexec, "log");
log = sinon.stub(uiLog, "log");
});

it("accepts the base bytecode when versions match", () => {
Expand Down
3 changes: 2 additions & 1 deletion test/release-size-flow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import * as path from "path";
import * as sinon from "sinon";
import * as cmdexec from "../script/command-executor";
import * as cli from "../script/types/cli";
import * as uiLog from "../script/ui/log";
import {
ASSET_OPTIMIZATION_DOCS_URL,
MAX_ASSET_SIZE_BYTES,
Expand Down Expand Up @@ -44,7 +45,7 @@ describe("command-executor release size checks", () => {
isAuthenticated: sinon.stub().resolves(true),
release: sdkRelease,
});
sinon.stub(cmdexec, "log");
sinon.stub(uiLog, "log");
sinon.stub(console, "log");
warn = sinon.stub(console, "warn");
});
Expand Down
Loading