gitverse-api-sdk 2.0.1 → 3.1.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/README.md CHANGED
@@ -3,12 +3,15 @@
3
3
  [![npm version](https://img.shields.io/npm/v/gitverse-api-sdk.svg)](https://www.npmjs.com/package/gitverse-api-sdk)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
  [![Test Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen.svg)](https://gitverse.ru/rainypixel/gitverse-sdk)
6
+ [![GitVerse API](https://img.shields.io/badge/GitVerse%20API-v22.0.0-blue.svg)](https://gitverse.ru)
6
7
 
7
8
  Полнофункциональный TypeScript SDK для GitVerse API с поддержкой всех эндпоинтов, обработкой Rate Limits и версионирования.
8
9
 
10
+ > **Совместимость:** SDK синхронизирован с GitVerse API v22.0.0 (обновлено: 06.11.2025)
11
+
9
12
  ## Ключевые особенности
10
13
 
11
- - ✅ **100% покрытие API** — Все 90 эндпоинтов GitVerse API поддерживаются
14
+ - ✅ **100% покрытие API** — Все 91 эндпоинт GitVerse API поддерживаются
12
15
  - ✅ **Rate Limits** — Автоматическая обработка лимитов запросов с информативными ошибками
13
16
  - ✅ **Версионирование API** — Предупреждения об устаревших версиях API
14
17
  - ✅ **Специализированные ошибки** — `RateLimitError`, `ApiVersionWarning` для точной обработки
@@ -133,7 +136,7 @@ await client.contents.update('owner', 'repo', 'path', { message: 'Update', conte
133
136
  await client.contents.delete('owner', 'repo', 'path', { message: 'Delete', sha: 'sha' });
134
137
  ```
135
138
 
136
- ### 🔀 Pull Requests (7 методов)
139
+ ### 🔀 Pull Requests (8 методов)
137
140
 
138
141
  ```typescript
139
142
  await client.pulls.list('owner', 'repo');
@@ -143,6 +146,7 @@ await client.pulls.update('owner', 'repo', 123, { title: 'Updated title' });
143
146
  await client.pulls.merge('owner', 'repo', 123);
144
147
  await client.pulls.getFiles('owner', 'repo', 123);
145
148
  await client.pulls.updateBranch('owner', 'repo', 123);
149
+ await client.pulls.checkIfMerged('owner', 'repo', 123); // Проверка: был ли PR влит
146
150
  ```
147
151
 
148
152
  ### 🐛 Issues (6 методов)
@@ -370,12 +374,15 @@ bun run lint:fix
370
374
 
371
375
  ## Лицензия
372
376
 
373
- MIT © [Ivan Bobchenkov](https://bobchenkov.ru)
377
+ MIT © [RainyPixel](https://gitverse.ru/RainyPixel)
374
378
 
375
- ---
379
+ ## Полезные ссылки
376
380
 
377
- **Ссылки:**
378
- - [GitVerse](https://gitverse.ru)
379
- - [Репозиторий](https://gitverse.ru/rainypixel/gitverse-sdk)
380
- - [Issues](https://gitverse.ru/rainypixel/gitverse-sdk/issues)
381
+ - [GitVerse SDK](https://gitverse.ru/RainyPixel/gitverse-sdk) - Основной репозиторий
382
+ - [GitVerse API Docs](https://gitverse.ru/gitverse/rest-api-description/content/master/v1/openapi-1.0.json) - Документация API
383
+ - [Issues](https://gitverse.ru/RainyPixel/gitverse-sdk/issues) - Сообщить об ошибке
381
384
  - [npm пакет](https://www.npmjs.com/package/gitverse-api-sdk)
385
+
386
+ ---
387
+
388
+ Сделано с ❤️ для GitVerse
@@ -513,5 +513,13 @@ declare class PullsApi {
513
513
  * @returns Список коммитов
514
514
  */
515
515
  getCommits(owner: string, repo: string, number: number): Promise<Commit[]>;
516
+ /**
517
+ * Проверяет, был ли pull request влит в базовую ветку
518
+ * @param owner Владелец репозитория
519
+ * @param repo Название репозитория
520
+ * @param number Номер pull request
521
+ * @returns true если PR был влит, false если не был влит или не существует
522
+ */
523
+ checkIfMerged(owner: string, repo: string, number: number): Promise<boolean>;
516
524
  }
517
525
  export { PullsApi };
package/dist/api/pulls.js CHANGED
@@ -1,4 +1,4 @@
1
- class v{client;constructor(d){this.client=d}create(d,g,f){return this.client.post(`/repos/${d}/${g}/pulls`,f)}get(d,g,f){return this.client.get(`/repos/${d}/${g}/pulls/${f}`)}list(d,g,f){let k=new URL(`/repos/${d}/${g}/pulls`,"http://localhost");if(f)k.searchParams.set("state",f);return this.client.get(k.href.replace("http://localhost",""))}update(d,g,f,j){return this.client.patch(`/repos/${d}/${g}/pulls/${f}`,j)}getFiles(d,g,f){return this.client.get(`/repos/${d}/${g}/pulls/${f}/files`)}updateBranch(d,g,f){return this.client.put(`/repos/${d}/${g}/pulls/${f}/update-branch`,{})}getCommits(d,g,f){return this.client.get(`/repos/${d}/${g}/pulls/${f}/commits`)}}export{v as PullsApi};
1
+ import{v as q}from"../errors.js";class v{client;constructor(d){this.client=d}create(d,g,f){return this.client.post(`/repos/${d}/${g}/pulls`,f)}get(d,g,f){return this.client.get(`/repos/${d}/${g}/pulls/${f}`)}list(d,g,f){let k=new URL(`/repos/${d}/${g}/pulls`,"http://localhost");if(f)k.searchParams.set("state",f);return this.client.get(k.href.replace("http://localhost",""))}update(d,g,f,j){return this.client.patch(`/repos/${d}/${g}/pulls/${f}`,j)}getFiles(d,g,f){return this.client.get(`/repos/${d}/${g}/pulls/${f}/files`)}updateBranch(d,g,f){return this.client.put(`/repos/${d}/${g}/pulls/${f}/update-branch`,{})}getCommits(d,g,f){return this.client.get(`/repos/${d}/${g}/pulls/${f}/commits`)}async checkIfMerged(d,g,f){try{return await this.client.get(`/repos/${d}/${g}/pulls/${f}/merge`),!0}catch(j){if(j instanceof q&&j.status===404)return!1;throw j}}}export{v as PullsApi};
2
2
  export{v as m};
3
3
 
4
- //# debugId=35A0A924DAC8BD1664756E2164756E21
4
+ //# debugId=25A34B7E93392AB864756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/api/pulls.ts"],
4
4
  "sourcesContent": [
5
- "import type { GitVerseClient } from \"../client\";\nimport type { PullRequestState } from \"../enums\";\nimport type { Commit, CreatePullRequestParams, PullRequest, PullRequestFile, UpdatePullRequestParams } from \"../types\";\n\n/**\n * API для работы с запросами на слияние (пулл-реквестами)\n */\nexport class PullsApi {\n private client: GitVerseClient;\n\n /**\n * Создает новый экземпляр API для работы с пулл-реквестами\n * @param client GitVerse клиент\n */\n constructor(client: GitVerseClient) {\n this.client = client;\n }\n\n /**\n * Создает новый запрос на слияние в репозитории\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param params Параметры создания запроса на слияние\n * @returns Информация о созданном запросе на слияние\n */\n create(owner: string, repo: string, params: CreatePullRequestParams): Promise<PullRequest> {\n return this.client.post<PullRequest>(`/repos/${owner}/${repo}/pulls`, params);\n }\n\n /**\n * Получает запрос на слияние по его номеру\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер запроса на слияние\n * @returns Информация о запросе на слияние\n */\n get(owner: string, repo: string, number: number): Promise<PullRequest> {\n return this.client.get<PullRequest>(`/repos/${owner}/${repo}/pulls/${number}`);\n }\n\n /**\n * Получает список запросов на слияние в репозитории\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param state Состояние запросов на слияние (открытые/закрытые/все)\n * @returns Список запросов на слияние\n */\n list(owner: string, repo: string, state?: PullRequestState): Promise<PullRequest[]> {\n const TEMP = \"http://localhost\";\n\n const path = new URL(`/repos/${owner}/${repo}/pulls`, TEMP);\n if (state) {\n path.searchParams.set(\"state\", state);\n }\n return this.client.get<PullRequest[]>(path.href.replace(TEMP, \"\"));\n }\n\n /**\n * Обновляет pull request\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер pull request\n * @param params Параметры для обновления\n * @returns Обновлённый pull request\n */\n update(owner: string, repo: string, number: number, params: UpdatePullRequestParams): Promise<PullRequest> {\n return this.client.patch<PullRequest>(`/repos/${owner}/${repo}/pulls/${number}`, params);\n }\n\n /**\n * Получает список файлов в pull request\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер pull request\n * @returns Список изменённых файлов\n */\n getFiles(owner: string, repo: string, number: number): Promise<PullRequestFile[]> {\n return this.client.get<PullRequestFile[]>(`/repos/${owner}/${repo}/pulls/${number}/files`);\n }\n\n /**\n * Обновляет ветку pull request с базовой веткой\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер pull request\n * @returns Результат операции\n */\n updateBranch(owner: string, repo: string, number: number): Promise<void> {\n return this.client.put<void>(`/repos/${owner}/${repo}/pulls/${number}/update-branch`, {});\n }\n\n /**\n * Получает список коммитов в pull request\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер pull request\n * @returns Список коммитов\n */\n getCommits(owner: string, repo: string, number: number): Promise<Commit[]> {\n return this.client.get<Commit[]>(`/repos/${owner}/${repo}/pulls/${number}/commits`);\n }\n}\n"
5
+ "import type { GitVerseClient } from \"../client\";\nimport type { PullRequestState } from \"../enums\";\nimport { GitVerseApiError } from \"../errors\";\nimport type { Commit, CreatePullRequestParams, PullRequest, PullRequestFile, UpdatePullRequestParams } from \"../types\";\n\n/**\n * API для работы с запросами на слияние (пулл-реквестами)\n */\nexport class PullsApi {\n private client: GitVerseClient;\n\n /**\n * Создает новый экземпляр API для работы с пулл-реквестами\n * @param client GitVerse клиент\n */\n constructor(client: GitVerseClient) {\n this.client = client;\n }\n\n /**\n * Создает новый запрос на слияние в репозитории\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param params Параметры создания запроса на слияние\n * @returns Информация о созданном запросе на слияние\n */\n create(owner: string, repo: string, params: CreatePullRequestParams): Promise<PullRequest> {\n return this.client.post<PullRequest>(`/repos/${owner}/${repo}/pulls`, params);\n }\n\n /**\n * Получает запрос на слияние по его номеру\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер запроса на слияние\n * @returns Информация о запросе на слияние\n */\n get(owner: string, repo: string, number: number): Promise<PullRequest> {\n return this.client.get<PullRequest>(`/repos/${owner}/${repo}/pulls/${number}`);\n }\n\n /**\n * Получает список запросов на слияние в репозитории\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param state Состояние запросов на слияние (открытые/закрытые/все)\n * @returns Список запросов на слияние\n */\n list(owner: string, repo: string, state?: PullRequestState): Promise<PullRequest[]> {\n const TEMP = \"http://localhost\";\n\n const path = new URL(`/repos/${owner}/${repo}/pulls`, TEMP);\n if (state) {\n path.searchParams.set(\"state\", state);\n }\n return this.client.get<PullRequest[]>(path.href.replace(TEMP, \"\"));\n }\n\n /**\n * Обновляет pull request\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер pull request\n * @param params Параметры для обновления\n * @returns Обновлённый pull request\n */\n update(owner: string, repo: string, number: number, params: UpdatePullRequestParams): Promise<PullRequest> {\n return this.client.patch<PullRequest>(`/repos/${owner}/${repo}/pulls/${number}`, params);\n }\n\n /**\n * Получает список файлов в pull request\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер pull request\n * @returns Список изменённых файлов\n */\n getFiles(owner: string, repo: string, number: number): Promise<PullRequestFile[]> {\n return this.client.get<PullRequestFile[]>(`/repos/${owner}/${repo}/pulls/${number}/files`);\n }\n\n /**\n * Обновляет ветку pull request с базовой веткой\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер pull request\n * @returns Результат операции\n */\n updateBranch(owner: string, repo: string, number: number): Promise<void> {\n return this.client.put<void>(`/repos/${owner}/${repo}/pulls/${number}/update-branch`, {});\n }\n\n /**\n * Получает список коммитов в pull request\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер pull request\n * @returns Список коммитов\n */\n getCommits(owner: string, repo: string, number: number): Promise<Commit[]> {\n return this.client.get<Commit[]>(`/repos/${owner}/${repo}/pulls/${number}/commits`);\n }\n\n /**\n * Проверяет, был ли pull request влит в базовую ветку\n * @param owner Владелец репозитория\n * @param repo Название репозитория\n * @param number Номер pull request\n * @returns true если PR был влит, false если не был влит или не существует\n */\n async checkIfMerged(owner: string, repo: string, number: number): Promise<boolean> {\n try {\n await this.client.get<void>(`/repos/${owner}/${repo}/pulls/${number}/merge`);\n return true; // Статус 204 - PR был влит\n } catch (error) {\n if (error instanceof GitVerseApiError && error.status === 404) {\n return false; // Статус 404 - PR не был влит или не существует\n }\n throw error; // Пробрасываем другие ошибки (401, 403, 500 и т.д.)\n }\n }\n}\n"
6
6
  ],
7
- "mappings": "AAOO,MAAM,CAAS,CACZ,OAMR,WAAW,CAAC,EAAwB,CAClC,KAAK,OAAS,EAUhB,MAAM,CAAC,EAAe,EAAc,EAAuD,CACzF,OAAO,KAAK,OAAO,KAAkB,UAAU,KAAS,UAAc,CAAM,EAU9E,GAAG,CAAC,EAAe,EAAc,EAAsC,CACrE,OAAO,KAAK,OAAO,IAAiB,UAAU,KAAS,WAAc,GAAQ,EAU/E,IAAI,CAAC,EAAe,EAAc,EAAkD,CAGlF,IAAM,EAAO,IAAI,IAAI,UAAU,KAAS,UAF3B,kBAE6C,EAC1D,GAAI,EACF,EAAK,aAAa,IAAI,QAAS,CAAK,EAEtC,OAAO,KAAK,OAAO,IAAmB,EAAK,KAAK,QANnC,mBAMiD,EAAE,CAAC,EAWnE,MAAM,CAAC,EAAe,EAAc,EAAgB,EAAuD,CACzG,OAAO,KAAK,OAAO,MAAmB,UAAU,KAAS,WAAc,IAAU,CAAM,EAUzF,QAAQ,CAAC,EAAe,EAAc,EAA4C,CAChF,OAAO,KAAK,OAAO,IAAuB,UAAU,KAAS,WAAc,SAAc,EAU3F,YAAY,CAAC,EAAe,EAAc,EAA+B,CACvE,OAAO,KAAK,OAAO,IAAU,UAAU,KAAS,WAAc,kBAAwB,CAAC,CAAC,EAU1F,UAAU,CAAC,EAAe,EAAc,EAAmC,CACzE,OAAO,KAAK,OAAO,IAAc,UAAU,KAAS,WAAc,WAAgB,EAEtF",
8
- "debugId": "35A0A924DAC8BD1664756E2164756E21",
7
+ "mappings": "iCAQO,MAAM,CAAS,CACZ,OAMR,WAAW,CAAC,EAAwB,CAClC,KAAK,OAAS,EAUhB,MAAM,CAAC,EAAe,EAAc,EAAuD,CACzF,OAAO,KAAK,OAAO,KAAkB,UAAU,KAAS,UAAc,CAAM,EAU9E,GAAG,CAAC,EAAe,EAAc,EAAsC,CACrE,OAAO,KAAK,OAAO,IAAiB,UAAU,KAAS,WAAc,GAAQ,EAU/E,IAAI,CAAC,EAAe,EAAc,EAAkD,CAGlF,IAAM,EAAO,IAAI,IAAI,UAAU,KAAS,UAF3B,kBAE6C,EAC1D,GAAI,EACF,EAAK,aAAa,IAAI,QAAS,CAAK,EAEtC,OAAO,KAAK,OAAO,IAAmB,EAAK,KAAK,QANnC,mBAMiD,EAAE,CAAC,EAWnE,MAAM,CAAC,EAAe,EAAc,EAAgB,EAAuD,CACzG,OAAO,KAAK,OAAO,MAAmB,UAAU,KAAS,WAAc,IAAU,CAAM,EAUzF,QAAQ,CAAC,EAAe,EAAc,EAA4C,CAChF,OAAO,KAAK,OAAO,IAAuB,UAAU,KAAS,WAAc,SAAc,EAU3F,YAAY,CAAC,EAAe,EAAc,EAA+B,CACvE,OAAO,KAAK,OAAO,IAAU,UAAU,KAAS,WAAc,kBAAwB,CAAC,CAAC,EAU1F,UAAU,CAAC,EAAe,EAAc,EAAmC,CACzE,OAAO,KAAK,OAAO,IAAc,UAAU,KAAS,WAAc,WAAgB,OAU9E,cAAa,CAAC,EAAe,EAAc,EAAkC,CACjF,GAAI,CAEF,OADA,MAAM,KAAK,OAAO,IAAU,UAAU,KAAS,WAAc,SAAc,EACpE,GACP,MAAO,EAAO,CACd,GAAI,aAAiB,GAAoB,EAAM,SAAW,IACxD,MAAO,GAET,MAAM,GAGZ",
8
+ "debugId": "25A34B7E93392AB864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/client.ts"],
4
4
  "sourcesContent": [
5
- "import { ApiVersionWarning, GitVerseApiError, RateLimitError } from \"./errors\";\nimport type { ApiError, ApiResponseMetadata, ApiVersionInfo, RateLimitInfo } from \"./types\";\n\nexport const HTTPMethods = {\n DELETE: \"DELETE\",\n GET: \"GET\",\n PATCH: \"PATCH\",\n POST: \"POST\",\n PUT: \"PUT\",\n} as const;\n\nexport type HTTPMethods = (typeof HTTPMethods)[keyof typeof HTTPMethods];\n\n/**\n * Параметры для конфигурации GitVerse клиента\n */\nexport interface GitVerseClientConfig {\n /**\n * Базовый URL API GitVerse\n * @default 'https://api.gitverse.ru'\n */\n baseUrl?: string;\n\n /**\n * Токен доступа для авторизации в API\n */\n token?: string;\n\n /**\n * Версия API\n * @default '1'\n */\n apiVersion?: string;\n}\n\n/**\n * Основной класс для работы с GitVerse API\n */\nexport class GitVerseClient {\n private baseUrl: string;\n private token?: string;\n private apiVersion: string;\n\n /**\n * Callback для обработки предупреждений об устаревшей версии API\n */\n public onApiVersionWarning?: (warning: ApiVersionWarning) => void;\n\n /**\n * Создает новый экземпляр GitVerse клиента\n * @param config Конфигурация клиента\n */\n constructor(config: GitVerseClientConfig = {}) {\n this.baseUrl = config.baseUrl || \"https://api.gitverse.ru\";\n this.token = config.token;\n this.apiVersion = config.apiVersion || \"1\";\n }\n\n /**\n * Устанавливает токен авторизации\n * @param token Токен доступа\n */\n setToken(token: string): void {\n this.token = token;\n }\n\n /**\n * Извлекает информацию о Rate Limit из заголовков ответа\n */\n private extractRateLimitInfo(headers: Headers): RateLimitInfo | undefined {\n const limit = headers.get(\"GitVerse-RateLimit-Limit\");\n const remaining = headers.get(\"GitVerse-RateLimit-Remaining\");\n const retryAfter = headers.get(\"GitVerse-RateLimit-Retry-After\");\n const reset = headers.get(\"Gitverse-Ratelimit-Reset\");\n\n if (!(limit && remaining && retryAfter && reset)) {\n return;\n }\n\n return {\n limit: Number.parseInt(limit, 10),\n remaining: Number.parseInt(remaining, 10),\n reset: Number.parseInt(reset, 10),\n retryAfter: Number.parseInt(retryAfter, 10),\n };\n }\n\n /**\n * Извлекает информацию о версии API из заголовков ответа\n */\n private extractApiVersionInfo(headers: Headers): ApiVersionInfo | undefined {\n const version = headers.get(\"Gitverse-Api-Version\");\n const latestVersion = headers.get(\"Gitverse-Api-Latest-Version\");\n const deprecated = headers.get(\"Gitverse-Api-Deprecation\") === \"true\";\n const decommissioning = headers.get(\"Gitverse-Api-Decommissioning\");\n\n if (!(version && latestVersion)) {\n return;\n }\n\n return {\n decommissioning: decommissioning || undefined,\n deprecated,\n latestVersion,\n version,\n };\n }\n\n /**\n * Извлекает метаданные из заголовков ответа\n */\n private extractMetadata(headers: Headers): ApiResponseMetadata {\n const rateLimit = this.extractRateLimitInfo(headers);\n const apiVersion = this.extractApiVersionInfo(headers);\n\n // Проверяем устаревшую версию API и вызываем callback\n if (apiVersion?.deprecated && this.onApiVersionWarning) {\n const warning = new ApiVersionWarning(apiVersion.version, apiVersion.latestVersion, apiVersion.decommissioning);\n this.onApiVersionWarning(warning);\n }\n\n return {\n apiVersion,\n rateLimit,\n };\n }\n\n /**\n * Выполняет API-запрос с учетом авторизации и версии API\n * @param path Путь к API-ресурсу\n * @param method HTTP-метод\n * @param body Тело запроса (опционально)\n * @returns Ответ от API\n * @throws {RateLimitError} При превышении лимита запросов (429)\n * @throws {GitVerseApiError} При других ошибках API\n */\n async request<T>(path: string, method: HTTPMethods, body?: unknown): Promise<T> {\n // Правильная конкатенация URL: убираем начальный / из path если он есть\n const cleanPath = path.startsWith(\"/\") ? path.slice(1) : path;\n const url = `${this.baseUrl}/${cleanPath}`;\n\n const headers = new Headers();\n\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"Accept\", `application/vnd.gitverse.object+json; version=${this.apiVersion}`);\n\n if (this.token) {\n headers.set(\"Authorization\", `Bearer ${this.token}`);\n }\n\n const options: RequestInit = {\n body: body ? JSON.stringify(body) : undefined,\n headers,\n method,\n };\n\n const response = await fetch(url, options);\n\n // Извлекаем метаданные из заголовков\n const metadata = this.extractMetadata(response.headers);\n\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n data = undefined;\n }\n\n if (!response.ok) {\n const error = data as ApiError | undefined;\n const errorMessage = error?.message || response.statusText;\n\n // Обработка ошибки превышения лимита запросов\n if (response.status === 429 && metadata.rateLimit) {\n throw new RateLimitError(\n errorMessage || \"Превышен лимит запросов. Попробуйте позже.\",\n metadata.rateLimit,\n metadata,\n );\n }\n\n // Общая ошибка API\n throw new GitVerseApiError(response.status, errorMessage, metadata);\n }\n\n return data as T;\n }\n\n /**\n * Выполняет GET-запрос\n * @param path Путь к API-ресурсу\n * @returns Ответ от API\n */\n get<T>(path: string): Promise<T> {\n return this.request<T>(path, HTTPMethods.GET);\n }\n\n /**\n * Выполняет POST-запрос\n * @param path Путь к API-ресурсу\n * @param body Тело запроса\n * @returns Ответ от API\n */\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, HTTPMethods.POST, body);\n }\n\n /**\n * Выполняет PUT-запрос\n * @param path Путь к API-ресурсу\n * @param body Тело запроса\n * @returns Ответ от API\n */\n put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, HTTPMethods.PUT, body);\n }\n\n /**\n * Выполняет DELETE-запрос\n * @param path Путь к API-ресурсу\n * @param body Тело запроса (опционально)\n * @returns Ответ от API\n */\n delete<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, HTTPMethods.DELETE, body);\n }\n\n /**\n * Выполняет PATCH-запрос\n * @param path Путь к API-ресурсу\n * @param body Тело запроса\n * @returns Ответ от API\n */\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, HTTPMethods.PATCH, body);\n }\n}\n"
5
+ "import { ApiVersionWarning, GitVerseApiError, RateLimitError } from \"./errors\";\nimport type { ApiError, ApiResponseMetadata, ApiVersionInfo, RateLimitInfo } from \"./types\";\nexport const HTTPMethods = {\n DELETE: \"DELETE\",\n GET: \"GET\",\n PATCH: \"PATCH\",\n POST: \"POST\",\n PUT: \"PUT\",\n} as const;\n\nexport type HTTPMethods = (typeof HTTPMethods)[keyof typeof HTTPMethods];\n\n/**\n * Параметры для конфигурации GitVerse клиента\n */\nexport interface GitVerseClientConfig {\n /**\n * Базовый URL API GitVerse\n * @default 'https://api.gitverse.ru'\n */\n baseUrl?: string;\n\n /**\n * Токен доступа для авторизации в API\n */\n token?: string;\n\n /**\n * Версия API\n * @default '1'\n */\n apiVersion?: string;\n}\n\n/**\n * Основной класс для работы с GitVerse API\n */\nexport class GitVerseClient {\n private baseUrl: string;\n private token?: string;\n private apiVersion: string;\n\n /**\n * Callback для обработки предупреждений об устаревшей версии API\n */\n public onApiVersionWarning?: (warning: ApiVersionWarning) => void;\n\n /**\n * Создает новый экземпляр GitVerse клиента\n * @param config Конфигурация клиента\n */\n constructor(config: GitVerseClientConfig = {}) {\n this.baseUrl = config.baseUrl || \"https://api.gitverse.ru\";\n this.token = config.token;\n this.apiVersion = config.apiVersion || \"1\";\n }\n\n /**\n * Устанавливает токен авторизации\n * @param token Токен доступа\n */\n setToken(token: string): void {\n this.token = token;\n }\n\n /**\n * Извлекает информацию о Rate Limit из заголовков ответа\n */\n private extractRateLimitInfo(headers: Headers): RateLimitInfo | undefined {\n const limit = headers.get(\"GitVerse-RateLimit-Limit\");\n const remaining = headers.get(\"GitVerse-RateLimit-Remaining\");\n const retryAfter = headers.get(\"GitVerse-RateLimit-Retry-After\");\n const reset = headers.get(\"Gitverse-Ratelimit-Reset\");\n\n if (!(limit && remaining && retryAfter && reset)) {\n return;\n }\n\n return {\n limit: Number.parseInt(limit, 10),\n remaining: Number.parseInt(remaining, 10),\n reset: Number.parseInt(reset, 10),\n retryAfter: Number.parseInt(retryAfter, 10),\n };\n }\n\n /**\n * Извлекает информацию о версии API из заголовков ответа\n */\n private extractApiVersionInfo(headers: Headers): ApiVersionInfo | undefined {\n const version = headers.get(\"Gitverse-Api-Version\");\n const latestVersion = headers.get(\"Gitverse-Api-Latest-Version\");\n const deprecated = headers.get(\"Gitverse-Api-Deprecation\") === \"true\";\n const decommissioning = headers.get(\"Gitverse-Api-Decommissioning\");\n\n if (!(version && latestVersion)) {\n return;\n }\n\n return {\n decommissioning: decommissioning || undefined,\n deprecated,\n latestVersion,\n version,\n };\n }\n\n /**\n * Извлекает метаданные из заголовков ответа\n */\n private extractMetadata(headers: Headers): ApiResponseMetadata {\n const rateLimit = this.extractRateLimitInfo(headers);\n const apiVersion = this.extractApiVersionInfo(headers);\n\n // Проверяем устаревшую версию API и вызываем callback\n if (apiVersion?.deprecated && this.onApiVersionWarning) {\n const warning = new ApiVersionWarning(apiVersion.version, apiVersion.latestVersion, apiVersion.decommissioning);\n this.onApiVersionWarning(warning);\n }\n\n return {\n apiVersion,\n rateLimit,\n };\n }\n\n /**\n * Выполняет API-запрос с учетом авторизации и версии API\n * @param path Путь к API-ресурсу\n * @param method HTTP-метод\n * @param body Тело запроса (опционально)\n * @returns Ответ от API\n * @throws {RateLimitError} При превышении лимита запросов (429)\n * @throws {GitVerseApiError} При других ошибках API\n */\n async request<T>(path: string, method: HTTPMethods, body?: unknown): Promise<T> {\n // Правильная конкатенация URL: убираем начальный / из path если он есть\n const cleanPath = path.startsWith(\"/\") ? path.slice(1) : path;\n const url = `${this.baseUrl}/${cleanPath}`;\n\n const headers = new Headers();\n\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"Accept\", `application/vnd.gitverse.object+json; version=${this.apiVersion}`);\n\n if (this.token) {\n headers.set(\"Authorization\", `Bearer ${this.token}`);\n }\n\n const options: RequestInit = {\n body: body ? JSON.stringify(body) : undefined,\n headers,\n method,\n };\n\n const response = await fetch(url, options);\n\n // Извлекаем метаданные из заголовков\n const metadata = this.extractMetadata(response.headers);\n\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n data = undefined;\n }\n\n if (!response.ok) {\n const error = data as ApiError | undefined;\n const errorMessage = error?.message || response.statusText;\n\n // Обработка ошибки превышения лимита запросов\n if (response.status === 429 && metadata.rateLimit) {\n throw new RateLimitError(\n errorMessage || \"Превышен лимит запросов. Попробуйте позже.\",\n metadata.rateLimit,\n metadata,\n );\n }\n\n // Общая ошибка API\n throw new GitVerseApiError(response.status, errorMessage, metadata);\n }\n\n return data as T;\n }\n\n /**\n * Выполняет GET-запрос\n * @param path Путь к API-ресурсу\n * @returns Ответ от API\n */\n get<T>(path: string): Promise<T> {\n return this.request<T>(path, HTTPMethods.GET);\n }\n\n /**\n * Выполняет POST-запрос\n * @param path Путь к API-ресурсу\n * @param body Тело запроса\n * @returns Ответ от API\n */\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, HTTPMethods.POST, body);\n }\n\n /**\n * Выполняет PUT-запрос\n * @param path Путь к API-ресурсу\n * @param body Тело запроса\n * @returns Ответ от API\n */\n put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, HTTPMethods.PUT, body);\n }\n\n /**\n * Выполняет DELETE-запрос\n * @param path Путь к API-ресурсу\n * @param body Тело запроса (опционально)\n * @returns Ответ от API\n */\n delete<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, HTTPMethods.DELETE, body);\n }\n\n /**\n * Выполняет PATCH-запрос\n * @param path Путь к API-ресурсу\n * @param body Тело запроса\n * @returns Ответ от API\n */\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, HTTPMethods.PATCH, body);\n }\n}\n"
6
6
  ],
7
- "mappings": "8CAGO,IAAM,EAAc,CACzB,OAAQ,SACR,IAAK,MACL,MAAO,QACP,KAAM,OACN,IAAK,KACP,EA6BO,MAAM,CAAe,CAClB,QACA,MACA,WAKD,oBAMP,WAAW,CAAC,EAA+B,CAAC,EAAG,CAC7C,KAAK,QAAU,EAAO,SAAW,0BACjC,KAAK,MAAQ,EAAO,MACpB,KAAK,WAAa,EAAO,YAAc,IAOzC,QAAQ,CAAC,EAAqB,CAC5B,KAAK,MAAQ,EAMP,oBAAoB,CAAC,EAA6C,CACxE,IAAM,EAAQ,EAAQ,IAAI,0BAA0B,EAC9C,EAAY,EAAQ,IAAI,8BAA8B,EACtD,EAAa,EAAQ,IAAI,gCAAgC,EACzD,EAAQ,EAAQ,IAAI,0BAA0B,EAEpD,GAAI,EAAE,GAAS,GAAa,GAAc,GACxC,OAGF,MAAO,CACL,MAAO,OAAO,SAAS,EAAO,EAAE,EAChC,UAAW,OAAO,SAAS,EAAW,EAAE,EACxC,MAAO,OAAO,SAAS,EAAO,EAAE,EAChC,WAAY,OAAO,SAAS,EAAY,EAAE,CAC5C,EAMM,qBAAqB,CAAC,EAA8C,CAC1E,IAAM,EAAU,EAAQ,IAAI,sBAAsB,EAC5C,EAAgB,EAAQ,IAAI,6BAA6B,EACzD,EAAa,EAAQ,IAAI,0BAA0B,IAAM,OACzD,EAAkB,EAAQ,IAAI,8BAA8B,EAElE,GAAI,EAAE,GAAW,GACf,OAGF,MAAO,CACL,gBAAiB,GAAmB,OACpC,aACA,gBACA,SACF,EAMM,eAAe,CAAC,EAAuC,CAC7D,IAAM,EAAY,KAAK,qBAAqB,CAAO,EAC7C,EAAa,KAAK,sBAAsB,CAAO,EAGrD,GAAI,GAAY,YAAc,KAAK,oBAAqB,CACtD,IAAM,EAAU,IAAI,EAAkB,EAAW,QAAS,EAAW,cAAe,EAAW,eAAe,EAC9G,KAAK,oBAAoB,CAAO,EAGlC,MAAO,CACL,aACA,WACF,OAYI,QAAU,CAAC,EAAc,EAAqB,EAA4B,CAE9E,IAAM,EAAY,EAAK,WAAW,GAAG,EAAI,EAAK,MAAM,CAAC,EAAI,EACnD,EAAM,GAAG,KAAK,WAAW,IAEzB,EAAU,IAAI,QAKpB,GAHA,EAAQ,IAAI,eAAgB,kBAAkB,EAC9C,EAAQ,IAAI,SAAU,iDAAiD,KAAK,YAAY,EAEpF,KAAK,MACP,EAAQ,IAAI,gBAAiB,UAAU,KAAK,OAAO,EAGrD,IAAM,EAAuB,CAC3B,KAAM,EAAO,KAAK,UAAU,CAAI,EAAI,OACpC,UACA,QACF,EAEM,EAAW,MAAM,MAAM,EAAK,CAAO,EAGnC,EAAW,KAAK,gBAAgB,EAAS,OAAO,EAElD,EACJ,GAAI,CACF,EAAO,MAAM,EAAS,KAAK,EAC3B,KAAM,CACN,EAAO,OAGT,GAAI,CAAC,EAAS,GAAI,CAEhB,IAAM,EADQ,GACc,SAAW,EAAS,WAGhD,GAAI,EAAS,SAAW,KAAO,EAAS,UACtC,MAAM,IAAI,EACR,GAAgB,6CAChB,EAAS,UACT,CACF,EAIF,MAAM,IAAI,EAAiB,EAAS,OAAQ,EAAc,CAAQ,EAGpE,OAAO,EAQT,GAAM,CAAC,EAA0B,CAC/B,OAAO,KAAK,QAAW,EAAM,EAAY,GAAG,EAS9C,IAAO,CAAC,EAAc,EAA4B,CAChD,OAAO,KAAK,QAAW,EAAM,EAAY,KAAM,CAAI,EASrD,GAAM,CAAC,EAAc,EAA4B,CAC/C,OAAO,KAAK,QAAW,EAAM,EAAY,IAAK,CAAI,EASpD,MAAS,CAAC,EAAc,EAA4B,CAClD,OAAO,KAAK,QAAW,EAAM,EAAY,OAAQ,CAAI,EASvD,KAAQ,CAAC,EAAc,EAA4B,CACjD,OAAO,KAAK,QAAW,EAAM,EAAY,MAAO,CAAI,EAExD",
7
+ "mappings": "8CAEO,IAAM,EAAc,CACzB,OAAQ,SACR,IAAK,MACL,MAAO,QACP,KAAM,OACN,IAAK,KACP,EA6BO,MAAM,CAAe,CAClB,QACA,MACA,WAKD,oBAMP,WAAW,CAAC,EAA+B,CAAC,EAAG,CAC7C,KAAK,QAAU,EAAO,SAAW,0BACjC,KAAK,MAAQ,EAAO,MACpB,KAAK,WAAa,EAAO,YAAc,IAOzC,QAAQ,CAAC,EAAqB,CAC5B,KAAK,MAAQ,EAMP,oBAAoB,CAAC,EAA6C,CACxE,IAAM,EAAQ,EAAQ,IAAI,0BAA0B,EAC9C,EAAY,EAAQ,IAAI,8BAA8B,EACtD,EAAa,EAAQ,IAAI,gCAAgC,EACzD,EAAQ,EAAQ,IAAI,0BAA0B,EAEpD,GAAI,EAAE,GAAS,GAAa,GAAc,GACxC,OAGF,MAAO,CACL,MAAO,OAAO,SAAS,EAAO,EAAE,EAChC,UAAW,OAAO,SAAS,EAAW,EAAE,EACxC,MAAO,OAAO,SAAS,EAAO,EAAE,EAChC,WAAY,OAAO,SAAS,EAAY,EAAE,CAC5C,EAMM,qBAAqB,CAAC,EAA8C,CAC1E,IAAM,EAAU,EAAQ,IAAI,sBAAsB,EAC5C,EAAgB,EAAQ,IAAI,6BAA6B,EACzD,EAAa,EAAQ,IAAI,0BAA0B,IAAM,OACzD,EAAkB,EAAQ,IAAI,8BAA8B,EAElE,GAAI,EAAE,GAAW,GACf,OAGF,MAAO,CACL,gBAAiB,GAAmB,OACpC,aACA,gBACA,SACF,EAMM,eAAe,CAAC,EAAuC,CAC7D,IAAM,EAAY,KAAK,qBAAqB,CAAO,EAC7C,EAAa,KAAK,sBAAsB,CAAO,EAGrD,GAAI,GAAY,YAAc,KAAK,oBAAqB,CACtD,IAAM,EAAU,IAAI,EAAkB,EAAW,QAAS,EAAW,cAAe,EAAW,eAAe,EAC9G,KAAK,oBAAoB,CAAO,EAGlC,MAAO,CACL,aACA,WACF,OAYI,QAAU,CAAC,EAAc,EAAqB,EAA4B,CAE9E,IAAM,EAAY,EAAK,WAAW,GAAG,EAAI,EAAK,MAAM,CAAC,EAAI,EACnD,EAAM,GAAG,KAAK,WAAW,IAEzB,EAAU,IAAI,QAKpB,GAHA,EAAQ,IAAI,eAAgB,kBAAkB,EAC9C,EAAQ,IAAI,SAAU,iDAAiD,KAAK,YAAY,EAEpF,KAAK,MACP,EAAQ,IAAI,gBAAiB,UAAU,KAAK,OAAO,EAGrD,IAAM,EAAuB,CAC3B,KAAM,EAAO,KAAK,UAAU,CAAI,EAAI,OACpC,UACA,QACF,EAEM,EAAW,MAAM,MAAM,EAAK,CAAO,EAGnC,EAAW,KAAK,gBAAgB,EAAS,OAAO,EAElD,EACJ,GAAI,CACF,EAAO,MAAM,EAAS,KAAK,EAC3B,KAAM,CACN,EAAO,OAGT,GAAI,CAAC,EAAS,GAAI,CAEhB,IAAM,EADQ,GACc,SAAW,EAAS,WAGhD,GAAI,EAAS,SAAW,KAAO,EAAS,UACtC,MAAM,IAAI,EACR,GAAgB,6CAChB,EAAS,UACT,CACF,EAIF,MAAM,IAAI,EAAiB,EAAS,OAAQ,EAAc,CAAQ,EAGpE,OAAO,EAQT,GAAM,CAAC,EAA0B,CAC/B,OAAO,KAAK,QAAW,EAAM,EAAY,GAAG,EAS9C,IAAO,CAAC,EAAc,EAA4B,CAChD,OAAO,KAAK,QAAW,EAAM,EAAY,KAAM,CAAI,EASrD,GAAM,CAAC,EAAc,EAA4B,CAC/C,OAAO,KAAK,QAAW,EAAM,EAAY,IAAK,CAAI,EASpD,MAAS,CAAC,EAAc,EAA4B,CAClD,OAAO,KAAK,QAAW,EAAM,EAAY,OAAQ,CAAI,EASvD,KAAQ,CAAC,EAAc,EAA4B,CACjD,OAAO,KAAK,QAAW,EAAM,EAAY,MAAO,CAAI,EAExD",
8
8
  "debugId": "3C1435E422FBD05064756E2164756E21",
9
9
  "names": []
10
10
  }
package/dist/index.d.ts CHANGED
@@ -2009,6 +2009,14 @@ declare class PullsApi {
2009
2009
  * @returns Список коммитов
2010
2010
  */
2011
2011
  getCommits(owner: string, repo: string, number: number): Promise<Commit[]>;
2012
+ /**
2013
+ * Проверяет, был ли pull request влит в базовую ветку
2014
+ * @param owner Владелец репозитория
2015
+ * @param repo Название репозитория
2016
+ * @param number Номер pull request
2017
+ * @returns true если PR был влит, false если не был влит или не существует
2018
+ */
2019
+ checkIfMerged(owner: string, repo: string, number: number): Promise<boolean>;
2012
2020
  }
2013
2021
  /**
2014
2022
  * API для работы с релизами репозитория
package/package.json CHANGED
@@ -1,9 +1,7 @@
1
1
  {
2
2
  "name": "gitverse-api-sdk",
3
- "version": "2.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "Полнофункциональный TypeScript SDK для GitVerse API с поддержкой всех эндпоинтов, обработкой Rate Limits и версионирования",
5
- "type": "module",
6
- "sideEffects": false,
7
5
  "keywords": [
8
6
  "gitverse",
9
7
  "api",
@@ -18,24 +16,38 @@
18
16
  "releases",
19
17
  "ci-cd"
20
18
  ],
21
- "main": "dist/index.js",
22
- "types": "dist/index.d.ts",
19
+ "homepage": "https://gitverse.ru/rainypixel/gitverse-sdk#readme",
20
+ "bugs": {
21
+ "url": "https://gitverse.ru/rainypixel/gitverse-sdk/issues"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://gitverse.ru/rainypixel/gitverse-sdk.git"
26
+ },
27
+ "license": "MIT",
28
+ "author": "Ivan Bobchenkov<me@bobchenkov.ru>",
29
+ "sideEffects": false,
30
+ "type": "module",
23
31
  "exports": {
24
32
  ".": {
25
33
  "import": "./dist/index.js",
26
34
  "types": "./dist/index.d.ts"
27
35
  },
28
- "./client": {
29
- "import": "./dist/client.js",
30
- "types": "./dist/client.d.ts"
36
+ "./api/actions": {
37
+ "import": "./dist/api/actions.js",
38
+ "types": "./dist/api/actions.d.ts"
31
39
  },
32
- "./enums": {
33
- "import": "./dist/enums.js",
34
- "types": "./dist/enums.d.ts"
40
+ "./api/branches": {
41
+ "import": "./dist/api/branches.js",
42
+ "types": "./dist/api/branches.d.ts"
35
43
  },
36
- "./types": {
37
- "import": "./dist/types.js",
38
- "types": "./dist/types.d.ts"
44
+ "./api/collaborators": {
45
+ "import": "./dist/api/collaborators.js",
46
+ "types": "./dist/api/collaborators.d.ts"
47
+ },
48
+ "./api/commits": {
49
+ "import": "./dist/api/commits.js",
50
+ "types": "./dist/api/commits.d.ts"
39
51
  },
40
52
  "./api/contents": {
41
53
  "import": "./dist/api/contents.js",
@@ -49,14 +61,26 @@
49
61
  "import": "./dist/api/forks.js",
50
62
  "types": "./dist/api/forks.d.ts"
51
63
  },
64
+ "./api/git": {
65
+ "import": "./dist/api/git.js",
66
+ "types": "./dist/api/git.d.ts"
67
+ },
52
68
  "./api/issues": {
53
69
  "import": "./dist/api/issues.js",
54
70
  "types": "./dist/api/issues.d.ts"
55
71
  },
72
+ "./api/organizations": {
73
+ "import": "./dist/api/organizations.js",
74
+ "types": "./dist/api/organizations.d.ts"
75
+ },
56
76
  "./api/pulls": {
57
77
  "import": "./dist/api/pulls.js",
58
78
  "types": "./dist/api/pulls.d.ts"
59
79
  },
80
+ "./api/releases": {
81
+ "import": "./dist/api/releases.js",
82
+ "types": "./dist/api/releases.d.ts"
83
+ },
60
84
  "./api/repositories": {
61
85
  "import": "./dist/api/repositories.js",
62
86
  "types": "./dist/api/repositories.d.ts"
@@ -65,82 +89,49 @@
65
89
  "import": "./dist/api/stars.js",
66
90
  "types": "./dist/api/stars.d.ts"
67
91
  },
92
+ "./api/teams": {
93
+ "import": "./dist/api/teams.js",
94
+ "types": "./dist/api/teams.d.ts"
95
+ },
68
96
  "./api/users": {
69
97
  "import": "./dist/api/users.js",
70
98
  "types": "./dist/api/users.d.ts"
71
99
  },
72
- "./api/actions": {
73
- "import": "./dist/api/actions.js",
74
- "types": "./dist/api/actions.d.ts"
75
- },
76
- "./api/branches": {
77
- "import": "./dist/api/branches.js",
78
- "types": "./dist/api/branches.d.ts"
79
- },
80
- "./api/collaborators": {
81
- "import": "./dist/api/collaborators.js",
82
- "types": "./dist/api/collaborators.d.ts"
83
- },
84
- "./api/commits": {
85
- "import": "./dist/api/commits.js",
86
- "types": "./dist/api/commits.d.ts"
87
- },
88
- "./api/git": {
89
- "import": "./dist/api/git.js",
90
- "types": "./dist/api/git.d.ts"
91
- },
92
- "./api/organizations": {
93
- "import": "./dist/api/organizations.js",
94
- "types": "./dist/api/organizations.d.ts"
95
- },
96
- "./api/releases": {
97
- "import": "./dist/api/releases.js",
98
- "types": "./dist/api/releases.d.ts"
100
+ "./client": {
101
+ "import": "./dist/client.js",
102
+ "types": "./dist/client.d.ts"
99
103
  },
100
- "./api/teams": {
101
- "import": "./dist/api/teams.js",
102
- "types": "./dist/api/teams.d.ts"
104
+ "./enums": {
105
+ "import": "./dist/enums.js",
106
+ "types": "./dist/enums.d.ts"
103
107
  },
104
108
  "./errors": {
105
109
  "import": "./dist/errors.js",
106
110
  "types": "./dist/errors.d.ts"
111
+ },
112
+ "./types": {
113
+ "import": "./dist/types.js",
114
+ "types": "./dist/types.d.ts"
107
115
  }
108
116
  },
117
+ "main": "dist/index.js",
118
+ "types": "dist/index.d.ts",
109
119
  "files": [
110
120
  "dist"
111
121
  ],
112
- "author": "Ivan Bobchenkov<me@bobchenkov.ru>",
113
122
  "scripts": {
114
123
  "build": "bun build.ts",
124
+ "dev": "bun build.ts --watch",
115
125
  "test": "bun test",
116
126
  "test:coverage": "bun test --coverage",
117
- "prepublishOnly": "bun run build",
118
- "lint": "biome check",
119
- "lint:fix": "biome check --write",
120
127
  "typecheck": "tsc --noEmit"
121
128
  },
122
- "license": "MIT",
123
- "repository": {
124
- "type": "git",
125
- "url": "https://gitverse.ru/rainypixel/gitverse-sdk.git"
126
- },
127
- "bugs": {
128
- "url": "https://gitverse.ru/rainypixel/gitverse-sdk/issues"
129
- },
130
- "homepage": "https://gitverse.ru/rainypixel/gitverse-sdk#readme",
131
129
  "devDependencies": {
132
130
  "@aryzing/bun-mock-fetch": "^1.1.0",
133
- "@biomejs/biome": "^2.3.2",
134
- "@semantic-release/changelog": "^6.0.3",
135
- "@semantic-release/exec": "^7.1.0",
136
- "@semantic-release/git": "^10.0.1",
137
131
  "@types/bun": "1.3.0",
138
132
  "bun-bagel": "^1.2.0",
139
133
  "bun-dts": "^0.1.70",
140
134
  "bun-plugin-dts": "^0.3.0",
141
- "conventional-changelog-conventionalcommits": "^7.0.2",
142
- "lefthook": "^2.0.2",
143
- "semantic-release": "^22.0.12",
144
135
  "typescript": "^5.9.3"
145
136
  },
146
137
  "publishConfig": {