/** * orchestrate —— 编排层验证脚本 * 模拟"渲染内核消费前的编排":集中注册 → 校验 → 执行 setup 数据流 → 输出解析树 * * 运行:node --experimental-strip-types scripts/orchestrate.ts */ import '../registry/index.ts' // ← 集中注册(副作用) import { registry } from 'vibe-registry' import { overviewPage } from '../pages/overview.ts' import { suiteDetailPage } from '../pages/suite-detail.ts' import { runHistoryPage } from '../pages/run-history.ts' function dumpRegistry() { console.log('═══ 注册表(万物皆注册)═══') for (const e of registry.listAll()) { const preview = e.kind === 'layout' && e.preview ? ` 预览:「${e.preview.title}」` : '' console.log(` ${e.kind.padEnd(7)} ${e.id}${preview}`) } } async function orchestrate() { console.log('═══ 编排层 · 解析树 ═══\n') const pages = [ { name: 'overview', page: overviewPage, ctx: { query: {}, params: {} } }, { name: 'suite-detail', page: suiteDetailPage, ctx: { query: {}, params: { id: 'billing' } } }, { name: 'run-history', page: runHistoryPage, ctx: { query: {}, params: {} } }, ] for (const { name, page, ctx } of pages) { const layout = registry.store.layouts.get(page.layout) if (!layout) throw new Error(`页面 ${name} 引用了未注册布局 ${page.layout}(本不该发生,definePage 已校验)`) // 业务层:页面只管 setup,数据喂给 blocks const data = page.setup ? await page.setup(ctx) : {} console.log(`◆ 页面「${page.title ?? name}」`) console.log(` layout: ${page.layout} slots=[${layout.slots.join(', ')}]`) for (const b of page.blocks) { const widget = registry.store.widgets.get(b.widget) const bound = b.bind ? Object.entries(b.bind) .map(([prop, key]) => `${prop}←${key}(${data[key] === undefined ? '?' : Array.isArray(data[key]) ? `${(data[key] as unknown[]).length}项` : typeof data[key]})`) .join(' ') : '' console.log(` └ widget: ${b.widget} props=${JSON.stringify(b.props ?? {})} bind=[${bound}]`) } console.log('') } } dumpRegistry() console.log('') orchestrate().then( () => { console.log('✓ 编排完成:3 页面全部通过校验,setup 数据流正常') }, (e) => { console.error('✗ 编排失败:', e) process.exit(1) }, )