/** * 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')