sf-plugin-cms 0.2.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.
Files changed (64) hide show
  1. package/README.md +116 -13
  2. package/lib/{commands/cms/command-base.d.ts → command-base.d.ts} +2 -1
  3. package/lib/{commands/cms/command-base.js → command-base.js} +3 -0
  4. package/lib/command-base.js.map +1 -0
  5. package/lib/commands/cms/export/workspace.d.ts +12 -5
  6. package/lib/commands/cms/export/workspace.js +102 -11
  7. package/lib/commands/cms/export/workspace.js.map +1 -1
  8. package/lib/commands/cms/get/channel.d.ts +1 -1
  9. package/lib/commands/cms/get/channel.js +1 -1
  10. package/lib/commands/cms/get/channel.js.map +1 -1
  11. package/lib/commands/cms/get/content.d.ts +1 -1
  12. package/lib/commands/cms/get/content.js +1 -1
  13. package/lib/commands/cms/get/content.js.map +1 -1
  14. package/lib/commands/cms/get/variant.d.ts +1 -1
  15. package/lib/commands/cms/get/variant.js +1 -1
  16. package/lib/commands/cms/get/variant.js.map +1 -1
  17. package/lib/commands/cms/get/workspace.d.ts +1 -1
  18. package/lib/commands/cms/get/workspace.js +1 -1
  19. package/lib/commands/cms/get/workspace.js.map +1 -1
  20. package/lib/commands/cms/import/workspace.d.ts +7 -4
  21. package/lib/commands/cms/import/workspace.js +121 -35
  22. package/lib/commands/cms/import/workspace.js.map +1 -1
  23. package/lib/commands/cms/info.d.ts +11 -10
  24. package/lib/commands/cms/info.js +123 -8
  25. package/lib/commands/cms/info.js.map +1 -1
  26. package/lib/commands/cms/list/channel.d.ts +1 -1
  27. package/lib/commands/cms/list/channel.js +1 -1
  28. package/lib/commands/cms/list/channel.js.map +1 -1
  29. package/lib/commands/cms/list/workspace.d.ts +1 -1
  30. package/lib/commands/cms/list/workspace.js +1 -1
  31. package/lib/commands/cms/list/workspace.js.map +1 -1
  32. package/lib/contracts/info.d.ts +43 -0
  33. package/lib/contracts/info.js +69 -0
  34. package/lib/contracts/info.js.map +1 -0
  35. package/lib/contracts/shared.d.ts +81 -0
  36. package/lib/contracts/shared.js +218 -0
  37. package/lib/contracts/shared.js.map +1 -0
  38. package/lib/contracts/workspace-export.d.ts +91 -0
  39. package/lib/contracts/workspace-export.js +324 -0
  40. package/lib/contracts/workspace-export.js.map +1 -0
  41. package/lib/contracts/workspace-import.d.ts +46 -0
  42. package/lib/contracts/workspace-import.js +108 -0
  43. package/lib/contracts/workspace-import.js.map +1 -0
  44. package/lib/index.d.ts +1 -1
  45. package/lib/services/bulk-export-workspaces.d.ts +25 -0
  46. package/lib/services/bulk-export-workspaces.js +272 -0
  47. package/lib/services/bulk-export-workspaces.js.map +1 -0
  48. package/lib/services/export-references.d.ts +21 -0
  49. package/lib/services/export-references.js +150 -0
  50. package/lib/services/export-references.js.map +1 -0
  51. package/lib/services/export-workspace.d.ts +10 -22
  52. package/lib/services/export-workspace.js +68 -2
  53. package/lib/services/export-workspace.js.map +1 -1
  54. package/lib/services/import-workspace.d.ts +7 -3
  55. package/lib/services/import-workspace.js +224 -96
  56. package/lib/services/import-workspace.js.map +1 -1
  57. package/lib/services/resolve-workspace.d.ts +5 -0
  58. package/lib/services/resolve-workspace.js +56 -47
  59. package/lib/services/resolve-workspace.js.map +1 -1
  60. package/messages/cms.export.workspace.md +22 -4
  61. package/messages/cms.import.workspace.md +8 -2
  62. package/messages/cms.info.md +21 -0
  63. package/package.json +3 -2
  64. package/lib/commands/cms/command-base.js.map +0 -1
@@ -1,13 +1,53 @@
1
1
  import { getWorkspace, listWorkspaces } from './read.js';
2
- const WORKSPACE_PAGE_SIZE = 100;
2
+ const WORKSPACE_PAGE_SIZE = 250;
3
3
  const WORKSPACE_PAGE_CAP = 1000;
4
4
  function nonemptyString(value) {
5
5
  return typeof value === 'string' && value.length > 0;
6
6
  }
