webpeel 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +140 -500
  2. package/dist/cli-auth.d.ts +2 -0
  3. package/dist/cli-auth.d.ts.map +1 -1
  4. package/dist/cli-auth.js +16 -3
  5. package/dist/cli-auth.js.map +1 -1
  6. package/dist/cli.js +475 -77
  7. package/dist/cli.js.map +1 -1
  8. package/dist/core/actions.d.ts +19 -10
  9. package/dist/core/actions.d.ts.map +1 -1
  10. package/dist/core/actions.js +214 -43
  11. package/dist/core/actions.js.map +1 -1
  12. package/dist/core/agent.d.ts +60 -3
  13. package/dist/core/agent.d.ts.map +1 -1
  14. package/dist/core/agent.js +375 -86
  15. package/dist/core/agent.js.map +1 -1
  16. package/dist/core/answer.d.ts +43 -0
  17. package/dist/core/answer.d.ts.map +1 -0
  18. package/dist/core/answer.js +378 -0
  19. package/dist/core/answer.js.map +1 -0
  20. package/dist/core/cache.d.ts +14 -0
  21. package/dist/core/cache.d.ts.map +1 -0
  22. package/dist/core/cache.js +122 -0
  23. package/dist/core/cache.js.map +1 -0
  24. package/dist/core/dns-cache.d.ts +21 -0
  25. package/dist/core/dns-cache.d.ts.map +1 -0
  26. package/dist/core/dns-cache.js +184 -0
  27. package/dist/core/dns-cache.js.map +1 -0
  28. package/dist/core/documents.d.ts +24 -0
  29. package/dist/core/documents.d.ts.map +1 -0
  30. package/dist/core/documents.js +124 -0
  31. package/dist/core/documents.js.map +1 -0
  32. package/dist/core/extract-inline.d.ts +39 -0
  33. package/dist/core/extract-inline.d.ts.map +1 -0
  34. package/dist/core/extract-inline.js +214 -0
  35. package/dist/core/extract-inline.js.map +1 -0
  36. package/dist/core/fetcher.d.ts +33 -7
  37. package/dist/core/fetcher.d.ts.map +1 -1
  38. package/dist/core/fetcher.js +608 -41
  39. package/dist/core/fetcher.js.map +1 -1
  40. package/dist/core/jobs.d.ts +66 -0
  41. package/dist/core/jobs.d.ts.map +1 -0
  42. package/dist/core/jobs.js +513 -0
  43. package/dist/core/jobs.js.map +1 -0
  44. package/dist/core/markdown.d.ts.map +1 -1
  45. package/dist/core/markdown.js +141 -31
  46. package/dist/core/markdown.js.map +1 -1
  47. package/dist/core/pdf.d.ts.map +1 -1
  48. package/dist/core/pdf.js +3 -1
  49. package/dist/core/pdf.js.map +1 -1
  50. package/dist/core/screenshot.d.ts +33 -0
  51. package/dist/core/screenshot.d.ts.map +1 -0
  52. package/dist/core/screenshot.js +30 -0
  53. package/dist/core/screenshot.js.map +1 -0
  54. package/dist/core/search-provider.d.ts +46 -0
  55. package/dist/core/search-provider.d.ts.map +1 -0
  56. package/dist/core/search-provider.js +281 -0
  57. package/dist/core/search-provider.js.map +1 -0
  58. package/dist/core/strategies.d.ts +7 -10
  59. package/dist/core/strategies.d.ts.map +1 -1
  60. package/dist/core/strategies.js +370 -63
  61. package/dist/core/strategies.js.map +1 -1
  62. package/dist/index.d.ts +9 -3
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +61 -32
  65. package/dist/index.js.map +1 -1
  66. package/dist/mcp/server.js +335 -70
  67. package/dist/mcp/server.js.map +1 -1
  68. package/dist/types.d.ts +43 -1
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/types.js.map +1 -1
  71. package/llms.txt +85 -47
  72. package/package.json +11 -5
