@knpkv/confluence-to-markdown 0.4.1 → 0.5.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 (38) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/ConfluenceAuth.d.ts.map +1 -1
  3. package/dist/ConfluenceAuth.js +22 -12
  4. package/dist/ConfluenceAuth.js.map +1 -1
  5. package/dist/ConfluenceClient.d.ts +3 -13
  6. package/dist/ConfluenceClient.d.ts.map +1 -1
  7. package/dist/ConfluenceClient.js +70 -34
  8. package/dist/ConfluenceClient.js.map +1 -1
  9. package/dist/ConfluenceError.d.ts +12 -12
  10. package/dist/GitError.d.ts +5 -5
  11. package/dist/SchemaConverterError.d.ts +3 -3
  12. package/dist/ast/BlockNode.d.ts +33 -48
  13. package/dist/ast/BlockNode.d.ts.map +1 -1
  14. package/dist/ast/BlockNode.js +2 -11
  15. package/dist/ast/BlockNode.js.map +1 -1
  16. package/dist/ast/Document.d.ts +2 -30
  17. package/dist/ast/Document.d.ts.map +1 -1
  18. package/dist/parsers/ConfluenceParser.d.ts.map +1 -1
  19. package/dist/parsers/ConfluenceParser.js +12 -7
  20. package/dist/parsers/ConfluenceParser.js.map +1 -1
  21. package/dist/parsers/MarkdownParser.js +117 -8
  22. package/dist/parsers/MarkdownParser.js.map +1 -1
  23. package/dist/schemas/preprocessing/ConfluencePreprocessor.js +10 -2
  24. package/dist/schemas/preprocessing/ConfluencePreprocessor.js.map +1 -1
  25. package/dist/serializers/ConfluenceSerializer.js +9 -0
  26. package/dist/serializers/ConfluenceSerializer.js.map +1 -1
  27. package/dist/serializers/MarkdownSerializer.js +49 -9
  28. package/dist/serializers/MarkdownSerializer.js.map +1 -1
  29. package/package.json +7 -7
  30. package/src/ConfluenceAuth.ts +22 -12
  31. package/src/ConfluenceClient.ts +91 -58
  32. package/src/ast/BlockNode.ts +65 -21
  33. package/src/parsers/ConfluenceParser.ts +17 -11
  34. package/src/parsers/MarkdownParser.ts +156 -16
  35. package/src/schemas/preprocessing/ConfluencePreprocessor.ts +11 -2
  36. package/src/serializers/ConfluenceSerializer.ts +21 -1
  37. package/src/serializers/MarkdownSerializer.ts +60 -10
  38. package/test/parsers/ConfluenceParser.test.ts +169 -0
