@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.
- package/.env.example +4 -0
- package/CHANGELOG.md +56 -0
- package/LICENSE +21 -0
- package/README.md +267 -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
|
@@ -0,0 +1,286 @@
|
|
|
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 { HttpRequestError, RetryingHttpClient } from '../http.js';
|
|
10
|
+
import { RequestRateLimiter } from '../rate-limiter.js';
|
|
11
|
+
function firstResult(payload) {
|
|
12
|
+
if (payload && typeof payload === 'object' && 'results' in payload) {
|
|
13
|
+
const first = payload.results[0];
|
|
14
|
+
if (!first)
|
|
15
|
+
throw new Error('Confluence returned an empty result');
|
|
16
|
+
return first;
|
|
17
|
+
}
|
|
18
|
+
return payload;
|
|
19
|
+
}
|
|
20
|
+
export class DataCenterConfluenceClient {
|
|
21
|
+
config;
|
|
22
|
+
http;
|
|
23
|
+
readLimit;
|
|
24
|
+
writeLimit;
|
|
25
|
+
uploadLimit;
|
|
26
|
+
constructor(config, timeoutMs, limits = {
|
|
27
|
+
readConcurrency: 4,
|
|
28
|
+
writeConcurrency: 2,
|
|
29
|
+
downloadConcurrency: 2,
|
|
30
|
+
uploadConcurrency: 2,
|
|
31
|
+
requestsPerSecond: 8,
|
|
32
|
+
burst: 10,
|
|
33
|
+
}) {
|
|
34
|
+
this.config = config;
|
|
35
|
+
const rateLimiter = new RequestRateLimiter(limits);
|
|
36
|
+
const readQueue = new PQueue({ concurrency: limits.readConcurrency });
|
|
37
|
+
const writeQueue = new PQueue({ concurrency: limits.writeConcurrency });
|
|
38
|
+
const uploadQueue = new PQueue({ concurrency: limits.uploadConcurrency });
|
|
39
|
+
this.readLimit = (task) => readQueue.add(task);
|
|
40
|
+
this.writeLimit = (task) => writeQueue.add(task);
|
|
41
|
+
this.uploadLimit = (task) => uploadQueue.add(task);
|
|
42
|
+
this.http = new RetryingHttpClient({
|
|
43
|
+
baseURL: config.baseUrl,
|
|
44
|
+
timeoutMs,
|
|
45
|
+
rateLimiter,
|
|
46
|
+
headers: {
|
|
47
|
+
Authorization: `Bearer ${config.token}`,
|
|
48
|
+
Accept: 'application/json',
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async preflight() {
|
|
53
|
+
return this.readLimit(async () => {
|
|
54
|
+
let systemInfo;
|
|
55
|
+
try {
|
|
56
|
+
const response = await this.http.request({
|
|
57
|
+
method: 'GET',
|
|
58
|
+
url: '/rest/api/settings/systemInfo',
|
|
59
|
+
});
|
|
60
|
+
systemInfo = response.data;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (!(error instanceof HttpRequestError) || ![403, 404].includes(error.status ?? 0))
|
|
64
|
+
throw error;
|
|
65
|
+
await this.http.request({
|
|
66
|
+
method: 'GET',
|
|
67
|
+
url: '/rest/api/content',
|
|
68
|
+
params: { type: 'page', status: 'current', limit: 1, expand: 'space,version,body.storage' },
|
|
69
|
+
});
|
|
70
|
+
return { deployment: 'data-center', product: 'Confluence Data Center', api: '/rest/api' };
|
|
71
|
+
}
|
|
72
|
+
const version = typeof systemInfo.version === 'string'
|
|
73
|
+
? systemInfo.version
|
|
74
|
+
: typeof systemInfo.versionNumber === 'string'
|
|
75
|
+
? systemInfo.versionNumber
|
|
76
|
+
: undefined;
|
|
77
|
+
if (version) {
|
|
78
|
+
const [major = 0, minor = 0] = version.split('.').map(Number);
|
|
79
|
+
if (Number.isFinite(major) && (major < 7 || (major === 7 && minor < 9))) {
|
|
80
|
+
throw new Error(`Unsupported Confluence Data Center ${version}: ywtc requires 7.9+ with Personal Access Tokens.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { deployment: 'data-center', product: 'Confluence Data Center', ...(version ? { version } : {}), api: '/rest/api' };
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async getPage(id) {
|
|
87
|
+
return this.readLimit(async () => {
|
|
88
|
+
const response = await this.http.request({
|
|
89
|
+
method: 'GET',
|
|
90
|
+
url: `/rest/api/content/${encodeURIComponent(id)}`,
|
|
91
|
+
params: { expand: 'space,version,ancestors,body.storage,body.view,operations' },
|
|
92
|
+
});
|
|
93
|
+
return response.data;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async findPageByTitle(spaceKey, title) {
|
|
97
|
+
return this.readLimit(async () => {
|
|
98
|
+
const response = await this.http.request({
|
|
99
|
+
method: 'GET',
|
|
100
|
+
url: '/rest/api/content',
|
|
101
|
+
params: { type: 'page', status: 'current', spaceKey, title, expand: 'space,version,ancestors', limit: 2 },
|
|
102
|
+
});
|
|
103
|
+
return response.data.results[0];
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async resolveTarget(input) {
|
|
107
|
+
const trimmed = input.trim();
|
|
108
|
+
if (/^\d+$/.test(trimmed))
|
|
109
|
+
return this.getPage(trimmed);
|
|
110
|
+
let url;
|
|
111
|
+
try {
|
|
112
|
+
url = new URL(trimmed);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new Error('Confluence page locator must be a numeric page ID or an absolute page URL');
|
|
116
|
+
}
|
|
117
|
+
const base = new URL(this.config.baseUrl);
|
|
118
|
+
if (url.origin !== base.origin)
|
|
119
|
+
throw new Error(`Confluence target host must match ${base.origin}`);
|
|
120
|
+
const queryId = url.searchParams.get('pageId');
|
|
121
|
+
if (queryId && /^\d+$/.test(queryId))
|
|
122
|
+
return this.getPage(queryId);
|
|
123
|
+
const pageIdMatch = url.pathname.match(/\/(?:pages|content)\/(\d+)(?:\/|$)/);
|
|
124
|
+
if (pageIdMatch?.[1])
|
|
125
|
+
return this.getPage(pageIdMatch[1]);
|
|
126
|
+
const displayMatch = url.pathname.match(/\/display\/([^/]+)\/([^/?#]+)/);
|
|
127
|
+
if (displayMatch?.[1] && displayMatch[2]) {
|
|
128
|
+
const spaceKey = decodeURIComponent(displayMatch[1]);
|
|
129
|
+
const title = decodeURIComponent(displayMatch[2].replace(/\+/g, ' '));
|
|
130
|
+
const page = await this.findPageByTitle(spaceKey, title);
|
|
131
|
+
if (page)
|
|
132
|
+
return this.getPage(page.id);
|
|
133
|
+
throw new Error(`Confluence target page not found: ${spaceKey}/${title}`);
|
|
134
|
+
}
|
|
135
|
+
throw new Error('Could not extract a Confluence page ID or display URL from --destination/--source');
|
|
136
|
+
}
|
|
137
|
+
async createPage(input) {
|
|
138
|
+
return this.writeLimit(async () => {
|
|
139
|
+
const response = await this.http.request({
|
|
140
|
+
method: 'POST',
|
|
141
|
+
url: '/rest/api/content',
|
|
142
|
+
headers: { 'Content-Type': 'application/json' },
|
|
143
|
+
data: {
|
|
144
|
+
type: 'page',
|
|
145
|
+
title: input.title,
|
|
146
|
+
ancestors: [{ id: input.parentId }],
|
|
147
|
+
space: { key: input.spaceKey },
|
|
148
|
+
body: { storage: { value: input.storage, representation: 'storage' } },
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
return response.data;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
async updatePage(input) {
|
|
155
|
+
return this.writeLimit(async () => {
|
|
156
|
+
const current = await this.getPage(input.pageId);
|
|
157
|
+
if (!current.version?.number)
|
|
158
|
+
throw new Error(`Confluence page ${input.pageId} has no version information`);
|
|
159
|
+
const response = await this.http.request({
|
|
160
|
+
method: 'PUT',
|
|
161
|
+
url: `/rest/api/content/${encodeURIComponent(input.pageId)}`,
|
|
162
|
+
headers: { 'Content-Type': 'application/json' },
|
|
163
|
+
data: {
|
|
164
|
+
id: input.pageId,
|
|
165
|
+
type: 'page',
|
|
166
|
+
title: input.title,
|
|
167
|
+
version: {
|
|
168
|
+
number: current.version.number + 1,
|
|
169
|
+
minorEdit: true,
|
|
170
|
+
message: 'Transferred by ywtc',
|
|
171
|
+
},
|
|
172
|
+
body: { storage: { value: input.storage, representation: 'storage' } },
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
return response.data;
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async findAttachment(pageId, filename) {
|
|
179
|
+
return this.readLimit(async () => {
|
|
180
|
+
const response = await this.http.request({
|
|
181
|
+
method: 'GET',
|
|
182
|
+
url: `/rest/api/content/${encodeURIComponent(pageId)}/child/attachment`,
|
|
183
|
+
params: { filename, limit: 2, expand: 'extensions,metadata' },
|
|
184
|
+
});
|
|
185
|
+
return response.data.results[0];
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
async uploadAttachment(input) {
|
|
189
|
+
return this.uploadLimit(async () => {
|
|
190
|
+
const form = new FormData();
|
|
191
|
+
form.append('file', input.file, {
|
|
192
|
+
filename: input.filename,
|
|
193
|
+
...(input.mimeType ? { contentType: input.mimeType } : {}),
|
|
194
|
+
...(input.contentLength !== undefined ? { knownLength: input.contentLength } : {}),
|
|
195
|
+
});
|
|
196
|
+
form.append('minorEdit', 'true');
|
|
197
|
+
form.append('comment', 'Transferred by ywtc');
|
|
198
|
+
const pageId = encodeURIComponent(input.pageId);
|
|
199
|
+
const url = input.existingAttachmentId
|
|
200
|
+
? `/rest/api/content/${pageId}/child/attachment/${encodeURIComponent(input.existingAttachmentId)}/data`
|
|
201
|
+
: `/rest/api/content/${pageId}/child/attachment`;
|
|
202
|
+
const response = await this.http.request({
|
|
203
|
+
method: 'POST',
|
|
204
|
+
url,
|
|
205
|
+
params: { minorEdit: true },
|
|
206
|
+
headers: {
|
|
207
|
+
...form.getHeaders(),
|
|
208
|
+
'X-Atlassian-Token': 'nocheck',
|
|
209
|
+
},
|
|
210
|
+
data: form,
|
|
211
|
+
maxBodyLength: Number.POSITIVE_INFINITY,
|
|
212
|
+
maxContentLength: Number.POSITIVE_INFINITY,
|
|
213
|
+
});
|
|
214
|
+
return firstResult(response.data);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
async listAttachments(pageId) {
|
|
218
|
+
return this.readLimit(async () => {
|
|
219
|
+
const results = [];
|
|
220
|
+
let start = 0;
|
|
221
|
+
while (true) {
|
|
222
|
+
const response = await this.http.request({
|
|
223
|
+
method: 'GET',
|
|
224
|
+
url: `/rest/api/content/${encodeURIComponent(pageId)}/child/attachment`,
|
|
225
|
+
params: { start, limit: 100, expand: 'extensions,metadata' },
|
|
226
|
+
});
|
|
227
|
+
results.push(...response.data.results);
|
|
228
|
+
const size = response.data.size ?? response.data.results.length;
|
|
229
|
+
if (!response.data._links?.next && size < 100)
|
|
230
|
+
break;
|
|
231
|
+
if (size === 0)
|
|
232
|
+
break;
|
|
233
|
+
start += size;
|
|
234
|
+
}
|
|
235
|
+
return results;
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
async getDescendants(pageId) {
|
|
239
|
+
return this.readLimit(async () => {
|
|
240
|
+
const results = [];
|
|
241
|
+
let start = 0;
|
|
242
|
+
while (true) {
|
|
243
|
+
const response = await this.http.request({
|
|
244
|
+
method: 'GET',
|
|
245
|
+
url: `/rest/api/content/${encodeURIComponent(pageId)}/descendant/page`,
|
|
246
|
+
params: { start, limit: 100, expand: 'space,version,ancestors,body.storage,body.view' },
|
|
247
|
+
});
|
|
248
|
+
results.push(...response.data.results);
|
|
249
|
+
const size = response.data.size ?? response.data.results.length;
|
|
250
|
+
if (!response.data._links?.next || size === 0)
|
|
251
|
+
break;
|
|
252
|
+
start += size;
|
|
253
|
+
}
|
|
254
|
+
return results;
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async downloadAttachment(pageId, attachment, destination) {
|
|
258
|
+
return this.readLimit(async () => {
|
|
259
|
+
const link = attachment._links?.download ?? `/download/attachments/${encodeURIComponent(pageId)}/${encodeURIComponent(attachment.title)}`;
|
|
260
|
+
const url = /^https?:\/\//i.test(link)
|
|
261
|
+
? link
|
|
262
|
+
: link.startsWith('/download/') ? `${this.config.baseUrl}${link}` : new URL(link, `${this.config.baseUrl}/`).toString();
|
|
263
|
+
const response = await this.http.request({ method: 'GET', url, responseType: 'stream' });
|
|
264
|
+
await mkdir(path.dirname(destination), { recursive: true });
|
|
265
|
+
const hash = createHash('sha256');
|
|
266
|
+
let size = 0;
|
|
267
|
+
const meter = new Transform({ transform(chunk, _encoding, callback) {
|
|
268
|
+
hash.update(chunk);
|
|
269
|
+
size += chunk.length;
|
|
270
|
+
callback(null, chunk);
|
|
271
|
+
} });
|
|
272
|
+
await pipeline(response.data, meter, createWriteStream(destination, { mode: 0o600 }));
|
|
273
|
+
const contentType = response.headers['content-type'];
|
|
274
|
+
return { path: destination, size, sha256: hash.digest('hex'), ...(typeof contentType === 'string' ? { mimeType: contentType } : {}) };
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
pageWebUrl(page) {
|
|
278
|
+
if (page._links?.webui)
|
|
279
|
+
return new URL(page._links.webui, `${this.config.baseUrl}/`).toString();
|
|
280
|
+
return `${this.config.baseUrl}/pages/viewpage.action?pageId=${encodeURIComponent(page.id)}`;
|
|
281
|
+
}
|
|
282
|
+
static isNotFound(error) {
|
|
283
|
+
return error instanceof HttpRequestError && error.status === 404;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=confluence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confluence.js","sourceRoot":"","sources":["../../src/clients/confluence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { NetworkLimits, YandexConnectionProfile } from '../config.js';
|
|
2
|
+
import type { DownloadedFile, YandexAttachment, YandexGrid, YandexGridSummary, YandexPageDetails, YandexPageIdentity, YandexWikiApi } from '../types.js';
|
|
3
|
+
export declare class YandexWikiClient implements YandexWikiApi {
|
|
4
|
+
readonly config: YandexConnectionProfile;
|
|
5
|
+
private readonly authenticated;
|
|
6
|
+
private readonly readQueue;
|
|
7
|
+
private readonly writeQueue;
|
|
8
|
+
private readonly downloadQueue;
|
|
9
|
+
private readonly uploadQueue;
|
|
10
|
+
constructor(config: YandexConnectionProfile, timeoutMs: number, limits?: NetworkLimits);
|
|
11
|
+
getPageBySlug(slug: string): Promise<YandexPageDetails>;
|
|
12
|
+
getPageById(id: number): Promise<YandexPageDetails>;
|
|
13
|
+
private paginate;
|
|
14
|
+
getDescendants(id: number): Promise<YandexPageIdentity[]>;
|
|
15
|
+
getAttachments(pageId: number): Promise<YandexAttachment[]>;
|
|
16
|
+
getPageGrids(pageId: number): Promise<YandexGridSummary[]>;
|
|
17
|
+
getGrid(id: string): Promise<YandexGrid>;
|
|
18
|
+
download(pageId: number, attachmentId: number, destination: string): Promise<DownloadedFile>;
|
|
19
|
+
createPage(input: {
|
|
20
|
+
slug: string;
|
|
21
|
+
title: string;
|
|
22
|
+
content: string;
|
|
23
|
+
}): Promise<YandexPageDetails>;
|
|
24
|
+
updatePage(input: {
|
|
25
|
+
id: number;
|
|
26
|
+
title: string;
|
|
27
|
+
content: string;
|
|
28
|
+
}): Promise<YandexPageDetails>;
|
|
29
|
+
uploadAttachment(input: {
|
|
30
|
+
pageId: number;
|
|
31
|
+
filename: string;
|
|
32
|
+
path: string;
|
|
33
|
+
size: number;
|
|
34
|
+
}): Promise<YandexAttachment>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { createWriteStream } from 'node:fs';
|
|
3
|
+
import { open } from 'node:fs/promises';
|
|
4
|
+
import { mkdir } from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { Transform } from 'node:stream';
|
|
7
|
+
import { pipeline } from 'node:stream/promises';
|
|
8
|
+
import PQueue from 'p-queue';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { RetryingHttpClient } from '../http.js';
|
|
11
|
+
import { RequestRateLimiter } from '../rate-limiter.js';
|
|
12
|
+
const pageIdentitySchema = z.object({ id: z.number().int(), slug: z.string().min(1) }).passthrough();
|
|
13
|
+
const breadcrumbSchema = z.object({
|
|
14
|
+
id: z.number().int().optional(), slug: z.string(), title: z.string(), page_exists: z.boolean().optional(),
|
|
15
|
+
}).passthrough();
|
|
16
|
+
const pageSchema = z.object({
|
|
17
|
+
id: z.number().int(),
|
|
18
|
+
slug: z.string().min(1),
|
|
19
|
+
title: z.string(),
|
|
20
|
+
page_type: z.enum(['page', 'grid', 'wysiwyg', 'template']),
|
|
21
|
+
content: z.string().optional(),
|
|
22
|
+
breadcrumbs: z.array(breadcrumbSchema).optional(),
|
|
23
|
+
redirect: z.object({
|
|
24
|
+
page_id: z.number().int(),
|
|
25
|
+
redirect_target: z.object({
|
|
26
|
+
id: z.number().int(), slug: z.string(), title: z.string(),
|
|
27
|
+
page_type: z.enum(['page', 'grid', 'wysiwyg', 'template']).nullable().optional(),
|
|
28
|
+
}).passthrough(),
|
|
29
|
+
}).passthrough().nullable().optional(),
|
|
30
|
+
attributes: z.object({
|
|
31
|
+
created_at: z.string().optional(), modified_at: z.string().optional(), lang: z.string().optional(),
|
|
32
|
+
is_readonly: z.boolean().optional(), is_draft: z.boolean().optional(),
|
|
33
|
+
}).passthrough().optional(),
|
|
34
|
+
}).passthrough();
|
|
35
|
+
const attachmentSchema = z.object({
|
|
36
|
+
id: z.number().int(), name: z.string().min(1), is_downloadable: z.boolean(), download_url: z.string(),
|
|
37
|
+
size: z.union([z.string(), z.number()]), description: z.string().optional(), created_at: z.string().optional(),
|
|
38
|
+
mimetype: z.string().optional(), has_preview: z.boolean().optional(), check_status: z.string().optional(),
|
|
39
|
+
}).passthrough();
|
|
40
|
+
const gridSummarySchema = z.object({ id: z.string(), title: z.string(), created_at: z.string().optional() }).passthrough();
|
|
41
|
+
const gridSchema = z.object({
|
|
42
|
+
id: z.union([z.string(), z.number()]), title: z.string(),
|
|
43
|
+
page: pageIdentitySchema.optional(),
|
|
44
|
+
structure: z.object({
|
|
45
|
+
columns: z.array(z.object({
|
|
46
|
+
id: z.string().optional(), slug: z.string(), title: z.string(), type: z.string().optional(),
|
|
47
|
+
format: z.enum(['yfm', 'wom', 'plain']).nullable().optional(),
|
|
48
|
+
width: z.union([z.number(), z.string()]).nullable().optional().transform((value) => {
|
|
49
|
+
if (value === undefined || value === null)
|
|
50
|
+
return undefined;
|
|
51
|
+
const parsed = Number(value);
|
|
52
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
53
|
+
}),
|
|
54
|
+
width_units: z.enum(['%', 'px']).nullable().optional(),
|
|
55
|
+
}).passthrough()),
|
|
56
|
+
default_sort: z.array(z.unknown()).optional(),
|
|
57
|
+
}).passthrough(),
|
|
58
|
+
rows: z.array(z.object({
|
|
59
|
+
id: z.string(), row: z.array(z.unknown()), pinned: z.boolean().nullable().optional().transform((value) => value ?? undefined),
|
|
60
|
+
color: z.string().nullable().optional().transform((value) => value ?? undefined),
|
|
61
|
+
}).passthrough()),
|
|
62
|
+
rich_text_format: z.enum(['yfm', 'wom', 'plain']).optional(), revision: z.string().optional(),
|
|
63
|
+
}).passthrough();
|
|
64
|
+
function parseResponse(schema, payload, operation) {
|
|
65
|
+
const result = schema.safeParse(payload);
|
|
66
|
+
if (result.success)
|
|
67
|
+
return result.data;
|
|
68
|
+
const fields = result.error.issues.map((issue) => issue.path.join('.') || 'response').join(', ');
|
|
69
|
+
throw new Error(`Yandex Wiki Public API v1 schema error in ${operation}: missing or invalid ${fields}`);
|
|
70
|
+
}
|
|
71
|
+
export class YandexWikiClient {
|
|
72
|
+
config;
|
|
73
|
+
authenticated;
|
|
74
|
+
readQueue;
|
|
75
|
+
writeQueue;
|
|
76
|
+
downloadQueue;
|
|
77
|
+
uploadQueue;
|
|
78
|
+
constructor(config, timeoutMs, limits = {
|
|
79
|
+
readConcurrency: 4,
|
|
80
|
+
writeConcurrency: 2,
|
|
81
|
+
downloadConcurrency: 2,
|
|
82
|
+
uploadConcurrency: 2,
|
|
83
|
+
requestsPerSecond: 8,
|
|
84
|
+
burst: 8,
|
|
85
|
+
}) {
|
|
86
|
+
this.config = config;
|
|
87
|
+
const authorization = config.authType === 'oauth' ? `OAuth ${config.token}` : `Bearer ${config.token}`;
|
|
88
|
+
const orgHeader = config.organization.type === 'yandex360' ? 'X-Org-Id' : 'X-Cloud-Org-Id';
|
|
89
|
+
const rateLimiter = new RequestRateLimiter(limits);
|
|
90
|
+
this.readQueue = new PQueue({ concurrency: limits.readConcurrency });
|
|
91
|
+
this.writeQueue = new PQueue({ concurrency: limits.writeConcurrency });
|
|
92
|
+
this.downloadQueue = new PQueue({ concurrency: limits.downloadConcurrency });
|
|
93
|
+
this.uploadQueue = new PQueue({ concurrency: limits.uploadConcurrency });
|
|
94
|
+
this.authenticated = new RetryingHttpClient({
|
|
95
|
+
baseURL: config.apiUrl,
|
|
96
|
+
timeoutMs,
|
|
97
|
+
rateLimiter,
|
|
98
|
+
headers: {
|
|
99
|
+
Authorization: authorization,
|
|
100
|
+
[orgHeader]: config.organization.id,
|
|
101
|
+
Accept: 'application/json',
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async getPageBySlug(slug) {
|
|
106
|
+
return this.readQueue.add(async () => {
|
|
107
|
+
const response = await this.authenticated.request({
|
|
108
|
+
method: 'GET',
|
|
109
|
+
url: '/pages',
|
|
110
|
+
params: { slug, fields: 'breadcrumbs,redirect,attributes,content' },
|
|
111
|
+
});
|
|
112
|
+
return parseResponse(pageSchema, response.data, 'GET /pages by slug');
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async getPageById(id) {
|
|
116
|
+
return this.readQueue.add(async () => {
|
|
117
|
+
const response = await this.authenticated.request({
|
|
118
|
+
method: 'GET',
|
|
119
|
+
url: `/pages/${id}`,
|
|
120
|
+
params: { fields: 'breadcrumbs,redirect,attributes,content' },
|
|
121
|
+
});
|
|
122
|
+
return parseResponse(pageSchema, response.data, `GET /pages/${id}`);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async paginate(url, schema, params = {}) {
|
|
126
|
+
const results = [];
|
|
127
|
+
let cursor;
|
|
128
|
+
do {
|
|
129
|
+
const response = await this.authenticated.request({
|
|
130
|
+
method: 'GET',
|
|
131
|
+
url,
|
|
132
|
+
params: { ...params, page_size: 100, ...(cursor ? { cursor } : {}) },
|
|
133
|
+
});
|
|
134
|
+
const page = parseResponse(z.object({ results: z.array(schema), next_cursor: z.string().nullable().optional() }).passthrough(), response.data, `GET ${url}`);
|
|
135
|
+
results.push(...page.results);
|
|
136
|
+
cursor = page.next_cursor || undefined;
|
|
137
|
+
} while (cursor);
|
|
138
|
+
return results;
|
|
139
|
+
}
|
|
140
|
+
getDescendants(id) {
|
|
141
|
+
return this.readQueue.add(() => this.paginate(`/pages/${id}/descendants`, pageIdentitySchema, {
|
|
142
|
+
actuality: 'actual',
|
|
143
|
+
include_self: false,
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
getAttachments(pageId) {
|
|
147
|
+
return this.readQueue.add(() => this.paginate(`/pages/${pageId}/attachments`, attachmentSchema, { order_by: 'name' }));
|
|
148
|
+
}
|
|
149
|
+
getPageGrids(pageId) {
|
|
150
|
+
return this.readQueue.add(() => this.paginate(`/pages/${pageId}/grids`, gridSummarySchema, { order_by: 'created_at' }));
|
|
151
|
+
}
|
|
152
|
+
async getGrid(id) {
|
|
153
|
+
return this.readQueue.add(async () => {
|
|
154
|
+
const response = await this.authenticated.request({
|
|
155
|
+
method: 'GET',
|
|
156
|
+
url: `/grids/${encodeURIComponent(id)}`,
|
|
157
|
+
params: { fields: 'attributes' },
|
|
158
|
+
});
|
|
159
|
+
return parseResponse(gridSchema, response.data, `GET /grids/${id}`);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
async download(pageId, attachmentId, destination) {
|
|
163
|
+
return this.downloadQueue.add(async () => {
|
|
164
|
+
const response = await this.authenticated.request({
|
|
165
|
+
method: 'GET',
|
|
166
|
+
url: `/pages/${pageId}/attachments/${attachmentId}/download`,
|
|
167
|
+
responseType: 'stream',
|
|
168
|
+
});
|
|
169
|
+
await mkdir(path.dirname(destination), { recursive: true });
|
|
170
|
+
const hash = createHash('sha256');
|
|
171
|
+
let size = 0;
|
|
172
|
+
const meter = new Transform({
|
|
173
|
+
transform(chunk, _encoding, callback) {
|
|
174
|
+
hash.update(chunk);
|
|
175
|
+
size += chunk.length;
|
|
176
|
+
callback(null, chunk);
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
await pipeline(response.data, meter, createWriteStream(destination, { mode: 0o600 }));
|
|
180
|
+
const contentType = response.headers['content-type'];
|
|
181
|
+
return {
|
|
182
|
+
path: destination,
|
|
183
|
+
size,
|
|
184
|
+
sha256: hash.digest('hex'),
|
|
185
|
+
...(typeof contentType === 'string' ? { mimeType: contentType } : {}),
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
async createPage(input) {
|
|
190
|
+
return this.writeQueue.add(async () => {
|
|
191
|
+
const response = await this.authenticated.request({
|
|
192
|
+
method: 'POST',
|
|
193
|
+
url: '/pages',
|
|
194
|
+
params: { is_silent: true, fields: 'breadcrumbs,redirect,attributes,content' },
|
|
195
|
+
headers: { 'Content-Type': 'application/json' },
|
|
196
|
+
data: { slug: input.slug, title: input.title, content: input.content, access_policy: { access_type: 'inherited' } },
|
|
197
|
+
retryMode: 'never',
|
|
198
|
+
});
|
|
199
|
+
return parseResponse(pageSchema, response.data, 'POST /pages');
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
async updatePage(input) {
|
|
203
|
+
return this.writeQueue.add(async () => {
|
|
204
|
+
const response = await this.authenticated.request({
|
|
205
|
+
method: 'POST',
|
|
206
|
+
url: `/pages/${input.id}`,
|
|
207
|
+
params: { allow_merge: false, is_silent: true, fields: 'breadcrumbs,redirect,attributes,content' },
|
|
208
|
+
headers: { 'Content-Type': 'application/json' },
|
|
209
|
+
data: { title: input.title, content: input.content },
|
|
210
|
+
retryMode: 'never',
|
|
211
|
+
});
|
|
212
|
+
return parseResponse(pageSchema, response.data, `POST /pages/${input.id}`);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
async uploadAttachment(input) {
|
|
216
|
+
return this.uploadQueue.add(async () => {
|
|
217
|
+
const session = await this.authenticated.request({
|
|
218
|
+
method: 'POST', url: '/upload_sessions', headers: { 'Content-Type': 'application/json' },
|
|
219
|
+
data: { file_name: input.filename, file_size: input.size }, retryMode: 'never',
|
|
220
|
+
});
|
|
221
|
+
if (!session.data.session_id)
|
|
222
|
+
throw new Error('Yandex Wiki upload session response is missing session_id');
|
|
223
|
+
const handle = await open(input.path, 'r');
|
|
224
|
+
try {
|
|
225
|
+
const chunkSize = 5 * 1_024 * 1_024;
|
|
226
|
+
let partNumber = 1;
|
|
227
|
+
for await (const chunk of handle.createReadStream({ highWaterMark: chunkSize })) {
|
|
228
|
+
await this.authenticated.request({
|
|
229
|
+
method: 'PUT',
|
|
230
|
+
url: `/upload_sessions/${encodeURIComponent(session.data.session_id)}/upload_part`,
|
|
231
|
+
params: { part_number: partNumber },
|
|
232
|
+
headers: { 'Content-Type': 'application/octet-stream' },
|
|
233
|
+
data: chunk,
|
|
234
|
+
retryMode: 'always',
|
|
235
|
+
maxBodyLength: chunkSize,
|
|
236
|
+
});
|
|
237
|
+
partNumber += 1;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
await handle.close();
|
|
242
|
+
}
|
|
243
|
+
await this.authenticated.request({
|
|
244
|
+
method: 'POST', url: `/upload_sessions/${encodeURIComponent(session.data.session_id)}/finish`, retryMode: 'never',
|
|
245
|
+
});
|
|
246
|
+
const attached = await this.authenticated.request({
|
|
247
|
+
method: 'POST', url: `/pages/${input.pageId}/attachments`, headers: { 'Content-Type': 'application/json' },
|
|
248
|
+
data: { upload_sessions: [session.data.session_id] }, retryMode: 'never',
|
|
249
|
+
});
|
|
250
|
+
const attachment = attached.data.results?.[0];
|
|
251
|
+
return parseResponse(attachmentSchema, attachment, `POST /pages/${input.pageId}/attachments`);
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=yandex-wiki.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yandex-wiki.js","sourceRoot":"","sources":["../../src/clients/yandex-wiki.ts"],"names":[],"mappings":"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"}
|