Nicholai 0da3c3c22b Add notepad utility and update blog notes
- Add `notepad` script to package.json for timestamped note handling
- Create `src/utils/notepad.js` to append notes, commit, push, and deploy
- Update `nicholais-notepad.mdx` description and remove placeholder entries
2025-12-18 14:30:12 -07:00

210 lines
5.4 KiB
JavaScript

#!/usr/bin/env node
/**
* Notepad Script
*
* Appends timestamped notes to the notepad MDX file, commits, and deploys.
*
* Usage:
* pnpm notepad "Your note content here"
*/
import { execSync } from 'child_process';
import { readFileSync, writeFileSync } from 'fs';
import { join, dirname } from 'path';
import { fileURLToPath } from 'url';
// Get current directory for ES modules
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
// Configuration
const NOTEPAD_FILE = join(__dirname, '..', 'content', 'blog', 'nicholais-notepad.mdx');
const MAX_COMMIT_MSG_LENGTH = 50;
// Color codes for terminal output
const colors = {
reset: '\x1b[0m',
bright: '\x1b[1m',
dim: '\x1b[2m',
red: '\x1b[31m',
green: '\x1b[32m',
yellow: '\x1b[33m',
blue: '\x1b[34m',
cyan: '\x1b[36m',
};
/**
* Execute a command and return the output
*/
function exec(command, options = {}) {
try {
return execSync(command, {
encoding: 'utf-8',
stdio: options.silent ? 'pipe' : 'inherit',
...options
});
} catch (error) {
console.error(`${colors.red}❌ Command failed: ${command}${colors.reset}`);
console.error(error.message);
throw error;
}
}
/**
* Format current timestamp
*/
function getTimestamp() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
/**
* Append note to notepad file
*/
function appendNote(content) {
console.log(`${colors.cyan}📝 Adding note to notepad...${colors.reset}`);
const timestamp = getTimestamp();
const noteEntry = `\n**[${timestamp}]** ${content}\n`;
try {
// Read current content
const currentContent = readFileSync(NOTEPAD_FILE, 'utf-8');
// Append new note
const updatedContent = currentContent + noteEntry;
// Write back to file
writeFileSync(NOTEPAD_FILE, updatedContent, 'utf-8');
console.log(`${colors.green}✅ Note added successfully${colors.reset}`);
return timestamp;
} catch (error) {
console.error(`${colors.red}❌ Failed to write note${colors.reset}`);
console.error(error.message);
throw error;
}
}
/**
* Commit and push changes
*/
function commitAndPush(content) {
console.log(`${colors.cyan}📦 Committing changes...${colors.reset}`);
try {
// Stage the notepad file
exec(`git add "${NOTEPAD_FILE}"`);
// Create commit message (truncate if too long)
const commitMsg = content.length > MAX_COMMIT_MSG_LENGTH
? content.substring(0, MAX_COMMIT_MSG_LENGTH)
: content;
// Commit
exec(`git commit -m "notepad: ${commitMsg}"`, { silent: true });
console.log(`${colors.green}✅ Commit created${colors.reset}`);
// Push to remote
console.log(`${colors.cyan}🚀 Pushing to remote...${colors.reset}`);
exec('git push');
console.log(`${colors.green}✅ Pushed successfully${colors.reset}`);
} catch (error) {
console.error(`${colors.red}❌ Git operation failed${colors.reset}`);
throw error;
}
}
/**
* Deploy the site
*/
function deploy() {
console.log(`${colors.cyan}🚢 Deploying site...${colors.reset}`);
try {
exec('pnpm run deploy');
console.log(`${colors.green}✅ Deployment complete${colors.reset}`);
} catch (error) {
console.error(`${colors.red}❌ Deployment failed${colors.reset}`);
throw error;
}
}
/**
* Show help message
*/
function showHelp() {
console.log(`
${colors.bright}Notepad Script${colors.reset}
${colors.dim}Append timestamped notes to your notepad${colors.reset}
${colors.bright}Usage:${colors.reset}
${colors.cyan}pnpm notepad "Your note content here"${colors.reset}
${colors.bright}Example:${colors.reset}
${colors.cyan}pnpm notepad "Implemented new feature for user authentication"${colors.reset}
${colors.bright}What it does:${colors.reset}
1. Appends a timestamped note to ${colors.dim}src/content/blog/nicholais-notepad.mdx${colors.reset}
2. Commits the change with message: ${colors.dim}notepad: [your note]${colors.reset}
3. Pushes to remote repository
4. Deploys the site
${colors.bright}Options:${colors.reset}
--help, -h Show this help message
`);
}
/**
* Main function
*/
function main() {
const args = process.argv.slice(2);
// Check for help flag
if (args.includes('--help') || args.includes('-h')) {
showHelp();
process.exit(0);
}
// Get note content
const content = args.join(' ').trim();
if (!content) {
console.error(`${colors.red}❌ No note content provided${colors.reset}`);
console.log(`\n${colors.yellow}💡 Usage:${colors.reset}`);
console.log(` ${colors.dim}pnpm notepad "Your note content here"${colors.reset}\n`);
process.exit(1);
}
console.log(`${colors.bright}${colors.blue}📓 Notepad Script${colors.reset}\n`);
try {
// Append note to file
appendNote(content);
// Commit and push
commitAndPush(content);
// Deploy site
deploy();
console.log(`\n${colors.green}✨ Done!${colors.reset}\n`);
} catch (error) {
console.error(`\n${colors.red}❌ Operation failed${colors.reset}`);
process.exit(1);
}
}
// Run the script
main();