TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1/** Live fixture capture for yuyu-tei (one Pokémon expansion page, one One Piece page). Usage: pnpm tsx connectors/api/yuyu-tei/_capture.ts */2import { saveFixture } from '@rareindex/connectors/testing';3import { mkdirSync, writeFileSync } from 'node:fs';4import path from 'node:path';5import { fixtureDir } from '@rareindex/connectors/testing';6import meta from './meta.json' with { type: 'json' };7import { parseSellPage, parseVersions, type YuyuPayload } from './index.js';8import { HTML_HEADERS } from '../_g1-cards-eu-jp-lib/index.js';910const SITE = 'https://yuyu-tei.jp';11const text = async (u: string) => (await fetch(u, { headers: HTML_HEADERS })).text();12const wait = (ms: number) => new Promise((r) => setTimeout(r, ms));13const games = meta.config.games as Record<string, { slug: string; name: string; franchise?: string | null; brand?: string | null }>;1415for (const [game, name, keep] of [['poc', 'pokemon-set', 14], ['opc', 'one-piece-set', 10]] as const) {16 const top = await text(`${SITE}/top/${game}`);17 const versions = parseVersions(top);18 const v = versions[0]!;19 await wait(4000);20 const doc = await text(`${SITE}/sell/${game}/s/${v.code}`);21 if (game === 'poc') {22 mkdirSync(fixtureDir('yuyu-tei'), { recursive: true });23 writeFileSync(path.join(fixtureDir('yuyu-tei'), 'sell-page.html'), doc);24 }25 const { setName, items } = parseSellPage(doc);26 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) };27 saveFixture('yuyu-tei', name, {28 raw: { url: `${SITE}/sell/${game}/s/${v.code}`, externalId: `${game}:${v.code}`, kind: 'listing', engine: 'api', fetchedAt: new Date(), payload },29 expect: { minCount: keep, kinds: ['catalog_item', 'listing'], requiredFields: ['attributes.set', 'attributes.name'] },30 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)`,31 });32 console.log(name, v, setName, items.length, items[0]);33 await wait(4000);34}35