sf-plugin-cms 0.1.0 → 0.3.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/README.md +143 -25
- package/lib/{commands/cms/command-base.d.ts → command-base.d.ts} +2 -1
- package/lib/{commands/cms/command-base.js → command-base.js} +3 -0
- package/lib/command-base.js.map +1 -0
- package/lib/commands/cms/export/workspace.d.ts +15 -7
- package/lib/commands/cms/export/workspace.js +114 -12
- package/lib/commands/cms/export/workspace.js.map +1 -1
- package/lib/commands/cms/get/channel.d.ts +1 -1
- package/lib/commands/cms/get/channel.js +1 -1
- package/lib/commands/cms/get/channel.js.map +1 -1
- package/lib/commands/cms/get/content.d.ts +1 -1
- package/lib/commands/cms/get/content.js +1 -1
- package/lib/commands/cms/get/content.js.map +1 -1
- package/lib/commands/cms/get/variant.d.ts +1 -1
- package/lib/commands/cms/get/variant.js +1 -1
- package/lib/commands/cms/get/variant.js.map +1 -1
- package/lib/commands/cms/get/workspace.d.ts +1 -1
- package/lib/commands/cms/get/workspace.js +1 -1
- package/lib/commands/cms/get/workspace.js.map +1 -1
- package/lib/commands/cms/import/workspace.d.ts +10 -6
- package/lib/commands/cms/import/workspace.js +127 -35
- package/lib/commands/cms/import/workspace.js.map +1 -1
- package/lib/commands/cms/info.d.ts +11 -10
- package/lib/commands/cms/info.js +123 -8
- package/lib/commands/cms/info.js.map +1 -1
- package/lib/commands/cms/list/channel.d.ts +1 -1
- package/lib/commands/cms/list/channel.js +1 -1
- package/lib/commands/cms/list/channel.js.map +1 -1
- package/lib/commands/cms/list/workspace.d.ts +1 -1
- package/lib/commands/cms/list/workspace.js +1 -1
- package/lib/commands/cms/list/workspace.js.map +1 -1
- package/lib/contracts/info.d.ts +43 -0
- package/lib/contracts/info.js +69 -0
- package/lib/contracts/info.js.map +1 -0
- package/lib/contracts/shared.d.ts +81 -0
- package/lib/contracts/shared.js +218 -0
- package/lib/contracts/shared.js.map +1 -0
- package/lib/contracts/workspace-export.d.ts +91 -0
- package/lib/contracts/workspace-export.js +324 -0
- package/lib/contracts/workspace-export.js.map +1 -0
- package/lib/contracts/workspace-import.d.ts +46 -0
- package/lib/contracts/workspace-import.js +108 -0
- package/lib/contracts/workspace-import.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/services/bulk-export-workspaces.d.ts +25 -0
- package/lib/services/bulk-export-workspaces.js +272 -0
- package/lib/services/bulk-export-workspaces.js.map +1 -0
- package/lib/services/export-references.d.ts +21 -0
- package/lib/services/export-references.js +150 -0
- package/lib/services/export-references.js.map +1 -0
- package/lib/services/export-workspace.d.ts +12 -22
- package/lib/services/export-workspace.js +91 -2
- package/lib/services/export-workspace.js.map +1 -1
- package/lib/services/import-workspace.d.ts +7 -3
- package/lib/services/import-workspace.js +224 -96
- package/lib/services/import-workspace.js.map +1 -1
- package/lib/services/resolve-workspace.d.ts +20 -0
- package/lib/services/resolve-workspace.js +86 -0
- package/lib/services/resolve-workspace.js.map +1 -0
- package/messages/cms.export.workspace.md +31 -5
- package/messages/cms.import.workspace.md +17 -7
- package/messages/cms.info.md +21 -0
- package/package.json +3 -2
- package/lib/commands/cms/command-base.js.map +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Connection } from '@salesforce/core';
|
|
2
|
+
import type { JsonRequestOptions } from '../transport/json-request.js';
|
|
3
|
+
import { type CmsRecord } from './read.js';
|
|
4
|
+
type RequestConnection = Pick<Connection, 'request'>;
|
|
5
|
+
export type WorkspaceSelector = {
|
|
6
|
+
readonly workspaceId?: string;
|
|
7
|
+
readonly workspaceName?: string;
|
|
8
|
+
};
|
|
9
|
+
export type ResolvedWorkspace = {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly workspace: CmsRecord;
|
|
12
|
+
};
|
|
13
|
+
export type WorkspaceSummary = {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly name?: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function enumerateWorkspaces(connection: RequestConnection, options?: JsonRequestOptions, query?: Readonly<Record<string, string | number>>): Promise<WorkspaceSummary[]>;
|
|
18
|
+
export declare function assertWorkspaceSelector(selector: WorkspaceSelector): void;
|
|
19
|
+
export declare function resolveWorkspace(connection: RequestConnection, selector: WorkspaceSelector, options?: JsonRequestOptions): Promise<ResolvedWorkspace>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { getWorkspace, listWorkspaces } from './read.js';
|
|
2
|
+
const WORKSPACE_PAGE_SIZE = 250;
|
|
3
|
+
const WORKSPACE_PAGE_CAP = 1000;
|
|
4
|
+
function nonemptyString(value) {
|
|
5
|
+
return typeof value === 'string' && value.length > 0;
|
|
6
|
+
}
|
|
7
|
+
function folded(value) {
|
|
8
|
+
return value.normalize('NFKC').toLocaleLowerCase('en-US');
|
|
9
|
+
}
|
|
10
|
+
function workspaceSummary(value, page) {
|
|
11
|
+
if (!nonemptyString(value.id)) {
|
|
12
|
+
throw new Error(`Workspace listing page ${page} contains an item with a missing or malformed ID.`);
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
id: value.id,
|
|
16
|
+
...(nonemptyString(value.name) ? { name: value.name } : {}),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function enumerateWorkspaces(connection, options = {}, query = {}) {
|
|
20
|
+
const workspaces = new Map();
|
|
21
|
+
const foldedIds = new Map();
|
|
22
|
+
const pageFingerprints = new Set();
|
|
23
|
+
for (let page = 0; page < WORKSPACE_PAGE_CAP; page += 1) {
|
|
24
|
+
const response = await listWorkspaces(connection, { ...query, page, pageSize: WORKSPACE_PAGE_SIZE }, options);
|
|
25
|
+
if (response.items.length === 0)
|
|
26
|
+
return [...workspaces.values()];
|
|
27
|
+
const summaries = response.items.map((item) => workspaceSummary(item, page));
|
|
28
|
+
const fingerprint = JSON.stringify(summaries.map(({ id, name }) => [id, name ?? '']));
|
|
29
|
+
if (pageFingerprints.has(fingerprint)) {
|
|
30
|
+
throw new Error(`Workspace listing repeated page content at page ${page}.`);
|
|
31
|
+
}
|
|
32
|
+
pageFingerprints.add(fingerprint);
|
|
33
|
+
let additions = 0;
|
|
34
|
+
for (const summary of summaries) {
|
|
35
|
+
const foldedId = folded(summary.id);
|
|
36
|
+
const existingCasing = foldedIds.get(foldedId);
|
|
37
|
+
if (existingCasing !== undefined && existingCasing !== summary.id) {
|
|
38
|
+
throw new Error(`Workspace IDs ${existingCasing} and ${summary.id} differ only by case or Unicode normalization and are ambiguous.`);
|
|
39
|
+
}
|
|
40
|
+
foldedIds.set(foldedId, summary.id);
|
|
41
|
+
if (!workspaces.has(summary.id)) {
|
|
42
|
+
workspaces.set(summary.id, summary);
|
|
43
|
+
additions += 1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (additions === 0) {
|
|
47
|
+
throw new Error(`Workspace listing made no progress at page ${page}.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`Workspace listing exceeded the ${WORKSPACE_PAGE_CAP}-page safety limit.`);
|
|
51
|
+
}
|
|
52
|
+
async function validatedWorkspace(connection, workspaceId, options) {
|
|
53
|
+
const workspace = await getWorkspace(connection, workspaceId, options);
|
|
54
|
+
if (workspace.id !== workspaceId) {
|
|
55
|
+
throw new Error(`Workspace validation returned ID ${String(workspace.id)} instead of selected ID ${workspaceId}.`);
|
|
56
|
+
}
|
|
57
|
+
return { id: workspaceId, workspace };
|
|
58
|
+
}
|
|
59
|
+
export function assertWorkspaceSelector(selector) {
|
|
60
|
+
const hasId = nonemptyString(selector.workspaceId);
|
|
61
|
+
const hasName = nonemptyString(selector.workspaceName);
|
|
62
|
+
if (hasId === hasName) {
|
|
63
|
+
throw new Error('Specify exactly one of --workspace-id or --workspace-name.');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function resolveWorkspace(connection, selector, options = {}) {
|
|
67
|
+
assertWorkspaceSelector(selector);
|
|
68
|
+
if (nonemptyString(selector.workspaceId)) {
|
|
69
|
+
return validatedWorkspace(connection, selector.workspaceId, options);
|
|
70
|
+
}
|
|
71
|
+
const requestedName = selector.workspaceName;
|
|
72
|
+
const requestedFoldedName = folded(requestedName);
|
|
73
|
+
const listed = await enumerateWorkspaces(connection, options, { nameFragment: requestedName });
|
|
74
|
+
const matches = listed.filter(({ name }) => name !== undefined && folded(name) === requestedFoldedName);
|
|
75
|
+
if (matches.length === 0) {
|
|
76
|
+
throw new Error(`No workspace has the exact case-insensitive name ${requestedName}.`);
|
|
77
|
+
}
|
|
78
|
+
if (matches.length > 1) {
|
|
79
|
+
throw new Error(`Workspace name ${requestedName} is ambiguous across IDs: ${matches
|
|
80
|
+
.map(({ id }) => id)
|
|
81
|
+
.toSorted()
|
|
82
|
+
.join(', ')}. Use --workspace-id.`);
|
|
83
|
+
}
|
|
84
|
+
return validatedWorkspace(connection, matches[0].id, options);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=resolve-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-workspace.js","sourceRoot":"","sources":["../../src/services/resolve-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
# summary
|
|
2
2
|
|
|
3
|
-
Experimentally export
|
|
3
|
+
Experimentally export one or all CMS workspaces using a read-only, best-effort process.
|
|
4
4
|
|
|
5
5
|
# description
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Exports one Marketing Cloud CMS workspace selected by exact ID or case-insensitive exact name, or preflights and exports all workspaces under a parent directory. Canonical fetched names and casing are preserved. Bulk preflight is global and strict; execution then continues across individual failures and returns a complete aggregate. This is not a complete or guaranteed backup and does not mutate org data.
|
|
8
8
|
|
|
9
9
|
# examples
|
|
10
10
|
|
|
11
|
-
- Export
|
|
11
|
+
- Export by exact workspace name to ./cms/Main Site:
|
|
12
|
+
|
|
13
|
+
<%= config.bin %> <%= command.id %> --target-org my-org --workspace-name "Main Site"
|
|
14
|
+
|
|
15
|
+
- Export by workspace ID to an exact explicit directory:
|
|
12
16
|
|
|
13
17
|
<%= config.bin %> <%= command.id %> --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export
|
|
14
18
|
|
|
19
|
+
- Export all Marketing workspaces beneath ./cms with the v1 JSON aggregate:
|
|
20
|
+
|
|
21
|
+
<%= config.bin %> <%= command.id %> --target-org my-org --all --workspace-type Marketing --output-dir ./cms --contract-version 1 --json
|
|
22
|
+
|
|
23
|
+
Bulk JSON uses `sf-cms-workspace-export-set@1`. Exit 0 means success, 2 means partial with a usable aggregate, and 1 means failed or blocked. Unsupported contract majors block before org access.
|
|
24
|
+
|
|
15
25
|
# flags.target-org.summary
|
|
16
26
|
|
|
17
27
|
Username or alias of the target Salesforce org.
|
|
@@ -20,10 +30,26 @@ Username or alias of the target Salesforce org.
|
|
|
20
30
|
|
|
21
31
|
Salesforce API version used for CMS requests.
|
|
22
32
|
|
|
33
|
+
# flags.contract-version.summary
|
|
34
|
+
|
|
35
|
+
Machine contract major version (supported: 1). Unsupported majors return a blocked contract envelope before org access.
|
|
36
|
+
|
|
37
|
+
# flags.all.summary
|
|
38
|
+
|
|
39
|
+
Export every CMS workspace after a strict global preflight.
|
|
40
|
+
|
|
23
41
|
# flags.workspace-id.summary
|
|
24
42
|
|
|
25
|
-
CMS workspace content-space ID.
|
|
43
|
+
Exact CMS workspace content-space ID.
|
|
44
|
+
|
|
45
|
+
# flags.workspace-name.summary
|
|
46
|
+
|
|
47
|
+
Exact case-insensitive CMS workspace name.
|
|
48
|
+
|
|
49
|
+
# flags.workspace-type.summary
|
|
50
|
+
|
|
51
|
+
Bulk-only workspace type filter: Marketing or Content (case-insensitive).
|
|
26
52
|
|
|
27
53
|
# flags.output-dir.summary
|
|
28
54
|
|
|
29
|
-
|
|
55
|
+
Single: exact new destination. Bulk: parent directory. Defaults to ./cms/<name> or ./cms.
|
|
@@ -4,33 +4,43 @@ Safely plan or apply a create-only import into a CMS workspace.
|
|
|
4
4
|
|
|
5
5
|
# description
|
|
6
6
|
|
|
7
|
-
Validates
|
|
7
|
+
Validates the source workspace export locally before any org request, selects one destination workspace by exact ID or exact case-sensitive name, checks every content key for conflicts, and defaults to a non-mutating dry run. Pass --apply with a new --report-dir to create content.
|
|
8
8
|
|
|
9
9
|
# examples
|
|
10
10
|
|
|
11
|
-
- Validate and preflight an
|
|
11
|
+
- Validate a source export and preflight an exact destination workspace name:
|
|
12
12
|
|
|
13
|
-
<%= config.bin %> <%= command.id %> --target-org my-org --workspace-
|
|
13
|
+
<%= config.bin %> <%= command.id %> --target-org my-org --workspace-name "Destination" --source-dir ./cms/Source
|
|
14
14
|
|
|
15
|
-
- Apply
|
|
15
|
+
- Apply to an exact destination workspace ID, select result major 1, and write a durable run report:
|
|
16
16
|
|
|
17
|
-
<%= config.bin %> <%= command.id %> --target-org my-org --workspace-id 0Zu... --source-dir ./cms
|
|
17
|
+
<%= config.bin %> <%= command.id %> --target-org my-org --workspace-id 0Zu... --source-dir ./cms/Source --apply --report-dir ./cms-import-report --contract-version 1 --json
|
|
18
|
+
|
|
19
|
+
JSON uses `sf-cms-workspace-import@1`. Package integrity and the independently declared manifest major are validated before org access. Exit 0 means success, 2 means partial with a usable result, and 1 means failed or blocked.
|
|
18
20
|
|
|
19
21
|
# flags.target-org.summary
|
|
20
22
|
|
|
21
23
|
Username or alias of the target Salesforce org.
|
|
22
24
|
|
|
25
|
+
# flags.contract-version.summary
|
|
26
|
+
|
|
27
|
+
Machine contract major version (supported: 1). Unsupported majors return a blocked contract envelope before package or org access.
|
|
28
|
+
|
|
23
29
|
# flags.api-version.summary
|
|
24
30
|
|
|
25
31
|
Salesforce API version used for CMS requests.
|
|
26
32
|
|
|
27
33
|
# flags.workspace-id.summary
|
|
28
34
|
|
|
29
|
-
|
|
35
|
+
Exact destination CMS workspace ID.
|
|
36
|
+
|
|
37
|
+
# flags.workspace-name.summary
|
|
38
|
+
|
|
39
|
+
Exact case-sensitive destination CMS workspace name.
|
|
30
40
|
|
|
31
41
|
# flags.source-dir.summary
|
|
32
42
|
|
|
33
|
-
|
|
43
|
+
Source workspace export containing manifest.json and items/.
|
|
34
44
|
|
|
35
45
|
# flags.apply.summary
|
|
36
46
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# summary
|
|
2
|
+
|
|
3
|
+
Show offline CMS contract and capability information.
|
|
4
|
+
|
|
5
|
+
# description
|
|
6
|
+
|
|
7
|
+
Reports the versioned CLI JSON contracts, package compatibility, tested API baseline, and truthfully evidenced CMS capabilities without contacting an org.
|
|
8
|
+
|
|
9
|
+
# examples
|
|
10
|
+
|
|
11
|
+
- Show the installed plugin's offline capability envelope:
|
|
12
|
+
|
|
13
|
+
<%= config.bin %> <%= command.id %> --json
|
|
14
|
+
|
|
15
|
+
- Explicitly select supported command-result major 1:
|
|
16
|
+
|
|
17
|
+
<%= config.bin %> <%= command.id %> --contract-version 1 --json
|
|
18
|
+
|
|
19
|
+
# flags.contract-version.summary
|
|
20
|
+
|
|
21
|
+
Machine contract major version (supported: 1).
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sf-plugin-cms",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Salesforce CLI plugin
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Salesforce CLI plugin for Marketing Cloud CMS workspace export and create-only import",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Jörn Berkefeld",
|
|
7
7
|
"email": "joern.berkefeld@gmail.com"
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"devDependencies": {
|
|
73
73
|
"@eslint/js": "9.39.4",
|
|
74
74
|
"@oclif/plugin-command-snapshot": "5.3.33",
|
|
75
|
+
"@salesforce/cli": "2.150.6",
|
|
75
76
|
"@salesforce/cli-plugins-testkit": "5.3.64",
|
|
76
77
|
"@salesforce/dev-config": "4.3.3",
|
|
77
78
|
"@types/chai": "4.3.20",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-base.js","sourceRoot":"","sources":["../../../src/commands/cms/command-base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG/D,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,GAAG;IACT,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,iDAAiD;CAC3D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC;IAChD,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,+CAA+C;CACzD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;AAEpG,MAAM,OAAgB,UAAc,SAAQ,SAAY;IAC5C,KAAK,CAAC,aAAa,CAC3B,SAAiB,EACjB,UAAkB;QAElB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAChE,OAAO,OAAO,CAAC,UAAU,CAAC;IAC5B,CAAC;IAES,KAAK,CAAC,aAAa,CAC3B,SAAiB,EACjB,UAAkB;QAElB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC9E,CAAC;IAES,QAAQ,CAAC,KAAa,EAAE,IAAa;QAC7C,IAAI,CAAC,KAAK,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC9B,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;gBAC3B,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC;gBAC7D,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YACH,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAES,UAAU,CAAC,MAAiB;QACpC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;CACF;AAED,SAAS,WAAW,CAAC,MAAiB,EAAE,GAAW;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC"}
|