Files
vibe-registry/examples/qa-orchestrator/scripts/orchestrate.ts
T
hellow-da-sb 8c93bde5f6 feat: vibe-registry M1 — 万物皆注册框架骨架
- core: registerLayout/Widget/Action(泛型)/Schema + 校验闸门
- definePage: 页面只管业务,结构来自注册表
- presets: admin / app-shell 预设布局(vr add 物化)
- cli: vr list/add/update 防覆盖
- examples/qa-orchestrator: 实战编排验证(workspace:* 依赖)
2026-09-03 00:48:10 +08:00

62 lines
2.3 KiB
TypeScript

/**
* 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)
},
)