@@ -0,0 +1,513 @@
1
+ /**
2
+ * Jobs extraction module — turns job board pages into structured JSON
3
+ *
4
+ * Two-phase pipeline:
5
+ * Phase A (Search): Fetch a job search URL → parse markdown → extract job cards
6
+ * Phase B (Details): For top N results, fetch each detail URL → extract full description
7
+ *
8
+ * Supports LinkedIn, Glassdoor, and Indeed out of the box.
9
+ * Call `cleanup()` from the main webpeel export when you are done fetching.
10
+ */
11
+ import { peel } from '../index.js';
12
+ function detectSource(url) {
13
+ const h = url.toLowerCase();
14
+ if (h.includes('linkedin.com'))
15
+ return 'linkedin';
16
+ if (h.includes('glassdoor.com'))
17
+ return 'glassdoor';
18
+ if (h.includes('indeed.com'))
19
+ return 'indeed';
20
+ return 'generic';
21
+ }
22
+ function stealthNeeded(src) {
23
+ return src === 'indeed' || src === 'glassdoor';
24
+ }
25
+ function buildSearchUrl(src, kw, loc) {
26
+ switch (src) {
27
+ case 'linkedin':
28
+ return `https://www.linkedin.com/jobs/search/?keywords=${enc(kw)}&location=${enc(loc)}`;
29
+ case 'glassdoor':
30
+ return `https://www.glassdoor.com/Job/jobs.htm?sc.keyword=${enc(kw)}&locT=C&locId=1132348&sc.location=${enc(loc)}`;
31
+ case 'indeed':
32
+ return `https://www.indeed.com/jobs?q=${enc(kw)}&l=${enc(loc)}`;
33
+ default:
34
+ throw new Error('Cannot build URL for generic source — provide a url');
35
+ }
36
+ }
37
+ const enc = encodeURIComponent;
38
+ function clean(s) {
39
+ return s
40
+ .replace(/&/g, '&')
41
+ .replace(/…/g, '…')
42
+ .replace(/ /g, ' ')
43
+ .replace(/'/g, "'")
44
+ .replace(/"/g, '"')
45
+ .replace(/\s+/g, ' ')
46
+ .trim();
47
+ }
48
+ function absUrl(href, base) {
49
+ try {
50
+ return new URL(href, base).href;
51
+ }
52
+ catch {
53
+ return href;
54
+ }
55
+ }
56
+ function findSalary(text) {
57
+ const m = text.match(/\$[\d,]+(?:\.\d+)?(?:\s*[-–]\s*\$[\d,]+(?:\.\d+)?)?(?:\s*(?:a\s+year|per\s+hour|an\s+hour|\/hr|\/yr|K(?:\s|$)))?/i);
58
+ return m ? m[0].trim() : undefined;
59
+ }
60
+ function findDate(text) {
61
+ const m = text.match(/(\d+[dhm])\b/) || text.match(/(\d+\s+(?:day|week|month|hour|minute)s?\s+ago)/i);
62
+ return m ? m[1].trim() : undefined;
63
+ }
64
+ function hasRemote(text) {
65
+ return /\bremote\b/i.test(text);
66
+ }
67
+ /** Simple concurrency limiter — runs at most `n` tasks in parallel. */
68
+ async function pLimited(tasks, n) {
69
+ const results = new Array(tasks.length);
70
+ let cursor = 0;
71
+ async function worker() {
72
+ while (cursor < tasks.length) {
73
+ const idx = cursor++;
74
+ results[idx] = await tasks[idx]();
75
+ }
76
+ }
77
+ await Promise.all(Array.from({ length: Math.min(n, tasks.length) }, () => worker()));
78
+ return results;
79
+ }
80
+ function parseTotalFromHeading(content) {
81
+ const m = content.match(/^#\s+([\d,]+)\+?\s+/m);
82
+ return m ? parseInt(m[1].replace(/,/g, ''), 10) : 0;
83
+ }
84
+ // ── LinkedIn Parser ────────────────────────────────────────────────────
85
+ function parseLinkedIn(content, searchUrl, limit) {
86
+ const jobs = [];
87
+ const totalFound = parseTotalFromHeading(content);
88
+ // Each card starts with "- [Title](url)" in the markdown list
89
+ const blocks = content.split(/\n-\s+\[/).slice(1);
90
+ for (const block of blocks) {
91
+ if (jobs.length >= limit)
92
+ break;
93
+ // Link: we stripped the leading "- [", so block starts with "Title](url)…"
94
+ const lm = block.match(/^([^\]]+)\]\(([^)]+)\)/);
95
+ if (!lm)
96
+ continue;
97
+ const detailUrl = lm[2];
98
+ if (!detailUrl.includes('linkedin.com/jobs/view/'))
99
+ continue;
100
+ // Title from ### heading (preferred) or link text
101
+ const hm = block.match(/###\s+(.+)/);
102
+ const title = clean(hm ? hm[1] : lm[1]);
103
+ if (!title)
104
+ continue;
105
+ // Company from #### [Company](url) or #### Company
106
+ const cm = block.match(/####\s+\[([^\]]+)\]/) || block.match(/####\s+(.+)/);
107
+ const company = cm ? clean(cm[1]) : '';
108
+ // Scan remaining lines for location + date
109
+ // Only look at lines AFTER the #### company heading
110
+ let location = '';
111
+ let postedAt;
112
+ let pastCompany = false;
113
+ for (const raw of block.split('\n')) {
114
+ const l = raw.trim();
115
+ if (!l)
116
+ continue;
117
+ // Skip everything until we're past the company heading
118
+ if (l.startsWith('####')) {
119
+ pastCompany = true;
120
+ continue;
121
+ }
122
+ if (!pastCompany)
123
+ continue;
124
+ if (l.startsWith('#') || l.startsWith('[') || l.startsWith('-') || l === 'Actively Hiring' || l === 'Promoted')
125
+ continue;
126
+ // Skip lines that contain URLs
127
+ if (l.includes('http://') || l.includes('https://'))
128
+ continue;
129
+ // Date-only line
130
+ const dateCandidate = findDate(l);
131
+ // Location line that may have date appended: "New York, NY 2 weeks ago"
132
+ if (!location && /^[A-Z][a-z]+.*,\s*[A-Z]/.test(l)) {
133
+ // Split off trailing date if present
134
+ const dateInLine = findDate(l);
135
+ if (dateInLine) {
136
+ postedAt = dateInLine;
137
+ location = clean(l.replace(/\d+\s+(?:week|day|month|hour|minute)s?\s+ago/i, '').replace(/\d+[dhm]\s*$/i, ''));
138
+ }
139
+ else {
140
+ location = clean(l);
141
+ }
142
+ continue;
143
+ }
144
+ if (dateCandidate && l.length < 30) {
145
+ postedAt = dateCandidate;
146
+ }
147
+ }
148
+ jobs.push({
149
+ title, company, location,
150
+ salary: findSalary(block),
151
+ remote: hasRemote(block),
152
+ postedAt,
153
+ detailUrl: absUrl(detailUrl, searchUrl),
154
+ source: 'linkedin',
155
+ });
156
+ }
157
+ return { jobs, totalFound: totalFound || jobs.length };
158
+ }
159
+ // ── Glassdoor Parser ───────────────────────────────────────────────────
160
+ function parseGlassdoor(content, searchUrl, limit) {
161
+ const jobs = [];
162
+ const totalFound = parseTotalFromHeading(content);
163
+ // Each card is a top-level list item: company, rating, [Title](url), location, salary, snippet, skills, date
164
+ const blocks = content.split(/\n-\s+/).slice(1);
165
+ for (const block of blocks) {
166
+ if (jobs.length >= limit)
167
+ break;
168
+ const lines = block.split('\n').map(l => l.trim()).filter(Boolean);
169
+ if (lines.length < 2)
170
+ continue;
171
+ // Job title link
172
+ const lm = block.match(/\[([^\]]+)\]\((https?:\/\/[^\s)]*glassdoor\.com\/job-listing\/[^)]+)\)/);
173
+ if (!lm)
174
+ continue;
175
+ const title = clean(lm[1]);
176
+ const detailUrl = lm[2];
177
+ // Company + rating come before the link
178
+ let company = '';
179
+ let rating;
180
+ for (const l of lines) {
181
+ if (l.includes('[') && l.includes('glassdoor.com'))
182
+ break;
183
+ const rm = l.match(/^(\d\.\d)$/);
184
+ if (rm) {
185
+ rating = parseFloat(rm[1]);
186
+ continue;
187
+ }
188
+ if (!company && l.length > 1 && !/^\d/.test(l))
189
+ company = clean(l);
190
+ }
191
+ // Fields after the title link
192
+ let location = '';
193
+ let salary;
194
+ let snippet;
195
+ let skills;
196
+ let postedAt;
197
+ let pastLink = false;
198
+ for (const l of lines) {
199
+ if (l.includes(title) || l.includes('glassdoor.com/job-listing/')) {
200
+ pastLink = true;
201
+ continue;
202
+ }
203
+ if (!pastLink)
204
+ continue;
205
+ const sm = l.match(/\*\*Skills?:\*\*\s*(.+)/i);
206
+ if (sm) {
207
+ skills = sm[1].split(',').map(s => s.trim()).filter(Boolean);
208
+ continue;
209
+ }
210
+ if (/^\d+[dwm]$/.test(l)) {
211
+ postedAt = l;
212
+ continue;
213
+ }
214
+ if (!salary && /\$/.test(l)) {
215
+ salary = findSalary(l) || clean(l);
216
+ continue;
217
+ }
218
+ if (!location && /^[A-Z][a-z]+.*,\s*[A-Z]{2}/.test(l)) {
219
+ location = clean(l);
220
+ continue;
221
+ }
222
+ if (!snippet && l.length > 40 && !l.startsWith('**'))
223
+ snippet = clean(l);
224
+ }
225
+ jobs.push({
226
+ title, company, location, salary,
227
+ remote: hasRemote(block), postedAt,
228
+ detailUrl: absUrl(detailUrl, searchUrl),
229
+ snippet, skills, rating,
230
+ source: 'glassdoor',
231
+ });
232
+ }
233
+ return { jobs, totalFound: totalFound || jobs.length };
234
+ }
235
+ // ── Indeed Parser ──────────────────────────────────────────────────────
236
+ function parseIndeed(content, _searchUrl, limit) {
237
+ const jobs = [];
238
+ // Indeed markdown: job listings as list items with [Title](url), company, location, salary
239
+ // Also try HTML attribute patterns in case raw HTML leaks through
240
+ const htmlJobRe = /id="job_([a-f0-9]+)"[^>]*>.*?<span\s+title="([^"]+)"[^>]*>[^<]*<\/span>/gs;
241
+ const htmlJobs = [...content.matchAll(htmlJobRe)];
242
+ if (htmlJobs.length > 0) {
243
+ // HTML mode — parse HTML attributes directly
244
+ const companyRe = /data-testid="company-name"[^>]*>([^<]+)<\/span>/g;
245
+ const locRe = /data-testid="text-location"[^>]*>([^<]+)<\/div>/g;
246
+ const cm = [...content.matchAll(companyRe)];
247
+ const lm = [...content.matchAll(locRe)];
248
+ for (let i = 0; i < htmlJobs.length && jobs.length < limit; i++) {
249
+ const jk = htmlJobs[i][1];
250
+ const title = clean(htmlJobs[i][2]);
251
+ jobs.push({
252
+ title,
253
+ company: cm[i] ? clean(cm[i][1]) : '',
254
+ location: lm[i] ? clean(lm[i][1]) : '',
255
+ salary: findSalary(content.slice(htmlJobs[i].index || 0, (htmlJobs[i + 1]?.index) || content.length)),
256
+ remote: false,
257
+ detailUrl: `https://www.indeed.com/viewjob?jk=${jk}`,
258
+ source: 'indeed',
259
+ });
260
+ }
261
+ }
262
+ else {
263
+ // Markdown mode — parse the converted markdown output
264
+ // Indeed search results have title links followed by company, location, salary lines
265
+ const blocks = content.split(/\n-\s+/).slice(1);
266
+ for (const block of blocks) {
267
+ if (jobs.length >= limit)
268
+ break;
269
+ // Title link: [Job Title](url)
270
+ const lm = block.match(/\[([^\]]+)\]\((https?:\/\/[^\s)]*indeed\.com\/[^)]*(?:viewjob|rc\/clk)[^)]*)\)/);
271
+ if (!lm)
272
+ continue;
273
+ const title = clean(lm[1]);
274
+ let detailUrl = lm[2];
275
+ // Extract jk parameter from URL for clean detail URL
276
+ const jkMatch = detailUrl.match(/[?&]jk=([a-f0-9]+)/);
277
+ if (jkMatch)
278
+ detailUrl = `https://www.indeed.com/viewjob?jk=${jkMatch[1]}`;
279
+ // Parse remaining lines for company, location, salary
280
+ const lines = block.split('\n').map(l => l.trim()).filter(Boolean);
281
+ let company = '';
282
+ let location = '';
283
+ let salary;
284
+ for (const l of lines) {
285
+ if (l.includes(title) || l.includes('indeed.com'))
286
+ continue;
287
+ if (!salary) {
288
+ const s = findSalary(l);
289
+ if (s) {
290
+ salary = s;
291
+ continue;
292
+ }
293
+ }
294
+ // Company is usually the first non-title, non-link, non-salary text
295
+ if (!company && l.length > 2 && !l.startsWith('[') && !l.startsWith('#') && !/^\d/.test(l)) {
296
+ company = clean(l);
297
+ continue;
298
+ }
299
+ // Location matches City, ST pattern
300
+ if (!location && /^[A-Z][a-z]+.*,\s*[A-Z]{2}/.test(l)) {
301
+ location = clean(l);
302
+ }
303
+ }
304
+ if (title) {
305
+ jobs.push({
306
+ title, company, location, salary,
307
+ remote: hasRemote(block),
308
+ detailUrl,
309
+ source: 'indeed',
310
+ });
311
+ }
312
+ }
313
+ }
314
+ const totalRe = content.match(/(?:of|about)\s+([\d,]+)\s+jobs/i) || content.match(/([\d,]+)\s+jobs/i);
315
+ const totalFound = totalRe ? parseInt(totalRe[1].replace(/,/g, ''), 10) : jobs.length;
316
+ return { jobs, totalFound };
317
+ }
318
+ // Match both heading markers (## Section) and bold markers (**Section:**)
319
+ const SEC_DESC = /(?:#{1,4}\s*|^\*\*)(?:(?:full\s+)?job\s+description|about\s+(?:the\s+)?(?:role|position|job|opportunity)|overview|summary)\*?\*?:?\s*$/im;
320
+ const SEC_REQ = /(?:#{1,4}\s*|^\*\*)(?:requirements?|qualifications?|what\s+(?:you(?:'ll)?\s+)?(?:need|bring)|minimum\s+qualifications?|must\s+have|what\s+we(?:'re)?\s+look(?:ing)?\s+for|nice\s+to\s+have)\*?\*?:?\s*$/im;
321
+ const SEC_RESP = /(?:#{1,4}\s*|^\*\*)(?:responsibilities|what\s+you(?:'ll)?\s+do|duties|key\s+responsibilities|your\s+role|in\s+this\s+role)\*?\*?:?\s*$/im;
322
+ const SEC_BEN = /(?:#{1,4}\s*|^\*\*)(?:benefits?|perks?|what\s+we\s+offer|compensation(?:\s+and\s+benefits)?|why\s+(?:join|work)|our\s+offer)\*?\*?:?\s*$/im;
323
+ function extractBullets(text) {
324
+ const out = [];
325
+ for (const line of text.split('\n')) {
326
+ const t = line.replace(/^[-*•]\s+/, '').trim();
327
+ if (t.length > 5)
328
+ out.push(t);
329
+ }
330
+ return out.length > 0 ? out : undefined;
331
+ }
332
+ function splitSections(content) {
333
+ const res = {};
334
+ let cur = null;
335
+ let buf = [];
336
+ function flush() {
337
+ const txt = buf.join('\n').trim();
338
+ buf = [];
339
+ if (!txt || !cur)
340
+ return;
341
+ if (cur === 'desc')
342
+ res.description = txt;
343
+ else if (cur === 'req')
344
+ res.requirements = extractBullets(txt);
345
+ else if (cur === 'resp')
346
+ res.responsibilities = extractBullets(txt);
347
+ else if (cur === 'ben')
348
+ res.benefits = extractBullets(txt);
349
+ }
350
+ for (const line of content.split('\n')) {
351
+ if (SEC_DESC.test(line)) {
352
+ flush();
353
+ cur = 'desc';
354
+ continue;
355
+ }
356
+ if (SEC_REQ.test(line)) {
357
+ flush();
358
+ cur = 'req';
359
+ continue;
360
+ }
361
+ if (SEC_RESP.test(line)) {
362
+ flush();
363
+ cur = 'resp';
364
+ continue;
365
+ }
366
+ if (SEC_BEN.test(line)) {
367
+ flush();
368
+ cur = 'ben';
369
+ continue;
370
+ }
371
+ if (cur && /^#{1,4}\s+/.test(line)) {
372
+ flush();
373
+ cur = null;
374
+ continue;
375
+ }
376
+ if (cur)
377
+ buf.push(line);
378
+ }
379
+ flush();
380
+ if (!res.description)
381
+ res.description = content.slice(0, 2000).trim();
382
+ return res;
383
+ }
384
+ /** Strip trailing noise sections (similar jobs, people also viewed, etc.) */
385
+ function stripDetailNoise(content) {
386
+ const cutPatterns = [
387
+ /^#{1,3}\s*similar\s+jobs/im,
388
+ /^#{1,3}\s*people\s+also\s+viewed/im,
389
+ /^#{1,3}\s*similar\s+searches/im,
390
+ /^#{1,3}\s*explore\s+collaborative/im,
391
+ /^#{1,3}\s*seniority\s+level/im,
392
+ /^#{1,3}\s*company\s+and\s+salary/im,
393
+ /^#{1,3}\s*career\s+guide/im,
394
+ /^#{1,3}\s*jobs\s+with\s+similar/im,
395
+ /^#{1,3}\s*similar\s+jobs?\s+nearby/im,
396
+ ];
397
+ let result = content;
398
+ for (const pattern of cutPatterns) {
399
+ const m = pattern.exec(result);
400
+ if (m && m.index !== undefined && m.index > result.length * 0.3) {
401
+ result = result.slice(0, m.index).trim();
402
+ }
403
+ }
404
+ return result;
405
+ }
406
+ function parseJobDetail(content, card) {
407
+ // Strip noise sections before parsing
408
+ const cleaned = stripDetailNoise(content);
409
+ const sections = splitSections(cleaned);
410
+ const empMatch = cleaned.match(/\b(full[- ]?time|part[- ]?time|contract|internship|freelance|temporary)\b/i);
411
+ const expMatch = cleaned.match(/\b(entry[- ]?level|mid[- ]?level|senior|lead|principal|staff|junior|intern)\b/i);
412
+ const applyMatch = cleaned.match(/\[(?:apply|submit)[^\]]*\]\(([^)]+)\)/i) ||
413
+ cleaned.match(/href="([^"]*(?:apply|submit|careers)[^"]*)"/i);
414
+ // Salary from "## Pay found in job post" or "### Base pay range" sections
415
+ const salary = card.salary || findSalary(cleaned);
416
+ return {
417
+ ...card,
418
+ salary: salary || card.salary,
419
+ description: sections.description || cleaned.slice(0, 3000),
420
+ requirements: sections.requirements,
421
+ responsibilities: sections.responsibilities,
422
+ benefits: sections.benefits,
423
+ applyUrl: applyMatch ? applyMatch[1] : undefined,
424
+ employmentType: empMatch ? empMatch[1].toLowerCase().replace(/\s+/g, '-') : undefined,
425
+ experienceLevel: expMatch ? expMatch[1] : undefined,
426
+ };
427
+ }
428
+ // ── Main ───────────────────────────────────────────────────────────────
429
+ /**
430
+ * Search job boards and return structured results.
431
+ *
432
+ * Uses `peel()` internally so all smart-escalation / stealth logic applies.
433
+ * Call `cleanup()` from the main webpeel export when you're done with all
434
+ * fetching (this module does **not** call it automatically because the
435
+ * browser instance is shared across the library).
436
+ */
437
+ export async function searchJobs(options) {
438
+ const startTime = Date.now();
439
+ const { url, keywords = '', location = '', source: reqSource = 'linkedin', limit = 25, fetchDetails = 0, timeout = 30000, } = options;
440
+ // 1. Determine source & URL
441
+ let searchUrl;
442
+ let source;
443
+ if (url) {
444
+ searchUrl = url;
445
+ source = detectSource(url);
446
+ }
447
+ else {
448
+ if (!keywords)
449
+ throw new Error('Either url or keywords must be provided');
450
+ source = reqSource;
451
+ searchUrl = buildSearchUrl(source, keywords, location);
452
+ }
453
+ // 2. Fetch search page
454
+ const result = await peel(searchUrl, {
455
+ stealth: stealthNeeded(source),
456
+ timeout,
457
+ format: 'markdown',
458
+ });
459
+ // 3. Parse job cards
460
+ let parsed;
461
+ switch (source) {
462
+ case 'linkedin':
463
+ parsed = parseLinkedIn(result.content, searchUrl, limit);
464
+ break;
465
+ case 'glassdoor':
466
+ parsed = parseGlassdoor(result.content, searchUrl, limit);
467
+ break;
468
+ case 'indeed':
469
+ parsed = parseIndeed(result.content, searchUrl, limit);
470
+ break;
471
+ default: {
472
+ // Try each parser for unknown URLs
473
+ parsed = parseLinkedIn(result.content, searchUrl, limit);
474
+ if (!parsed.jobs.length)
475
+ parsed = parseGlassdoor(result.content, searchUrl, limit);
476
+ if (!parsed.jobs.length)
477
+ parsed = parseIndeed(result.content, searchUrl, limit);
478
+ break;
479
+ }
480
+ }
481
+ // 4. Optionally fetch detail pages (max 3 concurrent)
482
+ let detailsFetched = 0;
483
+ let jobs = parsed.jobs;
484
+ if (fetchDetails > 0 && parsed.jobs.length > 0) {
485
+ const toFetch = parsed.jobs.slice(0, fetchDetails);
486
+ const srcForStealth = source;
487
+ const tasks = toFetch.map((card) => async () => {
488
+ try {
489
+ const dr = await peel(card.detailUrl, {
490
+ stealth: stealthNeeded(srcForStealth),
491
+ timeout,
492
+ format: 'markdown',
493
+ });
494
+ detailsFetched++;
495
+ return parseJobDetail(dr.content, card);
496
+ }
497
+ catch {
498
+ return card; // graceful fallback
499
+ }
500
+ });
501
+ const detailed = await pLimited(tasks, 3);
502
+ jobs = [...detailed, ...parsed.jobs.slice(fetchDetails)];
503
+ }
504
+ return {
505
+ jobs,
506
+ totalFound: parsed.totalFound,
507
+ source,
508
+ searchUrl,
509
+ detailsFetched,
510
+ timeTakenMs: Date.now() - startTime,
511
+ };
512
+ }
513
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/core/jobs.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/core/markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuCH;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkCjG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBxF;AAmDD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAqCnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAqC9E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CA4DjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuB/C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA4ChF"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/core/markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqDH;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkCjG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBxF;AAoED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAwDnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAqC9E;AA4CD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAqEjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuB/C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA4ChF"}