confluence-exporter 1.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/.eslintrc.cjs +18 -0
- package/.github/copilot-instructions.md +3 -0
- package/.github/prompts/analyze.prompt.md +101 -0
- package/.github/prompts/clarify.prompt.md +158 -0
- package/.github/prompts/constitution.prompt.md +73 -0
- package/.github/prompts/implement.prompt.md +56 -0
- package/.github/prompts/plan.prompt.md +50 -0
- package/.github/prompts/specify.prompt.md +21 -0
- package/.github/prompts/tasks.prompt.md +69 -0
- package/LICENSE +21 -0
- package/README.md +332 -0
- package/agents.md +1174 -0
- package/dist/api.d.ts +73 -0
- package/dist/api.js +387 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/download.command.d.ts +18 -0
- package/dist/commands/download.command.js +257 -0
- package/dist/commands/download.command.js.map +1 -0
- package/dist/commands/executor.d.ts +22 -0
- package/dist/commands/executor.js +52 -0
- package/dist/commands/executor.js.map +1 -0
- package/dist/commands/help.command.d.ts +8 -0
- package/dist/commands/help.command.js +68 -0
- package/dist/commands/help.command.js.map +1 -0
- package/dist/commands/index.command.d.ts +14 -0
- package/dist/commands/index.command.js +95 -0
- package/dist/commands/index.command.js.map +1 -0
- package/dist/commands/index.d.ts +13 -0
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/plan.command.d.ts +54 -0
- package/dist/commands/plan.command.js +272 -0
- package/dist/commands/plan.command.js.map +1 -0
- package/dist/commands/registry.d.ts +12 -0
- package/dist/commands/registry.js +32 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/transform.command.d.ts +69 -0
- package/dist/commands/transform.command.js +951 -0
- package/dist/commands/transform.command.js.map +1 -0
- package/dist/commands/types.d.ts +12 -0
- package/dist/commands/types.js +5 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/update.command.d.ts +10 -0
- package/dist/commands/update.command.js +201 -0
- package/dist/commands/update.command.js.map +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +110 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +15 -0
- package/dist/logger.js +52 -0
- package/dist/logger.js.map +1 -0
- package/dist/types.d.ts +167 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +56 -0
- package/dist/utils.js +178 -0
- package/dist/utils.js.map +1 -0
- package/eslint.config.js +29 -0
- package/jest.config.cjs +25 -0
- package/migrate-meta.js +132 -0
- package/package.json +53 -0
- package/src/api.ts +469 -0
- package/src/commands/download.command.ts +324 -0
- package/src/commands/executor.ts +62 -0
- package/src/commands/help.command.ts +72 -0
- package/src/commands/index.command.ts +111 -0
- package/src/commands/index.ts +14 -0
- package/src/commands/plan.command.ts +318 -0
- package/src/commands/registry.ts +39 -0
- package/src/commands/transform.command.ts +1103 -0
- package/src/commands/types.ts +16 -0
- package/src/commands/update.command.ts +229 -0
- package/src/constants.ts +0 -0
- package/src/index.ts +120 -0
- package/src/logger.ts +60 -0
- package/src/test.sh +66 -0
- package/src/types.ts +176 -0
- package/src/utils.ts +204 -0
- package/tests/commands/README.md +123 -0
- package/tests/commands/download.command.test.ts +8 -0
- package/tests/commands/help.command.test.ts +8 -0
- package/tests/commands/index.command.test.ts +8 -0
- package/tests/commands/plan.command.test.ts +15 -0
- package/tests/commands/transform.command.test.ts +8 -0
- package/tests/fixtures/_index.yaml +38 -0
- package/tests/fixtures/mock-pages.ts +62 -0
- package/tsconfig.json +25 -0
- package/vite.config.ts +45 -0
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Confluence API client
|
|
3
|
+
*/
|
|
4
|
+
import type { Page, PageMetadata, PaginatedResponse, ConfluenceConfig, User } from './types.js';
|
|
5
|
+
export declare class ConfluenceApi {
|
|
6
|
+
private baseUrl;
|
|
7
|
+
private authHeader;
|
|
8
|
+
private userCache;
|
|
9
|
+
private cacheFile;
|
|
10
|
+
private DEFAULT_TIMEOUT;
|
|
11
|
+
constructor(config: ConfluenceConfig);
|
|
12
|
+
/**
|
|
13
|
+
* Load user cache from filesystem
|
|
14
|
+
*/
|
|
15
|
+
private loadCache;
|
|
16
|
+
/**
|
|
17
|
+
* Save user cache to filesystem
|
|
18
|
+
*/
|
|
19
|
+
private saveCache;
|
|
20
|
+
/**
|
|
21
|
+
* Helper to perform fetch with a timeout using AbortController
|
|
22
|
+
*/
|
|
23
|
+
private fetchWithTimeout;
|
|
24
|
+
/**
|
|
25
|
+
* Fetch a page with its content
|
|
26
|
+
*/
|
|
27
|
+
getPage(pageId: string): Promise<Page>;
|
|
28
|
+
/**
|
|
29
|
+
* List all pages in a space
|
|
30
|
+
*/
|
|
31
|
+
listPages(spaceKey: string, start?: number, limit?: number): Promise<PaginatedResponse<Page>>;
|
|
32
|
+
/**
|
|
33
|
+
* Search pages using CQL query (metadata only, no body content)
|
|
34
|
+
* Useful for finding pages modified after a specific date
|
|
35
|
+
*/
|
|
36
|
+
searchPages(cql: string, pageSize?: number): Promise<PageMetadata[]>;
|
|
37
|
+
/**
|
|
38
|
+
* List pages metadata only (no body content) - more efficient for checking updates
|
|
39
|
+
*/
|
|
40
|
+
listPagesMetadata(spaceKey: string, start?: number, limit?: number): Promise<PaginatedResponse<PageMetadata>>;
|
|
41
|
+
/**
|
|
42
|
+
* Fetch all pages metadata from a space (handles pagination) - no body content
|
|
43
|
+
*/
|
|
44
|
+
getAllPagesMetadata(spaceKey: string, pageSize?: number): AsyncGenerator<PageMetadata & {
|
|
45
|
+
apiPageNumber: number;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Fetch all pages from a space (handles pagination)
|
|
49
|
+
*/
|
|
50
|
+
getAllPages(spaceKey: string, pageSize?: number, startFrom?: number): AsyncGenerator<Page & {
|
|
51
|
+
apiPageNumber: number;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Get a page by its title in a space
|
|
55
|
+
*/
|
|
56
|
+
getPageByTitle(spaceKey: string, title: string): Promise<Page | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Get child pages of a parent page
|
|
59
|
+
*/
|
|
60
|
+
getChildPages(pageId: string): Promise<Page[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Download an attachment from a page
|
|
63
|
+
*/
|
|
64
|
+
downloadAttachment(pageId: string, filename: string): Promise<Buffer | null>;
|
|
65
|
+
/**
|
|
66
|
+
* Get user information by username (with caching)
|
|
67
|
+
*/
|
|
68
|
+
getUserByUsername(username: string): Promise<User | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Get user information by user key (with caching)
|
|
71
|
+
*/
|
|
72
|
+
getUserByKey(userKey: string): Promise<User | null>;
|
|
73
|
+
}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Confluence API client
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from './logger.js';
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { readFileSync } from 'fs';
|
|
8
|
+
export class ConfluenceApi {
|
|
9
|
+
baseUrl;
|
|
10
|
+
authHeader;
|
|
11
|
+
userCache = new Map();
|
|
12
|
+
cacheFile;
|
|
13
|
+
// Default network timeout for fetch requests (ms)
|
|
14
|
+
DEFAULT_TIMEOUT = 15000;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, ''); // Remove trailing slash
|
|
17
|
+
const credentials = Buffer.from(`${config.username}:${config.password}`).toString('base64');
|
|
18
|
+
this.authHeader = `Basic ${credentials}`;
|
|
19
|
+
// Set up user cache file
|
|
20
|
+
this.cacheFile = path.join(config.outputDir, '_user_cache.json');
|
|
21
|
+
this.loadCache();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load user cache from filesystem
|
|
25
|
+
*/
|
|
26
|
+
loadCache() {
|
|
27
|
+
try {
|
|
28
|
+
const data = readFileSync(this.cacheFile, 'utf8');
|
|
29
|
+
const parsed = JSON.parse(data);
|
|
30
|
+
this.userCache = new Map(Object.entries(parsed));
|
|
31
|
+
logger.debug(`Loaded ${this.userCache.size} users from cache`);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
// Ignore if file doesn't exist or is invalid
|
|
35
|
+
logger.debug('No existing user cache found, starting fresh');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Save user cache to filesystem
|
|
40
|
+
*/
|
|
41
|
+
async saveCache() {
|
|
42
|
+
try {
|
|
43
|
+
const obj = Object.fromEntries(this.userCache);
|
|
44
|
+
await fs.writeFile(this.cacheFile, JSON.stringify(obj, null, 2));
|
|
45
|
+
logger.debug(`Saved ${this.userCache.size} users to cache`);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
logger.warn('Failed to save user cache:', err);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Helper to perform fetch with a timeout using AbortController
|
|
53
|
+
*/
|
|
54
|
+
async fetchWithTimeout(input, init, timeoutMs) {
|
|
55
|
+
const timeout = typeof timeoutMs === 'number' ? timeoutMs : this.DEFAULT_TIMEOUT;
|
|
56
|
+
const controller = new AbortController();
|
|
57
|
+
const id = setTimeout(() => controller.abort(), timeout);
|
|
58
|
+
try {
|
|
59
|
+
logger.debug('fetchWithTimeout ->', input, 'timeoutMs=', timeout);
|
|
60
|
+
const res = await fetch(input, { ...(init || {}), signal: controller.signal });
|
|
61
|
+
logger.debug('fetchWithTimeout <-', input, 'status=', res.status);
|
|
62
|
+
return res;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
clearTimeout(id);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Fetch a page with its content
|
|
70
|
+
*/
|
|
71
|
+
async getPage(pageId) {
|
|
72
|
+
const url = `${this.baseUrl}/rest/api/content/${pageId}?expand=body.storage,version,history.lastUpdated`;
|
|
73
|
+
const response = await this.fetchWithTimeout(url, {
|
|
74
|
+
headers: {
|
|
75
|
+
'Authorization': this.authHeader,
|
|
76
|
+
'Accept': 'application/json'
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
throw new Error(`Failed to fetch page ${pageId}: ${response.status} ${response.statusText}`);
|
|
81
|
+
}
|
|
82
|
+
const data = await response.json();
|
|
83
|
+
return {
|
|
84
|
+
id: data.id,
|
|
85
|
+
title: data.title,
|
|
86
|
+
body: data.body?.storage?.value || '',
|
|
87
|
+
version: data.version?.number,
|
|
88
|
+
parentId: data.ancestors?.[data.ancestors.length - 1]?.id,
|
|
89
|
+
modifiedDate: data.version?.when || data.history?.lastUpdated?.when
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* List all pages in a space
|
|
94
|
+
*/
|
|
95
|
+
async listPages(spaceKey, start = 0, limit = 100) {
|
|
96
|
+
const url = `${this.baseUrl}/rest/api/content?spaceKey=${spaceKey}&type=page&expand=body.storage,version,history.lastUpdated,ancestors&start=${start}&limit=${limit}`;
|
|
97
|
+
const response = await this.fetchWithTimeout(url, {
|
|
98
|
+
headers: {
|
|
99
|
+
'Authorization': this.authHeader,
|
|
100
|
+
'Accept': 'application/json'
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
if (!response.ok) {
|
|
104
|
+
throw new Error(`Failed to list pages (${url}): ${response.status} ${response.statusText}`);
|
|
105
|
+
}
|
|
106
|
+
const data = await response.json();
|
|
107
|
+
return {
|
|
108
|
+
results: data.results.map((item) => ({
|
|
109
|
+
id: item.id,
|
|
110
|
+
title: item.title,
|
|
111
|
+
body: item.body?.storage?.value || '',
|
|
112
|
+
version: item.version?.number,
|
|
113
|
+
parentId: item.ancestors?.[item.ancestors.length - 1]?.id,
|
|
114
|
+
modifiedDate: item.version?.when || item.history?.lastUpdated?.when
|
|
115
|
+
})),
|
|
116
|
+
start: data.start,
|
|
117
|
+
limit: data.limit,
|
|
118
|
+
size: data.size,
|
|
119
|
+
_links: data._links
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Search pages using CQL query (metadata only, no body content)
|
|
124
|
+
* Useful for finding pages modified after a specific date
|
|
125
|
+
*/
|
|
126
|
+
async searchPages(cql, pageSize = 100) {
|
|
127
|
+
const results = [];
|
|
128
|
+
let start = 0;
|
|
129
|
+
while (true) {
|
|
130
|
+
const url = `${this.baseUrl}/rest/api/content/search?cql=${encodeURIComponent(cql)}&expand=version,history.lastUpdated,ancestors&start=${start}&limit=${pageSize}`;
|
|
131
|
+
logger.debug('downloadAttachment: metadata URL ->', url);
|
|
132
|
+
const response = await this.fetchWithTimeout(url, {
|
|
133
|
+
headers: {
|
|
134
|
+
'Authorization': this.authHeader,
|
|
135
|
+
'Accept': 'application/json'
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
throw new Error(`Failed to search pages (${url}): ${response.status} ${response.statusText}`);
|
|
140
|
+
}
|
|
141
|
+
const data = await response.json();
|
|
142
|
+
for (const item of data.results) {
|
|
143
|
+
results.push({
|
|
144
|
+
id: item.id,
|
|
145
|
+
title: item.title,
|
|
146
|
+
version: item.version?.number,
|
|
147
|
+
parentId: item.ancestors?.[item.ancestors.length - 1]?.id,
|
|
148
|
+
modifiedDate: item.version?.when || item.history?.lastUpdated?.when
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Check if there are more pages
|
|
152
|
+
if (data.results.length < pageSize || !data._links?.next) {
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
start += pageSize;
|
|
156
|
+
}
|
|
157
|
+
return results;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* List pages metadata only (no body content) - more efficient for checking updates
|
|
161
|
+
*/
|
|
162
|
+
async listPagesMetadata(spaceKey, start = 0, limit = 100) {
|
|
163
|
+
const url = `${this.baseUrl}/rest/api/content?spaceKey=${spaceKey}&type=page&expand=version,history.lastUpdated,ancestors&start=${start}&limit=${limit}`;
|
|
164
|
+
const response = await this.fetchWithTimeout(url, {
|
|
165
|
+
headers: {
|
|
166
|
+
'Authorization': this.authHeader,
|
|
167
|
+
'Accept': 'application/json'
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
if (!response.ok) {
|
|
171
|
+
throw new Error(`Failed to list pages metadata (${url}): ${response.status} ${response.statusText}`);
|
|
172
|
+
}
|
|
173
|
+
const data = await response.json();
|
|
174
|
+
return {
|
|
175
|
+
results: data.results.map((item) => ({
|
|
176
|
+
id: item.id,
|
|
177
|
+
title: item.title,
|
|
178
|
+
version: item.version?.number,
|
|
179
|
+
parentId: item.ancestors?.[item.ancestors.length - 1]?.id,
|
|
180
|
+
modifiedDate: item.version?.when || item.history?.lastUpdated?.when
|
|
181
|
+
})),
|
|
182
|
+
start: data.start,
|
|
183
|
+
limit: data.limit,
|
|
184
|
+
size: data.size,
|
|
185
|
+
_links: data._links
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Fetch all pages metadata from a space (handles pagination) - no body content
|
|
190
|
+
*/
|
|
191
|
+
async *getAllPagesMetadata(spaceKey, pageSize = 100) {
|
|
192
|
+
let start = 0;
|
|
193
|
+
const limit = pageSize;
|
|
194
|
+
let apiPageNumber = 1;
|
|
195
|
+
while (true) {
|
|
196
|
+
const response = await this.listPagesMetadata(spaceKey, start, limit);
|
|
197
|
+
for (const page of response.results) {
|
|
198
|
+
yield { ...page, apiPageNumber };
|
|
199
|
+
}
|
|
200
|
+
// Check if there are more pages
|
|
201
|
+
if (response.results.length < limit || !response._links?.next) {
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
start += limit;
|
|
205
|
+
apiPageNumber++;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Fetch all pages from a space (handles pagination)
|
|
210
|
+
*/
|
|
211
|
+
async *getAllPages(spaceKey, pageSize = 25, startFrom = 0) {
|
|
212
|
+
let start = startFrom;
|
|
213
|
+
const limit = pageSize;
|
|
214
|
+
let apiPageNumber = Math.floor(startFrom / pageSize) + 1;
|
|
215
|
+
while (true) {
|
|
216
|
+
const response = await this.listPages(spaceKey, start, limit);
|
|
217
|
+
for (const page of response.results) {
|
|
218
|
+
yield { ...page, apiPageNumber };
|
|
219
|
+
}
|
|
220
|
+
// Check if there are more pages
|
|
221
|
+
if (response.results.length < limit || !response._links?.next) {
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
start += limit;
|
|
225
|
+
apiPageNumber++;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get a page by its title in a space
|
|
230
|
+
*/
|
|
231
|
+
async getPageByTitle(spaceKey, title) {
|
|
232
|
+
const url = `${this.baseUrl}/rest/api/content?spaceKey=${spaceKey}&title=${encodeURIComponent(title)}&expand=body.storage,version`;
|
|
233
|
+
const response = await this.fetchWithTimeout(url, {
|
|
234
|
+
headers: {
|
|
235
|
+
'Authorization': this.authHeader,
|
|
236
|
+
'Accept': 'application/json'
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
if (!response.ok) {
|
|
240
|
+
logger.warn(`Failed to fetch page by title "${title}": ${response.status}`);
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
const data = await response.json();
|
|
244
|
+
if (data.results.length === 0) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
const page = data.results[0];
|
|
248
|
+
return {
|
|
249
|
+
id: page.id,
|
|
250
|
+
title: page.title,
|
|
251
|
+
body: page.body?.storage?.value || '',
|
|
252
|
+
version: page.version?.number,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get child pages of a parent page
|
|
257
|
+
*/
|
|
258
|
+
async getChildPages(pageId) {
|
|
259
|
+
const url = `${this.baseUrl}/rest/api/content/${pageId}/child/page?expand=version`;
|
|
260
|
+
const response = await fetch(url, {
|
|
261
|
+
headers: {
|
|
262
|
+
'Authorization': this.authHeader,
|
|
263
|
+
'Accept': 'application/json'
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
if (!response.ok) {
|
|
267
|
+
logger.warn(`Failed to fetch child pages for ${pageId}: ${response.status}`);
|
|
268
|
+
return [];
|
|
269
|
+
}
|
|
270
|
+
const data = await response.json();
|
|
271
|
+
return data.results.map(child => ({
|
|
272
|
+
id: child.id,
|
|
273
|
+
title: child.title,
|
|
274
|
+
body: '', // Don't fetch body for child page lists
|
|
275
|
+
version: child.version?.number,
|
|
276
|
+
}));
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Download an attachment from a page
|
|
280
|
+
*/
|
|
281
|
+
async downloadAttachment(pageId, filename) {
|
|
282
|
+
try {
|
|
283
|
+
// First, get the attachment metadata to get the download URL
|
|
284
|
+
const url = `${this.baseUrl}/rest/api/content/${pageId}/child/attachment?filename=${encodeURIComponent(filename)}`;
|
|
285
|
+
const response = await this.fetchWithTimeout(url, {
|
|
286
|
+
headers: {
|
|
287
|
+
'Authorization': this.authHeader,
|
|
288
|
+
'Accept': 'application/json'
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
if (!response.ok) {
|
|
292
|
+
logger.warn(`Failed to fetch attachment metadata for ${filename}: ${response.status}`);
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
const data = await response.json();
|
|
296
|
+
logger.debug('downloadAttachment: metadata results length ->', data.results.length);
|
|
297
|
+
if (data.results.length === 0) {
|
|
298
|
+
logger.warn(`Attachment not found: ${filename}`);
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
// Download the actual file
|
|
302
|
+
const downloadUrl = `${this.baseUrl}${data.results[0]._links.download}`;
|
|
303
|
+
logger.debug('downloadAttachment: download URL ->', downloadUrl);
|
|
304
|
+
const downloadResponse = await this.fetchWithTimeout(downloadUrl, {
|
|
305
|
+
headers: {
|
|
306
|
+
'Authorization': this.authHeader
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
if (!downloadResponse.ok) {
|
|
310
|
+
logger.warn(`Failed to download attachment ${filename}: ${downloadResponse.status}`);
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
const arrayBuffer = await downloadResponse.arrayBuffer();
|
|
314
|
+
return Buffer.from(arrayBuffer);
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
logger.warn(`Error downloading attachment ${filename}:`, error);
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get user information by username (with caching)
|
|
323
|
+
*/
|
|
324
|
+
async getUserByUsername(username) {
|
|
325
|
+
// Check cache first
|
|
326
|
+
const cached = this.userCache.get(username);
|
|
327
|
+
if (cached) {
|
|
328
|
+
return cached;
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
const url = `${this.baseUrl}/rest/api/user?username=${encodeURIComponent(username)}&expand=details.personal`;
|
|
332
|
+
const response = await this.fetchWithTimeout(url, {
|
|
333
|
+
headers: {
|
|
334
|
+
'Authorization': this.authHeader,
|
|
335
|
+
'Accept': 'application/json'
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
if (!response.ok) {
|
|
339
|
+
logger.warn(`Failed to fetch user ${username}: ${response.status}`);
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
const data = await response.json();
|
|
343
|
+
// Cache the result
|
|
344
|
+
this.userCache.set(username, data);
|
|
345
|
+
await this.saveCache();
|
|
346
|
+
return data;
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
logger.warn(`Error fetching user ${username}:`, error);
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Get user information by user key (with caching)
|
|
355
|
+
*/
|
|
356
|
+
async getUserByKey(userKey) {
|
|
357
|
+
// Check cache first
|
|
358
|
+
const cacheKey = `key:${userKey}`;
|
|
359
|
+
const cached = this.userCache.get(cacheKey);
|
|
360
|
+
if (cached) {
|
|
361
|
+
return cached;
|
|
362
|
+
}
|
|
363
|
+
try {
|
|
364
|
+
const url = `${this.baseUrl}/rest/api/user?key=${encodeURIComponent(userKey)}&expand=details.personal`;
|
|
365
|
+
const response = await this.fetchWithTimeout(url, {
|
|
366
|
+
headers: {
|
|
367
|
+
'Authorization': this.authHeader,
|
|
368
|
+
'Accept': 'application/json'
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
if (!response.ok) {
|
|
372
|
+
logger.warn(`Failed to fetch user by key ${userKey}: ${response.status}`);
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
const data = await response.json();
|
|
376
|
+
// Cache the result
|
|
377
|
+
this.userCache.set(cacheKey, data);
|
|
378
|
+
await this.saveCache();
|
|
379
|
+
return data;
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
logger.warn(`Error fetching user by key ${userKey}:`, error);
|
|
383
|
+
return null;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Download command handler - Downloads HTML pages from _queue.yaml
|
|
3
|
+
*/
|
|
4
|
+
import type { CommandHandler, CommandContext } from './types.js';
|
|
5
|
+
import type { ConfluenceConfig } from '../types.js';
|
|
6
|
+
export declare class DownloadCommand implements CommandHandler {
|
|
7
|
+
private config;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
constructor(config: ConfluenceConfig);
|
|
11
|
+
execute(context: CommandContext): Promise<void>;
|
|
12
|
+
private downloadFromQueueWithHierarchy;
|
|
13
|
+
private downloadBatch;
|
|
14
|
+
private savePageToFile;
|
|
15
|
+
private displayPathAsTree;
|
|
16
|
+
private downloadPage;
|
|
17
|
+
private slugify;
|
|
18
|
+
}
|