@iwonz/ywtc 3.3.0 → 3.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +40 -43
  3. package/dist/adapters/confluence.d.ts +15 -1
  4. package/dist/adapters/confluence.js +59 -0
  5. package/dist/adapters/confluence.js.map +1 -1
  6. package/dist/adapters/yandex.d.ts +11 -1
  7. package/dist/adapters/yandex.js +64 -0
  8. package/dist/adapters/yandex.js.map +1 -1
  9. package/dist/cli-arguments.d.ts +2 -0
  10. package/dist/cli-arguments.js +6 -0
  11. package/dist/cli-arguments.js.map +1 -1
  12. package/dist/cli.js +6 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/clients/confluence-cloud.d.ts +16 -1
  15. package/dist/clients/confluence-cloud.js +109 -0
  16. package/dist/clients/confluence-cloud.js.map +1 -1
  17. package/dist/clients/confluence.d.ts +12 -1
  18. package/dist/clients/confluence.js +88 -0
  19. package/dist/clients/confluence.js.map +1 -1
  20. package/dist/clients/yandex-wiki.d.ts +10 -1
  21. package/dist/clients/yandex-wiki.js +44 -0
  22. package/dist/clients/yandex-wiki.js.map +1 -1
  23. package/dist/comments.d.ts +66 -0
  24. package/dist/comments.js +478 -0
  25. package/dist/comments.js.map +1 -0
  26. package/dist/doctor.d.ts +8 -1
  27. package/dist/doctor.js +20 -3
  28. package/dist/doctor.js.map +1 -1
  29. package/dist/domain.d.ts +69 -1
  30. package/dist/domain.js +3 -1
  31. package/dist/domain.js.map +1 -1
  32. package/dist/filesystem-export.d.ts +16 -1
  33. package/dist/filesystem-export.js +88 -2
  34. package/dist/filesystem-export.js.map +1 -1
  35. package/dist/issues.d.ts +1 -1
  36. package/dist/migrator.d.ts +2 -0
  37. package/dist/migrator.js +488 -13
  38. package/dist/migrator.js.map +1 -1
  39. package/dist/report-catalog.d.ts +13 -1
  40. package/dist/report-catalog.js +12 -0
  41. package/dist/report-catalog.js.map +1 -1
  42. package/dist/report.d.ts +25 -2
  43. package/dist/report.js +23 -1
  44. package/dist/report.js.map +1 -1
  45. package/dist/state.d.ts +35 -1
  46. package/dist/state.js +43 -1
  47. package/dist/state.js.map +1 -1
  48. package/dist/types.d.ts +75 -0
  49. package/package.json +1 -1
