rustore 1.0.1 → 1.0.2

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 (50) hide show
  1. package/README.md +82 -5
  2. package/dist/api/apps.d.ts +42 -4
  3. package/dist/api/apps.d.ts.map +1 -1
  4. package/dist/api/apps.js +103 -15
  5. package/dist/api/apps.js.map +1 -1
  6. package/dist/api/auth.d.ts +8 -0
  7. package/dist/api/auth.d.ts.map +1 -1
  8. package/dist/api/auth.js +8 -0
  9. package/dist/api/auth.js.map +1 -1
  10. package/dist/api/catalog.d.ts +2 -0
  11. package/dist/api/catalog.d.ts.map +1 -1
  12. package/dist/api/catalog.js +2 -0
  13. package/dist/api/catalog.js.map +1 -1
  14. package/dist/api/client.d.ts +6 -1
  15. package/dist/api/client.d.ts.map +1 -1
  16. package/dist/api/client.js +21 -5
  17. package/dist/api/client.js.map +1 -1
  18. package/dist/api/feedback.d.ts +86 -0
  19. package/dist/api/feedback.d.ts.map +1 -0
  20. package/dist/api/feedback.js +113 -0
  21. package/dist/api/feedback.js.map +1 -0
  22. package/dist/api/payments-app.d.ts +2 -0
  23. package/dist/api/payments-app.d.ts.map +1 -1
  24. package/dist/api/payments-app.js +2 -0
  25. package/dist/api/payments-app.js.map +1 -1
  26. package/dist/api/payments.d.ts +2 -0
  27. package/dist/api/payments.d.ts.map +1 -1
  28. package/dist/api/payments.js +2 -0
  29. package/dist/api/payments.js.map +1 -1
  30. package/dist/bin.js +174 -2
  31. package/dist/bin.js.map +1 -1
  32. package/dist/commands/apps.d.ts +13 -0
  33. package/dist/commands/apps.d.ts.map +1 -1
  34. package/dist/commands/apps.js +85 -2
  35. package/dist/commands/apps.js.map +1 -1
  36. package/dist/commands/feedback.d.ts +30 -0
  37. package/dist/commands/feedback.d.ts.map +1 -0
  38. package/dist/commands/feedback.js +189 -0
  39. package/dist/commands/feedback.js.map +1 -0
  40. package/dist/config.d.ts +2 -1
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +2 -1
  43. package/dist/config.js.map +1 -1
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/types.d.ts +168 -0
  49. package/dist/types.d.ts.map +1 -1
  50. package/package.json +2 -2
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  <h1 align="center">rustore<br>CLI для работы с RuStore API</h1>
2
2
 
3
3
  <p align="center">
4
- Командная строка для взаимодействия с RuStore API, похожая на Expo CLI
4
+ Командная строка для взаимодействия с RuStore API
5
5
  </p>
6
6
 
7
7
  [![NPM version][npm-image]][npm-url]
@@ -13,6 +13,7 @@
13
13
  - 🔐 Авторизация через приватный ключ из RuStore Консоль
14
14
  - 🔑 Автоматическое управление токенами доступа
15
15
  - 📦 Работа с API RuStore (платежи, подписки, приложения)
16
+ - 📄 Вывод результатов в формате JSON (`--json`) для удобной интеграции и обработки
16
17
  - ⚙️ Сохранение конфигурации в `~/.rustore/config.json`
17
18
  - 🧪 Полное покрытие тестами
18
19
 
@@ -73,10 +74,64 @@ rustore apps list
73
74
  # Получить все приложения (с пагинацией)
74
75
  rustore apps list --all
75
76
 
76
- # Вывести результат в формате JSON
77
+ # Вывести результат в формате JSON (удобно для скриптов и интеграций)
77
78
  rustore apps list --json
