sf-plugin-cms 0.1.0 → 0.2.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 CHANGED
@@ -32,16 +32,16 @@ For a sandbox or org that uses a custom login host, add `--instance-url <login-u
32
32
 
33
33
  ### Install the plugin
34
34
 
35
- The normal installation command for a published Salesforce CLI plugin will be:
35
+ Install the plugin with Salesforce CLI:
36
36
 
37
37
  ```sh
38
38
  sf plugins install sf-plugin-cms
39
39
  ```
40
40
 
41
- This package is not currently documented as published to npm, so do not expect that command to work yet. For the current source-checkout workflow, run these commands from the repository's `sf-plugin-cms` directory:
41
+ For contributor work or local development from a source checkout, run these commands from the repository's `sf-plugin-cms` directory:
42
42
 
43
43
  ```sh
44
- npm install --no-workspaces
44
+ npm install
45
45
  npm run compile
46
46
  sf plugins link .
47
47
  ```
@@ -56,6 +56,18 @@ sf cms info
56
56
 
57
57
  ## Command reference
58
58
 
59
+ | Command | Details |
60
+ |---|---|
61
+ | `sf cms info` | [Plugin information](#sf-cms-info) |
62
+ | `sf cms list workspace` | [List workspaces](#sf-cms-list-workspace) |
63
+ | `sf cms get workspace` | [Get a workspace](#sf-cms-get-workspace) |
64
+ | `sf cms list channel` | [List workspace channels](#sf-cms-list-channel) |
65
+ | `sf cms get channel` | [Get a channel](#sf-cms-get-channel) |
66
+ | `sf cms get content` | [Get content](#sf-cms-get-content) |
67
+ | `sf cms get variant` | [Get a variant](#sf-cms-get-variant) |
68
+ | `sf cms export workspace` | [Export a workspace](#sf-cms-export-workspace) |
69
+ | `sf cms import workspace` | [Import a workspace](#sf-cms-import-workspace) |
70
+
59
71
  All org-backed commands require `--target-org <username-or-alias>` (short form `-o`). They use API version `67.0` by default; pass `--api-version <version>` only when you need to override it. Add `--json` for machine-readable Salesforce CLI output. Without `--json`, list commands print compact tables and get commands print formatted JSON records.
60
72
 
61
73
  ### `sf cms info`
@@ -159,24 +171,27 @@ Required selector: `--variant-id <id>`.
159
171
  Runs an experimental, read-only, best-effort export of the variants currently observed for one CMS workspace. The destination must not already exist. This output is not a complete or guaranteed backup.
160
172
 
161
173
  ```sh
