focusflick
Version:
š Focus Flick: Plug-and-play web analytics for user focus, scroll, blur, click, and behavior tracking
79 lines (62 loc) ⢠2.59 kB
JavaScript
import fs from 'fs';
import path from 'path';
import open from 'open';
import readline from 'readline';
import chalk from 'chalk';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const FOCUSKEY_PATH = path.resolve(process.cwd(), 'focusKey.json');
const ONBOARD_URL = 'https://www.focusflick.xyz';
if (process.argv.includes('--generate')) {
console.log(chalk.cyan('\nš Launching FocusFlick registration page...'));
try {
await open(ONBOARD_URL);
console.log(`ā
If not opened, visit: ${chalk.blue(ONBOARD_URL)}\n`);
} catch {
console.error(`ā Failed to open browser. Please visit ${chalk.blue(ONBOARD_URL)}`);
}
process.exit(0);
}
if (!fs.existsSync(FOCUSKEY_PATH)) {
console.log(chalk.red('\nā ļø Missing focusKey.json in this directory.\n'));
console.log(`š Run ${chalk.yellow('npx focusflick --generate')} to get one.\n`);
process.exit(1);
}
const keyData = JSON.parse(fs.readFileSync(FOCUSKEY_PATH, 'utf-8'));
const focusKey = keyData.focusKey;
if (!focusKey || !focusKey.startsWith('ff_')) {
console.log(chalk.red('ā ļø Invalid focusKey.json format.\n'));
process.exit(1);
}
console.log(chalk.greenBright('\nā
focusKey found:'), chalk.yellow(focusKey));
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
const ask = q => new Promise(resolve => rl.question(q, resolve));
console.log('\nChoose your integration style:\n');
console.log(`1) š§āš¼ ${chalk.cyan('Simple Embed')} (HTML copy-paste)`);
console.log(`2) šØāš» ${chalk.magenta('Developer Config')} (import & customize)\n`);
const style = await ask('Select [1/2]: ');
let snippet = '';
if (style.trim() === '1') {
snippet = `<script src="https://cdn.focusflick.xyz/focusflick.min.js" data-focuskey="${focusKey}" async></script>`;
} else {
snippet = `import FocusFlick from 'focusflick';
const flick = new FocusFlick({
focusKey: '${focusKey}',
trackMouseMove: true,
trackClicks: true,
trackScrollDepth: true,
idleTimeout: 30000
});
flick.init();`;
}
console.log(chalk.greenBright('\n⨠Your FocusFlick snippet:\n'));
console.log(chalk.gray('----------------------------------------'));
console.log(snippet);
console.log(chalk.gray('----------------------------------------\n'));
const save = await ask('š¾ Save to focusflick.js? (y/n): ');
if (save.trim().toLowerCase() === 'y') {
fs.writeFileSync(path.resolve(process.cwd(), 'focusflick.js'), snippet);
console.log(chalk.green('ā
Saved as focusflick.js\n'));
}
rl.close();