@iwonz/ywtc 0.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +4 -0
- package/CHANGELOG.md +39 -0
- package/LICENSE +21 -0
- package/README.md +258 -1
- package/dist/adapters/confluence.d.ts +46 -0
- package/dist/adapters/confluence.js +187 -0
- package/dist/adapters/confluence.js.map +1 -0
- package/dist/adapters/factory.d.ts +3 -0
- package/dist/adapters/factory.js +11 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/yandex.d.ts +45 -0
- package/dist/adapters/yandex.js +233 -0
- package/dist/adapters/yandex.js.map +1 -0
- package/dist/cli-arguments.d.ts +41 -0
- package/dist/cli-arguments.js +149 -0
- package/dist/cli-arguments.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +180 -0
- package/dist/cli.js.map +1 -0
- package/dist/clients/confluence-cloud.d.ts +45 -0
- package/dist/clients/confluence-cloud.js +261 -0
- package/dist/clients/confluence-cloud.js.map +1 -0
- package/dist/clients/confluence-factory.d.ts +3 -0
- package/dist/clients/confluence-factory.js +8 -0
- package/dist/clients/confluence-factory.js.map +1 -0
- package/dist/clients/confluence.d.ts +42 -0
- package/dist/clients/confluence.js +286 -0
- package/dist/clients/confluence.js.map +1 -0
- package/dist/clients/yandex-wiki.d.ts +35 -0
- package/dist/clients/yandex-wiki.js +255 -0
- package/dist/clients/yandex-wiki.js.map +1 -0
- package/dist/config.d.ts +52 -0
- package/dist/config.js +177 -0
- package/dist/config.js.map +1 -0
- package/dist/content-model.d.ts +12 -0
- package/dist/content-model.js +416 -0
- package/dist/content-model.js.map +1 -0
- package/dist/conversion.d.ts +43 -0
- package/dist/conversion.js +450 -0
- package/dist/conversion.js.map +1 -0
- package/dist/doctor.d.ts +24 -0
- package/dist/doctor.js +45 -0
- package/dist/doctor.js.map +1 -0
- package/dist/domain.d.ts +202 -0
- package/dist/domain.js +18 -0
- package/dist/domain.js.map +1 -0
- package/dist/filesystem-export.d.ts +53 -0
- package/dist/filesystem-export.js +243 -0
- package/dist/filesystem-export.js.map +1 -0
- package/dist/graph.d.ts +13 -0
- package/dist/graph.js +121 -0
- package/dist/graph.js.map +1 -0
- package/dist/http.d.ts +26 -0
- package/dist/http.js +100 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +4 -0
- package/dist/input.js +56 -0
- package/dist/input.js.map +1 -0
- package/dist/locators.d.ts +24 -0
- package/dist/locators.js +84 -0
- package/dist/locators.js.map +1 -0
- package/dist/logger.d.ts +7 -0
- package/dist/logger.js +28 -0
- package/dist/logger.js.map +1 -0
- package/dist/migrator.d.ts +53 -0
- package/dist/migrator.js +669 -0
- package/dist/migrator.js.map +1 -0
- package/dist/rate-limiter.d.ts +12 -0
- package/dist/rate-limiter.js +31 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/report.d.ts +101 -0
- package/dist/report.js +106 -0
- package/dist/report.js.map +1 -0
- package/dist/state.d.ts +119 -0
- package/dist/state.js +201 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +197 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/updater.d.ts +24 -0
- package/dist/updater.js +92 -0
- package/dist/updater.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/dist/workspace.d.ts +29 -0
- package/dist/workspace.js +157 -0
- package/dist/workspace.js.map +1 -0
- package/docs/assets/readme-header.png +0 -0
- package/package.json +108 -3
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -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,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 {};
|