Skip to content

Миграция с 2.x на 3.0

3.0 переделывает публичную поверхность. Эта страница — карта; полное руководство в репозитории содержит все детали, а механическую часть делает codemod:

bash
npx jscodeshift -t node_modules/confluence.js/tools/codemod/v2-to-v3.ts \
  --parser ts --extensions ts,tsx,js,jsx src/

Он переписывает то, что может, и оставляет комментарий TODO(confluence.js@3) везде, где решение должен принять человек.

Клиент

diff
-import { ConfluenceClient } from 'confluence.js';
-
-const client = new ConfluenceClient({
-  host: 'https://your-domain.atlassian.net',
-  authentication: { basic: { email, apiToken } },
-});
+import { createV1Client } from 'confluence.js';
+
+const client = createV1Client({
+  host: 'https://your-domain.atlassian.net',
+  auth: { type: 'basic', email, apiToken },
+});

ConfluenceClient был API v1, поэтому createV1Client — замена один в один. Новое в 3.0: createV2Client даёт API v2 — 30 неймспейсов, 218 методов — из того же пакета и с тем же host. См. Выбор версии.

Конфигурация

2.x3.0
authentication: { basic: { email, apiToken } }auth: { type: 'basic', email, apiToken }
authentication: { oauth2: { accessToken } }auth: { type: 'bearer', token }
authentication: { jwt: … }удалено — Connect-приложения остаются на 2.x
apiPrefixудалено — путь к API теперь часть запроса
baseRequestConfigудалено — это был конфиг axios, а транспорт теперь fetch
middlewares: { onError, onResponse }удалено — используйте try/catch
noCheckAtlassianToken: trueудалено — v1 теперь всегда шлёт заголовок сам
retry — включаемые повторы транспортных сбоев
getAuthOn401 — переполучение авторизации после 401

noCheckAtlassianToken удалён, и заменять его нечем

v1 включает XSRF-защиту на каждой записи: без X-Atlassian-Token: no-check любая отвечает 403 XSRF check failed. В 2.x это надо было включать самому, и забытый флаг был типичным первым 403. Теперь каждая запись v1 шлёт заголовок сама — настраивать больше нечего.

Колбэки убраны

Каждый метод возвращал промис и принимал колбэк. В 3.0 только промисы:

diff
-client.group.getGroups({}, (error, data) => {
-  if (error) return handle(error);
-  use(data);
-});
+try {
+  use(await client.group.getGroups({}));
+} catch (error) {
+  handle(error);
+}

Ошибки

diff
-catch (error) {
-  if (error.response?.status === 404) { /* … */ }
-}
+catch (error) {
+  if (error instanceof ApiError && error.status === 404) { /* … */ }
+}

Новое в 3.0: ответ, не совпавший со схемой, бросает ZodError. См. Обработку ошибок.

Импорты

diff
-import { ConfluenceClient, Config } from 'confluence.js';
-import { Content } from 'confluence.js/api/content';
+import { createV1Client, type ClientConfig } from 'confluence.js';
+import { getGroups } from 'confluence.js/v1';
+import { getPages } from 'confluence.js/v2';
+import { createClient } from 'confluence.js/core';

BaseClient и классы по неймспейсам убраны, как и глубокие импорты вида confluence.js/api/content.

Surface v1 следует текущей спеке Atlassian

Это изменение с наибольшей вероятностью затронет ваш код, и выбрали его не мы.

confluence.js следует опубликованной OpenAPI-спеке Atlassian, а Atlassian убрал из спеки v1 37 операций с момента выхода 2.x — включая getContent, createContent и getSpace, — потому что их покрывает v2. По той же причине их нет в v1 в 3.0.

Почти у всех есть эквивалент в v2:

2.x3.0 — createV2Client()
content.getContentpage.getPages / blogPost.getBlogPosts / customContent.getCustomContent
content.getContentByIdpage.getPageById / blogPost.getBlogPostById
content.createContentpage.createPage / blogPost.createBlogPost
content.updateContentpage.updatePage / blogPost.updateBlogPost
content.deleteContentpage.deletePage / blogPost.deleteBlogPost
contentChildrenAndDescendants.getContentChildrenchildren.getPageChildren / descendants.getPageDescendants
contentComments.getContentCommentscomment.getPageFooterComments / comment.getPageInlineComments
contentAttachments.getAttachmentsattachment.getPageAttachments
contentVersions.getContentVersionsversion.getPageVersions
contentLabels.getLabelsForContentlabel.getPageLabels
contentProperties.*contentProperties.getPageContentProperties и соседи
space.getSpace, space.getSpacesspace.getSpaceById / space.getSpaces
spaceProperties.*spaceProperties.getSpaceProperties и соседи
inlineTasks.*task.getTasks / task.getTaskById

У трёх замены здесь нет: contentBody.convertContentBody (оставайтесь на 2.x) и group.addUserToGroup / group.removeMemberFromGroup (управление пользователями переехало в Admin API).

Одна операция не уехала в v2 вовсе — она осталась в v1 под новым именем: contentAttachments.createAttachments теперь contentAttachments.createAttachment, и ей больше не нужен собранный вручную FormData. См. Вложения.

Загрузка вложений стала проще

diff
-await client.contentAttachments.createAttachments({
-  id: pageId,
-  attachment: { file: fs.createReadStream('report.pdf') },
-});
+await confluence.contentAttachments.createAttachment({
+  id: pageId,
+  attachments: { filename: 'report.pdf', content: bytes },
+});

Остаётесь на 2.x?

2.x продолжает работать. Оставайтесь там, если нужен JWT / Atlassian Connect или convertContentBody. Больше ничего в 3.0 не требует переписывания, которое codemod не может начать за вас.