8fe594ff6c
- 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 通过
39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
/**
|
|
* 用 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'))
|