Files
vibe-registry/scripts/smoke.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

73 lines
2.0 KiB
TypeScript

/**
* M1 验证脚本:类型 + 注册 + 校验闸门
* 演示:注册布局/widget → definePage 声明 → 引用校验
* 运行:node --experimental-strip-types scripts/smoke.ts
*/
import { createRegistry, registerLayout, registerWidget, definePage } from '../src/index.ts'
const reg = createRegistry()
// 万物皆注册:布局与组件都要先注册,才有 id 可用
reg.registerLayout({
kind: 'layout',
id: 'admin',
slots: ['header', 'content'],
description: '后台骨架',
preview: { title: 'Admin', demoBlocks: [] },
})
reg.registerWidget({
kind: 'widget',
id: 'data-table',
component: 'TableMock', // M1 不接真实 UI,组件占位
description: '数据表格',
})
reg.registerWidget({
kind: 'widget',
id: 'page-header',
component: 'HeaderMock',
description: '页头',
})
// 合法页面:全部引用已注册 id
const page = definePage(
{
layout: 'admin',
title: '订单',
blocks: [
{ widget: 'page-header', props: { title: '订单管理' } },
{ widget: 'data-table', bind: { rows: 'orders' } },
],
async setup() {
return { orders: [{ id: 1, total: 9.9 }] }
},
},
reg,
)
console.log('✓ 合法页面通过校验:', page.title, page.layout, page.blocks.length, 'blocks')
// 非法页面:引用了未注册 widget → 校验闸门必须抛错
try {
definePage(
{
layout: 'admin',
blocks: [{ widget: 'magic-graph' }], // ← 未注册
},
reg,
)
console.error('✗ 应当抛错但没有(校验闸门失效!)')
process.exit(1)
} catch (e) {
console.log('✓ 校验闸门拦截未注册引用:', (e as Error).message.split('\n')[0])
}
// 重复注册同 id → 必须抛错
try {
reg.registerLayout({ kind: 'layout', id: 'admin', slots: [], description: 'dup' })
console.error('✗ 重复注册未抛错(id 唯一性失效!)')
process.exit(1)
} catch (e) {
console.log('✓ 重复注册被拒(id 唯一):', (e as Error).message.split('\n')[0])
}
console.log('smoke OK')