@salesforce/b2c-cli 0.5.5 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/sandbox/clone/create.d.ts +21 -0
- package/dist/commands/sandbox/clone/create.js +87 -0
- package/dist/commands/sandbox/clone/create.js.map +1 -0
- package/dist/commands/sandbox/clone/get.d.ts +22 -0
- package/dist/commands/sandbox/clone/get.js +83 -0
- package/dist/commands/sandbox/clone/get.js.map +1 -0
- package/dist/commands/sandbox/clone/list.d.ts +28 -0
- package/dist/commands/sandbox/clone/list.js +149 -0
- package/dist/commands/sandbox/clone/list.js.map +1 -0
- package/dist/commands/sandbox/get.d.ts +9 -0
- package/dist/commands/sandbox/get.js +68 -33
- package/dist/commands/sandbox/get.js.map +1 -1
- package/dist/commands/sandbox/list.js +5 -1
- package/dist/commands/sandbox/list.js.map +1 -1
- package/dist/commands/setup/inspect.js +1 -1
- package/dist/commands/setup/inspect.js.map +1 -1
- package/dist/commands/slas/token.d.ts +63 -0
- package/dist/commands/slas/token.js +222 -0
- package/dist/commands/slas/token.js.map +1 -0
- package/dist/utils/slas/client.d.ts +7 -0
- package/dist/utils/slas/client.js +18 -0
- package/dist/utils/slas/client.js.map +1 -1
- package/oclif.manifest.json +2784 -1685
- package/package.json +2 -2
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OdsCommand } from '@salesforce/b2c-tooling-sdk/cli';
|
|
2
|
+
/**
|
|
3
|
+
* Command to create a sandbox clone.
|
|
4
|
+
*/
|
|
5
|
+
export default class CloneCreate extends OdsCommand<typeof CloneCreate> {
|
|
6
|
+
static aliases: string[];
|
|
7
|
+
static args: {
|
|
8
|
+
sandboxId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
9
|
+
};
|
|
10
|
+
static description: string;
|
|
11
|
+
static enableJsonFlag: boolean;
|
|
12
|
+
static examples: string[];
|
|
13
|
+
static flags: {
|
|
14
|
+
'target-profile': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
emails: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
ttl: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
};
|
|
18
|
+
run(): Promise<{
|
|
19
|
+
cloneId?: string;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025, Salesforce, Inc.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2
|
|
4
|
+
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Args, Flags, Errors } from '@oclif/core';
|
|
7
|
+
import { OdsCommand } from '@salesforce/b2c-tooling-sdk/cli';
|
|
8
|
+
import { getApiErrorMessage } from '@salesforce/b2c-tooling-sdk';
|
|
9
|
+
import { t } from '../../../i18n/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Command to create a sandbox clone.
|
|
12
|
+
*/
|
|
13
|
+
export default class CloneCreate extends OdsCommand {
|
|
14
|
+
static aliases = ['ods:clone:create'];
|
|
15
|
+
static args = {
|
|
16
|
+
sandboxId: Args.string({
|
|
17
|
+
description: 'Sandbox ID (UUID or friendly format like realm-instance) to clone from',
|
|
18
|
+
required: true,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
static description = t('commands.clone.create.description', 'Create a new sandbox clone from an existing sandbox');
|
|
22
|
+
static enableJsonFlag = true;
|
|
23
|
+
static examples = [
|
|
24
|
+
'<%= config.bin %> <%= command.id %> <sandboxId>',
|
|
25
|
+
'<%= config.bin %> <%= command.id %> <sandboxId> --target-profile large',
|
|
26
|
+
'<%= config.bin %> <%= command.id %> <sandboxId> --ttl 48',
|
|
27
|
+
'<%= config.bin %> <%= command.id %> <sandboxId> --target-profile large --ttl 48 --emails dev@example.com,qa@example.com',
|
|
28
|
+
];
|
|
29
|
+
static flags = {
|
|
30
|
+
'target-profile': Flags.string({
|
|
31
|
+
description: 'Resource profile for the cloned sandbox (defaults to source sandbox profile)',
|
|
32
|
+
required: false,
|
|
33
|
+
options: ['medium', 'large', 'xlarge', 'xxlarge'],
|
|
34
|
+
}),
|
|
35
|
+
emails: Flags.string({
|
|
36
|
+
description: 'Comma-separated list of notification email addresses',
|
|
37
|
+
required: false,
|
|
38
|
+
multiple: true,
|
|
39
|
+
}),
|
|
40
|
+
ttl: Flags.integer({
|
|
41
|
+
description: 'Time to live in hours (0 or negative = infinite, minimum 24 hours). Values between 1-23 are not allowed.',
|
|
42
|
+
required: false,
|
|
43
|
+
default: 24,
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
async run() {
|
|
47
|
+
const { sandboxId: rawSandboxId } = this.args;
|
|
48
|
+
const { 'target-profile': targetProfile, emails, ttl } = this.flags;
|
|
49
|
+
// Validate TTL
|
|
50
|
+
if (ttl > 0 && ttl < 24) {
|
|
51
|
+
throw new Errors.CLIError(t('commands.clone.create.invalidTTL', 'TTL must be 0 or negative (infinite), or 24 hours or greater. Values between 1-23 are not allowed. Received: {{ttl}}', { ttl }));
|
|
52
|
+
}
|
|
53
|
+
// Resolve sandbox ID (handles both UUID and friendly format)
|
|
54
|
+
const sandboxId = await this.resolveSandboxId(rawSandboxId);
|
|
55
|
+
this.log(t('commands.clone.create.creating', 'Creating sandbox clone...'));
|
|
56
|
+
// Prepare request body
|
|
57
|
+
const requestBody = {
|
|
58
|
+
ttl,
|
|
59
|
+
};
|
|
60
|
+
// Only include targetProfile if explicitly provided
|
|
61
|
+
if (targetProfile) {
|
|
62
|
+
requestBody.targetProfile = targetProfile;
|
|
63
|
+
}
|
|
64
|
+
if (emails && emails.length > 0) {
|
|
65
|
+
requestBody.emails = emails.flatMap((email) => email.split(',').map((e) => e.trim()));
|
|
66
|
+
}
|
|
67
|
+
const result = await this.odsClient.POST('/sandboxes/{sandboxId}/clones', {
|
|
68
|
+
params: {
|
|
69
|
+
path: { sandboxId },
|
|
70
|
+
},
|
|
71
|
+
body: requestBody,
|
|
72
|
+
});
|
|
73
|
+
if (!result.data) {
|
|
74
|
+
const message = getApiErrorMessage(result.error, result.response);
|
|
75
|
+
this.error(t('commands.clone.create.error', 'Failed to create sandbox clone: {{message}}', { message }));
|
|
76
|
+
}
|
|
77
|
+
const cloneId = result.data.data?.cloneId;
|
|
78
|
+
if (this.jsonEnabled()) {
|
|
79
|
+
return { cloneId };
|
|
80
|
+
}
|
|
81
|
+
this.log(t('commands.clone.create.success', '✓ Sandbox clone creation started successfully'));
|
|
82
|
+
this.log(t('commands.clone.create.cloneId', 'Clone ID: {{cloneId}}', { cloneId }));
|
|
83
|
+
this.log(t('commands.clone.create.checkStatus', '\nTo check the clone status, run:\n <%= config.bin %> ods clone get {{sandboxId}} {{cloneId}}', { sandboxId, cloneId }));
|
|
84
|
+
return { cloneId };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/sandbox/clone/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { OdsCommand } from '@salesforce/b2c-tooling-sdk/cli';
|
|
2
|
+
import { type OdsComponents } from '@salesforce/b2c-tooling-sdk';
|
|
3
|
+
type SandboxCloneGetModel = OdsComponents['schemas']['SandboxCloneGetModel'];
|
|
4
|
+
/**
|
|
5
|
+
* Command to get details of a specific sandbox clone.
|
|
6
|
+
*/
|
|
7
|
+
export default class CloneGet extends OdsCommand<typeof CloneGet> {
|
|
8
|
+
static aliases: string[];
|
|
9
|
+
static args: {
|
|
10
|
+
sandboxId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
11
|
+
cloneId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
12
|
+
};
|
|
13
|
+
static description: string;
|
|
14
|
+
static enableJsonFlag: boolean;
|
|
15
|
+
static examples: string[];
|
|
16
|
+
run(): Promise<{
|
|
17
|
+
data?: SandboxCloneGetModel;
|
|
18
|
+
}>;
|
|
19
|
+
private buildCloneFields;
|
|
20
|
+
private printCloneDetails;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025, Salesforce, Inc.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2
|
|
4
|
+
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Args, ux } from '@oclif/core';
|
|
7
|
+
import cliui from 'cliui';
|
|
8
|
+
import { OdsCommand } from '@salesforce/b2c-tooling-sdk/cli';
|
|
9
|
+
import { getApiErrorMessage } from '@salesforce/b2c-tooling-sdk';
|
|
10
|
+
import { t } from '../../../i18n/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Command to get details of a specific sandbox clone.
|
|
13
|
+
*/
|
|
14
|
+
export default class CloneGet extends OdsCommand {
|
|
15
|
+
static aliases = ['ods:clone:get'];
|
|
16
|
+
static args = {
|
|
17
|
+
sandboxId: Args.string({
|
|
18
|
+
description: 'Sandbox ID (UUID or friendly format like realm-instance)',
|
|
19
|
+
required: true,
|
|
20
|
+
}),
|
|
21
|
+
cloneId: Args.string({
|
|
22
|
+
description: 'Clone ID in format realm-instance-timestamp (e.g., aaaa-002-1642780893121)',
|
|
23
|
+
required: true,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
static description = t('commands.clone.get.description', 'Get detailed information about a specific sandbox clone');
|
|
27
|
+
static enableJsonFlag = true;
|
|
28
|
+
static examples = [
|
|
29
|
+
'<%= config.bin %> <%= command.id %> <sandboxId> <cloneId>',
|
|
30
|
+
'<%= config.bin %> <%= command.id %> abcd-123 aaaa-002-1642780893121',
|
|
31
|
+
];
|
|
32
|
+
async run() {
|
|
33
|
+
const { sandboxId: rawSandboxId, cloneId } = this.args;
|
|
34
|
+
// Resolve sandbox ID (handles both UUID and friendly format)
|
|
35
|
+
const sandboxId = await this.resolveSandboxId(rawSandboxId);
|
|
36
|
+
this.log(t('commands.clone.get.fetching', 'Fetching clone details...'));
|
|
37
|
+
const result = await this.odsClient.GET('/sandboxes/{sandboxId}/clones/{cloneId}', {
|
|
38
|
+
params: {
|
|
39
|
+
path: { sandboxId, cloneId },
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
if (!result.data) {
|
|
43
|
+
const message = getApiErrorMessage(result.error, result.response);
|
|
44
|
+
this.error(t('commands.clone.get.error', 'Failed to get clone details: {{message}}', { message }));
|
|
45
|
+
}
|
|
46
|
+
const clone = result.data.data;
|
|
47
|
+
if (this.jsonEnabled()) {
|
|
48
|
+
return { data: clone };
|
|
49
|
+
}
|
|
50
|
+
this.printCloneDetails(clone);
|
|
51
|
+
return { data: clone };
|
|
52
|
+
}
|
|
53
|
+
buildCloneFields(clone) {
|
|
54
|
+
return [
|
|
55
|
+
['Clone ID', clone?.cloneId],
|
|
56
|
+
['Source Instance', clone?.sourceInstance],
|
|
57
|
+
['Source Instance ID', clone?.sourceInstanceId],
|
|
58
|
+
['Target Instance', clone?.targetInstance],
|
|
59
|
+
['Target Instance ID', clone?.targetInstanceId],
|
|
60
|
+
['Realm', clone?.realm],
|
|
61
|
+
['Status', clone?.status],
|
|
62
|
+
['Progress', clone?.progressPercentage === undefined ? '-' : `${clone.progressPercentage}%`],
|
|
63
|
+
['Created At', clone?.createdAt ? new Date(clone.createdAt).toLocaleString() : undefined],
|
|
64
|
+
['Custom Code Version', clone?.customCodeVersion],
|
|
65
|
+
['Storefront Count', clone?.storefrontCount?.toString()],
|
|
66
|
+
['Filesystem Usage Size', clone?.filesystemUsageSize?.toString()],
|
|
67
|
+
['Database Transfer Size', clone?.databaseTransferSize?.toString()],
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
printCloneDetails(clone) {
|
|
71
|
+
const ui = cliui({ width: process.stdout.columns || 80 });
|
|
72
|
+
ui.div({ text: 'Clone Details', padding: [1, 0, 0, 0] });
|
|
73
|
+
ui.div({ text: '─'.repeat(50), padding: [0, 0, 0, 0] });
|
|
74
|
+
const fields = this.buildCloneFields(clone);
|
|
75
|
+
for (const [label, value] of fields) {
|
|
76
|
+
if (value !== undefined) {
|
|
77
|
+
ui.div({ text: `${label}:`, width: 25, padding: [0, 2, 0, 0] }, { text: value, padding: [0, 0, 0, 0] });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
ux.stdout(ui.toString());
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/sandbox/clone/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { OdsCommand, type ColumnDef } from '@salesforce/b2c-tooling-sdk/cli';
|
|
2
|
+
import { type OdsComponents } from '@salesforce/b2c-tooling-sdk';
|
|
3
|
+
type SandboxCloneGetModel = OdsComponents['schemas']['SandboxCloneGetModel'];
|
|
4
|
+
export declare const COLUMNS: Record<string, ColumnDef<SandboxCloneGetModel>>;
|
|
5
|
+
/**
|
|
6
|
+
* Command to list sandbox clones for a specific sandbox.
|
|
7
|
+
*/
|
|
8
|
+
export default class CloneList extends OdsCommand<typeof CloneList> {
|
|
9
|
+
static aliases: string[];
|
|
10
|
+
static args: {
|
|
11
|
+
sandboxId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
12
|
+
};
|
|
13
|
+
static description: string;
|
|
14
|
+
static enableJsonFlag: boolean;
|
|
15
|
+
static examples: string[];
|
|
16
|
+
static flags: {
|
|
17
|
+
from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
to: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
status: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
20
|
+
columns: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
21
|
+
extended: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
22
|
+
};
|
|
23
|
+
run(): Promise<{
|
|
24
|
+
data?: SandboxCloneGetModel[];
|
|
25
|
+
}>;
|
|
26
|
+
private getSelectedColumns;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025, Salesforce, Inc.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2
|
|
4
|
+
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Args, Flags } from '@oclif/core';
|
|
7
|
+
import { OdsCommand, TableRenderer } from '@salesforce/b2c-tooling-sdk/cli';
|
|
8
|
+
import { getApiErrorMessage } from '@salesforce/b2c-tooling-sdk';
|
|
9
|
+
import { t } from '../../../i18n/index.js';
|
|
10
|
+
export const COLUMNS = {
|
|
11
|
+
cloneId: {
|
|
12
|
+
header: 'Clone ID',
|
|
13
|
+
get: (c) => c.cloneId || '-',
|
|
14
|
+
},
|
|
15
|
+
sourceInstance: {
|
|
16
|
+
header: 'Source Instance',
|
|
17
|
+
get: (c) => c.sourceInstance || '-',
|
|
18
|
+
},
|
|
19
|
+
targetInstance: {
|
|
20
|
+
header: 'Target Instance',
|
|
21
|
+
get: (c) => c.targetInstance || '-',
|
|
22
|
+
},
|
|
23
|
+
status: {
|
|
24
|
+
header: 'Status',
|
|
25
|
+
get: (c) => c.status || '-',
|
|
26
|
+
},
|
|
27
|
+
progressPercentage: {
|
|
28
|
+
header: 'Progress %',
|
|
29
|
+
get: (c) => (c.progressPercentage === undefined ? '-' : `${c.progressPercentage}%`),
|
|
30
|
+
},
|
|
31
|
+
createdAt: {
|
|
32
|
+
header: 'Created At',
|
|
33
|
+
get(c) {
|
|
34
|
+
if (!c.createdAt)
|
|
35
|
+
return '-';
|
|
36
|
+
const d = new Date(c.createdAt);
|
|
37
|
+
const date = d.toISOString().slice(0, 10);
|
|
38
|
+
const msSinceCreated = Date.now() - d.getTime();
|
|
39
|
+
if (msSinceCreated <= 24 * 60 * 60 * 1000) {
|
|
40
|
+
const hh = String(d.getUTCHours()).padStart(2, '0');
|
|
41
|
+
const mm = String(d.getUTCMinutes()).padStart(2, '0');
|
|
42
|
+
return `${date} ${hh}:${mm}`;
|
|
43
|
+
}
|
|
44
|
+
return date;
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
lastUpdated: {
|
|
48
|
+
header: 'Last Updated',
|
|
49
|
+
get: (c) => (c.lastUpdated ? new Date(c.lastUpdated).toLocaleString() : '-'),
|
|
50
|
+
},
|
|
51
|
+
elapsedTimeInSec: {
|
|
52
|
+
header: 'Elapsed Time (sec)',
|
|
53
|
+
get: (c) => (c.elapsedTimeInSec === undefined ? '-' : c.elapsedTimeInSec.toString()),
|
|
54
|
+
},
|
|
55
|
+
customCodeVersion: {
|
|
56
|
+
header: 'Custom Code Version',
|
|
57
|
+
get: (c) => c.customCodeVersion || '-',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const DEFAULT_COLUMNS = ['cloneId', 'sourceInstance', 'targetInstance', 'status', 'progressPercentage', 'createdAt'];
|
|
61
|
+
/**
|
|
62
|
+
* Command to list sandbox clones for a specific sandbox.
|
|
63
|
+
*/
|
|
64
|
+
export default class CloneList extends OdsCommand {
|
|
65
|
+
static aliases = ['ods:clone:list'];
|
|
66
|
+
static args = {
|
|
67
|
+
sandboxId: Args.string({
|
|
68
|
+
description: 'Sandbox ID (UUID or friendly format like realm-instance)',
|
|
69
|
+
required: true,
|
|
70
|
+
}),
|
|
71
|
+
};
|
|
72
|
+
static description = t('commands.clone.list.description', 'List all clones for a specific sandbox');
|
|
73
|
+
static enableJsonFlag = true;
|
|
74
|
+
static examples = [
|
|
75
|
+
'<%= config.bin %> <%= command.id %> <sandboxId>',
|
|
76
|
+
'<%= config.bin %> <%= command.id %> <sandboxId> --status COMPLETED',
|
|
77
|
+
'<%= config.bin %> <%= command.id %> <sandboxId> --from 2024-01-01 --to 2024-12-31',
|
|
78
|
+
'<%= config.bin %> <%= command.id %> <sandboxId> --extended',
|
|
79
|
+
];
|
|
80
|
+
static flags = {
|
|
81
|
+
from: Flags.string({
|
|
82
|
+
description: 'Filter clones created on or after this date (ISO 8601 date format, e.g., 2024-01-01)',
|
|
83
|
+
required: false,
|
|
84
|
+
}),
|
|
85
|
+
to: Flags.string({
|
|
86
|
+
description: 'Filter clones created on or before this date (ISO 8601 date format, e.g., 2024-12-31)',
|
|
87
|
+
required: false,
|
|
88
|
+
}),
|
|
89
|
+
status: Flags.string({
|
|
90
|
+
description: 'Filter clones by status',
|
|
91
|
+
required: false,
|
|
92
|
+
options: ['Pending', 'InProgress', 'Failed', 'Completed'],
|
|
93
|
+
}),
|
|
94
|
+
columns: Flags.string({
|
|
95
|
+
char: 'c',
|
|
96
|
+
description: `Columns to display (comma-separated). Available: ${Object.keys(COLUMNS).join(', ')}`,
|
|
97
|
+
}),
|
|
98
|
+
extended: Flags.boolean({
|
|
99
|
+
char: 'x',
|
|
100
|
+
description: 'Show all columns',
|
|
101
|
+
default: false,
|
|
102
|
+
}),
|
|
103
|
+
};
|
|
104
|
+
async run() {
|
|
105
|
+
const { sandboxId: rawSandboxId } = this.args;
|
|
106
|
+
const { from: fromDate, to: toDate, status } = this.flags;
|
|
107
|
+
// Resolve sandbox ID (handles both UUID and friendly format)
|
|
108
|
+
const sandboxId = await this.resolveSandboxId(rawSandboxId);
|
|
109
|
+
this.log(t('commands.clone.list.fetching', 'Fetching sandbox clones...'));
|
|
110
|
+
const result = await this.odsClient.GET('/sandboxes/{sandboxId}/clones', {
|
|
111
|
+
params: {
|
|
112
|
+
path: { sandboxId },
|
|
113
|
+
query: {
|
|
114
|
+
fromDate,
|
|
115
|
+
toDate,
|
|
116
|
+
status: status,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
if (!result.data) {
|
|
121
|
+
const message = getApiErrorMessage(result.error, result.response);
|
|
122
|
+
this.error(t('commands.clone.list.error', 'Failed to list sandbox clones: {{message}}', { message }));
|
|
123
|
+
}
|
|
124
|
+
if (this.jsonEnabled()) {
|
|
125
|
+
return { data: result.data.data || [] };
|
|
126
|
+
}
|
|
127
|
+
const clones = result.data.data || [];
|
|
128
|
+
if (clones.length === 0) {
|
|
129
|
+
this.log(t('commands.clone.list.noClones', 'No clones found for this sandbox.'));
|
|
130
|
+
return { data: clones };
|
|
131
|
+
}
|
|
132
|
+
const columns = this.getSelectedColumns();
|
|
133
|
+
const tableRenderer = new TableRenderer(COLUMNS);
|
|
134
|
+
tableRenderer.render(clones, columns);
|
|
135
|
+
return { data: clones };
|
|
136
|
+
}
|
|
137
|
+
getSelectedColumns() {
|
|
138
|
+
const columnsFlag = this.flags.columns;
|
|
139
|
+
const extended = this.flags.extended;
|
|
140
|
+
if (columnsFlag) {
|
|
141
|
+
return columnsFlag.split(',').map((c) => c.trim());
|
|
142
|
+
}
|
|
143
|
+
if (extended) {
|
|
144
|
+
return Object.keys(COLUMNS);
|
|
145
|
+
}
|
|
146
|
+
return DEFAULT_COLUMNS;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/sandbox/clone/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,16 @@ export default class SandboxGet extends OdsCommand<typeof SandboxGet> {
|
|
|
12
12
|
static description: string;
|
|
13
13
|
static enableJsonFlag: boolean;
|
|
14
14
|
static examples: string[];
|
|
15
|
+
static flags: {
|
|
16
|
+
'clone-details': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
17
|
+
};
|
|
15
18
|
run(): Promise<SandboxModel>;
|
|
19
|
+
private buildCloneFields;
|
|
20
|
+
private buildSandboxFields;
|
|
21
|
+
private printCloneDetailsSection;
|
|
22
|
+
private printFieldsSection;
|
|
23
|
+
private printLinksSection;
|
|
16
24
|
private printSandboxDetails;
|
|
25
|
+
private printTagsAndEmails;
|
|
17
26
|
}
|
|
18
27
|
export {};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2
|
|
4
4
|
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Args, ux } from '@oclif/core';
|
|
6
|
+
import { Args, Flags, ux } from '@oclif/core';
|
|
7
7
|
import cliui from 'cliui';
|
|
8
8
|
import { OdsCommand } from '@salesforce/b2c-tooling-sdk/cli';
|
|
9
9
|
import { t, withDocs } from '../../i18n/index.js';
|
|
@@ -24,15 +24,24 @@ export default class SandboxGet extends OdsCommand {
|
|
|
24
24
|
'<%= config.bin %> <%= command.id %> abc12345-1234-1234-1234-abc123456789',
|
|
25
25
|
'<%= config.bin %> <%= command.id %> zzzv-123',
|
|
26
26
|
'<%= config.bin %> <%= command.id %> zzzv_123 --json',
|
|
27
|
+
'<%= config.bin %> <%= command.id %> zzzv_123 --clone-details',
|
|
27
28
|
];
|
|
29
|
+
static flags = {
|
|
30
|
+
'clone-details': Flags.boolean({
|
|
31
|
+
description: 'Include detailed clone information if the sandbox was created by cloning',
|
|
32
|
+
default: false,
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
28
35
|
async run() {
|
|
29
36
|
const sandboxId = await this.resolveSandboxId(this.args.sandboxId);
|
|
30
37
|
this.log(t('commands.sandbox.get.fetching', 'Fetching sandbox {{sandboxId}}...', { sandboxId }));
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
const params = {
|
|
39
|
+
path: { sandboxId },
|
|
40
|
+
};
|
|
41
|
+
if (this.flags['clone-details']) {
|
|
42
|
+
params.query = { expand: ['clonedetails'] };
|
|
43
|
+
}
|
|
44
|
+
const result = await this.odsClient.GET('/sandboxes/{sandboxId}', { params });
|
|
36
45
|
if (!result.data?.data) {
|
|
37
46
|
this.error(t('commands.sandbox.get.error', 'Failed to fetch sandbox: {{message}}', {
|
|
38
47
|
message: result.response?.statusText || 'Sandbox not found',
|
|
@@ -45,11 +54,19 @@ export default class SandboxGet extends OdsCommand {
|
|
|
45
54
|
this.printSandboxDetails(sandbox);
|
|
46
55
|
return sandbox;
|
|
47
56
|
}
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
57
|
+
buildCloneFields(sandbox) {
|
|
58
|
+
const cloneFields = [
|
|
59
|
+
['Cloned From', sandbox.clonedFrom],
|
|
60
|
+
['Source Instance ID', sandbox.sourceInstanceIdentifier],
|
|
61
|
+
];
|
|
62
|
+
if (sandbox.cloneDetails) {
|
|
63
|
+
const details = sandbox.cloneDetails;
|
|
64
|
+
cloneFields.push(['Clone ID', details.cloneId], ['Status', details.status], ['Target Profile', details.targetProfile], ['Created At', details.createdAt ? new Date(details.createdAt).toLocaleString() : undefined], ['Progress', details.progressPercentage ? `${details.progressPercentage}%` : undefined], ['Elapsed Time (sec)', details.elapsedTimeInSec?.toString()], ['Custom Code Version', details.customCodeVersion], ['Storefront Count', details.storefrontCount?.toString()]);
|
|
65
|
+
}
|
|
66
|
+
return cloneFields;
|
|
67
|
+
}
|
|
68
|
+
buildSandboxFields(sandbox) {
|
|
69
|
+
return [
|
|
53
70
|
['ID', sandbox.id],
|
|
54
71
|
['Realm', sandbox.realm],
|
|
55
72
|
['Instance', sandbox.instance],
|
|
@@ -64,38 +81,56 @@ export default class SandboxGet extends OdsCommand {
|
|
|
64
81
|
['App Version', sandbox.versions?.app],
|
|
65
82
|
['Web Version', sandbox.versions?.web],
|
|
66
83
|
];
|
|
84
|
+
}
|
|
85
|
+
printCloneDetailsSection(ui, sandbox) {
|
|
86
|
+
if (!sandbox.clonedFrom && !sandbox.sourceInstanceIdentifier && !sandbox.cloneDetails)
|
|
87
|
+
return;
|
|
88
|
+
ui.div({ text: '', padding: [0, 0, 0, 0] });
|
|
89
|
+
ui.div({ text: 'Clone Details', padding: [1, 0, 0, 0] });
|
|
90
|
+
ui.div({ text: '─'.repeat(50), padding: [0, 0, 0, 0] });
|
|
91
|
+
const cloneFields = this.buildCloneFields(sandbox);
|
|
92
|
+
this.printFieldsSection(ui, cloneFields, 25);
|
|
93
|
+
}
|
|
94
|
+
printFieldsSection(ui, fields, width) {
|
|
67
95
|
for (const [label, value] of fields) {
|
|
68
96
|
if (value !== undefined) {
|
|
69
|
-
ui.div({ text: `${label}:`, width
|
|
97
|
+
ui.div({ text: `${label}:`, width, padding: [0, 2, 0, 0] }, { text: value, padding: [0, 0, 0, 0] });
|
|
70
98
|
}
|
|
71
99
|
}
|
|
72
|
-
|
|
100
|
+
}
|
|
101
|
+
printLinksSection(ui, sandbox) {
|
|
102
|
+
if (!sandbox.links)
|
|
103
|
+
return;
|
|
104
|
+
ui.div({ text: '', padding: [0, 0, 0, 0] });
|
|
105
|
+
ui.div({ text: 'Links', padding: [1, 0, 0, 0] });
|
|
106
|
+
ui.div({ text: '─'.repeat(50), padding: [0, 0, 0, 0] });
|
|
107
|
+
const links = [
|
|
108
|
+
['Business Manager', sandbox.links.bm],
|
|
109
|
+
['OCAPI', sandbox.links.ocapi],
|
|
110
|
+
['Impex', sandbox.links.impex],
|
|
111
|
+
['Code', sandbox.links.code],
|
|
112
|
+
['Logs', sandbox.links.logs],
|
|
113
|
+
];
|
|
114
|
+
this.printFieldsSection(ui, links, 20);
|
|
115
|
+
}
|
|
116
|
+
printSandboxDetails(sandbox) {
|
|
117
|
+
const ui = cliui({ width: process.stdout.columns || 80 });
|
|
118
|
+
ui.div({ text: 'Sandbox Details', padding: [1, 0, 0, 0] });
|
|
119
|
+
ui.div({ text: '─'.repeat(50), padding: [0, 0, 0, 0] });
|
|
120
|
+
const fields = this.buildSandboxFields(sandbox);
|
|
121
|
+
this.printFieldsSection(ui, fields, 20);
|
|
122
|
+
this.printTagsAndEmails(ui, sandbox);
|
|
123
|
+
this.printCloneDetailsSection(ui, sandbox);
|
|
124
|
+
this.printLinksSection(ui, sandbox);
|
|
125
|
+
ux.stdout(ui.toString());
|
|
126
|
+
}
|
|
127
|
+
printTagsAndEmails(ui, sandbox) {
|
|
73
128
|
if (sandbox.tags && sandbox.tags.length > 0) {
|
|
74
129
|
ui.div({ text: 'Tags:', width: 20, padding: [0, 2, 0, 0] }, { text: sandbox.tags.join(', '), padding: [0, 0, 0, 0] });
|
|
75
130
|
}
|
|
76
|
-
// Emails
|
|
77
131
|
if (sandbox.emails && sandbox.emails.length > 0) {
|
|
78
132
|
ui.div({ text: 'Emails:', width: 20, padding: [0, 2, 0, 0] }, { text: sandbox.emails.join(', '), padding: [0, 0, 0, 0] });
|
|
79
133
|
}
|
|
80
|
-
// Links
|
|
81
|
-
if (sandbox.links) {
|
|
82
|
-
ui.div({ text: '', padding: [0, 0, 0, 0] });
|
|
83
|
-
ui.div({ text: 'Links', padding: [1, 0, 0, 0] });
|
|
84
|
-
ui.div({ text: '─'.repeat(50), padding: [0, 0, 0, 0] });
|
|
85
|
-
const links = [
|
|
86
|
-
['Business Manager', sandbox.links.bm],
|
|
87
|
-
['OCAPI', sandbox.links.ocapi],
|
|
88
|
-
['Impex', sandbox.links.impex],
|
|
89
|
-
['Code', sandbox.links.code],
|
|
90
|
-
['Logs', sandbox.links.logs],
|
|
91
|
-
];
|
|
92
|
-
for (const [label, value] of links) {
|
|
93
|
-
if (value) {
|
|
94
|
-
ui.div({ text: `${label}:`, width: 20, padding: [0, 2, 0, 0] }, { text: value, padding: [0, 0, 0, 0] });
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
ux.stdout(ui.toString());
|
|
99
134
|
}
|
|
100
135
|
}
|
|
101
136
|
//# sourceMappingURL=get.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/sandbox/get.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,IAAI,EAAE,EAAE,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/sandbox/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,9 +63,13 @@ export const COLUMNS = {
|
|
|
63
63
|
get: (s) => (s.autoScheduled ? 'Yes' : 'No'),
|
|
64
64
|
extended: true,
|
|
65
65
|
},
|
|
66
|
+
isCloned: {
|
|
67
|
+
header: 'Is Cloned',
|
|
68
|
+
get: (s) => (s.clonedFrom ? 'Yes' : 'No'),
|
|
69
|
+
},
|
|
66
70
|
};
|
|
67
71
|
/** Default columns shown without --extended */
|
|
68
|
-
const DEFAULT_COLUMNS = ['realm', 'instance', 'state', 'profile', 'created', 'eol', 'id'];
|
|
72
|
+
const DEFAULT_COLUMNS = ['realm', 'instance', 'state', 'profile', 'created', 'eol', 'id', 'isCloned'];
|
|
69
73
|
const tableRenderer = new TableRenderer(COLUMNS);
|
|
70
74
|
/**
|
|
71
75
|
* Command to list all on-demand sandboxes.
|