#!/usr/bin/env bun import { KEYWORDS } from "../config.ts"; import { fetchJobs, isEnglishContent } from "../fetch.ts"; import type { SearchConfig } from "../config.ts"; const CSV = "./jobs.csv"; 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 searches: SearchConfig[] = [ { label: "Basel city (onsite+hybrid)", keywords: KEYWORDS, geoId: "103383283", location: "Basel", workType: ["onsite", "hybrid"], timePosted: "month" }, { label: "Basel Metropolitan (onsite+hybrid)", keywords: KEYWORDS, geoId: "90009885", location: "Basel Metropolitan Area", workType: ["onsite", "hybrid"], timePosted: "month" }, { label: "Basel-Country (onsite+hybrid)", keywords: KEYWORDS, geoId: "107117530", location: "Basel-Country", workType: ["onsite", "hybrid"], timePosted: "month" }, { label: "Basel city (remote)", keywords: KEYWORDS, geoId: "103383283", location: "Basel", workType: ["remote"], timePosted: "month" }, { label: "Basel Metropolitan (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; search: string }; const results: Job[] = []; const seen = new Set(); for (const config of searches) { 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 (seen.has(job.id) || existingLinks.has(job.link)) continue; seen.add(job.id); process.stdout.write(` ${job.title} @ ${job.company} … `); const english = await isEnglishContent(job.id); if (!english) { console.log("dropped"); continue; } console.log("ok"); results.push({ ...job, search: config.label }); added++; } console.log(` => ${added} new`); } console.log(`\n=== TOTAL: ${results.length} jobs ===\n`); for (const j of results) { console.log(`[${j.search}] ${j.title} | ${j.company} | ${j.id} | ${j.link}`); }