-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathlist.ts
More file actions
82 lines (62 loc) · 2.41 KB
/
list.ts
File metadata and controls
82 lines (62 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import {ux} from '@oclif/core';
import cliui from 'cliui';
import {InstanceCommand} from '@salesforce/b2c-tooling/cli';
import type {OcapiComponents} from '@salesforce/b2c-tooling';
import {t} from '../../i18n/index.js';
type Sites = OcapiComponents['schemas']['sites'];
type Site = OcapiComponents['schemas']['site'];
export default class SitesList extends InstanceCommand<typeof SitesList> {
static description = t('commands.sites.list.description', 'List sites on a B2C Commerce instance');
static enableJsonFlag = true;
static examples = [
'<%= config.bin %> <%= command.id %>',
'<%= config.bin %> <%= command.id %> --server my-sandbox.demandware.net',
'<%= config.bin %> <%= command.id %> --json',
];
async run(): Promise<Sites> {
this.requireOAuthCredentials();
const hostname = this.resolvedConfig.hostname!;
this.log(t('commands.sites.list.fetching', 'Fetching sites from {{hostname}}...', {hostname}));
// eslint-disable-next-line new-cap
const {data, error} = await this.instance.ocapi.GET('/sites', {
params: {query: {select: '(**)'}},
});
if (error) {
this.error(t('commands.sites.list.error', 'Failed to fetch sites: {{message}}', {message: String(error)}));
}
const sites = data as Sites;
// In JSON mode, just return the data - oclif handles output to stdout
if (this.jsonEnabled()) {
return sites;
}
// Human-readable table output to stdout
if (!sites || sites.count === 0) {
ux.stdout(t('commands.sites.list.noSites', 'No sites found.'));
return sites;
}
this.printSitesTable(sites.data ?? []);
return sites;
}
private printSitesTable(sites: Site[]): void {
const ui = cliui({width: process.stdout.columns || 80});
// Header
ui.div(
{text: 'ID', width: 30, padding: [0, 2, 0, 0]},
{text: 'Display Name', width: 30, padding: [0, 2, 0, 0]},
{text: 'Status', padding: [0, 0, 0, 0]},
);
// Separator
ui.div({text: '─'.repeat(70), padding: [0, 0, 0, 0]});
// Rows
for (const site of sites) {
const displayName = site.display_name?.default || site.id || '';
const status = site.storefront_status || 'unknown';
ui.div(
{text: site.id || '', width: 30, padding: [0, 2, 0, 0]},
{text: displayName, width: 30, padding: [0, 2, 0, 0]},
{text: status, padding: [0, 0, 0, 0]},
);
}
ux.stdout(ui.toString());
}
}