TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1/**2 * Live smoke test for the official-API connectors: real router + crawl context, probe mode, limit 5.3 * Usage: pnpm tsx connectors/api/_lib/smoke.ts [scryfall|pokemontcg|ygoprodeck]4 */5import { createCrawlContext, createRouter, loadConnector } from '@rareindex/connectors';6import { childLogger } from '@rareindex/shared';78const ids = process.argv.slice(2).length ? process.argv.slice(2) : ['scryfall', 'pokemontcg', 'ygoprodeck'];9const router = createRouter({});10for (const id of ids) {11 const started = Date.now();12 const connector = await loadConnector(id);13 const ctx = createCrawlContext({ router, meta: connector.meta, options: { mode: 'probe', limit: 5, ...(id === 'pokemontcg' ? { seeds: ['base1'] } : {}) }, log: childLogger({ connector: id, level: 'warn' }) });14 let raws = 0;15 let normalized = 0;16 let firstPrinted = false;17 for await (const raw of connector.crawl(ctx)) {18 raws++;19 const out = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() });20 normalized += out.length;21 if (!firstPrinted) {22 firstPrinted = true;23 for (const r of out.slice(0, 3)) {24 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)}` : '';25 console.log(` [${id}] ${r.kind}: ${'rawTitle' in r ? r.rawTitle : ''} → ${summary}`);26 }27 }28 }29 if (id === 'scryfall') {30 const looked = await connector.lookup?.('https://scryfall.com/card/lea/232/black-lotus', ctx);31 console.log(` [${id}] lookup(black lotus) → ${looked?.length ?? 0} raw record(s)`);32 }33 console.log(`[${id}] raw=${raws} normalized=${normalized} engineStats=${JSON.stringify(ctx.engineStats)} anomalies=${ctx.anomalies.length} ms=${Date.now() - started}`);34}35