/** * Bookmarklet Generator * * Converts a regular JavaScript file into a bookmarklet format. * - Removes all comments (single-line and multi-line) * - Wraps code in IIFE for bookmarklet format * - Minifies to a single line * - Copies to clipboard * * Usage: * node code/utils/bookmarkletMaker.js * npm run bookmarklet -- * * Example: * npm run bookmarklet -- code/bookmarklets/example-bookmarklet.js */ import fs from 'fs'; import path from 'path'; import clipboardy from 'clipboardy'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); /** * Remove all comments from JavaScript code * @param {string} code - The JavaScript code * @returns {string} Code without comments */ function removeComments(code) { // Remove multi-line comments /* ... */ code = code.replace(/\/\*[\s\S]*?\*\//g, ''); // Remove single-line comments // code = code.replace(/\/\/.*$/gm, ''); return code; } /** * Minify code to a single line * @param {string} code - The JavaScript code * @returns {string} Minified code */ function minify(code) { return code .split('\n') .map(line => line.trim()) .filter(line => line.length > 0) .join(' ') .replace(/\s+/g, ' ') .replace(/\s*([{}();,])\s*/g, '$1'); } /** * Generate bookmarklet from JavaScript file * @param {string} filePath - Path to the JavaScript file * @returns {string} The bookmarklet code */ function generateBookmarklet(filePath) { // Validate file exists if (!fs.existsSync(filePath)) { throw new Error(`File not found: ${filePath}`); } // Read the JavaScript file const jsCode = fs.readFileSync(filePath, 'utf8'); // Clean and minify let cleanedCode = removeComments(jsCode); cleanedCode = minify(cleanedCode); // Wrap in IIFE and add javascript: protocol const bookmarklet = `javascript:(function(){${cleanedCode}})();`; return bookmarklet; } // Main execution try { const filePath = process.argv[2]; if (!filePath) { console.error('āŒ Error: Please provide a file path'); console.log('\nUsage:'); console.log(' npm run bookmarklet -- '); console.log('\nExample:'); console.log(' npm run bookmarklet -- code/bookmarklets/my-bookmarklet.js'); process.exit(1); } const bookmarklet = generateBookmarklet(filePath); const fileName = path.basename(filePath); // Copy to clipboard clipboardy.writeSync(bookmarklet); console.log('āœ… Bookmarklet generated successfully!'); console.log(`šŸ“ Source: ${fileName}`); console.log(`šŸ“‹ Copied to clipboard (${bookmarklet.length} characters)`); console.log('\nšŸ“ Next steps:'); console.log(' 1. Create a new bookmark in your browser'); console.log(' 2. Paste the clipboard content as the URL'); console.log(' 3. Give it a name and save'); } catch (error) { console.error('āŒ Error:', error.message); process.exit(1); }