@@ -0,0 +1,478 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { createReadStream, createWriteStream } from 'node:fs';
3
+ import { mkdir, stat } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { Transform } from 'node:stream';
6
+ import { pipeline } from 'node:stream/promises';
7
+ import { ZipArchive } from '@archiver/archiver';
8
+ import { extractPageReferences } from './content-model.js';
9
+ import { safeFilename } from './input.js';
10
+ function hash(value) {
11
+ return createHash('sha256').update(value).digest('hex');
12
+ }
13
+ function authorKey(author) {
14
+ return author.providerId || author.username || author.publicName || author.email || author.displayName || 'unknown';
15
+ }
16
+ function commentAuthorLabel(author) {
17
+ return author.displayName || author.username || author.publicName || author.email || author.providerId || 'Неизвестный автор';
18
+ }
19
+ function commentAuthorDetail(author) {
20
+ return author.username || author.publicName || author.email;
21
+ }
22
+ function extractAttachmentReferences(body, format) {
23
+ const seen = new Set();
24
+ return extractPageReferences(body, format).flatMap((reference) => {
25
+ if (reference.kind !== 'attachment' || !reference.href)
26
+ return [];
27
+ const key = `${reference.href}\0${reference.raw}`;
28
+ if (seen.has(key))
29
+ return [];
30
+ seen.add(key);
31
+ return [{ raw: reference.raw, href: reference.href, ...(reference.pageTitle ? { label: reference.pageTitle } : {}) }];
32
+ });
33
+ }
34
+ function entryFromFlat(comment, format) {
35
+ return {
36
+ id: comment.id,
37
+ ...(comment.parentId ? { parentId: comment.parentId } : {}),
38
+ threadId: comment.threadId || comment.parentId || comment.id,
39
+ author: comment.author,
40
+ ...(comment.createdAt ? { createdAt: comment.createdAt } : {}),
41
+ body: comment.body,
42
+ ...(comment.inlineContext ? { inlineContext: comment.inlineContext } : {}),
43
+ ...(comment.status ? { status: comment.status } : {}),
44
+ attachments: extractAttachmentReferences(comment.body, format),
45
+ links: extractPageReferences(comment.body, format),
46
+ replies: [],
47
+ };
48
+ }
49
+ function orderedParticipants(root) {
50
+ const result = [];
51
+ const seen = new Set();
52
+ const visit = (entry) => {
53
+ const key = authorKey(entry.author);
54
+ if (!seen.has(key)) {
55
+ seen.add(key);
56
+ result.push(entry.author);
57
+ }
58
+ for (const reply of entry.replies)
59
+ visit(reply);
60
+ };
61
+ visit(root);
62
+ return result;
63
+ }
64
+ function canonicalEntry(entry) {
65
+ return {
66
+ id: entry.id,
67
+ parentId: entry.parentId,
68
+ threadId: entry.threadId,
69
+ author: entry.author,
70
+ createdAt: entry.createdAt,
71
+ body: entry.body,
72
+ inlineContext: entry.inlineContext,
73
+ status: entry.status,
74
+ attachments: entry.attachments.map((item) => ({ href: item.href, resourceId: item.resourceId })),
75
+ replies: entry.replies.map(canonicalEntry),
76
+ };
77
+ }
78
+ function inventoryFingerprint(threads) {
79
+ return hash(JSON.stringify(threads.map((thread) => canonicalEntry(thread.root))));
80
+ }
81
+ export function normalizeCommentForest(comments, format, warnings = []) {
82
+ const unique = new Map();
83
+ for (const raw of comments) {
84
+ if (unique.has(raw.id)) {
85
+ warnings.push(`Duplicate comment ${raw.id} was returned and ignored`);
86
+ continue;
87
+ }
88
+ unique.set(raw.id, entryFromFlat(raw, format));
89
+ }
90
+ const roots = [];
91
+ const createsCycle = (entry, parent) => {
92
+ const seen = new Set([entry.id]);
93
+ let cursor = parent;
94
+ while (cursor) {
95
+ if (seen.has(cursor.id))
96
+ return true;
97
+ seen.add(cursor.id);
98
+ cursor = cursor.parentId ? unique.get(cursor.parentId) : undefined;
99
+ }
100
+ return false;
101
+ };
102
+ for (const entry of unique.values()) {
103
+ if (!entry.parentId) {
104
+ roots.push(entry);
105
+ continue;
106
+ }
107
+ const parent = unique.get(entry.parentId);
108
+ if (!parent) {
109
+ warnings.push(`Comment ${entry.id} references missing parent ${entry.parentId}; kept as a top-level orphan`);
110
+ roots.push(entry);
111
+ continue;
112
+ }
113
+ if (createsCycle(entry, parent)) {
114
+ warnings.push(`Comment reply cycle at ${entry.id} → ${parent.id}; edge was broken`);
115
+ roots.push(entry);
116
+ continue;
117
+ }
118
+ parent.replies.push(entry);
119
+ }
120
+ const sortEntries = (entries) => {
121
+ entries.sort((left, right) => (left.createdAt ?? '').localeCompare(right.createdAt ?? '') || left.id.localeCompare(right.id));
122
+ for (const entry of entries)
123
+ sortEntries(entry.replies);
124
+ };
125
+ sortEntries(roots);
126
+ const threads = roots.map((root) => ({ id: root.threadId || root.id, root, participants: orderedParticipants(root) }));
127
+ const attachments = [...unique.values()].reduce((total, entry) => total + entry.attachments.length, 0);
128
+ const participants = new Set([...unique.values()].map((entry) => authorKey(entry.author))).size;
129
+ return {
130
+ status: threads.length === 0 ? 'empty' : 'complete',
131
+ threads,
132
+ ...(threads.length > 0 ? { fingerprint: inventoryFingerprint(threads) } : {}),
133
+ comments: unique.size,
134
+ participants,
135
+ attachments,
136
+ knownBytes: 0,
137
+ unknownSizes: attachments,
138
+ warnings,
139
+ };
140
+ }
141
+ function aliasValues(resource) {
142
+ return [resource.name, resource.preferredName, resource.downloadUrl, ...(resource.referenceAliases ?? [])]
143
+ .filter((value) => Boolean(value))
144
+ .flatMap((value) => {
145
+ const aliases = [value];
146
+ try {
147
+ const url = new URL(value);
148
+ aliases.push(decodeURIComponent(url.pathname), decodeURIComponent(url.pathname.split('/').at(-1) ?? ''));
149
+ }
150
+ catch {
151
+ aliases.push(decodeURIComponent(value.split(/[?#]/, 1)[0]?.split('/').at(-1) ?? value));
152
+ }
153
+ return aliases;
154
+ });
155
+ }
156
+ export function resolveCommentAttachmentReferences(inventory, resources) {
157
+ const exact = new Map();
158
+ const byId = new Map(resources.map((resource) => [resource.id, resource]));
159
+ for (const resource of resources.filter((item) => item.kind !== 'grid')) {
160
+ for (const alias of aliasValues(resource)) {
161
+ const key = alias.trim();
162
+ if (!key)
163
+ continue;
164
+ const ids = exact.get(key) ?? new Set();
165
+ ids.add(resource.id);
166
+ exact.set(key, ids);
167
+ }
168
+ }
169
+ let knownBytes = 0;
170
+ let unknownSizes = 0;
171
+ const counted = new Set();
172
+ const visit = (entry) => {
173
+ for (const reference of entry.attachments) {
174
+ const candidates = new Set();
175
+ for (const alias of [reference.href, reference.raw, reference.label].filter((value) => Boolean(value))) {
176
+ for (const id of exact.get(alias) ?? [])
177
+ candidates.add(id);
178
+ try {
179
+ const url = new URL(alias);
180
+ for (const id of exact.get(decodeURIComponent(url.pathname)) ?? [])
181
+ candidates.add(id);
182
+ for (const id of exact.get(decodeURIComponent(url.pathname.split('/').at(-1) ?? '')) ?? [])
183
+ candidates.add(id);
184
+ }
185
+ catch {
186
+ for (const id of exact.get(decodeURIComponent(alias.split(/[?#]/, 1)[0]?.split('/').at(-1) ?? alias)) ?? [])
187
+ candidates.add(id);
188
+ }
189
+ }
190
+ if (candidates.size === 1) {
191
+ const resourceId = [...candidates][0];
192
+ reference.resourceId = resourceId;
193
+ if (!counted.has(resourceId)) {
194
+ counted.add(resourceId);
195
+ const resource = byId.get(resourceId);
196
+ if (resource?.size !== undefined)
197
+ knownBytes += resource.size;
198
+ else
199
+ unknownSizes += 1;
200
+ }
201
+ }
202
+ else {
203
+ inventory.warnings.push(candidates.size === 0
204
+ ? `Comment attachment reference could not be resolved: ${reference.href}`
205
+ : `Comment attachment reference is ambiguous: ${reference.href}`);
206
+ }
207
+ }
208
+ for (const reply of entry.replies)
209
+ visit(reply);
210
+ };
211
+ for (const thread of inventory.threads)
212
+ visit(thread.root);
213
+ inventory.knownBytes = knownBytes;
214
+ inventory.unknownSizes = unknownSizes;
215
+ inventory.attachments = counted.size;
216
+ if (inventory.threads.length > 0)
217
+ inventory.fingerprint = inventoryFingerprint(inventory.threads);
218
+ }
219
+ function decodeEntities(value) {
220
+ return value.replace(/&nbsp;/gi, ' ').replace(/&lt;/gi, '<').replace(/&gt;/gi, '>').replace(/&quot;/gi, '"').replace(/&#39;|&apos;/gi, "'").replace(/&amp;/gi, '&');
221
+ }
222
+ function readableBody(value) {
223
+ const links = value.replace(/<a\b[^>]*href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi, (_all, href, label) => `[${decodeEntities(label.replace(/<[^>]*>/g, ''))}](${href})`);
224
+ return decodeEntities(links.replace(/<br\s*\/?\s*>/gi, '\n').replace(/<\/p>/gi, '\n\n').replace(/<[^>]*>/g, '')).trim();
225
+ }
226
+ function replaceAttachmentTokens(entry, replacements) {
227
+ let body = readableBody(entry.body);
228
+ const tokens = new Map();
229
+ for (const [index, reference] of entry.attachments.entries()) {
230
+ if (!reference.resourceId)
231
+ continue;
232
+ const name = replacements.get(reference.resourceId);
233
+ if (!name)
234
+ continue;
235
+ const token = `\u0000YWTC_COMMENT_ATTACHMENT_${index}\u0000`;
236
+ body = body.replace(/\[([^\]]*)\]\(([^)]+)\)/g, (whole, _label, href) => href === reference.href ? token : whole);
237
+ body = body.replaceAll(reference.raw, token).replaceAll(reference.href, token);
238
+ tokens.set(token, `{${name}}`);
239
+ }
240
+ for (const [token, replacement] of tokens)
241
+ body = body.replaceAll(token, replacement);
242
+ return body;
243
+ }
244
+ function rewriteInternalUrls(value, pages, sourcePages) {
245
+ if (!pages || !sourcePages)
246
+ return value;
247
+ let result = value;
248
+ for (const [canonicalId, source] of sourcePages) {
249
+ const destination = pages.get(canonicalId);
250
+ if (destination)
251
+ result = result.replaceAll(source.url, destination.url);
252
+ }
253
+ return result;
254
+ }
255
+ function entryLines(entry, depth, replacements, context) {
256
+ const indent = ' '.repeat(depth);
257
+ const status = entry.status && entry.status !== 'open' ? ` · ${entry.status}` : '';
258
+ const when = entry.createdAt ? ` · ${entry.createdAt}` : '';
259
+ const header = `${indent}${commentAuthorLabel(entry.author)}${when}${status}:`;
260
+ const contextLines = entry.inlineContext ? [`${indent}> ${readableBody(entry.inlineContext).replaceAll('\n', `\n${indent}> `)}`] : [];
261
+ const body = rewriteInternalUrls(replaceAttachmentTokens(entry, replacements), context.pages, context.sourcePages);
262
+ const lines = body.split('\n').map((line) => `${indent}${line}`);
263
+ return [header, ...contextLines, ...lines, ...entry.replies.flatMap((reply) => ['', ...entryLines(reply, depth + 1, replacements, context)])];
264
+ }
265
+ function participantsText(thread) {
266
+ return thread.participants.map((author, index) => {
267
+ const label = commentAuthorLabel(author);
268
+ const detail = commentAuthorDetail(author);
269
+ return `${index + 1}. ${label}${detail && detail !== label ? ` — ${detail}` : ''}`;
270
+ }).join('\n');
271
+ }
272
+ function escapeHtml(value) {
273
+ return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&#39;');
274
+ }
275
+ function markdownLinksToHtml(value) {
276
+ const escaped = escapeHtml(value);
277
+ return escaped.replace(/\[([^\]]+)\]\((https?:\/\/[^)]+)\)/g, '<a href="$2">$1</a>').replace(/\n/g, '<br/>');
278
+ }
279
+ function threadText(thread, replacements, context) {
280
+ return `Участники:\n${participantsText(thread)}\n\n${entryLines(thread.root, 0, replacements, context).join('\n')}`;
281
+ }
282
+ function quoteLines(value) {
283
+ return value.split('\n').map((line) => `> ${line}`).join('\n');
284
+ }
285
+ function cdata(value) {
286
+ return value.replaceAll(']]>', ']]]]><![CDATA[>');
287
+ }
288
+ export function renderCommentArchive(inventory, target, context) {
289
+ const replacements = context.attachmentNames ?? new Map();
290
+ const fingerprint = inventory.fingerprint ?? hash('empty');
291
+ const header = `Архив комментариев из [оригинала](${context.sourceUrl}).`;
292
+ const archive = context.archiveName
293
+ ? `\n\nВложения комментариев: [${context.archiveName}](${context.archiveHref ?? context.archiveName})`
294
+ : '';
295
+ const revision = context.archiveReplaces ? `\n\nЭта ревизия заменяет архив ${context.archiveReplaces}.` : '';
296
+ const preamble = `${header}${archive}\n\nВерсия архива: ${fingerprint}${revision}`;
297
+ const threadMarkdown = inventory.threads.map((thread, index) => {
298
+ const content = threadText(thread, replacements, context);
299
+ return `<details>\n<summary>Ветка ${index + 1}</summary>\n\n${content}\n\n</details>`;
300
+ }).join('\n\n');
301
+ if (target === 'markdown')
302
+ return `${preamble}\n\n${threadMarkdown}`;
303
+ if (target === 'html') {
304
+ const threads = inventory.threads.map((thread, index) => {
305
+ const content = threadText(thread, replacements, context);
306
+ return `<details><summary>Ветка ${index + 1}</summary><div class="ywtc-comment-thread">${markdownLinksToHtml(content)}</div></details>`;
307
+ }).join('');
308
+ return `<section class="ywtc-comments"><h2>Комментарии</h2><p>${markdownLinksToHtml(preamble)}</p>${threads}</section>`;
309
+ }
310
+ if (target === 'yandex-wiki') {
311
+ if (context.presentation === 'code') {
312
+ const threads = inventory.threads.map((thread, index) => `Ветка ${index + 1}\n${threadText(thread, replacements, context)}`).join('\n\n');
313
+ return `${preamble}\n\n\`\`\`text\n${threads}\n\`\`\``;
314
+ }
315
+ if (context.presentation === 'quote') {
316
+ const threads = inventory.threads.map((thread, index) => `Ветка ${index + 1}\n${quoteLines(threadText(thread, replacements, context))}`).join('\n\n');
317
+ return `${preamble}\n\n${threads}`;
318
+ }
319
+ const threads = inventory.threads.map((thread, index) => {
320
+ const content = threadText(thread, replacements, context);
321
+ return `{% cut "Ветка ${index + 1}" %}\n${content}\n{% endcut %}`;
322
+ }).join('\n\n');
323
+ return `${preamble}\n\n${threads}`;
324
+ }
325
+ const confluenceHeader = `<p>Архив комментариев из <a href="${escapeHtml(context.sourceUrl)}">оригинала</a>.</p>`;
326
+ const confluenceArchive = context.archiveName
327
+ ? `<p>Вложения комментариев: <ac:link><ri:attachment ri:filename="${escapeHtml(context.archiveName)}"/><ac:plain-text-link-body><![CDATA[${context.archiveName}]]></ac:plain-text-link-body></ac:link></p>`
328
+ : '';
329
+ const confluenceRevision = context.archiveReplaces ? `<p>Эта ревизия заменяет архив ${escapeHtml(context.archiveReplaces)}.</p>` : '';
330
+ const preambleHtml = `${confluenceHeader}${confluenceArchive}<p>Версия архива: ${escapeHtml(fingerprint)}</p>${confluenceRevision}`;
331
+ if (context.presentation === 'code') {
332
+ const content = inventory.threads.map((thread, index) => `Ветка ${index + 1}\n${threadText(thread, replacements, context)}`).join('\n\n');
333
+ return `${preambleHtml}<ac:structured-macro ac:name="code"><ac:plain-text-body><![CDATA[${cdata(content)}]]></ac:plain-text-body></ac:structured-macro>`;
334
+ }
335
+ if (context.presentation === 'quote') {
336
+ const threads = inventory.threads.map((thread, index) => `<h4>Ветка ${index + 1}</h4><blockquote><p>${markdownLinksToHtml(threadText(thread, replacements, context))}</p></blockquote>`).join('');
337
+ return `${preambleHtml}${threads}`;
338
+ }
339
+ const threads = inventory.threads.map((thread, index) => {
340
+ const content = threadText(thread, replacements, context);
341
+ return `<ac:structured-macro ac:name="expand"><ac:parameter ac:name="title">Ветка ${index + 1}</ac:parameter><ac:rich-text-body><p>${markdownLinksToHtml(content)}</p></ac:rich-text-body></ac:structured-macro>`;
342
+ }).join('');
343
+ return `${preambleHtml}${threads}`;
344
+ }
345
+ export function renderCommentArchiveIndex(inventory, target, context) {
346
+ const fingerprint = inventory.fingerprint ?? hash('empty');
347
+ const participants = inventory.threads.flatMap((thread) => thread.participants);
348
+ const uniqueParticipants = [...new Map(participants.map((author) => [authorKey(author), author])).values()];
349
+ const lines = [
350
+ `Архив комментариев из [оригинала](${context.sourceUrl}).`,
351
+ '',
352
+ `Полный архив: [${context.fullArchiveName}](${context.fullArchiveHref ?? context.fullArchiveName})`,
353
+ ...(context.archiveName ? ['', `Вложения комментариев: [${context.archiveName}](${context.archiveHref ?? context.archiveName})`] : []),
354
+ '',
355
+ `Версия архива: ${fingerprint}`,
356
+ '',
357
+ 'Участники:',
358
+ ...uniqueParticipants.map((author, index) => `${index + 1}. ${commentAuthorLabel(author)}${commentAuthorDetail(author) && commentAuthorDetail(author) !== commentAuthorLabel(author) ? ` — ${commentAuthorDetail(author)}` : ''}`),
359
+ '',
360
+ 'Ветки:',
361
+ ...inventory.threads.map((thread, index) => `${index + 1}. ${commentAuthorLabel(thread.root.author)} · ${thread.root.createdAt ?? 'дата неизвестна'} · ${1 + countReplies(thread.root)} сообщений`),
362
+ ];
363
+ if (target === 'yandex-wiki')
364
+ return lines.join('\n');
365
+ return markdownLinksToHtml(lines.join('\n'));
366
+ }
367
+ function countReplies(entry) {
368
+ return entry.replies.reduce((total, reply) => total + 1 + countReplies(reply), 0);
369
+ }
370
+ export function verifyCommentArchive(expected, body, archiveName) {
371
+ const differences = [];
372
+ const expectedFingerprint = typeof expected === 'string' ? expected : expected.fingerprint;
373
+ const readable = readableBody(body);
374
+ if (!expectedFingerprint || !readable.includes(expectedFingerprint))
375
+ differences.push('archive fingerprint is missing');
376
+ if (archiveName && !body.includes(archiveName))
377
+ differences.push('comment attachment archive reference is missing');
378
+ if (!readable.includes('Архив комментариев из'))
379
+ differences.push('archive source header is missing');
380
+ if (typeof expected !== 'string') {
381
+ const visit = (entry) => {
382
+ const author = commentAuthorLabel(entry.author);
383
+ if (!readable.includes(author))
384
+ differences.push(`comment author is missing: ${author}`);
385
+ if (entry.createdAt && !readable.includes(entry.createdAt))
386
+ differences.push(`comment date is missing: ${entry.id}`);
387
+ if (entry.status && entry.status !== 'open' && !readable.includes(entry.status))
388
+ differences.push(`comment status is missing: ${entry.id}`);
389
+ const text = readableBody(entry.body).replace(/\[[^\]]*\]\([^)]*\)/g, ' ');
390
+ const tokens = text.toLocaleLowerCase().match(/[\p{L}\p{N}]{2,}/gu) ?? [];
391
+ const actual = readable.toLocaleLowerCase();
392
+ if (tokens.some((token) => !actual.includes(token)))
393
+ differences.push(`comment text is missing: ${entry.id}`);
394
+ for (const reply of entry.replies)
395
+ visit(reply);
396
+ };
397
+ for (const thread of expected.threads)
398
+ visit(thread.root);
399
+ }
400
+ return { ok: differences.length === 0, differences };
401
+ }
402
+ function uniqueArchiveNames(files) {
403
+ const result = new Map();
404
+ const hashes = [...new Set(files.map((file) => file.sha256))].sort();
405
+ for (const digest of hashes) {
406
+ const matching = files.find((file) => file.sha256 === digest);
407
+ let length = 12;
408
+ while (hashes.some((other) => other !== digest && other.slice(0, length) === digest.slice(0, length)))
409
+ length += 1;
410
+ result.set(digest, `${digest.slice(0, length)}-${safeFilename(matching.originalName)}`);
411
+ }
412
+ return result;
413
+ }
414
+ async function fileHash(filename) {
415
+ const digest = createHash('sha256');
416
+ let size = 0;
417
+ const meter = new Transform({ transform(chunk, _encoding, callback) {
418
+ digest.update(chunk);
419
+ size += chunk.length;
420
+ callback(null, chunk);
421
+ } });
422
+ await pipeline(createReadStream(filename), meter, new Transform({ transform(_chunk, _encoding, callback) { callback(); } }));
423
+ return { size, sha256: digest.digest('hex') };
424
+ }
425
+ export async function createCommentArchiveZip(input) {
426
+ if (input.files.length === 0)
427
+ return undefined;
428
+ for (const file of input.files) {
429
+ const actual = await fileHash(file.path);
430
+ if (actual.size !== file.size || actual.sha256 !== file.sha256) {
431
+ throw new Error(`Comment attachment integrity check failed for ${file.originalName}`);
432
+ }
433
+ }
434
+ const names = uniqueArchiveNames(input.files);
435
+ const unique = new Map();
436
+ for (const file of input.files)
437
+ if (!unique.has(file.sha256))
438
+ unique.set(file.sha256, file);
439
+ const entries = input.files.map((file) => ({
440
+ sourceCommentId: file.commentId,
441
+ sourceReference: file.reference,
442
+ originalName: file.originalName,
443
+ archiveName: names.get(file.sha256),
444
+ size: file.size,
445
+ sha256: file.sha256,
446
+ })).sort((left, right) => left.sourceCommentId.localeCompare(right.sourceCommentId) || left.sourceReference.localeCompare(right.sourceReference));
447
+ const pageKey = safeFilename(input.pageKey).slice(0, 80) || 'page';
448
+ const name = `ywtc-comments-${pageKey}-${input.fingerprint.slice(0, 12)}.zip`;
449
+ const destination = path.join(input.destinationDirectory, name);
450
+ await mkdir(input.destinationDirectory, { recursive: true, mode: 0o700 });
451
+ const archive = new ZipArchive({ zlib: { level: 9 }, forceUTC: true });
452
+ const fixedDate = new Date('1980-01-01T00:00:00.000Z');
453
+ const output = createWriteStream(destination, { mode: 0o600 });
454
+ const writing = pipeline(archive, output);
455
+ for (const [digest, file] of [...unique].sort(([left], [right]) => left.localeCompare(right))) {
456
+ archive.file(file.path, { name: names.get(digest), date: fixedDate, mode: 0o600 });
457
+ }
458
+ archive.append(`${JSON.stringify({ files: entries }, null, 2)}\n`, { name: 'manifest.json', date: fixedDate, mode: 0o600 });
459
+ await archive.finalize();
460
+ await writing;
461
+ const verified = await fileHash(destination);
462
+ const filesystemSize = (await stat(destination)).size;
463
+ if (filesystemSize !== verified.size)
464
+ throw new Error(`Comment archive size verification failed for ${name}`);
465
+ return { path: destination, name, size: verified.size, sha256: verified.sha256, files: entries };
466
+ }
467
+ export function commentAttachmentUses(inventory) {
468
+ const result = [];
469
+ const visit = (entry) => {
470
+ result.push(...entry.attachments.map((reference) => ({ commentId: entry.id, reference })));
471
+ for (const reply of entry.replies)
472
+ visit(reply);
473
+ };
474
+ for (const thread of inventory.threads)
475
+ visit(thread.root);
476
+ return result;
477
+ }
478
+ //# sourceMappingURL=comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../src/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AACvC,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAazD,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAC;AAuCxC,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,MAAqB;IACtC,OAAO,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,IAAI,SAAS,CAAC;AACtH,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAqB;IAC/C,OAAO,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,IAAI,mBAAmB,CAAC;AAChI,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAqB;IAChD,OAAO,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC;AAC9D,CAAC;AAED,SAAS,2BAA2B,CAAC,IAAY,EAAE,MAAwB;IACzE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC/D,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,EAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC;IACpH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,OAAoB,EAAE,MAAwB;IACnE,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE;QAC5D,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAC,aAAa,EAAE,OAAO,CAAC,aAAa,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,WAAW,EAAE,2BAA2B,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;QAC9D,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;QAClD,OAAO,EAAE,EAAE;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAkB;IAC7C,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,KAAmB,EAAQ,EAAE;QAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,KAAmB;IACzC,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAC,CAAC,CAAC;QAC9F,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAwB;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAAuB,EACvB,MAAwB,EACxB,WAAqB,EAAE;IAEvB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,EAAE,2BAA2B,CAAC,CAAC;YACtE,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,YAAY,GAAG,CAAC,KAAmB,EAAE,MAAoB,EAAW,EAAE;QAC1E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,MAAM,GAA6B,MAAM,CAAC;QAC9C,OAAO,MAAM,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,8BAA8B,KAAK,CAAC,QAAQ,8BAA8B,CAAC,CAAC;YAC7G,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC,EAAE,mBAAmB,CAAC,CAAC;YACpF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,OAAuB,EAAQ,EAAE;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9H,KAAK,MAAM,KAAK,IAAI,OAAO;YAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC,CAAC;IACF,WAAW,CAAC,KAAK,CAAC,CAAC;IACnB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,mBAAmB,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC,CAAC;IACrH,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvG,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChG,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;QACnD,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAC,WAAW,EAAE,oBAAoB,CAAC,OAAO,CAAC,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,QAAQ,EAAE,MAAM,CAAC,IAAI;QACrB,YAAY;QACZ,WAAW;QACX,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,WAAW;QACzB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,QAAwB;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;SACvG,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAClD,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3G,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,SAA2B,EAAE,SAA2B;IACzG,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3E,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QACxE,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;YAChD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACrB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,KAAmB,EAAQ,EAAE;QAC1C,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxH,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;oBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC5D,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC3B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;wBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACvF,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;wBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACjH,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE;wBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClI,CAAC;YACH,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAE,CAAC;gBACvC,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBACtC,IAAI,QAAQ,EAAE,IAAI,KAAK,SAAS;wBAAE,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC;;wBACzD,YAAY,IAAI,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;oBAC3C,CAAC,CAAC,uDAAuD,SAAS,CAAC,IAAI,EAAE;oBACzE,CAAC,CAAC,8CAA8C,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO;QAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3D,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;IAClC,SAAS,CAAC,YAAY,GAAG,YAAY,CAAC;IACtC,SAAS,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IACrC,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,SAAS,CAAC,WAAW,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACtK,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,uDAAuD,EAAE,CAAC,IAAI,EAAE,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAC3L,OAAO,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1H,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAmB,EAAE,YAAiC;IACrF,IAAI,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,SAAS;QACpC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,KAAK,GAAG,iCAAiC,KAAK,QAAQ,CAAC;QAC7D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,MAAM;QAAE,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACtF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,KAAoC,EAAE,WAAqC;IACrH,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,WAAW;YAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,KAAmB,EAAE,KAAa,EAAE,YAAiC,EAAE,OAA6B;IACtH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,CAAC;IAC/E,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtI,MAAM,IAAI,GAAG,mBAAmB,CAAC,uBAAuB,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACnH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAChJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAqB;IAC7C,OAAO,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC/C,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,MAAM,IAAI,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACrF,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC3I,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC,OAAO,CAAC,qCAAqC,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC/G,CAAC;AAaD,SAAS,UAAU,CAAC,MAAqB,EAAE,YAAiC,EAAE,OAA6B;IACzG,OAAO,eAAe,gBAAgB,CAAC,MAAM,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACtH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAA2B,EAC3B,MAA0C,EAC1C,OAA6B;IAE7B,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,GAAG,EAAkB,CAAC;IAC1E,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,qCAAqC,OAAO,CAAC,SAAS,IAAI,CAAC;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW;QACjC,CAAC,CAAC,+BAA+B,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG;QACtG,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,kCAAkC,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7G,MAAM,QAAQ,GAAG,GAAG,MAAM,GAAG,OAAO,sBAAsB,WAAW,GAAG,QAAQ,EAAE,CAAC;IACnF,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,6BAA6B,KAAK,GAAG,CAAC,iBAAiB,OAAO,gBAAgB,CAAC;IACxF,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,GAAG,QAAQ,OAAO,cAAc,EAAE,CAAC;IACrE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACtD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1D,OAAO,2BAA2B,KAAK,GAAG,CAAC,8CAA8C,mBAAmB,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC1I,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,yDAAyD,mBAAmB,CAAC,QAAQ,CAAC,OAAO,OAAO,YAAY,CAAC;IAC1H,CAAC;IACD,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1I,OAAO,GAAG,QAAQ,mBAAmB,OAAO,UAAU,CAAC;QACzD,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtJ,OAAO,GAAG,QAAQ,OAAO,OAAO,EAAE,CAAC;QACrC,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACtD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1D,OAAO,iBAAiB,KAAK,GAAG,CAAC,SAAS,OAAO,gBAAgB,CAAC;QACpE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChB,OAAO,GAAG,QAAQ,OAAO,OAAO,EAAE,CAAC;IACrC,CAAC;IACD,MAAM,gBAAgB,GAAG,qCAAqC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,sBAAsB,CAAC;IAClH,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW;QAC3C,CAAC,CAAC,kEAAkE,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,wCAAwC,OAAO,CAAC,WAAW,6CAA6C;QAC3M,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,iCAAiC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACtI,MAAM,YAAY,GAAG,GAAG,gBAAgB,GAAG,iBAAiB,qBAAqB,UAAU,CAAC,WAAW,CAAC,OAAO,kBAAkB,EAAE,CAAC;IACpI,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1I,OAAO,GAAG,YAAY,oEAAoE,KAAK,CAAC,OAAO,CAAC,gDAAgD,CAAC;IAC3J,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,KAAK,GAAG,CAAC,uBAAuB,mBAAmB,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClM,OAAO,GAAG,YAAY,GAAG,OAAO,EAAE,CAAC;IACrC,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACtD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,6EAA6E,KAAK,GAAG,CAAC,wCAAwC,mBAAmB,CAAC,OAAO,CAAC,gDAAgD,CAAC;IACpN,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,GAAG,YAAY,GAAG,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,SAA2B,EAC3B,MAAoB,EACpB,OAAmF;IAEnF,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChF,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG;QACZ,qCAAqC,OAAO,CAAC,SAAS,IAAI;QAC1D,EAAE;QACF,kBAAkB,OAAO,CAAC,eAAe,KAAK,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,GAAG;QACnG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,2BAA2B,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtI,EAAE;QACF,kBAAkB,WAAW,EAAE;QAC/B,EAAE;QACF,YAAY;QACZ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,kBAAkB,CAAC,MAAM,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClO,EAAE;QACF,QAAQ;QACR,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,iBAAiB,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;KACpM,CAAC;IACF,IAAI,MAAM,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,YAAY,CAAC,KAAmB;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAmC,EAAE,IAAY,EAAE,WAAoB;IAC1G,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,mBAAmB,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC3F,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,mBAAmB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACxH,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACpH,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACtG,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC1C,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;YACzF,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,4BAA4B,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACrH,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,8BAA8B,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5I,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,4BAA4B,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9G,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO;gBAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO;YAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,EAAC,EAAE,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,WAAW,EAAC,CAAC;AACrD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA2B;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAE,CAAC;QAC/D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAAE,MAAM,IAAI,CAAC,CAAC;QACnH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAgB;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAC,SAAS,CAAC,KAAa,EAAE,SAAS,EAAE,QAAQ;YACvE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrB,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;YACrB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC,EAAC,CAAC,CAAC;IACJ,MAAM,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,EAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IAC3H,OAAO,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAK7C;IACC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAkC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxE,eAAe,EAAE,IAAI,CAAC,SAAS;QAC/B,eAAe,EAAE,IAAI,CAAC,SAAS;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE;QACpC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAClJ,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;IACnE,MAAM,IAAI,GAAG,iBAAiB,OAAO,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;IAC9E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAC,IAAI,EAAE,EAAC,KAAK,EAAE,CAAC,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAC,KAAK,EAAE,OAAO,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;IACxH,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;IACzB,MAAM,OAAO,CAAC;IACd,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,IAAI,cAAc,KAAK,QAAQ,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;IAC9G,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAA2B;IAC/D,MAAM,MAAM,GAAsE,EAAE,CAAC;IACrF,MAAM,KAAK,GAAG,CAAC,KAAmB,EAAQ,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAC,CAAC,CAAC,CAAC,CAAC;QACzF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO;QAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/doctor.d.ts CHANGED
@@ -25,5 +25,12 @@ export interface DoctorResult {
25
25
  sourceStatus: SourceStatus;
26
26
  links: number;
27
27
  warnings: string[];
28
+ comments: {
29
+ enabled: boolean;
30
+ readable: boolean;
31
+ threads: number;
32
+ entries: number;
33
+ destinationWrite: 'supported' | 'unproven' | 'skipped';
34
+ };
28
35
  }
29
- export declare function runCapabilityDoctor(config: AppConfig, sourceLocator: RemoteLocator, destinationLocator: ResolvedLocator, scope: TransferScope, sourceStatus?: SourceStatus): Promise<DoctorResult>;
36
+ export declare function runCapabilityDoctor(config: AppConfig, sourceLocator: RemoteLocator, destinationLocator: ResolvedLocator, scope: TransferScope, sourceStatus?: SourceStatus, comments?: boolean): Promise<DoctorResult>;
package/dist/doctor.js CHANGED
@@ -2,10 +2,10 @@ import { createProviderAdapter } from './adapters/factory.js';
2
2
  import { assertTransferCapabilities } from './domain.js';
3
3
  import { discoverPageGraph } from './graph.js';
4
4
  import { sameRemoteInstance } from './locators.js';
5
- export async function runCapabilityDoctor(config, sourceLocator, destinationLocator, scope, sourceStatus = 'all') {
5
+ export async function runCapabilityDoctor(config, sourceLocator, destinationLocator, scope, sourceStatus = 'all', comments = true) {
6
6
  const source = createProviderAdapter(sourceLocator.profile, config);
7
7
  const destination = destinationLocator.type === 'remote' ? createProviderAdapter(destinationLocator.profile, config) : undefined;
8
- assertTransferCapabilities(source, destination, scope, sourceStatus);
8
+ assertTransferCapabilities(source, destination, scope, sourceStatus, comments);
9
9
  const [sourcePlatform, destinationPlatform, root, container] = await Promise.all([
10
10
  source.preflight(),
11
11
  destination?.preflight(),
@@ -13,6 +13,16 @@ export async function runCapabilityDoctor(config, sourceLocator, destinationLoca
13
13
  destinationLocator.type === 'remote' && destination ? destination.resolveContainer(destinationLocator.value) : undefined,
14
14
  ]);
15
15
  const graph = await discoverPageGraph({ adapter: source, root, scope, sourceStatus });
16
+ const commentInventory = comments && source.readComments ? await source.readComments(root) : undefined;
17
+ const commentWarnings = [...(commentInventory?.warnings ?? [])];
18
+ const destinationCommentWrite = !comments || destinationLocator.type === 'directory'
19
+ ? 'skipped'
20
+ : destination?.capabilities.writeComments
21
+ ? 'supported'
22
+ : 'unproven';
23
+ if (destinationCommentWrite === 'unproven') {
24
+ commentWarnings.push(`${destination?.profile.name ?? 'Destination'} comment write access cannot be proven read-only; migrate will preserve the page and report a partial result if writing is denied.`);
25
+ }
16
26
  if (container
17
27
  && destinationLocator.type === 'remote'
18
28
  && sameRemoteInstance(sourceLocator.profile, destinationLocator.profile)
@@ -44,7 +54,14 @@ export async function runCapabilityDoctor(config, sourceLocator, destinationLoca
44
54
  maximumDepth: graph.selection.maximumDepth,
45
55
  sourceStatus: graph.selection.effectiveStatus,
46
56
  links: graph.edges.length,
47
- warnings: [...sourcePlatform.warnings, ...(destinationPlatform?.warnings ?? []), ...graph.warnings],
57
+ warnings: [...sourcePlatform.warnings, ...(destinationPlatform?.warnings ?? []), ...graph.warnings, ...commentWarnings],
58
+ comments: {
59
+ enabled: comments,
60
+ readable: !comments || Boolean(commentInventory),
61
+ threads: commentInventory?.threads.length ?? 0,
62
+ entries: commentInventory?.comments ?? 0,
63
+ destinationWrite: destinationCommentWrite,
64
+ },
48
65
  };
49
66
  }
50
67
  //# sourceMappingURL=doctor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}