8c93bde5f6
- core: registerLayout/Widget/Action(泛型)/Schema + 校验闸门 - definePage: 页面只管业务,结构来自注册表 - presets: admin / app-shell 预设布局(vr add 物化) - cli: vr list/add/update 防覆盖 - examples/qa-orchestrator: 实战编排验证(workspace:* 依赖)
73 lines
2.0 KiB
TypeScript
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')
|