Skip to content
This repository has been archived by the owner on Nov 29, 2021. It is now read-only.

Commit

Permalink
Merge branch 'develop' into network_env_var
Browse files Browse the repository at this point in the history
  • Loading branch information
peterjah authored Oct 8, 2019
2 parents 2ebcda3 + e1a9b79 commit 0ab4d2d
Show file tree
Hide file tree
Showing 13 changed files with 123 additions and 109 deletions.
73 changes: 35 additions & 38 deletions src/baseCommand.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { color } from "@oclif/color";
import { Command, flags as oFlags } from "@oclif/command";
import { Client, configManager } from "@uns/crypto";
import { cli } from "cli-ux";
import util from "util";
import { UNSCLIAPI } from "./api";
import { CommandOutput, Formater, getFormatFlag, NestedCommandOutput, OUTPUT_FORMAT } from "./formater";
import { Formater, getFormatFlag, OUTPUT_FORMAT } from "./formater";
import * as LOGGER from "./logger";
import * as UTILS from "./utils";

export abstract class BaseCommand extends Command {
Expand Down Expand Up @@ -42,8 +41,10 @@ export abstract class BaseCommand extends Command {
this.formater = OUTPUT_FORMAT[flags.format];
this.verbose = flags.verbose;

if (!this.verbose) {
this.disableLogs();
if (this.verbose) {
LOGGER.bindConsole();
} else {
LOGGER.disableLogs(this);
}

/**
Expand All @@ -70,42 +71,56 @@ export abstract class BaseCommand extends Command {

this.client = new Client(networkPreset);

if (UTILS.isDevMode()) {
this.info("DEV MODE IS ACTIVATED");
}
try {
if (UTILS.isDevMode()) {
this.info("DEV MODE IS ACTIVATED");
}
this.info(`node: ${this.api.getCurrentNode()}`);
const commandResult = await this.do(flags, args);
if (commandResult && Object.keys(commandResult).length > 0) {
// Keep super.log to force log
super.log(this.formater && this.formater.action ? this.formater.action(commandResult) : commandResult);
if (commandResult && typeof commandResult === "string") {
super.log(commandResult);
} else {
if (commandResult && Object.keys(commandResult).length > 0) {
// Keep super.log to force log
super.log(
this.formater && this.formater.action ? this.formater.action(commandResult) : commandResult,
);
}
}
} catch (globalCatchException) {
this.promptErrAndExit(globalCatchException.message);
this.stop(globalCatchException.message);
this.exit(1);
}
}

public info(message: string, ...args: any[]): void {
if (this.verbose || this._helpOverride()) {
message = typeof message === "string" ? message : util.inspect(message);
const info = color.yellowBright(`:info: ${util.format(message, ...args)}\n`);
process.stdout.write(info);
LOGGER.logWithLevel("info", message, ...args);
}
}

public warn(message: string, ...args: any[]): void {
LOGGER.logWithLevel("warn", message, ...args);
}

/**
* Always log and exit
* @param message
* @param args
*/
public stop(message: string, ...args: any[]): void {
LOGGER.logWithLevel("stop", message, ...args);
}

protected getAvailableFormats(): Formater[] {
return [OUTPUT_FORMAT.json];
}

protected getDefaultFormat(): Formater {
return OUTPUT_FORMAT.json;
}
protected abstract do(
flags: Record<string, any>,
args?: Record<string, any>,
): Promise<CommandOutput> | Promise<NestedCommandOutput>;
protected abstract do(flags: Record<string, any>, args?: Record<string, any>): Promise<any>;
protected abstract getCommand(): typeof BaseCommand;
protected abstract getCommandTechnicalName(): string;

protected logAttribute(label: string, value: string) {
this.log(`\t${label}: ${value}`);
Expand Down Expand Up @@ -162,22 +177,4 @@ export abstract class BaseCommand extends Command {
}
return transactionFromNetwork;
}

/**
*
* @param errorMsg Prompt error and exit command.
*/
private promptErrAndExit(errorMsg: string): void {
this.error(`[${this.getCommandTechnicalName()}] ${errorMsg}`);
this.exit(1);
}

private disableLogs(): void {
const disableFunction = (...args) => {
/*doNothing*/
};
["debug", "log", "info", "warn"].forEach(level => (console[level] = disableFunction));
["log", "warn", "info"].forEach(level => (this[level] = disableFunction));
// Do not override console.error and this.error
}
}
4 changes: 0 additions & 4 deletions src/commands/create-unik.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,6 @@ export class CreateUnikCommand extends WriteCommand {
return CreateUnikCommand;
}

protected getCommandTechnicalName(): string {
return "create-unik";
}

protected async do(flags: Record<string, any>): Promise<NestedCommandOutput> {
if (flags.explicitValue.length > EXPLICIT_VALUE_MAX_LENGTH) {
throw new Error(
Expand Down
13 changes: 1 addition & 12 deletions src/commands/create-wallet.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { color } from "@oclif/color";
import Command from "@oclif/command";
import { crypto } from "@uns/crypto";
import { generateMnemonic } from "bip39";
import { createHash, randomBytes } from "crypto";
Expand Down Expand Up @@ -28,10 +26,6 @@ export class CreateWalletCommand extends BaseCommand {
return CreateWalletCommand;
}

protected getCommandTechnicalName(): string {
return "create-wallet";
}

protected async do(flags: Record<string, any>): Promise<CommandOutput> {
const passphrase = await this.randomMnemonicSeed(128);
const keys = crypto.getKeys(passphrase);
Expand All @@ -45,12 +39,7 @@ export class CreateWalletCommand extends BaseCommand {
};

// Do not use this.error. It throws error and close. {exit: 0} option closes too.
console.error(
color.red(
"\n⚠️ WARNING: this information is not saved anywhere. You need to copy and save it by your own. ⚠️\n",
),
);

this.warn("This information is not saved anywhere. You need to copy and save it by your own.");
return wallet;
}

Expand Down
57 changes: 29 additions & 28 deletions src/commands/did-resolve.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { DidParserError, didResolve, ResourceWithChainMeta, UnikToken } from "@uns/ts-sdk";
import flatten from "flat";
import { BaseCommand } from "../baseCommand";
import { CommandOutput, Formater, NestedCommandOutput, OUTPUT_FORMAT } from "../formater";
import { Formater, OUTPUT_FORMAT } from "../formater";
import { confirmedFlag, getNetworksListListForDescription } from "../utils";

export class DidResolveCommand extends BaseCommand {
Expand Down Expand Up @@ -37,39 +37,40 @@ export class DidResolveCommand extends BaseCommand {
return DidResolveCommand;
}

protected getCommandTechnicalName(): string {
return "did-resolve";
}

protected async do(
flags: Record<string, any>,
args?: Record<string, any>,
): Promise<NestedCommandOutput | CommandOutput[]> {
protected async do(flags: Record<string, any>, args?: Record<string, any>): Promise<any> {
const didResolveNetwork = flags.network === "local" ? "TESTNET" : flags.network;

const resolved: ResourceWithChainMeta<UnikToken | string | number> | DidParserError = await didResolve(
args.did,
didResolveNetwork,
);

if (resolved instanceof Error) {
throw resolved;
let resolved: ResourceWithChainMeta<UnikToken | string | number> | DidParserError;
try {
resolved = await didResolve(args.did, didResolveNetwork);
} catch (error) {
if (error.response.status === 404) {
this.stop("DID does not exist");
} else {
this.stop("An error occurred. Please see details below:\n", error);
}
}

if (resolved.confirmations && resolved.confirmations < flags.confirmed) {
this.warn("DID has not reach the requested confirmation level.");
return undefined;
} else {
delete resolved.chainmeta;
delete resolved.confirmations;
if (resolved) {
if (resolved instanceof Error) {
// DidParserError
this.stop("DID does not match expected format");
} else {
if (resolved.confirmations && resolved.confirmations < flags.confirmed) {
this.warn("DID has not reach the requested confirmation level.");
} else {
delete resolved.chainmeta;
delete resolved.confirmations;

if (flags.format === OUTPUT_FORMAT.raw.key && resolved.data instanceof Object) {
const flattenResult = flatten(resolved.data);
this.log("", flattenResult);
return flattenResult;
if (flags.format === OUTPUT_FORMAT.raw.key && resolved.data instanceof Object) {
const flattenResult = flatten(resolved.data);
this.log("", flattenResult);
return flattenResult;
}
return resolved;
}
}

return resolved;
}
return "DID not resolved";
}
}
5 changes: 0 additions & 5 deletions src/commands/get-properties.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { flags } from "@oclif/command";
import { BaseCommand } from "../baseCommand";
import { CommandOutput, Formater, NestedCommandOutput, OUTPUT_FORMAT } from "../formater";
import { confirmedFlag, getNetworksListListForDescription, unikidFlag } from "../utils";
Expand All @@ -25,10 +24,6 @@ export class GetPropertiesCommand extends BaseCommand {
return GetPropertiesCommand;
}

protected getCommandTechnicalName(): string {
return "get-properties";
}

protected async do(flags: Record<string, any>): Promise<NestedCommandOutput | CommandOutput[]> {
const unik = await this.api.getUnikById(flags.unikid);
const lastTransaction = await this.api.getTransaction(unik.transactions.last.id);
Expand Down
4 changes: 0 additions & 4 deletions src/commands/read-unik.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,6 @@ export class ReadUnikCommand extends ReadCommand {
return ReadUnikCommand;
}

protected getCommandTechnicalName(): string {
return "read-unik";
}

protected async do(flags: Record<string, any>): Promise<NestedCommandOutput> {
checkUnikIdFormat(flags.unikid);

Expand Down
4 changes: 0 additions & 4 deletions src/commands/read-wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,6 @@ export class ReadWalletCommand extends ReadCommand {
return ReadWalletCommand;
}

protected getCommandTechnicalName(): string {
return "read-wallet";
}

protected async do(flags: Record<string, any>, args?: Record<string, any>): Promise<NestedCommandOutput> {
const walletId = args.walletId;
const wallet: any = await this.api.getWallet(walletId);
Expand Down
4 changes: 0 additions & 4 deletions src/commands/set-properties.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,6 @@ export class SetPropertiesCommand extends UpdatePropertiesCommand {
return SetPropertiesCommand;
}

protected getCommandTechnicalName(): string {
return "set-properties";
}

protected getProperties(flags: Record<string, any>): { [_: string]: string } {
const properties: { [_: string]: string } = {};
for (const prop of flags.properties) {
Expand Down
4 changes: 0 additions & 4 deletions src/commands/status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@ export class StatusCommand extends BaseCommand {
return StatusCommand;
}

protected getCommandTechnicalName(): string {
return "status";
}

protected async do(flags: Record<string, any>): Promise<CommandOutput> {
const unsSupply: any = await this.api.getSupply();

Expand Down
4 changes: 0 additions & 4 deletions src/commands/unset-properties.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,6 @@ export class UnsetProperties extends UpdateProperties {
return UnsetProperties;
}

protected getCommandTechnicalName(): string {
return "set-properties";
}

protected getProperties(flags: Record<string, any>): { [_: string]: string } {
const properties: { [_: string]: string } = {};

Expand Down
56 changes: 56 additions & 0 deletions src/logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { color } from "@oclif/color";
import Command from "@oclif/command";
import util from "util";

const LOGGER_COLOR_BY_LEVEL: any = {
stop: {
color: "#ff0000",
output: "stderr",
},
warn: {
color: "#ffa407",
output: "stderr",
},
info: {
color: "#6ecbfb",
output: "stdout",
},
debug: {
color: "#fbfa6e",
output: "stdout",
},
};

export const logWithLevel = (level: string, message: string, ...args: any[]): void => {
message = typeof message === "string" ? message : util.inspect(message);
const loggerConfig = LOGGER_COLOR_BY_LEVEL[level];
const log = color.hex(loggerConfig.color)(`» :${level}: ${util.format(message, ...args)};\n`);
process[loggerConfig.output].write(log);
};

export const bindConsole = (): void => {
console.info = (message?: any, ...optionalParams: any[]) => {
logWithLevel("info", message, ...optionalParams);
};

console.warn = (message?: any, ...optionalParams: any[]) => {
logWithLevel("warn", message, ...optionalParams);
};

console.error = (message?: any, ...optionalParams: any[]) => {
logWithLevel("stop", message, ...optionalParams);
};

console.debug = (message?: any, ...optionalParams: any[]) => {
logWithLevel("debug", message, ...optionalParams);
};
};

export const disableLogs = (command: Command): void => {
const disableFunction = (...args) => {
/*doNothing*/
};
["debug", "log", "info"].forEach(level => (console[level] = disableFunction));
["log", "info"].forEach(level => (command[level] = disableFunction));
// Do not override console.error, command.error, command.warn and command.stop
};
2 changes: 1 addition & 1 deletion test/__fixtures__/commands/create-unik.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export const meta = {
},
};

const verboseOutput = `:info: node: https://forger1.devnet.uns.network
const verboseOutput = `» :info: node: https://forger1.devnet.uns.network;
unikid: ${UNIK_ID}
Transaction id: ${TRANSACTION_ID}
Transaction in explorer: https://explorer.devnet.uns.network/transaction/${TRANSACTION_ID}
Expand Down
2 changes: 1 addition & 1 deletion test/__fixtures__/commands/status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ lastBlockUrl: https://explorer.devnet.uns.network/block/100015
const statusResultTable = `height;network;totalTokenSupply;tokenSymbol;numberOfUniks;activeDelegates;lastBlockUrl
100015;devnet;21199994;DUNS;1;7;https://explorer.devnet.uns.network/block/100015
`;
const infoNode = ":info: node: https://forger1.devnet.uns.network\n";
const infoNode = "» :info: node: https://forger1.devnet.uns.network;\n";

export const outputCases = [
{
Expand Down

0 comments on commit 0ab4d2d

Please sign in to comment.