79
+
80
+ # Комбинирование опций: получить все приложения в JSON формате
81
+ rustore apps list --all --json
82
+
83
+ # Фильтрация с JSON выводом
84
+ rustore apps list --app-name "MyApp" --json
85
+ rustore apps list --app-status PUBLISHED --json
86
+
87
+ # Создать черновую версию приложения
88
+ rustore apps create-draft --app-id 123456 --version-name "1.0.0" --version-code 1
89
+
90
+ # Создать черновую версию с JSON выводом
91
+ rustore apps create-draft --app-id 123456 --version-name "2.0.0" --version-code 2 --json
92
+
93
+ # Загрузить APK/AAB файл для версии
94
+ rustore apps upload-apk --app-id 123456 --version-id 789 --file ./app-release.apk
95
+
96
+ # Загрузить APK/AAB файл с JSON выводом
97
+ rustore apps upload-apk --app-id 123456 --version-id 789 --file ./app-release.aab --json
78
98
  ```
79
99
 
100
+ ### Работа с отзывами
101
+
102
+ ```sh
103
+ # Получить отзывы приложения
104
+ rustore feedback list --package-name com.example.app
105
+
106
+ # Получить все отзывы (с пагинацией)
107
+ rustore feedback list --package-name com.example.app --all
108
+
109
+ # Получить отзывы в JSON формате
110
+ rustore feedback list --package-name com.example.app --json
111
+
112
+ # Оставить ответ на отзыв
113
+ rustore feedback answer --package-name com.example.app --comment-id 123456 --text "Спасибо за отзыв!"
114
+
115
+ # Получить статус ответа на отзыв
116
+ rustore feedback status --package-name com.example.app --feedback-id 789
117
+
118
+ # Получить все ответы на отзывы
119
+ rustore feedback status --package-name com.example.app
120
+
121
+ # Изменить ответ на отзыв
122
+ rustore feedback update --package-name com.example.app --feedback-id 789 --text "Обновлённый ответ"
123
+
124
+ # Удалить ответ на отзыв
125
+ rustore feedback delete --package-name com.example.app --feedback-id 789
126
+ ```
127
+
128
+ **💡 Совет:** Флаг `--json` полезен для:
129
+
130
+ - Автоматизации и скриптов
131
+ - Интеграции с другими инструментами
132
+ - Обработки данных через `jq` или другие JSON-парсеры
133
+ - Сохранения результатов в файл: `rustore apps list --json > apps.json`
134
+
80
135
  ## 📁 Конфигурация
81
136
 
82
137
  CLI сохраняет конфигурацию в `~/.rustore/config.json`:
@@ -90,8 +145,6 @@ CLI сохраняет конфигурацию в `~/.rustore/config.json`:
90
145
  }
91
146
  ```
92
147
 
93
- **Важно:** Приватный ключ хранится в открытом виде. Защитите доступ к файлу конфигурации.
94
-
95
148
  ## 🔧 Разработка
96
149
 
97
150
  ### Установка зависимостей
@@ -190,7 +243,7 @@ API организовано по категориям, как в докумен
190
243
  ### Программный доступ
191
244
 