7
- function workspaceIdentity(value) {
8
- return nonemptyString(value.id) && nonemptyString(value.name)
9
- ? { id: value.id, name: value.name }
10
- : undefined;
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.`);
11
51
  }
12
52
  async function validatedWorkspace(connection, workspaceId, options) {
13
53
  const workspace = await getWorkspace(connection, workspaceId, options);
@@ -29,49 +69,18 @@ export async function resolveWorkspace(connection, selector, options = {}) {
29
69
  return validatedWorkspace(connection, selector.workspaceId, options);
30
70
  }
31
71
  const requestedName = selector.workspaceName;
32
- const matches = new Map();
33
- const observedIds = new Set();
34
- const pageFingerprints = new Set();
35
- for (let page = 0; page < WORKSPACE_PAGE_CAP; page += 1) {
36
- const response = await listWorkspaces(connection, { nameFragment: requestedName, page, pageSize: WORKSPACE_PAGE_SIZE }, options);
37
- const identities = response.items
38
- .map((item) => workspaceIdentity(item))
39
- .filter((value) => value !== undefined);
40
- const fingerprint = JSON.stringify(identities.map(({ id, name }) => [id, name]));
41
- if (pageFingerprints.has(fingerprint) && identities.length > 0) {
42
- throw new Error(`Workspace listing repeated a page while resolving name ${requestedName}.`);
43
- }
44
- pageFingerprints.add(fingerprint);
45
- let additions = 0;
46
- for (const identity of identities) {
47
- if (!observedIds.has(identity.id)) {
48
- observedIds.add(identity.id);
49
- additions += 1;
50
- }
51
- if (identity.name === requestedName)
52
- matches.set(identity.id, identity);
53
- }
54
- if (response.items.length === 0)
55
- break;
56
- if (additions === 0) {
57
- throw new Error(`Workspace listing made no progress while resolving name ${requestedName}.`);
58
- }
59
- const trustworthyPage = response.page === page && response.pageSize === WORKSPACE_PAGE_SIZE;
60
- const advertisedComplete = trustworthyPage &&
61
- response.total !== undefined &&
62
- response.total >= observedIds.size &&
63
- observedIds.size >= response.total;
64
- if (advertisedComplete && response.items.length < WORKSPACE_PAGE_SIZE)
65
- break;
66
- if (page === WORKSPACE_PAGE_CAP - 1) {
67
- throw new Error(`Workspace listing exceeded the ${WORKSPACE_PAGE_CAP}-page safety limit.`);
68
- }
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}.`);
69
77
  }
70
- if (matches.size === 0)
71
- throw new Error(`No workspace has the exact name ${requestedName}.`);
72
- if (matches.size > 1) {
73
- throw new Error(`Workspace name ${requestedName} is ambiguous across IDs: ${[...matches.keys()].toSorted().join(', ')}. Use --workspace-id.`);
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.`);
74
83
  }
75
- return validatedWorkspace(connection, [...matches.keys()][0], options);
84
+ return validatedWorkspace(connection, matches[0].id, options);
76
85
  }
77
86
  //# sourceMappingURL=resolve-workspace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-workspace.js","sourceRoot":"","sources":["../../src/services/resolve-workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve-workspace.js","sourceRoot":"","sources":["../../src/services/resolve-workspace.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  # summary
2
2
 
3
- Experimentally export a CMS workspace using a read-only, best-effort process.
3
+ Experimentally export one or all CMS workspaces using a read-only, best-effort process.
4
4
 
5
5
  # description
6
6
 
7
- Selects one Marketing Cloud CMS workspace by exact ID or exact case-sensitive name and writes the variants observed by an experimental, best-effort search. Without --output-dir, the new destination is ./cms/<safe-workspace-name>. This is not a complete or guaranteed backup and does not mutate org data.
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
 
@@ -16,6 +16,12 @@ Selects one Marketing Cloud CMS workspace by exact ID or exact case-sensitive na
16
16
 
17
17
  <%= config.bin %> <%= command.id %> --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export
18
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
+
19
25
  # flags.target-org.summary
20
26
 
21
27
  Username or alias of the target Salesforce org.
@@ -24,14 +30,26 @@ Username or alias of the target Salesforce org.
24
30
 
25
31
  Salesforce API version used for CMS requests.
26
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
+
27
41
  # flags.workspace-id.summary
28
42
 
29
43
  Exact CMS workspace content-space ID.
30
44
 
31
45
  # flags.workspace-name.summary
32
46
 
33
- Exact case-sensitive CMS workspace name.
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).
34
52
 
35
53
  # flags.output-dir.summary
36
54
 
37
- Exact new destination directory; defaults to ./cms/<safe-workspace-name>.
55
+ Single: exact new destination. Bulk: parent directory. Defaults to ./cms/<name> or ./cms.
@@ -12,14 +12,20 @@ Validates the source workspace export locally before any org request, selects on
12
12
 
13
13
  <%= config.bin %> <%= command.id %> --target-org my-org --workspace-name "Destination" --source-dir ./cms/Source
14
14
 
15
- - Apply to an exact destination workspace ID and write a durable run report:
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/Source --apply --report-dir ./cms-import-report
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.
@@ -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.2.0",
4
- "description": "Salesforce CLI plugin scaffold for Marketing Cloud CMS",
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"}