rustore 1.0.2 → 1.0.4

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 (46) hide show
  1. package/README.md +125 -12
  2. package/dist/api/apps.d.ts +141 -13
  3. package/dist/api/apps.d.ts.map +1 -1
  4. package/dist/api/apps.js +448 -30
  5. package/dist/api/apps.js.map +1 -1
  6. package/dist/api/catalog.d.ts +25 -0
  7. package/dist/api/catalog.d.ts.map +1 -1
  8. package/dist/api/catalog.js +41 -0
  9. package/dist/api/catalog.js.map +1 -1
  10. package/dist/api/client.d.ts.map +1 -1
  11. package/dist/api/client.js +36 -6
  12. package/dist/api/client.js.map +1 -1
  13. package/dist/api/payments-app.d.ts +40 -0
  14. package/dist/api/payments-app.d.ts.map +1 -1
  15. package/dist/api/payments-app.js +70 -0
  16. package/dist/api/payments-app.js.map +1 -1
  17. package/dist/api/payments.d.ts +37 -0
  18. package/dist/api/payments.d.ts.map +1 -1
  19. package/dist/api/payments.js +56 -0
  20. package/dist/api/payments.js.map +1 -1
  21. package/dist/bin.js +558 -11
  22. package/dist/bin.js.map +1 -1
  23. package/dist/commands/apps.d.ts +93 -3
  24. package/dist/commands/apps.d.ts.map +1 -1
  25. package/dist/commands/apps.js +442 -15
  26. package/dist/commands/apps.js.map +1 -1
  27. package/dist/commands/catalog.d.ts +31 -0
  28. package/dist/commands/catalog.d.ts.map +1 -0
  29. package/dist/commands/catalog.js +117 -0
  30. package/dist/commands/catalog.js.map +1 -0
  31. package/dist/commands/feedback.js +2 -2
  32. package/dist/commands/feedback.js.map +1 -1
  33. package/dist/commands/payments-app.d.ts +50 -0
  34. package/dist/commands/payments-app.d.ts.map +1 -0
  35. package/dist/commands/payments-app.js +197 -0
  36. package/dist/commands/payments-app.js.map +1 -0
  37. package/dist/commands/payments.d.ts +42 -0
  38. package/dist/commands/payments.d.ts.map +1 -0
  39. package/dist/commands/payments.js +152 -0
  40. package/dist/commands/payments.js.map +1 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +9 -1
  43. package/dist/config.js.map +1 -1
  44. package/dist/types.d.ts +573 -5
  45. package/dist/types.d.ts.map +1 -1
  46. package/package.json +5 -3
package/dist/bin.js CHANGED
@@ -4,8 +4,11 @@
4
4
  */
5
5
  import { Command } from 'commander';
6
6
  import { loginCommand, logoutCommand, whoamiCommand } from './commands/auth.js';
7
- import { listAppsCommand, createDraftVersionCommand, uploadApkFileCommand, } from './commands/apps.js';
7
+ import { listAppsCommand, createDraftVersionCommand, uploadApkFileCommand, sendForModerationCommand, getVersionInfoCommand, getVersionListCommand, getAppTagListCommand, uploadAabFileCommand, updateDraftVersionCommand, deleteDraftVersionCommand, uploadScreensCommand, getVersionStatusCommand, } from './commands/apps.js';
8
8
  import { getFeedbackCommand, createFeedbackAnswerCommand, getFeedbackAnswerStatusCommand, updateFeedbackAnswerCommand, deleteFeedbackAnswerCommand, } from './commands/feedback.js';
9
+ import { getPaymentCommand, getSubscriptionCommand, getSubscriptionListCommand, } from './commands/payments.js';
10
+ import { getInvoicesCommand, getPurchaseCommand, getPurchaseListCommand, } from './commands/payments-app.js';
11
+ import { getProductsCommand, getProductCommand } from './commands/catalog.js';
9
12
  import { readFileSync } from 'node:fs';
10
13
  import { fileURLToPath } from 'node:url';
11
14
  import { dirname, join } from 'node:path';
@@ -136,13 +139,54 @@ appsCommand
136
139
  appsCommand
