Skip to content

Commit 1c8e419

Browse files
committed
Audit pass: hoist scope enum, extend helpers to MRT, migrate confirms
Acts on findings from a post-merge audit covering both this branch and recently-merged main work: SDK: - Export ACCESS_KEY_SCOPES + AccessKeyScope from operations/bm-users so the 4 access-key CLI commands no longer redeclare the same tuple. - Refresh stale doc comment on getBmUserAccessKey (referenced removed example values 'WEBDAV', 'OCAPI', 'SCAPI'). - printFieldsBlock now accepts null in addition to undefined and skips both, matching the common shape of optional OpenAPI fields. New DetailValue type alias exported. CLI — apply our helpers to MRT commands main introduced in PR #407: - mrt/org/cert/list and mrt/org/member/list now use TableRenderer + columnFlagsFor + selectColumns instead of inline createTable. - mrt/org/cert/get and mrt/org/member/get now use printFieldsBlock instead of inline cliui label/value rendering. CLI — finish the @inquirer/prompts -> SDK ux migration begun in main: - setup, setup/instance/remove, sandbox/reset, sandbox/alias/delete, and mrt/env/var/push now use confirm() from @salesforce/b2c-tooling-sdk/ux. The two remaining @inquirer/prompts importers (setup/skills, setup/instance/create) need more than just confirm so they stay as-is for now.
1 parent e2ca41e commit 1c8e419

17 files changed

Lines changed: 105 additions & 76 deletions

File tree

packages/b2c-cli/src/commands/bm/access-key/create.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
*/
66
import {Args, Flags} from '@oclif/core';
77
import {printFieldsBlock} from '@salesforce/b2c-tooling-sdk/cli';
8-
import {createBmUserAccessKey, type BmAccessKeyDetails} from '@salesforce/b2c-tooling-sdk/operations/bm-users';
8+
import {
9+
ACCESS_KEY_SCOPES,
10+
createBmUserAccessKey,
11+
type BmAccessKeyDetails,
12+
} from '@salesforce/b2c-tooling-sdk/operations/bm-users';
913
import {BmUserAuthCommand} from '../../../utils/bm/user-auth-command.js';
1014
import {resolveLoginOrWhoami} from '../../../utils/bm/resolve-login.js';
1115
import {t} from '../../../i18n/index.js';
1216

