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
@@ -0,0 +1,355 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { isDeepStrictEqual } from 'node:util';
3
+ import { lookupExactCmsVariants } from './cms-prerequisite-lookup.js';
4
+ import { requiredContentIdentifier, requiredVariantIdentifier } from './variant-identity.js';
5
+ import { assertLandingPageTemplateItem, planLandingPageTemplateCopiesForType, validateLandingPageTemplatePrerequisites, } from './landing-page-template.js';
6
+ const LANDING_PAGE_TYPE = 'sfdc_cms__landingPage';
7
+ const TEMPLATE_TYPE = 'sfdc_cms__landingPageTemplate';
8
+ function record(value) {
9
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
10
+ }
11
+ function sha256(value) {
12
+ return createHash('sha256').update(JSON.stringify(value)).digest('hex');
13
+ }
14
+ function exactKeys(value, required, optional, label) {
15
+ const keys = Object.keys(value);
16
+ if (required.some((key) => !keys.includes(key)) ||
17
+ keys.some((key) => !required.includes(key) && !optional.includes(key))) {
18
+ throw new TypeError(`${label} contains unsupported or missing fields`);
19
+ }
20
+ }
21
+ /**
22
+ * Validate the exact captured landing-page authoring shape.
23
+ * @param {WorkspaceImportItem} item - Captured workspace item to validate.
24
+ * @returns {object} Extracted image and Data Graph prerequisites.
25
+ */
26
+ export function assertLandingPageItem(item) {
27
+ if (item.contentType !== LANDING_PAGE_TYPE) {
28
+ throw new TypeError(`Landing-page profile requires exact content type ${LANDING_PAGE_TYPE}`);
29
+ }
30
+ const inspect = (value) => {
31
+ if (Array.isArray(value)) {
32
+ for (const child of value)
33
+ inspect(child);
34
+ return;
35
+ }
36
+ if (!record(value))
37
+ return;
38
+ if (record(value.source) &&
39
+ value.source.type === 'imageReference' &&
40
+ (!record(value.source.ref) ||
41
+ Object.keys(value.source.ref).length !== 1 ||
42
+ typeof value.source.ref.contentKey !== 'string' ||
43
+ typeof value.url !== 'string' ||
44
+ !value.url.startsWith(`/cms/media/${value.source.ref.contentKey}`))) {
45
+ throw new TypeError('Landing-page image URL must match its exact image content key');
46
+ }
47
+ for (const child of Object.values(value))
48
+ inspect(child);
49
+ };
50
+ inspect(item.contentBody);
51
+ return assertLandingPageTemplateItem({ ...item, contentType: TEMPLATE_TYPE });
52
+ }
53
+ function pairForPage(source, item, sourceApiName) {
54
+ const pairs = source.manifest.landingPageTemplatePairs ?? [];
55
+ const matches = pairs.filter(({ page }) => page.apiName === sourceApiName &&
56
+ page.apiName === item.apiName &&
57
+ page.contentKey === item.contentKey &&
58
+ page.variantId === item.id);
59
+ if (matches.length !== 1) {
60
+ throw new TypeError(`Landing-page source must bind exactly one manifest template pair: ${sourceApiName}`);
61
+ }
62
+ const relationships = source.manifest.externalReferences.filter((reference) => reference.kind === 'cms.relationship' &&
63
+ reference.source.sourceId === item.id &&
64
+ reference.resolution === 'unsupported');
65
+ if (relationships.length === 0) {
66
+ throw new TypeError(`Landing-page source must retain its bound unsupported relationship: ${sourceApiName}`);
67
+ }
68
+ return { pair: matches[0], relationshipReferenceId: relationships[0].referenceId };
69
+ }
70
+ function parseTemplateDependency(value, pair, label) {
71
+ if (!record(value))
72
+ throw new TypeError(`${label} must be an object`);
73
+ exactKeys(value, ['source'], ['targetContentKey', 'targetApiName', 'targetTitle'], label);
74
+ if (!record(value.source))
75
+ throw new TypeError(`${label}.source must be an object`);
76
+ exactKeys(value.source, ['requestedTitle', 'apiName', 'contentKey'], [], `${label}.source`);
77
+ for (const key of ['requestedTitle', 'apiName', 'contentKey']) {
78
+ if (typeof value.source[key] !== 'string' || value.source[key].length === 0) {
79
+ throw new TypeError(`${label}.source.${key} must be a nonempty string`);
80
+ }
81
+ }
82
+ if (value.source.requestedTitle !== pair.template.requestedTitle ||
83
+ value.source.apiName !== pair.template.apiName ||
84
+ value.source.contentKey !== pair.template.contentKey) {
85
+ throw new TypeError(`${label}.source disagrees with manifest landingPageTemplatePairs`);
86
+ }
87
+ const contentKey = value.targetContentKey;
88
+ const apiName = value.targetApiName;
89
+ const title = value.targetTitle;
90
+ if ((contentKey === undefined) === (apiName === undefined)) {
91
+ throw new TypeError(`${label} must select target by exactly one of content key or API name`);
92
+ }
93
+ if (contentKey !== undefined) {
94
+ if (typeof contentKey !== 'string' || contentKey.length === 0)
95
+ throw new TypeError(`${label}.targetContentKey must be a nonempty string`);
96
+ if (title !== undefined)
97
+ throw new TypeError(`${label}.targetTitle is not allowed with targetContentKey`);
98
+ }
99
+ if (apiName !== undefined &&
100
+ (typeof apiName !== 'string' || !/^[A-Za-z][A-Za-z\d_]*$/u.test(apiName))) {
101
+ throw new TypeError(`${label}.targetApiName must be an exact developer/API name`);
102
+ }
103
+ if (title !== undefined && (typeof title !== 'string' || title.trim().length === 0)) {
104
+ throw new TypeError(`${label}.targetTitle must be a nonempty string`);
105
+ }
106
+ return {
107
+ source: pair.template,
108
+ ...(contentKey === undefined ? {} : { targetContentKey: contentKey }),
109
+ ...(apiName === undefined ? {} : { targetApiName: apiName }),
110
+ ...(title === undefined ? {} : { targetTitle: title }),
111
+ resolution: 'pending',
112
+ validationStatus: 'pending',
113
+ };
114
+ }
115
+ function compatibilityBody(item) {
116
+ const normalize = (value) => {
117
+ if (Array.isArray(value))
118
+ return value.map((child) => normalize(child));
119
+ if (!record(value))
120
+ return value;
121
+ const next = Object.fromEntries(Object.entries(value).map(([key, child]) => [key, normalize(child)]));
122
+ if (next.type === 'imageReference' &&
123
+ record(next.ref) &&
124
+ typeof next.ref.contentKey === 'string') {
125
+ next.ref = { ...next.ref, contentKey: '<image-content-key>' };
126
+ }
127
+ if (typeof next.url === 'string' && next.url.startsWith('/cms/media/')) {
128
+ next.url = '/cms/media/<image-content-key>';
129
+ }
130
+ if (next.definition === 'sfdc_cms__dataGraphDataProvider' && record(next.attributes)) {
131
+ next.attributes = {
132
+ ...next.attributes,
133
+ dataGraphApiName: '<data-graph-api-name>',
134
+ dataspace: '<data-space>',
135
+ };
136
+ }
137
+ return next;
138
+ };
139
+ const body = normalize(item.contentBody);
140
+ delete body['sfdc_cms:title'];
141
+ delete body['sfdc_cms:urlName'];
142
+ return body;
143
+ }
144
+ function assertSourcePairCompatibility(pageItem, templateItem) {
145
+ assertLandingPageItem(pageItem);
146
+ assertLandingPageTemplateItem(templateItem);
147
+ if (!isDeepStrictEqual(compatibilityBody(pageItem), compatibilityBody(templateItem))) {
148
+ throw new TypeError('Landing page and bound source template differ outside title/urlName');
149
+ }
150
+ }
151
+ function rows(value) {
152
+ if (!Array.isArray(value) || value.length === 0 || value.some((row) => !record(row))) {
153
+ throw new TypeError('Landing-page mappings must be a nonempty array of objects');
154
+ }
155
+ return value;
156
+ }
157
+ /**
158
+ * Plan exact type-qualified landing-page creates using only evidenced image references.
159
+ * @param {LoadedWorkspaceExport} source - Verified source workspace package.
160
+ * @param {unknown} input - User-supplied landing-page mapping JSON.
161
+ * @returns {PlannedLandingPageCopies} Validated create proposal.
162
+ */
163
+ export function planLandingPageCopies(source, input) {
164
+ const transformedRows = rows(input).map((row, index) => {
165
+ exactKeys(row, ['source', 'target', 'templateDependency', 'imageDependencies', 'dataGraphs'], [], `Landing-page mapping ${index}`);
166
+ if (!record(row.source)) {
167
+ throw new TypeError(`Landing-page mapping ${index}.source must be an object`);
168
+ }
169
+ exactKeys(row.source, ['family', 'type', 'apiName'], [], `Landing-page mapping ${index}.source`);
170
+ if (row.source.family !== 'cms' || row.source.type !== 'landingPage') {
171
+ throw new TypeError(`Landing-page mapping ${index}.source must select cms/landingPage`);
172
+ }
173
+ const sourceApiName = row.source.apiName;
174
+ if (typeof sourceApiName !== 'string') {
175
+ throw new TypeError(`Landing-page mapping ${index}.source.apiName must be a string`);
176
+ }
177
+ const sourceMatches = source.items.filter((item) => item.contentType === LANDING_PAGE_TYPE && item.apiName === sourceApiName);
178
+ if (sourceMatches.length !== 1) {
179
+ throw new TypeError(`Typed source API name must match exactly one landing page: ${sourceApiName}`);
180
+ }
181
+ const { pair, relationshipReferenceId } = pairForPage(source, sourceMatches[0], sourceApiName);
182
+ const sourceTemplateMatches = source.items.filter((item) => item.contentType === TEMPLATE_TYPE &&
183
+ item.id === pair.template.variantId &&
184
+ item.apiName === pair.template.apiName &&
185
+ item.contentKey === pair.template.contentKey &&
186
+ item.title === pair.template.requestedTitle);
187
+ if (sourceTemplateMatches.length !== 1) {
188
+ throw new TypeError('Bound source landing-page template identity is absent or inconsistent');
189
+ }
190
+ assertSourcePairCompatibility(sourceMatches[0], sourceTemplateMatches[0]);
191
+ const normalizedPageBody = compatibilityBody(sourceMatches[0]);
192
+ const normalizedTemplateBody = compatibilityBody(sourceTemplateMatches[0]);
193
+ const relationship = source.manifest.externalReferences.find(({ referenceId }) => referenceId === relationshipReferenceId);
194
+ const templateDependency = parseTemplateDependency(row.templateDependency, pair, `Landing-page mapping ${index}.templateDependency`);
195
+ if (!Array.isArray(row.imageDependencies)) {
196
+ throw new TypeError(`Landing-page mapping ${index}.imageDependencies must be an array`);
197
+ }
198
+ const cmsDependencies = row.imageDependencies.map((dependency, dependencyIndex) => {
199
+ if (!record(dependency)) {
200
+ throw new TypeError(`Landing-page image dependency ${dependencyIndex} must be an object`);
201
+ }
202
+ exactKeys(dependency, ['sourceContentKey', 'targetApiName'], ['targetTitle'], `Landing-page image dependency ${dependencyIndex}`);
203
+ return { ...dependency, sourceType: 'image' };
204
+ });
205
+ return {
206
+ source: { ...row.source, type: 'landingPageTemplate' },
207
+ target: row.target,
208
+ cmsDependencies,
209
+ dataGraphs: row.dataGraphs,
210
+ templateDependency,
211
+ compatibility: {
212
+ pageVariantId: sourceMatches[0].id,
213
+ sourceTemplateVariantId: sourceTemplateMatches[0].id,
214
+ relationshipReferenceId,
215
+ relationshipDescriptorSha256: sha256(relationship),
216
+ normalizationVersion: 'landing-page-template-compatibility-v1',
217
+ normalizedPageBodySha256: sha256(normalizedPageBody),
218
+ normalizedTemplateBodySha256: sha256(normalizedTemplateBody),
219
+ status: 'passed',
220
+ },
221
+ };
222
+ });
223
+ const transformedSource = {
224
+ ...source,
225
+ items: source.items.map((item) => item.contentType === LANDING_PAGE_TYPE ? { ...item, contentType: TEMPLATE_TYPE } : item),
226
+ };
227
+ const targetContentKeys = new Set();
228
+ const targetApiNames = new Set();
229
+ for (const { templateDependency } of transformedRows) {
230
+ if (templateDependency.targetContentKey !== undefined) {
231
+ if (targetContentKeys.has(templateDependency.targetContentKey)) {
232
+ throw new TypeError('Duplicate landing-page target template content key');
233
+ }
234
+ targetContentKeys.add(templateDependency.targetContentKey);
235
+ }
236
+ else if (templateDependency.targetApiName !== undefined) {
237
+ if (targetApiNames.has(templateDependency.targetApiName)) {
238
+ throw new TypeError('Duplicate landing-page target template API name');
239
+ }
240
+ targetApiNames.add(templateDependency.targetApiName);
241
+ }
242
+ }
243
+ const planned = planLandingPageTemplateCopiesForType(transformedSource, transformedRows.map((row) => ({
244
+ source: row.source,
245
+ target: row.target,
246
+ cmsDependencies: row.cmsDependencies,
247
+ dataGraphs: row.dataGraphs,
248
+ })), LANDING_PAGE_TYPE, 'Landing-page mapping');
249
+ const items = planned.items.map((item) => ({ ...item, contentType: LANDING_PAGE_TYPE }));
250
+ for (const item of items)
251
+ assertLandingPageItem(item);
252
+ return {
253
+ ...planned,
254
+ items,
255
+ cmsPrerequisites: planned.cmsPrerequisites,
256
+ compatibility: transformedRows.map(({ compatibility }) => compatibility),
257
+ templateDependencies: transformedRows.map(({ templateDependency }) => templateDependency),
258
+ };
259
+ }
260
+ function resolvedTemplateIdentity(value) {
261
+ const contentType = record(value.contentType)
262
+ ? value.contentType.fullyQualifiedName
263
+ : value.contentType;
264
+ if (contentType !== TEMPLATE_TYPE ||
265
+ !record(value.contentSpace) ||
266
+ typeof value.contentSpace.id !== 'string' ||
267
+ !record(value.status) ||
268
+ value.status.status !== 'Draft' ||
269
+ value.isPublished !== false ||
270
+ typeof value.apiName !== 'string' ||
271
+ typeof value.contentKey !== 'string' ||
272
+ typeof value.title !== 'string' ||
273
+ !record(value.contentBody)) {
274
+ throw new TypeError('Landing-page target template has incoherent type, identity, or lifecycle');
275
+ }
276
+ const variantId = requiredVariantIdentifier(value, 'Landing-page target template');
277
+ const contentId = requiredContentIdentifier(value, 'Landing-page target template parent');
278
+ if (contentId === variantId) {
279
+ throw new TypeError('Landing-page target template content/variant IDs are incoherent');
280
+ }
281
+ return {
282
+ apiName: value.apiName,
283
+ contentKey: value.contentKey,
284
+ contentId,
285
+ variantId,
286
+ title: value.title,
287
+ contentType: TEMPLATE_TYPE,
288
+ workspaceId: value.contentSpace.id,
289
+ status: 'Draft',
290
+ isPublished: false,
291
+ bodySha256: sha256(value.contentBody),
292
+ };
293
+ }
294
+ /**
295
+ * Resolve exact destination landing-page templates without mutating page bodies.
296
+ * @param {RequestConnection} connection - Destination org connection.
297
+ * @param {string} workspaceId - Exact destination workspace ID.
298
+ * @param {PlannedLandingPageCopies} proposal - Landing-page dependency plan.
299
+ * @param {JsonRequestOptions} options - Optional request metadata and signal.
300
+ * @returns {Promise<void>} Resolves after every target template is proven.
301
+ */
302
+ export async function resolveLandingPageTemplateDependencies(connection, workspaceId, proposal, options = {}) {
303
+ for (const dependency of proposal.templateDependencies) {
304
+ try {
305
+ let matches;
306
+ if (dependency.targetContentKey === undefined) {
307
+ matches = await lookupExactCmsVariants(connection, workspaceId, TEMPLATE_TYPE, dependency.targetApiName, (detail) => detail.apiName === dependency.targetApiName, options);
308
+ if (matches.length === 0 && dependency.targetTitle !== undefined) {
309
+ matches = await lookupExactCmsVariants(connection, workspaceId, TEMPLATE_TYPE, dependency.targetTitle, (detail) => detail.title === dependency.targetTitle, options);
310
+ dependency.resolution = 'title-fallback';
311
+ }
312
+ else {
313
+ dependency.resolution = 'api-name';
314
+ }
315
+ }
316
+ else {
317
+ matches = await lookupExactCmsVariants(connection, workspaceId, TEMPLATE_TYPE, dependency.targetContentKey, (detail) => detail.contentKey === dependency.targetContentKey, options);
318
+ dependency.resolution = 'content-key';
319
+ }
320
+ if (matches.length !== 1) {
321
+ throw new TypeError('Landing-page target template selector must resolve exactly once');
322
+ }
323
+ const target = resolvedTemplateIdentity(matches[0]);
324
+ const targetSpace = matches[0].contentSpace;
325
+ if (!record(targetSpace) || targetSpace.id !== workspaceId) {
326
+ throw new TypeError('Landing-page target template belongs to another workspace');
327
+ }
328
+ dependency.target = target;
329
+ dependency.validationStatus = 'passed';
330
+ }
331
+ catch (error) {
332
+ dependency.validationStatus = 'failed';
333
+ throw error;
334
+ }
335
+ }
336
+ }
337
+ /**
338
+ * Resolve exact typed images, validate Data Graph identities, and rewrite evidenced references.
339
+ * @param {RequestConnection} connection - Destination org connection.
340
+ * @param {string} workspaceId - Exact destination workspace ID.
341
+ * @param {PlannedLandingPageCopies} proposal - Landing-page proposal to validate.
342
+ * @param {JsonRequestOptions} options - Optional request metadata and signal.
343
+ * @returns {Promise<void>} Resolves after every prerequisite is validated and rewritten.
344
+ */
345
+ export async function validateLandingPagePrerequisites(connection, workspaceId, proposal, options = {}) {
346
+ const templateProposal = {
347
+ ...proposal,
348
+ items: proposal.items.map((item) => ({ ...item, contentType: TEMPLATE_TYPE })),
349
+ };
350
+ await validateLandingPageTemplatePrerequisites(connection, workspaceId, templateProposal, options);
351
+ for (const [index, item] of templateProposal.items.entries()) {
352
+ proposal.items[index] = { ...item, contentType: LANDING_PAGE_TYPE };
353
+ }
354
+ }
355
+ //# sourceMappingURL=landing-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"landing-page.js","sourceRoot":"","sources":["../../src/services/landing-page.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,20 @@ type VariantIdentity = {
2
2
  contentId?: string;
