meet-simen
Version:
Get to know Simen via `npx meet-simen`
95 lines (94 loc) • 4.01 kB
JavaScript
import { Command } from 'commander';
import ora from 'ora';
import chalk from 'chalk';
// Import utility functions
import { displayWelcome, displayBio, displaySocialWithGitHub, displayAd, displayDebug, displayTerminalSizeWarning } from './utils/display.js';
import { loadLocalData, loadRemoteData, loadConfig, getPackageInfo } from './utils/data-loader.js';
import { fetchGitHubStats } from './utils/github.js';
// Main function
async function main() {
try {
// Display terminal size warning
displayTerminalSizeWarning();
// Get package info
const pkg = getPackageInfo();
// Parse command line arguments
const program = new Command();
program
.version(pkg.version)
.description(pkg.description)
.option('-d, --debug', 'Output debug information')
.option('-r, --remote', 'Load data from remote source')
.parse(process.argv);
const options = program.opts();
// Only show welcome message in debug mode
if (options.debug) {
displayWelcome(pkg.name, pkg.version, pkg.description);
displayDebug(options);
}
// Load config
const config = await loadConfig();
// Load data (from remote or local)
let bio;
let social;
// Loading spinner for data
const dataSpinner = ora('Loading awesome developer profile...').start();
if (options.remote) {
try {
bio = await loadRemoteData(config, 'bio.json');
social = await loadRemoteData(config, 'social.json');
dataSpinner.succeed('Remote data loaded!');
}
catch (error) {
dataSpinner.fail('Failed to load remote data');
console.error('Error loading remote data:', error);
console.log('Falling back to local data...');
bio = await loadLocalData('bio.json');
social = await loadLocalData('social.json');
}
}
else {
bio = await loadLocalData('bio.json');
social = await loadLocalData('social.json');
dataSpinner.succeed('Profile data loaded!');
}
// Fetch GitHub stats
const githubSpinner = ora('Stalking my GitHub profile...').start();
let githubStats = '';
try {
githubStats = await fetchGitHubStats(config.github.username);
githubSpinner.succeed('GitHub stats acquired!');
}
catch (error) {
githubSpinner.fail('Failed to fetch GitHub stats');
console.error('Error fetching GitHub stats:', error);
}
console.clear();
// Display header with a small ASCII art
console.log(chalk.cyan(`
_____ _ ______ __ __ _
/ ___/ (_)____ ___ ___ ____ / ____/___ ____ / /____/ /_(_)____
\\__ \\ / // __ \`__ \\ / _ \\ / __ \\ / / / _ \\ / __ \\ / // __ // // __ \\
___/ // // / / / / // __// / / / / /___ / __// /_/ // // /_/ // // /_/ /
/____//_//_/ /_/ /_/ \\___//_/ /_/ \\____/ \\___/ \\____//_/ \\__,_//_// .___/
/_/
`));
// Display bio
displayBio(bio);
console.log('\n');
// Display social links with GitHub stats
displaySocialWithGitHub(social, githubStats);
console.log('\n');
// Display CTA
displayAd(config.ad.message, config.ad.color);
// Final message
console.log(chalk.green.bold('\nThanks for checking out my CLI profile! If you made it this far, we should work together. 🤝\n'));
console.log(chalk.dim('P.S. Frontend, backend, or DevOps — I deliver. Let\'s build something amazing! 🛠️\n'));
}
catch (error) {
console.error('An error occurred:', error);
}
}
// Run the main function
main();