@iwonz/ywtc 0.0.0-stage → 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.
Files changed (94) hide show
  1. package/.env.example +4 -0
  2. package/CHANGELOG.md +39 -0
  3. package/LICENSE +21 -0
  4. package/README.md +259 -2
  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 +110 -4
  94. 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":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AACvC,OAAO,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAC9C,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,SAAS,CAAC;AAE7B,OAAO,EAAC,gBAAgB,EAAE,kBAAkB,EAAC,MAAM,YAAY,CAAC;AAChE,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAWtD,SAAS,WAAW,CAAI,OAA8B;IACpD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QACnE,MAAM,KAAK,GAAI,OAA6B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAY,CAAC;AACtB,CAAC;AAKD,MAAM,OAAO,0BAA0B;IAOlB;IANF,IAAI,CAAqB;IACzB,SAAS,CAAc;IACvB,UAAU,CAAc;IACxB,WAAW,CAAc;IAE1C,YACmB,MAAwB,EACzC,SAAiB,EACjB,SAAwB;QACtB,eAAe,EAAE,CAAC;QAClB,gBAAgB,EAAE,CAAC;QACnB,mBAAmB,EAAE,CAAC;QACtB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,KAAK,EAAE,EAAE;KACV;QATgB,WAAM,GAAN,MAAM,CAAkB;QAWzC,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,EAAC,WAAW,EAAE,MAAM,CAAC,eAAe,EAAC,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,EAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,EAAC,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,EAAC,WAAW,EAAE,MAAM,CAAC,iBAAiB,EAAC,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,GAAG,CAAI,IAAsB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAe,CAAC;QAClF,IAAI,CAAC,UAAU,GAAG,CAAI,IAAsB,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAe,CAAC;QACpF,IAAI,CAAC,WAAW,GAAG,CAAI,IAAsB,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAe,CAAC;QACtF,IAAI,CAAC,IAAI,GAAG,IAAI,kBAAkB,CAAC;YACjC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS;YACT,WAAW;YACX,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;gBACvC,MAAM,EAAE,kBAAkB;aAC3B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC/B,IAAI,UAAmC,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAA0B;oBAChE,MAAM,EAAE,KAAK;oBACb,GAAG,EAAE,+BAA+B;iBACrC,CAAC,CAAC;gBACH,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,KAAK,YAAY,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;oBAAE,MAAM,KAAK,CAAC;gBACjG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAiC;oBACtD,MAAM,EAAE,KAAK;oBACb,GAAG,EAAE,mBAAmB;oBACxB,MAAM,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAC;iBAC1F,CAAC,CAAC;gBACH,OAAO,EAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,wBAAwB,EAAE,GAAG,EAAE,WAAW,EAAC,CAAC;YAC1F,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ;gBACpD,CAAC,CAAC,UAAU,CAAC,OAAO;gBACpB,CAAC,CAAC,OAAO,UAAU,CAAC,aAAa,KAAK,QAAQ;oBAC5C,CAAC,CAAC,UAAU,CAAC,aAAa;oBAC1B,CAAC,CAAC,SAAS,CAAC;YAChB,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC9D,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxE,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,mDAAmD,CAAC,CAAC;gBACpH,CAAC;YACH,CAAC;YACD,OAAO,EAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,wBAAwB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAC,CAAC;QACzH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAiB;gBACvD,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,qBAAqB,kBAAkB,CAAC,EAAE,CAAC,EAAE;gBAClD,MAAM,EAAE,EAAC,MAAM,EAAE,2DAA2D,EAAC;aAC9E,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,KAAa;QACnD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAiC;gBACvE,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,mBAAmB;gBACxB,MAAM,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,CAAC,EAAC;aACxG,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExD,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAEpG,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEnE,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC7E,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1D,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACzE,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACvG,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAA2E;QAC1F,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAiB;gBACvD,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,mBAAmB;gBACxB,OAAO,EAAE,EAAC,cAAc,EAAE,kBAAkB,EAAC;gBAC7C,IAAI,EAAE;oBACJ,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,SAAS,EAAE,CAAC,EAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAC,CAAC;oBACjC,KAAK,EAAE,EAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAC;oBAC5B,IAAI,EAAE,EAAC,OAAO,EAAE,EAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAC,EAAC;iBACnE;aACF,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAuD;QACtE,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,MAAM,6BAA6B,CAAC,CAAC;YAC5G,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAiB;gBACvD,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,qBAAqB,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;gBAC5D,OAAO,EAAE,EAAC,cAAc,EAAE,kBAAkB,EAAC;gBAC7C,IAAI,EAAE;oBACJ,EAAE,EAAE,KAAK,CAAC,MAAM;oBAChB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,OAAO,EAAE;wBACP,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;wBAClC,SAAS,EAAE,IAAI;wBACf,OAAO,EAAE,qBAAqB;qBAC/B;oBACD,IAAI,EAAE,EAAC,OAAO,EAAE,EAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAC,EAAC;iBACnE;aACF,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,QAAgB;QACnD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAuC;gBAC7E,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,qBAAqB,kBAAkB,CAAC,MAAM,CAAC,mBAAmB;gBACvE,MAAM,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAC;aAC5D,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAOtB;QACC,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;YACjC,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE;gBAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAC,WAAW,EAAE,KAAK,CAAC,aAAa,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACjF,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,KAAK,CAAC,oBAAoB;gBACpC,CAAC,CAAC,qBAAqB,MAAM,qBAAqB,kBAAkB,CAAC,KAAK,CAAC,oBAAoB,CAAC,OAAO;gBACvG,CAAC,CAAC,qBAAqB,MAAM,mBAAmB,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAA8D;gBACpG,MAAM,EAAE,MAAM;gBACd,GAAG;gBACH,MAAM,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC;gBACzB,OAAO,EAAE;oBACP,GAAG,IAAI,CAAC,UAAU,EAAE;oBACpB,mBAAmB,EAAE,SAAS;iBAC/B;gBACD,IAAI,EAAE,IAAI;gBACV,aAAa,EAAE,MAAM,CAAC,iBAAiB;gBACvC,gBAAgB,EAAE,MAAM,CAAC,iBAAiB;aAC3C,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAuC;oBAC7E,MAAM,EAAE,KAAK;oBACb,GAAG,EAAE,qBAAqB,kBAAkB,CAAC,MAAM,CAAC,mBAAmB;oBACvE,MAAM,EAAE,EAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,qBAAqB,EAAC;iBAC3D,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG;oBAAE,MAAM;gBACrD,IAAI,IAAI,KAAK,CAAC;oBAAE,MAAM;gBACtB,KAAK,IAAI,IAAI,CAAC;YAChB,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,OAAO,GAAqB,EAAE,CAAC;YACrC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAiC;oBACvE,MAAM,EAAE,KAAK;oBACb,GAAG,EAAE,qBAAqB,kBAAkB,CAAC,MAAM,CAAC,kBAAkB;oBACtE,MAAM,EAAE,EAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,gDAAgD,EAAC;iBACtF,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,KAAK,CAAC;oBAAE,MAAM;gBACrD,KAAK,IAAI,IAAI,CAAC;YAChB,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAc,EAAE,UAAgC,EAAE,WAAmB;QAC5F,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,IAAI,yBAAyB,kBAAkB,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1I,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;gBACpC,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC1H,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAW,EAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAC,CAAC,CAAC;YACjG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAC,SAAS,CAAC,KAAa,EAAE,SAAS,EAAE,QAAQ;oBACvE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACnB,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;oBACrB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACxB,CAAC,EAAC,CAAC,CAAC;YACJ,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,iBAAiB,CAAC,WAAW,EAAE,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC;YACpF,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACrD,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,QAAQ,EAAE,WAAW,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC;QACpI,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,IAAoB;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK;YAAE,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChG,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,iCAAiC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,KAAc;QAC9B,OAAO,KAAK,YAAY,gBAAgB,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC;IACnE,CAAC;CACF"}
@@ -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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"}