diff --git a/README.md b/README.md index fe19ee83..5fef21cc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# plugin-env; +# plugin-env [![NPM](https://img.shields.io/npm/v/@salesforce/plugin-env.svg?label=@salesforce/plugin-env)](https://www.npmjs.com/package/@salesforce/plugin-env) [![CircleCI](https://circleci.com/gh/salesforcecli/plugin-env/tree/main.svg?style=shield)](https://circleci.com/gh/salesforcecli/plugin-env/tree/main) [![Downloads/week](https://img.shields.io/npm/dw/@salesforce/plugin-env.svg)](https://npmjs.org/package/@salesforce/plugin-env) [![License](https://img.shields.io/badge/License-BSD%203--Clause-brightgreen.svg)](https://raw.githubusercontent.com/salesforcecli/plugin-env/main/LICENSE.txt) diff --git a/command-snapshot.json b/command-snapshot.json index 1f045d34..9bd12145 100644 --- a/command-snapshot.json +++ b/command-snapshot.json @@ -1,4 +1,9 @@ [ + { + "command": "env:display", + "plugin": "@salesforce/plugin-env", + "flags": ["environment"] + }, { "command": "env:list", "plugin": "@salesforce/plugin-env", diff --git a/messages/display.md b/messages/display.md new file mode 100644 index 00000000..aed227b5 --- /dev/null +++ b/messages/display.md @@ -0,0 +1,28 @@ +# description + +Display details about a specific environment + +# examples + +- sf env display -e my-scratch-org +- sf env display -e user@name.com + +# flags.environment.summary + +Environment name or alias to display. + +# error.NoResultsFound + +No results found + +# error.NoEnvFound + +No environment found for %s. + +# error.NoDefaultEnv + +No default environment found. Use -e or --environment to specify which env to open. + +# error.NoAuthsAvailable + +There are no authentications available. diff --git a/messages/list.md b/messages/list.md index e69de29b..270dd5be 100644 --- a/messages/list.md +++ b/messages/list.md @@ -0,0 +1,20 @@ +# description + +List the environments you’ve created or logged into. + +# examples + +- sf env list +- sf env list --all + +# flags.all.summary + +Show all environments, including inactive orgs. + +# error.NoAuthsAvailable + +There are no authentications available. + +# error.NoResultsFound + +No results found diff --git a/schemas/env-display.json b/schemas/env-display.json new file mode 100644 index 00000000..11ac4ad5 --- /dev/null +++ b/schemas/env-display.json @@ -0,0 +1,94 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/SfOrgs", + "definitions": { + "SfOrgs": { + "type": "array", + "items": { + "$ref": "#/definitions/SfOrg" + } + }, + "SfOrg": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Optional%3CAnyJson%3E" + }, + "properties": { + "alias": { + "type": "string" + }, + "username": { + "type": "string" + }, + "orgId": { + "type": "string" + }, + "instanceUrl": { + "type": "string" + }, + "accessToken": { + "type": "string" + }, + "oauthMethod": { + "type": "string", + "enum": ["jwt", "web", "token", "unknown"] + }, + "error": { + "type": "string" + } + } + }, + "Optional": { + "anyOf": [ + { + "$ref": "#/definitions/AnyJson" + }, + { + "not": {} + } + ], + "description": "A union type for either the parameterized type `T` or `undefined` -- the opposite of {@link NonOptional } ." + }, + "AnyJson": { + "anyOf": [ + { + "$ref": "#/definitions/JsonPrimitive" + }, + { + "$ref": "#/definitions/JsonCollection" + } + ], + "description": "Any valid JSON value." + }, + "JsonPrimitive": { + "type": ["null", "boolean", "number", "string"], + "description": "Any valid JSON primitive value." + }, + "JsonCollection": { + "anyOf": [ + { + "$ref": "#/definitions/JsonMap" + }, + { + "$ref": "#/definitions/JsonArray" + } + ], + "description": "Any valid JSON collection value." + }, + "JsonMap": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Optional%3CAnyJson%3E" + }, + "properties": {}, + "description": "Any JSON-compatible object." + }, + "JsonArray": { + "type": "array", + "items": { + "$ref": "#/definitions/AnyJson" + }, + "description": "Any JSON-compatible array." + } + } +} diff --git a/src/commands/env/display.ts b/src/commands/env/display.ts new file mode 100644 index 00000000..568e78ad --- /dev/null +++ b/src/commands/env/display.ts @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2021, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ + +import { Command, flags } from '@oclif/command'; +import { cli } from 'cli-ux'; +import { AuthInfo, SfOrg, Messages, SfdxError } from '@salesforce/core'; + +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@salesforce/plugin-env', 'display'); + +export type SfOrgs = SfOrg[]; + +export default class EnvDisplay extends Command { + public static readonly description = messages.getMessage('description'); + public static readonly examples = messages.getMessages('examples'); + public static flags = { + environment: flags.string({ + char: 'e', + description: messages.getMessage('flags.environment.summary'), + }), + }; + + public flags: { + environment: string; + }; + + // TODO: Change SfOrg type to a more generalized auth type once we have Functions envs integrated. + + public async run(): Promise { + this.flags = this.parse(EnvDisplay).flags; + + let authorizations: SfOrg[]; + let foundAuthorization: SfOrg; + + try { + if (await AuthInfo.hasAuthentications()) { + authorizations = await AuthInfo.listAllAuthorizations(); + + if (!this.flags.environment) { + // TODO this should be retrieved from sf config once we have those commands. If not found, still throw. + throw messages.createError('error.NoDefaultEnv'); + } + + foundAuthorization = authorizations.filter((auth) => auth.username === this.flags.environment)[0]; + if (!foundAuthorization) { + foundAuthorization = authorizations.filter((auth) => auth.alias === this.flags.environment)[0]; + } + + if (foundAuthorization) { + const columns = { + key: {}, + value: {}, + }; + + cli.table( + Object.keys(foundAuthorization).map((key, i) => ({ key, value: Object.values(foundAuthorization)[i] })), + columns + ); + } else { + throw new SfdxError(messages.getMessage('error.NoEnvFound', [this.flags.environment])); + } + } else { + throw messages.createError('error.NoAuthsAvailable'); + } + } catch (error) { + const err = error as SfdxError; + cli.log(messages.getMessage('error.NoResultsFound')); + cli.error(err); + } + + return authorizations; + } +} diff --git a/src/commands/env/list.ts b/src/commands/env/list.ts index 69eb5898..8feb3092 100644 --- a/src/commands/env/list.ts +++ b/src/commands/env/list.ts @@ -5,28 +5,22 @@ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ -import { EOL } from 'os'; - import { Command, flags } from '@oclif/command'; import { cli, Table } from 'cli-ux'; -import { AuthInfo, SfOrg, SfdxError } from '@salesforce/core'; +import { AuthInfo, SfOrg, Messages, SfdxError } from '@salesforce/core'; -// TODO: add back once md messages are supported -// Messages.importMessagesDirectory(__dirname); -// const messages = Messages.loadMessages('@salesforce/plugin-env', 'list'); +Messages.importMessagesDirectory(__dirname); +const messages = Messages.loadMessages('@salesforce/plugin-env', 'list'); export type SfOrgs = SfOrg[]; export default class EnvList extends Command { - // TODO: add back once md messages are supported - // public static readonly description = messages.getMessage('description'); - // public static readonly examples = messages.getMessage('examples').split(EOL); - public static readonly description = 'list environments'; - public static readonly examples = 'sf env list\nsf env list --all'.split(EOL); + public static readonly description = messages.getMessage('description'); + public static readonly examples = messages.getMessages('examples'); public static flags = { all: flags.boolean({ char: 'a', - description: "show all environments regardless of whether they're connected or not", + description: messages.getMessage('flags.all.summary'), }), ...cli.table.flags(), }; @@ -65,15 +59,13 @@ export default class EnvList extends Command { get: (row) => row.error ?? '', } as Table.table.Columns>; } - cli.styledHeader('Authenticated Envs'); - cli.table(authorizations, columns, this.flags); + cli.table(authorizations, columns, { title: 'Authenticated Envs', ...this.flags }); } else { - throw new SfdxError('There are no authorizations available.'); + throw messages.createError('error.NoAuthsAvailable'); } } catch (error) { const err = error as SfdxError; - // TODO: add back once md messages are supported - // cli.log(messages.getMessage('noResultsFound')); + cli.log(messages.getMessage('error.NoResultsFound')); cli.error(err); }