@iwonz/ywtc 3.3.0 → 3.4.1

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 (56) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +67 -43
  3. package/dist/adapters/confluence.d.ts +15 -1
  4. package/dist/adapters/confluence.js +87 -3
  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 +12 -5
  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/content-model.d.ts +1 -0
  27. package/dist/content-model.js +13 -0
  28. package/dist/content-model.js.map +1 -1
  29. package/dist/doctor.d.ts +8 -1
  30. package/dist/doctor.js +20 -3
  31. package/dist/doctor.js.map +1 -1
  32. package/dist/domain.d.ts +74 -1
  33. package/dist/domain.js +13 -1
  34. package/dist/domain.js.map +1 -1
  35. package/dist/filesystem-export.d.ts +16 -1
  36. package/dist/filesystem-export.js +88 -2
  37. package/dist/filesystem-export.js.map +1 -1
  38. package/dist/issues.d.ts +4 -2
  39. package/dist/issues.js.map +1 -1
  40. package/dist/migrator.d.ts +2 -0
  41. package/dist/migrator.js +756 -164
  42. package/dist/migrator.js.map +1 -1
  43. package/dist/report-catalog.d.ts +27 -1
  44. package/dist/report-catalog.js +26 -0
  45. package/dist/report-catalog.js.map +1 -1
  46. package/dist/report.d.ts +42 -2
  47. package/dist/report.js +109 -7
  48. package/dist/report.js.map +1 -1
  49. package/dist/state.d.ts +54 -5
  50. package/dist/state.js +93 -3
  51. package/dist/state.js.map +1 -1
  52. package/dist/title-allocation.d.ts +2 -0
  53. package/dist/title-allocation.js +43 -0
  54. package/dist/title-allocation.js.map +1 -0
  55. package/dist/types.d.ts +75 -0
  56. 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":"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"}
@@ -12,6 +12,7 @@ export declare function renderedPreviewHtml(body: string, provider: SourcePage['
12
12
  export declare function legacyTransferPlaceholder(provider: SourcePage['provider'], page: SourcePage): string;
13
13
  export declare function isLegacyTransferPlaceholder(body: string | undefined, provider: SourcePage['provider'], page: SourcePage): boolean;
14
14
  export declare function rawContentFallback(page: SourcePage, provider: SourcePage['provider'], reason: string): RenderedDocument;
15
+ export declare function emptyRendererFallbackReason(document: NormalizedDocument): string;
15
16
  export declare function semanticContentFingerprint(body: string, provider: SourcePage['provider']): string;
16
17
  export interface ContentVerificationResult {
17
18
  status: 'complete' | 'partial' | 'failed';
@@ -504,6 +504,19 @@ export function rawContentFallback(page, provider, reason) {
504
504
  representedReferences: page.references.length,
505
505
  };
506
506
  }
507
+ export function emptyRendererFallbackReason(document) {
508
+ const types = new Set();
509
+ const visit = (node) => {
510
+ if (!['document', 'html'].includes(node.type))
511
+ types.add(node.type);
512
+ for (const child of node.children ?? [])
513
+ visit(child);
514
+ };
515
+ visit(document.root);
516
+ return types.size > 0
517
+ ? `renderer returned an empty body for normalized ${[...types].sort().join(', ')} content`
518
+ : `renderer returned an empty body for non-empty ${document.rawFormat} content`;
519
+ }
507
520
  function semanticText(value) {
508
521
  return value.replace(/\u00a0/g, ' ').replace(/\s+/g, ' ').trim();
509
522
  }