From 9a5d89c746179af71e5e61b5274212a072c22549 Mon Sep 17 00:00:00 2001 From: Mohamed Ismail Date: Wed, 29 May 2024 08:35:07 +0200 Subject: [PATCH] feat(add-account): rename account type to from option and manual to key value (#2177) * feat(add-account): rename account type to from option and manual to key value * feat(account): update copy + add test --- .changeset/thick-trees-dance.md | 7 +++ .../src/account/accountAddOptions.ts | 2 +- .../kadena-cli/src/account/accountOptions.ts | 10 ++--- .../src/account/commands/accountAdd.ts | 14 +++--- ...countAddManual.ts => accountAddFromKey.ts} | 2 +- .../src/account/tests/accountAdd.test.ts | 43 ++++++++++--------- .../src/account/tests/accountDelete.test.ts | 4 +- .../src/account/tests/accountDetails.test.ts | 2 +- .../src/account/tests/accountFund.test.ts | 4 +- .../src/account/tests/accountList.test.ts | 4 +- .../tools/kadena-cli/src/prompts/account.ts | 10 ++--- 11 files changed, 55 insertions(+), 47 deletions(-) create mode 100644 .changeset/thick-trees-dance.md rename packages/tools/kadena-cli/src/account/commands/{accountAddManual.ts => accountAddFromKey.ts} (99%) diff --git a/.changeset/thick-trees-dance.md b/.changeset/thick-trees-dance.md new file mode 100644 index 0000000000..572151d8b4 --- /dev/null +++ b/.changeset/thick-trees-dance.md @@ -0,0 +1,7 @@ +--- +"@kadena/kadena-cli": minor +--- + +- Renamed `--type` option to `--from` in the `account add` command. +- Updated `--type=manual` to `--from=key` for specifying account addition via key file or manual entry. +- Improved descriptions in account from selection prompts for better clarity on available options. diff --git a/packages/tools/kadena-cli/src/account/accountAddOptions.ts b/packages/tools/kadena-cli/src/account/accountAddOptions.ts index 11c7c9ca6a..7349388ed2 100644 --- a/packages/tools/kadena-cli/src/account/accountAddOptions.ts +++ b/packages/tools/kadena-cli/src/account/accountAddOptions.ts @@ -2,7 +2,7 @@ import { globalOptions, securityOptions } from '../utils/globalOptions.js'; import { accountOptions } from './accountOptions.js'; export const options = [ - accountOptions.accountTypeSelection({ isOptional: false }), + accountOptions.accountFromSelection({ isOptional: false }), // common options accountOptions.accountAlias(), accountOptions.fungible(), diff --git a/packages/tools/kadena-cli/src/account/accountOptions.ts b/packages/tools/kadena-cli/src/account/accountOptions.ts index 4d36db2f41..adfbbe0272 100644 --- a/packages/tools/kadena-cli/src/account/accountOptions.ts +++ b/packages/tools/kadena-cli/src/account/accountOptions.ts @@ -19,14 +19,14 @@ import { import { isEmpty } from './utils/addHelpers.js'; export const accountOptions = { - accountTypeSelection: createOption({ - key: 'type' as const, + accountFromSelection: createOption({ + key: 'from' as const, defaultIsOptional: false, - prompt: account.accountTypeSelectionPrompt, + prompt: account.accountFromSelectionPrompt, validation: z.string(), option: new Option( - '-t, --type ', - 'Specify the method to add account details: "manual or wallet"', + '-f, --from ', + 'Specify the method to add account details: "key or wallet".', ), }), accountAlias: createOption({ diff --git a/packages/tools/kadena-cli/src/account/commands/accountAdd.ts b/packages/tools/kadena-cli/src/account/commands/accountAdd.ts index 79817bb1e9..7dabab1086 100644 --- a/packages/tools/kadena-cli/src/account/commands/accountAdd.ts +++ b/packages/tools/kadena-cli/src/account/commands/accountAdd.ts @@ -1,22 +1,22 @@ import { createCommand } from '../../utils/createCommand.js'; import { options } from '../accountAddOptions.js'; +import { addAccountFromKey } from './accountAddFromKey.js'; import { addAccountFromWallet } from './accountAddFromWallet.js'; -import { addAccountManual } from './accountAddManual.js'; export const createAddAccountCommand = createCommand( 'add', - 'Add an existing account locally to the CLI', + 'Add an existing account locally to the CLI. Use --from=key to select a key file or enter key details manually. Use --from=wallet to select from available wallets.', options, async (option) => { - const typeSelection = (await option.type()).type; + const accountFromSelection = (await option.from()).from; - if (typeSelection === 'manual') { - return addAccountManual(option); - } else if (typeSelection === 'wallet') { + if (accountFromSelection === 'key') { + return addAccountFromKey(option); + } else if (accountFromSelection === 'wallet') { return addAccountFromWallet(option); } else { throw new Error( - `Invalid account type : ${typeSelection}. Supported types are 'manual' and 'wallet'`, + `Invalid account from value: ${accountFromSelection}. Supported values are "key" and "wallet".`, ); } }, diff --git a/packages/tools/kadena-cli/src/account/commands/accountAddManual.ts b/packages/tools/kadena-cli/src/account/commands/accountAddFromKey.ts similarity index 99% rename from packages/tools/kadena-cli/src/account/commands/accountAddManual.ts rename to packages/tools/kadena-cli/src/account/commands/accountAddFromKey.ts index 73e887593a..c5534c6461 100644 --- a/packages/tools/kadena-cli/src/account/commands/accountAddManual.ts +++ b/packages/tools/kadena-cli/src/account/commands/accountAddFromKey.ts @@ -13,7 +13,7 @@ import { displayAddAccountSuccess } from '../utils/addHelpers.js'; import { createAccountName } from '../utils/createAccountName.js'; import { getAccountDetails } from '../utils/getAccountDetails.js'; -export const addAccountManual = async ( +export const addAccountFromKey = async ( option: CommandOption, ): Promise => { const accountAlias = (await option.accountAlias()).accountAlias; diff --git a/packages/tools/kadena-cli/src/account/tests/accountAdd.test.ts b/packages/tools/kadena-cli/src/account/tests/accountAdd.test.ts index 2214d5a63d..7cda50a7ac 100644 --- a/packages/tools/kadena-cli/src/account/tests/accountAdd.test.ts +++ b/packages/tools/kadena-cli/src/account/tests/accountAdd.test.ts @@ -12,10 +12,7 @@ describe('account add manual type', () => { const root = path.join(__dirname, '../../../'); const configPath = path.join(root, '.kadena'); const accountPath = path.join(configPath, ACCOUNT_DIR); - const accountAliasFile = path.join( - accountPath, - 'account-add-test-manual.yaml', - ); + const accountAliasFile = path.join(accountPath, 'account-add-test.yaml'); beforeEach(async () => { if (await services.filesystem.fileExists(accountAliasFile)) { await services.filesystem.deleteFile(accountAliasFile); @@ -29,12 +26,12 @@ describe('account add manual type', () => { it('should add an account alias using manual type without on chain verification', async () => { mockPrompts({ select: { - 'How would you like to add the account locally?': 'manual', + 'How would you like to add the account locally?': 'key', 'Select a keyset predicate:': 'keys-all', 'Do you want to verify the account on chain?': false, }, input: { - 'Enter an alias for an account:': 'account-add-test-manual', + 'Enter an alias for an account:': 'account-add-test', 'Enter an account name (optional):': 'k:pubkey1', 'Enter the name of a fungible:': 'coin', 'Enter one or more public keys (comma separated):': 'pubkey1,pubkey2', @@ -51,12 +48,12 @@ describe('account add manual type', () => { it('should add an account alias using manual type with on chain verification', async () => { mockPrompts({ select: { - 'How would you like to add the account locally?': 'manual', + 'How would you like to add the account locally?': 'key', 'Do you want to verify the account on chain?': true, 'Select a network:': 'testnet', }, input: { - 'Enter an alias for an account:': 'account-add-test-manual-chain', + 'Enter an alias for an account:': 'account-add-test-chain', 'Enter an account name (optional):': 'k:pubkey1', 'Enter the name of a fungible:': 'coin', 'Enter ChainId (0-19):': '1', @@ -64,10 +61,7 @@ describe('account add manual type', () => { }); await runCommand('account add'); - const aliasFile = path.join( - accountPath, - 'account-add-test-manual-chain.yaml', - ); + const aliasFile = path.join(accountPath, 'account-add-test-chain.yaml'); expect(await services.filesystem.fileExists(aliasFile)).toBe(true); const content = await services.filesystem.readFile(aliasFile); expect(jsYaml.load(content!)).toEqual({ @@ -89,12 +83,12 @@ describe('account add manual type', () => { ); mockPrompts({ select: { - 'How would you like to add the account locally?': 'manual', + 'How would you like to add the account locally?': 'key', 'Select a keyset predicate:': 'keys-all', 'Do you want to verify the account on chain?': false, }, input: { - 'Enter an alias for an account:': 'account-add-test-manual', + 'Enter an alias for an account:': 'account-add-test', 'Enter an account name (optional):': '', 'Enter the name of a fungible:': 'coin', 'Enter one or more public keys (comma separated):': 'pubkey1,pubkey2', @@ -117,7 +111,7 @@ describe('account add manual type', () => { it('should add an account alias manual with quiet flag', async () => { await runCommand( - 'account add --type=manual --account-alias=account-add-test-manual --account-name=k:pubkey1 --fungible=coin --verify --network=testnet --chain-id=1', + 'account add --from=key --account-alias=account-add-test --account-name=k:pubkey1 --fungible=coin --verify --network=testnet --chain-id=1', ); expect(await services.filesystem.fileExists(accountAliasFile)).toBe(true); const content = await services.filesystem.readFile(accountAliasFile); @@ -128,6 +122,16 @@ describe('account add manual type', () => { predicate: 'keys-all', }); }); + + it('should throw an error when user tries to add an account with unsupported "from" value', async () => { + const res = await runCommand( + 'account add --from=test --account-alias=account-add-test --account-name=k:pubkey1 --fungible=coin --verify --network=testnet --chain-id=1', + ); + expect(res.stderr).toContain( + 'Invalid account from value: test. Supported values are "key" and "wallet".', + ); + expect(await services.filesystem.fileExists(accountAliasFile)).toBe(false); + }); }); describe('account add type wallet', () => { @@ -135,10 +139,7 @@ describe('account add type wallet', () => { const configPath = path.join(root, '.kadena'); const accountPath = path.join(configPath, ACCOUNT_DIR); const walletFilePath = path.join(configPath, WALLET_DIR, 'test-wallet.yaml'); - const accountAliasFile = path.join( - accountPath, - 'account-add-test-manual.yaml', - ); + const accountAliasFile = path.join(accountPath, 'account-add-test.yaml'); let publicKey: string; let generatedKey: string; beforeEach(async () => { @@ -195,7 +196,7 @@ describe('account add type wallet', () => { 'Select a keyset predicate:': 'keys-all', }, input: { - 'Enter an alias for an account:': 'account-add-test-manual', + 'Enter an alias for an account:': 'account-add-test', 'Enter the name of a fungible:': 'coin', }, checkbox: { @@ -230,7 +231,7 @@ describe('account add type wallet', () => { 'Select a keyset predicate:': 'keys-all', }, input: { - 'Enter an alias for an account:': 'account-add-test-manual', + 'Enter an alias for an account:': 'account-add-test', 'Enter the name of a fungible:': 'coin', }, checkbox: { diff --git a/packages/tools/kadena-cli/src/account/tests/accountDelete.test.ts b/packages/tools/kadena-cli/src/account/tests/accountDelete.test.ts index 411de3eeed..9edaa0a615 100644 --- a/packages/tools/kadena-cli/src/account/tests/accountDelete.test.ts +++ b/packages/tools/kadena-cli/src/account/tests/accountDelete.test.ts @@ -18,7 +18,7 @@ describe('account delete', () => { beforeEach(async () => { // Add account alias file await runCommand( - 'account add --type=manual --account-alias=account-add-test-manual --account-name=accountName --fungible=coin --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', + 'account add --from=key --account-alias=account-add-test-manual --account-name=accountName --fungible=coin --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', ); await services.filesystem.fileExists(accountAliasFile); @@ -77,7 +77,7 @@ describe('account delete', () => { // Add one more account alias // Add account alias file await runCommand( - 'account add --type=manual --account-alias=another-account-alias --account-name=accountName --fungible=coin --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', + 'account add --from=key --account-alias=another-account-alias --account-name=accountName --fungible=coin --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', ); mockPrompts({ select: { diff --git a/packages/tools/kadena-cli/src/account/tests/accountDetails.test.ts b/packages/tools/kadena-cli/src/account/tests/accountDetails.test.ts index f20e13cdff..e7293732a1 100644 --- a/packages/tools/kadena-cli/src/account/tests/accountDetails.test.ts +++ b/packages/tools/kadena-cli/src/account/tests/accountDetails.test.ts @@ -27,7 +27,7 @@ describe('account details', () => { it('should fetch account details based on the account alias file', async () => { // Pre add the account alias file to make sure account alias exists await runCommand( - 'account add --type=manual --account-alias=account-add-test-manual --account-name=accountName --fungible=coin --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', + 'account add --from=key --account-alias=account-add-test-manual --account-name=accountName --fungible=coin --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', ); mockPrompts({ diff --git a/packages/tools/kadena-cli/src/account/tests/accountFund.test.ts b/packages/tools/kadena-cli/src/account/tests/accountFund.test.ts index 406549c1ef..b4217a4ce4 100644 --- a/packages/tools/kadena-cli/src/account/tests/accountFund.test.ts +++ b/packages/tools/kadena-cli/src/account/tests/accountFund.test.ts @@ -13,7 +13,7 @@ describe('account fund', () => { beforeEach(async () => { // Pre add the account alias file to make sure account alias exists await runCommand( - 'account add --type=manual --account-alias=account-add-test-manual --account-name=accountName --fungible=coin --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', + 'account add --from=key --account-alias=account-add-test-manual --account-name=accountName --fungible=coin --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', ); }); @@ -140,7 +140,7 @@ describe('account fund', () => { it('should not fund an account when user tries to fund other than coin fungible with quiet flag', async () => { await runCommand( - 'account add --type=manual --account-alias=kdx-account --account-name=accountName --fungible=kdx --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', + 'account add --from=key --account-alias=kdx-account --account-name=accountName --fungible=kdx --network=testnet --chain-id=1 --public-keys=publicKey1 --quiet', ); const res = await runCommand( 'account fund --account=kdx-account --amount=1 --network=testnet --chain-ids=1', diff --git a/packages/tools/kadena-cli/src/account/tests/accountList.test.ts b/packages/tools/kadena-cli/src/account/tests/accountList.test.ts index f9a50e47f2..c89d68df91 100644 --- a/packages/tools/kadena-cli/src/account/tests/accountList.test.ts +++ b/packages/tools/kadena-cli/src/account/tests/accountList.test.ts @@ -9,10 +9,10 @@ describe('account list', () => { beforeEach(async () => { // Pre add the account alias file to make sure account alias exists await runCommand( - 'account add --type=manual --account-alias=account-one --account-name=k:55e10019549e047e68efaa18489ed785eca271642e2d0ce41d56ced2a30ccb84 --fungible=coin --network=testnet --chain-id=1 --public-keys=55e10019549e047e68efaa18489ed785eca271642e2d0ce41d56ced2a30ccb84 --quiet', + 'account add --from=key --account-alias=account-one --account-name=k:55e10019549e047e68efaa18489ed785eca271642e2d0ce41d56ced2a30ccb84 --fungible=coin --network=testnet --chain-id=1 --public-keys=55e10019549e047e68efaa18489ed785eca271642e2d0ce41d56ced2a30ccb84 --quiet', ); await runCommand( - 'account add --type=manual --account-alias=account-two --account-name=w:yCvUbeS6RqdKsY3WBDB3cgK-6q790xkj4Hb-ABpu3gg:keys-all --fungible=coin --network=testnet --chain-id=1 --public-keys=39710afef15243ba36007ae7aa210ab0e09682b2d963928be350e3424b5a420b,0f745a7773cbaffedcc7303b0638ffb34516aa3af98605f39dda3aeb730318c9 --quiet', + 'account add --from=key --account-alias=account-two --account-name=w:yCvUbeS6RqdKsY3WBDB3cgK-6q790xkj4Hb-ABpu3gg:keys-all --fungible=coin --network=testnet --chain-id=1 --public-keys=39710afef15243ba36007ae7aa210ab0e09682b2d963928be350e3424b5a420b,0f745a7773cbaffedcc7303b0638ffb34516aa3af98605f39dda3aeb730318c9 --quiet', ); }); diff --git a/packages/tools/kadena-cli/src/prompts/account.ts b/packages/tools/kadena-cli/src/prompts/account.ts index a798ef9dd5..ea3f4cdb04 100644 --- a/packages/tools/kadena-cli/src/prompts/account.ts +++ b/packages/tools/kadena-cli/src/prompts/account.ts @@ -385,7 +385,7 @@ export const publicKeysForAccountAddPrompt: IPrompt = async ( args, isOptional, ) => { - if (previousQuestions.type === 'manual') { + if (previousQuestions.from === 'key') { return addManualPublicKeysPrompt(previousQuestions, args, isOptional); } @@ -429,17 +429,17 @@ export const publicKeysForAccountAddPrompt: IPrompt = async ( return selectedKeys.join(','); }; -export const accountTypeSelectionPrompt: IPrompt = async () => { +export const accountFromSelectionPrompt: IPrompt = async () => { return await select({ message: `How would you like to add the account locally?`, choices: [ { - value: 'manual', - name: 'Manually - Provide public keys to add to account manually', + value: 'key', + name: 'Key - Add an account by by providing public keys from a key file or entering key details manually', }, { value: 'wallet', - name: 'Wallet - Provide public keys to add to account by selecting from a wallet', + name: 'Wallet - Add an account by by providing public keys from a list of available wallets', }, ], });