feat(codegen): P 层闭环 —— 模板生成页面 + 画廊生成面板
- src/codegen.ts:PageDeclaration → definePage 源码(漂亮缩进,语法合法) - src/render.ts:导出 generatePageSource/starterPageFrom;画廊受控 selected/onSelect - playground generator.tsx:选布局→填标题→生成→复制/保存到 pages/ - vite 中间件 /__vr-save:浏览器 POST 落盘 pages/(HMR 生效) - 验证:codegen 产物通过工程 tsc;保存中间件落盘成功;画廊 UI headless 通过
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* 用 codegen 生成真实页面源码,写入 pages/,验证产物可被工程编译
|
||||
* 不依赖 React/tsx 注册 —— 用轻量模拟注册表
|
||||
* 运行:node --experimental-strip-types scripts/gen-and-save.ts
|
||||
*/
|
||||
import { createRegistry } from 'vibe-registry'
|
||||
import { generatePageSource, starterPageFrom } from 'vibe-registry/render'
|
||||
import { writeFileSync, mkdirSync } from 'node:fs'
|
||||
import { join, dirname } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const reg = createRegistry()
|
||||
reg.registerLayout({
|
||||
kind: 'layout',
|
||||
id: 'admin',
|
||||
slots: ['sidebar', 'header', 'content', 'footer'],
|
||||
description: 't',
|
||||
preview: {
|
||||
title: 'Admin',
|
||||
demoBlocks: [{ slot: 'content', widget: 'data-table', props: {} }],
|
||||
},
|
||||
})
|
||||
reg.registerWidget({ kind: 'widget', id: 'data-table', description: 't' })
|
||||
|
||||
const page = starterPageFrom('admin', reg, '商品管理')
|
||||
const src = generatePageSource(page, {
|
||||
products: [
|
||||
{ id: 'P01', name: '键盘', price: 299, stock: 42 },
|
||||
{ id: 'P02', name: '鼠标', price: 99, stock: 120 },
|
||||
],
|
||||
})
|
||||
|
||||
const out = join(dirname(fileURLToPath(import.meta.url)), '..', 'pages', 'page-products.tsx')
|
||||
mkdirSync(dirname(out), { recursive: true })
|
||||
writeFileSync(out, src, 'utf8')
|
||||
console.log('已生成:', out)
|
||||
console.log('--- 代码(前 26 行)---')
|
||||
console.log(src.split('\n').slice(0, 26).join('\n'))
|
||||
Reference in New Issue
Block a user