/** * 1688 提取器离线验证 —— 用 reference/1688.html 快照跑真实提取逻辑。 * * 用法:node scripts/verify-1688.mjs [快照路径] * 依赖 esbuild 打包 TS 提取器(node_modules 里有)。 */ import { readFileSync, readdirSync } from 'node:fs'; import { execSync } from 'node:child_process'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const root = join(dirname(fileURLToPath(import.meta.url)), '..'); const htmlPath = process.argv[2] ?? '/Users/joey/sites/seller-store/ozon-seller-kit/reference/1688.html'; // 1. 打包提取器(纯函数无 DOM 依赖);pnpm 布局下 esbuild bin 可能不在 .bin,动态查找 function findEsbuild() { const candidates = [join(root, 'node_modules/.bin/esbuild')]; try { const pnpmDir = join(root, 'node_modules/.pnpm'); for (const d of readdirSync(pnpmDir)) { if (d.startsWith('esbuild@')) { candidates.push(join(pnpmDir, d, 'node_modules/esbuild/bin/esbuild')); } } } catch { /* ignore */ } candidates.push('esbuild'); // 全局兜底 for (const c of candidates) { try { execSync(`${c} --version`, { stdio: 'pipe' }); return c; } catch { /* try next */ } } throw new Error('找不到可用的 esbuild'); } const outFile = '/tmp/1688-state.bundle.mjs'; execSync(`${JSON.stringify(findEsbuild())} src/collector/1688-state.ts --bundle --format=esm --outfile=${outFile}`, { cwd: root }); const { extract1688State } = await import(`file://${outFile}`); // 2. 从快照提取 script#3 并在 window 垫片里求值(还原 window.context) const html = readFileSync(htmlPath, 'utf8'); const scripts = [...html.matchAll(/