@re-shell/cli
Version:
Full-stack development platform uniting microservices and microfrontends. Build complete applications with .NET (ASP.NET Core Web API, Minimal API), Java (Spring Boot, Quarkus, Micronaut, Vert.x), Rust (Actix-Web, Warp, Rocket, Axum), Python (FastAPI, Dja
398 lines (397 loc) ⢠18.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.searchMarketplace = searchMarketplace;
exports.showPluginDetails = showPluginDetails;
exports.installMarketplacePlugin = installMarketplacePlugin;
exports.showPluginReviews = showPluginReviews;
exports.showFeaturedPlugins = showFeaturedPlugins;
exports.showPopularPlugins = showPopularPlugins;
exports.showCategories = showCategories;
exports.clearMarketplaceCache = clearMarketplaceCache;
exports.showMarketplaceStats = showMarketplaceStats;
const chalk_1 = __importDefault(require("chalk"));
const spinner_1 = require("../utils/spinner");
const error_handler_1 = require("../utils/error-handler");
const plugin_marketplace_1 = require("../utils/plugin-marketplace");
// Search plugins in marketplace
async function searchMarketplace(query, options = {}) {
const { verbose = false, json = false, limit = 10, category, featured, verified, free, sort = 'relevance', order = 'desc' } = options;
try {
const marketplace = (0, plugin_marketplace_1.createMarketplace)();
const filters = {
query,
category,
featured,
verified,
free,
sortBy: sort,
sortOrder: order,
limit
};
const spinner = (0, spinner_1.createSpinner)('Searching marketplace...');
spinner.start();
const result = await marketplace.searchPlugins(filters);
spinner.stop();
if (json) {
console.log(JSON.stringify(result, null, 2));
return;
}
console.log(chalk_1.default.cyan(`\nš Marketplace Search Results\n`));
if (result.plugins.length === 0) {
console.log(chalk_1.default.yellow('No plugins found matching your criteria.'));
return;
}
console.log(chalk_1.default.gray(`Found ${result.total} plugin(s), showing ${result.plugins.length}`));
console.log('');
result.plugins.forEach(plugin => {
displayPluginSummary(plugin, verbose);
console.log('');
});
if (result.pages > 1) {
console.log(chalk_1.default.gray(`Page ${result.page} of ${result.pages}`));
}
}
catch (error) {
throw new error_handler_1.ValidationError(`Marketplace search failed: ${error instanceof Error ? error.message : String(error)}`);
}
}
// Show plugin details
async function showPluginDetails(pluginId, options = {}) {
const { verbose = false, json = false } = options;
if (!(0, plugin_marketplace_1.isValidPluginId)(pluginId)) {
throw new error_handler_1.ValidationError(`Invalid plugin ID: ${pluginId}`);
}
try {
const marketplace = (0, plugin_marketplace_1.createMarketplace)();
const spinner = (0, spinner_1.createSpinner)(`Fetching plugin details for ${pluginId}...`);
spinner.start();
const plugin = await marketplace.getPlugin(pluginId);
spinner.stop();
if (!plugin) {
console.log(chalk_1.default.red(`Plugin '${pluginId}' not found in marketplace.`));
return;
}
if (json) {
console.log(JSON.stringify(plugin, null, 2));
return;
}
displayPluginDetails(plugin, verbose);
}
catch (error) {
throw new error_handler_1.ValidationError(`Failed to fetch plugin details: ${error instanceof Error ? error.message : String(error)}`);
}
}
// Install plugin from marketplace
async function installMarketplacePlugin(pluginId, version, options = {}) {
const { verbose = false, global = false, force = false } = options;
if (!(0, plugin_marketplace_1.isValidPluginId)(pluginId)) {
throw new error_handler_1.ValidationError(`Invalid plugin ID: ${pluginId}`);
}
try {
const marketplace = (0, plugin_marketplace_1.createMarketplace)();
const spinner = (0, spinner_1.createSpinner)(`Installing ${pluginId}${version ? `@${version}` : ''}...`);
spinner.start();
const result = await marketplace.installPlugin(pluginId, version, { global, force });
spinner.stop();
if (result.success) {
console.log(chalk_1.default.green(`ā Successfully installed ${pluginId}@${result.installedVersion}`));
console.log(` Location: ${result.installPath}`);
if (result.dependencies.length > 0) {
console.log(` Dependencies: ${result.dependencies.join(', ')}`);
}
if (result.warnings.length > 0) {
console.log(chalk_1.default.yellow(' Warnings:'));
result.warnings.forEach(warning => {
console.log(` ${chalk_1.default.yellow('ā ')} ${warning}`);
});
}
console.log(chalk_1.default.gray(` Installation completed in ${result.duration}ms`));
}
else {
console.log(chalk_1.default.red(`ā Failed to install ${pluginId}`));
if (result.errors.length > 0) {
console.log(chalk_1.default.red(' Errors:'));
result.errors.forEach(error => {
console.log(` ${chalk_1.default.red('ā')} ${error}`);
});
}
}
if (verbose && result.warnings.length > 0) {
console.log(chalk_1.default.yellow('\nWarnings:'));
result.warnings.forEach(warning => {
console.log(` ${chalk_1.default.yellow('ā ')} ${warning}`);
});
}
}
catch (error) {
throw new error_handler_1.ValidationError(`Plugin installation failed: ${error instanceof Error ? error.message : String(error)}`);
}
}
// Get plugin reviews
async function showPluginReviews(pluginId, options = {}) {
const { verbose = false, json = false, limit = 10 } = options;
if (!(0, plugin_marketplace_1.isValidPluginId)(pluginId)) {
throw new error_handler_1.ValidationError(`Invalid plugin ID: ${pluginId}`);
}
try {
const marketplace = (0, plugin_marketplace_1.createMarketplace)();
const spinner = (0, spinner_1.createSpinner)(`Fetching reviews for ${pluginId}...`);
spinner.start();
const reviews = await marketplace.getPluginReviews(pluginId, limit);
spinner.stop();
if (json) {
console.log(JSON.stringify(reviews, null, 2));
return;
}
console.log(chalk_1.default.cyan(`\nā Reviews for ${pluginId}\n`));
if (reviews.length === 0) {
console.log(chalk_1.default.yellow('No reviews found for this plugin.'));
return;
}
reviews.forEach(review => {
const stars = 'ā
'.repeat(review.rating) + 'ā'.repeat(5 - review.rating);
const verifiedBadge = review.verified ? chalk_1.default.green('[Verified]') : '';
console.log(`${chalk_1.default.yellow(stars)} ${chalk_1.default.white(review.title)} ${verifiedBadge}`);
console.log(`By ${chalk_1.default.blue(review.username)} on ${new Date(review.createdAt).toLocaleDateString()}`);
console.log(`${review.content}`);
if (verbose && (review.pros?.length || review.cons?.length)) {
if (review.pros?.length) {
console.log(chalk_1.default.green(' Pros:'));
review.pros.forEach(pro => console.log(` + ${pro}`));
}
if (review.cons?.length) {
console.log(chalk_1.default.red(' Cons:'));
review.cons.forEach(con => console.log(` - ${con}`));
}
}
if (review.helpful > 0) {
console.log(chalk_1.default.gray(` ${review.helpful} people found this helpful`));
}
console.log('');
});
}
catch (error) {
throw new error_handler_1.ValidationError(`Failed to fetch reviews: ${error instanceof Error ? error.message : String(error)}`);
}
}
// Get featured plugins
async function showFeaturedPlugins(options = {}) {
const { verbose = false, json = false, limit = 6 } = options;
try {
const marketplace = (0, plugin_marketplace_1.createMarketplace)();
const spinner = (0, spinner_1.createSpinner)('Fetching featured plugins...');
spinner.start();
const plugins = await marketplace.getFeaturedPlugins(limit);
spinner.stop();
if (json) {
console.log(JSON.stringify(plugins, null, 2));
return;
}
console.log(chalk_1.default.cyan('\nš Featured Plugins\n'));
if (plugins.length === 0) {
console.log(chalk_1.default.yellow('No featured plugins available.'));
return;
}
plugins.forEach(plugin => {
displayPluginSummary(plugin, verbose);
console.log('');
});
}
catch (error) {
throw new error_handler_1.ValidationError(`Failed to fetch featured plugins: ${error instanceof Error ? error.message : String(error)}`);
}
}
// Get popular plugins
async function showPopularPlugins(category, options = {}) {
const { verbose = false, json = false, limit = 10 } = options;
try {
const marketplace = (0, plugin_marketplace_1.createMarketplace)();
const categoryText = category ? ` in ${category}` : '';
const spinner = (0, spinner_1.createSpinner)(`Fetching popular plugins${categoryText}...`);
spinner.start();
const plugins = await marketplace.getPopularPlugins(category, limit);
spinner.stop();
if (json) {
console.log(JSON.stringify(plugins, null, 2));
return;
}
console.log(chalk_1.default.cyan(`\nš„ Popular Plugins${categoryText}\n`));
if (plugins.length === 0) {
console.log(chalk_1.default.yellow('No popular plugins found.'));
return;
}
plugins.forEach((plugin, index) => {
console.log(`${chalk_1.default.yellow((index + 1).toString().padStart(2))}. ${chalk_1.default.white(plugin.name)}`);
console.log(` ${plugin.description}`);
console.log(` ${chalk_1.default.gray(`${(0, plugin_marketplace_1.formatDownloadCount)(plugin.downloads)} downloads ⢠ā ${plugin.rating}/5`)}`);
if (verbose) {
console.log(` ${chalk_1.default.blue(plugin.author)} ⢠${chalk_1.default.gray(plugin.category)} ⢠${plugin.license}`);
}
console.log('');
});
}
catch (error) {
throw new error_handler_1.ValidationError(`Failed to fetch popular plugins: ${error instanceof Error ? error.message : String(error)}`);
}
}
// Get plugin categories
async function showCategories(options = {}) {
const { verbose = false, json = false } = options;
try {
const marketplace = (0, plugin_marketplace_1.createMarketplace)();
const spinner = (0, spinner_1.createSpinner)('Fetching plugin categories...');
spinner.start();
const categories = await marketplace.getCategories();
spinner.stop();
if (json) {
console.log(JSON.stringify(categories, null, 2));
return;
}
console.log(chalk_1.default.cyan('\nš Plugin Categories\n'));
categories.forEach(category => {
console.log(`${chalk_1.default.yellow(category.name)} (${category.count})`);
if (verbose) {
console.log(` ${chalk_1.default.gray(category.description)}`);
}
console.log('');
});
console.log(chalk_1.default.gray(`Total: ${categories.reduce((sum, c) => sum + c.count, 0)} plugins across ${categories.length} categories`));
}
catch (error) {
throw new error_handler_1.ValidationError(`Failed to fetch categories: ${error instanceof Error ? error.message : String(error)}`);
}
}
// Clear marketplace cache
async function clearMarketplaceCache() {
try {
const marketplace = (0, plugin_marketplace_1.createMarketplace)();
marketplace.clearCache();
console.log(chalk_1.default.green('ā Marketplace cache cleared'));
}
catch (error) {
throw new error_handler_1.ValidationError(`Failed to clear cache: ${error instanceof Error ? error.message : String(error)}`);
}
}
// Get marketplace statistics
async function showMarketplaceStats() {
try {
const marketplace = (0, plugin_marketplace_1.createMarketplace)();
const stats = marketplace.getStats();
console.log(chalk_1.default.cyan('\nš Marketplace Statistics\n'));
console.log(chalk_1.default.yellow('Cache:'));
console.log(` Cached items: ${stats.cacheSize}`);
console.log(` Cache timeout: ${Math.round(stats.config.cacheTimeout / 1000)}s`);
console.log(chalk_1.default.yellow('\nDownloads:'));
console.log(` Active downloads: ${stats.activeDownloads}`);
console.log(` Download timeout: ${Math.round(stats.config.downloadTimeout / 1000)}s`);
console.log(chalk_1.default.yellow('\nSecurity:'));
console.log(` Signature verification: ${stats.config.verifySignatures ? chalk_1.default.green('enabled') : chalk_1.default.red('disabled')}`);
}
catch (error) {
throw new error_handler_1.ValidationError(`Failed to get marketplace stats: ${error instanceof Error ? error.message : String(error)}`);
}
}
// Display plugin summary
function displayPluginSummary(plugin, verbose) {
const badges = [];
if (plugin.featured)
badges.push(chalk_1.default.yellow('FEATURED'));
if (plugin.verified)
badges.push(chalk_1.default.green('VERIFIED'));
if (plugin.pricing.type === 'free')
badges.push(chalk_1.default.blue('FREE'));
const badgeText = badges.length > 0 ? ` ${badges.join(' ')}` : '';
console.log(`${chalk_1.default.white(plugin.name)}${badgeText}`);
console.log(`${plugin.description}`);
console.log(`${chalk_1.default.blue(plugin.author)} ⢠v${plugin.version} ⢠${chalk_1.default.gray(plugin.category)}`);
console.log(`${chalk_1.default.gray(`${(0, plugin_marketplace_1.formatDownloadCount)(plugin.downloads)} downloads ⢠ā ${plugin.rating}/5 (${plugin.reviewCount} reviews)`)}`);
if (verbose) {
console.log(`Keywords: ${plugin.keywords.join(', ')}`);
console.log(`Size: ${(0, plugin_marketplace_1.formatFileSize)(plugin.size)} ⢠License: ${plugin.license}`);
console.log(`Updated: ${new Date(plugin.updatedAt).toLocaleDateString()}`);
}
}
// Display detailed plugin information
function displayPluginDetails(plugin, verbose) {
console.log(chalk_1.default.cyan(`\nš¦ ${plugin.name}\n`));
// Basic info
console.log(`${plugin.description}\n`);
// Badges
const badges = [];
if (plugin.featured)
badges.push(chalk_1.default.yellow('FEATURED'));
if (plugin.verified)
badges.push(chalk_1.default.green('VERIFIED'));
if (plugin.pricing.type === 'free')
badges.push(chalk_1.default.blue('FREE'));
if (badges.length > 0) {
console.log(`${badges.join(' ')}\n`);
}
// Metadata
console.log(chalk_1.default.yellow('Details:'));
console.log(` Author: ${chalk_1.default.blue(plugin.author)}`);
console.log(` Version: ${plugin.version} (latest: ${plugin.latestVersion})`);
console.log(` Category: ${plugin.category}`);
console.log(` License: ${plugin.license}`);
console.log(` Size: ${(0, plugin_marketplace_1.formatFileSize)(plugin.size)}`);
// Stats
console.log(chalk_1.default.yellow('\nStatistics:'));
console.log(` Downloads: ${(0, plugin_marketplace_1.formatDownloadCount)(plugin.downloads)}`);
console.log(` Rating: ā ${plugin.rating}/5.0 (${plugin.reviewCount} reviews)`);
console.log(` Weekly: ${(0, plugin_marketplace_1.formatDownloadCount)(plugin.metrics.weeklyDownloads)}`);
console.log(` Monthly: ${(0, plugin_marketplace_1.formatDownloadCount)(plugin.metrics.monthlyDownloads)}`);
// Keywords
if (plugin.keywords.length > 0) {
console.log(chalk_1.default.yellow('\nKeywords:'));
console.log(` ${plugin.keywords.join(', ')}`);
}
// Compatibility
console.log(chalk_1.default.yellow('\nCompatibility:'));
console.log(` CLI Version: ${plugin.compatibility.cliVersion}`);
console.log(` Node.js: ${plugin.compatibility.nodeVersion}`);
console.log(` Platforms: ${plugin.compatibility.platforms.join(', ')}`);
// Dependencies
if (Object.keys(plugin.dependencies).length > 0) {
console.log(chalk_1.default.yellow('\nDependencies:'));
Object.entries(plugin.dependencies).forEach(([name, version]) => {
console.log(` ${name}: ${version}`);
});
}
// Support
console.log(chalk_1.default.yellow('\nSupport:'));
if (plugin.support.documentation) {
console.log(` Documentation: ${plugin.support.documentation}`);
}
if (plugin.support.issues) {
console.log(` Issues: ${plugin.support.issues}`);
}
if (plugin.support.community) {
console.log(` Community: ${plugin.support.community}`);
}
console.log(` Languages: ${plugin.support.languages.join(', ')}`);
// Dates
console.log(chalk_1.default.yellow('\nTimestamps:'));
console.log(` Created: ${new Date(plugin.createdAt).toLocaleDateString()}`);
console.log(` Updated: ${new Date(plugin.updatedAt).toLocaleDateString()}`);
if (verbose) {
// Repository metrics
console.log(chalk_1.default.yellow('\nRepository:'));
console.log(` Stars: ${plugin.metrics.stars}`);
console.log(` Forks: ${plugin.metrics.forks}`);
console.log(` Issues: ${plugin.metrics.issues}`);
console.log(` Contributors: ${plugin.metrics.contributors}`);
console.log(` Last Commit: ${new Date(plugin.metrics.lastCommit).toLocaleDateString()}`);
// Pricing
console.log(chalk_1.default.yellow('\nPricing:'));
console.log(` Type: ${plugin.pricing.type}`);
if (plugin.pricing.price) {
console.log(` Price: ${plugin.pricing.currency}${plugin.pricing.price} (${plugin.pricing.billing})`);
}
if (plugin.pricing.trialDays) {
console.log(` Trial: ${plugin.pricing.trialDays} days`);
}
}
}