192
245
  ```typescript
193
- import {login, appsApi, paymentsApi, catalogApi} from 'rustore';
246
+ import {login, appsApi, paymentsApi, catalogApi, feedbackApi} from 'rustore';
194
247
 
195
248
  // Авторизация
196
249
  await login('keyId', 'privateKey');
@@ -202,6 +255,30 @@ console.log(appsResponse.body.content);
202
255
  // Получить все приложения (с автоматической пагинацией)
203
256
  const allApps = await appsApi.getAllApps();
204
257
 
258
+ // Создать черновую версию приложения
259
+ const draftVersion = await appsApi.createDraftVersion(123456, {
260
+ versionName: '1.0.0',
261
+ versionCode: 1,
262
+ });
263
+
264
+ // Загрузить APK/AAB файл для версии
265
+ const uploadResult = await appsApi.uploadApkFile(
266
+ 123456,
267
+ draftVersion.body?.versionId || 789,
268
+ './app-release.apk',
269
+ );
270
+
271
+ // Получить отзывы приложения
272
+ const feedbackResponse = await feedbackApi.getFeedback('com.example.app');
273
+
274
+ // Оставить ответ на отзыв
275
+ const answerResponse = await feedbackApi.createFeedbackAnswer('com.example.app', 123456, {
276
+ text: 'Спасибо за отзыв!',
277
+ });
278
+
279
+ // Получить статус ответа на отзыв
280
+ const statusResponse = await feedbackApi.getFeedbackAnswerStatus('com.example.app', 789);
281
+
205
282
  // Использование других API категорий
206
283
  // await paymentsApi.refund(...);
207
284
  // await catalogApi.getProducts(...);
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * API для работы с приложениями
3
3
  * Категория: Загрузка и публикация приложений (общие методы)
4
+ *
5
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app
4
6
  */
5
7
  import { RustoreApiClient } from './client.js';
6
- import type { GetAppListResponse, App } from '../types.js';
8
+ import type { GetAppListResponse, App, GetAppListOptions, CreateDraftVersionRequest, CreateDraftVersionResponse, UploadApkFileResponse } from '../types.js';
7
9
  /**
8
10
  * Клиент для работы с приложениями
9
11
  */
@@ -15,15 +17,51 @@ export declare class AppsApi extends RustoreApiClient {
15
17
  * Метод позволяет получить приложения, доступные владельцу аккаунта,
16
18
  * для которого создан приватный ключ.
17
19
  *
18
- * @param continuationToken - Токен для пагинации (опционально)
20
+ * @param options - Параметры запроса (continuationToken, pageSize, appName и др.)
19
21
  * @returns Список приложений
22
+ *
23
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app/get-app-list
20
24
  */
21
- getAppList(continuationToken?: string): Promise<GetAppListResponse>;
25
+ getAppList(options?: GetAppListOptions): Promise<GetAppListResponse>;
22
26
  /**
23
27
  * Получить все приложения (с автоматической пагинацией)
28
+ *
29
+ * Вспомогательный метод, который автоматически обрабатывает пагинацию
30
+ * и возвращает все приложения из всех страниц.
31
+ *
32
+ * @param options - Параметры запроса (pageSize, appName и др., кроме continuationToken)
24
33
  * @returns Массив всех приложений
34
+ *
35
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app/get-app-list
36
+ */
37
+ getAllApps(options?: Omit<GetAppListOptions, 'continuationToken'>): Promise<App[]>;
38
+ /**
39
+ * Создать черновую версию приложения
40
+ * POST /public/v1/application/{appId}/draft-version
41
+ *
42
+ * Метод позволяет создать черновую версию приложения для последующей загрузки APK/AAB.
43
+ *
44
+ * @param appId - ID приложения
45
+ * @param data - Данные для создания черновой версии (versionName, versionCode)
46
+ * @returns Информация о созданной черновой версии
47
+ *
48
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app/create-draft-version
49
+ */
50
+ createDraftVersion(appId: number, data: CreateDraftVersionRequest): Promise<CreateDraftVersionResponse>;
51
+ /**
52
+ * Загрузить APK/AAB файл для версии приложения
53
+ * POST /public/v1/application/{appId}/version/{versionId}/apk-file
54
+ *
55
+ * Метод позволяет загрузить APK или AAB файл для черновой версии приложения.
56
+ *
57
+ * @param appId - ID приложения
58
+ * @param versionId - ID версии (полученный из createDraftVersion)
59
+ * @param filePath - Путь к APK/AAB файлу
60
+ * @returns Информация о загруженном файле
61
+ *
62
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app/apk-file-upload
25
63
  */
26
- getAllApps(): Promise<App[]>;
64
+ uploadApkFile(appId: number, versionId: number, filePath: string): Promise<UploadApkFileResponse>;
27
65
  }
28
66
  /**
29
67
  * Экспортируемый экземпляр клиента для работы с приложениями
@@ -1 +1 @@
1
- {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/api/apps.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAC,kBAAkB,EAAE,GAAG,EAAC,MAAM,aAAa,CAAC;AAEzD;;GAEG;AACH,qBAAa,OAAQ,SAAQ,gBAAgB;IAC3C;;;;;;;;;OASG;IACG,UAAU,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoBzE;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;CAanC;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,SAAgB,CAAC"}
1
+ {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/api/apps.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EACV,kBAAkB,EAClB,GAAG,EACH,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,qBAAa,OAAQ,SAAQ,gBAAgB;IAC3C;;;;;;;;;;;OAWG;IACG,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA4B1E;;;;;;;;;;OAUG;IACG,UAAU,CACd,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,GACrD,OAAO,CAAC,GAAG,EAAE,CAAC;IAcjB;;;;;;;;;;;OAWG;IACG,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,0BAA0B,CAAC;IAKtC;;;;;;;;;;;;OAYG;IACG,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC;CA+ClC;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,SAAgB,CAAC"}
package/dist/api/apps.js CHANGED
@@ -1,8 +1,12 @@
1
1
  /**
2
2
  * API для работы с приложениями
3
3
  * Категория: Загрузка и публикация приложений (общие методы)
4
+ *
5
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app
4
6
  */
7
+ import { readFileSync } from 'node:fs';
5
8
  import { RustoreApiClient } from './client.js';
9
+ import { getToken } from './auth.js';
6
10
  /**
7
11
  * Клиент для работы с приложениями
8
12
  */
@@ -14,40 +18,124 @@ export class AppsApi extends RustoreApiClient {
14
18
  * Метод позволяет получить приложения, доступные владельцу аккаунта,
15
19
  * для которого создан приватный ключ.
16
20
  *
17
- * @param continuationToken - Токен для пагинации (опционально)
21
+ * @param options - Параметры запроса (continuationToken, pageSize, appName и др.)
18
22
  * @returns Список приложений
23
+ *
24
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app/get-app-list
19
25
  */
20
- async getAppList(continuationToken) {
26
+ async getAppList(options) {
21
27
  // Проверяем, не указан ли endpoint вручную через переменную окружения
22
28
  const customEndpoint = process.env.RUSTORE_APPLICATIONS_ENDPOINT;
23
- if (customEndpoint) {
24
- const endpoint = continuationToken
25
- ? `${customEndpoint}?continuationToken=${encodeURIComponent(continuationToken)}`
26
- : customEndpoint;
27
- return this.get(endpoint);
29
+ const baseEndpoint = customEndpoint || '/public/v1/application';
30
+ // Формируем query параметры
31
+ const queryParams = new URLSearchParams();
32
+ if (options) {
33
+ Object.entries(options).forEach(([key, value]) => {
34
+ if (value !== undefined && value !== null && value !== '') {
35
+ // Boolean значения конвертируем в строки "true"/"false"
36
+ // TODO: Фильтр по paid может не работать корректно
37
+ // При использовании paid=false API может возвращать пустой результат
38
+ // или игнорировать параметр. Требуется проверка документации:
39
+ // https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app/get-app-list
40
+ // Возможно, API требует другой формат (0/1) или не поддерживает фильтрацию по false
41
+ const stringValue = typeof value === 'boolean' ? String(value) : String(value);
42
+ queryParams.append(key, stringValue);
43
+ }
44
+ });
28
45
  }
29
- // Правильный endpoint согласно документации RuStore: /public/v1/application
30
- // Используем единственное число "application", а не "applications"
31
- const baseEndpoint = '/public/v1/application';
32
- const endpoint = continuationToken
33
- ? `${baseEndpoint}?continuationToken=${encodeURIComponent(continuationToken)}`
34
- : baseEndpoint;
46
+ const queryString = queryParams.toString();
47
+ const endpoint = queryString ? `${baseEndpoint}?${queryString}` : baseEndpoint;
35
48
  return this.get(endpoint);
36
49
  }
37
50
  /**
38
51
  * Получить все приложения (с автоматической пагинацией)
52
+ *
53
+ * Вспомогательный метод, который автоматически обрабатывает пагинацию
54
+ * и возвращает все приложения из всех страниц.
55
+ *
56
+ * @param options - Параметры запроса (pageSize, appName и др., кроме continuationToken)
39
57
  * @returns Массив всех приложений
58
+ *
59
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app/get-app-list
40
60
  */
41
- async getAllApps() {
61
+ async getAllApps(options) {
42
62
  const allApps = [];
43
63
  let continuationToken;
44
64
  do {
45
- const response = await this.getAppList(continuationToken);
65
+ const response = await this.getAppList({ ...options, continuationToken });
46
66
  allApps.push(...response.body.content);
47
67
  continuationToken = response.body.continuationToken;
48
68
  } while (continuationToken);
49
69
  return allApps;
50
70
  }
71
+ /**
72
+ * Создать черновую версию приложения
73
+ * POST /public/v1/application/{appId}/draft-version
74
+ *
75
+ * Метод позволяет создать черновую версию приложения для последующей загрузки APK/AAB.
76
+ *
77
+ * @param appId - ID приложения
78
+ * @param data - Данные для создания черновой версии (versionName, versionCode)
79
+ * @returns Информация о созданной черновой версии
80
+ *
81
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app/create-draft-version
82
+ */
83
+ async createDraftVersion(appId, data) {
84
+ const endpoint = `/public/v1/application/${appId}/draft-version`;
85
+ return this.post(endpoint, data);
86
+ }
87
+ /**
88
+ * Загрузить APK/AAB файл для версии приложения
89
+ * POST /public/v1/application/{appId}/version/{versionId}/apk-file
90
+ *
91
+ * Метод позволяет загрузить APK или AAB файл для черновой версии приложения.
92
+ *
93
+ * @param appId - ID приложения
94
+ * @param versionId - ID версии (полученный из createDraftVersion)
95
+ * @param filePath - Путь к APK/AAB файлу
96
+ * @returns Информация о загруженном файле
97
+ *
98
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-upload-publication-app/apk-file-upload
99
+ */
100
+ async uploadApkFile(appId, versionId, filePath) {
101
+ const endpoint = `/public/v1/application/${appId}/version/${versionId}/apk-file`;
102
+ // Читаем файл
103
+ const fileBuffer = readFileSync(filePath);
104
+ const fileName = filePath.split('/').pop() || 'app.apk';
105
+ // Создаём FormData для multipart/form-data запроса
106
+ const formData = new FormData();
107
+ const blob = new Blob([fileBuffer], {
108
+ type: 'application/vnd.android.package-archive',
109
+ });
110
+ formData.append('file', blob, fileName);
111
+ // Выполняем запрос с FormData
112
+ const token = await getToken();
113
+ const url = `${this.baseUrl}${endpoint}`;
114
+ if (process.env.DEBUG) {
115
+ console.error(`[DEBUG] API Request: ${url} (uploading ${fileName})`);
116
+ }
117
+ const response = await fetch(url, {
118
+ method: 'POST',
119
+ headers: {
120
+ 'Public-Token': token,
121
+ // Не устанавливаем Content-Type - браузер установит автоматически с boundary
122
+ },
123
+ body: formData,
124
+ });
125
+ if (!response.ok) {
126
+ const errorText = await response.text();
127
+ let errorData;
128
+ try {
129
+ errorData = JSON.parse(errorText);
130
+ }
131
+ catch {
132
+ // Игнорируем ошибку парсинга
133
+ }
134
+ const errorMessage = errorData?.message ?? errorText;
135
+ throw new Error(`Ошибка API (${response.status}): ${errorMessage}`);
136
+ }
137
+ return (await response.json());
138
+ }
51
139
  }
52
140
  /**
53
141
  * Экспортируемый экземпляр клиента для работы с приложениями
@@ -1 +1 @@
1
- {"version":3,"file":"apps.js","sourceRoot":"","sources":["../../src/api/apps.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAG7C;;GAEG;AACH,MAAM,OAAO,OAAQ,SAAQ,gBAAgB;IAC3C;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU,CAAC,iBAA0B;QACzC,sEAAsE;QACtE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;QACjE,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,iBAAiB;gBAChC,CAAC,CAAC,GAAG,cAAc,sBAAsB,kBAAkB,CAAC,iBAAiB,CAAC,EAAE;gBAChF,CAAC,CAAC,cAAc,CAAC;YACnB,OAAO,IAAI,CAAC,GAAG,CAAqB,QAAQ,CAAC,CAAC;QAChD,CAAC;QAED,4EAA4E;QAC5E,mEAAmE;QACnE,MAAM,YAAY,GAAG,wBAAwB,CAAC;QAC9C,MAAM,QAAQ,GAAG,iBAAiB;YAChC,CAAC,CAAC,GAAG,YAAY,sBAAsB,kBAAkB,CAAC,iBAAiB,CAAC,EAAE;YAC9E,CAAC,CAAC,YAAY,CAAC;QAEjB,OAAO,IAAI,CAAC,GAAG,CAAqB,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,GAAU,EAAE,CAAC;QAC1B,IAAI,iBAAqC,CAAC;QAE1C,GAAG,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEvC,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACtD,CAAC,QAAQ,iBAAiB,EAAE;QAE5B,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"apps.js","sourceRoot":"","sources":["../../src/api/apps.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  /**
2
2
  * Модуль для работы с авторизацией RuStore API
3
+ *
4
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-authorization-token
3
5
  */
4
6
  import type { AuthRequest, AuthTokenResponse } from '../types.js';
5
7
  /**
@@ -12,10 +14,16 @@ export declare function generateSignature(keyId: string, timestamp: string, priv
12
14
  export declare function createAuthRequest(keyId: string, privateKey: string): AuthRequest;
13
15
  /**
14
16
  * Получает токен авторизации от RuStore API
17
+ *
18
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-authorization-token
15
19
  */
16
20
  export declare function getAuthToken(keyId: string, privateKey: string): Promise<AuthTokenResponse>;
17
21
  /**
18
22
  * Сохраняет токен в конфигурацию
23
+ *
24
+ * Выполняет авторизацию и сохраняет полученный токен в конфигурацию.
25
+ *
26
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-authorization-token
19
27
  */
20
28
  export declare function login(keyId: string, privateKey: string): Promise<void>;
21
29
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAC,WAAW,EAAE,iBAAiB,EAAS,MAAM,aAAa,CAAC;AAKxE;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,CA4CR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAYhF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAyB5B;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5E;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAQtC;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CA8BhD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAC,WAAW,EAAE,iBAAiB,EAAS,MAAM,aAAa,CAAC;AAKxE;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,CA4CR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAYhF;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAyB5B;AAED;;;;;;GAMG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5E;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAQtC;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CA8BhD"}
package/dist/api/auth.js CHANGED
@@ -1,5 +1,7 @@
1
1
  /**
2
2
  * Модуль для работы с авторизацией RuStore API
3
+ *
4
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-authorization-token
3
5
  */
4
6
  import { createSign } from 'node:crypto';
5
7
  import { loadConfig, saveConfig } from '../config.js';
@@ -64,6 +66,8 @@ export function createAuthRequest(keyId, privateKey) {
64
66
  }
65
67
  /**
66
68
  * Получает токен авторизации от RuStore API
69
+ *
70
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-authorization-token
67
71
  */
68
72
  export async function getAuthToken(keyId, privateKey) {
69
73
  const authRequest = createAuthRequest(keyId, privateKey);
@@ -86,6 +90,10 @@ export async function getAuthToken(keyId, privateKey) {
86
90
  }
87
91
  /**
88
92
  * Сохраняет токен в конфигурацию
93
+ *
94
+ * Выполняет авторизацию и сохраняет полученный токен в конфигурацию.
95
+ *
96
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-authorization-token
89
97
  */
90
98
  export async function login(keyId, privateKey) {
91
99
  const tokenResponse = await getAuthToken(keyId, privateKey);
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * API для работы с продуктовым каталогом
3
3
  * Категория: API для работы с продуктовым каталогом
4
+ *
5
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-catalog
4
6
  */
5
7
  import { RustoreApiClient } from './client.js';
6
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/api/catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,qBAAa,UAAW,SAAQ,gBAAgB;CAG/C;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,YAAmB,CAAC"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/api/catalog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,qBAAa,UAAW,SAAQ,gBAAgB;CAG/C;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,YAAmB,CAAC"}
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * API для работы с продуктовым каталогом
3
3
  * Категория: API для работы с продуктовым каталогом
4
+ *
5
+ * @see https://www.rustore.ru/help/work-with-rustore-api/api-catalog
4
6
  */
5
7
  import { RustoreApiClient } from './client.js';
6
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/api/catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,gBAAgB;CAG/C;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/api/catalog.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,gBAAgB;CAG/C;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC"}
@@ -1,11 +1,16 @@
1
1
  /**
2
2
  * Клиент для работы с RuStore API
3
+ *
4
+ * Базовый класс для всех API клиентов RuStore.
5
+ * Предоставляет методы для выполнения авторизованных запросов.
6
+ *
7
+ * @see https://www.rustore.ru/help/en/work-with-rustore-api
3
8
  */
4
9
  /**
5
10
  * Базовый класс для работы с API
6
11
  */
7
12
  export declare class RustoreApiClient {
8
- private baseUrl;
13
+ protected baseUrl: string;
9
14
  constructor(baseUrl?: string);
10
15
  /**
11
16
  * Выполняет авторизованный запрос к API
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAqB;IAI1C;;OAEG;cACa,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IAiCnF;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1C;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAO3D;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAO1D;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAG9C;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,kBAAyB,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEd,OAAO,GAAE,MAAqB;IAI1C;;OAEG;cACa,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IA+CnF;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1C;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAO3D;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAO1D;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAG9C;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,kBAAyB,CAAC"}
@@ -1,5 +1,10 @@
1
1
  /**
2
2
  * Клиент для работы с RuStore API
3
+ *
4
+ * Базовый класс для всех API клиентов RuStore.
5
+ * Предоставляет методы для выполнения авторизованных запросов.
6
+ *
7
+ * @see https://www.rustore.ru/help/en/work-with-rustore-api
3
8
  */
4
9
  import { getToken } from './auth.js';
5
10
  const API_BASE_URL = 'https://public-api.rustore.ru';
@@ -17,15 +22,26 @@ export class RustoreApiClient {
17
22
  async request(endpoint, options = {}) {
18
23
  const token = await getToken();
19
24
  const url = `${this.baseUrl}${endpoint}`;
25
+ // Debug: логируем URL для отладки (можно убрать в production)
26
+ if (process.env.DEBUG) {
27
+ console.error(`[DEBUG] API Request: ${url}`);
28
+ }
29
+ // Определяем заголовки: для multipart/form-data не устанавливаем Content-Type
30
+ // (браузер/fetch установит его автоматически с boundary)
31
+ const isMultipart = options.body instanceof FormData;
32
+ const headers = {
33
+ 'Public-Token': token, // JWE токен из login передаётся в заголовке Public-Token
34
+ ...options.headers,
35
+ };
36
+ // Для JSON запросов добавляем Content-Type
37
+ if (!isMultipart) {
38
+ headers['Content-Type'] = 'application/json';
39
+ }
20
40
  // RuStore API использует JWE токен в заголовке Public-Token
21
41
  // Токен получается через login и передаётся в заголовке Public-Token
22
42
  const response = await fetch(url, {
23
43
  ...options,
24
- headers: {
25
- 'Content-Type': 'application/json',
26
- 'Public-Token': token, // JWE токен из login передаётся в заголовке Public-Token
27
- ...options.headers,
28
- },
44
+ headers,
29
45
  });
30
46
  if (!response.ok) {
31
47
  const errorText = await response.text();
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAC,QAAQ,EAAC,MAAM,WAAW,CAAC;AAGnC,MAAM,YAAY,GAAG,+BAA+B,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,OAAO,CAAS;IAExB,YAAY,UAAkB,YAAY;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,OAAO,CAAI,QAAgB,EAAE,UAAuB,EAAE;QACpE,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QAEzC,4DAA4D;QAC5D,qEAAqE;QACrE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,cAAc,EAAE,KAAK,EAAE,yDAAyD;gBAChF,GAAG,OAAO,CAAC,OAAO;aACnB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,SAA+B,CAAC;YAEpC,IAAI,CAAC;gBACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAa,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;YAED,0CAA0C;YAC1C,MAAM,YAAY,GAAG,SAAS,EAAE,OAAO,IAAI,SAAS,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,CAAC,MAAM,MAAM,YAAY,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAI,QAAgB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAI,QAAgB,EAAE,IAAc;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE;YAC/B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAI,QAAgB,EAAE,IAAc;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE;YAC/B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAI,QAAgB;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,EAAC,MAAM,EAAE,QAAQ,EAAC,CAAC,CAAC;IACvD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}