Skip to content

Commit 113d56a

Browse files
authored
feat: use new inquirer (#902)
* feat: use new inquirer * fix: use new sf-plugins-core prompts * refactor: real plugins-core, use built-in confirm prompt * chore: bump deps
1 parent 9f96395 commit 113d56a

21 files changed

+516
-659
lines changed

command-snapshot.json

+1-11
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,7 @@
2525
{
2626
"command": "org:login:device",
2727
"plugin": "@salesforce/plugin-auth",
28-
"flags": [
29-
"alias",
30-
"client-id",
31-
"disable-masking",
32-
"instance-url",
33-
"json",
34-
"loglevel",
35-
"set-default",
36-
"set-default-dev-hub"
37-
],
28+
"flags": ["alias", "client-id", "instance-url", "json", "loglevel", "set-default", "set-default-dev-hub"],
3829
"alias": ["force:auth:device:login", "auth:device:login"],
3930
"flagChars": ["a", "d", "i", "r", "s"],
4031
"flagAliases": [
@@ -111,7 +102,6 @@
111102
"alias",
112103
"browser",
113104
"client-id",
114-
"disable-masking",
115105
"instance-url",
116106
"json",
117107
"loglevel",

messages/messages.md

-4
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,6 @@ Do you want to authorize this org for use with the Salesforce CLI?
4040

4141
Don't prompt for confirmation.
4242

43-
# flags.disable-masking.summary
44-
45-
Disable masking of user input; use with problematic terminals.
46-
4743
# clientSecretStdin
4844

4945
OAuth client secret of personal connected app? Press Enter if it's not required.

package.json

+8-6
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
"author": "Salesforce",
66
"bugs": "https://github.com/forcedotcom/cli/issues",
77
"dependencies": {
8-
"@oclif/core": "^3.16.0",
9-
"@salesforce/core": "^6.4.4",
8+
"@inquirer/checkbox": "^1.5.0",
9+
"@inquirer/select": "^1.3.1",
10+
"@oclif/core": "^3.18.0",
11+
"@salesforce/core": "^6.4.6",
1012
"@salesforce/kit": "^3.0.15",
11-
"@salesforce/sf-plugins-core": "^5.0.13",
13+
"@salesforce/sf-plugins-core": "^7.1.1",
1214
"@salesforce/ts-types": "^2.0.9",
1315
"chalk": "^5.3.0",
1416
"open": "^9.1.0"
@@ -17,10 +19,10 @@
1719
"@oclif/plugin-command-snapshot": "^5.0.5",
1820
"@salesforce/cli-plugins-testkit": "^5.1.3",
1921
"@salesforce/dev-scripts": "^8.2.0",
20-
"@salesforce/plugin-command-reference": "^3.0.59",
22+
"@salesforce/plugin-command-reference": "^3.0.61",
2123
"@salesforce/ts-sinon": "^1.4.19",
22-
"eslint-plugin-sf-plugin": "^1.17.0",
23-
"oclif": "^4.1.0",
24+
"eslint-plugin-sf-plugin": "^1.17.1",
25+
"oclif": "^4.2.0",
2426
"shx": "0.3.4",
2527
"ts-node": "^10.9.2",
2628
"typescript": "^5.3.3"

src/authBaseCommand.ts

-54
This file was deleted.

src/commands/org/list/auth.ts

+3-7
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
66
*/
77

8-
9-
108
import { loglevel, SfCommand } from '@salesforce/sf-plugins-core';
119
import { AuthInfo, Messages, OrgAuthorization } from '@salesforce/core';
1210
type AuthListResult = Omit<OrgAuthorization, 'aliases'> & { alias: string };
1311
export type AuthListResults = AuthListResult[];
14-
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url)
12+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
1513
const messages = Messages.loadMessages('@salesforce/plugin-auth', 'list');
1614

1715
export default class ListAuth extends SfCommand<AuthListResults> {
@@ -40,16 +38,14 @@ export default class ListAuth extends SfCommand<AuthListResults> {
4038
});
4139

4240
const hasErrors = auths.filter((auth) => !!auth.error).length > 0;
43-
let columns = {
41+
const columns = {
4442
alias: { header: 'ALIAS' },
4543
username: { header: 'USERNAME' },
4644
orgId: { header: 'ORG ID' },
4745
instanceUrl: { header: 'INSTANCE URL' },
4846
oauthMethod: { header: 'AUTH METHOD' },
47+
...(hasErrors ? { error: { header: 'ERROR' } } : {}),
4948
};
50-
if (hasErrors) {
51-
columns = { ...columns, ...{ error: { header: 'ERROR' } } };
52-
}
5349
this.styledHeader('authenticated orgs');
5450
this.table(mappedAuths, columns);
5551
return mappedAuths;

src/commands/org/login/access-token.ts

+12-12
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,23 @@
55
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
66
*/
77

8-
9-
10-
import { Flags, loglevel } from '@salesforce/sf-plugins-core';
8+
import { Flags, loglevel, SfCommand } from '@salesforce/sf-plugins-core';
119
import { AuthFields, AuthInfo, Messages, matchesAccessToken, SfError, StateAggregator } from '@salesforce/core';
1210
import { env } from '@salesforce/kit';
13-
import { Interfaces } from '@oclif/core';
14-
import { AuthBaseCommand } from '../../../authBaseCommand.js';
11+
import { InferredFlags } from '@oclif/core/lib/interfaces';
1512

16-
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url)
13+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
1714
const messages = Messages.loadMessages('@salesforce/plugin-auth', 'accesstoken.store');
1815
const commonMessages = Messages.loadMessages('@salesforce/plugin-auth', 'messages');
1916

2017
const ACCESS_TOKEN_FORMAT = '"<org id>!<accesstoken>"';
2118

22-
export default class LoginAccessToken extends AuthBaseCommand<AuthFields> {
19+
export default class LoginAccessToken extends SfCommand<AuthFields> {
2320
public static readonly summary = messages.getMessage('summary');
2421
public static readonly description = messages.getMessage('description');
2522
public static readonly examples = messages.getMessages('examples');
2623
public static readonly deprecateAliases = true;
27-
public static aliases = ['force:auth:accesstoken:store', 'auth:accesstoken:store'];
24+
public static readonly aliases = ['force:auth:accesstoken:store', 'auth:accesstoken:store'];
2825

2926
public static readonly flags = {
3027
'instance-url': Flags.url({
@@ -66,7 +63,7 @@ export default class LoginAccessToken extends AuthBaseCommand<AuthFields> {
6663
loglevel,
6764
};
6865

69-
private flags!: Interfaces.InferredFlags<typeof LoginAccessToken.flags>;
66+
private flags!: InferredFlags<typeof LoginAccessToken.flags>;
7067

7168
public async run(): Promise<AuthFields> {
7269
const { flags } = await this.parse(LoginAccessToken);
@@ -109,16 +106,19 @@ export default class LoginAccessToken extends AuthBaseCommand<AuthFields> {
109106
if (!this.flags['no-prompt']) {
110107
const stateAggregator = await StateAggregator.getInstance();
111108
if (await stateAggregator.orgs.exists(username)) {
112-
return this.confirm(messages.getMessage('overwriteAccessTokenAuthUserFile', [username]));
109+
return this.confirm({ message: messages.getMessage('overwriteAccessTokenAuthUserFile', [username]) });
113110
}
114111
}
115112
return true;
116113
}
117114

118115
private async getAccessToken(): Promise<string> {
119116
const accessToken =
120-
env.getString('SF_ACCESS_TOKEN') ?? env.getString('SFDX_ACCESS_TOKEN') ?? (await this.askForAccessToken());
121-
117+
env.getString('SF_ACCESS_TOKEN') ??
118+
env.getString('SFDX_ACCESS_TOKEN') ??
119+
(this.flags['no-prompt'] === true
120+
? '' // will throw when validating
121+
: await this.secretPrompt({ message: commonMessages.getMessage('accessTokenStdin') }));
122122
if (!matchesAccessToken(accessToken)) {
123123
throw new SfError(messages.getMessage('invalidAccessTokenFormat', [ACCESS_TOKEN_FORMAT]));
124124
}

src/commands/org/login/device.ts

+6-13
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,22 @@
66
*/
77

88
import { AuthFields, AuthInfo, DeviceOauthService, Messages, OAuth2Config } from '@salesforce/core';
9-
import { Flags, loglevel } from '@salesforce/sf-plugins-core';
9+
import { Flags, SfCommand, loglevel } from '@salesforce/sf-plugins-core';
1010
import { DeviceCodeResponse } from '@salesforce/core/lib/deviceOauthService.js';
1111
import { ux } from '@oclif/core';
12-
import { AuthBaseCommand } from '../../../authBaseCommand.js';
13-
import { Common } from '../../../common.js';
12+
import common from '../../../common.js';
1413

1514
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
1615
const messages = Messages.loadMessages('@salesforce/plugin-auth', 'device.login');
1716
const commonMessages = Messages.loadMessages('@salesforce/plugin-auth', 'messages');
1817

1918
export type DeviceLoginResult = (AuthFields & DeviceCodeResponse) | Record<string, never>;
2019

21-
export default class LoginDevice extends AuthBaseCommand<DeviceLoginResult> {
20+
export default class LoginDevice extends SfCommand<DeviceLoginResult> {
2221
public static readonly summary = messages.getMessage('summary');
2322
public static readonly description = messages.getMessage('description');
2423
public static readonly examples = messages.getMessages('examples');
25-
public static aliases = ['force:auth:device:login', 'auth:device:login'];
24+
public static readonly aliases = ['force:auth:device:login', 'auth:device:login'];
2625
public static readonly deprecateAliases = true;
2726

2827
public static readonly flags = {
@@ -57,21 +56,15 @@ export default class LoginDevice extends AuthBaseCommand<DeviceLoginResult> {
5756
deprecateAliases: true,
5857
aliases: ['setalias'],
5958
}),
60-
'disable-masking': Flags.boolean({
61-
summary: commonMessages.getMessage('flags.disable-masking.summary'),
62-
hidden: true,
63-
deprecateAliases: true,
64-
aliases: ['disablemasking'],
65-
}),
6659
loglevel,
6760
};
6861

6962
public async run(): Promise<DeviceLoginResult> {
7063
const { flags } = await this.parse(LoginDevice);
71-
if (await this.shouldExitCommand(false)) return {};
64+
if (await common.shouldExitCommand(false)) return {};
7265

7366
const oauthConfig: OAuth2Config = {
74-
loginUrl: await Common.resolveLoginUrl(flags['instance-url']?.href),
67+
loginUrl: await common.resolveLoginUrl(flags['instance-url']?.href),
7568
clientId: flags['client-id'],
7669
};
7770

src/commands/org/login/jwt.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,25 @@
55
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
66
*/
77

8-
import { Flags, loglevel } from '@salesforce/sf-plugins-core';
8+
import { Flags, SfCommand, loglevel } from '@salesforce/sf-plugins-core';
99
import { AuthFields, AuthInfo, AuthRemover, Logger, Messages, SfError } from '@salesforce/core';
1010
import { Interfaces } from '@oclif/core';
11-
import { AuthBaseCommand } from '../../../authBaseCommand.js';
12-
import { Common } from '../../../common.js';
11+
import common from '../../../common.js';
1312

1413
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
1514
const messages = Messages.loadMessages('@salesforce/plugin-auth', 'jwt.grant');
1615
const commonMessages = Messages.loadMessages('@salesforce/plugin-auth', 'messages');
1716

18-
export default class LoginJwt extends AuthBaseCommand<AuthFields> {
17+
export default class LoginJwt extends SfCommand<AuthFields> {
1918
public static readonly summary = messages.getMessage('summary');
2019
public static readonly description = messages.getMessage('description');
2120
public static readonly examples = messages.getMessages('examples');
22-
public static aliases = ['force:auth:jwt:grant', 'auth:jwt:grant'];
21+
public static readonly aliases = ['force:auth:jwt:grant', 'auth:jwt:grant'];
2322
public static readonly deprecateAliases = true;
2423

2524
public static readonly flags = {
2625
username: Flags.string({
26+
// eslint-disable-next-line sf-plugin/dash-o
2727
char: 'o',
2828
summary: messages.getMessage('flags.username.summary'),
2929
required: true,
@@ -87,7 +87,7 @@ export default class LoginJwt extends AuthBaseCommand<AuthFields> {
8787
this.flags = flags;
8888
let result: AuthFields = {};
8989

90-
if (await this.shouldExitCommand(flags['no-prompt'])) return {};
90+
if (await common.shouldExitCommand(flags['no-prompt'])) return {};
9191

9292
try {
9393
const authInfo = await this.initAuthInfo();
@@ -116,7 +116,7 @@ export default class LoginJwt extends AuthBaseCommand<AuthFields> {
116116
privateKeyFile: this.flags['jwt-key-file'],
117117
};
118118

119-
const loginUrl = await Common.resolveLoginUrl(this.flags['instance-url']?.href);
119+
const loginUrl = await common.resolveLoginUrl(this.flags['instance-url']?.href);
120120

121121
const oauth2Options = loginUrl ? Object.assign(oauth2OptionsBase, { loginUrl }) : oauth2OptionsBase;
122122

src/commands/org/login/sfdx-url.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
*/
77

88
import fs from 'node:fs/promises';
9-
import { Flags, loglevel } from '@salesforce/sf-plugins-core';
9+
import { Flags, SfCommand, loglevel } from '@salesforce/sf-plugins-core';
1010
import { AuthFields, AuthInfo, Messages } from '@salesforce/core';
1111
import { AnyJson } from '@salesforce/ts-types';
1212
import { parseJson } from '@salesforce/kit';
13-
import { AuthBaseCommand } from '../../../authBaseCommand.js';
13+
import common from '../../../common.js';
1414

1515
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
1616
const messages = Messages.loadMessages('@salesforce/plugin-auth', 'sfdxurl.store');
@@ -22,11 +22,11 @@ type AuthJson = AnyJson & {
2222
result?: AnyJson & { sfdxAuthUrl: string };
2323
sfdxAuthUrl: string;
2424
};
25-
export default class LoginSfdxUrl extends AuthBaseCommand<AuthFields> {
25+
export default class LoginSfdxUrl extends SfCommand<AuthFields> {
2626
public static readonly summary = messages.getMessage('summary');
2727
public static readonly description = messages.getMessage('description', [AUTH_URL_FORMAT]);
2828
public static readonly examples = messages.getMessages('examples');
29-
public static aliases = ['force:auth:sfdxurl:store', 'auth:sfdxurl:store'];
29+
public static readonly aliases = ['force:auth:sfdxurl:store', 'auth:sfdxurl:store'];
3030
public static readonly deprecateAliases = true;
3131

3232
public static readonly flags = {
@@ -78,7 +78,7 @@ export default class LoginSfdxUrl extends AuthBaseCommand<AuthFields> {
7878

7979
public async run(): Promise<AuthFields> {
8080
const { flags } = await this.parse(LoginSfdxUrl);
81-
if (await this.shouldExitCommand(flags['no-prompt'])) return {};
81+
if (await common.shouldExitCommand(flags['no-prompt'])) return {};
8282

8383
const authFile = flags['sfdx-url-file'];
8484
const authStdin = flags['sfdx-url-stdin'];

0 commit comments

Comments
 (0)