#!/usr/bin/env node /** * SkipTheDrive Parser Demo * * Demonstrates the SkipTheDrive job parser functionality */ const { parseSkipTheDrive } = require("./skipthedrive"); const fs = require("fs"); const path = require("path"); const { logger } = require("../../ai-analyzer"); // Load environment variables require("dotenv").config({ path: path.join(__dirname, "..", ".env") }); async function runDemo() { logger.step("šŸš€ SkipTheDrive Parser Demo"); // Demo configuration const options = { // Search for QA automation jobs (from your example) keywords: process.env.SEARCH_KEYWORDS?.split(",").map((k) => k.trim()) || [ "automation qa", "qa engineer", "test automation", ], // Job type filters - can be: "part time", "full time", "contract" jobTypes: process.env.JOB_TYPES?.split(",").map((t) => t.trim()) || [], // Location filter (optional) locationFilter: process.env.LOCATION_FILTER || "", // Maximum pages to parse maxPages: parseInt(process.env.MAX_PAGES) || 3, // Browser headless mode headless: process.env.HEADLESS !== "false", // AI analysis enableAI: process.env.ENABLE_AI_ANALYSIS !== "false", aiContext: "remote QA and test automation job opportunities", }; logger.info("Configuration:"); logger.info(`- Keywords: ${options.keywords.join(", ")}`); logger.info( `- Job Types: ${ options.jobTypes.length > 0 ? options.jobTypes.join(", ") : "All types" }` ); logger.info(`- Location Filter: ${options.locationFilter || "None"}`); logger.info(`- Max Pages: ${options.maxPages}`); logger.info(`- Headless: ${options.headless}`); logger.info(`- AI Analysis: ${options.enableAI}`); logger.info("\nStarting parser..."); try { const startTime = Date.now(); const results = await parseSkipTheDrive(options); const duration = ((Date.now() - startTime) / 1000).toFixed(2); // Save results const timestamp = new Date() .toISOString() .replace(/[:.]/g, "-") .slice(0, -5); const resultsDir = path.join(__dirname, "..", "results"); if (!fs.existsSync(resultsDir)) { fs.mkdirSync(resultsDir, { recursive: true }); } const resultsFile = path.join( resultsDir, `skipthedrive-results-${timestamp}.json` ); fs.writeFileSync(resultsFile, JSON.stringify(results, null, 2)); // Display summary logger.step("\nšŸ“Š Parsing Summary:"); logger.info(`- Duration: ${duration} seconds`); logger.info(`- Jobs Found: ${results.results.length}`); logger.info(`- Jobs Rejected: ${results.rejectedResults.length}`); logger.file(`- Results saved to: ${resultsFile}`); // Show sample results if (results.results.length > 0) { logger.info("\nšŸ” Sample Jobs Found:"); results.results.slice(0, 5).forEach((job, index) => { logger.info(`\n${index + 1}. ${job.title}`); logger.info(` Company: ${job.company}`); logger.info(` Posted: ${job.daysAgo}`); logger.info(` Featured: ${job.isFeatured ? "Yes" : "No"}`); logger.info(` URL: ${job.jobUrl}`); if (job.aiAnalysis) { logger.ai( ` AI Relevant: ${job.aiAnalysis.isRelevant ? "Yes" : "No"} (${( job.aiAnalysis.confidence * 100 ).toFixed(0)}% confidence)` ); } }); } // Show rejection reasons if (results.rejectedResults.length > 0) { const rejectionReasons = {}; results.rejectedResults.forEach((job) => { rejectionReasons[job.reason] = (rejectionReasons[job.reason] || 0) + 1; }); logger.info("\nāŒ Rejection Reasons:"); Object.entries(rejectionReasons).forEach(([reason, count]) => { logger.info(` ${reason}: ${count}`); }); } } catch (error) { logger.error("\nāŒ Demo failed:", error.message); process.exit(1); } } // Run the demo runDemo().catch((err) => { logger.error("Fatal error:", err); process.exit(1); });