sf-plugin-cms 0.3.1 → 0.4.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 +96 -11
- package/lib/commands/cms/export/workspace.d.ts +2 -1
- package/lib/commands/cms/export/workspace.js +21 -2
- package/lib/commands/cms/export/workspace.js.map +1 -1
- package/lib/commands/cms/import/workspace.d.ts +3 -1
- package/lib/commands/cms/import/workspace.js +35 -7
- package/lib/commands/cms/import/workspace.js.map +1 -1
- package/lib/services/bulk-export-workspaces.js +10 -4
- package/lib/services/bulk-export-workspaces.js.map +1 -1
- package/lib/services/editable-raw-html-export.d.ts +26 -0
- package/lib/services/editable-raw-html-export.js +100 -0
- package/lib/services/editable-raw-html-export.js.map +1 -0
- package/lib/services/editable-raw-html-import.d.ts +25 -0
- package/lib/services/editable-raw-html-import.js +107 -0
- package/lib/services/editable-raw-html-import.js.map +1 -0
- package/lib/services/editable-raw-html.d.ts +34 -0
- package/lib/services/editable-raw-html.js +83 -0
- package/lib/services/editable-raw-html.js.map +1 -0
- package/lib/services/export-references.js +3 -1
- package/lib/services/export-references.js.map +1 -1
- package/lib/services/export-workspace.d.ts +3 -0
- package/lib/services/export-workspace.js +39 -8
- package/lib/services/export-workspace.js.map +1 -1
- package/lib/services/import-identities.d.ts +33 -0
- package/lib/services/import-identities.js +287 -0
- package/lib/services/import-identities.js.map +1 -0
- package/lib/services/import-workspace.d.ts +36 -0
- package/lib/services/import-workspace.js +311 -15
- package/lib/services/import-workspace.js.map +1 -1
- package/lib/services/resolve-workspace.d.ts +6 -1
- package/lib/services/resolve-workspace.js +51 -4
- package/lib/services/resolve-workspace.js.map +1 -1
- package/lib/services/variant-identity.d.ts +13 -0
- package/lib/services/variant-identity.js +34 -0
- package/lib/services/variant-identity.js.map +1 -0
- package/messages/cms.export.workspace.md +12 -2
- package/messages/cms.import.workspace.md +23 -3
- package/package.json +1 -1
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the bounded native raw-HTML copy profile without allocating a content key.
|
|
3
|
+
* @param {LoadedWorkspaceExport} source - Integrity-checked original export.
|
|
4
|
+
* @param {unknown} input - Explicit parent/language selection and fresh names.
|
|
5
|
+
* @param {ReadonlySet<string>} literalHtmlVariantIds - Reconstructed sidecar variants, never GET-decode their literal HTML.
|
|
6
|
+
* @returns {PlannedImportIdentities} Detached selected native copies.
|
|
7
|
+
*/
|
|
8
|
+
export function planNativeCopies(source, input, literalHtmlVariantIds = new Set()) {
|
|
9
|
+
if (!Array.isArray(input) || input.length === 0)
|
|
10
|
+
throw new TypeError('Native copy mappings must be a nonempty array');
|
|
11
|
+
const selected = [];
|
|
12
|
+
const apiNames = new Set(source.items.map((item) => item.apiName));
|
|
13
|
+
const urls = new Set(source.items.flatMap((item) => [item.urlName, item.contentBody['sfdc_cms:urlName']]));
|
|
14
|
+
const parents = new Set();
|
|
15
|
+
for (const row of input) {
|
|
16
|
+
if (!record(row))
|
|
17
|
+
throw new TypeError('Native copy mapping must be an object');
|
|
18
|
+
exactKeys(row, ['sourceContentKey', 'language', 'apiName', 'urlName'], 'Native copy mapping');
|
|
19
|
+
for (const key of ['sourceContentKey', 'language', 'apiName'])
|
|
20
|
+
identity(row[key], key);
|
|
21
|
+
if (typeof row.urlName !== 'string' || !/^[a-z0-9-]+$/u.test(row.urlName))
|
|
22
|
+
throw new TypeError('Native URL name must use lowercase letters, digits or hyphens');
|
|
23
|
+
const matches = source.items.filter((item) => item.contentKey === row.sourceContentKey && item.language === row.language);
|
|
24
|
+
if (matches.length !== 1 || parents.has(row.sourceContentKey))
|
|
25
|
+
throw new TypeError('Select exactly one language per distinct native parent');
|
|
26
|
+
const item = matches[0];
|
|
27
|
+
if (apiNames.has(row.apiName) || urls.has(row.urlName))
|
|
28
|
+
throw new TypeError('Native API and URL names must be fresh relative to the source and this run');
|
|
29
|
+
assertNativeBody(item);
|
|
30
|
+
parents.add(item.contentKey);
|
|
31
|
+
apiNames.add(row.apiName);
|
|
32
|
+
urls.add(row.urlName);
|
|
33
|
+
selected.push({
|
|
34
|
+
...item,
|
|
35
|
+
apiName: row.apiName,
|
|
36
|
+
urlName: row.urlName,
|
|
37
|
+
contentBody: {
|
|
38
|
+
...item.contentBody,
|
|
39
|
+
rawHtml: literalHtmlVariantIds.has(item.id)
|
|
40
|
+
? item.contentBody.rawHtml
|
|
41
|
+
: decodeNativeHtml(item.contentBody.rawHtml),
|
|
42
|
+
...(item.contentType === 'sfdc_cms__email' ? { 'sfdc_cms:urlName': row.urlName } : {}),
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return { items: selected, targetContentKeys: [] };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Decode the single entity layer used by native GET, leaving literal HTML untouched.
|
|
50
|
+
* @param {string} value - Native rawHtml string.
|
|
51
|
+
* @returns {string} Literal HTML with at most one GET encoding layer removed.
|
|
52
|
+
*/
|
|
53
|
+
export function decodeNativeHtml(value) {
|
|
54
|
+
// Native GET encodes the complete HTML document once; do not decode literal HTML text.
|
|
55
|
+
if (value.includes('<') || !value.includes('<'))
|
|
56
|
+
return value;
|
|
57
|
+
return value
|
|
58
|
+
.replaceAll('<', '<')
|
|
59
|
+
.replaceAll('>', '>')
|
|
60
|
+
.replaceAll('"', '"')
|
|
61
|
+
.replaceAll(''', "'")
|
|
62
|
+
.replaceAll('&', '&');
|
|
63
|
+
}
|
|
64
|
+
function assertNativeBody(item) {
|
|
65
|
+
if (!['sfdc_cms__email', 'sfdc_cms__emailTemplate'].includes(item.contentType))
|
|
66
|
+
throw new TypeError('Native copy supports only raw-HTML email/template content');
|
|
67
|
+
if (item.externalId != null || item.externalSource != null)
|
|
68
|
+
throw new TypeError('External provider content is unsupported');
|
|
69
|
+
const strings = new Set([
|
|
70
|
+
'sfdc_cms:title',
|
|
71
|
+
'sfdc_cms:description',
|
|
72
|
+
'subjectLine',
|
|
73
|
+
'preheader',
|
|
74
|
+
'messagePurpose',
|
|
75
|
+
'rawHtml',
|
|
76
|
+
'textContent',
|
|
77
|
+
'backgroundColor',
|
|
78
|
+
]);
|
|
79
|
+
if (item.contentType === 'sfdc_cms__email')
|
|
80
|
+
strings.add('sfdc_cms:urlName');
|
|
81
|
+
const emptyArrays = new Set([
|
|
82
|
+
'lightning:dataProviders',
|
|
83
|
+
'lightning:expressions',
|
|
84
|
+
'sfdc_cms:attachments',
|
|
85
|
+
'sfdc_cms:variants',
|
|
86
|
+
]);
|
|
87
|
+
for (const required of ['sfdc_cms:title', 'subjectLine', 'messagePurpose', 'rawHtml']) {
|
|
88
|
+
if (typeof item.contentBody[required] !== 'string' || !item.contentBody[required])
|
|
89
|
+
throw new TypeError(`Native body requires ${required}`);
|
|
90
|
+
}
|
|
91
|
+
for (const [key, value] of Object.entries(item.contentBody)) {
|
|
92
|
+
if (strings.has(key) &&
|
|
93
|
+
typeof value === 'string' &&
|
|
94
|
+
// Temporary through Phase 7: retain the scanner, but bypass it for opaque rawHtml.
|
|
95
|
+
(key === 'rawHtml' ? TEMPORARILY_BYPASS_RAW_HTML_SCANNER : safeNativeMetadata(value)))
|
|
96
|
+
continue;
|
|
97
|
+
if (emptyArrays.has(key) && Array.isArray(value) && value.length === 0)
|
|
98
|
+
continue;
|
|
99
|
+
if (key === 'lightning:backgroundImage' &&
|
|
100
|
+
record(value) &&
|
|
101
|
+
Object.keys(value).length === 3 &&
|
|
102
|
+
value.repeat === 'no-repeat' &&
|
|
103
|
+
value.position === 'center center' &&
|
|
104
|
+
value.size === 'cover')
|
|
105
|
+
continue;
|
|
106
|
+
if (key === 'lightning:brandSource' &&
|
|
107
|
+
item.contentType === 'sfdc_cms__email' &&
|
|
108
|
+
record(value) &&
|
|
109
|
+
Object.keys(value).length === 1 &&
|
|
110
|
+
value.defaultBrandOption === 'sfdcBrand')
|
|
111
|
+
continue;
|
|
112
|
+
throw new TypeError(`Unsupported native body field or unresolved reference/media: ${key}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const TEMPORARILY_BYPASS_RAW_HTML_SCANNER = true;
|
|
116
|
+
const NATIVE_DANGER = /\{\{|\{!|%%|\$brand|(?:<)\s*(?:img|script|iframe|video|audio|source|object|embed|link|svg)\b|\b(?:src|srcset)\s*=|url\s*\(|cms:\/\/|\/cms\//iu;
|
|
117
|
+
function safeNativeMetadata(value) {
|
|
118
|
+
return !/&(?:#|[a-z])/iu.test(value) && !NATIVE_DANGER.test(value);
|
|
119
|
+
}
|
|
120
|
+
// This is a security inspection vocabulary, not a general HTML entity decoder; list aliases that can compose denied markers.
|
|
121
|
+
const INSPECTABLE_ENTITY = /&(?:(?:amp|lt|gt|quot|apos|colon|sol|lbrace|rbrace|lcub|rcub|percnt|dollar|lpar|rpar|equals|tab|newline);?(?![\da-z=])|#39;?(?!\d)|#x[\da-f]+;?(?![\da-f])|#\d+;?(?!\d))/giu;
|
|
122
|
+
export function safeNativeRawHtml(value) {
|
|
123
|
+
let inspected = value;
|
|
124
|
+
for (let pass = 0; pass < 3; pass += 1) {
|
|
125
|
+
if (NATIVE_DANGER.test(inspected))
|
|
126
|
+
return false;
|
|
127
|
+
const normalized = inspected.replaceAll(INSPECTABLE_ENTITY, (entity) => decodeInspectionEntity(entity));
|
|
128
|
+
if (normalized === inspected)
|
|
129
|
+
return true;
|
|
130
|
+
inspected = normalized;
|
|
131
|
+
}
|
|
132
|
+
INSPECTABLE_ENTITY.lastIndex = 0;
|
|
133
|
+
return !NATIVE_DANGER.test(inspected) && !INSPECTABLE_ENTITY.test(inspected);
|
|
134
|
+
}
|
|
135
|
+
function decodeInspectionEntity(entity) {
|
|
136
|
+
const normalized = entity.toLowerCase();
|
|
137
|
+
const terminated = normalized.endsWith(';');
|
|
138
|
+
const bare = terminated ? normalized.slice(0, -1) : normalized;
|
|
139
|
+
if (bare === '&')
|
|
140
|
+
return '&';
|
|
141
|
+
if (bare === '<')
|
|
142
|
+
return '<';
|
|
143
|
+
if (bare === '>')
|
|
144
|
+
return '>';
|
|
145
|
+
if (bare === '"')
|
|
146
|
+
return '"';
|
|
147
|
+
if (bare === '&apos' || bare === ''')
|
|
148
|
+
return "'";
|
|
149
|
+
const named = new Map([
|
|
150
|
+
['&colon', ':'],
|
|
151
|
+
['&sol', '/'],
|
|
152
|
+
['&lbrace', '{'],
|
|
153
|
+
['&rbrace', '}'],
|
|
154
|
+
['&lcub', '{'],
|
|
155
|
+
['&rcub', '}'],
|
|
156
|
+
['&percnt', '%'],
|
|
157
|
+
['&dollar', '$'],
|
|
158
|
+
['&lpar', '('],
|
|
159
|
+
['&rpar', ')'],
|
|
160
|
+
['&equals', '='],
|
|
161
|
+
['&tab', '\t'],
|
|
162
|
+
['&newline', '\n'],
|
|
163
|
+
]).get(bare);
|
|
164
|
+
if (named !== undefined)
|
|
165
|
+
return named;
|
|
166
|
+
const numeric = bare.startsWith('&#x')
|
|
167
|
+
? Number.parseInt(bare.slice(3), 16)
|
|
168
|
+
: Number.parseInt(bare.slice(2), 10);
|
|
169
|
+
return Number.isFinite(numeric) && numeric >= 0 && numeric <= 1_114_111
|
|
170
|
+
? String.fromCodePoint(numeric)
|
|
171
|
+
: entity;
|
|
172
|
+
}
|
|
173
|
+
function record(value) {
|
|
174
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
175
|
+
}
|
|
176
|
+
function exactKeys(value, keys, label) {
|
|
177
|
+
if (Object.keys(value).toSorted().join('\0') !== [...keys].toSorted().join('\0')) {
|
|
178
|
+
throw new TypeError(`${label} must contain exactly ${keys.join(', ')}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function identity(value, label) {
|
|
182
|
+
if (typeof value !== 'string' || !/^[A-Za-z0-9_-]+$/u.test(value)) {
|
|
183
|
+
throw new TypeError(`${label} must be a nonempty identifier without whitespace or separators`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function rewriteReferences(value, keys) {
|
|
187
|
+
if (Array.isArray(value))
|
|
188
|
+
return value.map((child) => rewriteReferences(child, keys));
|
|
189
|
+
if (!record(value))
|
|
190
|
+
return value;
|
|
191
|
+
if ('ref' in value) {
|
|
192
|
+
// Only the documented ImageContentReference shape proves this field is a CMS key.
|
|
193
|
+
if (value.type !== 'imageReference' || !record(value.ref)) {
|
|
194
|
+
throw new TypeError('Unsupported or ambiguous content reference; explicit transport required');
|
|
195
|
+
}
|
|
196
|
+
exactKeys(value.ref, ['contentKey'], 'Image reference');
|
|
197
|
+
const key = value.ref.contentKey;
|
|
198
|
+
if (typeof key !== 'string' || !keys.has(key)) {
|
|
199
|
+
throw new TypeError('Image reference has no selected source identity mapping');
|
|
200
|
+
}
|
|
201
|
+
return Object.fromEntries(Object.entries(value).map(([name, child]) => [
|
|
202
|
+
name,
|
|
203
|
+
name === 'ref' ? { contentKey: keys.get(key) } : rewriteReferences(child, keys),
|
|
204
|
+
]));
|
|
205
|
+
}
|
|
206
|
+
return Object.fromEntries(Object.entries(value).map(([name, child]) => [name, rewriteReferences(child, keys)]));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Build a detached identity proposal, not an executable or destination-validated import plan.
|
|
210
|
+
* @param {LoadedWorkspaceExport} source - Export already loaded through raw-byte integrity validation.
|
|
211
|
+
* @param {unknown} input - Complete explicit CREATE mappings for every selected parent and language.
|
|
212
|
+
* @returns {PlannedImportIdentities} Detached items requiring destination absence checks before mutation.
|
|
213
|
+
*/
|
|
214
|
+
export function planImportIdentities(source, input) {
|
|
215
|
+
if (!source.integrity.verified)
|
|
216
|
+
throw new TypeError('Source integrity must be verified first');
|
|
217
|
+
if (!Array.isArray(input))
|
|
218
|
+
throw new TypeError('Identity mappings must be an array');
|
|
219
|
+
const sourceKeys = new Set(source.items.map((item) => item.contentKey));
|
|
220
|
+
const sourceApiNames = new Set(source.items.map((item) => item.apiName));
|
|
221
|
+
const sourceUrls = new Set(source.items.flatMap((item) => [item.urlName, item.contentBody['sfdc_cms:urlName']]));
|
|
222
|
+
const mappings = new Map();
|
|
223
|
+
const targets = new Set();
|
|
224
|
+
const apiNames = new Set();
|
|
225
|
+
const urls = new Set();
|
|
226
|
+
for (const row of input) {
|
|
227
|
+
if (!record(row))
|
|
228
|
+
throw new TypeError('Identity mapping must be an object');
|
|
229
|
+
exactKeys(row, ['sourceContentKey', 'contentKey', 'apiName', 'urlNames'], 'Identity mapping');
|
|
230
|
+
for (const name of ['sourceContentKey', 'contentKey', 'apiName'])
|
|
231
|
+
identity(row[name], name);
|
|
232
|
+
const { sourceContentKey, contentKey, apiName } = row;
|
|
233
|
+
if (!sourceKeys.has(sourceContentKey) || mappings.has(sourceContentKey)) {
|
|
234
|
+
throw new TypeError('Identity mapping has an unknown or duplicate source content key');
|
|
235
|
+
}
|
|
236
|
+
if (sourceKeys.has(contentKey) || targets.has(contentKey)) {
|
|
237
|
+
throw new TypeError('Target content keys must be fresh and unique');
|
|
238
|
+
}
|
|
239
|
+
if (sourceApiNames.has(apiName) || apiNames.has(apiName)) {
|
|
240
|
+
throw new TypeError('Target API names must be fresh and unique');
|
|
241
|
+
}
|
|
242
|
+
const variants = source.items.filter((item) => item.contentKey === sourceContentKey);
|
|
243
|
+
if (new Set(variants.map((item) => item.contentType)).size !== 1) {
|
|
244
|
+
throw new TypeError('Parent variants have conflicting content types');
|
|
245
|
+
}
|
|
246
|
+
if (!record(row.urlNames))
|
|
247
|
+
throw new TypeError('urlNames must be an object');
|
|
248
|
+
exactKeys(row.urlNames, variants.map((item) => item.language), 'urlNames');
|
|
249
|
+
for (const url of Object.values(row.urlNames)) {
|
|
250
|
+
if (typeof url !== 'string' || !/^[a-z0-9-]+$/u.test(url)) {
|
|
251
|
+
throw new TypeError('Target URL names must contain lowercase letters, digits or hyphens');
|
|
252
|
+
}
|
|
253
|
+
if (sourceUrls.has(url) || urls.has(url)) {
|
|
254
|
+
throw new TypeError('Target URL names must be fresh and unique');
|
|
255
|
+
}
|
|
256
|
+
urls.add(url);
|
|
257
|
+
}
|
|
258
|
+
mappings.set(sourceContentKey, row);
|
|
259
|
+
targets.add(contentKey);
|
|
260
|
+
apiNames.add(apiName);
|
|
261
|
+
}
|
|
262
|
+
if (mappings.size !== sourceKeys.size)
|
|
263
|
+
throw new TypeError('Every selected parent needs a mapping');
|
|
264
|
+
const replacements = new Map([...mappings].map(([key, mapping]) => [key, mapping.contentKey]));
|
|
265
|
+
const imageKeys = new Map(source.items
|
|
266
|
+
.filter((item) => item.contentType === 'sfdc_cms__image')
|
|
267
|
+
.map((item) => [item.contentKey, replacements.get(item.contentKey)]));
|
|
268
|
+
const items = source.items.map((item) => {
|
|
269
|
+
const mapping = mappings.get(item.contentKey);
|
|
270
|
+
const contentBody = rewriteReferences(item.contentBody, imageKeys);
|
|
271
|
+
const urlName = mapping.urlNames[item.language];
|
|
272
|
+
// Email CMS metadata lives inside the body; never replace matching strings elsewhere.
|
|
273
|
+
if (item.contentType === 'sfdc_cms__email' ||
|
|
274
|
+
(item.contentType === 'sfdc_cms__emailTemplate' && 'sfdc_cms:urlName' in contentBody)) {
|
|
275
|
+
contentBody['sfdc_cms:urlName'] = urlName;
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
...item,
|
|
279
|
+
apiName: mapping.apiName,
|
|
280
|
+
contentKey: mapping.contentKey,
|
|
281
|
+
urlName,
|
|
282
|
+
contentBody,
|
|
283
|
+
};
|
|
284
|
+
});
|
|
285
|
+
return { items, targetContentKeys: [...targets].toSorted() };
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=import-identities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-identities.js","sourceRoot":"","sources":["../../src/services/import-identities.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { Connection } from '@salesforce/core';
|
|
2
|
+
import type { CmsDiagnostic } from '../contracts/shared.js';
|
|
2
3
|
import type { JsonRequestOptions } from '../transport/json-request.js';
|
|
3
4
|
import { type AtomicPublishOptions, type CleanupOptions } from './atomic-publish.js';
|
|
4
5
|
import { type WorkspaceExportManifest } from '../contracts/workspace-export.js';
|
|
5
6
|
import type { WorkspaceImportResult as WorkspaceImportContractResult } from '../contracts/workspace-import.js';
|
|
7
|
+
import { type EditableHtmlEvidence } from './editable-raw-html-import.js';
|
|
6
8
|
type RequestConnection = Pick<Connection, 'request'>;
|
|
7
9
|
type JsonObject = {
|
|
8
10
|
readonly [key: string]: JsonValue;
|
|
@@ -66,12 +68,14 @@ export type WorkspaceImportOperation = {
|
|
|
66
68
|
error?: string;
|
|
67
69
|
result?: {
|
|
68
70
|
readonly contentId?: string;
|
|
71
|
+
readonly contentKey?: string;
|
|
69
72
|
readonly primaryVariantId?: string;
|
|
70
73
|
readonly variantId?: string;
|
|
71
74
|
};
|
|
72
75
|
state: 'pending' | 'succeeded' | 'failed';
|
|
73
76
|
};
|
|
74
77
|
export type WorkspaceImportRunReport = {
|
|
78
|
+
readonly editableSource?: EditableHtmlEvidence;
|
|
75
79
|
readonly createdParents: CreatedParentRecord[];
|
|
76
80
|
readonly destinationOrgId: string;
|
|
77
81
|
readonly destinationWorkspaceId: string;
|
|
@@ -95,7 +99,10 @@ export type ExecuteWorkspaceImportOptions = {
|
|
|
95
99
|
readonly destinationOrgId: string;
|
|
96
100
|
readonly destinationWorkspace: unknown;
|
|
97
101
|
readonly dryRun?: boolean;
|
|
102
|
+
readonly editableDirectory?: string;
|
|
98
103
|
readonly loadedSource?: LoadedWorkspaceExport;
|
|
104
|
+
readonly identityMappings?: unknown;
|
|
105
|
+
readonly nativeCopyMappings?: unknown;
|
|
99
106
|
readonly reportDirectory?: string;
|
|
100
107
|
readonly reportPersistence?: WorkspaceImportReportPersistence;
|
|
101
108
|
readonly requestOptions?: JsonRequestOptions;
|
|
@@ -103,17 +110,46 @@ export type ExecuteWorkspaceImportOptions = {
|
|
|
103
110
|
readonly workspaceId: string;
|
|
104
111
|
};
|
|
105
112
|
export type WorkspaceImportExecutionResult = {
|
|
113
|
+
readonly diagnostics: CmsDiagnostic[];
|
|
106
114
|
readonly contractResult: WorkspaceImportContractResult;
|
|
107
115
|
readonly dryRun: boolean;
|
|
108
116
|
readonly plan: WorkspaceImportPlan;
|
|
109
117
|
readonly report?: WorkspaceImportRunReport;
|
|
110
118
|
readonly reportFile?: string;
|
|
111
119
|
};
|
|
120
|
+
/**
|
|
121
|
+
* Read a regular file while detecting observed replacement or modification.
|
|
122
|
+
* @param {string} file - Absolute file path.
|
|
123
|
+
* @param {string} label - Error context.
|
|
124
|
+
* @returns {Promise<Buffer>} Original file bytes.
|
|
125
|
+
*/
|
|
126
|
+
export declare function readStableRegularFile(file: string, label: string): Promise<Buffer>;
|
|
127
|
+
/**
|
|
128
|
+
* Enumerate regular package files without following symlinks.
|
|
129
|
+
* @param {string} directory - Directory to inspect.
|
|
130
|
+
* @param {string} packageRoot - Root for relative paths.
|
|
131
|
+
* @returns {Promise<string[]>} Sorted portable relative filenames.
|
|
132
|
+
*/
|
|
133
|
+
export declare function enumeratePackageFiles(directory: string, packageRoot: string): Promise<string[]>;
|
|
112
134
|
export declare function loadWorkspaceExport(sourceDirectory: string, options?: {
|
|
113
135
|
readonly allowPartial?: boolean;
|
|
114
136
|
}): Promise<LoadedWorkspaceExport>;
|
|
115
137
|
export declare function planWorkspaceImport(source: LoadedWorkspaceExport, workspace: unknown, expectedWorkspaceId: string): WorkspaceImportPlan;
|
|
116
138
|
type AtomicRewriteOptions = AtomicPublishOptions & CleanupOptions;
|
|
117
139
|
export declare function rewriteAtomic(file: string, value: unknown, options?: AtomicRewriteOptions): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* Reconstruct editable HTML before native validation, retaining all original identity inventory.
|
|
142
|
+
* @param {LoadedWorkspaceExport} source - Complete verified original package.
|
|
143
|
+
* @param {unknown} mappings - Native copy selections and fresh identities.
|
|
144
|
+
* @param {string} editableDirectory - Optional verified HTML companion.
|
|
145
|
+
* @returns {Promise<object>} Native proposal and optional all-companion evidence.
|
|
146
|
+
*/
|
|
147
|
+
export declare function planNativeWorkspaceImport(source: LoadedWorkspaceExport, mappings: unknown, editableDirectory?: string): Promise<{
|
|
148
|
+
proposal: import("./import-identities.js").PlannedImportIdentities;
|
|
149
|
+
editableSource?: undefined;
|
|
150
|
+
} | {
|
|
151
|
+
proposal: import("./import-identities.js").PlannedImportIdentities;
|
|
152
|
+
editableSource: EditableHtmlEvidence;
|
|
153
|
+
}>;
|
|
118
154
|
export declare function executeWorkspaceImport(options: ExecuteWorkspaceImportOptions): Promise<WorkspaceImportExecutionResult>;
|
|
119
155
|
export {};
|