/** * Live smoke test for the official-API connectors: real router + crawl context, probe mode, limit 5. * Usage: pnpm tsx connectors/api/_lib/smoke.ts [scryfall|pokemontcg|ygoprodeck] */ import { createCrawlContext, createRouter, loadConnector } from '@rareindex/connectors'; import { childLogger } from '@rareindex/shared'; const ids = process.argv.slice(2).length ? process.argv.slice(2) : ['scryfall', 'pokemontcg', 'ygoprodeck']; const router = createRouter({}); for (const id of ids) { const started = Date.now(); const connector = await loadConnector(id); const ctx = createCrawlContext({ router, meta: connector.meta, options: { mode: 'probe', limit: 5, ...(id === 'pokemontcg' ? { seeds: ['base1'] } : {}) }, log: childLogger({ connector: id, level: 'warn' }) }); let raws = 0; let normalized = 0; let firstPrinted = false; for await (const raw of connector.crawl(ctx)) { raws++; const out = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() }); normalized += out.length; if (!firstPrinted) { firstPrinted = true; for (const r of out.slice(0, 3)) { const summary = r.kind === 'price_observation' ? `${r.priceKind} ${r.price} ${r.currency} @ ${r.observationDate.toISOString().slice(0, 10)}` : r.kind === 'catalog_item' ? `variant=${r.attributes.variant ?? '-'} ids=${JSON.stringify(r.attributes.identifiers)}` : ''; console.log(` [${id}] ${r.kind}: ${'rawTitle' in r ? r.rawTitle : ''} → ${summary}`); } } } if (id === 'scryfall') { const looked = await connector.lookup?.('https://scryfall.com/card/lea/232/black-lotus', ctx); console.log(` [${id}] lookup(black lotus) → ${looked?.length ?? 0} raw record(s)`); } console.log(`[${id}] raw=${raws} normalized=${normalized} engineStats=${JSON.stringify(ctx.engineStats)} anomalies=${ctx.anomalies.length} ms=${Date.now() - started}`); }