@iwonz/ywtc 0.0.0 → 2.0.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 (94) hide show
  1. package/.env.example +4 -0
  2. package/CHANGELOG.md +56 -0
  3. package/LICENSE +21 -0
  4. package/README.md +267 -1
  5. package/dist/adapters/confluence.d.ts +46 -0
  6. package/dist/adapters/confluence.js +187 -0
  7. package/dist/adapters/confluence.js.map +1 -0
  8. package/dist/adapters/factory.d.ts +3 -0
  9. package/dist/adapters/factory.js +11 -0
  10. package/dist/adapters/factory.js.map +1 -0
  11. package/dist/adapters/yandex.d.ts +45 -0
  12. package/dist/adapters/yandex.js +233 -0
  13. package/dist/adapters/yandex.js.map +1 -0
  14. package/dist/cli-arguments.d.ts +41 -0
  15. package/dist/cli-arguments.js +149 -0
  16. package/dist/cli-arguments.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +180 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/clients/confluence-cloud.d.ts +45 -0
  21. package/dist/clients/confluence-cloud.js +261 -0
  22. package/dist/clients/confluence-cloud.js.map +1 -0
  23. package/dist/clients/confluence-factory.d.ts +3 -0
  24. package/dist/clients/confluence-factory.js +8 -0
  25. package/dist/clients/confluence-factory.js.map +1 -0
  26. package/dist/clients/confluence.d.ts +42 -0
  27. package/dist/clients/confluence.js +286 -0
  28. package/dist/clients/confluence.js.map +1 -0
  29. package/dist/clients/yandex-wiki.d.ts +35 -0
  30. package/dist/clients/yandex-wiki.js +255 -0
  31. package/dist/clients/yandex-wiki.js.map +1 -0
  32. package/dist/config.d.ts +52 -0
  33. package/dist/config.js +177 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/content-model.d.ts +12 -0
  36. package/dist/content-model.js +416 -0
  37. package/dist/content-model.js.map +1 -0
  38. package/dist/conversion.d.ts +43 -0
  39. package/dist/conversion.js +450 -0
  40. package/dist/conversion.js.map +1 -0
  41. package/dist/doctor.d.ts +24 -0
  42. package/dist/doctor.js +45 -0
  43. package/dist/doctor.js.map +1 -0
  44. package/dist/domain.d.ts +202 -0
  45. package/dist/domain.js +18 -0
  46. package/dist/domain.js.map +1 -0
  47. package/dist/filesystem-export.d.ts +53 -0
  48. package/dist/filesystem-export.js +243 -0
  49. package/dist/filesystem-export.js.map +1 -0
  50. package/dist/graph.d.ts +13 -0
  51. package/dist/graph.js +121 -0
  52. package/dist/graph.js.map +1 -0
  53. package/dist/http.d.ts +26 -0
  54. package/dist/http.js +100 -0
  55. package/dist/http.js.map +1 -0
  56. package/dist/index.d.ts +24 -0
  57. package/dist/index.js +25 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/input.d.ts +4 -0
  60. package/dist/input.js +56 -0
  61. package/dist/input.js.map +1 -0
  62. package/dist/locators.d.ts +24 -0
  63. package/dist/locators.js +84 -0
  64. package/dist/locators.js.map +1 -0
  65. package/dist/logger.d.ts +7 -0
  66. package/dist/logger.js +28 -0
  67. package/dist/logger.js.map +1 -0
  68. package/dist/migrator.d.ts +53 -0
  69. package/dist/migrator.js +669 -0
  70. package/dist/migrator.js.map +1 -0
  71. package/dist/rate-limiter.d.ts +12 -0
  72. package/dist/rate-limiter.js +31 -0
  73. package/dist/rate-limiter.js.map +1 -0
  74. package/dist/report.d.ts +101 -0
  75. package/dist/report.js +106 -0
  76. package/dist/report.js.map +1 -0
  77. package/dist/state.d.ts +119 -0
  78. package/dist/state.js +201 -0
  79. package/dist/state.js.map +1 -0
  80. package/dist/types.d.ts +197 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/updater.d.ts +24 -0
  84. package/dist/updater.js +92 -0
  85. package/dist/updater.js.map +1 -0
  86. package/dist/version.d.ts +1 -0
  87. package/dist/version.js +8 -0
  88. package/dist/version.js.map +1 -0
  89. package/dist/workspace.d.ts +29 -0
  90. package/dist/workspace.js +157 -0
  91. package/dist/workspace.js.map +1 -0
  92. package/docs/assets/readme-header.png +0 -0
  93. package/package.json +108 -3
  94. package/ywtc.config.example.yaml +52 -0