3
3
  variantId?: string;
4
4
  };
5
+ /**
6
+ * Reads a required Managed Content variant ID from current or legacy response fields.
7
+ * @param {Record<string, unknown>} record - Managed Content variant response.
8
+ * @param {string} [label] - Human-readable error label.
9
+ * @returns {string} Exact variant identifier.
10
+ */
11
+ export declare function requiredVariantIdentifier(record: Record<string, unknown>, label?: string): string;
12
+ /**
13
+ * Reads a required Managed Content parent ID from current or legacy response fields.
14
+ * @param {Record<string, unknown>} record - Managed Content variant response.
15
+ * @param {string} [label] - Human-readable error label.
16
+ * @returns {string} Exact parent content identifier.
17
+ */
18
+ export declare function requiredContentIdentifier(record: Record<string, unknown>, label?: string): string;
5
19
  /**
6
20
  * Reads documented variant response IDs and this package's legacy fixture fields.
7
21
  * Never treats a variant ID as the parent content ID.
@@ -13,6 +13,30 @@ function retainedIdentifier(record, current, legacy) {
13
13
  }
14
14
  return (record[current] ?? record[legacy]);
15
15
  }
16
+ /**
17
+ * Reads a required Managed Content variant ID from current or legacy response fields.
18
+ * @param {Record<string, unknown>} record - Managed Content variant response.
19
+ * @param {string} [label] - Human-readable error label.
20
+ * @returns {string} Exact variant identifier.
21
+ */
22
+ export function requiredVariantIdentifier(record, label = 'Variant') {
23
+ const variantId = retainedIdentifier(record, 'managedContentVariantId', 'id');
24
+ if (variantId === undefined)
25
+ throw new TypeError(`${label} identity is missing`);
26
+ return variantId;
27
+ }
28
+ /**
29
+ * Reads a required Managed Content parent ID from current or legacy response fields.
30
+ * @param {Record<string, unknown>} record - Managed Content variant response.
31
+ * @param {string} [label] - Human-readable error label.
32
+ * @returns {string} Exact parent content identifier.
33
+ */
34
+ export function requiredContentIdentifier(record, label = 'Content') {
35
+ const contentId = retainedIdentifier(record, 'managedContentId', 'contentId');
36
+ if (contentId === undefined)
37
+ throw new TypeError(`${label} identity is missing`);
38
+ return contentId;
39
+ }
16
40
  /**
17
41
  * Reads documented variant response IDs and this package's legacy fixture fields.
18
42
  * Never treats a variant ID as the parent content ID.
@@ -1 +1 @@
1
- {"version":3,"file":"variant-identity.js","sourceRoot":"","sources":["../../src/services/variant-identity.ts"],"names":[],"mappings":"AAEA,SAAS,kBAAkB,CACzB,MAA+B,EAC/B,OAAe,EACf,MAAc;IAEd,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IACE,KAAK,KAAK,SAAS;YACnB,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EACzE,CAAC;YACD,MAAM,IAAI,SAAS,CAAC,WAAW,GAAG,gCAAgC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,IACE,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS;QAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS;QAC5B,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAClC,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,2BAA2B,OAAO,IAAI,MAAM,WAAW,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAuB,CAAC;AACnE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,MAA+B,EAC/B,iBAAyB;IAEzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,EAAE,IAAI,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAC9E,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QAC/D,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QAC/D,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"variant-identity.js","sourceRoot":"","sources":["../../src/services/variant-identity.ts"],"names":[],"mappings":"AAEA,SAAS,kBAAkB,CACzB,MAA+B,EAC/B,OAAe,EACf,MAAc;IAEd,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IACE,KAAK,KAAK,SAAS;YACnB,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EACzE,CAAC;YACD,MAAM,IAAI,SAAS,CAAC,WAAW,GAAG,gCAAgC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,IACE,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS;QAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS;QAC5B,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAClC,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,2BAA2B,OAAO,IAAI,MAAM,WAAW,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAuB,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA+B,EAC/B,KAAK,GAAG,SAAS;IAEjB,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,EAAE,IAAI,CAAC,CAAC;IAC9E,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,sBAAsB,CAAC,CAAC;IACjF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA+B,EAC/B,KAAK,GAAG,SAAS;IAEjB,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAC9E,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,sBAAsB,CAAC,CAAC;IACjF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,MAA+B,EAC/B,iBAAyB;IAEzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,EAAE,IAAI,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAC9E,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QAC/D,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QAC/D,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { Connection } from '@salesforce/core';
2
+ import type { LoadedWorkspaceExport, WorkspaceImportItem } from './import-workspace.js';
3
+ import type { PlannedImportIdentities } from './import-identities.js';
4
+ type RequestConnection = Pick<Connection, 'request'> & Partial<Pick<Connection, 'version'>>;
5
+ export type DataGraphValidationEvidence = {
6
+ readonly url: string;
7
+ readonly name?: string;
8
+ readonly dataspaceName?: string;
9
+ readonly status?: string;
10
+ readonly failure?: string;
11
+ };
12
+ export type WebFragmentDataGraphPrerequisite = {
13
+ readonly sourceDeveloperName: string;
14
+ readonly sourceDataSpace: string;
15
+ readonly targetDeveloperName: string;
16
+ readonly targetDataSpace: string;
17
+ readonly resolution: 'preserved' | 'explicit-map';
18
+ validationStatus?: 'pending' | 'passed' | 'failed';
19
+ validationEvidence?: DataGraphValidationEvidence;
20
+ };
21
+ export type PlannedWebFragmentCopies = PlannedImportIdentities & {
22
+ readonly dataGraphs: readonly WebFragmentDataGraphPrerequisite[];
23
+ };
24
+ /**
25
+ * Validate the evidenced landing-page content-block shape.
26
+ * @param {WorkspaceImportItem} item - Integrity-verified web-fragment item.
27
+ * @returns {{developerName: string, dataSpace: string}[]} Exact named Data Graph prerequisites.
28
+ */
29
+ export declare function assertWebFragmentItem(item: WorkspaceImportItem): readonly {
30
+ developerName: string;
31
+ dataSpace: string;
32
+ }[];
33
+ /**
34
+ * Plan one or many exact type-qualified web-fragment creates.
35
+ * @param {LoadedWorkspaceExport} source - Integrity-verified workspace package.
36
+ * @param {unknown} input - Explicit source, target, and Data Graph map rows.
37
+ * @returns {PlannedWebFragmentCopies} Selected creates and exact prerequisite evidence.
38
+ */
39
+ export declare function planWebFragmentCopies(source: LoadedWorkspaceExport, input: unknown): PlannedWebFragmentCopies;
40
+ /**
41
+ * Prove each exact target Data Graph developer-name/data-space pair is ready for use.
42
+ * @param {RequestConnection} connection - Destination org request transport and selected version.
43
+ * @param {readonly WebFragmentDataGraphPrerequisite[]} prerequisites - Exact target prerequisites.
44
+ * @returns {Promise<void>} Fulfilled only when every named response qualifies exactly.
45
+ */
46
+ export declare function validateDataGraphPrerequisites(connection: RequestConnection, prerequisites: readonly WebFragmentDataGraphPrerequisite[]): Promise<void>;
47
+ export {};