Files
2026-07-13 12:30:28 +08:00

295 lines
9.9 KiB
TypeScript

import chalk from 'chalk';
import figlet from 'figlet';
// show ASCII art banner
function showBanner(): void {
console.log(
chalk.cyan(
figlet.textSync("Pinme CLI", { horizontalLayout: "full" })
)
);
console.log(chalk.cyan("A command-line tool for uploading files to IPFS\n"));
}
// general help
function showGeneralHelp(): void {
showBanner();
console.log("USAGE:");
console.log(" pinme [command] [options]\n");
console.log("COMMANDS:");
console.log(" upload Upload a file or directory to IPFS");
console.log(" bind Upload and bind to a domain (requires wallet balance)");
console.log(" login Login via browser (recommended)");
console.log(" list Show upload history");
console.log(" ls Alias for 'list' command");
console.log(" set-appkey Set AppKey for authentication (alternative)");
console.log(" show-appkey Show current AppKey information (masked)");
console.log(" appkey Alias for 'show-appkey' command");
console.log(" wallet Show current wallet balance");
console.log(" wallet-balance Alias for 'wallet' command");
console.log(" balance Alias for 'wallet' command");
console.log(" logout Log out and clear authentication");
console.log(" help [command] Show help for a specific command\n");
console.log("OPTIONS:");
console.log(" -v, --version Output the current version");
console.log(" -h, --help Display help for command\n");
console.log("For more information on a specific command, try:");
console.log(" pinme help [command]");
}
// bind command help
function showBindHelp(): void {
console.log("COMMAND:");
console.log(" bind - Upload and bind to a domain (requires wallet balance)\n");
console.log("USAGE:");
console.log(" pinme bind <path> [options]\n");
console.log("DESCRIPTION:");
console.log(" This command uploads files and binds them to a custom domain.");
console.log(" Domain binding deducts from your wallet balance.\n");
console.log("OPTIONS:");
console.log(" -d, --domain <name> Domain name to bind (required)");
console.log(" --dns Force DNS domain mode (optional, auto-detected)\n");
console.log("EXAMPLES:");
console.log(" # Interactive mode (will prompt for path and domain)");
console.log(" pinme bind\n");
console.log(" # Bind to a Pinme subdomain (auto-detected: no dot in domain)");
console.log(" pinme bind ./dist --domain my-site\n");
console.log(" # Bind to a DNS domain (auto-detected: contains dot)");
console.log(" pinme bind ./dist --domain example.com\n");
console.log(" # Force DNS mode with --dns flag");
console.log(" pinme bind ./dist --domain my-site --dns\n");
console.log("AUTO-DETECTION:");
console.log(" - Domains with a dot (e.g., example.com) are treated as DNS domains");
console.log(" - Domains without a dot (e.g., my-site) are treated as Pinme subdomains");
console.log(" - Use --dns flag to force DNS domain mode\n");
console.log("REQUIREMENTS:");
console.log(" - Sufficient wallet balance is required for domain binding");
console.log(" - Valid AppKey must be set (run: pinme set-appkey <AppKey>)");
console.log(" - For DNS domains, you must own the domain\n");
console.log("URL FORMATS:");
console.log(" - Pinme subdomain: https://<name>.pinit.eth.limo");
console.log(" - DNS domain: https://<your-domain>.com\n");
console.log("DNS SETUP:");
console.log(" After successful DNS binding, visit:");
console.log(" https://pinme.eth.limo/#/docs?id=custom-domain");
console.log(" for DNS configuration guide.\n");
}
// upload command help
function showUploadHelp(): void {
console.log("COMMAND:");
console.log(" upload - Upload a file or directory to IPFS\n");
console.log("USAGE:");
console.log(" pinme upload [path] [options]\n");
console.log("DESCRIPTION:");
console.log(" This command uploads files or directories to IPFS.");
console.log(" If no path is provided, it will start in interactive mode.");
console.log(" Supports --domain option to bind a custom domain after upload (requires wallet balance).\n");
console.log("OPTIONS:");
console.log(" -d, --domain <name> Domain name to bind (optional, requires wallet balance)");
console.log(" --dns Force DNS domain mode (optional, auto-detected)\n");
console.log("EXAMPLES:");
console.log(" # Upload without binding");
console.log(" pinme upload");
console.log(" pinme upload ./my-website\n");
console.log(" # Upload and bind to a Pinme subdomain (auto-detected: no dot)");
console.log(" pinme upload ./dist --domain my-site\n");
console.log(" # Upload and bind to a DNS domain (auto-detected: contains dot)");
console.log(" pinme upload ./dist --domain example.com\n");
console.log(" # Force DNS mode with --dns flag");
console.log(" pinme upload ./dist --domain my-site --dns\n");
console.log("AUTO-DETECTION:");
console.log(" - Domains with a dot (e.g., example.com) are treated as DNS domains");
console.log(" - Domains without a dot (e.g., my-site) are treated as Pinme subdomains");
console.log(" - Use --dns flag to force DNS domain mode\n");
console.log("REQUIREMENTS:");
console.log(" - Sufficient wallet balance is required for domain binding");
console.log(" - Valid AppKey must be set (run: pinme login)");
console.log(" - For DNS domains, you must own the domain\n");
console.log("LIMITATIONS:");
console.log(" - Maximum file size: 10MB");
console.log(" - Maximum directory size: 500MB");
}
// login command help
function showLoginHelp(): void {
console.log("COMMAND:");
console.log(" login - Login via browser (recommended)\n");
console.log("USAGE:");
console.log(" pinme login\n");
console.log("DESCRIPTION:");
console.log(" This command opens the PinMe website in your browser for authentication.");
console.log(" After logging in, your token will be automatically saved.\n");
console.log("EXAMPLES:");
console.log(" pinme login\n");
console.log("HOW IT WORKS:");
console.log(" 1. CLI starts a local server");
console.log(" 2. Opens browser to PinMe login page");
console.log(" 3. User logs in on the website");
console.log(" 4. Website redirects back to CLI with token");
console.log(" 5. Token is saved locally\n");
console.log("NOTE:");
console.log(" - If you prefer manual input, use: pinme set-appkey <AppKey>");
console.log(" - Get your AppKey from: https://pinme.eth.limo/\n");
}
// list command help
function showListHelp(): void {
console.log("COMMAND:");
console.log(" list - Show upload history\n");
console.log("USAGE:");
console.log(" pinme list [options]\n");
console.log("OPTIONS:");
console.log(" -l, --limit <number> Limit the number of records to show");
console.log(" -c, --clear Clear all upload history\n");
console.log("EXAMPLES:");
console.log(" pinme list");
console.log(" pinme list -l 5");
console.log(" pinme list -c");
}
// ls command help (can reuse the list command help)
function showLsHelp(): void {
console.log("COMMAND:");
console.log(" ls - Alias for 'list' command\n");
console.log("USAGE:");
console.log(" pinme ls [options]\n");
console.log("OPTIONS:");
console.log(" -l, --limit <number> Limit the number of records to show");
console.log(" -c, --clear Clear all upload history\n");
console.log("EXAMPLES:");
console.log(" pinme ls");
console.log(" pinme ls -l 5");
console.log(" pinme ls -c");
}
// show-appkey command help
function showShowAppKeyHelp(): void {
console.log("COMMAND:");
console.log(" show-appkey - Show current AppKey information (masked)\n");
console.log("USAGE:");
console.log(" pinme show-appkey");
console.log(" pinme appkey\n");
console.log("DESCRIPTION:");
console.log(" This command displays the current AppKey information.");
console.log(" Sensitive information (token and AppKey) will be masked for security.\n");
console.log("EXAMPLES:");
console.log(" pinme show-appkey");
console.log(" pinme appkey");
}
function showWalletBalanceHelp(): void {
console.log("COMMAND:");
console.log(" wallet - Show current wallet balance\n");
console.log("USAGE:");
console.log(" pinme wallet");
console.log(" pinme wallet-balance");
console.log(" pinme balance\n");
console.log("DESCRIPTION:");
console.log(" This command fetches the current wallet balance for the logged-in account.");
console.log(" The value is displayed in USD.\n");
console.log("EXAMPLES:");
console.log(" pinme wallet");
console.log(" pinme wallet-balance");
console.log(" pinme balance");
}
// logout command help
function showLogoutHelp(): void {
console.log("COMMAND:");
console.log(" logout - Log out and clear authentication\n");
console.log("USAGE:");
console.log(" pinme logout\n");
console.log("DESCRIPTION:");
console.log(" This command logs out the current user and clears the authentication");
console.log(" information from local storage. You will need to set AppKey again");
console.log(" to use authenticated features.\n");
console.log("EXAMPLES:");
console.log(" pinme logout");
}
// show the help for the command
function showHelp(command?: string): void {
if (!command) {
showGeneralHelp();
return;
}
switch (command) {
case 'bind':
showBindHelp();
break;
case 'upload':
showUploadHelp();
break;
case 'login':
showLoginHelp();
break;
case 'list':
showListHelp();
break;
case 'ls':
showLsHelp();
break;
case 'show-appkey':
case 'appkey':
showShowAppKeyHelp();
break;
case 'wallet':
case 'wallet-balance':
case 'balance':
showWalletBalanceHelp();
break;
case 'logout':
showLogoutHelp();
break;
default:
console.log(`Unknown command: ${command}`);
showGeneralHelp();
}
}
export {
showHelp,
showBanner
};