sf-plugin-cms 0.4.0 → 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.
Files changed (71) hide show
  1. package/README.md +276 -20
  2. package/lib/commands/cms/export/workspace.d.ts +7 -1
  3. package/lib/commands/cms/export/workspace.js +113 -2
  4. package/lib/commands/cms/export/workspace.js.map +1 -1
  5. package/lib/commands/cms/import/workspace.d.ts +12 -4
  6. package/lib/commands/cms/import/workspace.js +167 -20
  7. package/lib/commands/cms/import/workspace.js.map +1 -1
  8. package/lib/commands/cms/info.js +21 -2
  9. package/lib/commands/cms/info.js.map +1 -1
  10. package/lib/contracts/info.d.ts +7 -4
  11. package/lib/contracts/info.js +17 -8
  12. package/lib/contracts/info.js.map +1 -1
  13. package/lib/contracts/shared.d.ts +2 -1
  14. package/lib/contracts/shared.js +11 -3
  15. package/lib/contracts/shared.js.map +1 -1
  16. package/lib/contracts/workspace-export.d.ts +41 -3
  17. package/lib/contracts/workspace-export.js +171 -5
  18. package/lib/contracts/workspace-export.js.map +1 -1
  19. package/lib/contracts/workspace-import.d.ts +65 -0
  20. package/lib/contracts/workspace-import.js +132 -1
  21. package/lib/contracts/workspace-import.js.map +1 -1
  22. package/lib/index.d.ts +3 -1
  23. package/lib/index.js +2 -0
  24. package/lib/index.js.map +1 -1
  25. package/lib/services/cms-prerequisite-lookup.d.ts +16 -0
  26. package/lib/services/cms-prerequisite-lookup.js +89 -0
  27. package/lib/services/cms-prerequisite-lookup.js.map +1 -0
  28. package/lib/services/content-key.d.ts +9 -0
  29. package/lib/services/content-key.js +15 -0
  30. package/lib/services/content-key.js.map +1 -0
  31. package/lib/services/email-fragment.d.ts +15 -0
  32. package/lib/services/email-fragment.js +203 -0
  33. package/lib/services/email-fragment.js.map +1 -0
  34. package/lib/services/export-workspace.d.ts +15 -1
  35. package/lib/services/export-workspace.js +284 -51
  36. package/lib/services/export-workspace.js.map +1 -1
  37. package/lib/services/image-import.d.ts +91 -0
  38. package/lib/services/image-import.js +575 -0
  39. package/lib/services/image-import.js.map +1 -0
  40. package/lib/services/import-identities.js +5 -1
  41. package/lib/services/import-identities.js.map +1 -1
  42. package/lib/services/import-workspace.d.ts +63 -3
  43. package/lib/services/import-workspace.js +277 -26
  44. package/lib/services/import-workspace.js.map +1 -1
  45. package/lib/services/landing-page-pair-export.d.ts +31 -0
  46. package/lib/services/landing-page-pair-export.js +122 -0
  47. package/lib/services/landing-page-pair-export.js.map +1 -0
  48. package/lib/services/landing-page-template.d.ts +62 -0
  49. package/lib/services/landing-page-template.js +372 -0
  50. package/lib/services/landing-page-template.js.map +1 -0
  51. package/lib/services/landing-page.d.ts +87 -0
  52. package/lib/services/landing-page.js +355 -0
  53. package/lib/services/landing-page.js.map +1 -0
  54. package/lib/services/variant-identity.d.ts +14 -0
  55. package/lib/services/variant-identity.js +24 -0
  56. package/lib/services/variant-identity.js.map +1 -1
  57. package/lib/services/web-fragment.d.ts +47 -0
  58. package/lib/services/web-fragment.js +286 -0
  59. package/lib/services/web-fragment.js.map +1 -0
  60. package/lib/transport/experimental-media.d.ts +30 -0
  61. package/lib/transport/experimental-media.js +224 -0
  62. package/lib/transport/experimental-media.js.map +1 -0
  63. package/lib/transport/json-request.d.ts +9 -1
  64. package/lib/transport/json-request.js +30 -3
  65. package/lib/transport/json-request.js.map +1 -1
  66. package/lib/transport/multipart-image-create.d.ts +28 -0
  67. package/lib/transport/multipart-image-create.js +189 -0
  68. package/lib/transport/multipart-image-create.js.map +1 -0
  69. package/messages/cms.export.workspace.md +20 -0
  70. package/messages/cms.import.workspace.md +12 -2
  71. package/package.json +1 -1
package/README.md CHANGED
@@ -58,17 +58,17 @@ Machine consumers should run this command first and select a mutually supported
58
58
 
59
59
  ## Command reference
60
60
 