13-
const ACCESS_KEY_SCOPES = ['WEBDAV_AND_STUDIO', 'AGENT_USER_AND_OCAPI', 'STOREFRONT'] as const;
14-
1517
export default class BmAccessKeyCreate extends BmUserAuthCommand<typeof BmAccessKeyCreate> {
1618
static args = {
1719
login: Args.string({

packages/b2c-cli/src/commands/bm/access-key/delete.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
55
*/
66
import {Args, Flags} from '@oclif/core';
7-
import {deleteBmUserAccessKey} from '@salesforce/b2c-tooling-sdk/operations/bm-users';
7+
import {ACCESS_KEY_SCOPES, deleteBmUserAccessKey} from '@salesforce/b2c-tooling-sdk/operations/bm-users';
88
import {confirm} from '@salesforce/b2c-tooling-sdk/ux';
99
import {BmUserAuthCommand} from '../../../utils/bm/user-auth-command.js';
1010
import {resolveLoginOrWhoami} from '../../../utils/bm/resolve-login.js';
1111
import {t} from '../../../i18n/index.js';
1212

13-
const ACCESS_KEY_SCOPES = ['WEBDAV_AND_STUDIO', 'AGENT_USER_AND_OCAPI', 'STOREFRONT'] as const;
14-
1513
interface DeleteResult {
1614
success: boolean;
1715
login: string;

packages/b2c-cli/src/commands/bm/access-key/get.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
*/
66
import {Args, Flags} from '@oclif/core';
77
import {printFieldsBlock} from '@salesforce/b2c-tooling-sdk/cli';
8-
import {getBmUserAccessKey, type BmAccessKeyDetails} from '@salesforce/b2c-tooling-sdk/operations/bm-users';
8+
import {
9+
ACCESS_KEY_SCOPES,
10+
getBmUserAccessKey,
11+
type BmAccessKeyDetails,
12+
} from '@salesforce/b2c-tooling-sdk/operations/bm-users';
913
import {BmUserAuthCommand} from '../../../utils/bm/user-auth-command.js';
1014
import {resolveLoginOrWhoami} from '../../../utils/bm/resolve-login.js';
1115
import {t} from '../../../i18n/index.js';
1216

13-
const ACCESS_KEY_SCOPES = ['WEBDAV_AND_STUDIO', 'AGENT_USER_AND_OCAPI', 'STOREFRONT'] as const;
14-
1517
export default class BmAccessKeyGet extends BmUserAuthCommand<typeof BmAccessKeyGet> {
1618
static args = {
1719
login: Args.string({

packages/b2c-cli/src/commands/bm/access-key/set.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
55
*/
66
import {Args, Flags} from '@oclif/core';
7-
import {setBmUserAccessKeyEnabled, type BmAccessKeyDetails} from '@salesforce/b2c-tooling-sdk/operations/bm-users';
7+
import {
8+
ACCESS_KEY_SCOPES,
9+
setBmUserAccessKeyEnabled,
10+
type BmAccessKeyDetails,
11+
} from '@salesforce/b2c-tooling-sdk/operations/bm-users';
812
import {BmUserAuthCommand} from '../../../utils/bm/user-auth-command.js';
913
import {resolveLoginOrWhoami} from '../../../utils/bm/resolve-login.js';
1014
import {t} from '../../../i18n/index.js';
1115

12-
const ACCESS_KEY_SCOPES = ['WEBDAV_AND_STUDIO', 'AGENT_USER_AND_OCAPI', 'STOREFRONT'] as const;
13-
1416
export default class BmAccessKeySet extends BmUserAuthCommand<typeof BmAccessKeySet> {
1517
static args = {
1618
login: Args.string({

packages/b2c-cli/src/commands/mrt/env/var/push.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {readFileSync} from 'node:fs';
77
import {resolve} from 'node:path';
88
import {parseEnv} from 'node:util';
99
import {Flags, ux} from '@oclif/core';
10-
import {confirm} from '@inquirer/prompts';
10+
import {confirm} from '@salesforce/b2c-tooling-sdk/ux';
1111
import {MrtCommand} from '@salesforce/b2c-tooling-sdk/cli';
1212
import {listEnvVars, setEnvVar, setEnvVars} from '@salesforce/b2c-tooling-sdk/operations/mrt';
1313
import {t, withDocs} from '../../../../i18n/index.js';
@@ -149,7 +149,7 @@ export default class MrtEnvVarPush extends MrtCommand<typeof MrtEnvVarPush> {
149149
environment,
150150
},
151151
);
152-
const confirmed = await confirm({message, default: false});
152+
const confirmed = await confirm(message);
153153
if (!confirmed) {
154154
ux.stdout(t('commands.mrt.env.var.push.aborted', 'Aborted.'));
155155
return {pushed: 0, failed: 0, skipped: diff.remoteOnly.length};

packages/b2c-cli/src/commands/mrt/org/cert/get.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
* SPDX-License-Identifier: Apache-2
44
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
55
*/
6-
import {Args, Flags, ux} from '@oclif/core';
7-
import cliui from 'cliui';
8-
import {MrtCommand} from '@salesforce/b2c-tooling-sdk/cli';
6+
import {Args, Flags} from '@oclif/core';
7+
import {MrtCommand, printFieldsBlock} from '@salesforce/b2c-tooling-sdk/cli';
98
import {getCertificate, type MrtCertificate} from '@salesforce/b2c-tooling-sdk/operations/mrt';
109
import {t, withDocs} from '../../../../i18n/index.js';
1110

@@ -40,18 +39,16 @@ export default class MrtOrgCertGet extends MrtCommand<typeof MrtOrgCertGet> {
4039
);
4140

4241
if (!this.jsonEnabled()) {
43-
const ui = cliui({width: process.stdout.columns || 80});
44-
const w = 24;
45-
ui.div('');
46-
ui.div({text: 'ID:', width: w}, {text: cert.id?.toString() ?? '-'});
47-
ui.div({text: 'Domain:', width: w}, {text: cert.domain_name ?? '-'});
48-
ui.div({text: 'Validation Status:', width: w}, {text: cert.validation_status ?? '-'});
49-
ui.div({text: 'Validation Record:', width: w}, {text: cert.validation_record ?? '-'});
50-
ui.div({text: 'Validation Requested:', width: w}, {text: cert.validation_requested_at ?? '-'});
51-
ui.div({text: 'Expires:', width: w}, {text: cert.expires_at ?? '-'});
52-
ui.div({text: 'Renewal Status:', width: w}, {text: (cert.renewal_status as null | string) ?? '-'});
53-
ui.div({text: 'Renewal Eligibility:', width: w}, {text: (cert.renewal_eligibility as null | string) ?? '-'});
54-
ux.stdout(ui.toString());
42+
printFieldsBlock('Certificate', [
43+
['ID', cert.id?.toString()],
44+
['Domain', cert.domain_name],
45+
['Validation Status', cert.validation_status],
46+
['Validation Record', cert.validation_record],
47+
['Validation Requested', cert.validation_requested_at],
48+
['Expires', cert.expires_at],
49+
['Renewal Status', cert.renewal_status as null | string | undefined],
50+
['Renewal Eligibility', cert.renewal_eligibility as null | string | undefined],
51+
]);
5552
}
5653

5754
return cert;

packages/b2c-cli/src/commands/mrt/org/cert/list.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
55
*/
66
import {Flags} from '@oclif/core';
7-
import {MrtCommand, createTable, type ColumnDef} from '@salesforce/b2c-tooling-sdk/cli';
7+
import {
8+
MrtCommand,
9+
TableRenderer,
10+
columnFlagsFor,
11+
selectColumns,
12+
type ColumnDef,
13+
} from '@salesforce/b2c-tooling-sdk/cli';
814
import {
915
listCertificates,
1016
type ListCertificatesResult,
@@ -25,6 +31,8 @@ const COLUMNS: Record<string, ColumnDef<MrtCertificateListCreate>> = {
2531

2632
const DEFAULT_COLUMNS = ['id', 'domain', 'validation', 'expires', 'renewal'];
2733

34+
const tableRenderer = new TableRenderer(COLUMNS);
35+
2836
export default class MrtOrgCertList extends MrtCommand<typeof MrtOrgCertList> {
2937
static description = withDocs(
3038
t('commands.mrt.org.cert.list.description', 'List custom domain certificates for an organization'),
@@ -45,6 +53,7 @@ export default class MrtOrgCertList extends MrtCommand<typeof MrtOrgCertList> {
4553
offset: Flags.integer({description: 'Offset for pagination'}),
4654
search: Flags.string({description: 'Search term for filtering'}),
4755
'custom-only': Flags.boolean({description: 'Show only customer-managed certificates'}),
56+
...columnFlagsFor(COLUMNS),
4857
};
4958

5059
async run(): Promise<ListCertificatesResult> {
@@ -69,7 +78,10 @@ export default class MrtOrgCertList extends MrtCommand<typeof MrtOrgCertList> {
6978
this.log(t('commands.mrt.org.cert.list.empty', 'No certificates found.'));
7079
} else {
7180
this.log(t('commands.mrt.org.cert.list.count', 'Found {{count}} certificate(s):', {count: result.count}));
72-
createTable(COLUMNS).render(result.certificates, DEFAULT_COLUMNS);
81+
tableRenderer.render(
82+
result.certificates,
83+
selectColumns(this.flags, tableRenderer, DEFAULT_COLUMNS, this.warn.bind(this)),
84+
);
7385
}
7486
}
7587

packages/b2c-cli/src/commands/mrt/org/member/get.ts

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
* SPDX-License-Identifier: Apache-2
44
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
55
*/
6-
import {Args, Flags, ux} from '@oclif/core';
7-
import cliui from 'cliui';
8-
import {MrtCommand} from '@salesforce/b2c-tooling-sdk/cli';
6+
import {Args, Flags} from '@oclif/core';
7+
import {MrtCommand, printFieldsBlock} from '@salesforce/b2c-tooling-sdk/cli';
98
import {
109
getOrgMember,
1110
ORG_ROLES,
@@ -45,18 +44,13 @@ export default class MrtOrgMemberGet extends MrtCommand<typeof MrtOrgMemberGet>
4544
);
4645

4746
if (!this.jsonEnabled()) {
48-
const ui = cliui({width: process.stdout.columns || 80});
49-
const w = 22;
50-
ui.div('');
51-
ui.div({text: 'Email:', width: w}, {text: member.email ?? member.user ?? '-'});
52-
ui.div({text: 'Name:', width: w}, {text: [member.first_name, member.last_name].filter(Boolean).join(' ') || '-'});
53-
ui.div({text: 'Role:', width: w}, {text: ORG_ROLES[member.role as OrgRoleValue] ?? String(member.role)});
54-
ui.div({text: 'View All Projects:', width: w}, {text: member.can_view_all_projects ? 'Yes' : 'No'});
55-
ui.div(
56-
{text: 'Cert Permission:', width: w},
57-
{text: member.custom_domain_cert_permission === 2 ? 'Enabled' : 'Disabled'},
58-
);
59-
ux.stdout(ui.toString());
47+
printFieldsBlock('Member', [
48+
['Email', member.email ?? member.user ?? undefined],
49+
['Name', [member.first_name, member.last_name].filter(Boolean).join(' ') || undefined],
50+
['Role', ORG_ROLES[member.role as OrgRoleValue] ?? String(member.role)],
51+
['View All Projects', member.can_view_all_projects ? 'Yes' : 'No'],
52+
['Cert Permission', member.custom_domain_cert_permission === 2 ? 'Enabled' : 'Disabled'],
53+
]);
6054
}
6155

6256
return member;

packages/b2c-cli/src/commands/mrt/org/member/list.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
55
*/
66
import {Flags} from '@oclif/core';
7-
import {MrtCommand, createTable, type ColumnDef} from '@salesforce/b2c-tooling-sdk/cli';
7+
import {
8+
MrtCommand,
9+
TableRenderer,
10+
columnFlagsFor,
11+
selectColumns,
12+
type ColumnDef,
13+
} from '@salesforce/b2c-tooling-sdk/cli';
814
import {
915
listOrgMembers,
1016
ORG_ROLES,
@@ -39,6 +45,8 @@ const COLUMNS: Record<string, ColumnDef<MrtOrgMember>> = {
3945

4046
const DEFAULT_COLUMNS = ['email', 'name', 'role', 'allProjects', 'certPerm'];
4147

48+
const tableRenderer = new TableRenderer(COLUMNS);
49+
4250
export default class MrtOrgMemberList extends MrtCommand<typeof MrtOrgMemberList> {
4351
static description = withDocs(
4452
t('commands.mrt.org.member.list.description', 'List members of a Managed Runtime organization'),
@@ -61,6 +69,7 @@ export default class MrtOrgMemberList extends MrtCommand<typeof MrtOrgMemberList
6169
limit: Flags.integer({description: 'Maximum number of results to return'}),
6270
offset: Flags.integer({description: 'Offset for pagination'}),
6371
search: Flags.string({description: 'Search term for filtering'}),
72+
...columnFlagsFor(COLUMNS),
6473
};
6574

6675
async run(): Promise<ListOrgMembersResult> {
@@ -84,7 +93,10 @@ export default class MrtOrgMemberList extends MrtCommand<typeof MrtOrgMemberList
8493
this.log(t('commands.mrt.org.member.list.empty', 'No members found.'));
8594
} else {
8695
this.log(t('commands.mrt.org.member.list.count', 'Found {{count}} member(s):', {count: result.count}));
87-
createTable(COLUMNS).render(result.members, DEFAULT_COLUMNS);
96+
tableRenderer.render(
97+
result.members,
98+
selectColumns(this.flags, tableRenderer, DEFAULT_COLUMNS, this.warn.bind(this)),
99+
);
88100
}
89101
}
90102

packages/b2c-cli/src/commands/sandbox/alias/delete.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {Args, Flags} from '@oclif/core';
77
import {OdsCommand} from '@salesforce/b2c-tooling-sdk/cli';
88
import {getApiErrorMessage} from '@salesforce/b2c-tooling-sdk';
99
import {t, withDocs} from '../../../i18n/index.js';
10-
import {confirm} from '@inquirer/prompts';
10+
import {confirm} from '@salesforce/b2c-tooling-sdk/ux';
1111

1212
/**
1313
* Command to delete a sandbox alias.
@@ -58,10 +58,9 @@ export default class SandboxAliasDelete extends OdsCommand<typeof SandboxAliasDe
5858

5959
// Confirmation prompt (skip if --force or --json)
6060
if (!force && !this.jsonEnabled()) {
61-
const confirmed = await confirm({
62-
message: t('commands.sandbox.alias.delete.confirm', 'Delete alias {{aliasId}}?', {aliasId}),
63-
default: false,
64-
});
61+
const confirmed = await confirm(
62+
t('commands.sandbox.alias.delete.confirm', 'Delete alias {{aliasId}}?', {aliasId}),
63+
);
6564

6665
if (!confirmed) {
6766
this.log(t('commands.sandbox.alias.delete.cancelled', 'Delete cancelled'));

0 commit comments

Comments
 (0)