/** * Live smoke / fixture capture for this wave's connectors (works before the registry is rebuilt). * pnpm tsx connectors/api/_wlib/smoke.ts api/reverb [--limit 2] [--save ] [--trim 8] [--mode probe|incremental] */ import path from 'node:path'; import { pathToFileURL } from 'node:url'; import { readFileSync } from 'node:fs'; import { createRouter, createCrawlContext, ConnectorMetaSchema, type RareIndexConnector, type ConnectorMeta } from '@rareindex/connectors'; import { saveFixture } from '@rareindex/connectors/testing'; const [, , mod, ...rest] = process.argv; if (!mod) throw new Error('usage: smoke.ts / [--limit N] [--save name] [--trim N]'); const arg = (k: string) => { const i = rest.indexOf(k); return i >= 0 ? rest[i + 1] : undefined; }; const limit = Number(arg('--limit') ?? 2); const save = arg('--save'); const trim = Number(arg('--trim') ?? 8); const mode = (arg('--mode') ?? 'probe') as 'probe' | 'incremental' | 'backfill'; const dir = path.resolve(process.cwd(), 'connectors', mod); const meta: ConnectorMeta = ConnectorMetaSchema.parse(JSON.parse(readFileSync(path.join(dir, 'meta.json'), 'utf8'))); const factory = (await import(pathToFileURL(path.join(dir, 'index.ts')).href)) as { default: (m: ConnectorMeta) => RareIndexConnector }; const connector = factory.default(meta); const router = createRouter({ scrapflyApiKey: process.env.SCRAPFLY_API_KEY, firecrawlApiKey: process.env.FIRECRAWL_API_KEY }); const ctx = createCrawlContext({ router, meta, options: { mode, limit } }); let i = 0; for await (const raw of connector.crawl(ctx)) { const out = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() }); console.log(`raw ${raw.externalId} (${raw.kind}) → ${out.length} records`); for (const r of out.slice(0, 3)) console.log(' ', JSON.stringify(r).slice(0, 420)); if (save && i === 0) { const p = raw.payload as Record; for (const k of ['items', 'listings', 'products', 'results', 'lots']) if (Array.isArray(p[k])) p[k] = (p[k] as unknown[]).slice(0, trim); saveFixture(meta.id, save, { raw: { url: raw.url, externalId: raw.externalId ?? null, kind: raw.kind, engine: raw.engine, fetchedAt: raw.fetchedAt ?? new Date(), payload: p }, expect: { minCount: 1 }, note: `Captured live from ${new URL(raw.url).host} on ${new Date().toISOString().slice(0, 10)} (trimmed to ${trim} items)`, }); console.log(`saved fixture data/fixtures/${meta.id}/${save}.json`); } i++; } console.log('engineStats', JSON.stringify(ctx.engineStats), 'anomalies', ctx.anomalies);