61
- | Command | Details |
62
- |---|---|
63
- | `sf cms info` | [Plugin information](#sf-cms-info) |
64
- | `sf cms list workspace` | [List workspaces](#sf-cms-list-workspace) |
65
- | `sf cms get workspace` | [Get a workspace](#sf-cms-get-workspace) |
66
- | `sf cms list channel` | [List workspace channels](#sf-cms-list-channel) |
67
- | `sf cms get channel` | [Get a channel](#sf-cms-get-channel) |
68
- | `sf cms get content` | [Get content](#sf-cms-get-content) |
69
- | `sf cms get variant` | [Get a variant](#sf-cms-get-variant) |
70
- | `sf cms export workspace` | [Export a workspace](#sf-cms-export-workspace) |
71
- | `sf cms import workspace` | [Import a workspace](#sf-cms-import-workspace) |
61
+ | Command | Details |
62
+ | ------------------------- | ----------------------------------------------- |
63
+ | `sf cms info` | [Plugin information](#sf-cms-info) |
64
+ | `sf cms list workspace` | [List workspaces](#sf-cms-list-workspace) |
65
+ | `sf cms get workspace` | [Get a workspace](#sf-cms-get-workspace) |
66
+ | `sf cms list channel` | [List workspace channels](#sf-cms-list-channel) |
67
+ | `sf cms get channel` | [Get a channel](#sf-cms-get-channel) |
68
+ | `sf cms get content` | [Get content](#sf-cms-get-content) |
69
+ | `sf cms get variant` | [Get a variant](#sf-cms-get-variant) |
70
+ | `sf cms export workspace` | [Export a workspace](#sf-cms-export-workspace) |
71
+ | `sf cms import workspace` | [Import a workspace](#sf-cms-import-workspace) |
72
72
 
73
73
  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.
74
74
 
@@ -81,7 +81,7 @@ sf cms info --json
81
81
  sf cms info --contract-version 1 --json
82
82
  ```
83
83
 
84
- The result advertises command-result versions separately from compatible workspace-package manifest majors. It currently reports API `67.0` as both the default and sole tested version. Bulk export is implemented; external-reference correlation and import mapping remain experimental because only evidenced CMS reference kinds can be resolved. Installation alone does not prove org permissions or endpoint availability.
84
+ The result advertises command-result versions separately from compatible workspace-package manifest majors. It currently reports API `67.0` as both the default and sole tested version. Bulk export is implemented without media binaries; single-workspace media export is experimental and requires the explicit `--experimental-media` opt-in. The strict v2 image-create profile and the bounded v1 component-create profiles remain experimental. External-reference correlation and import mapping remain experimental because only evidenced CMS reference kinds and explicitly mapped prerequisites can be resolved. Installation alone does not prove org permissions or endpoint availability.
85
85
 
86
86
  `--contract-version <major>` defaults to `1`. Any unsupported major returns a `blocked` `sf-cms-info` envelope with diagnostic code `UNSUPPORTED_CONTRACT_VERSION` and exit `1`, without org access.
87
87
 
@@ -180,13 +180,14 @@ Runs an experimental, read-only, best-effort export of the variants currently ob
180
180
  ```sh
181
181
  sf cms export workspace --target-org my-org --workspace-name "Main Site"
182
182
  sf cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./custom-export --json
183
+ sf cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./custom-export --experimental-media --json
183
184
  sf cms export workspace --target-org my-org --all --workspace-type Marketing --output-dir ./cms --contract-version 1 --json
184
185
  ```
185
186
 
186
187
  Choose either single or bulk mode:
187
188
 
188
- - Single mode requires exactly one of `--workspace-id <id>` or `--workspace-name <name>`. Name matching is exact but case-insensitive. Case-only or Unicode-normalization-equivalent duplicates are ambiguous. The canonical fetched workspace name is always used for the default folder, preserving its casing.
189
- - Bulk mode uses `--all`, which is mutually exclusive with both single selectors. Optional `--workspace-type Marketing|Content` is valid only with `--all`; input casing is ignored and output is normalized to `Marketing` or `Content`.
189
+ - Single mode requires exactly one of `--workspace-id <id>` or `--workspace-name <name>`. Name matching is exact but case-insensitive. Case-only or Unicode-normalization-equivalent duplicates are ambiguous. The canonical fetched workspace name is always used for the default folder, preserving its casing. Image candidates are JSON-only and force an honest partial result by default. `--experimental-media` explicitly opts into the undocumented binary download transport and strict v2 media manifest; only then may Salesforce authorization follow the transport's narrowly validated redirect policy.
190
+ - Bulk mode uses `--all`, which is mutually exclusive with both single selectors. Optional `--workspace-type Marketing|Content` is valid only with `--all`; input casing is ignored and output is normalized to `Marketing` or `Content`. `--experimental-media` is incompatible with `--all`; bulk export never enables media binaries.
190
191
 
191
192
  In single mode, `--output-dir <path>` remains the exact new destination. When omitted, export writes to `./cms/<safe-canonical-workspace-name>`. In bulk mode, `--output-dir` is the parent directory and defaults to `./cms`; each workspace is written beneath it using the canonical fetched name. Safe segments preserve Unicode and case, replace path/control/Windows-invalid characters, and trim unsafe trailing dots or spaces.
192
193
 
@@ -273,6 +274,258 @@ The supported body requires nonempty `sfdc_cms:title`, `subjectLine`, `messagePu
273
274
 
274
275
  Historical native-copy evidence includes local compiled public-command execution with real flag parsing and org connections for owned email/template probes, including a separate cross-org native CREATE acceptance with independent readbacks. That evidence concerns the unedited native-copy path, not live installed editable HTML transfer. Separate packed CLI tests do not establish live installed-host acceptance against Salesforce. No general workspace migration, custom-key CREATE, general reference/media transport, non-default-language copying, or every allowed-field live profile is proven. The MCNext orchestrator is not wired to this native-copy flag; its integration remains a separate slice.
275
276
 
277
+ #### CMS images (`--image-map`)
278
+
279
+ Image transfer is an experimental single-workspace workflow built on strict workspace package v2. Export must use `--experimental-media`, which downloads the selected image binaries and records an exact bijection between each image variant, its media descriptor, and its packaged file. Import requires `--contract-version 2` and a nonempty `--image-map` JSON array. One row imports one image; multiple rows import many images sequentially in their deterministic typed-source order.
280
+
281
+ ```json
282
+ [
283
+ {
284
+ "source": {
285
+ "family": "cms",
286
+ "type": "image",
287
+ "apiName": "SourceLogo"
288
+ },
289
+ "contentKey": { "strategy": "preserve" },
290
+ "apiName": { "strategy": "fresh", "value": "TargetLogo" },
291
+ "title": { "strategy": "fresh", "value": "Target Logo" },
292
+ "urlName": { "strategy": "generated" }
293
+ }
294
+ ]
295
+ ```
296
+
297
+ ```sh
298
+ sf cms export workspace --target-org source-org --workspace-id 0ZuSOURCE --output-dir ./cms-images --experimental-media --json
299
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-images --image-map ./image-map.json --contract-version 2 --json
300
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-images --image-map ./image-map.json --contract-version 2 --apply --report-dir ./cms-image-report --json
301
+ ```
302
+
303
+ Every row selects exactly one integrity-verified `cms/image` item by exact API name, with optional source bindings such as workspace, language, server ID, title, or version. Each of the four identity fields has an explicit strategy: `preserve` submits the evidenced source value, `fresh` submits a different map-provided value, and `generated` omits the value for the server to assign. `title` supports only `preserve` or `fresh`. Every explicitly submitted Enhanced CMS target content key must match `^MC[A-Z2-7]{26}$`: the `MC` prefix followed by exactly 26 uppercase base32 characters (`A`–`Z` or `2`–`7`). Image keys supplied through `preserve` or `fresh` follow the same rule. Duplicate source selections and duplicate non-generated target identity tuples are rejected.
304
+
305
+ Dry-run validates the complete v2 package, verifies media bytes and hashes, resolves the exact destination workspace, and checks every selected destination identity before reporting the plan. Apply repeats destination checks immediately before each sequential multipart CREATE, records a pending operation before transport, and verifies returned identity, workspace, type, Draft state, authoring metadata, and canonical variant readback. Binary byte proof is reported separately because the authoring readback may not expose original bytes. Multipart filenames are normalized to the declared GIF, JPEG, PNG, or WebP MIME type; missing extensions are added and mismatches are rejected.
306
+
307
+ Image import is create-only. It has no update fallback, overwrite, publication, rollback, cleanup, or automatic retry. A transport or report-persistence ambiguity leaves ownership uncertain and must be reconciled from `workspace-import-run.json` before any new attempt.
308
+
309
+ #### Bounded email-fragment copies (`--email-fragment-map`)
310
+
311
+ Export one or many `sfdc_cms__emailFragment` components by exact API name. The selection file is a nonempty JSON string array; every requested name must resolve exactly once in the selected workspace and exact content type. Only selected variants are packaged, so relationship descriptors owned by unrelated workspace content are excluded while the resulting package retains normal manifest and hash verification.
312
+
313
+ ```json
314
+ ["ReusableHeader", "ReusableFooter"]
315
+ ```
316
+
317
+ ```sh
318
+ sf cms export workspace --target-org source-org --workspace-id 0ZuSOURCE --output-dir ./cms-email-fragments --email-fragment-map ./email-fragments.json --json
319
+ ```
320
+
321
+ For import, `--email-fragment-map <json-file>` opts into the experimental first Phase 4 profile. It supports only dependency-free `sfdc_cms__emailFragment` content whose body exactly matches the evidenced root-content-block → one section → one empty column shape, including the exact accepted layout attributes and empty provider, expression, attachment, and variant arrays. It is not general reusable-block or workspace restoration support.
322
+
323
+ The mapping file is a nonempty JSON array with exact typed source selectors and fresh target identities:
324
+
325
+ ```json
326
+ [
327
+ {
328
+ "source": {
329
+ "family": "cms",
330
+ "type": "emailFragment",
331
+ "apiName": "source_fragment_api"
332
+ },
333
+ "target": {
334
+ "contentKey": "MCAAAAAAAAAAAAAAAAAAAAAAAAAA",
335
+ "apiName": "fresh_fragment_api"
336
+ }
337
+ }
338
+ ]
339
+ ```
340
+
341
+ Each row must select exactly one integrity-verified `sfdc_cms__emailFragment` by API name. Missing, ambiguous, wrong-type, and duplicate selections are rejected; source content keys remain package provenance and are not selectors. The selected item language must equal the destination workspace's default language. Target `contentKey` and `apiName` must be fresh; the source title and URL name are preserved and therefore must also be fresh at the destination. Content-key and exact API-name absence are checked during preflight and rechecked immediately before CREATE, but dry-run still reports that broader server conflict behavior and apply readiness are unverified.
342
+
343
+ Preview first, then apply once with a new report directory:
344
+
345
+ ```sh
346
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-baseline --email-fragment-map ./email-fragment-map.json --contract-version 1 --json
347
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-baseline --email-fragment-map ./email-fragment-map.json --apply --report-dir ./cms-email-fragment-create-report --contract-version 1 --json
348
+ ```
349
+
350
+ Apply performs fresh create-only import under the destination root folder. It creates only the destination-default-language parent and leaves it Draft and unpublished. It preserves the source body, title, and URL name while replacing only the mapped `contentKey` and `apiName`; it does not modify the source package. No update, overwrite, publication, activation, send, child-language creation, or automatic retry is supported.
351
+
352
+ Bodies with nonempty components, references, media, data providers, expressions, attachments, variants, extra fields, or near-match layout definitions/attributes are rejected before mutation. Other email-fragment shapes remain unsupported. The separate `workspace.import.email-fragment-create` capability remains `experimental` because live acceptance covers only this narrow profile, not general email-fragment or workspace restoration.
353
+
354
+ #### Landing-page content blocks (`--web-fragment-map`)
355
+
356
+ Export one or many `sfdc_cms__webFragment` components by exact API name with a JSON string array. Every requested name must resolve exactly once in the selected workspace and type; otherwise export fails closed.
357
+
358
+ ```json
359
+ ["LandingHero", "LandingFooter"]
360
+ ```
361
+
362
+ ```sh
363
+ sf cms export workspace --target-org source-org --workspace-id 0ZuSOURCE --output-dir ./cms-web-fragments --web-fragment-map ./web-fragments.json --json
364
+ ```
365
+
366
+ Import uses a nonempty JSON array with exact typed source selection, fresh target identities, and one explicit row for every source Data Graph provider. Preserve names by repeating them, or map both the developer name and data-space developer name explicitly.
367
+
368
+ ```json
369
+ [
370
+ {
371
+ "source": {
372
+ "family": "cms",
373
+ "type": "webFragment",
374
+ "apiName": "LandingHero"
375
+ },
376
+ "target": {
377
+ "contentKey": "MCBBBBBBBBBBBBBBBBBBBBBBBBBB",
378
+ "apiName": "LandingHeroTarget"
379
+ },
380
+ "dataGraphs": [
381
+ {
382
+ "sourceDeveloperName": "Marketing",
383
+ "sourceDataSpace": "default",
384
+ "targetDeveloperName": "Marketing",
385
+ "targetDataSpace": "default"
386
+ }
387
+ ]
388
+ }
389
+ ]
390
+ ```
391
+
392
+ ```sh
393
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-web-fragments --web-fragment-map ./web-fragment-map.json --contract-version 1 --json
394
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-web-fragments --web-fragment-map ./web-fragment-map.json --apply --report-dir ./cms-web-fragment-report --contract-version 1 --json
395
+ ```
396
+
397
+ Dry-run proves fresh content-key and API-name availability, then resolves each exact target Data Graph with a named Connect GET at `/services/data/v{version}/ssot/data-graphs/{encodedDeveloperName}` using the connection-selected API version. A prerequisite qualifies only when the response is a non-array object whose nonempty `name` and `dataspaceName` exactly and case-sensitively match the mapped target pair, and whose nonblank status is `ready` or `active` case-insensitively. Apply repeats API-name and Data Graph validation immediately before each CREATE, creates sequentially, and journals every prerequisite mapping, validation result, and mutation in `workspace-import-run.json`. Duplicate target pairs share one request within each validation pass, but dry-run and apply revalidation remain separate. Request failures and malformed, missing, mismatched, or non-ready responses block creation; there is no SOQL, metadata/list fallback, data-space query-parameter reliance, or default Data Graph substitution. The profile creates Draft content only: no update fallback, overwrite, publication, activation, or send is performed. Deploy referenced CMS images before dependent fragments. The bounded packed installed-host acceptance matrix includes fresh Draft CREATE and independent readback for this exact profile; broader web-fragment shapes remain unsupported.
398
+
399
+ #### Landing-page templates (`--landing-page-template-map`)
400
+
401
+ Export one or many `sfdc_cms__landingPageTemplate` components by exact API name. The selection file is a nonempty JSON string array; each name must resolve exactly once in the selected workspace and exact content type.
402
+
403
+ ```json
404
+ ["MCBSUMZKCZFFEU3MZFHAZWVTWNGY"]
405
+ ```
406
+
407
+ ```sh
408
+ sf cms export workspace --target-org source-org --workspace-id 0ZuSOURCE --output-dir ./cms-landing-templates --landing-page-template-map ./landing-page-templates.json --json
409
+ ```
410
+
411
+ Import uses exact typed source selection, fresh create identities, explicit mappings for every captured CMS image/web-fragment reference, and explicit mappings for every Data Graph provider. Salesforce derives the template Label as `<target.apiName>--sfdc_cms__landingPageTemplate` and limits it to 80 characters, so `target.apiName` is limited to 49 characters. `targetTitle` is optional and is used only when the exact target API-name lookup succeeds with zero matches; fallback remains exact, type-qualified, workspace-scoped, and must resolve uniquely.
412
+
413
+ ```json
414
+ [
415
+ {
416
+ "source": {
417
+ "family": "cms",
418
+ "type": "landingPageTemplate",
419
+ "apiName": "MCBSUMZKCZFFEU3MZFHAZWVTWNGY"
420
+ },
421
+ "target": {
422
+ "contentKey": "MCCCCCCCCCCCCCCCCCCCCCCCCCCC",
423
+ "apiName": "FreshLandingTemplate"
424
+ },
425
+ "cmsDependencies": [
426
+ {
427
+ "sourceContentKey": "MCX2CQNLBTIBHUTDNGOLKCRUZW2Q",
428
+ "sourceType": "image",
429
+ "targetApiName": "TargetLogoImage",
430
+ "targetTitle": "Logo Placeholder"
431
+ }
432
+ ],
433
+ "dataGraphs": [
434
+ {
435
+ "sourceDeveloperName": "Marketing",
436
+ "sourceDataSpace": "default",
437
+ "targetDeveloperName": "Marketing",
438
+ "targetDataSpace": "default"
439
+ }
440
+ ]
441
+ }
442
+ ]
443
+ ```
444
+
445
+ ```sh
446
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-landing-templates --landing-page-template-map ./landing-page-template-map.json --contract-version 1 --json
447
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-landing-templates --landing-page-template-map ./landing-page-template-map.json --apply --report-dir ./cms-landing-template-report --contract-version 1 --json
448
+ ```
449
+
450
+ Dry-run verifies the complete package, fresh destination content key/API name, each exact Data Graph identity, and each exact typed CMS prerequisite. Apply repeats all checks immediately before each sequential CREATE, rewrites only the mapped CMS content keys and bound media URLs, and records CMS/Data Graph prerequisite resolution plus mutation evidence in `workspace-import-run.json`. Any lookup error, missing/ambiguous API name, missing/ambiguous title fallback, wrong type/workspace, unsupported reference shape, or drift blocks creation. Templates remain Draft and unpublished; there is no update, overwrite, upsert, publication, activation, send, or landing-page creation. Deploy images and web fragments first. The bounded packed installed-host acceptance matrix includes fresh Draft CREATE and independent readback for this exact template profile, with prerequisite revalidation and drift checks.
451
+
452
+ #### Paired landing pages and declared templates (`--landing-page-pair-map`)
453
+
454
+ Use this export-only compatibility baseline when a landing page declares a Landing Page Template relationship. The input is a nonempty array of explicit pairs:
455
+
456
+ ```json
457
+ [
458
+ {
459
+ "page": { "apiName": "SourceLandingPage" },
460
+ "template": { "title": "Human Template Label" }
461
+ }
462
+ ]
463
+ ```
464
+
465
+ The page selector is its exact API name. The expected template path is its exact human title/label because the relationship value can be opaque or unreadable. Title lookup is strict: zero or multiple exact matches fail closed, and lookup errors are never treated as zero matches. An optional `template.apiName` may corroborate a separately known API name, but the command never parses, compares, or asks the user to enter the opaque relationship value as a selector.
466
+
467
+ ```sh
468
+ sf cms export workspace --target-org source-org --workspace-id 0ZuSOURCE --output-dir ./cms-landing-page-pairs --landing-page-pair-map ./landing-page-pairs.json --json
469
+ ```
470
+
471
+ The bounded export retrieves complete exact-type inventories for `sfdc_cms__landingPage` and `sfdc_cms__landingPageTemplate` in the selected workspace, exports only the selected pages and resolved templates, and records deterministic `landingPageTemplatePairs` metadata. Each row binds the requested template title to the resolved canonical template API name, content key, and variant ID, plus the page API name/content key/variant ID. Compatibility is structural: each selected page must contain exactly one declared Landing Page Template relationship descriptor. The descriptor remains retained as a generic unsupported relationship; this baseline does not claim historical provenance and does not parse or compare the opaque relationship value. Multiple pages may bind the same exported template. No import mapping, destination lookup, body rewrite, journaling, or mutation is implemented by this flag.
472
+
473
+ #### Landing pages (`--landing-page-map`)
474
+
475
+ Export one or many `sfdc_cms__landingPage` components by exact API name. The selection file is a nonempty JSON string array; each name must resolve exactly once within the selected workspace and exact content type.
476
+
477
+ ```json
478
+ ["MCJV5RXRKOMRF5HD3OD3OFQSO5C4"]
479
+ ```
480
+
481
+ ```sh
482
+ sf cms export workspace --target-org source-org --workspace-id 0ZuSOURCE --output-dir ./cms-landing-pages --landing-page-map ./landing-pages.json --json
483
+ ```
484
+
485
+ The bounded import profile consumes the paired export evidence above. Source template selection is title-first; the independently retained canonical template API name/content key/variant ID and normalized page/template body hashes prove structural compatibility, not historical provenance. The opaque relationship descriptor is bound only through that declared pair; any additional unsupported relationship remains blocking. The outgoing page body receives no template-reference field injection.
486
+
487
+ The supported page shape retains the exact top-level body fields, the `sfdc_cms__dataGraphDataProvider` with `dataGraphApiName` and `dataspace`, and image blocks whose `source.type` is `imageReference`, whose `source.ref.contentKey` identifies the image, and whose URL begins with `/cms/media/{contentKey}`. Salesforce derives the page Label as `<target.apiName>--sfdc_cms__landingPage` and limits it to 80 characters, so `target.apiName` is limited to 57 characters.
488
+
489
+ ```json
490
+ [
491
+ {
492
+ "source": {
493
+ "family": "cms",
494
+ "type": "landingPage",
495
+ "apiName": "MCJV5RXRKOMRF5HD3OD3OFQSO5C4"
496
+ },
497
+ "target": {
498
+ "contentKey": "MCDDDDDDDDDDDDDDDDDDDDDDDDDD",
499
+ "apiName": "FreshLandingPage"
500
+ },
501
+ "imageDependencies": [
502
+ {
503
+ "sourceContentKey": "MCX2CQNLBTIBHUTDNGOLKCRUZW2Q",
504
+ "targetApiName": "TargetLogoImage",
505
+ "targetTitle": "Logo Placeholder"
506
+ }
507
+ ],
508
+ "dataGraphs": [
509
+ {
510
+ "sourceDeveloperName": "Marketing",
511
+ "sourceDataSpace": "default",
512
+ "targetDeveloperName": "Marketing",
513
+ "targetDataSpace": "default"
514
+ }
515
+ ]
516
+ }
517
+ ]
518
+ ```
519
+
520
+ ```sh
521
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-landing-pages --landing-page-map ./landing-page-map.json --contract-version 1 --json
522
+ sf cms import workspace --target-org destination-org --workspace-id 0ZuTARGET --source-dir ./cms-landing-pages --landing-page-map ./landing-page-map.json --apply --report-dir ./cms-landing-page-report --contract-version 1 --json
523
+ ```
524
+
525
+ Destination template resolution uses the explicitly requested content key, or exact API name with exact-title fallback only after a successful zero-match API-name lookup. The resolved template must remain the same exact type/workspace, Draft, unpublished identity and body at preflight and immediately before CREATE. Image resolution is exact API name first within the destination workspace and `sfdc_cms__image` type; `targetTitle` is considered only after that lookup completes successfully with zero matches. Data Graph developer-name/data-space identity and target page identity are also revalidated.
526
+
527
+ Dry-run creates no report and performs no mutation, but returns the same `templatePrerequisites` evidence shape as apply preflight. Apply writes `workspace-import-run.json` before any mutation, then rebuilds the outgoing body from immutable source page/template baselines and fresh image/Data Graph resolutions immediately before each CREATE. It fails before CREATE on template status/body/workspace/type drift, image/Data Graph drift, or target page identity drift. Evidence includes the source page and declared source template identities, requested target selector, normalization version/body hashes, relationship descriptor binding, phase timestamps/status/hashes, final request-body SHA-256, and returned IDs. The final packed installed-host acceptance performed exactly one fresh Landing Page CREATE and independent readback, proving the bounded result Draft and unpublished while the source/original content remained unchanged. The acceptance matrix also exercised prerequisite and drift checks. There is no update, overwrite, upsert, publish, activate, send, implicit dependency deployment, or template-reference injection.
528
+
276
529
  #### Editable HTML companion (`--editable-dir`)
277
530
 
278
531
  For local HTML editing, keep two separate directories: the unchanged workspace export is the integrity/provenance baseline, and an opt-in companion contains literal HTML beside its variant metadata. Export with both explicit destinations:
@@ -370,13 +623,13 @@ sf cms get content --help
370
623
 
371
624
  ### Integration boundary and ownership
372
625
 
373
- The supported v0.4.0 integration boundary is the Salesforce CLI subprocess. A consumer such as an MCN orchestrator should:
626
+ The supported v0.5.0 integration boundary is the Salesforce CLI subprocess. A consumer such as an MCN orchestrator should:
374
627
 
375
628
  1. Run `sf cms info --json`, require the needed capability, and choose a mutually supported command-result major.
376
629
  2. Run bulk export or workspace import with `--contract-version 1 --json`.
377
630
  3. Consume the returned CMS mappings and rewrite only fields owned by that consumer.
378
631
 
379
- CMS owns CMS artifact identity, source-to-target CMS mappings, import ordering, and CMS-internal reference rewriting. Dependency discovery and closure are unavailable in v0.4.0: exports preserve only evidenced opaque identity inventory and do not expose dependency edges. Consumers must not inspect package payloads to reconstruct CMS identity, infer dependencies or mappings, or rewrite CMS-owned references. No public JavaScript API is part of v0.4.0; the CLI JSON boundary is sufficient and avoids a second integration surface.
632
+ CMS owns CMS artifact identity, source-to-target CMS mappings, import ordering, and CMS-internal reference rewriting. General dependency discovery and closure are unavailable in v0.5.0: default exports preserve only evidenced opaque identity inventory and do not expose a general dependency graph. The bounded web-fragment, landing-page-template, and landing-page profiles resolve only the exact CMS and Data Graph prerequisites declared in their maps and evidenced by their supported shapes. Consumers must not inspect package payloads to reconstruct CMS identity, infer dependencies or mappings, or rewrite CMS-owned references. No public JavaScript API is part of v0.5.0; the CLI JSON boundary is sufficient and avoids a second integration surface.
380
633
 
381
634
  ### Authoritative envelope
382
635
 
@@ -389,14 +642,14 @@ CMS owns CMS artifact identity, source-to-target CMS mappings, import ordering,
389
642
  "status": "success",
390
643
  "metadata": {
391
644
  "operation": "<cms.info|workspace.export.bulk|workspace.import>",
392
- "plugin": { "name": "sf-plugin-cms", "version": "0.3.1" },
645
+ "plugin": { "name": "sf-plugin-cms", "version": "0.5.0" },
393
646
  "apiVersion": "67.0"
394
647
  },
395
648
  "diagnostics": { "warnings": [], "errors": [] },
396
649
  "provenance": {
397
650
  "producer": "sf-plugin-cms",
398
651
  "sourceOrgId": "<org-id-or-offline>",
399
- "pluginVersion": "0.3.1",
652
+ "pluginVersion": "0.5.0",
400
653
  "command": "sf cms <operation>",
401
654
  "generatedAt": "<ISO-8601>"
402
655
  },
@@ -413,8 +666,11 @@ The `--contract-version <major>` flag selects the command envelope/result major
413
666
  `sf-cms-info@1` reports plugin/API versions, supported command results, supported package manifests, result-to-manifest compatibility, and these capability IDs:
414
667
 
415
668
  - `workspace.export.bulk` — `implemented`, contract `sf-cms-workspace-export-set@1`.
416
- - `workspace.export.dependency-closure` — `unavailable`; v0.4.0 does not discover or traverse CMS relationships.
669
+ - `workspace.export.dependency-closure` — `unavailable`; v0.5.0 does not provide general relationship discovery or traversal.
417
670
  - `workspace.export.external-reference-correlation` — `experimental`, embedded contract `sf-cms-external-reference-correlations@1`.
671
+ - `workspace.export.experimental-media` — `experimental`, contract `sf-cms-workspace-export@2`; available only for a single workspace with explicit `--experimental-media`.
672
+ - `workspace.import.email-fragment-create` — `experimental`, contract `sf-cms-workspace-import@1`.
673
+ - `workspace.import.image-create` — `experimental`, contract `sf-cms-workspace-import@2`.
418
674
  - `workspace.import.mapping` — `experimental`, contract `sf-cms-workspace-import@1`.
419
675
 
420
676
  `sf-cms-workspace-export-set@1` contains `workspaceType`, a portable `outputDirectory`, selection and summary counts, `externalReferenceCorrelations`, and deterministic per-workspace entries. Workspace entries include canonical source identity, `success|partial|failed` status, relative artifact/manifest paths and hashes when finalized, and structured diagnostics. Any finalized omission or unresolved/unsupported reference makes that workspace and aggregate partial.
@@ -437,7 +693,7 @@ The correlation table exists only at `result.externalReferenceCorrelations`. Eac
437
693
 
438
694
  ### Package layout and integrity
439
695
 
440
- A v1 workspace export package contains `manifest.json` plus regular item files. `manifest.json` is the sole package control file and the sole regular file excluded from `items[]`. Every other regular file must occur exactly once in `items[]`; directories are excluded, while symlinks and other special filesystem entries are rejected. Paths are relative POSIX-style paths.
696
+ A workspace export package contains `manifest.json` plus regular item files. Packages without image candidates use manifest v1. Paired landing-page exports can additionally contain deterministic `landingPageTemplatePairs` rows that bind each selected page item to a title-resolved canonical template item while retaining the page's generic unsupported relationship descriptor. Image candidates without `--experimental-media` remain JSON entries in a strict v2 manifest with an empty `media` array, no media binary files, a `MEDIA_EXPORT_FAILED` warning, and `partial` completeness. With explicit `--experimental-media`, successful image downloads use the same strict v2 manifest and add bijectively matched `media` descriptors and `cms.media` items. `manifest.json` is the sole package control file and the sole regular file excluded from `items[]`. Every other regular file must occur exactly once in `items[]`; directories are excluded, while symlinks and other special filesystem entries are rejected. Paths are relative POSIX-style paths.
441
697
 
442
698
  Each item records exactly `{ path, sha256, kind, referenceId? }`, with lowercase SHA-256 calculated over the finalized exact file bytes. Import independently validates the manifest major, enumerates the package, rejects missing, substituted, duplicate-path, or unlisted files, and verifies every item hash. Only after the listed set and hashes are verified does it hash the exact `manifest.json` bytes and use that hash as package identity.
443
699
 
@@ -5,7 +5,7 @@ import { CmsCommand } from '../../../command-base.js';
5
5
  type WorkspaceExportCommandResult = CmsEnvelope<WorkspaceExportSetResult> | ExportWorkspaceResult;
6
6
  export default class ExportWorkspace extends CmsCommand<WorkspaceExportCommandResult> {
7
7
  static readonly summary = "Experimentally export one or all CMS workspaces using a read-only, best-effort process.";
8
- static readonly description = "Experimentally exports one Marketing Cloud CMS workspace or preflights and exports all workspaces. For a single workspace, --editable-dir creates an HTML-only companion beside an explicit unchanged baseline. The paths must be new and disjoint; the baseline is retained if companion creation fails. Eligible HTML is not proven dependency-free or safe and is not resolved, rewritten, sanitized, or scanned through Phase 7. This is not a complete or guaranteed backup and does not mutate org data.";
8
+ static readonly description = "Experimentally exports one Marketing Cloud CMS workspace or preflights and exports all workspaces. Image candidates remain partial JSON-only records by default. Single-workspace --experimental-media explicitly opts into an undocumented read-only binary transport that forwards Salesforce authorization only to a narrowly validated Salesforce media host class. Bulk media export is unsupported. For a single workspace, --editable-dir creates an HTML-only companion beside an explicit unchanged baseline. The paths must be new and disjoint; the baseline is retained if companion creation fails. Eligible HTML is not proven dependency-free or safe and is not resolved, rewritten, sanitized, or scanned through Phase 7. This is not a complete or guaranteed backup and does not mutate org data.";
9
9
  static readonly examples: string[];
10
10
  static readonly flags: {
11
11
  'target-org': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
@@ -15,6 +15,12 @@ export default class ExportWorkspace extends CmsCommand<WorkspaceExportCommandRe
15
15
  'workspace-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
16
  'workspace-name': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
17
  'workspace-type': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ 'email-fragment-map': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ 'web-fragment-map': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ 'landing-page-template-map': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ 'landing-page-map': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ 'landing-page-pair-map': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ 'experimental-media': import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
24
  'editable-dir': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
25
  'output-dir': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
26
  };
@@ -1,17 +1,25 @@
1
1
  import { Flags } from '@salesforce/sf-plugins-core';
2
+ import { readFile } from 'node:fs/promises';
2
3
  import { assertWorkspaceExportSetResult, } from '../../../contracts/workspace-export.js';
3
4
  import { assertSupportedMajor } from '../../../contracts/shared.js';
4
5
  import { exportAllWorkspaces, normalizeWorkspaceType, } from '../../../services/bulk-export-workspaces.js';
5
6
  import { defaultWorkspaceDestination, exportWorkspace, } from '../../../services/export-workspace.js';
6
7
  import { preflightEditableExport } from '../../../services/editable-raw-html-export.js';
8
+ import { parseLandingPagePairSelectors } from '../../../services/landing-page-pair-export.js';
7
9
  import { assertWorkspaceSelector, resolveWorkspace } from '../../../services/resolve-workspace.js';
8
10
  import { apiVersionFlag, CmsCommand, targetOrgFlag } from '../../../command-base.js';
9
11
  export default class ExportWorkspace extends CmsCommand {
10
12
  static summary = 'Experimentally export one or all CMS workspaces using a read-only, best-effort process.';
11
- static description = 'Experimentally exports one Marketing Cloud CMS workspace or preflights and exports all workspaces. For a single workspace, --editable-dir creates an HTML-only companion beside an explicit unchanged baseline. The paths must be new and disjoint; the baseline is retained if companion creation fails. Eligible HTML is not proven dependency-free or safe and is not resolved, rewritten, sanitized, or scanned through Phase 7. This is not a complete or guaranteed backup and does not mutate org data.';
13
+ static description = 'Experimentally exports one Marketing Cloud CMS workspace or preflights and exports all workspaces. Image candidates remain partial JSON-only records by default. Single-workspace --experimental-media explicitly opts into an undocumented read-only binary transport that forwards Salesforce authorization only to a narrowly validated Salesforce media host class. Bulk media export is unsupported. For a single workspace, --editable-dir creates an HTML-only companion beside an explicit unchanged baseline. The paths must be new and disjoint; the baseline is retained if companion creation fails. Eligible HTML is not proven dependency-free or safe and is not resolved, rewritten, sanitized, or scanned through Phase 7. This is not a complete or guaranteed backup and does not mutate org data.';
12
14
  static examples = [
13
15
  '<%= config.bin %> cms export workspace --target-org my-org --workspace-name "Main Site"',
14
- '<%= config.bin %> cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export',
16
+ '<%= config.bin %> cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export --json',
17
+ '<%= config.bin %> cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export --email-fragment-map ./email-fragments.json --json',
18
+ '<%= config.bin %> cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export --web-fragment-map ./web-fragments.json --json',
19
+ '<%= config.bin %> cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export --landing-page-template-map ./landing-page-templates.json --json',
20
+ '<%= config.bin %> cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export --landing-page-map ./landing-pages.json --json',
21
+ '<%= config.bin %> cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export --landing-page-pair-map ./landing-page-pairs.json --json',
22
+ '<%= config.bin %> cms export workspace --target-org my-org --workspace-id 0Zu... --output-dir ./cms-export --experimental-media --json',
15
23
  '<%= config.bin %> cms export workspace --target-org my-org --all --workspace-type Marketing --output-dir ./cms --contract-version 1 --json',
16
24
  '<%= config.bin %> cms export workspace --target-org source-org --workspace-id 0ZuSOURCE --output-dir ./cms-baseline --editable-dir ./cms-editable --json',
17
25
  ];
@@ -40,6 +48,65 @@ export default class ExportWorkspace extends CmsCommand {
40
48
  parse: async (input) => normalizeWorkspaceType(input),
41
49
  summary: 'Bulk-only workspace type filter: Marketing or Content (case-insensitive).',
42
50
  }),
51
+ 'email-fragment-map': Flags.file({
52
+ exists: true,
53
+ exclusive: [
54
+ 'all',
55
+ 'web-fragment-map',
56
+ 'landing-page-template-map',
57
+ 'landing-page-map',
58
+ 'landing-page-pair-map',
59
+ ],
60
+ summary: 'JSON array of exact sfdc_cms__emailFragment API names to export; every name must resolve exactly once.',
61
+ }),
62
+ 'web-fragment-map': Flags.file({
63
+ exists: true,
64
+ exclusive: [
65
+ 'all',
66
+ 'email-fragment-map',
67
+ 'landing-page-template-map',
68
+ 'landing-page-map',
69
+ 'landing-page-pair-map',
70
+ ],
71
+ summary: 'JSON array of exact sfdc_cms__webFragment API names to export; every name must resolve exactly once.',
72
+ }),
73
+ 'landing-page-template-map': Flags.file({
74
+ exists: true,
75
+ exclusive: [
76
+ 'all',
77
+ 'email-fragment-map',
78
+ 'web-fragment-map',
79
+ 'landing-page-map',
80
+ 'landing-page-pair-map',
81
+ ],
82
+ summary: 'JSON array of exact sfdc_cms__landingPageTemplate API names to export; every name must resolve exactly once.',
83
+ }),
84
+ 'landing-page-map': Flags.file({
85
+ exists: true,
86
+ exclusive: [
87
+ 'all',
88
+ 'email-fragment-map',
89
+ 'web-fragment-map',
90
+ 'landing-page-template-map',
91
+ 'landing-page-pair-map',
92
+ ],
93
+ summary: 'JSON array of exact sfdc_cms__landingPage API names to export; every name must resolve exactly once.',
94
+ }),
95
+ 'landing-page-pair-map': Flags.file({
96
+ exists: true,
97
+ exclusive: [
98
+ 'all',
99
+ 'email-fragment-map',
100
+ 'web-fragment-map',
101
+ 'landing-page-template-map',
102
+ 'landing-page-map',
103
+ ],
104
+ summary: 'JSON pairs of exact landing-page API name and exact source template title; the template API name is optional corroboration.',
105
+ }),
106
+ 'experimental-media': Flags.boolean({
107
+ exclusive: ['all'],
108
+ summary: 'Single-workspace only: opt into undocumented image binary transport and strict v2 media output.',
109
+ }),
43
110
  'editable-dir': Flags.directory({
44
111
  exists: false,
45
112
  exclusive: ['all'],
@@ -104,10 +171,46 @@ export default class ExportWorkspace extends CmsCommand {
104
171
  }
105
172
  destination = defaultWorkspaceDestination(workspaceName);
106
173
  }
174
+ const experimentalMedia = flags['experimental-media'] === true ? resolveExperimentalMedia(connection) : undefined;
175
+ const pairSelectionFile = flags['landing-page-pair-map'];
176
+ const selectionFile = flags['email-fragment-map'] ??
177
+ flags['web-fragment-map'] ??
178
+ flags['landing-page-template-map'] ??
179
+ flags['landing-page-map'];
180
+ const selectedApiNames = selectionFile === undefined
181
+ ? undefined
182
+ : JSON.parse(await readFile(selectionFile, 'utf8'));
183
+ if (selectedApiNames !== undefined &&
184
+ (!Array.isArray(selectedApiNames) ||
185
+ selectedApiNames.some((value) => typeof value !== 'string'))) {
186
+ throw new TypeError('Component map must contain a JSON array of API-name strings.');
187
+ }
188
+ const landingPagePairs = pairSelectionFile === undefined
189
+ ? undefined
190
+ : parseLandingPagePairSelectors(JSON.parse(await readFile(pairSelectionFile, 'utf8')));
191
+ let selectedContentType;
192
+ if (flags['email-fragment-map'] !== undefined)
193
+ selectedContentType = 'sfdc_cms__emailFragment';
194
+ else if (flags['web-fragment-map'] !== undefined)
195
+ selectedContentType = 'sfdc_cms__webFragment';
196
+ else if (flags['landing-page-template-map'] !== undefined)
197
+ selectedContentType = 'sfdc_cms__landingPageTemplate';
198
+ else if (flags['landing-page-map'] !== undefined)
199
+ selectedContentType = 'sfdc_cms__landingPage';
107
200
  const result = await exportWorkspace(connection, selected.id, destination, {
108
201
  editableDirectory: flags['editable-dir'],
202
+ ...(selectedApiNames === undefined
203
+ ? {}
204
+ : {
205
+ selection: {
206
+ contentType: selectedContentType,
207
+ apiNames: selectedApiNames,
208
+ },
209
+ }),
210
+ ...(landingPagePairs === undefined ? {} : { landingPagePairs }),
109
211
  pluginVersion: this.pluginVersion,
110
212
  sourceOrgId: orgId,
213
+ ...(experimentalMedia === undefined ? {} : { experimentalMedia }),
111
214
  });
112
215
  for (const warning of result.manifest.warnings)
113
216
  this.warn(formatWarning(warning));
@@ -120,6 +223,14 @@ export default class ExportWorkspace extends CmsCommand {
120
223
  return result;
121
224
  }
122
225
  }
226
+ function resolveExperimentalMedia(connection) {
227
+ const connectionOptions = connection.getConnectionOptions?.();
228
+ const accessToken = connection.accessToken ?? connectionOptions?.accessToken;
229
+ if (typeof accessToken !== 'string' || accessToken.length === 0) {
230
+ throw new Error('--experimental-media requires an authenticated org access token.');
231
+ }
232
+ return { accessToken, instanceUrl: connection.instanceUrl };
233
+ }
123
234
  function blockedEnvelope(requestedVersion, apiVersion, pluginVersion) {
124
235
  return {
125
236
  contract: 'sf-cms-workspace-export-set',
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../src/commands/cms/export/workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../src/commands/cms/export/workspace.ts"],"names":[],"mappings":"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"}