#!/usr/bin/env node /** * scripts/verify-render.mjs —— 无浏览器渲染冒烟(jsdom)。 * * 为什么需要:真实浏览器验收(verify-browser.mjs)依赖 Playwright + Chromium; * CI / 无头环境没有浏览器时,用 jsdom 把**真实的组件树**跑起来: * 1. 按 index.html 的 importmap 解析裸标识符(与浏览器同一套映射) * 2. 导入 src/app.js → 21 个自定义元素全部注册 * 3. 真实连 Parse(或不联网用 --offline 跳过取数)→ 三视角 / 池子 / 台账 / 报告 全部拿到数据后渲染 * 4. 抓未捕获异常、页面错误(jsdom 不支持的能力只记录,不算失败) * * 注意:jsdom 没有 layout / backdrop-filter / IntersectionObserver,**视觉与滚动行为必须用真实浏览器验**。 * 本脚本只回答「逻辑闭环 + 渲染不抛错」。 * * 用法:node scripts/verify-render.mjs [--offline] * 需要 jsdom:优先用 node_modules/jsdom,其次 ../testing/node_modules/jsdom(本机验收机) */ import { createRequire } from 'node:module'; import { register } from 'node:module'; import { pathToFileURL } from 'node:url'; import { readFileSync, writeFileSync, appendFileSync, existsSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..'); const require = createRequire(import.meta.url); function findJsdom() { for (const p of [join(ROOT, 'node_modules/jsdom'), '/opt/data/work/kangshifu/testing/node_modules/jsdom']) { if (existsSync(p)) return p; } return null; } const jsdomPath = findJsdom(); if (!jsdomPath) { console.error('需要 jsdom:npm i -D jsdom(或放在 ../testing/node_modules)'); process.exit(2); } // 1) importmap → Node 解析器(file:// 路径) const html = readFileSync(join(ROOT, 'index.html'), 'utf8'); const im = JSON.parse(html.match(/