#!/usr/bin/env bun import { searches, KEYWORDS } from "../config.ts"; import { fetchJobs, isEnglishContent } from "../fetch.ts"; import type { SearchConfig } from "../config.ts"; const CSV = "./jobs.csv"; // Load existing links for deduplication const existingLinks = new Set(); try { const text = await Bun.file(CSV).text(); for (const line of text.split("\n").slice(1)) { const url = line.match(/"(https?:\/\/[^"]+)"/)?.[1]; if (url) existingLinks.add(url); } } catch {} const remoteSearches: SearchConfig[] = [ { label: "Basel (remote)", keywords: KEYWORDS, geoId: "103383283", location: "Basel", workType: ["remote"], timePosted: "month", }, { label: "Basel Metropolitan Area (remote)", keywords: KEYWORDS, geoId: "90009885", location: "Basel Metropolitan Area", workType: ["remote"], timePosted: "month", }, { label: "Switzerland (remote)", keywords: KEYWORDS, location: "Switzerland", workType: ["remote"], timePosted: "month", }, ]; type Job = { id: string; title: string; company: string; link: string; postedAt: string }; const newJobs: Array = []; const seenIds = new Set(); for (const config of [...searches, ...remoteSearches]) { console.log(`\n[${config.label}]`); const jobs = await fetchJobs(config); if (jobs.length === 0) { console.log(" No jobs found."); continue; } let added = 0; for (const job of jobs) { if (existingLinks.has(job.link) || seenIds.has(job.id)) continue; seenIds.add(job.id); process.stdout.write(` checking: ${job.title} @ ${job.company} … `); const english = await isEnglishContent(job.id); if (!english) { console.log("dropped (non-English)"); continue; } console.log("ok"); newJobs.push({ ...job, search: config.label }); added++; } console.log(` ${jobs.length} found, ${added} new`); } console.log(`\n=== ${newJobs.length} new jobs total ===\n`); for (const j of newJobs) { console.log(`${j.title} | ${j.company} | ${j.search} | ${j.link}`); }