/** * Live smoke for the g1-cards-eu-jp connectors: real router + crawl context, probe mode, small limits, * seeds chosen to keep traffic (and Scrapfly credits) minimal. Postgres is not needed. * Usage: pnpm tsx connectors/api/_g1-cards-eu-jp-lib/smoke.ts [ids…] */ import { createCrawlContext, createRouter, loadConnector } from '@rareindex/connectors'; import { childLogger } from '@rareindex/shared'; try { process.loadEnvFile('.env'); } catch { /* no .env */ } const PLAN: Record = { 'cardmarket-priceguide': { limit: 5, seeds: ['18'] }, // One Piece: smallest files (~4 MB) 'limitless-tcg': { limit: 1, seeds: ['MEG', 'M6'] }, 'yuyu-tei': { limit: 1, seeds: ['poc'] }, hareruya: { limit: 1 }, magi: { limit: 1, seeds: ['31'] }, cardrush: { limit: 1, seeds: ['www.cardrush-mtg.jp'] }, // plain-HTTP store only (no Scrapfly credits) cardtrader: { limit: 1 }, }; const ids = process.argv.slice(2).length ? process.argv.slice(2) : Object.keys(PLAN); const router = createRouter({ scrapflyApiKey: process.env.SCRAPFLY_API_KEY, firecrawlApiKey: process.env.FIRECRAWL_API_KEY }); for (const id of ids) { const started = Date.now(); const connector = await loadConnector(id); const plan = PLAN[id] ?? { limit: 1 }; const ctx = createCrawlContext({ router, meta: connector.meta, options: { mode: 'probe', limit: plan.limit, seeds: plan.seeds }, log: childLogger({ connector: id, level: 'warn' }) }); let raws = 0; let normalized = 0; const kinds: Record = {}; let printed = 0; try { 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; for (const r of out) { kinds[r.kind] = (kinds[r.kind] ?? 0) + 1; if (printed < 3) { printed++; const summary = r.kind === 'price_observation' ? `${r.priceKind} ${r.price} ${r.currency} @ ${r.observationDate.toISOString().slice(0, 10)}` : r.kind === 'listing' ? `${r.price} ${r.currency} ${r.availability} ids=${JSON.stringify(r.attributes.identifiers)}` : r.kind === 'catalog_item' ? `set=${r.attributes.set ?? '-'} #${r.attributes.number ?? '-'} variant=${r.attributes.variant ?? '-'} ids=${JSON.stringify(r.attributes.identifiers)}` : ''; console.log(` [${id}] ${r.kind}: ${'rawTitle' in r ? r.rawTitle : ''} → ${summary}`); } } } } catch (err) { console.log(` [${id}] crawl error: ${err instanceof Error ? err.message : String(err)}`); } console.log(`[${id}] raw=${raws} normalized=${normalized} kinds=${JSON.stringify(kinds)} engineStats=${JSON.stringify(ctx.engineStats)} anomalies=${JSON.stringify(ctx.anomalies)} ms=${Date.now() - started}`); }