162
- sf cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export
163
- sf cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export --json
174
+ sf cms export workspace --target-org my-org --workspace-name "Main Site"
175
+ sf cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./custom-export --json
164
176
  ```
165
177
 
166
- Required flags:
178
+ Workspace selector (exactly one required):
179
+
180
+ - `--workspace-id <id>`: CMS workspace content-space ID. The command validates that the returned workspace ID exactly matches this value.
181
+ - `--workspace-name <name>`: exact, case-sensitive workspace name. The command scans bounded zero-based pages, rejects distinct-ID ambiguity, then validates the selected workspace by ID.
167
182
 
168
- - `--workspace-id <id>`: CMS workspace content-space ID. The command validates that the returned workspace ID exactly matches this value before export begins.
169
- - `--output-dir <path>`: new destination directory for `manifest.json` and the exported `items/*.json` files. There is no overwrite option.
183
+ `--output-dir <path>` is optional. When omitted, export writes to `./cms/<safe-workspace-name>`. The safe segment preserves Unicode and case, replaces path/control/Windows-invalid characters, and trims unsafe trailing dots or spaces. Empty, dot-only, and Windows reserved device names require an explicit `--output-dir`. An explicit path is used exactly as supplied. The destination must not already exist; missing parents are created.
170
184
 
171
185
  Every service warning is emitted to stderr. Human output reports the destination and exported-versus-expected counts; `--json` suppresses that human summary and returns one clean structured result.
172
186
 
173
187
  Export layout:
174
188
 
175
189
  ```text
176
- cms-export/
177
- ├── manifest.json
178
- └── items/
179
- └── <variant-id>.json
190
+ cms/
191
+ └── Main Site/
192
+ ├── manifest.json
193
+ └── items/
194
+ └── <variant-id>.json
180
195
  ```
181
196
 
182
197
  `manifest.json` records the source workspace, search provenance, counts, warnings, rejected IDs, failed IDs, and the exact item-file mapping. Each item file contains one observed variant representation. Treat the package as best-effort evidence from that run, not as a guaranteed backup.
@@ -188,21 +203,21 @@ Plans or applies a create-only import from an export package. Dry-run is the def
188
203
  Safe dry run:
189
204
 
190
205
  ```sh
191
- sf cms import workspace --target-org my-org --workspace-id 0Zu... --source-dir ./cms-export
192
- sf cms import workspace --target-org my-org --workspace-id 0Zu... --source-dir ./cms-export --json
206
+ sf cms import workspace --target-org my-org --workspace-name "Destination" --source-dir "./cms/Source"
207
+ sf cms import workspace --target-org my-org --workspace-id 0Zu... --source-dir "./cms/Source" --json
193
208
  ```
194
209
 
195
210
  Explicit apply:
196
211
 
197
212
  ```sh
198
- sf cms import workspace --target-org my-org --workspace-id 0Zu... --source-dir ./cms-export --apply --report-dir ./cms-import-report
213
+ sf cms import workspace --target-org my-org --workspace-name "Destination" --source-dir "./cms/Source" --apply --report-dir ./cms-import-report
199
214
  ```
200
215
 
201
216
  Required flags:
202
217
 
203
218
  - `--target-org <username-or-alias>`: explicit destination org; no implicit target is accepted.
204
- - `--workspace-id <id>`: exact destination CMS workspace content-space ID.
205
- - `--source-dir <path>`: existing export package containing `manifest.json` and exactly the mapped `items/*.json` files.
219
+ - Exactly one destination selector: `--workspace-id <id>` or exact case-sensitive `--workspace-name <name>`. This identity is the destination and is independent of the source workspace recorded in the export manifest.
220
+ - `--source-dir <path>`: existing source export package containing `manifest.json` and exactly the mapped `items/*.json` files. Its manifest identifies the source workspace only; it does not select the destination.
206
221
 
207
222
  Safety flags:
208
223
 
@@ -227,7 +242,7 @@ Import limitations and conflicts:
227
242
  - Every content group must contain exactly one variant matching the destination workspace's `defaultLanguage`. There is no primary-language fallback.
228
243
  - Child variants are created sequentially after their primary parent. There is no concurrency.
229
244
  - Media-specific migration is not supported.
230
- - The command does not publish or unpublish content; newly created records are expected to remain draft/unpublished.
245
+ - The command does not change publication state; newly created records are expected to remain drafts.
231
246
  - `--allow-partial` accepts known source omissions but does not make the missing records recoverable.
232
247
 
233
248
  Recovery guidance:
@@ -257,7 +272,7 @@ sf cms get content --help
257
272
  ## Development
258
273
 
259
274
  ```sh
260
- npm install --no-workspaces
275
+ npm install
261
276
  npm run lint
262
277
  npm run build
263
278
  npm run intake:check
@@ -2,13 +2,14 @@ import { type ExportWorkspaceResult } from '../../../services/export-workspace.j
2
2
  import { CmsCommand } from '../command-base.js';
3
3
  export default class ExportWorkspace extends CmsCommand<ExportWorkspaceResult> {
4
4
  static readonly summary = "Experimentally export a CMS workspace using a read-only, best-effort process.";
5
- static readonly description = "Reads a Marketing Cloud CMS workspace and writes the variants observed by an experimental, best-effort search. This is not a complete or guaranteed backup and does not mutate org data.";
5
+ static readonly description = "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.";
6
6
  static readonly examples: string[];
7
7
  static readonly flags: {
8
8
  'target-org': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
9
  'api-version': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
- 'workspace-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
- 'output-dir': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ 'workspace-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ 'workspace-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ 'output-dir': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
13
  };
13
14
  run(): Promise<ExportWorkspaceResult>;
14
15
  }
@@ -1,31 +1,42 @@
1
1
  import { Flags } from '@salesforce/sf-plugins-core';
2
- import { exportWorkspace, } from '../../../services/export-workspace.js';
3
- import { getWorkspace } from '../../../services/read.js';
2
+ import { defaultWorkspaceDestination, exportWorkspace, } from '../../../services/export-workspace.js';
3
+ import { assertWorkspaceSelector, resolveWorkspace } from '../../../services/resolve-workspace.js';
4
4
  import { apiVersionFlag, CmsCommand, targetOrgFlag } from '../command-base.js';
5
5
  export default class ExportWorkspace extends CmsCommand {
6
6
  static summary = 'Experimentally export a CMS workspace using a read-only, best-effort process.';
7
- static description = 'Reads a Marketing Cloud CMS workspace and writes the variants observed by an experimental, best-effort search. This is not a complete or guaranteed backup and does not mutate org data.';
7
+ static description = '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.';
8
8
  static examples = [
9
+ '<%= config.bin %> cms export workspace --target-org my-org --workspace-name "Main Site"',
9
10
  '<%= config.bin %> cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export',
10
11
  ];
11
12
  static flags = {
12
13
  'target-org': targetOrgFlag,
13
14
  'api-version': apiVersionFlag,
14
- 'workspace-id': Flags.string({ required: true, summary: 'CMS workspace content-space ID.' }),
15
+ 'workspace-id': Flags.string({ summary: 'Exact CMS workspace content-space ID.' }),
16
+ 'workspace-name': Flags.string({ summary: 'Exact case-sensitive CMS workspace name.' }),
15
17
  'output-dir': Flags.directory({
16
18
  exists: false,
17
- required: true,
18
- summary: 'New directory to receive the experimental best-effort export.',
19
+ summary: 'Exact new destination directory; defaults to ./cms/<safe-workspace-name>.',
19
20
  }),
20
21
  };
21
22
  async run() {
22
23
  const { flags } = await this.parse(ExportWorkspace);
24
+ const selector = {
25
+ workspaceId: flags['workspace-id'],
26
+ workspaceName: flags['workspace-name'],
27
+ };
28
+ assertWorkspaceSelector(selector);
23
29
  const connection = await this.getConnection(flags['target-org'], flags['api-version']);
24
- const workspace = await getWorkspace(connection, flags['workspace-id']);
25
- if (workspace.id !== flags['workspace-id']) {
26
- throw new Error(`Workspace validation returned ID ${String(workspace.id)} instead of requested ID ${flags['workspace-id']}.`);
30
+ const selected = await resolveWorkspace(connection, selector);
31
+ let destination = flags['output-dir'];
32
+ if (destination === undefined) {
33
+ const workspaceName = selected.workspace.name;
34
+ if (typeof workspaceName !== 'string' || workspaceName.length === 0) {
35
+ throw new Error('Selected workspace has no usable name. Pass --output-dir explicitly.');
36
+ }
37
+ destination = defaultWorkspaceDestination(workspaceName);
27
38
  }
28
- const result = await exportWorkspace(connection, flags['workspace-id'], flags['output-dir']);
39
+ const result = await exportWorkspace(connection, selected.id, destination);
29
40
  for (const warning of result.manifest.warnings)
30
41
  this.warn(formatWarning(warning));
31
42
  if (!this.jsonEnabled()) {
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../src/commands/cms/export/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EACL,eAAe,GAGhB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE/E,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAiC;IACrE,MAAM,CAAU,OAAO,GAC5B,+EAA+E,CAAC;IAC3E,MAAM,CAAU,WAAW,GAChC,0LAA0L,CAAC;IACtL,MAAM,CAAU,QAAQ,GAAG;QAChC,4GAA4G;KAC7G,CAAC;IACK,MAAM,CAAU,KAAK,GAAG;QAC7B,YAAY,EAAE,aAAa;QAC3B,aAAa,EAAE,cAAc;QAC7B,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;QAC5F,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC;YAC5B,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,+DAA+D;SACzE,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QACvF,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACxE,IAAI,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,oCAAoC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,4BAA4B,KAAK,CAAC,cAAc,CAAC,GAAG,CAC7G,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7F,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QAElF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,GAAG,CACN,sBAAsB,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,WAAW,CAChG,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;;AAGH,SAAS,aAAa,CAAC,OAA+B;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../src/commands/cms/export/workspace.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,13 @@ import { type WorkspaceImportResult } from '../../../services/import-workspace.j
2
2
  import { CmsCommand } from '../command-base.js';
3
3
  export default class ImportWorkspace extends CmsCommand<WorkspaceImportResult> {
4
4
  static readonly summary = "Safely plan or apply a create-only import into a CMS workspace.";
5
- static readonly description = "Validates an exported workspace package locally, checks every content key for destination conflicts, and defaults to a non-mutating dry run. Pass --apply with a new --report-dir to create content.";
5
+ static readonly description = "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.";
6
6
  static readonly examples: string[];
7
7
  static readonly flags: {
8
8
  'target-org': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
9
  'api-version': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
- 'workspace-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ 'workspace-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ 'workspace-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
12
  'source-dir': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
13
  apply: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
14
  'allow-partial': import("@oclif/core/interfaces").BooleanFlag<boolean>;
@@ -1,22 +1,23 @@
1
1
  import { Flags } from '@salesforce/sf-plugins-core';
2
2
  import { executeWorkspaceImport, loadWorkspaceExport, } from '../../../services/import-workspace.js';
3
- import { getWorkspace } from '../../../services/read.js';
3
+ import { assertWorkspaceSelector, resolveWorkspace } from '../../../services/resolve-workspace.js';
4
4
  import { apiVersionFlag, CmsCommand, targetOrgFlag } from '../command-base.js';
5
5
  export default class ImportWorkspace extends CmsCommand {
6
6
  static summary = 'Safely plan or apply a create-only import into a CMS workspace.';
7
- static description = 'Validates an exported workspace package locally, checks every content key for destination conflicts, and defaults to a non-mutating dry run. Pass --apply with a new --report-dir to create content.';
7
+ static description = '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
  static examples = [
9
- '<%= config.bin %> cms import workspace --target-org my-org --workspace-id 0Zu... --source-dir ./cms-export',
10
- '<%= config.bin %> cms import workspace --target-org my-org --workspace-id 0Zu... --source-dir ./cms-export --apply --report-dir ./cms-import-report',
9
+ '<%= config.bin %> cms import workspace --target-org my-org --workspace-name "Destination" --source-dir ./cms/Source',
10
+ '<%= config.bin %> cms import workspace --target-org my-org --workspace-id 0Zu... --source-dir ./cms/Source --apply --report-dir ./cms-import-report',
11
11
  ];
12
12
  static flags = {
13
13
  'target-org': targetOrgFlag,
14
14
  'api-version': apiVersionFlag,
15
- 'workspace-id': Flags.string({ required: true, summary: 'Destination CMS workspace ID.' }),
15
+ 'workspace-id': Flags.string({ summary: 'Exact destination CMS workspace ID.' }),
16
+ 'workspace-name': Flags.string({ summary: 'Exact case-sensitive destination workspace name.' }),
16
17
  'source-dir': Flags.directory({
17
18
  exists: true,
18
19
  required: true,
19
- summary: 'Workspace export directory containing manifest.json and items/.',
20
+ summary: 'Source workspace export containing manifest.json and items/.',
20
21
  }),
21
22
  apply: Flags.boolean({
22
23
  default: false,
@@ -39,17 +40,22 @@ export default class ImportWorkspace extends CmsCommand {
39
40
  }
40
41
  // Reject malformed, unsafe, or disallowed partial packages before contacting the org.
41
42
  await loadWorkspaceExport(flags['source-dir'], { allowPartial: flags['allow-partial'] });
43
+ const selector = {
44
+ workspaceId: flags['workspace-id'],
45
+ workspaceName: flags['workspace-name'],
46
+ };
47
+ assertWorkspaceSelector(selector);
42
48
  const { connection, orgId } = await this.getOrgContext(flags['target-org'], flags['api-version']);
43
- const workspace = await getWorkspace(connection, flags['workspace-id']);
49
+ const selected = await resolveWorkspace(connection, selector);
44
50
  const result = await executeWorkspaceImport({
45
51
  allowPartial: flags['allow-partial'],
46
52
  connection,
47
53
  destinationOrgId: orgId,
48
- destinationWorkspace: workspace,
54
+ destinationWorkspace: selected.workspace,
49
55
  dryRun: !flags.apply,
50
56
  reportDirectory: flags['report-dir'],
51
57
  sourceDirectory: flags['source-dir'],
52
- workspaceId: flags['workspace-id'],
58
+ workspaceId: selected.id,
53
59
  });
54
60
  if (!this.jsonEnabled())
55
61
  this.showPlan(result);
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../src/commands/cms/import/workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../src/commands/cms/import/workspace.ts"],"names":[],"mappings":"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"}
@@ -33,5 +33,7 @@ export type ExportWorkspaceResult = {
33
33
  manifest: WorkspaceExportManifest;
34
34
  };
35
35
  type RequestConnection = Pick<Connection, 'request'>;
36
+ export declare function safeWorkspaceDirectoryName(workspaceName: string): string;
37
+ export declare function defaultWorkspaceDestination(workspaceName: string): string;
36
38
  export declare function exportWorkspace(connection: RequestConnection, workspaceId: string, destination: string, options?: JsonRequestOptions): Promise<ExportWorkspaceResult>;
37
39
  export {};
@@ -39,6 +39,28 @@ function detailWorkspaceId(detail) {
39
39
  function jsonBytes(value) {
40
40
  return `${JSON.stringify(value, null, 2)}\n`;
41
41
  }
42
+ const WINDOWS_RESERVED_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/iu;
43
+ export function safeWorkspaceDirectoryName(workspaceName) {
44
+ const replaced = [...workspaceName]
45
+ .map((character) => {
46
+ const codePoint = character.codePointAt(0) ?? 0;
47
+ return codePoint <= 31 || codePoint === 127 || /[\\/<>:"|?*]/u.test(character)
48
+ ? '_'
49
+ : character;
50
+ })
51
+ .join('');
52
+ const safeName = replaced.replaceAll(/[. ]+$/gu, '');
53
+ if (safeName.length === 0 ||
54
+ safeName === '.' ||
55
+ safeName === '..' ||
56
+ WINDOWS_RESERVED_NAME.test(safeName)) {
57
+ throw new Error(`Workspace name ${workspaceName} cannot be used as a portable directory name. Pass --output-dir explicitly.`);
58
+ }
59
+ return safeName;
60
+ }
61
+ export function defaultWorkspaceDestination(workspaceName) {
62
+ return path.join('.', 'cms', safeWorkspaceDirectoryName(workspaceName));
63
+ }
42
64
  async function exists(path) {
43
65
  try {
44
66
  await stat(path);
@@ -195,6 +217,7 @@ export async function exportWorkspace(connection, workspaceId, destination, opti
195
217
  warnings,
196
218
  };
197
219
  const parent = path.dirname(destination);
220
+ await mkdir(parent, { recursive: true });
198
221
  const temporary = path.join(parent, `.${path.basename(destination)}.tmp-${process.pid}-${Date.now()}`);
199
222
  try {
200
223
  await mkdir(temporary);
@@ -1 +1 @@
1
- {"version":3,"file":"export-workspace.js","sourceRoot":"","sources":["../../src/services/export-workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export-workspace.js","sourceRoot":"","sources":["../../src/services/export-workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
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 declare function assertWorkspaceSelector(selector: WorkspaceSelector): void;
14
+ export declare function resolveWorkspace(connection: RequestConnection, selector: WorkspaceSelector, options?: JsonRequestOptions): Promise<ResolvedWorkspace>;
15
+ export {};
@@ -0,0 +1,77 @@
1
+ import { getWorkspace, listWorkspaces } from './read.js';
2
+ const WORKSPACE_PAGE_SIZE = 100;
3
+ const WORKSPACE_PAGE_CAP = 1000;
4
+ function nonemptyString(value) {
5
+ return typeof value === 'string' && value.length > 0;
6
+ }
7
+ function workspaceIdentity(value) {
8
+ return nonemptyString(value.id) && nonemptyString(value.name)
9
+ ? { id: value.id, name: value.name }
10
+ : undefined;
11
+ }
12
+ async function validatedWorkspace(connection, workspaceId, options) {
13
+ const workspace = await getWorkspace(connection, workspaceId, options);
14
+ if (workspace.id !== workspaceId) {
15
+ throw new Error(`Workspace validation returned ID ${String(workspace.id)} instead of selected ID ${workspaceId}.`);
16
+ }
17
+ return { id: workspaceId, workspace };
18
+ }
19
+ export function assertWorkspaceSelector(selector) {
20
+ const hasId = nonemptyString(selector.workspaceId);
21
+ const hasName = nonemptyString(selector.workspaceName);
22
+ if (hasId === hasName) {
23
+ throw new Error('Specify exactly one of --workspace-id or --workspace-name.');
24
+ }
25
+ }
26
+ export async function resolveWorkspace(connection, selector, options = {}) {
27
+ assertWorkspaceSelector(selector);
28
+ if (nonemptyString(selector.workspaceId)) {
29
+ return validatedWorkspace(connection, selector.workspaceId, options);
30
+ }
31
+ 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
+ }
69
+ }
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.`);
74
+ }
75
+ return validatedWorkspace(connection, [...matches.keys()][0], options);
76
+ }
77
+ //# 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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"}
@@ -4,11 +4,15 @@ Experimentally export a CMS workspace using a read-only, best-effort process.
4
4
 
5
5
  # description
6
6
 
7
- Reads a Marketing Cloud CMS workspace and writes the variants observed by an experimental, best-effort search. This is not a complete or guaranteed backup and does not mutate org data.
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.
8
8
 
9
9
  # examples
10
10
 
11
- - Export the variants observed for one workspace into a new directory:
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
 
@@ -22,8 +26,12 @@ Salesforce API version used for CMS requests.
22
26
 
23
27
  # flags.workspace-id.summary
24
28
 
25
- CMS workspace content-space ID.
29
+ Exact CMS workspace content-space ID.
30
+
31
+ # flags.workspace-name.summary
32
+
33
+ Exact case-sensitive CMS workspace name.
26
34
 
27
35
  # flags.output-dir.summary
28
36
 
29
- New directory to receive the experimental best-effort export.
37
+ Exact new destination directory; defaults to ./cms/<safe-workspace-name>.
@@ -4,17 +4,17 @@ Safely plan or apply a create-only import into a CMS workspace.
4
4
 
5
5
  # description
6
6
 
7
- Validates an exported workspace package locally, checks every content key for destination conflicts, and defaults to a non-mutating dry run. Pass --apply with a new --report-dir to create content.
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 import without creating content:
11
+ - Validate a source export and preflight an exact destination workspace name:
12
12
 
13
- <%= config.bin %> <%= command.id %> --target-org my-org --workspace-id 0Zu... --source-dir ./cms-export
13
+ <%= config.bin %> <%= command.id %> --target-org my-org --workspace-name "Destination" --source-dir ./cms/Source
14
14
 
15
- - Apply a conflict-free plan and write a durable run report:
15
+ - Apply to an exact destination workspace ID and write a durable run report:
16
16
 
17
- <%= config.bin %> <%= command.id %> --target-org my-org --workspace-id 0Zu... --source-dir ./cms-export --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
18
18
 
19
19
  # flags.target-org.summary
20
20
 
@@ -26,11 +26,15 @@ Salesforce API version used for CMS requests.
26
26
 
27
27
  # flags.workspace-id.summary
28
28
 
29
- Destination CMS workspace ID.
29
+ Exact destination CMS workspace ID.
30
+
31
+ # flags.workspace-name.summary
32
+
33
+ Exact case-sensitive destination CMS workspace name.
30
34
 
31
35
  # flags.source-dir.summary
32
36
 
33
- Workspace export directory containing manifest.json and items/.
37
+ Source workspace export containing manifest.json and items/.
34
38
 
35
39
  # flags.apply.summary
36
40
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sf-plugin-cms",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Salesforce CLI plugin scaffold for Marketing Cloud CMS",
5
5
  "author": {
6
6
  "name": "Jörn Berkefeld",