npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

rustore

v1.0.4

Published

CLI для работы с RuStore API

Readme

NPM version npm-typescript License

🌟 Возможности

  • 🔐 Авторизация через приватный ключ из RuStore Консоль
  • 🔑 Автоматическое управление токенами доступа
  • 📦 Работа с API RuStore (платежи, подписки, приложения)
  • 📄 Вывод результатов в формате JSON (--json) для удобной интеграции и обработки
  • ⚙️ Сохранение конфигурации в ~/.rustore/config.json
  • 🧪 Полное покрытие тестами

🛠️ Установка

Глобальная установка

npm install -g rustore

После установки используйте команду:

rustore --help

Использование через npx (без установки)

Вы можете использовать CLI без установки через npx:

npx rustore --help
npx rustore login --key-id <keyId> --key <privateKey>
npx rustore apps list

Локальная установка

npm install rustore

📖 Использование

Первоначальная настройка

Перед использованием CLI необходимо получить приватный ключ в RuStore Консоль.

Авторизация

# Авторизация с указанием keyId и приватного ключа
rustore login --key-id <keyId> --key <base64-ключ>

# Или короткая форма
rustore login -i <keyId> -k <base64-ключ>

Пример:

rustore login --key-id 123456 --key MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC...

Проверка статуса

# Показать информацию о текущей авторизации
rustore whoami

Выход из системы

# Удалить токен (ключи остаются в конфиге)
rustore logout

Работа с приложениями

# Получить список приложений
rustore apps list

# Получить все приложения (с пагинацией)
rustore apps list --all

# Вывести результат в формате JSON (удобно для скриптов и интеграций)
rustore apps list --json

# Комбинирование опций: получить все приложения в JSON формате
rustore apps list --all --json

# Фильтрация с JSON выводом
rustore apps list --app-name "MyApp" --json
rustore apps list --app-status PUBLISHED --json

# Создать черновую версию приложения
rustore apps create-draft --app-id 123456 --version-name "1.0.0" --version-code 1

# Создать черновую версию с JSON выводом
rustore apps create-draft --app-id 123456 --version-name "2.0.0" --version-code 2 --json

# Загрузить APK файл для версии (обязательно указать is-main-apk)
rustore apps upload-apk --package-name com.example.app --version-id 789 --file ./app-release.apk --is-main-apk true

# Загрузить APK файл с Huawei Mobile Services
rustore apps upload-apk --package-name com.example.app --version-id 789 --file ./app-release.apk --is-main-apk false --services-type HMS

# Загрузить APK файл с JSON выводом
rustore apps upload-apk --package-name com.example.app --version-id 789 --file ./app-release.apk --is-main-apk true --json

Работа с отзывами

# Получить отзывы приложения
rustore feedback list --package-name com.example.app

# Получить все отзывы (с пагинацией)
rustore feedback list --package-name com.example.app --all

# Получить отзывы в JSON формате
rustore feedback list --package-name com.example.app --json

# Оставить ответ на отзыв
rustore feedback answer --package-name com.example.app --comment-id 123456 --text "Спасибо за отзыв!"

# Получить статус ответа на отзыв
rustore feedback status --package-name com.example.app --feedback-id 789

# Получить все ответы на отзывы
rustore feedback status --package-name com.example.app

# Изменить ответ на отзыв
rustore feedback update --package-name com.example.app --feedback-id 789 --text "Обновлённый ответ"

# Удалить ответ на отзыв
rustore feedback delete --package-name com.example.app --feedback-id 789

💡 Совет: Флаг --json полезен для:

  • Автоматизации и скриптов
  • Интеграции с другими инструментами
  • Обработки данных через jq или другие JSON-парсеры
  • Сохранения результатов в файл: rustore apps list --json > apps.json

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

CLI сохраняет конфигурацию в ~/.rustore/config.json:

{
  "keyId": "ваш-key-id",
  "privateKey": "ваш-приватный-ключ-base64",
  "token": "jwe-токен",
  "tokenExpiresAt": 1234567890
}

🔧 Разработка

Установка зависимостей

npm install

Сборка

npm run build

Запуск в режиме разработки

npm start

Тестирование

# Запустить все тесты
npm test

# Тесты в watch режиме
npm run test:watch

# С покрытием
npm run test:coverage

Как протестировать текущие изменения

  1. Сборка проекта:

    npm run build
  2. Проверка типов:

    npm run type-check
    # или
    ./node_modules/.bin/tsc --noEmit
  3. Запуск тестов:

    npm test
  4. Тестирование CLI локально:

    # Запуск без установки (через tsx)
    npm start -- login <keyId> --key <key>
    
    # Или после сборки
    node dist/bin.js whoami
  5. Линтинг:

    npm run lint
    npm run lint:fix

Проверка типов

npm run type-check

Линтинг

npm run lint
npm run lint:fix

📚 API

Структура API

API организовано по категориям, как в документации RuStore:

  • Apps API (appsApi) - Загрузка и публикация приложений (общие методы)
  • Payments API (paymentsApi) - Работа с платежами и подписками (общие методы)
  • Payments App API (paymentsAppApi) - Работа с платежами и подписками (методы приложений)
  • Catalog API (catalogApi) - API для работы с продуктовым каталогом

Программный доступ

import {login, appsApi, paymentsApi, catalogApi, feedbackApi} from 'rustore';

// Авторизация
await login('keyId', 'privateKey');

// Получить список приложений
const appsResponse = await appsApi.getAppList();
console.log(appsResponse.body.content);

// Получить все приложения (с автоматической пагинацией)
const allApps = await appsApi.getAllApps();

// Создать черновую версию приложения
const draftVersion = await appsApi.createDraftVersion(123456, {
  versionName: '1.0.0',
  versionCode: 1,
});

