itd-api 0.1.0 → 0.3.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 (80) hide show
  1. package/README.md +121 -495
  2. package/dist/index.cjs +9212 -412
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +5176 -1
  5. package/dist/index.d.ts +5176 -1
  6. package/dist/index.js +9118 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/multi-storage-BhcA2Izn.d.ts +198 -0
  9. package/dist/multi-storage-CyMe404l.js +805 -0
  10. package/dist/multi-storage-CyMe404l.js.map +1 -0
  11. package/dist/multi-storage-D1keK2Op.cjs +930 -0
  12. package/dist/multi-storage-D1keK2Op.cjs.map +1 -0
  13. package/dist/multi-storage-NDqzRQcD.d.cts +198 -0
  14. package/dist/node.cjs +225 -548
  15. package/dist/node.cjs.map +1 -1
  16. package/dist/node.d.cts +46 -59
  17. package/dist/node.d.ts +46 -59
  18. package/dist/node.js +223 -126
  19. package/dist/node.js.map +1 -1
  20. package/dist/runtime-CFEsf-jD.cjs +185 -0
  21. package/dist/runtime-CFEsf-jD.cjs.map +1 -0
  22. package/dist/runtime-DHxDn8gf.js +126 -0
  23. package/dist/runtime-DHxDn8gf.js.map +1 -0
  24. package/dist/storage-BjNRlkbE.d.cts +82 -0
  25. package/dist/storage-BjNRlkbE.d.ts +82 -0
  26. package/dist/storage-D9tfHx7Z.js +424 -0
  27. package/dist/storage-D9tfHx7Z.js.map +1 -0
  28. package/dist/storage-ycBqLBRB.cjs +615 -0
  29. package/dist/storage-ycBqLBRB.cjs.map +1 -0
  30. package/dist/web.cjs +87 -0
  31. package/dist/web.cjs.map +1 -0
  32. package/dist/web.d.cts +27 -0
  33. package/dist/web.d.ts +27 -0
  34. package/dist/web.js +86 -0
  35. package/dist/web.js.map +1 -0
  36. package/package.json +34 -14
  37. package/dist/chunk-6FB4HTKH.js +0 -7763
  38. package/dist/chunk-6FB4HTKH.js.map +0 -1
  39. package/dist/chunk-73CISRBG.cjs +0 -7873
  40. package/dist/chunk-73CISRBG.cjs.map +0 -1
  41. package/dist/index-BZF4K90s.d.cts +0 -4961
  42. package/dist/index-BZF4K90s.d.ts +0 -4961
  43. package/guides/README.md +0 -24
  44. package/guides/authentication/README.md +0 -176
  45. package/guides/authentication/examples/bot-with-session.mjs +0 -98
  46. package/guides/authentication/examples/turnstile-login.mjs +0 -56
  47. package/guides/integrations/README.md +0 -62
  48. package/guides/integrations/examples/proxy.mjs +0 -26
  49. package/guides/multi-accounts/README.md +0 -143
  50. package/guides/multi-accounts/examples/multi-accounts.mjs +0 -71
  51. package/guides/plugins/README.md +0 -253
  52. package/guides/plugins/examples/cache.mjs +0 -33
  53. package/guides/plugins/examples/crypto.mjs +0 -54
  54. package/guides/quickstart/README.md +0 -124
  55. package/guides/quickstart/examples/quick-start.mjs +0 -44
  56. package/guides/quickstart/examples/typescript.ts +0 -90
  57. package/guides/realtime/README.md +0 -109
  58. package/guides/realtime/examples/notifications.mjs +0 -62
  59. package/guides/reference/README.md +0 -67
  60. package/guides/reference/accounts.md +0 -101
  61. package/guides/reference/auth.md +0 -141
  62. package/guides/reference/builders.md +0 -135
  63. package/guides/reference/client.md +0 -184
  64. package/guides/reference/comments.md +0 -58
  65. package/guides/reference/discovery.md +0 -81
  66. package/guides/reference/enums.md +0 -103
  67. package/guides/reference/errors.md +0 -107
  68. package/guides/reference/files.md +0 -73
  69. package/guides/reference/models.md +0 -448
  70. package/guides/reference/notifications.md +0 -77
  71. package/guides/reference/pagination.md +0 -82
  72. package/guides/reference/platform.md +0 -47
  73. package/guides/reference/posts.md +0 -157
  74. package/guides/reference/realtime.md +0 -78
  75. package/guides/reference/reports.md +0 -28
  76. package/guides/reference/subscription.md +0 -41
  77. package/guides/reference/users.md +0 -146
  78. package/guides/reference/verification.md +0 -24
  79. package/guides/text-markup/README.md +0 -214
  80. package/guides/text-markup/examples/create-post.mjs +0 -64