137
140
  .command('create-draft')
138
141
  .description('Создать черновую версию приложения')
139
- .requiredOption('--app-id <id>', 'ID приложения', parseInt)
140
- .requiredOption('--version-name <name>', 'Имя версии (например, 1.0.0)')
141
- .requiredOption('--version-code <code>', 'Код версии (число)', parseInt)
142
+ .allowUnknownOption() // Разрешаем произвольные параметры для поддержки всех параметров API
143
+ .allowExcessArguments()
144
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
145
+ .requiredOption('--minAndroidVersion <version>', 'Минимальная версия Android (1-16)', parseInt)
142
146
  .option('-j, --json', 'Вывести результат в формате JSON')
143
147
  .action(async (options) => {
144
148
  try {
145
- await createDraftVersionCommand(options.appId, options.versionName, options.versionCode, options.json);
149
+ // Собираем все параметры из CLI, исключая известные опции
150
+ const knownOptions = ['packageName', 'minAndroidVersion', 'json'];
151
+ const apiParams = {
152
+ minAndroidVersion: options.minAndroidVersion,
153
+ };
154
+ // Парсим неизвестные опции из process.argv
155
+ const createDraftIndex = process.argv.indexOf('create-draft');
156
+ if (createDraftIndex >= 0) {
157
+ for (let i = createDraftIndex + 1; i < process.argv.length; i++) {
158
+ const arg = process.argv[i];
159
+ if (arg?.startsWith('--') && !knownOptions.some(opt => arg.includes(opt))) {
160
+ const key = arg.replace(/^--/, '');
161
+ const value = process.argv[i + 1];
162
+ if (value && !value.startsWith('--')) {
163
+ // Парсим значение
164
+ let parsedValue = value;
165
+ const lowerValue = value.toLowerCase();
166
+ if (lowerValue === 'true') {
167
+ parsedValue = true;
168
+ }
169
+ else if (lowerValue === 'false') {
170
+ parsedValue = false;
171
+ }
172
+ else if (!isNaN(Number(value)) && value.trim() !== '') {
173
+ parsedValue = Number(value);
174
+ }
175
+ else if (value.startsWith('[') || value.startsWith('{')) {
176
+ try {
177
+ parsedValue = JSON.parse(value);
178
+ }
179
+ catch {
180
+ parsedValue = value;
181
+ }
182
+ }
183
+ apiParams[key] = parsedValue;
184
+ i++;
185
+ }
186
+ }
187
+ }
188
+ }
189
+ await createDraftVersionCommand(options.packageName, apiParams, options.json);
146
190
  }
147
191
  catch (error) {
148
192
  console.error('Ошибка:', error instanceof Error ? error.message : String(error));
@@ -151,14 +195,280 @@ appsCommand
151
195
  });
152
196
  appsCommand
153
197
  .command('upload-apk')
154
- .description('Загрузить APK/AAB файл для версии приложения')
155
- .requiredOption('--app-id <id>', 'ID приложения', parseInt)
156
- .requiredOption('--version-id <id>', 'ID версии (из create-draft)', parseInt)
157
- .requiredOption('--file <path>', 'Путь к APK/AAB файлу')
198
+ .description('Загрузить APK файл для версии приложения')
199
+ .allowUnknownOption() // Разрешаем произвольные параметры
200
+ .allowExcessArguments()
201
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
202
+ .requiredOption('--versionId <id>', 'ID версии (из create-draft)', parseInt)
203
+ .requiredOption('--file <path>', 'Путь к APK файлу')
204
+ .requiredOption('--isMainApk <true|false>', 'Признак основного APK-файла (true - основной, false - дополнительный)', (value) => {
205
+ const lower = value.toLowerCase();
206
+ if (lower === 'true')
207
+ return true;
208
+ if (lower === 'false')
209
+ return false;
210
+ throw new Error('isMainApk должен быть true или false');
211
+ })
212
+ .option('--servicesType <type>', 'Тип сервиса (HMS - для Huawei Mobile Services, Unknown - по умолчанию)', (value) => {
213
+ if (value === 'HMS' || value === 'Unknown')
214
+ return value;
215
+ throw new Error('servicesType должен быть HMS или Unknown');
216
+ })
217
+ .option('-j, --json', 'Вывести результат в формате JSON')
218
+ .action(async (options) => {
219
+ try {
220
+ await uploadApkFileCommand(options.packageName, options.versionId, options.file, options.isMainApk, options.servicesType, options.json);
221
+ }
222
+ catch (error) {
223
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
224
+ process.exit(1);
225
+ }
226
+ });
227
+ appsCommand
228
+ .command('send-for-moderation')
229
+ .description('Отправить черновую версию приложения на модерацию')
230
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
231
+ .requiredOption('--versionId <id>', 'ID версии (из create-draft)', parseInt)
232
+ .option('--priorityUpdate <priority>', 'Приоритет обновления (0-5, где 0 - минимальный, 5 - максимальный)', parseInt)
233
+ .option('-j, --json', 'Вывести результат в формате JSON')
234
+ .action(async (options) => {
235
+ try {
236
+ await sendForModerationCommand(options.packageName, options.versionId, options.priorityUpdate, options.json);
237
+ }
238
+ catch (error) {
239
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
240
+ process.exit(1);
241
+ }
242
+ });
243
+ appsCommand
244
+ .command('upload-aab')
245
+ .description('Загрузить AAB файл для версии приложения')
246
+ .allowUnknownOption()
247
+ .allowExcessArguments()
248
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
249
+ .requiredOption('--versionId <id>', 'ID версии (из create-draft)', parseInt)
250
+ .requiredOption('--file <path>', 'Путь к AAB файлу')
251
+ .requiredOption('--isMainApk <true|false>', 'Признак основного AAB-файла (true - основной, false - дополнительный)', (value) => {
252
+ const lower = value.toLowerCase();
253
+ if (lower === 'true')
254
+ return true;
255
+ if (lower === 'false')
256
+ return false;
257
+ throw new Error('isMainApk должен быть true или false');
258
+ })
259
+ .option('--servicesType <type>', 'Тип сервиса (HMS - для Huawei Mobile Services, Unknown - по умолчанию)', (value) => {
260
+ if (value === 'HMS' || value === 'Unknown')
261
+ return value;
262
+ throw new Error('servicesType должен быть HMS или Unknown');
263
+ })
158
264
  .option('-j, --json', 'Вывести результат в формате JSON')
159
265
  .action(async (options) => {
160
266
  try {
161
- await uploadApkFileCommand(options.appId, options.versionId, options.file, options.json);
267
+ await uploadAabFileCommand(options.packageName, options.versionId, options.file, options.isMainApk, options.servicesType, options.json);
268
+ }
269
+ catch (error) {
270
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
271
+ process.exit(1);
272
+ }
273
+ });
274
+ appsCommand
275
+ .command('update-draft')
276
+ .description('Обновить черновую версию приложения')
277
+ .allowUnknownOption()
278
+ .allowExcessArguments()
279
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
280
+ .requiredOption('--versionId <id>', 'ID версии', parseInt)
281
+ .option('-j, --json', 'Вывести результат в формате JSON')
282
+ .action(async (options) => {
283
+ try {
284
+ const knownOptions = ['packageName', 'versionId', 'json'];
285
+ const apiParams = {};
286
+ // Парсим все параметры из CLI
287
+ const updateDraftIndex = process.argv.indexOf('update-draft');
288
+ if (updateDraftIndex >= 0) {
289
+ for (let i = updateDraftIndex + 1; i < process.argv.length; i++) {
290
+ const arg = process.argv[i];
291
+ if (arg?.startsWith('--') && !knownOptions.some(opt => arg.includes(opt))) {
292
+ const key = arg.replace(/^--/, '');
293
+ const value = process.argv[i + 1];
294
+ if (value && !value.startsWith('--')) {
295
+ let parsedValue = value;
296
+ const lowerValue = value.toLowerCase();
297
+ if (lowerValue === 'true') {
298
+ parsedValue = true;
299
+ }
300
+ else if (lowerValue === 'false') {
301
+ parsedValue = false;
302
+ }
303
+ else if (!isNaN(Number(value)) && value.trim() !== '') {
304
+ parsedValue = Number(value);
305
+ }
306
+ else if (value.startsWith('[') || value.startsWith('{')) {
307
+ try {
308
+ parsedValue = JSON.parse(value);
309
+ }
310
+ catch {
311
+ parsedValue = value;
312
+ }
313
+ }
314
+ apiParams[key] = parsedValue;
315
+ i++;
316
+ }
317
+ }
318
+ }
319
+ }
320
+ await updateDraftVersionCommand(options.packageName, options.versionId, apiParams, options.json);
321
+ }
322
+ catch (error) {
323
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
324
+ process.exit(1);
325
+ }
326
+ });
327
+ appsCommand
328
+ .command('delete-draft')
329
+ .description('Удалить черновую версию приложения')
330
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
331
+ .requiredOption('--versionId <id>', 'ID версии', parseInt)
332
+ .option('-j, --json', 'Вывести результат в формате JSON')
333
+ .action(async (options) => {
334
+ try {
335
+ await deleteDraftVersionCommand(options.packageName, options.versionId, options.json);
336
+ }
337
+ catch (error) {
338
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
339
+ process.exit(1);
340
+ }
341
+ });
342
+ appsCommand
343
+ .command('upload-screens')
344
+ .description('Загрузить скриншоты для версии приложения')
345
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
346
+ .requiredOption('--versionId <id>', 'ID версии', parseInt)
347
+ .requiredOption('--files <paths>', 'Пути к файлам скриншотов (через запятую)', (value) => value.split(',').map(p => p.trim()))
348
+ .requiredOption('--deviceType <type>', 'Тип устройства (PHONE, TABLET, TV)', (value) => {
349
+ const upper = value.toUpperCase();
350
+ if (upper === 'PHONE' || upper === 'TABLET' || upper === 'TV') {
351
+ return upper;
352
+ }
353
+ throw new Error('deviceType должен быть PHONE, TABLET или TV');
354
+ })
355
+ .option('-j, --json', 'Вывести результат в формате JSON')
356
+ .action(async (options) => {
357
+ try {
358
+ await uploadScreensCommand(options.packageName, options.versionId, options.files, options.deviceType, options.json);
359
+ }
360
+ catch (error) {
361
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
362
+ process.exit(1);
363
+ }
364
+ });
365
+ appsCommand
366
+ .command('version-status')
367
+ .description('Получить статус версии приложения')
368
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
369
+ .requiredOption('--versionId <id>', 'ID версии', parseInt)
370
+ .option('-j, --json', 'Вывести результат в формате JSON')
371
+ .action(async (options) => {
372
+ try {
373
+ await getVersionStatusCommand(options.packageName, options.versionId, options.json);
374
+ }
375
+ catch (error) {
376
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
377
+ process.exit(1);
378
+ }
379
+ });
380
+ appsCommand
381
+ .command('version-info')
382
+ .description('Получить информацию о версии приложения')
383
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
384
+ .requiredOption('--versionId <id>', 'ID версии', parseInt)
385
+ .option('-j, --json', 'Вывести результат в формате JSON')
386
+ .action(async (options) => {
387
+ try {
388
+ await getVersionInfoCommand(options.packageName, options.versionId, options.json);
389
+ }
390
+ catch (error) {
391
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
392
+ process.exit(1);
393
+ }
394
+ });
395
+ appsCommand
396
+ .command('version-list')
397
+ .description('Получить список версий приложения')
398
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
399
+ .allowUnknownOption()
400
+ .allowExcessArguments()
401
+ .option('-a, --all', 'Получить все версии (с пагинацией)')
402
+ .option('-j, --json', 'Вывести результат в формате JSON')
403
+ .option('--page-size <size>', 'Размер страницы', parseInt)
404
+ .action(async (options) => {
405
+ try {
406
+ // Парсим неизвестные опции для передачи в API
407
+ const unknownOptions = {};
408
+ const args = process.argv.slice(process.argv.indexOf('version-list') + 1);
409
+ for (let i = 0; i < args.length; i += 2) {
410
+ const arg = args[i];
411
+ const nextArg = args[i + 1];
412
+ if (arg?.startsWith('--') && nextArg) {
413
+ const key = arg.replace('--', '');
414
+ const value = nextArg;
415
+ // Пытаемся определить тип значения
416
+ if (value === 'true' || value === 'false') {
417
+ unknownOptions[key] = value === 'true';
418
+ }
419
+ else if (!isNaN(Number(value))) {
420
+ unknownOptions[key] = Number(value);
421
+ }
422
+ else {
423
+ unknownOptions[key] = value;
424
+ }
425
+ }
426
+ }
427
+ await getVersionListCommand(options.packageName, {
428
+ ...options,
429
+ ...unknownOptions,
430
+ });
431
+ }
432
+ catch (error) {
433
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
434
+ process.exit(1);
435
+ }
436
+ });
437
+ appsCommand
438
+ .command('tag-list')
439
+ .description('Получить список тегов приложений')
440
+ .allowUnknownOption()
441
+ .allowExcessArguments()
442
+ .option('-a, --all', 'Получить все теги (с пагинацией)')
443
+ .option('-j, --json', 'Вывести результат в формате JSON')
444
+ .option('--page-size <size>', 'Размер страницы', parseInt)
445
+ .action(async (options) => {
446
+ try {
447
+ // Парсим неизвестные опции для передачи в API
448
+ const unknownOptions = {};
449
+ const args = process.argv.slice(process.argv.indexOf('tag-list') + 1);
450
+ for (let i = 0; i < args.length; i += 2) {
451
+ const arg = args[i];
452
+ const nextArg = args[i + 1];
453
+ if (arg?.startsWith('--') && nextArg) {
454
+ const key = arg.replace('--', '');
455
+ const value = nextArg;
456
+ // Пытаемся определить тип значения
457
+ if (value === 'true' || value === 'false') {
458
+ unknownOptions[key] = value === 'true';
459
+ }
460
+ else if (!isNaN(Number(value))) {
461
+ unknownOptions[key] = Number(value);
462
+ }
463
+ else {
464
+ unknownOptions[key] = value;
465
+ }
466
+ }
467
+ }
468
+ await getAppTagListCommand({
469
+ ...options,
470
+ ...unknownOptions,
471
+ });
162
472
  }
163
473
  catch (error) {
164
474
  console.error('Ошибка:', error instanceof Error ? error.message : String(error));
@@ -178,7 +488,9 @@ feedbackCommand
178
488
  .option('--page-size <size>', 'Размер страницы', parseInt)
179
489
  .action(async (options) => {
180
490
  try {
181
- await getFeedbackCommand(options.packageName, options);
491
+ // Извлекаем packageName и передаем остальные опции отдельно
492
+ const { packageName, ...restOptions } = options;
493
+ await getFeedbackCommand(packageName, restOptions);
182
494
  }
183
495
  catch (error) {
184
496
  console.error('Ошибка:', error instanceof Error ? error.message : String(error));
@@ -247,6 +559,241 @@ feedbackCommand
247
559
  process.exit(1);
248
560
  }
249
561
  });
562
+ // Команды для работы с платежами и подписками (общие методы)
563
+ const paymentsCommand = program
564
+ .command('payments')
565
+ .description('Работа с платежами и подписками (общие методы)');
566
+ paymentsCommand
567
+ .command('get')
568
+ .description('Получить информацию о платеже')
569
+ .requiredOption('--paymentId <id>', 'ID платежа', parseInt)
570
+ .option('-j, --json', 'Вывести результат в формате JSON')
571
+ .action(async (options) => {
572
+ try {
573
+ await getPaymentCommand(options.paymentId, options.json);
574
+ }
575
+ catch (error) {
576
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
577
+ process.exit(1);
578
+ }
579
+ });
580
+ paymentsCommand
581
+ .command('subscription')
582
+ .description('Получить информацию о подписке')
583
+ .requiredOption('--subscriptionId <id>', 'ID подписки', parseInt)
584
+ .option('-j, --json', 'Вывести результат в формате JSON')
585
+ .action(async (options) => {
586
+ try {
587
+ await getSubscriptionCommand(options.subscriptionId, options.json);
588
+ }
589
+ catch (error) {
590
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
591
+ process.exit(1);
592
+ }
593
+ });
594
+ paymentsCommand
595
+ .command('subscription-list')
596
+ .description('Получить список подписок')
597
+ .allowUnknownOption()
598
+ .allowExcessArguments()
599
+ .option('-a, --all', 'Получить все подписки (с пагинацией)')
600
+ .option('-j, --json', 'Вывести результат в формате JSON')
601
+ .option('--page-size <size>', 'Размер страницы', parseInt)
602
+ .action(async (options) => {
603
+ try {
604
+ // Парсим неизвестные опции для передачи в API
605
+ const unknownOptions = {};
606
+ const args = process.argv.slice(process.argv.indexOf('subscription-list') + 1);
607
+ for (let i = 0; i < args.length; i += 2) {
608
+ const arg = args[i];
609
+ const nextArg = args[i + 1];
610
+ if (arg?.startsWith('--') && nextArg) {
611
+ const key = arg.replace('--', '');
612
+ const value = nextArg;
613
+ // Пытаемся определить тип значения
614
+ if (value === 'true' || value === 'false') {
615
+ unknownOptions[key] = value === 'true';
616
+ }
617
+ else if (!isNaN(Number(value))) {
618
+ unknownOptions[key] = Number(value);
619
+ }
620
+ else {
621
+ unknownOptions[key] = value;
622
+ }
623
+ }
624
+ }
625
+ await getSubscriptionListCommand({
626
+ ...options,
627
+ ...unknownOptions,
628
+ });
629
+ }
630
+ catch (error) {
631
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
632
+ process.exit(1);
633
+ }
634
+ });
635
+ // Команды для работы с платежами и подписками (методы приложений)
636
+ const paymentsAppCommand = program
637
+ .command('payments-app')
638
+ .description('Работа с платежами и подписками (методы приложений)');
639
+ paymentsAppCommand
640
+ .command('invoices')
641
+ .description('Получить список счетов приложения')
642
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
643
+ .allowUnknownOption()
644
+ .allowExcessArguments()
645
+ .option('-a, --all', 'Получить все счета (с пагинацией)')
646
+ .option('-j, --json', 'Вывести результат в формате JSON')
647
+ .option('--page-size <size>', 'Размер страницы', parseInt)
648
+ .action(async (options) => {
649
+ try {
650
+ // Парсим неизвестные опции для передачи в API
651
+ const unknownOptions = {};
652
+ const args = process.argv.slice(process.argv.indexOf('invoices') + 1);
653
+ for (let i = 0; i < args.length; i += 2) {
654
+ const arg = args[i];
655
+ const nextArg = args[i + 1];
656
+ if (arg?.startsWith('--') && nextArg) {
657
+ const key = arg.replace('--', '');
658
+ const value = nextArg;
659
+ // Пытаемся определить тип значения
660
+ if (value === 'true' || value === 'false') {
661
+ unknownOptions[key] = value === 'true';
662
+ }
663
+ else if (!isNaN(Number(value))) {
664
+ unknownOptions[key] = Number(value);
665
+ }
666
+ else {
667
+ unknownOptions[key] = value;
668
+ }
669
+ }
670
+ }
671
+ await getInvoicesCommand(options.packageName, {
672
+ ...options,
673
+ ...unknownOptions,
674
+ });
675
+ }
676
+ catch (error) {
677
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
678
+ process.exit(1);
679
+ }
680
+ });
681
+ paymentsAppCommand
682
+ .command('purchase')
683
+ .description('Получить информацию о покупке')
684
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
685
+ .requiredOption('--purchaseId <id>', 'ID покупки', parseInt)
686
+ .option('-j, --json', 'Вывести результат в формате JSON')
687
+ .action(async (options) => {
688
+ try {
689
+ await getPurchaseCommand(options.packageName, options.purchaseId, options.json);
690
+ }
691
+ catch (error) {
692
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
693
+ process.exit(1);
694
+ }
695
+ });
696
+ paymentsAppCommand
697
+ .command('purchase-list')
698
+ .description('Получить список покупок приложения')
699
+ .requiredOption('--packageName <name>', 'Имя пакета приложения (например, com.example.app)')
700
+ .allowUnknownOption()
701
+ .allowExcessArguments()
702
+ .option('-a, --all', 'Получить все покупки (с пагинацией)')
703
+ .option('-j, --json', 'Вывести результат в формате JSON')
704
+ .option('--page-size <size>', 'Размер страницы', parseInt)
705
+ .action(async (options) => {
706
+ try {
707
+ // Парсим неизвестные опции для передачи в API
708
+ const unknownOptions = {};
709
+ const args = process.argv.slice(process.argv.indexOf('purchase-list') + 1);
710
+ for (let i = 0; i < args.length; i += 2) {
711
+ const arg = args[i];
712
+ const nextArg = args[i + 1];
713
+ if (arg?.startsWith('--') && nextArg) {
714
+ const key = arg.replace('--', '');
715
+ const value = nextArg;
716
+ // Пытаемся определить тип значения
717
+ if (value === 'true' || value === 'false') {
718
+ unknownOptions[key] = value === 'true';
719
+ }
720
+ else if (!isNaN(Number(value))) {
721
+ unknownOptions[key] = Number(value);
722
+ }
723
+ else {
724
+ unknownOptions[key] = value;
725
+ }
726
+ }
727
+ }
728
+ await getPurchaseListCommand(options.packageName, {
729
+ ...options,
730
+ ...unknownOptions,
731
+ });
732
+ }
733
+ catch (error) {
734
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
735
+ process.exit(1);
736
+ }
737
+ });
738
+ // Команды для работы с продуктовым каталогом
739
+ const catalogCommand = program
740
+ .command('catalog')
741
+ .description('Работа с продуктовым каталогом');
742
+ catalogCommand
743
+ .command('list')
744
+ .description('Получить список продуктов')
745
+ .allowUnknownOption()
746
+ .allowExcessArguments()
747
+ .option('-a, --all', 'Получить все продукты (с пагинацией)')
748
+ .option('-j, --json', 'Вывести результат в формате JSON')
749
+ .option('--page-size <size>', 'Размер страницы', parseInt)
750
+ .action(async (options) => {
751
+ try {
752
+ // Парсим неизвестные опции для передачи в API
753
+ const unknownOptions = {};
754
+ const args = process.argv.slice(process.argv.indexOf('list') + 1);
755
+ for (let i = 0; i < args.length; i += 2) {
756
+ const arg = args[i];
757
+ const nextArg = args[i + 1];
758
+ if (arg?.startsWith('--') && nextArg) {
759
+ const key = arg.replace('--', '');
760
+ const value = nextArg;
761
+ // Пытаемся определить тип значения
762
+ if (value === 'true' || value === 'false') {
763
+ unknownOptions[key] = value === 'true';
764
+ }
765
+ else if (!isNaN(Number(value))) {
766
+ unknownOptions[key] = Number(value);
767
+ }
768
+ else {
769
+ unknownOptions[key] = value;
770
+ }
771
+ }
772
+ }
773
+ await getProductsCommand({
774
+ ...options,
775
+ ...unknownOptions,
776
+ });
777
+ }
778
+ catch (error) {
779
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
780
+ process.exit(1);
781
+ }
782
+ });
783
+ catalogCommand
784
+ .command('get')
785
+ .description('Получить информацию о продукте')
786
+ .requiredOption('--productId <id>', 'ID продукта', parseInt)
787
+ .option('-j, --json', 'Вывести результат в формате JSON')
788
+ .action(async (options) => {
789
+ try {
790
+ await getProductCommand(options.productId, options.json);
791
+ }
792
+ catch (error) {
793
+ console.error('Ошибка:', error instanceof Error ? error.message : String(error));
794
+ process.exit(1);
795
+ }
796
+ });
250
797
  // Показываем помощь, если команда не указана
251
798
  if (process.argv.length === 2) {
252
799
  program.help();