@@ -0,0 +1,450 @@
1
+ import transform from '@diplodoc/transform';
2
+ import { load } from 'cheerio';
3
+ import { LinkifyIt } from 'linkify-it';
4
+ import { normalizeWikiSlug, resolveRelativeWikiSlug } from './input.js';
5
+ export function emptyConversionStats() {
6
+ return {
7
+ internalPageLinks: 0,
8
+ externalLinks: 0,
9
+ attachmentLinks: 0,
10
+ anchorLinks: 0,
11
+ attachedImages: 0,
12
+ externalImages: 0,
13
+ tables: 0,
14
+ codeBlocks: 0,
15
+ };
16
+ }
17
+ export function mergeConversionStats(target, ...sources) {
18
+ for (const source of sources) {
19
+ for (const key of Object.keys(target))
20
+ target[key] += source[key];
21
+ }
22
+ return target;
23
+ }
24
+ function escapeXml(value) {
25
+ return String(value ?? '')
26
+ .replaceAll('&', '&')
27
+ .replaceAll('<', '&lt;')
28
+ .replaceAll('>', '&gt;');
29
+ }
30
+ function escapeAttribute(value) {
31
+ return escapeXml(value).replaceAll('"', '&quot;').replaceAll("'", '&apos;');
32
+ }
33
+ function cdata(value) {
34
+ return String(value ?? '').replaceAll(']]>', ']]]]><![CDATA[>');
35
+ }
36
+ const legacyTextColors = {
37
+ gray: '#6b778c',
38
+ grey: '#6b778c',
39
+ red: '#de350b',
40
+ green: '#00875a',
41
+ blue: '#0052cc',
42
+ orange: '#ff8b00',
43
+ yellow: '#ffab00',
44
+ purple: '#6554c0',
45
+ black: '#172b4d',
46
+ white: '#ffffff',
47
+ };
48
+ const linkifier = new LinkifyIt();
49
+ function closingParenthesis(value, openingIndex) {
50
+ let depth = 0;
51
+ for (let index = openingIndex; index < value.length; index += 1) {
52
+ if (value[index] === '\\') {
53
+ index += 1;
54
+ continue;
55
+ }
56
+ if (value[index] === '(')
57
+ depth += 1;
58
+ if (value[index] === ')') {
59
+ depth -= 1;
60
+ if (depth === 0)
61
+ return index;
62
+ }
63
+ }
64
+ return undefined;
65
+ }
66
+ function renderAutolinkText(value, context, stats) {
67
+ const matches = linkifier.match(value);
68
+ if (!matches)
69
+ return escapeXml(value);
70
+ let cursor = 0;
71
+ let output = '';
72
+ for (const match of matches) {
73
+ output += escapeXml(value.slice(cursor, match.index));
74
+ const target = resolveLink(match.url, context);
75
+ recordLink(target, stats);
76
+ output += storageLink(target, escapeXml(match.text), match.text);
77
+ cursor = match.lastIndex;
78
+ }
79
+ return output + escapeXml(value.slice(cursor));
80
+ }
81
+ function renderLegacyInlineText(value, context, stats, autolink) {
82
+ const marker = /\{(gray|grey|red|green|blue|orange|yellow|purple|black|white)\}\(/giu;
83
+ let cursor = 0;
84
+ let output = '';
85
+ let match = marker.exec(value);
86
+ const renderPlain = (text) => autolink ? renderAutolinkText(text, context, stats) : escapeXml(text);
87
+ while (match !== null) {
88
+ const openingIndex = marker.lastIndex - 1;
89
+ const closingIndex = closingParenthesis(value, openingIndex);
90
+ if (closingIndex === undefined)
91
+ break;
92
+ output += renderPlain(value.slice(cursor, match.index));
93
+ const color = legacyTextColors[match[1].toLocaleLowerCase()];
94
+ output += `<span style="color: ${color};">${renderPlain(value.slice(openingIndex + 1, closingIndex))}</span>`;
95
+ cursor = closingIndex + 1;
96
+ marker.lastIndex = cursor;
97
+ match = marker.exec(value);
98
+ }
99
+ return output + renderPlain(value.slice(cursor));
100
+ }
101
+ function normalizeReference(value) {
102
+ let normalized = value.trim();
103
+ try {
104
+ normalized = decodeURIComponent(normalized);
105
+ }
106
+ catch {
107
+ // Keep the original malformed reference so it can still be reported.
108
+ }
109
+ return normalized.replace(/^\.\//, '').replace(/^\/+/, '').toLocaleLowerCase();
110
+ }
111
+ function attachmentFor(reference, context) {
112
+ const withoutFragment = reference.split(/[?#]/, 1)[0] ?? reference;
113
+ const direct = context.attachmentsByReference.get(normalizeReference(withoutFragment));
114
+ if (direct)
115
+ return direct;
116
+ const basename = withoutFragment.replace(/\\/g, '/').split('/').at(-1);
117
+ return basename ? context.attachmentsByReference.get(normalizeReference(basename)) : undefined;
118
+ }
119
+ function resolveLink(href, context) {
120
+ const attached = attachmentFor(href, context);
121
+ if (attached)
122
+ return { type: 'attachment', filename: attached };
123
+ if (href.startsWith('#'))
124
+ return { type: 'anchor', anchor: href.slice(1) };
125
+ if (/^(?:mailto|tel):/i.test(href))
126
+ return { type: 'external', href };
127
+ let linkPath = href;
128
+ let anchor;
129
+ let isWikiLink = false;
130
+ try {
131
+ const absolute = new URL(href);
132
+ const wiki = new URL(context.wikiWebUrl);
133
+ if (absolute.origin !== wiki.origin) {
134
+ return /^https?:$/i.test(absolute.protocol)
135
+ ? { type: 'external', href: absolute.toString() }
136
+ : { type: 'external', href: '#' };
137
+ }
138
+ isWikiLink = true;
139
+ linkPath = absolute.pathname;
140
+ anchor = absolute.hash.slice(1) || undefined;
141
+ }
142
+ catch {
143
+ const hashIndex = linkPath.indexOf('#');
144
+ if (hashIndex >= 0) {
145
+ anchor = linkPath.slice(hashIndex + 1) || undefined;
146
+ linkPath = linkPath.slice(0, hashIndex);
147
+ }
148
+ isWikiLink = linkPath.startsWith('/') || !/^[a-z][a-z\d+.-]*:/i.test(linkPath);
149
+ }
150
+ if (isWikiLink && linkPath) {
151
+ const candidates = linkPath.startsWith('/')
152
+ ? [normalizeWikiSlug(linkPath)]
153
+ : [
154
+ normalizeWikiSlug(linkPath),
155
+ resolveRelativeWikiSlug(context.currentSlug, linkPath),
156
+ normalizeWikiSlug(`${context.currentSlug}/${linkPath}`),
157
+ ];
158
+ for (const candidate of candidates) {
159
+ const page = context.pagesBySlug.get(candidate.toLocaleLowerCase());
160
+ if (page)
161
+ return { type: 'page', page, ...(anchor ? { anchor } : {}) };
162
+ }
163
+ const slug = candidates[1] ?? candidates[0] ?? linkPath;
164
+ const original = new URL(`${normalizeWikiSlug(slug)}${anchor ? `#${anchor}` : ''}`, `${context.wikiWebUrl}/`);
165
+ return { type: 'external', href: original.toString() };
166
+ }
167
+ return { type: 'external', href: /^https?:\/\//i.test(href) ? href : '#' };
168
+ }
169
+ function anchorMacro(anchor) {
170
+ return `<ac:structured-macro ac:name="anchor" ac:schema-version="1"><ac:parameter ac:name="">${escapeXml(anchor)}</ac:parameter></ac:structured-macro>`;
171
+ }
172
+ function storageLink(target, body, plainText) {
173
+ if (target.type === 'page') {
174
+ const anchor = target.anchor ? ` ac:anchor="${escapeAttribute(target.anchor)}"` : '';
175
+ return `<ac:link${anchor}><ri:page ri:content-title="${escapeAttribute(target.page.destinationTitle)}"/><ac:link-body>${body || escapeXml(plainText)}</ac:link-body></ac:link>`;
176
+ }
177
+ if (target.type === 'attachment') {
178
+ return `<ac:link><ri:attachment ri:filename="${escapeAttribute(target.filename)}"/><ac:plain-text-link-body><![CDATA[${cdata(plainText || target.filename)}]]></ac:plain-text-link-body></ac:link>`;
179
+ }
180
+ if (target.type === 'anchor') {
181
+ return `<ac:link ac:anchor="${escapeAttribute(target.anchor)}"><ac:link-body>${body || escapeXml(plainText)}</ac:link-body></ac:link>`;
182
+ }
183
+ return `<a href="${escapeAttribute(target.href)}">${body || escapeXml(plainText)}</a>`;
184
+ }
185
+ function recordLink(target, stats) {
186
+ if (target.type === 'page')
187
+ stats.internalPageLinks += 1;
188
+ else if (target.type === 'attachment')
189
+ stats.attachmentLinks += 1;
190
+ else if (target.type === 'anchor')
191
+ stats.anchorLinks += 1;
192
+ else
193
+ stats.externalLinks += 1;
194
+ }
195
+ function renderHtmlToStorage(html, context, warnings, stats) {
196
+ const $ = load(html, null, false);
197
+ let taskId = 1;
198
+ const isInsideLinkOrCode = (node) => {
199
+ let parent = node.parent;
200
+ while (parent) {
201
+ if (['a', 'code', 'pre'].includes(String(parent.name).toLocaleLowerCase()))
202
+ return true;
203
+ parent = parent.parent;
204
+ }
205
+ return false;
206
+ };
207
+ const renderChildren = (node) => (node.children ?? []).map((child) => renderNode(child)).join('');
208
+ const renderNode = (node) => {
209
+ if (node.type === 'text') {
210
+ return renderLegacyInlineText(String(node.data ?? ''), context, stats, !isInsideLinkOrCode(node));
211
+ }
212
+ if (node.type !== 'tag')
213
+ return '';
214
+ const name = String(node.name).toLowerCase();
215
+ const element = $(node);
216
+ const classes = new Set(String(element.attr('class') ?? '').split(/\s+/).filter(Boolean));
217
+ if (['script', 'style', 'button', 'svg'].includes(name))
218
+ return '';
219
+ if (classes.has('yfm-anchor'))
220
+ return '';
221
+ if (classes.has('yfm-note')) {
222
+ const rawType = element.attr('note-type')
223
+ ?? [...classes].find((entry) => entry.startsWith('yfm-accent-'))?.replace('yfm-accent-', '')
224
+ ?? 'info';
225
+ const macro = rawType === 'alert' ? 'warning' : ['info', 'tip', 'warning'].includes(rawType) ? rawType : 'info';
226
+ const title = element.children('.yfm-note-title').first().text().trim();
227
+ const contentNode = element.children('.yfm-note-content').first().get(0);
228
+ const titleParameter = title ? `<ac:parameter ac:name="title">${escapeXml(title)}</ac:parameter>` : '';
229
+ return `<ac:structured-macro ac:name="${macro}" ac:schema-version="1">${titleParameter}<ac:rich-text-body>${contentNode ? renderChildren(contentNode) : renderChildren(node)}</ac:rich-text-body></ac:structured-macro>`;
230
+ }
231
+ if (name === 'details' || classes.has('yfm-cut')) {
232
+ const title = element.children('summary').first().text().trim() || 'Details';
233
+ const contentNode = element.children('.yfm-cut-content').first().get(0);
234
+ const content = contentNode
235
+ ? renderChildren(contentNode)
236
+ : (node.children ?? []).filter((child) => child.name !== 'summary').map((child) => renderNode(child)).join('');
237
+ return `<ac:structured-macro ac:name="expand" ac:schema-version="1"><ac:parameter ac:name="title">${escapeXml(title)}</ac:parameter><ac:rich-text-body>${content}</ac:rich-text-body></ac:structured-macro>`;
238
+ }
239
+ if (classes.has('yfm-tabs')) {
240
+ warnings.add('Tabs were converted to static headed sections');
241
+ return element.find('.yfm-tab-panel').toArray().map((panel) => {
242
+ const title = $(panel).attr('data-title') || 'Tab';
243
+ return `<h3>${escapeXml(title)}</h3>${renderChildren(panel)}`;
244
+ }).join('');
245
+ }
246
+ if (classes.has('yfm-clipboard')) {
247
+ const pre = element.find('pre').first().get(0);
248
+ return pre ? renderNode(pre) : '';
249
+ }
250
+ if (/^h[1-6]$/.test(name)) {
251
+ const id = element.attr('id');
252
+ return `${id && id !== 'undefined' ? anchorMacro(id) : ''}<${name}>${renderChildren(node)}</${name}>`;
253
+ }
254
+ if (name === 'a') {
255
+ const href = element.attr('href');
256
+ if (!href) {
257
+ const id = element.attr('id') ?? element.attr('name');
258
+ return `${id ? anchorMacro(id) : ''}${renderChildren(node)}`;
259
+ }
260
+ const target = resolveLink(href, context);
261
+ recordLink(target, stats);
262
+ return storageLink(target, renderChildren(node), element.text());
263
+ }
264
+ if (name === 'img') {
265
+ const src = element.attr('src') ?? '';
266
+ const filename = attachmentFor(src, context);
267
+ const attrs = [
268
+ element.attr('alt') ? ` ac:alt="${escapeAttribute(element.attr('alt'))}"` : '',
269
+ element.attr('width') ? ` ac:width="${escapeAttribute(element.attr('width'))}"` : '',
270
+ element.attr('height') ? ` ac:height="${escapeAttribute(element.attr('height'))}"` : '',
271
+ ].join('');
272
+ if (filename) {
273
+ stats.attachedImages += 1;
274
+ return `<ac:image${attrs}><ri:attachment ri:filename="${escapeAttribute(filename)}"/></ac:image>`;
275
+ }
276
+ const target = resolveLink(src, context);
277
+ const external = target.type === 'external' ? target.href : new URL(src, `${context.wikiWebUrl}/`).toString();
278
+ stats.externalImages += 1;
279
+ warnings.add(`Image was kept as an external reference: ${src}`);
280
+ return `<ac:image${attrs}><ri:url ri:value="${escapeAttribute(external)}"/></ac:image>`;
281
+ }
282
+ if (name === 'pre') {
283
+ stats.codeBlocks += 1;
284
+ const code = element.find('code').first();
285
+ const raw = code.length ? code.text() : element.text();
286
+ const className = code.attr('class') ?? '';
287
+ const language = className.match(/language-([\w+-]+)/)?.[1];
288
+ const parameter = language ? `<ac:parameter ac:name="language">${escapeXml(language)}</ac:parameter>` : '';
289
+ return `<ac:structured-macro ac:name="code" ac:schema-version="1">${parameter}<ac:plain-text-body><![CDATA[${cdata(raw)}]]></ac:plain-text-body></ac:structured-macro>`;
290
+ }
291
+ if (name === 'input' && element.attr('type') === 'checkbox') {
292
+ return element.attr('checked') !== undefined ? '☑ ' : '☐ ';
293
+ }
294
+ if (name === 'video') {
295
+ const src = element.attr('src') ?? '';
296
+ warnings.add(`Video was converted to a link: ${src}`);
297
+ return `<p><a href="${escapeAttribute(src)}">${escapeXml(src || 'Video')}</a></p>`;
298
+ }
299
+ if (classes.has('yfm-math') || classes.has('math')) {
300
+ warnings.add('Math markup was converted to inline code because no standard Confluence math macro is assumed');
301
+ return `<code>${escapeXml(element.text())}</code>`;
302
+ }
303
+ if (name === 'p') {
304
+ const plainText = element.text().replaceAll('\u00a0', ' ');
305
+ const taskLines = plainText.split(/\r?\n/).filter((line) => line.trim());
306
+ if (taskLines.length > 0 && taskLines.every((line) => /^\s*\[[ xX]\]\s+/.test(line))) {
307
+ const renderedLines = renderChildren(node).split(/\r?\n/).filter((line) => line.trim());
308
+ const tasks = taskLines.map((line, index) => {
309
+ const task = line.match(/^\s*\[([ xX])\]\s+/);
310
+ const status = task[1]?.toLocaleLowerCase() === 'x' ? 'complete' : 'incomplete';
311
+ const body = (renderedLines[index] ?? renderLegacyInlineText(line, context, stats, true)).replace(/^\s*\[[ xX]\]\s+/, '');
312
+ return `<ac:task><ac:task-id>${taskId++}</ac:task-id><ac:task-status>${status}</ac:task-status><ac:task-body>${body}</ac:task-body></ac:task>`;
313
+ }).join('');
314
+ return `<ac:task-list>${tasks}</ac:task-list>`;
315
+ }
316
+ if (!plainText.trim() && element.find('img,video,table').length === 0)
317
+ return '';
318
+ const id = element.attr('id');
319
+ return `${id ? anchorMacro(id) : ''}<p>${renderChildren(node)}</p>`;
320
+ }
321
+ if (name === 'mark') {
322
+ return `<span style="background-color: #fff0b3;">${renderChildren(node)}</span>`;
323
+ }
324
+ if (name === 'kbd')
325
+ return `<code>${renderChildren(node)}</code>`;
326
+ if (name === 'ins')
327
+ return `<u>${renderChildren(node)}</u>`;
328
+ const supported = new Set(['strong', 'em', 'u', 's', 'del', 'code', 'blockquote', 'ul', 'ol', 'li', 'table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'dl', 'dt', 'dd', 'sup', 'sub']);
329
+ if (supported.has(name)) {
330
+ if (name === 'table')
331
+ stats.tables += 1;
332
+ const attributes = name === 'th' || name === 'td'
333
+ ? ['rowspan', 'colspan'].map((attribute) => element.attr(attribute) ? ` ${attribute}="${escapeAttribute(element.attr(attribute))}"` : '').join('')
334
+ : name === 'ol' && /^\d+$/.test(element.attr('start') ?? '')
335
+ ? ` start="${escapeAttribute(element.attr('start'))}"`
336
+ : '';
337
+ return `<${name}${attributes}>${renderChildren(node)}</${name}>`;
338
+ }
339
+ if (name === 'br' || name === 'hr')
340
+ return `<${name}/>`;
341
+ return renderChildren(node);
342
+ };
343
+ return $.root().contents().toArray().map((node) => renderNode(node)).join('');
344
+ }
345
+ export function convertYfmToStorage(content, context) {
346
+ const warnings = new Set();
347
+ const stats = emptyConversionStats();
348
+ try {
349
+ const output = transform(content || '', {
350
+ allowHTML: true,
351
+ needToSanitizeHtml: true,
352
+ supportGithubAnchors: true,
353
+ lang: 'ru',
354
+ // markdown-it 13 linkify has known quadratic paths. Bare URLs are linked
355
+ // later from parsed text nodes with current linkify-it instead.
356
+ linkify: false,
357
+ });
358
+ for (const warning of [...(output.logs.warn ?? []), ...(output.logs.error ?? [])])
359
+ warnings.add(warning);
360
+ const storage = renderHtmlToStorage(output.result.html, context, warnings, stats);
361
+ return { storage: storage || '<p></p>', warnings: [...warnings], stats };
362
+ }
363
+ catch (error) {
364
+ warnings.add(`YFM transformation failed; original source was preserved: ${error instanceof Error ? error.message : String(error)}`);
365
+ return {
366
+ storage: `<ac:structured-macro ac:name="code" ac:schema-version="1"><ac:parameter ac:name="title">Original YFM</ac:parameter><ac:plain-text-body><![CDATA[${cdata(content)}]]></ac:plain-text-body></ac:structured-macro>`,
367
+ warnings: [...warnings],
368
+ stats,
369
+ };
370
+ }
371
+ }
372
+ /**
373
+ * Render source YFM for the local report comparator. The Diplodoc sanitizer is
374
+ * deliberately enabled; the report adds a second sanitization layer and loads
375
+ * this markup inside an iframe without script privileges.
376
+ */
377
+ export function renderYfmPreview(content) {
378
+ try {
379
+ const output = transform(content || '', {
380
+ allowHTML: true,
381
+ needToSanitizeHtml: true,
382
+ supportGithubAnchors: true,
383
+ lang: 'ru',
384
+ linkify: false,
385
+ });
386
+ return output.result.html || '<p></p>';
387
+ }
388
+ catch {
389
+ return `<pre><code>${escapeXml(content)}</code></pre>`;
390
+ }
391
+ }
392
+ function gridCellText(value) {
393
+ if (value === null || value === undefined)
394
+ return '';
395
+ if (typeof value === 'boolean')
396
+ return value ? '✓' : '';
397
+ if (typeof value === 'string' || typeof value === 'number')
398
+ return String(value);
399
+ if (Array.isArray(value))
400
+ return value.map(gridCellText).filter(Boolean).join(', ');
401
+ if (typeof value === 'object') {
402
+ const object = value;
403
+ const preferred = object.display_name ?? object.display ?? object.key ?? object.username ?? object.name;
404
+ if (preferred !== undefined)
405
+ return gridCellText(preferred);
406
+ return JSON.stringify(value);
407
+ }
408
+ return String(value);
409
+ }
410
+ export function convertGridToStorage(grid, context) {
411
+ const warnings = new Set([`Dynamic table "${grid.title}" was converted to a static table`]);
412
+ const stats = emptyConversionStats();
413
+ stats.tables = 1;
414
+ const headers = grid.structure.columns.map((column) => `<th>${escapeXml(column.title)}</th>`).join('');
415
+ const rows = grid.rows.map((row) => {
416
+ const cells = grid.structure.columns.map((column, index) => {
417
+ const value = gridCellText(row.row[index]);
418
+ if (column.format === 'yfm' && value) {
419
+ const converted = convertYfmToStorage(value, context);
420
+ converted.warnings.forEach((warning) => {
421
+ warnings.add(warning);
422
+ });
423
+ mergeConversionStats(stats, converted.stats);
424
+ return `<td>${converted.storage}</td>`;
425
+ }
426
+ return `<td>${escapeXml(value)}</td>`;
427
+ }).join('');
428
+ return `<tr>${cells}</tr>`;
429
+ }).join('');
430
+ return {
431
+ storage: `<h2>${escapeXml(grid.title)}</h2><table><thead><tr>${headers}</tr></thead><tbody>${rows}</tbody></table>`,
432
+ warnings: [...warnings],
433
+ stats,
434
+ };
435
+ }
436
+ export function createAttachmentReferenceMap(entries) {
437
+ const map = new Map();
438
+ for (const entry of entries) {
439
+ const keys = [entry.sourceName, `.files/${entry.sourceName}`, `_files/${entry.sourceName}`, entry.downloadUrl]
440
+ .filter((value) => Boolean(value));
441
+ for (const key of keys) {
442
+ map.set(normalizeReference(key), entry.destinationName);
443
+ const basename = key.replace(/\\/g, '/').split('/').at(-1);
444
+ if (basename)
445
+ map.set(normalizeReference(basename), entry.destinationName);
446
+ }
447
+ }
448
+ return map;
449
+ }
450
+ //# sourceMappingURL=conversion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversion.js","sourceRoot":"","sources":["../src/conversion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { AppConfig } from './config.js';
2
+ import { type TransferScope } from './domain.js';
3
+ import { type ResolvedLocator, type RemoteLocator } from './locators.js';
4
+ export interface DoctorResult {
5
+ source: {
6
+ profile: string;
7
+ provider: string;
8
+ product: string;
9
+ version?: string;
10
+ id: string;
11
+ title: string;
12
+ };
13
+ destination: {
14
+ profile?: string;
15
+ provider: string;
16
+ product: string;
17
+ version?: string;
18
+ id: string;
19
+ };
20
+ pages: number;
21
+ links: number;
22
+ warnings: string[];
23
+ }
24
+ export declare function runCapabilityDoctor(config: AppConfig, sourceLocator: RemoteLocator, destinationLocator: ResolvedLocator, scope: TransferScope): Promise<DoctorResult>;
package/dist/doctor.js ADDED
@@ -0,0 +1,45 @@
1
+ import { createProviderAdapter } from './adapters/factory.js';
2
+ import { assertTransferCapabilities } from './domain.js';
3
+ import { discoverPageGraph } from './graph.js';
4
+ import { sameRemoteInstance } from './locators.js';
5
+ export async function runCapabilityDoctor(config, sourceLocator, destinationLocator, scope) {
6
+ const source = createProviderAdapter(sourceLocator.profile, config);
7
+ const destination = destinationLocator.type === 'remote' ? createProviderAdapter(destinationLocator.profile, config) : undefined;
8
+ assertTransferCapabilities(source, destination, scope);
9
+ const [sourcePlatform, destinationPlatform, root, container] = await Promise.all([
10
+ source.preflight(),
11
+ destination?.preflight(),
12
+ source.resolvePage(sourceLocator.value),
13
+ destinationLocator.type === 'remote' && destination ? destination.resolveContainer(destinationLocator.value) : undefined,
14
+ ]);
15
+ const graph = await discoverPageGraph({ adapter: source, root, scope });
16
+ if (container
17
+ && destinationLocator.type === 'remote'
18
+ && sameRemoteInstance(sourceLocator.profile, destinationLocator.profile)
19
+ && graph.pages.some((page) => page.id === container.id)) {
20
+ throw new Error('The destination belongs to the selected source graph. Choose a destination outside that graph.');
21
+ }
22
+ return {
23
+ source: {
24
+ profile: source.profile.name,
25
+ provider: source.kind,
26
+ product: sourcePlatform.product,
27
+ ...(sourcePlatform.version ? { version: sourcePlatform.version } : {}),
28
+ id: root.id,
29
+ title: root.title,
30
+ },
31
+ destination: destinationLocator.type === 'directory'
32
+ ? { provider: 'filesystem', product: `${destinationLocator.format} export`, id: destinationLocator.path }
33
+ : {
34
+ profile: destination.profile.name,
35
+ provider: destination.kind,
36
+ product: destinationPlatform?.product ?? destination.kind,
37
+ ...(destinationPlatform?.version ? { version: destinationPlatform.version } : {}),
38
+ id: container.id,
39
+ },
40
+ pages: graph.pages.length,
41
+ links: graph.edges.length,
42
+ warnings: [...sourcePlatform.warnings, ...(destinationPlatform?.warnings ?? []), ...graph.warnings],
43
+ };
44
+ }
45
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}