@@ -1,109 +0,0 @@
1
- # Уведомления и realtime
2
-
3
- `itd.realtime()` открывает поток новых уведомлений:
4
-
5
- ```ts
6
- import { formatNotificationText, resolveNotificationUrl } from 'itd-api';
7
-
8
- const stream = itd.realtime();
9
-
10
- stream.on('notification', ({ notification, sound }) => {
11
- console.log(sound ? '🔔' : '🔕');
12
- console.log(formatNotificationText(notification));
13
- console.log(resolveNotificationUrl(notification));
14
- });
15
-
16
- await stream.connect();
17
- ```
18
-
19
- ## REST и поток
20
-
21
- Уведомления из `itd.notifications.list()` и realtime приведены к общей форме, поэтому их
22
- можно хранить в одном массиве:
23
-
24
- ```ts
25
- const history = await itd.notifications.list({ limit: 20 });
26
-
27
- stream.on('notification', ({ notification }) => {
28
- history.items.unshift(notification);
29
- });
30
- ```
31
-
32
- Сервер использует короткие типы вроде `like`, `comment` и `repost`. Библиотека приводит
33
- их к однозначным `post_reaction`, `post_comment`, `post_repost`, сохраняя исходное значение
34
- в `rawType`, а исходный объект — в `raw`.
35
-
36
- `resolveNotificationUrl()` учитывает смысл идентификаторов конкретного типа и строит ссылку
37
- на профиль, пост или комментарий.
38
-
39
- ## Переподключение
40
-
41
- Поток самостоятельно обрабатывает:
42
-
43
- - обрыв соединения;
44
- - обновление access token;
45
- - восстановление сети;
46
- - возвращение браузерной вкладки из фона;
47
- - отсутствие keep-alive дольше `idleTimeout`.
48
-
49
- По умолчанию используются задержки `[1, 2, 4, 8, 16, 30]` секунд с джиттером ±30% и не
50
- более 15 последовательных попыток. Сервер обычно отправляет `: ping` каждые 15 секунд,
51
- а стандартный `idleTimeout` равен 90 секундам.
52
-
53
- Состояние можно отслеживать:
54
-
55
- ```ts
56
- stream.on('status', (status) => {
57
- console.log(status); // connecting, connected, reconnecting, disconnected, error
58
- });
59
- ```
60
-
61
- Завершение:
62
-
63
- ```ts
64
- stream.disconnect();
65
- await itd.close();
66
- ```
67
-
68
- ## Счётчик непрочитанных
69
-
70
- Сервер практически не присылает отдельное событие изменения счётчика. Получите начальное
71
- значение через REST и обновляйте локально:
72
-
73
- ```ts
74
- let unread = await itd.notifications.count();
75
-
76
- stream.on('notification', () => {
77
- unread += 1;
78
- });
79
- ```
80
-
81
- После массовой отметки о прочтении лучше снова запросить актуальное значение.
82
-
83
- ## Polling fallback
84
-
85
- В средах без потокового чтения ответа, например в некоторых версиях React Native, realtime
86
- автоматически переключается на периодический опрос. Интервал настраивается через
87
- `pollInterval`.
88
-
89
- Можно выбрать транспорт явно:
90
-
91
- ```ts
92
- const stream = itd.realtime({
93
- transport: 'poll',
94
- pollInterval: 5_000,
95
- });
96
- ```
97
-
98
- ## Несколько аккаунтов
99
-
100
- Каждый вызов `itd.realtime()` держит собственное соединение. Для десяти аккаунтов это десять
101
- SSE-соединений, поэтому открывайте поток только там, где он действительно нужен.
102
-
103
- ## Запускаемый пример
104
-
105
- ```bash
106
- ITD_TOKEN=<accessToken> node guides/realtime/examples/notifications.mjs
107
- ```
108
-
109
- Исходник: [`examples/notifications.mjs`](./examples/notifications.mjs).
@@ -1,62 +0,0 @@
1
- /**
2
- * Уведомления в реальном времени.
3
- *
4
- * Запуск:
5
- * ITD_TOKEN=<ваш accessToken> node guides/realtime/examples/notifications.mjs
6
- *
7
- * Соединение держится само: обрывы, обновление токена и повторные попытки библиотека
8
- * берёт на себя. Завершение — Ctrl+C.
9
- */
10
-
11
- import { ItdClient, formatNotificationText, resolveNotificationUrl } from 'itd-api';
12
-
13
- const itd = new ItdClient({ auth: process.env.ITD_TOKEN });
14
-
15
- // Сначала — то, что уже накопилось.
16
- const history = await itd.notifications.list({ limit: 5 });
17
-
18
- console.log(`Непрочитанных: ${await itd.notifications.count()}`);
19
- console.log('\nПоследние уведомления:');
20
-
21
- for (const notification of history.items) {
22
- const mark = notification.isRead ? ' ' : '•';
23
- console.log(`${mark} ${formatNotificationText(notification)}`);
24
- console.log(` → ${resolveNotificationUrl(notification)}`);
25
- }
26
-
27
- // Теперь поток новых.
28
- const stream = itd.realtime();
29
-
30
- stream.on('notification', ({ notification, sound }) => {
31
- console.log(`\n${sound ? '🔔' : '🔕'} ${formatNotificationText(notification)}`);
32
- console.log(` → ${resolveNotificationUrl(notification)}`);
33
-
34
- // Объекты из списка и из потока имеют одинаковую форму — их можно складывать вместе.
35
- history.items.unshift(notification);
36
- });
37
-
38
- // Счётчик непрочитанных сервер по потоку не присылает — ведём его сами.
39
- let unread = await itd.notifications.count();
40
-
41
- stream.on('notification', () => {
42
- unread += 1;
43
- console.log(` непрочитанных: ${unread}`);
44
- });
45
-
46
- stream.on('ready', ({ userId }) => console.log(`[поток подтвердил получателя ${userId}]`));
47
- stream.on('status', (status) => console.log(`[соединение: ${status}]`));
48
- stream.on('reconnect', ({ attempt, delay }) => {
49
- console.log(`[переподключение №${attempt} через ${delay} мс]`);
50
- });
51
- stream.on('giveup', () => {
52
- console.error('[попытки исчерпаны, соединение восстановится только вручную]');
53
- });
54
-
55
- await stream.connect();
56
- console.log(`\nЖдём события (транспорт: ${stream.transport}). Ctrl+C для выхода.`);
57
-
58
- process.on('SIGINT', () => {
59
- stream.disconnect();
60
- console.log('\nОтключено');
61
- process.exit(0);
62
- });
@@ -1,67 +0,0 @@
1
- # Справочник API
2
-
3
- Техническое описание всех методов и типов `itd-api`. В отличие от [руководств](../README.md),
4
- здесь нет сценариев и рабочих примеров — только сигнатуры, параметры и возвращаемые типы,
5
- разбитые по категориям.
6
-
7
- ## Ресурсы клиента
8
-
9
- | Категория | Доступ | О чём |
10
- |---|---|---|
11
- | [Клиент](./client.md) | `new ItdClient()` | конструктор, `request()`, `use()`, сервисы, события, `realtime()`, `close()` |
12
- | [Авторизация](./auth.md) | `itd.auth` | вход, регистрация, OTP, пароли, OAuth, сессии |
13
- | [Пользователи](./users.md) | `itd.users` | профили, подписки, блокировки, приватность, значки |
14
- | [Посты](./posts.md) | `itd.posts` | лента, публикация, реакции, репосты, опросы, комментарии к постам |
15
- | [Комментарии](./comments.md) | `itd.comments` | ответы на комментарии и действия над ними |
16
- | [Уведомления](./notifications.md) | `itd.notifications` | список, счётчик, отметки о прочтении, настройки |
17
- | [Файлы](./files.md) | `itd.files` | загрузка и удаление медиа |
18
- | [Поиск и обнаружение](./discovery.md) | `itd.search`, `itd.hashtags` | глобальный поиск, хэштеги, тренды, рекомендации, кланы, портал |
19
- | [Подписка](./subscription.md) | `itd.subscription` | состояние премиума, автопродление, способы оплаты |
20
- | [Верификация](./verification.md) | `itd.verification` | статус и подача заявки |
21
- | [Жалобы](./reports.md) | `itd.reports` | жалобы на контент и пользователей |
22
- | [Платформа](./platform.md) | `itd.platform` | журнал изменений, анонсы, портал, статус сервисов |
23
- | [Realtime](./realtime.md) | `itd.realtime()` | поток уведомлений, события, транспорт, переподключение |
24
-
25
- ## Несколько аккаунтов
26
-
27
- | Категория | Доступ | О чём |
28
- |---|---|---|
29
- | [Аккаунты](./accounts.md) | `new ItdAccounts()` | контейнер именованных клиентов с общим хранилищем |
30
-
31
- ## Справочники типов
32
-
33
- | Файл | О чём |
34
- |---|---|
35
- | [Модели данных](./models.md) | `Post`, `Comment`, `Profile`, `Notification`, `Attachment` и остальные ответы API |
36
- | [Перечисления](./enums.md) | `FeedTab`, `SpanType`, `NotificationType`, `ReportReason` и прочие |
37
- | [Ошибки](./errors.md) | иерархия `ItdError`, коды `ItdErrorCode`, функции-предикаты |
38
- | [Билдеры](./builders.md) | `post()`, `comment()`, `poll()`, `report()`, `markup()`, `renderSpans()` |
39
- | [Пагинация](./pagination.md) | `Page<T>`, `Paginator<T>`, три схемы под одним `for await` |
40
-
41
- ## Общие соглашения
42
-
43
- **`RequestOptions` в каждом методе.** Почти все методы ресурсов принимают необязательный
44
- последний аргумент `options: RequestOptions` — он не повторяется в сигнатурах ниже:
45
-
46
- ```ts
47
- interface RequestOptions {
48
- signal?: AbortSignal; // отмена запроса
49
- timeout?: number; // таймаут только этого запроса, мс
50
- headers?: Record<string, string>; // дополнительные заголовки
51
- retry?: RetryOptions | false; // повторы только этого запроса
52
- }
53
- ```
54
-
55
- **`UserRef` против `UserId`.** `UserRef` — это UUID **или** имя пользователя: подходят оба
56
- (`itd.users.get('durov')` и `itd.users.get('9f1c…')`). `UserId` — строго UUID; имя
57
- пользователя там не работает (например, `wallRecipientId`).
58
-
59
- **Даты.** Все поля дат — строки ISO-8601 (`IsoDate`). Библиотека не превращает их в `Date`;
60
- для разбора есть [`toDate()`](./models.md#вспомогательные-функции).
61
-
62
- **Пагинация.** Методы-списки идут парами: `list()`/`comments()`/… возвращают одну
63
- [`Page<T>`](./pagination.md), а `iterate()`/`iterateComments()`/… — [`Paginator<T>`](./pagination.md)
64
- для `for await`. Подробнее — в [пагинации](./pagination.md).
65
-
66
- **Снятие обёртки.** Сервер оборачивает ответы в `{ data: … }`; библиотека снимает обёртку
67
- сама. Чтобы получить тело как есть, используйте `itd.request({ …, raw: true })`.
@@ -1,101 +0,0 @@
1
- # Аккаунты — `ItdAccounts`
2
-
3
- Контейнер именованных `ItdClient`: у каждого аккаунта свой токен, cookie и `deviceId`,
4
- а сессии всех складываются в одно хранилище (`MultiTokenStorage`). Имя аккаунта выбираете вы;
5
- сервер о нём ничего не знает. Полное руководство — [Несколько аккаунтов](../multi-accounts/README.md).
6
-
7
- ```ts
8
- new ItdAccounts(options?: ItdAccountsOptions)
9
- createAccounts(options?: ItdAccountsOptions): ItdAccounts // фабрика
10
- ```
11
-
12
- ## Методы
13
-
14
- ```ts
15
- addAccount(name: string, options?: AddAccountOptions): ItdClient
16
- ```
17
- Заводит аккаунт. Возвращает обычный `ItdClient` со всеми ресурсами. Хранилище подставляется
18
- само — срез общего по имени. `auth` не обязателен, если сессия уже в хранилище.
19
-
20
- ```ts
21
- account(name: string): ItdClient
22
- ```
23
- Клиент аккаунта. Бросает `ItdConfigError`, если аккаунта нет.
24
-
25
- ```ts
26
- restore(): Promise<string[]>
27
- ```
28
- Поднимает аккаунты, сессии которых уже лежат в хранилище (после перезапуска — без `auth` и
29
- капчи). Возвращает имена добавленных.
30
-
31
- ```ts
32
- removeAccount(name: string, options?: RemoveAccountOptions): Promise<boolean>
33
- ```
34
- Убирает аккаунт: закрывает клиента и, при `forget: true`, забывает сессию. Сетевого запроса
35
- не делает — для завершения сессии на сервере вызовите `itd.auth.logout()` до удаления.
36
-
37
- ```ts
38
- has(name: string): boolean
39
- names(): string[]
40
- get size: number
41
- get storage: MultiTokenStorage
42
- ```
43
- Состав контейнера.
44
-
45
- ```ts
46
- use(plugin: ItdPlugin): this
47
- pluginNames(): string[]
48
- hasPlugin(name: string): boolean
49
- unuse(name: string): Promise<boolean>
50
- ```
51
- Подключает плагин всем аккаунтам — и заведённым, и будущим; показывает общий набор или
52
- отключает плагин сразу у всех клиентов.
53
-
54
- ```ts
55
- on<K>(event: K, listener): Unsubscribe
56
- ```
57
- Подписка на [события авторизации всех аккаунтов](#события) сразу.
58
-
59
- ```ts
60
- close(): Promise<void>
61
- dispose(): Promise<void>
62
- ```
63
- `close()` временно закрывает все аккаунты и останавливает общую очередь, не отключая
64
- плагины. `dispose()` дополнительно вызывает teardown плагинов. `await using` вызывает
65
- `dispose()`.
66
-
67
- ```ts
68
- [Symbol.iterator](): IterableIterator<[string, ItdClient]>
69
- ```
70
- Перебор парами «имя — клиент»: `for (const [name, itd] of accounts) { … }`.
71
-
72
- ## События (`AccountEvents`)
73
-
74
- Те же, что у одиночного клиента, плюс имя аккаунта:
75
-
76
- | Событие | Данные |
77
- |---|---|
78
- | `tokens` | `{ account, accessToken }` |
79
- | `signIn` | `{ account, accessToken }` |
80
- | `signOut` | `{ account }` |
81
- | `authError` | `{ account, error }` |
82
-
83
- ## Опции
84
-
85
- ```ts
86
- interface ItdAccountsOptions extends Omit<ItdClientOptions, 'auth' | 'storage' | 'deviceId'> {
87
- storage?: MultiTokenStorage; // по умолчанию MemoryMultiTokenStorage
88
- plugins?: readonly ItdPlugin[]; // подключаются каждому аккаунту
89
- rateLimitScope?: 'account' | 'shared'; // очередь: своя у каждого / общая; по умолчанию 'account'
90
- }
91
-
92
- type AddAccountOptions = Omit<ItdClientOptions, 'storage'>;
93
-
94
- interface RemoveAccountOptions {
95
- forget?: boolean; // удалить и сохранённую сессию; по умолчанию false
96
- }
97
- ```
98
-
99
- `rateLimitScope: 'shared'` нужен, когда все аккаунты сидят на одном IP и упираются в лимит по
100
- адресу. Настройки самой очереди тогда задаются контейнеру опцией `rateLimit`; аккаунту можно
101
- передать только `rateLimit: false`, чтобы вывести его из общей очереди.
@@ -1,141 +0,0 @@
1
- # Авторизация — `itd.auth`
2
-
3
- Вход, регистрация, подтверждение по коду, пароли, OAuth и управление сессиями. Обычно
4
- клиент авторизуется сам через опцию `auth` конструктора; эти методы нужны для ручных
5
- сценариев входа. Полное руководство — [Авторизация](../authentication/README.md).
6
-
7
- Вход, регистрация и сброс пароля требуют одноразовый **Turnstile token**. Ключ виджета —
8
- экспорт `TURNSTILE_SITE_KEY`.
9
-
10
- ## Вход и регистрация
11
-
12
- ```ts
13
- signUp(credentials: CaptchaCredentials): Promise<string>
14
- ```
15
- Регистрирует аккаунт и запускает подтверждение по коду. Возвращает `flowToken` для `verifyOtp()`.
16
-
17
- ```ts
18
- signIn(credentials: CaptchaCredentials): Promise<SignInResult>
19
- ```
20
- Выполняет вход. При успехе токен сохраняется в клиенте автоматически. Если сервер потребовал
21
- код, вернётся `{ status: 'otp_required', flowToken }`.
22
-
23
- ```ts
24
- signInWithOtp(input: CaptchaCredentials & { getOtp: () => string | Promise<string> }): Promise<string>
25
- ```
26
- Полный вход с подтверждением: код запрашивается функцией `getOtp`, остальное — само. Возвращает
27
- `accessToken`.
28
-
29
- ```ts
30
- verifyOtp(input: Credentials & { otp: string; flowToken: string }): Promise<string>
31
- ```
32
- Подтверждает вход кодом из письма. Токен сохраняется автоматически.
33
-
34
- ```ts
35
- resendOtp(input: { email: string; flowToken: string }): Promise<void>
36
- ```
37
- Отправляет код подтверждения повторно.
38
-
39
- ## Сессия
40
-
41
- ```ts
42
- refresh(): Promise<string>
43
- ```
44
- Обновляет токен доступа. Параллельные вызовы объединяются в один сетевой запрос. При включённом
45
- `autoRefresh` вручную обычно не нужен.
46
-
47
- ```ts
48
- hasRefreshSession(): Promise<boolean>
49
- ```
50
- Есть ли признак живой сессии обновления (cookie `is_auth` или строковый refresh-токен).
51
- В браузере всегда `true`. Читает хранилище — верен и до первого запроса.
52
-
53
- ```ts
54
- logout(): Promise<void>
55
- ```
56
- Завершает текущую сессию на сервере и очищает локальную.
57
-
58
- ```ts
59
- logoutAll(): Promise<void>
60
- ```
61
- Завершает все сессии пользователя и очищает локальную.
62
-
63
- ```ts
64
- signOut(): Promise<void>
65
- ```
66
- Забывает сессию локально, не обращаясь к серверу.
67
-
68
- ## Пароли
69
-
70
- ```ts
71
- forgotPassword(input: ForgotPasswordInput): Promise<string>
72
- ```
73
- Запрашивает письмо с кодом для сброса. Возвращает `flowToken` для `resetPassword()`.
74
-
75
- ```ts
76
- resetPassword(input: ResetPasswordInput): Promise<void>
77
- ```
78
- Устанавливает новый пароль по коду. Нужны все четыре поля: `email`, `otp`, `flowToken`, `newPassword`.
79
-
80
- ```ts
81
- resetPasswordWithOtp(input: ForgotPasswordInput & { newPassword: string; getOtp: () => string | Promise<string> }): Promise<void>
82
- ```
83
- Полный сброс: код запрашивается функцией `getOtp`, остальное — само.
84
-
85
- ```ts
86
- changePassword(input: { currentPassword: string; newPassword: string }): Promise<void>
87
- ```
88
- Меняет пароль. Требует действующей сессии. При неверном текущем пароле — код
89
- `ACCOUNT_CURRENT_PASSWORD_INCORRECT`.
90
-
91
- ## Управление сессиями
92
-
93
- ```ts
94
- sessions(): Promise<Session[]>
95
- ```
96
- Список активных сессий. У текущей `isCurrent === true`. См. [`Session`](./models.md#session).
97
-
98
- ```ts
99
- revokeSession(sessionId: string): Promise<void>
100
- ```
101
- Завершает указанную сессию.
102
-
103
- ```ts
104
- revokeOtherSessions(): Promise<void>
105
- ```
106
- Завершает все сессии, кроме текущей.
107
-
108
- ## Типы
109
-
110
- ```ts
111
- interface Credentials {
112
- email: string;
113
- password: string;
114
- }
115
-
116
- interface CaptchaCredentials extends Credentials {
117
- turnstileToken: string; // одноразовый, живёт несколько минут
118
- }
119
-
120
- interface ForgotPasswordInput {
121
- email: string;
122
- turnstileToken: string;
123
- }
124
-
125
- interface ResetPasswordInput {
126
- email: string;
127
- otp: string;
128
- flowToken: string;
129
- newPassword: string;
130
- }
131
-
132
- type SignInResult =
133
- | { status: 'authenticated'; accessToken: string }
134
- | { status: 'otp_required'; flowToken: string | undefined };
135
-
136
- const OAuthProvider = { Yandex: 'yandex', Google: 'google' } as const;
137
- const SignInStatus = { Authenticated: 'authenticated', OtpRequired: 'otp_required' } as const;
138
- ```
139
-
140
- Связанные: [`AuthInput`](./client.md#авторизация-authinput) (как клиент получает доступ),
141
- события авторизации `itd.on('tokens' | 'authError' | …)` — см. [Клиент](./client.md#события).
@@ -1,135 +0,0 @@
1
- # Билдеры — `post()`, `comment()`, `poll()`, `report()`, `markup()`
2
-
3
- Билдеры собирают данные для публикующих методов и проверяют их **до** обращения к сети
4
- (бросают [`ItdConfigError`](./errors.md)). Все билдеры **неизменяемые**: каждый метод
5
- возвращает новый экземпляр, поэтому заготовку можно переиспользовать.
6
-
7
- Методы вроде `posts.create`, `posts.comment`, `comments.reply`, `reports.create` принимают три
8
- равноправные формы: обычный объект, готовый билдер или функцию-настройщик.
9
-
10
- ```ts
11
- isBuilder(value: unknown): boolean // это билдер?
12
- ```
13
-
14
- ## Пост — `post()`
15
-
16
- ```ts
17
- post(content?: string): PostBuilder
18
- ```
19
-
20
- | Метод | Описание |
21
- |---|---|
22
- | `.content(text)` | задаёт текст, сбрасывая прежнюю разметку |
23
- | `.append(text)` | дописывает текст к уже заданному |
24
- | `.spans(spans)` | задаёт готовую разметку `Span[]` |
25
- | `.markup(input)` | заменяет текст и разметку результатом `MarkupBuilder` |
26
- | `.autoSpans(options?)` | находит ссылки, хэштеги и упоминания в тексте |
27
- | `.onWall(userId)` | публикует на стене пользователя (**UUID**) |
28
- | `.attach(file)` | прикладывает файл (загрузится перед публикацией) |
29
- | `.attachId(id)` | прикладывает уже загруженное вложение |
30
- | `.poll(input)` | добавляет опрос |
31
- | `.build()` | возвращает проверенный `CreatePostInput` |
32
-
33
- ## Комментарий — `comment()`
34
-
35
- ```ts
36
- comment(content?: string): CommentBuilder
37
- ```
38
-
39
- | Метод | Описание |
40
- |---|---|
41
- | `.content(text)` | задаёт текст |
42
- | `.attach(file)` / `.attachId(id)` | прикладывает вложение |
43
- | `.voice(audio)` | делает комментарий голосовым (без текста, одно аудио `audio/ogg`) |
44
- | `.replyTo(userId)` | адресат ответа (только в `comments.reply()`) |
45
- | `.build()` | возвращает проверенный `CreateCommentInput` |
46
-
47
- ## Опрос — `poll()`
48
-
49
- ```ts
50
- poll(question?: string): PollBuilder
51
- ```
52
-
53
- | Метод | Описание |
54
- |---|---|
55
- | `.question(text)` | задаёт вопрос (≤ 200 символов) |
56
- | `.option(text)` | добавляет один вариант (≤ 100 символов) |
57
- | `.options(...texts)` | добавляет несколько вариантов сразу |
58
- | `.multipleChoice(enabled?)` | разрешает выбор нескольких |
59
- | `.build()` | возвращает проверенный `CreatePollInput` |
60
-
61
- Требуется от 2 до 10 различных непустых вариантов.
62
-
63
- ## Жалоба — `report`
64
-
65
- Объект-фабрика: тип объекта выбирается точкой входа, поэтому рассогласовать тип и идентификатор
66
- нельзя.
67
-
68
- ```ts
69
- report.post(postId: string): ReportBuilder
70
- report.comment(commentId: string): ReportBuilder
71
- report.user(userId: string): ReportBuilder
72
- ```
73
-
74
- | Метод | Описание |
75
- |---|---|
76
- | `.reason(reason)` | причина ([`ReportReason`](./enums.md#reportreason)) |
77
- | `.description(text)` | пояснение в свободной форме |
78
- | `.build()` | возвращает проверенный `CreateReportInput` |
79
-
80
- ## Разметка текста — `markup()`
81
-
82
- Собирает текст и сам считает `offset`/`length` в единицах UTF-16.
83
-
84
- ```ts
85
- markup(content?: string): MarkupBuilder
86
- ```
87
-
88
- | Метод | Описание |
89
- |---|---|
90
- | `.text(value)` | обычный текст без разметки |
91
- | `.newline(count?)` | переводы строк |
92
- | `.bold` · `.italic` · `.underline` · `.strike` · `.spoiler` · `.monospace` · `.quote` | стиль на фрагменте |
93
- | `.hashtag(tag)` | `#хэштег` |
94
- | `.mention(username)` | `@упоминание` |
95
- | `.link(content, url?)` | ссылка |
96
- | `.span(value, span)` | произвольный тип разметки |
97
- | `.styled(value, ...types)` | несколько стилей на одном диапазоне |
98
- | `.build()` | возвращает `{ content, spans }` |
99
-
100
- Все методы контента принимают строку **или** вложенный билдер/разметку — так стили вкладываются
101
- друг в друга.
102
-
103
- ## Автоопределение сущностей
104
-
105
- ```ts
106
- autoSpans(text: string, options?: AutoSpansOptions): Span[]
107
- ```
108
- Находит HTTP(S)-ссылки, `#хэштеги` и `@упоминания` в готовом тексте.
109
-
110
- ```ts
111
- interface AutoSpansOptions {
112
- hashtags?: boolean; // по умолчанию true
113
- mentions?: boolean; // по умолчанию true
114
- links?: boolean; // по умолчанию true
115
- }
116
- ```
117
-
118
- ## Рендеринг разметки
119
-
120
- ```ts
121
- renderSpans(content: string, spans: Span[] | null | undefined, options?: RenderSpansOptions): string
122
- ```
123
- Превращает текст и spans в HTML (по умолчанию, безопасный), Markdown или ANSI.
124
-
125
- ```ts
126
- interface RenderSpansOptions {
127
- format?: 'html' | 'markdown' | 'ansi'; // по умолчанию 'html'
128
- mentionUrl?: (username: string) => string | null | undefined;
129
- hashtagUrl?: (tag: string) => string | null | undefined;
130
- classPrefix?: string | null; // префикс CSS-классов; по умолчанию 'itd'
131
- }
132
- ```
133
-
134
- Подробное руководство по разметке — [Разметка текста](../text-markup/README.md).
135
- См. [`Span`](./models.md#span), [`SpanType`](./enums.md#spantype).