// Загрузить APK файл для версии
const uploadResult = await appsApi.uploadApkFile(
  'com.example.app', // packageName вместо appId
  draftVersion.body?.versionId || 789,
  './app-release.apk',
  {
    isMainApk: true, // обязательный параметр
    servicesType: 'Unknown', // опциональный: 'HMS' или 'Unknown'
  },
);

// Получить отзывы приложения
const feedbackResponse = await feedbackApi.getFeedback('com.example.app');

// Оставить ответ на отзыв
const answerResponse = await feedbackApi.createFeedbackAnswer('com.example.app', 123456, {
  text: 'Спасибо за отзыв!',
});

// Получить статус ответа на отзыв
const statusResponse = await feedbackApi.getFeedbackAnswerStatus('com.example.app', 789);

// Использование других API категорий
// await paymentsApi.refund(...);
// await catalogApi.getProducts(...);

🔗 Полезные ссылки

📋 TODO: API Endpoints Implementation Status

Статус реализации всех endpoints RuStore API. См. TODO_API_ENDPOINTS.md для подробной информации.

✅ Реализовано (Implemented & Tested)

Authorization (Авторизация)

  • ✅ 🧪 Get Authorization Token - POST /public/auth/

Upload & Publication App (Загрузка и публикация приложений)

  • ✅ 🧪 Get App List - GET /public/v1/application
  • ✅ 🧪 Create Draft Version - POST /public/v1/application/{packageName}/version
  • ✅ 🧪 Upload APK File - POST /public/v1/application/{packageName}/version/{versionId}/apk
  • ✅ 🧪 Send Draft for Moderation - POST /public/v1/application/{packageName}/version/{versionId}/commit
  • ✅ 🧪 Get Version Info - GET /public/v1/application/{packageName}/version/{versionId}
  • ✅ 🧪 Get Version List - GET /public/v1/application/{packageName}/version
  • ✅ 🧪 Get App Tag List - GET /public/v1/application/tag
  • ✅ 🧪 Upload AAB File - POST /public/v1/application/{packageName}/version/{versionId}/aab
  • ✅ 🧪 Update Draft Version - PUT /public/v1/application/{packageName}/version/{versionId}
  • ✅ 🧪 Delete Draft Version - DELETE /public/v1/application/{packageName}/version/{versionId}
  • ✅ 🧪 Upload Screens - POST /public/v1/application/{packageName}/version/{versionId}/screens
  • ✅ 🧪 Get Version Status - GET /public/v1/application/{packageName}/version/{versionId}/status

Feedback Process (Работа с отзывами)

  • ✅ 🧪 Get Feedback - GET /public/v1/application/{packageName}/feedback
  • ✅ 🧪 Create Feedback Answer - POST /public/v1/application/{packageName}/feedback/{commentId}/answer
  • ✅ 🧪 Get Feedback Answer Status - GET /public/v1/application/{packageName}/feedback/{feedbackId}
  • ✅ 🧪 Update Feedback Answer - PUT /public/v1/application/{packageName}/feedback/{feedbackId}
  • ✅ 🧪 Delete Feedback Answer - DELETE /public/v1/application/{packageName}/feedback/{feedbackId}

❌ Не реализовано (Not Implemented)

Upload & Publication App

  • Все основные endpoints реализованы ✅

Payments & Subscriptions (Общие методы)

Base URL: https://www.rustore.ru/help/work-with-rustore-api/api-payments-subscriptions

  • ✅ 🧪 Get Payment - GET /public/v1/payment/{paymentId}
  • ✅ 🧪 Get Subscription - GET /public/v1/subscription/{subscriptionId}
  • ✅ 🧪 Get Subscription List - GET /public/v1/subscription
  • ❌ Refund - POST /public/v1/payment/refund
  • ❌ Cancel Subscription - POST /public/v1/subscription/{subscriptionId}/cancel

Payments & Subscriptions App (Методы приложений)

Base URL: https://www.rustore.ru/help/work-with-rustore-api/api-payments-subscriptions-app

  • ✅ 🧪 Get Invoices - GET /public/v1/application/{packageName}/invoice
  • ✅ 🧪 Get Purchase - GET /public/v1/application/{packageName}/purchase/{purchaseId}
  • ✅ 🧪 Get Purchase List - GET /public/v1/application/{packageName}/purchase
  • ❌ Confirm Purchase - POST /public/v1/application/{packageName}/purchase/confirm
  • ❌ Cancel Purchase - POST /public/v1/application/{packageName}/purchase/cancel

Catalog (Продуктовый каталог)

Base URL: https://www.rustore.ru/help/work-with-rustore-api/api-catalog

  • ✅ 🧪 Get Products - GET /public/v1/catalog/product
  • ✅ 🧪 Get Product - GET /public/v1/catalog/product/{productId}
  • ❌ Create Product - POST /public/v1/catalog/product
  • ❌ Update Product - PUT /public/v1/catalog/product/{productId}
  • ❌ Delete Product - DELETE /public/v1/catalog/product/{productId}

Легенда статусов:

  • Implemented - Полностью реализовано, протестировано и задокументировано
  • 🧪 Tested - Реализовано и имеет тесты
  • ⚠️ Issues - Реализовано, но есть известные проблемы
  • 🚧 Beta - Реализовано, но требует дополнительного тестирования/верификации
  • Not Implemented - Еще не реализовано

Приоритеты реализации:

  1. High Priority: Upload AAB File, Update Draft Version, Delete Draft Version - Реализовано
  2. Medium Priority: POST/PUT/DELETE Payment/Subscription endpoints
  3. Low Priority: POST/PUT/DELETE Catalog endpoints, advanced payment operations

📝 Лицензия

MIT