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:* 依赖)
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* 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)
|
||||
},
|
||||
)
|
||||
Reference in New Issue
Block a user