{"record":{"id":"f891454059257458","repo":"santifer/career-ops","slug":"beesite-cannot-resolve-search-host-for-entry-na","errorCode":null,"errorMessage":"beesite: cannot resolve search host for ${entry.name}","messagePattern":"beesite: cannot resolve search host for (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"providers/beesite.mjs","lineNumber":146,"sourceCode":"function resolveMaxPages(entry) {\n  const v = entry?.max_pages;\n  if (Number.isInteger(v) && v > 0) return Math.min(v, MAX_PAGES);\n  return MAX_PAGES;\n}\n\n/** @type {Provider} */\nexport default {\n  id: 'beesite',\n\n  detect(entry) {\n    const url = entry.api || entry.careers_url || '';\n    if (typeof url !== 'string') return null;\n    return resolveConfig({ api: url }) ? { url } : null;\n  },\n\n  async fetch(entry, ctx) {\n    const cfg = resolveConfig(entry);\n    if (!cfg) throw new Error(`beesite: cannot resolve search host for ${entry.name}`);\n\n    const wait = (ms) => (ctx.sleep ? ctx.sleep(ms) : new Promise((r) => setTimeout(r, ms)));\n    const maxPages = resolveMaxPages(entry);\n    const jobs = [];\n    const seen = new Set();\n    let total = null;\n\n    for (let page = 0; page < maxPages; page++) {\n      if (page > 0) await wait(PAGE_DELAY_MS);\n      const json = await ctx.fetchJson(buildSearchUrl(cfg, page * PAGE_SIZE + 1), {\n        redirect: 'error',\n        headers: { accept: 'application/json' },\n      });\n      const { total: pageTotal, rows } = parseSearchResult(json);\n      if (total === null) total = pageTotal;\n      if (rows.length === 0) break; // past the last page\n\n      let fresh = 0;","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/santifer/career-ops/blob/9b17a8ac97b398a496b38e423ae24e433b43254f/providers/beesite.mjs#L128-L164","documentation":"beesite's `resolveConfig` returns null when the entry provides no usable search host (no valid `api:`/`careers_url` that resolves to a beesite endpoint). `fetch` throws naming the entry rather than making a request to nowhere.","triggerScenarios":"`resolveConfig(entry)` returns null in `fetch`. `detect()` shows `resolveConfig({api: url})` is used to test validity — so a non-string, empty, or non-beesite URL yields null. Thrown before any network call.","commonSituations":"An entry marked `provider: beesite` has no `api:`/`careers_url`, points at a non-beesite host, or carries a relative/malformed URL that fails beesite's internal host check.","solutions":["Provide a valid `api:` or `careers_url:` for the beesite search endpoint.","Confirm the URL passes `resolveConfig` — use `detect()` to validate before calling `fetch`.","If the company isn't on beesite, switch the entry's `provider:`."],"exampleFix":"# before\n- name: Acme\n  provider: beesite\n\n# after\n- name: Acme\n  provider: beesite\n  api: https://acme.jobs.beesite.de/api/search","handlingStrategy":"type-guard","validationCode":"// Use detect() to confirm the entry resolves before fetching\nconst detected = provider.detect(entry);\nif (!detected) {\n  console.warn(`beesite: skipping ${entry.name} — no search host resolvable (add api/careers_url)`);\n  continue;\n}","typeGuard":"/** @param {any} e */\nfunction hasBeesiteConfig(e) {\n  const u = e?.api || e?.careers_url;\n  if (typeof u !== 'string' || !u) return false;\n  // Mirror detect()'s test: resolveConfig must accept it\n  try { return !!resolveConfig({ api: u }); } catch { return false; }\n}","tryCatchPattern":"try {\n  const cfg = resolveConfig(entry);\n  if (!cfg) throw new Error(`beesite: cannot resolve search host for ${entry.name}`);\n  // ...fetch\n} catch (err) {\n  if (/cannot resolve search host/.test(err.message)) { console.warn(err.message); return []; }\n  throw err;\n}","preventionTips":["Gate fetch with detect() so unresolvable entries are skipped.","Provide an explicit `api:` for beesite entries rather than relying on derivation.","Lint config to flag beesite entries with no resolvable host."],"tags":["beesite","config","missing-field","host-derivation"],"backgroundTag":null,"analyzedSha":"9b17a8ac97b398a496b38e423ae24e433b43254f","analyzedAt":"2026-08-13T00:48:39.135Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}