/** Live fixture capture for yuyu-tei (one Pokémon expansion page, one One Piece page). Usage: pnpm tsx connectors/api/yuyu-tei/_capture.ts */ import { saveFixture } from '@rareindex/connectors/testing'; import { mkdirSync, writeFileSync } from 'node:fs'; import path from 'node:path'; import { fixtureDir } from '@rareindex/connectors/testing'; import meta from './meta.json' with { type: 'json' }; import { parseSellPage, parseVersions, type YuyuPayload } from './index.js'; import { HTML_HEADERS } from '../_g1-cards-eu-jp-lib/index.js'; const SITE = 'https://yuyu-tei.jp'; const text = async (u: string) => (await fetch(u, { headers: HTML_HEADERS })).text(); const wait = (ms: number) => new Promise((r) => setTimeout(r, ms)); const games = meta.config.games as Record; for (const [game, name, keep] of [['poc', 'pokemon-set', 14], ['opc', 'one-piece-set', 10]] as const) { const top = await text(`${SITE}/top/${game}`); const versions = parseVersions(top); const v = versions[0]!; await wait(4000); const doc = await text(`${SITE}/sell/${game}/s/${v.code}`); if (game === 'poc') { mkdirSync(fixtureDir('yuyu-tei'), { recursive: true }); writeFileSync(path.join(fixtureDir('yuyu-tei'), 'sell-page.html'), doc); } const { setName, items } = parseSellPage(doc); const payload: YuyuPayload = { game, gameCfg: { slug: games[game]!.slug, name: games[game]!.name, franchise: games[game]!.franchise ?? null, brand: games[game]!.brand ?? null }, set: { code: v.code, name: setName ?? v.name }, items: items.slice(0, keep) }; saveFixture('yuyu-tei', name, { raw: { url: `${SITE}/sell/${game}/s/${v.code}`, externalId: `${game}:${v.code}`, kind: 'listing', engine: 'api', fetchedAt: new Date(), payload }, expect: { minCount: keep, kinds: ['catalog_item', 'listing'], requiredFields: ['attributes.set', 'attributes.name'] }, note: `Live capture ${new Date().toISOString().slice(0, 10)} — ${SITE}/sell/${game}/s/${v.code} (${versions.length} expansions listed on /top/${game}; page had ${items.length} products, first ${keep} kept)`, }); console.log(name, v, setName, items.length, items[0]); await wait(4000); }