@@ -132,7 +132,14 @@ const serializeImage = (node) => {
132
132
  */
133
133
  const serializeTable = (node) => Effect.gen(function* () {
134
134
  const lines = [];
135
- // Header
135
+ // Markdown tables require a header divider. When the source had no <thead>,
136
+ // emit a synthetic empty header so the table still renders. A leading
137
+ // <!--cf:synth-thead--> marker discriminates it from a legitimate empty
138
+ // header — MarkdownParser strips the marker and drops only that synthetic row,
139
+ // so a real Confluence <thead> with empty <th>s round-trips intact.
140
+ const columnCount = node.header?.cells.length ?? node.rows[0]?.cells.length ?? 0;
141
+ const synthMarker = "<!--cf:synth-thead-->";
142
+ let prefix = "";
136
143
  if (node.header) {
137
144
  const headerCells = [];
138
145
  for (const cell of node.header.cells) {
@@ -141,6 +148,11 @@ const serializeTable = (node) => Effect.gen(function* () {
141
148
  lines.push(`| ${headerCells.join(" | ")} |`);
142
149
  lines.push(`| ${headerCells.map(() => "---").join(" | ")} |`);
143
150
  }
151
+ else if (columnCount > 0) {
152
+ prefix = `${synthMarker}\n\n`;
153
+ lines.push(`| ${Array(columnCount).fill("").join(" | ")} |`);
154
+ lines.push(`| ${Array(columnCount).fill("---").join(" | ")} |`);
155
+ }
144
156
  // Body rows
145
157
  for (const row of node.rows) {
146
158
  const cells = [];
@@ -149,7 +161,7 @@ const serializeTable = (node) => Effect.gen(function* () {
149
161
  }
150
162
  lines.push(`| ${cells.join(" | ")} |`);
151
163
  }
152
- return lines.join("\n");
164
+ return `${prefix}${lines.join("\n")}`;
153
165
  });
154
166
  /**
155
167
  * Serialize list.
@@ -197,6 +209,8 @@ const serializeSimpleBlock = (node) => Effect.gen(function* () {
197
209
  const unsupported = node;
198
210
  return unsupported.rawMarkdown || unsupported.rawHtml || "";
199
211
  }
212
+ case "List":
213
+ return yield* serializeList(node);
200
214
  default:
201
215
  return "";
202
216
  }
@@ -228,7 +242,11 @@ const serializeInfoPanel = (node) => Effect.gen(function* () {
228
242
  return lines.join("\n");
229
243
  });
230
244
  /**
231
- * Serialize expand macro - use comment encoding for roundtrip.
245
+ * Serialize expand macro as a GFM-compatible <details> block.
246
+ *
247
+ * The opening and closing HTML tags are recognised on round-trip by
248
+ * MarkdownParser to rebuild the ExpandMacro AST node. Body content is rendered
249
+ * as ordinary markdown so it shows up in viewers (Obsidian, GitHub, etc.).
232
250
  */
233
251
  const serializeExpandMacro = (node) => Effect.gen(function* () {
234
252
  const title = node.title || "";
@@ -237,10 +255,11 @@ const serializeExpandMacro = (node) => Effect.gen(function* () {
237
255
  const serialized = yield* serializeSimpleBlock(child);
238
256
  contentParts.push(serialized);
239
257
  }
240
- const content = contentParts.join("\n");
241
- // Use comment encoding for roundtrip
242
- return `<!--cf:expand:${encodeURIComponent(title)}:${encodeURIComponent(content)}-->`;
258
+ const body = contentParts.join("\n\n");
259
+ const summary = `<summary>${escapeHtml(title)}</summary>`;
260
+ return `<details>\n${summary}\n\n${body}\n\n</details>`;
243
261
  });
262
+ const escapeHtml = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
244
263
  /**
245
264
  * Serialize TOC macro.
246
265
  */
@@ -331,8 +350,10 @@ const serializeInlineNode = (node) => Effect.gen(function* () {
331
350
  // Wrap in HTML comment with URL-encoded values
332
351
  return `<!--cf:emoticon:${encodeURIComponent(node.shortname)}|${encodeURIComponent(node.emojiId)}|${encodeURIComponent(node.fallback)}-->`;
333
352
  case "UserMention":
334
- // Wrap in HTML comment to prevent remark from parsing
335
- return `<!--cf:user:${node.accountId}-->`;
353
+ // Render as a markdown link so the mention is visible in viewers.
354
+ // The #cf-user: URL fragment is the round-trip carrier — MarkdownParser
355
+ // rebuilds the UserMention node when it sees a link with that prefix.
356
+ return `[@${node.accountId}](#cf-user:${encodeURIComponent(node.accountId)})`;
336
357
  case "DateTime":
337
358
  // Wrap in HTML comment to prevent remark from parsing
338
359
  return `<!--cf:date:${node.datetime}-->`;
@@ -346,8 +367,27 @@ const serializeInlineNode = (node) => Effect.gen(function* () {
346
367
  const content = yield* serializeInlineNodes(node.children);
347
368
  return `<span style="background-color: ${node.backgroundColor};">${content}</span>`;
348
369
  }
349
- case "UnsupportedInline":
370
+ case "UnsupportedInline": {
371
+ // Some inline macros are stored as UnsupportedInline carrying a comment-
372
+ // encoded round-trip marker. Rewrite the round-trippable ones as visible
373
+ // markdown links so they show up in viewers; MarkdownParser reverses this.
374
+ // The raw payload is already URL-encoded (ConfluenceParser uses
375
+ // encodeURIComponent), so we decode the title for human-readable link
376
+ // text and pass the encoded value through to the URL fragment as-is.
377
+ const statusMatch = node.raw.match(/^<!--cf:status:([^;]*);([^;]*)-->$/);
378
+ if (statusMatch) {
379
+ const text = decodeURIComponent(statusMatch[1] ?? "");
380
+ const color = statusMatch[2] ?? "";
381
+ return `[${text}](#cf-status:${color})`;
382
+ }
383
+ const tocMatch = node.raw.match(/^<!--cf:toc:([^;]*);([^;]*)-->$/);
384
+ if (tocMatch) {
385
+ const min = tocMatch[1] ?? "";
386
+ const max = tocMatch[2] ?? "";
387
+ return `[Table of Contents](#cf-toc:${min}:${max})`;
388
+ }
350
389
  return node.raw;
390
+ }
351
391
  default:
352
392
  return "";
353
393
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownSerializer.js","sourceRoot":"","sources":["../../src/serializers/MarkdownSerializer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownSerializer.js","sourceRoot":"","sources":["../../src/serializers/MarkdownSerializer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knpkv/confluence-to-markdown",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "Sync Confluence Cloud pages to local GitHub Flavored Markdown files",
5
5
  "license": "MIT",
6
6
  "author": "knpkv",
@@ -74,12 +74,12 @@
74
74
  "access": "public"
75
75
  },
76
76
  "peerDependencies": {
77
- "effect": "^3.19.3"
77
+ "effect": ">=3.19.3"
78
78
  },
79
79
  "dependencies": {
80
- "@effect/cli": "^0.61.0",
81
- "@effect/platform": "^0.93.0",
82
- "@effect/platform-node": "^0.87.0",
80
+ "@effect/cli": "latest",
81
+ "@effect/platform": "latest",
82
+ "@effect/platform-node": "latest",
83
83
  "gray-matter": "^4.0.3",
84
84
  "rehype-parse": "^9.0.1",
85
85
  "rehype-remark": "^10.0.1",
@@ -89,12 +89,12 @@
89
89
  "remark-rehype": "^11.1.1",
90
90
  "remark-stringify": "^11.0.0",
91
91
  "unified": "^11.0.5",
92
- "@knpkv/confluence-api-client": "^0.2.0"
92
+ "@knpkv/confluence-api-client": "^0.2.1"
93
93
  },
94
94
  "devDependencies": {
95
95
  "@effect/vitest": "^0.27.0",
96
96
  "@types/node": "^22.15.21",
97
- "effect": "^3.19.3",
97
+ "effect": "^3.21.0",
98
98
  "typescript": "~5.9.0",
99
99
  "vitest": "^4.0.13"
100
100
  },
@@ -1,5 +1,13 @@
1
1
  /**
2
- * OAuth authentication service for Confluence.
2
+ * OAuth2 authentication service for Confluence with browser-based login and token refresh.
3
+ *
4
+ * **Mental model**
5
+ *
6
+ * - **Shared OAuth infra**: Delegates to `@knpkv/atlassian-common/auth` for token exchange,
7
+ * refresh, and revocation. This module adds Confluence-specific scopes and the local
8
+ * callback server flow.
9
+ * - **Refresh lock**: Same `Ref<Option<Deferred>>` pattern as Jira CLI to prevent
10
+ * concurrent refresh races.
3
11
  *
4
12
  * @module
5
13
  */
@@ -9,6 +17,7 @@ import * as Command from "@effect/platform/Command"
9
17
  import * as CommandExecutor from "@effect/platform/CommandExecutor"
10
18
  import * as HttpClient from "@effect/platform/HttpClient"
11
19
  import * as HttpClientRequest from "@effect/platform/HttpClientRequest"
20
+ import * as Console from "effect/Console"
12
21
  import * as Context from "effect/Context"
13
22
  import * as Deferred from "effect/Deferred"
14
23
  import * as Effect from "effect/Effect"
@@ -373,9 +382,10 @@ const make = Effect.gen(function*() {
373
382
  )
374
383
  const authUrl = buildAuthUrl(config.clientId, state, port)
375
384
 
376
- yield* Effect.log(`Opening browser for Atlassian login (callback on port ${port})...`)
385
+ yield* Console.log(`Opening browser for Atlassian login (callback on port ${port})...`)
386
+ yield* Console.log(`If browser doesn't open, visit: ${authUrl}`)
377
387
  yield* openBrowserImpl(authUrl)
378
- yield* Effect.log("Waiting for authorization (press Ctrl+C to cancel)...")
388
+ yield* Console.log("Waiting for authorization (press Ctrl+C to cancel)...")
379
389
 
380
390
  const code = yield* codePromise.pipe(
381
391
  Effect.timeout("5 minutes"),
@@ -385,10 +395,10 @@ const make = Effect.gen(function*() {
385
395
 
386
396
  yield* shutdown
387
397
 
388
- yield* Effect.log("Exchanging code for tokens...")
398
+ yield* Console.log("Exchanging code for tokens...")
389
399
  const tokens = yield* exchangeCodeForTokens(code, config, port)
390
400
 
391
- yield* Effect.log("Fetching accessible sites...")
401
+ yield* Console.log("Fetching accessible sites...")
392
402
  const sites = yield* getAccessibleResources(tokens.access_token)
393
403
 
394
404
  if (sites.length === 0) {
@@ -420,18 +430,18 @@ const make = Effect.gen(function*() {
420
430
  site = matched
421
431
  } else {
422
432
  // Return sites list for user to choose
423
- yield* Effect.log("Multiple Confluence sites found. Please select one:")
433
+ yield* Console.log("Multiple Confluence sites found. Please select one:")
424
434
  for (const s of sites) {
425
- yield* Effect.log(` - ${s.name}: ${s.url}`)
435
+ yield* Console.log(` - ${s.name}: ${s.url}`)
426
436
  }
427
- yield* Effect.log("\nRun 'confluence auth login --site <url>' to select a site")
437
+ yield* Console.log("\nRun 'confluence auth login --site <url>' to select a site")
428
438
  return sites.map((s) => ({ id: s.id, name: s.name, url: s.url }))
429
439
  }
430
440
  } else {
431
441
  site = sites[0]!
432
442
  }
433
443
 
434
- yield* Effect.log("Fetching user info...")
444
+ yield* Console.log("Fetching user info...")
435
445
  const user = yield* getUserInfo(tokens.access_token)
436
446
 
437
447
  const tokenData: OAuthToken = {
@@ -449,7 +459,7 @@ const make = Effect.gen(function*() {
449
459
  }
450
460
 
451
461
  yield* saveTokenOp(tokenData)
452
- yield* Effect.log(`Logged in as ${user.name} (${user.email})`)
462
+ yield* Console.log(`Logged in as ${user.name} (${user.email})`)
453
463
  return undefined
454
464
  })
455
465
 
@@ -457,7 +467,7 @@ const make = Effect.gen(function*() {
457
467
  Effect.gen(function*() {
458
468
  const token = yield* loadTokenOp()
459
469
  if (token === null) {
460
- yield* Effect.log("Not logged in")
470
+ yield* Console.log("Not logged in")
461
471
  return
462
472
  }
463
473
 
@@ -500,7 +510,7 @@ const make = Effect.gen(function*() {
500
510
  yield* Ref.set(refreshLock, Option.some(deferred))
501
511
 
502
512
  const config = yield* getConfig()
503
- yield* Effect.log("Token expired, refreshing...")
513
+ yield* Console.log("Token expired, refreshing...")
504
514
 
505
515
  const result = yield* refreshToken(token, config).pipe(
506
516
  Effect.tap((refreshed) => Deferred.succeed(deferred, refreshed)),
@@ -5,13 +5,7 @@
5
5
  *
6
6
  * @module
7
7
  */
8
- import * as HttpClient from "@effect/platform/HttpClient"
9
- import {
10
- ConfluenceApiClient,
11
- ConfluenceApiConfig,
12
- type V1ApiError,
13
- type V2ApiError
14
- } from "@knpkv/confluence-api-client"
8
+ import { ConfluenceApiClient, ConfluenceApiConfig, type FetchClientError, toEffect } from "@knpkv/confluence-api-client"
15
9
  import * as Context from "effect/Context"
16
10
  import * as Effect from "effect/Effect"
17
11
  import * as Layer from "effect/Layer"
@@ -128,7 +122,7 @@ export class ConfluenceClient extends Context.Tag(
128
122
 
129
123
  /**
130
124
  * Set editor version for a page (v1 or v2).
131
- * Uses V1 API to set page property.
125
+ * Uses V2 page properties API.
132
126
  */
133
127
  readonly setEditorVersion: (pageId: PageId, version: "v1" | "v2") => Effect.Effect<void, ApiError | RateLimitError>
134
128
  }
@@ -170,7 +164,7 @@ const rateLimitSchedule = Schedule.exponential("1 second").pipe(
170
164
  /**
171
165
  * Map API client errors to domain errors.
172
166
  */
173
- const mapApiError = (error: V1ApiError | V2ApiError, endpoint: string, pageId?: string): ApiError =>
167
+ const mapApiError = (error: FetchClientError, endpoint: string, pageId?: string): ApiError =>
174
168
  new ApiError({
175
169
  status: error.status,
176
170
  message: error.message,
@@ -183,7 +177,7 @@ const mapApiError = (error: V1ApiError | V2ApiError, endpoint: string, pageId?:
183
177
  */
184
178
  const make = (
185
179
  config: ConfluenceClientConfig
186
- ): Effect.Effect<Context.Tag.Service<typeof ConfluenceClient>, never, HttpClient.HttpClient> =>
180
+ ): Effect.Effect<Context.Tag.Service<typeof ConfluenceClient>> =>
187
181
  Effect.gen(function*() {
188
182
  // Create underlying API client
189
183
  const apiConfigLayer = Layer.succeed(ConfluenceApiConfig, {
@@ -193,22 +187,23 @@ const make = (
193
187
  : { type: "oauth2", accessToken: Redacted.make(config.auth.accessToken), cloudId: config.auth.cloudId }
194
188
  })
195
189
 
196
- const httpClient = yield* HttpClient.HttpClient
197
-
198
190
  const apiClient = yield* ConfluenceApiClient.pipe(
199
191
  Effect.provide(ConfluenceApiClient.layer),
200
- Effect.provide(apiConfigLayer),
201
- Effect.provide(Layer.succeed(HttpClient.HttpClient, httpClient))
192
+ Effect.provide(apiConfigLayer)
202
193
  )
203
194
 
204
195
  const getPage = (id: PageId): Effect.Effect<PageResponse, ApiError | RateLimitError> =>
205
- apiClient.v2.getPageById(id, { bodyFormat: "storage" }).pipe(
196
+ toEffect(apiClient.v2.client.GET("/pages/{id}", {
197
+ params: { path: { id: Number(id) }, query: { "body-format": "storage" } }
198
+ })).pipe(
206
199
  Effect.mapError((e) => mapApiError(e, `/pages/${id}`, id)),
207
200
  Effect.retry(rateLimitSchedule)
208
201
  ) as Effect.Effect<PageResponse, ApiError | RateLimitError>
209
202
 
210
203
  const getChildren = (id: PageId): Effect.Effect<PageChildrenResponse, ApiError | RateLimitError> =>
211
- apiClient.v2.getPageChildren(id, { bodyFormat: "storage" }).pipe(
204
+ toEffect(apiClient.v2.client.GET("/pages/{id}/children", {
205
+ params: { path: { id: Number(id) } }
206
+ })).pipe(
212
207
  Effect.mapError((e) => mapApiError(e, `/pages/${id}/children`, id)),
213
208
  Effect.retry(rateLimitSchedule)
214
209
  ) as Effect.Effect<PageChildrenResponse, ApiError | RateLimitError>
@@ -231,20 +226,21 @@ const make = (
231
226
  )
232
227
  }
233
228
 
234
- const response = yield* apiClient.v2.getPageChildren(id, {
235
- bodyFormat: "storage",
236
- cursor
237
- }).pipe(
229
+ const response = yield* toEffect(apiClient.v2.client.GET("/pages/{id}/children", {
230
+ params: { path: { id: Number(id) }, query: { ...(cursor ? { cursor } : {}) } }
231
+ })).pipe(
238
232
  Effect.mapError((e) => mapApiError(e, `/pages/${id}/children`, id)),
239
233
  Effect.retry(rateLimitSchedule)
240
234
  )
241
235
 
242
- for (const child of response.results) {
243
- allChildren.push(child as PageListItem)
236
+ for (const child of (response as { results?: Array<PageListItem> }).results ?? []) {
237
+ allChildren.push(child)
244
238
  }
245
239
 
246
- cursor = response._links?.next
247
- ? new URL(response._links.next, config.baseUrl).searchParams.get("cursor") ?? undefined
240
+ cursor = (response as { _links?: { next?: string } })._links?.next
241
+ ? new URL((response as { _links: { next: string } })._links.next, config.baseUrl).searchParams.get(
242
+ "cursor"
243
+ ) ?? undefined
248
244
  : undefined
249
245
 
250
246
  iterations++
@@ -254,19 +250,39 @@ const make = (
254
250
  })
255
251
 
256
252
  const createPage = (req: CreatePageRequest): Effect.Effect<PageResponse, ApiError | RateLimitError> =>
257
- apiClient.v2.createPage(req).pipe(
253
+ toEffect(apiClient.v2.client.POST("/pages", {
254
+ body: {
255
+ spaceId: req.spaceId,
256
+ title: req.title,
257
+ ...(req.parentId ? { parentId: req.parentId } : {}),
258
+ body: { representation: req.body.representation, value: req.body.value },
259
+ status: "current"
260
+ }
261
+ })).pipe(
258
262
  Effect.mapError((e) => mapApiError(e, "/pages")),
259
263
  Effect.retry(rateLimitSchedule)
260
264
  ) as Effect.Effect<PageResponse, ApiError | RateLimitError>
261
265
 
262
266
  const updatePage = (req: UpdatePageRequest): Effect.Effect<PageResponse, ApiError | RateLimitError> =>
263
- apiClient.v2.updatePage(req.id, req).pipe(
267
+ toEffect(apiClient.v2.client.PUT("/pages/{id}", {
268
+ params: { path: { id: Number(req.id) } },
269
+ body: {
270
+ id: req.id,
271
+ title: req.title,
272
+ status: req.status ?? "current",
273
+ body: { representation: req.body.representation, value: req.body.value },
274
+ version: { number: req.version.number, ...(req.version.message ? { message: req.version.message } : {}) }
275
+ }
276
+ })).pipe(
264
277
  Effect.mapError((e) => mapApiError(e, `/pages/${req.id}`, req.id)),
265
278
  Effect.retry(rateLimitSchedule)
266
279
  ) as Effect.Effect<PageResponse, ApiError | RateLimitError>
267
280
 
268
281
  const deletePage = (id: PageId): Effect.Effect<void, ApiError | RateLimitError> =>
269
- apiClient.v2.deletePage(id).pipe(
282
+ toEffect(apiClient.v2.client.DELETE("/pages/{id}", {
283
+ params: { path: { id: Number(id) } }
284
+ })).pipe(
285
+ Effect.map(() => void 0),
270
286
  Effect.mapError((e) => mapApiError(e, `/pages/${id}`, id)),
271
287
  Effect.retry(rateLimitSchedule)
272
288
  )
@@ -292,23 +308,30 @@ const make = (
292
308
  )
293
309
  }
294
310
 
295
- const response = yield* apiClient.v2.getPageVersions(id, {
296
- bodyFormat: options?.includeBody ? "storage" : undefined,
297
- cursor,
298
- limit: VERSIONS_PAGE_SIZE
299
- }).pipe(
311
+ const response = yield* toEffect(apiClient.v2.client.GET("/pages/{id}/versions", {
312
+ params: {
313
+ path: { id: Number(id) },
314
+ query: {
315
+ ...(options?.includeBody ? { "body-format": "storage" as const } : {}),
316
+ ...(cursor ? { cursor } : {}),
317
+ limit: VERSIONS_PAGE_SIZE
318
+ }
319
+ }
320
+ })).pipe(
300
321
  Effect.mapError((e) => mapApiError(e, `/pages/${id}/versions`, id)),
301
322
  Effect.retry(rateLimitSchedule)
302
323
  )
303
324
 
304
- for (const version of response.results) {
325
+ for (const version of (response as { results?: Array<PageVersion> }).results ?? []) {
305
326
  if (options?.since === undefined || (version.number ?? 0) > options.since) {
306
- allVersions.push(version as PageVersion)
327
+ allVersions.push(version)
307
328
  }
308
329
  }
309
330
 
310
- cursor = response._links?.next
311
- ? new URL(response._links.next, config.baseUrl).searchParams.get("cursor") ?? undefined
331
+ cursor = (response as { _links?: { next?: string } })._links?.next
332
+ ? new URL((response as { _links: { next: string } })._links.next, config.baseUrl).searchParams.get(
333
+ "cursor"
334
+ ) ?? undefined
312
335
  : undefined
313
336
 
314
337
  iterations++
@@ -318,7 +341,9 @@ const make = (
318
341
  })
319
342
 
320
343
  const getUser = (accountId: string): Effect.Effect<AtlassianUser, ApiError | RateLimitError> =>
321
- apiClient.v1.getUser({ accountId }).pipe(
344
+ toEffect(apiClient.v1.client.GET("/wiki/rest/api/user", {
345
+ params: { query: { accountId } }
346
+ })).pipe(
322
347
  Effect.mapError((e) => mapApiError(e, `/user?accountId=${accountId}`)),
323
348
  Effect.retry(rateLimitSchedule)
324
349
  ) as Effect.Effect<AtlassianUser, ApiError | RateLimitError>
@@ -341,29 +366,39 @@ const make = (
341
366
 
342
367
  const setEditorVersion = (pageId: PageId, version: "v1" | "v2"): Effect.Effect<void, ApiError | RateLimitError> =>
343
368
  Effect.gen(function*() {
344
- // Try to get current property version, only treat 404 as "not exists"
345
- const propertyVersion = yield* apiClient.v1.getContentProperty(pageId, "editor").pipe(
346
- Effect.map((prop) => prop.version.number + 1),
369
+ // Try to get existing property by key, treat 404 as "not exists"
370
+ const existing = yield* toEffect(apiClient.v2.client.GET("/pages/{page-id}/properties", {
371
+ params: { path: { "page-id": Number(pageId) }, query: { key: "editor" } }
372
+ })).pipe(
373
+ Effect.map((resp) => {
374
+ const results = (resp as { results?: Array<{ id?: string; version?: { number?: number } }> }).results
375
+ return results?.[0]
376
+ }),
347
377
  Effect.catchIf(
348
- (e) => e.status === 404,
349
- () => Effect.succeed(1)
378
+ (e: FetchClientError) => e.status === 404,
379
+ () => Effect.succeed(undefined)
350
380
  ),
351
- Effect.mapError((e) => mapApiError(e, `/content/${pageId}/property/editor`, pageId))
381
+ Effect.mapError((e) => mapApiError(e, `/pages/${pageId}/properties?key=editor`, pageId))
352
382
  )
353
383
 
354
- const payload = {
355
- key: "editor",
356
- value: version,
357
- version: { number: propertyVersion }
358
- }
359
-
360
- if (propertyVersion === 1) {
361
- yield* apiClient.v1.createContentProperty(pageId, { payload }).pipe(
362
- Effect.mapError((e) => mapApiError(e, `/content/${pageId}/property/editor`, pageId))
384
+ if (existing?.id) {
385
+ // Update existing property
386
+ const nextVersion = (existing.version?.number ?? 0) + 1
387
+ yield* toEffect(apiClient.v2.client.PUT("/pages/{page-id}/properties/{property-id}", {
388
+ params: {
389
+ path: { "page-id": Number(pageId), "property-id": Number(existing.id) }
390
+ },
391
+ body: { key: "editor", value: version, version: { number: nextVersion } }
392
+ })).pipe(
393
+ Effect.mapError((e) => mapApiError(e, `/pages/${pageId}/properties/editor`, pageId))
363
394
  )
364
395
  } else {
365
- yield* apiClient.v1.updateContentProperty(pageId, "editor", { payload }).pipe(
366
- Effect.mapError((e) => mapApiError(e, `/content/${pageId}/property/editor`, pageId))
396
+ // Create new property
397
+ yield* toEffect(apiClient.v2.client.POST("/pages/{page-id}/properties", {
398
+ params: { path: { "page-id": Number(pageId) } },
399
+ body: { key: "editor", value: version }
400
+ })).pipe(
401
+ Effect.mapError((e) => mapApiError(e, `/pages/${pageId}/properties/editor`, pageId))
367
402
  )
368
403
  }
369
404
  }).pipe(Effect.retry(rateLimitSchedule))
@@ -388,7 +423,6 @@ const make = (
388
423
  * @example
389
424
  * ```typescript
390
425
  * import { ConfluenceClient } from "@knpkv/confluence-to-markdown/ConfluenceClient"
391
- * import { NodeHttpClient } from "@effect/platform-node"
392
426
  * import { Effect } from "effect"
393
427
  *
394
428
  * const program = Effect.gen(function* () {
@@ -406,8 +440,7 @@ const make = (
406
440
  * email: "you@example.com",
407
441
  * token: process.env.CONFLUENCE_API_KEY
408
442
  * }
409
- * })),
410
- * Effect.provide(NodeHttpClient.layer)
443
+ * }))
411
444
  * )
412
445
  * )
413
446
  * ```
@@ -416,4 +449,4 @@ const make = (
416
449
  */
417
450
  export const layer = (
418
451
  config: ConfluenceClientConfig
419
- ): Layer.Layer<ConfluenceClient, never, HttpClient.HttpClient> => Layer.effect(ConfluenceClient, make(config))
452
+ ): Layer.Layer<ConfluenceClient> => Layer.effect(ConfluenceClient, make(config))