@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
package/dist/cli.js ADDED
@@ -0,0 +1,180 @@
1
+ #!/usr/bin/env node
2
+ import { Listr } from 'listr2';
3
+ import { cliHelp, parseCliArguments } from './cli-arguments.js';
4
+ import { readWorkspaceConfig, secretValues, validateProfileSecrets } from './config.js';
5
+ import { resolveDestinationLocator, resolveSourceLocator } from './locators.js';
6
+ import { createLogger, redact } from './logger.js';
7
+ import { runUpdate } from './updater.js';
8
+ import { packageVersion } from './version.js';
9
+ import { initializeWorkspace, resolveWorkspace, resolveWorkspacePath, validateWorkspaceMarker } from './workspace.js';
10
+ const color = process.stdout.isTTY && !process.env.NO_COLOR;
11
+ const paint = (code, value) => color ? `\u001b[${code}m${value}\u001b[0m` : value;
12
+ function heading(label) {
13
+ console.log(`\n${paint(36, '◆')} ${paint(1, label)}`);
14
+ }
15
+ async function migrate(command) {
16
+ const workspace = await resolveWorkspace(command.workdir ? { explicit: command.workdir } : {});
17
+ const initialized = await initializeWorkspace(workspace);
18
+ await validateWorkspaceMarker(workspace);
19
+ const config = readWorkspaceConfig(workspace.envFile, workspace.configFile);
20
+ const secrets = secretValues(config);
21
+ const source = resolveSourceLocator(config, command.source, command.sourceProfile);
22
+ const destination = resolveDestinationLocator({
23
+ config,
24
+ value: command.destination,
25
+ ...(command.destinationProfile ? { profile: command.destinationProfile } : {}),
26
+ ...(command.format ? { format: command.format } : {}),
27
+ cwd: process.cwd(),
28
+ });
29
+ validateProfileSecrets(config, [source.profile, ...(destination.type === 'remote' ? [destination.profile] : [])]);
30
+ const stateFilename = command.stateFilename ? resolveWorkspacePath(workspace, command.stateFilename) : undefined;
31
+ const logger = createLogger(secrets);
32
+ const { Migrator: MigratorImplementation } = await import('./migrator.js');
33
+ const migrator = new MigratorImplementation(config, logger);
34
+ const controller = new AbortController();
35
+ let signalCode;
36
+ const interrupt = () => { signalCode = 130; controller.abort(new Error('Interrupted by SIGINT')); };
37
+ const terminate = () => { signalCode = 143; controller.abort(new Error('Interrupted by SIGTERM')); };
38
+ process.once('SIGINT', interrupt);
39
+ process.once('SIGTERM', terminate);
40
+ heading('ywtc transfer');
41
+ console.log(` Workdir ${workspace.root} ${paint(90, `(${workspace.source})`)}`);
42
+ console.log(` Source ${command.source} ${paint(90, `[${source.profile.name}]`)}`);
43
+ console.log(` Destination ${command.destination}${destination.type === 'remote' ? ` ${paint(90, `[${destination.profile.name}]`)}` : ` ${paint(90, `[${destination.format}]`)}`}`);
44
+ console.log(` Scope ${command.scope}`);
45
+ console.log(` Mode ${command.dryRun ? paint(33, 'dry-run · read-only') : paint(35, 'live')}`);
46
+ if (initialized.created.length > 0)
47
+ console.log(` Initialized ${initialized.created.join(', ')}`);
48
+ let result;
49
+ const tasks = new Listr([
50
+ {
51
+ title: 'Discover, transfer, and verify',
52
+ task: async (_context, task) => {
53
+ result = await migrator.run({
54
+ source,
55
+ destination,
56
+ scope: command.scope,
57
+ dryRun: command.dryRun,
58
+ archive: command.archive,
59
+ fresh: command.fresh,
60
+ concurrency: command.concurrency ?? config.concurrency,
61
+ runtimeDirectory: workspace.statesDirectory,
62
+ cacheDirectory: workspace.cacheDirectory,
63
+ reportsDirectory: workspace.reportsDirectory,
64
+ signal: controller.signal,
65
+ ...(stateFilename ? { stateFilename } : {}),
66
+ onStatus: (message) => { task.output = message; },
67
+ });
68
+ },
69
+ },
70
+ ], {
71
+ renderer: process.stdout.isTTY ? 'default' : 'simple',
72
+ rendererOptions: { collapseErrors: false, collapseSubtasks: false },
73
+ collectErrors: true,
74
+ });
75
+ try {
76
+ await tasks.run();
77
+ }
78
+ catch (error) {
79
+ if (signalCode) {
80
+ heading('Transfer interrupted');
81
+ console.log(` Status cancelled by ${signalCode === 130 ? 'SIGINT' : 'SIGTERM'}`);
82
+ console.log(` Workdir ${workspace.root}`);
83
+ console.log(` Reports ${workspace.reportsDirectory}`);
84
+ console.log(` Resume ywtc migrate --source "${command.source}" --destination "${command.destination}" --scope ${command.scope} --workdir "${workspace.root}"`);
85
+ return signalCode;
86
+ }
87
+ throw error;
88
+ }
89
+ finally {
90
+ process.removeListener('SIGINT', interrupt);
91
+ process.removeListener('SIGTERM', terminate);
92
+ }
93
+ if (!result)
94
+ throw new Error('Transfer completed without a result');
95
+ heading(result.status === 'completed' ? 'Transfer complete' : 'Transfer finished');
96
+ console.log(` Status ${result.status}`);
97
+ console.log(` State ${result.stateFilename}`);
98
+ console.log(` Report ${result.reportPaths.html}`);
99
+ console.log(` Pages ${command.dryRun ? `${result.summary.complete}/${result.summary.pages} planned` : `${result.summary.complete}/${result.summary.pages} complete`} · ${result.summary.partial} partial · ${result.summary.failed} failed`);
100
+ console.log(` Content ${result.summary.resources} files · ${result.summary.bytes} bytes · ${result.summary.links} links · ${result.summary.cycles} cycles`);
101
+ console.log(` Issues ${result.summary.warnings} warnings · ${result.summary.errors} errors`);
102
+ if (result.output)
103
+ console.log(` Output ${result.output}`);
104
+ if (result.archive)
105
+ console.log(` Archive ${result.archive}`);
106
+ if (result.hasErrors)
107
+ console.log(` Resume ywtc migrate --source "${command.source}" --destination "${command.destination}" --scope ${command.scope}`);
108
+ return result.hasErrors ? 1 : 0;
109
+ }
110
+ export async function main(argv = process.argv.slice(2)) {
111
+ const command = parseCliArguments(argv);
112
+ if (command.command === 'help') {
113
+ console.log(cliHelp(command.topic));
114
+ return 0;
115
+ }
116
+ if (command.command === 'version') {
117
+ console.log(packageVersion());
118
+ return 0;
119
+ }
120
+ if (command.command === 'init') {
121
+ const workspace = await resolveWorkspace(command.workdir ? { explicit: command.workdir } : {});
122
+ const result = await initializeWorkspace(workspace);
123
+ heading('Workspace ready');
124
+ console.log(` Path ${workspace.root}`);
125
+ console.log(` Profiles ${workspace.configFile}`);
126
+ console.log(` Secrets ${workspace.envFile}`);
127
+ console.log(` State ${workspace.statesDirectory}`);
128
+ console.log(` Created ${result.created.length ? result.created.join(', ') : 'nothing'}`);
129
+ console.log(` Reused ${result.existing.length ? result.existing.join(', ') : 'nothing'}`);
130
+ console.log(` Next Fill profiles/secrets, then run: ywtc doctor --workdir "${workspace.root}"`);
131
+ return 0;
132
+ }
133
+ if (command.command === 'doctor') {
134
+ const workspace = await resolveWorkspace(command.workdir ? { explicit: command.workdir } : {});
135
+ await validateWorkspaceMarker(workspace);
136
+ const config = readWorkspaceConfig(workspace.envFile, workspace.configFile);
137
+ heading('Workspace diagnosis');
138
+ console.log(` Workdir ${paint(32, workspace.root)}`);
139
+ console.log(` Profiles ${Object.values(config.profiles).map((profile) => `${profile.name}:${profile.type}`).join(', ')}`);
140
+ console.log(` Config ${paint(32, 'valid')} · ${workspace.configFile}`);
141
+ if (!command.source || !command.destination) {
142
+ validateProfileSecrets(config, Object.values(config.profiles));
143
+ console.log(` API ${paint(90, 'not requested; pass both --source and --destination')}`);
144
+ return 0;
145
+ }
146
+ const source = resolveSourceLocator(config, command.source, command.sourceProfile);
147
+ const destination = resolveDestinationLocator({
148
+ config,
149
+ value: command.destination,
150
+ ...(command.destinationProfile ? { profile: command.destinationProfile } : {}),
151
+ ...(command.format ? { format: command.format } : {}),
152
+ });
153
+ validateProfileSecrets(config, [source.profile, ...(destination.type === 'remote' ? [destination.profile] : [])]);
154
+ const { runCapabilityDoctor } = await import('./doctor.js');
155
+ const result = await runCapabilityDoctor(config, source, destination, command.scope);
156
+ console.log(` Source ${paint(32, `${result.source.product}${result.source.version ? ` ${result.source.version}` : ''}`)} · ${result.source.title}`);
157
+ console.log(` Dest ${paint(32, `${result.destination.product}${result.destination.version ? ` ${result.destination.version}` : ''}`)}`);
158
+ console.log(` Scope ${result.pages} pages · ${result.links} links`);
159
+ for (const warning of result.warnings)
160
+ console.log(` ${paint(33, 'Warning')} ${warning}`);
161
+ return 0;
162
+ }
163
+ if (command.command === 'update') {
164
+ const result = await runUpdate({ currentVersion: packageVersion(), install: command.install, ...(command.via ? { via: command.via } : {}) });
165
+ heading('Update status');
166
+ console.log(` Current ${result.current}`);
167
+ console.log(` Latest ${result.latest}`);
168
+ console.log(` Channel ${result.channel}`);
169
+ console.log(` Status ${result.installed ? paint(32, 'updated') : result.updateAvailable ? paint(33, 'update available') : paint(32, 'up to date')}`);
170
+ if (!result.installed && result.updateAvailable)
171
+ console.log(` Command ${result.command}`);
172
+ return 0;
173
+ }
174
+ return migrate(command);
175
+ }
176
+ main().then((code) => { process.exitCode = code; }).catch((error) => {
177
+ console.error(`ERROR ${redact(error, [])}`);
178
+ process.exitCode = 2;
179
+ });
180
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { Readable } from 'node:stream';
2
+ import type { ConfluenceConnectionProfile, NetworkLimits } from '../config.js';
3
+ import type { ConfluenceApi, ConfluenceAttachment, ConfluencePage, ConfluencePlatformInfo, DownloadedFile } from '../types.js';
4
+ export declare class CloudConfluenceClient implements ConfluenceApi {
5
+ private readonly baseUrl;
6
+ private readonly http;
7
+ private readonly readLimit;
8
+ private readonly writeLimit;
9
+ private readonly uploadLimit;
10
+ private readonly spacesByKey;
11
+ private readonly spacesById;
12
+ constructor(config: ConfluenceConnectionProfile, timeoutMs: number, limits: NetworkLimits);
13
+ preflight(): Promise<ConfluencePlatformInfo>;
14
+ private rememberSpace;
15
+ private getSpaceById;
16
+ private getSpaceByKey;
17
+ private normalizePage;
18
+ getPage(id: string): Promise<ConfluencePage>;
19
+ findPageByTitle(spaceKey: string, title: string): Promise<ConfluencePage | undefined>;
20
+ resolveTarget(input: string): Promise<ConfluencePage>;
21
+ createPage(input: {
22
+ spaceKey: string;
23
+ parentId: string;
24
+ title: string;
25
+ storage: string;
26
+ }): Promise<ConfluencePage>;
27
+ updatePage(input: {
28
+ pageId: string;
29
+ title: string;
30
+ storage: string;
31
+ }): Promise<ConfluencePage>;
32
+ findAttachment(pageId: string, filename: string): Promise<ConfluenceAttachment | undefined>;
33
+ uploadAttachment(input: {
34
+ pageId: string;
35
+ filename: string;
36
+ file: Readable;
37
+ contentLength?: number;
38
+ mimeType?: string;
39
+ existingAttachmentId?: string;
40
+ }): Promise<ConfluenceAttachment>;
41
+ listAttachments(pageId: string): Promise<ConfluenceAttachment[]>;
42
+ getDescendants(pageId: string): Promise<ConfluencePage[]>;
43
+ downloadAttachment(pageId: string, attachment: ConfluenceAttachment, destination: string): Promise<DownloadedFile>;
44
+ pageWebUrl(page: ConfluencePage): string;
45
+ }
@@ -0,0 +1,261 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { createWriteStream } from 'node:fs';
3
+ import { mkdir } 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 FormData from 'form-data';
8
+ import PQueue from 'p-queue';
9
+ import { RetryingHttpClient } from '../http.js';
10
+ import { RequestRateLimiter } from '../rate-limiter.js';
11
+ function cloudRoot(baseUrl) {
12
+ const url = new URL(baseUrl);
13
+ url.pathname = `${url.pathname.replace(/\/+$/, '').replace(/\/wiki$/, '')}/wiki`;
14
+ url.search = '';
15
+ url.hash = '';
16
+ return url.toString().replace(/\/$/, '');
17
+ }
18
+ function firstAttachment(payload) {
19
+ if (payload && typeof payload === 'object' && 'results' in payload) {
20
+ const result = payload.results[0];
21
+ if (!result)
22
+ throw new Error('Confluence Cloud returned an empty attachment result');
23
+ return result;
24
+ }
25
+ return payload;
26
+ }
27
+ export class CloudConfluenceClient {
28
+ baseUrl;
29
+ http;
30
+ readLimit;
31
+ writeLimit;
32
+ uploadLimit;
33
+ spacesByKey = new Map();
34
+ spacesById = new Map();
35
+ constructor(config, timeoutMs, limits) {
36
+ if (!config.email)
37
+ throw new Error('CONFLUENCE_EMAIL is required for Confluence Cloud');
38
+ this.baseUrl = cloudRoot(config.baseUrl);
39
+ const rateLimiter = new RequestRateLimiter(limits);
40
+ const readQueue = new PQueue({ concurrency: limits.readConcurrency });
41
+ const writeQueue = new PQueue({ concurrency: limits.writeConcurrency });
42
+ const uploadQueue = new PQueue({ concurrency: limits.uploadConcurrency });
43
+ this.readLimit = (task) => readQueue.add(task);
44
+ this.writeLimit = (task) => writeQueue.add(task);
45
+ this.uploadLimit = (task) => uploadQueue.add(task);
46
+ this.http = new RetryingHttpClient({
47
+ baseURL: this.baseUrl,
48
+ timeoutMs,
49
+ rateLimiter,
50
+ headers: {
51
+ Authorization: `Basic ${Buffer.from(`${config.email}:${config.token}`).toString('base64')}`,
52
+ Accept: 'application/json',
53
+ },
54
+ });
55
+ }
56
+ async preflight() {
57
+ await this.readLimit(async () => {
58
+ await this.http.request({ method: 'GET', url: '/api/v2/spaces', params: { limit: 1 } });
59
+ });
60
+ return { deployment: 'cloud', product: 'Confluence Cloud', api: 'REST v2 pages/spaces + REST v1 attachments' };
61
+ }
62
+ rememberSpace(space) {
63
+ this.spacesById.set(space.id, space);
64
+ this.spacesByKey.set(space.key, space);
65
+ return space;
66
+ }
67
+ async getSpaceById(id) {
68
+ const cached = this.spacesById.get(id);
69
+ if (cached)
70
+ return cached;
71
+ return this.readLimit(async () => {
72
+ const response = await this.http.request({ method: 'GET', url: `/api/v2/spaces/${encodeURIComponent(id)}` });
73
+ return this.rememberSpace(response.data);
74
+ });
75
+ }
76
+ async getSpaceByKey(key) {
77
+ const cached = this.spacesByKey.get(key);
78
+ if (cached)
79
+ return cached;
80
+ return this.readLimit(async () => {
81
+ const response = await this.http.request({
82
+ method: 'GET', url: '/api/v2/spaces', params: { keys: key, limit: 2 },
83
+ });
84
+ const space = response.data.results[0];
85
+ if (!space)
86
+ throw new Error(`Confluence Cloud space not found: ${key}`);
87
+ return this.rememberSpace(space);
88
+ });
89
+ }
90
+ async normalizePage(page) {
91
+ if (!page.id || !page.title || !page.spaceId)
92
+ throw new Error('Confluence Cloud page response is missing id, title, or spaceId');
93
+ const space = await this.getSpaceById(page.spaceId);
94
+ return {
95
+ id: page.id,
96
+ type: 'page',
97
+ ...(page.status ? { status: page.status } : {}),
98
+ title: page.title,
99
+ space: { id: space.id, key: space.key, ...(space.name ? { name: space.name } : {}) },
100
+ ...(page.parentId ? { ancestors: [{ id: page.parentId }] } : {}),
101
+ ...(page.version ? { version: page.version } : {}),
102
+ ...(page.body ? { body: page.body } : {}),
103
+ ...(page.operations ? { operations: page.operations } : {}),
104
+ ...(page._links ? { _links: page._links } : {}),
105
+ };
106
+ }
107
+ async getPage(id) {
108
+ const page = await this.readLimit(async () => {
109
+ const response = await this.http.request({
110
+ method: 'GET', url: `/api/v2/pages/${encodeURIComponent(id)}`,
111
+ params: { 'body-format': 'storage', 'include-operations': true },
112
+ });
113
+ return response.data;
114
+ });
115
+ return this.normalizePage(page);
116
+ }
117
+ async findPageByTitle(spaceKey, title) {
118
+ const space = await this.getSpaceByKey(spaceKey);
119
+ const page = await this.readLimit(async () => {
120
+ const response = await this.http.request({
121
+ method: 'GET', url: '/api/v2/pages', params: { 'space-id': space.id, title, status: 'current', limit: 2 },
122
+ });
123
+ return response.data.results[0];
124
+ });
125
+ return page ? this.normalizePage(page) : undefined;
126
+ }
127
+ async resolveTarget(input) {
128
+ const trimmed = input.trim();
129
+ if (/^\d+$/.test(trimmed))
130
+ return this.getPage(trimmed);
131
+ let url;
132
+ try {
133
+ url = new URL(trimmed);
134
+ }
135
+ catch {
136
+ throw new Error('Confluence Cloud page locator must be a numeric page ID or an absolute page URL');
137
+ }
138
+ const base = new URL(this.baseUrl);
139
+ if (url.origin !== base.origin)
140
+ throw new Error(`Confluence target host must match ${base.origin}`);
141
+ const queryId = url.searchParams.get('pageId');
142
+ if (queryId && /^\d+$/.test(queryId))
143
+ return this.getPage(queryId);
144
+ const match = url.pathname.match(/\/(?:pages|content)\/(\d+)(?:\/|$)/);
145
+ if (match?.[1])
146
+ return this.getPage(match[1]);
147
+ throw new Error('Could not extract a Confluence Cloud page ID from --destination/--source');
148
+ }
149
+ async createPage(input) {
150
+ const space = await this.getSpaceByKey(input.spaceKey);
151
+ const response = await this.writeLimit(() => this.http.request({
152
+ method: 'POST', url: '/api/v2/pages', headers: { 'Content-Type': 'application/json' },
153
+ data: {
154
+ spaceId: space.id, status: 'current', title: input.title, parentId: input.parentId,
155
+ body: { representation: 'storage', value: input.storage },
156
+ },
157
+ }));
158
+ return this.normalizePage(response.data);
159
+ }
160
+ async updatePage(input) {
161
+ const current = await this.getPage(input.pageId);
162
+ const versionNumber = current.version?.number;
163
+ if (!versionNumber)
164
+ throw new Error(`Confluence Cloud page ${input.pageId} has no version information`);
165
+ const response = await this.writeLimit(() => this.http.request({
166
+ method: 'PUT', url: `/api/v2/pages/${encodeURIComponent(input.pageId)}`, headers: { 'Content-Type': 'application/json' },
167
+ data: {
168
+ id: input.pageId, status: 'current', title: input.title,
169
+ body: { representation: 'storage', value: input.storage },
170
+ version: { number: versionNumber + 1, message: 'Transferred by ywtc' },
171
+ },
172
+ }));
173
+ return this.normalizePage(response.data);
174
+ }
175
+ async findAttachment(pageId, filename) {
176
+ const response = await this.readLimit(() => this.http.request({
177
+ method: 'GET', url: `/rest/api/content/${encodeURIComponent(pageId)}/child/attachment`,
178
+ params: { filename, limit: 2, expand: 'extensions,metadata' },
179
+ }));
180
+ return response.data.results[0];
181
+ }
182
+ async uploadAttachment(input) {
183
+ return this.uploadLimit(async () => {
184
+ const form = new FormData();
185
+ form.append('file', input.file, {
186
+ filename: input.filename,
187
+ ...(input.mimeType ? { contentType: input.mimeType } : {}),
188
+ ...(input.contentLength !== undefined ? { knownLength: input.contentLength } : {}),
189
+ });
190
+ form.append('minorEdit', 'true');
191
+ const pageId = encodeURIComponent(input.pageId);
192
+ const url = input.existingAttachmentId
193
+ ? `/rest/api/content/${pageId}/child/attachment/${encodeURIComponent(input.existingAttachmentId)}/data`
194
+ : `/rest/api/content/${pageId}/child/attachment`;
195
+ const response = await this.http.request({
196
+ method: 'POST', url, headers: { ...form.getHeaders(), 'X-Atlassian-Token': 'nocheck' }, data: form,
197
+ maxBodyLength: Number.POSITIVE_INFINITY, maxContentLength: Number.POSITIVE_INFINITY,
198
+ });
199
+ return firstAttachment(response.data);
200
+ });
201
+ }
202
+ async listAttachments(pageId) {
203
+ const results = [];
204
+ let start = 0;
205
+ while (true) {
206
+ const response = await this.readLimit(() => this.http.request({
207
+ method: 'GET', url: `/rest/api/content/${encodeURIComponent(pageId)}/child/attachment`,
208
+ params: { start, limit: 100, expand: 'extensions,metadata' },
209
+ }));
210
+ results.push(...response.data.results);
211
+ const size = response.data.size ?? response.data.results.length;
212
+ if (!response.data._links?.next || size === 0)
213
+ break;
214
+ start += size;
215
+ }
216
+ return results;
217
+ }
218
+ async getDescendants(pageId) {
219
+ const results = [];
220
+ let cursor;
221
+ do {
222
+ const response = await this.readLimit(() => this.http.request({
223
+ method: 'GET',
224
+ url: `/api/v2/pages/${encodeURIComponent(pageId)}/descendants`,
225
+ params: { limit: 100, depth: 'all', ...(cursor ? { cursor } : {}) },
226
+ }));
227
+ for (const page of response.data.results)
228
+ results.push(await this.normalizePage(page));
229
+ const next = response.data._links?.next;
230
+ cursor = next ? new URL(next, `${this.baseUrl}/`).searchParams.get('cursor') ?? undefined : undefined;
231
+ } while (cursor);
232
+ return results;
233
+ }
234
+ async downloadAttachment(pageId, attachment, destination) {
235
+ return this.readLimit(async () => {
236
+ const link = attachment._links?.download ?? `/download/attachments/${encodeURIComponent(pageId)}/${encodeURIComponent(attachment.title)}`;
237
+ const base = new URL(this.baseUrl);
238
+ const url = /^https?:\/\//i.test(link)
239
+ ? link
240
+ : link.startsWith('/download/') ? `${this.baseUrl}${link}` : new URL(link, base.origin).toString();
241
+ const response = await this.http.request({ method: 'GET', url, responseType: 'stream' });
242
+ await mkdir(path.dirname(destination), { recursive: true });
243
+ const hash = createHash('sha256');
244
+ let size = 0;
245
+ const meter = new Transform({ transform(chunk, _encoding, callback) {
246
+ hash.update(chunk);
247
+ size += chunk.length;
248
+ callback(null, chunk);
249
+ } });
250
+ await pipeline(response.data, meter, createWriteStream(destination, { mode: 0o600 }));
251
+ const contentType = response.headers['content-type'];
252
+ return { path: destination, size, sha256: hash.digest('hex'), ...(typeof contentType === 'string' ? { mimeType: contentType } : {}) };
253
+ });
254
+ }
255
+ pageWebUrl(page) {
256
+ if (page._links?.webui)
257
+ return new URL(page._links.webui, `${this.baseUrl}/`).toString();
258
+ return `${this.baseUrl}/pages/viewpage.action?pageId=${encodeURIComponent(page.id)}`;
259
+ }
260
+ }
261
+ //# sourceMappingURL=confluence-cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence-cloud.js","sourceRoot":"","sources":["../../src/clients/confluence-cloud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ConfluenceConnectionProfile } from '../config.js';
2
+ import type { ConfluenceApi } from '../types.js';
3
+ export declare function createConfluenceClient(profile: ConfluenceConnectionProfile, timeoutMs: number): ConfluenceApi;
@@ -0,0 +1,8 @@
1
+ import { CloudConfluenceClient } from './confluence-cloud.js';
2
+ import { DataCenterConfluenceClient } from './confluence.js';
3
+ export function createConfluenceClient(profile, timeoutMs) {
4
+ return profile.deployment === 'cloud'
5
+ ? new CloudConfluenceClient(profile, timeoutMs, profile.limits)
6
+ : new DataCenterConfluenceClient(profile, timeoutMs, profile.limits);
7
+ }
8
+ //# sourceMappingURL=confluence-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence-factory.js","sourceRoot":"","sources":["../../src/clients/confluence-factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,qBAAqB,EAAC,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAC,0BAA0B,EAAC,MAAM,iBAAiB,CAAC;AAE3D,MAAM,UAAU,sBAAsB,CAAC,OAAoC,EAAE,SAAiB;IAC5F,OAAO,OAAO,CAAC,UAAU,KAAK,OAAO;QACnC,CAAC,CAAC,IAAI,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;QAC/D,CAAC,CAAC,IAAI,0BAA0B,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { Readable } from 'node:stream';
2
+ import type { ConfluenceConnectionProfile, NetworkLimits } from '../config.js';
3
+ import type { ConfluenceApi, ConfluenceAttachment, ConfluencePage, ConfluencePlatformInfo, DownloadedFile } from '../types.js';
4
+ type DataCenterConfig = Pick<ConfluenceConnectionProfile, 'baseUrl' | 'token'> & Partial<Pick<ConfluenceConnectionProfile, 'deployment' | 'authType' | 'name'>>;
5
+ export declare class DataCenterConfluenceClient implements ConfluenceApi {
6
+ private readonly config;
7
+ private readonly http;
8
+ private readonly readLimit;
9
+ private readonly writeLimit;
10
+ private readonly uploadLimit;
11
+ constructor(config: DataCenterConfig, timeoutMs: number, limits?: NetworkLimits);
12
+ preflight(): Promise<ConfluencePlatformInfo>;
13
+ getPage(id: string): Promise<ConfluencePage>;
14
+ findPageByTitle(spaceKey: string, title: string): Promise<ConfluencePage | undefined>;
15
+ resolveTarget(input: string): Promise<ConfluencePage>;
16
+ createPage(input: {
17
+ spaceKey: string;
18
+ parentId: string;
19
+ title: string;
20
+ storage: string;
21
+ }): Promise<ConfluencePage>;
22
+ updatePage(input: {
23
+ pageId: string;
24
+ title: string;
25
+ storage: string;
26
+ }): Promise<ConfluencePage>;
27
+ findAttachment(pageId: string, filename: string): Promise<ConfluenceAttachment | undefined>;
28
+ uploadAttachment(input: {
29
+ pageId: string;
30
+ filename: string;
31
+ file: Readable;
32
+ contentLength?: number;
33
+ mimeType?: string;
34
+ existingAttachmentId?: string;
35
+ }): Promise<ConfluenceAttachment>;
36
+ listAttachments(pageId: string): Promise<ConfluenceAttachment[]>;
37
+ getDescendants(pageId: string): Promise<ConfluencePage[]>;
38
+ downloadAttachment(pageId: string, attachment: ConfluenceAttachment, destination: string): Promise<DownloadedFile>;
39
+ pageWebUrl(page: ConfluencePage): string;
40
+ static isNotFound(error: unknown): boolean;
41
+ }
42
+ export {};