@michaeltangseng/schemaai 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/EditorStore.d.ts +4 -0
- package/dist/core/EditorStore.d.ts.map +1 -0
- package/dist/core/EditorStore.js +1007 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/renderer/Renderer.d.ts +21 -0
- package/dist/renderer/Renderer.d.ts.map +1 -0
- package/dist/renderer/Renderer.js +25 -0
- package/docs/build-dist.md +83 -0
- package/docs/cursor-rule-low-code-engine.mdc +66 -0
- package/docs/migrate-plan.md +145 -0
- package/docs/public-api.md +297 -0
- package/docs/publish-to-npm.md +148 -0
- package/package.json +34 -0
- package/src/core/EditorStore.tsx +1171 -0
- package/src/index.ts +7 -0
- package/src/renderer/Renderer.tsx +82 -0
- package/tests/schemaai-react-demo/index.html +13 -0
- package/tests/schemaai-react-demo/package.json +21 -0
- package/tests/schemaai-react-demo/pnpm-lock.yaml +808 -0
- package/tests/schemaai-react-demo/src/App.tsx +47 -0
- package/tests/schemaai-react-demo/src/main.tsx +10 -0
- package/tests/schemaai-react-demo/tsconfig.json +21 -0
- package/tests/schemaai-react-demo/vite.config.ts +10 -0
- package/tsconfig.build.json +22 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface DemoNodeSchema {
|
|
3
|
+
id: string;
|
|
4
|
+
type: string;
|
|
5
|
+
props?: Record<string, any>;
|
|
6
|
+
style?: React.CSSProperties;
|
|
7
|
+
children?: DemoNodeSchema[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 最小可用版本:
|
|
11
|
+
* - 只负责把 schema 渲染成 React 组件树
|
|
12
|
+
* - 不包含拖拽、选中、高亮、事件编辑等「编辑器态」能力
|
|
13
|
+
* - 主要用于 npm 包在运行态(runtime)下的集成测试
|
|
14
|
+
*/
|
|
15
|
+
export interface SchemaAIRendererProps {
|
|
16
|
+
schema: DemoNodeSchema;
|
|
17
|
+
pageId?: string;
|
|
18
|
+
}
|
|
19
|
+
declare const SchemaAIRenderer: ({ schema }: SchemaAIRendererProps) => JSX.Element;
|
|
20
|
+
export default SchemaAIRenderer;
|
|
21
|
+
//# sourceMappingURL=Renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/Renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED;;;;;GAKG;AAEH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAsDD,QAAA,MAAM,gBAAgB,GAAI,YAAY,qBAAqB,KAAG,GAAG,CAAC,OAEjE,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
const renderNode = (node) => {
|
|
3
|
+
const children = (node.children || []).map(child => renderNode(child));
|
|
4
|
+
// 最小映射:只处理极少数内置类型,其余用 div 包裹
|
|
5
|
+
if (node.type === 'PluginText') {
|
|
6
|
+
return (_jsxs("p", { style: node.style, children: [node.props?.text ?? '', children] }, node.id));
|
|
7
|
+
}
|
|
8
|
+
if (node.type === 'Container') {
|
|
9
|
+
return (_jsxs("div", { style: node.style, children: [node.props?.title && (_jsx("h2", { style: { margin: 0, marginBottom: 8, fontSize: 16 }, children: node.props.title })), children] }, node.id));
|
|
10
|
+
}
|
|
11
|
+
// 其他类型:简单兜底渲染
|
|
12
|
+
return (_jsxs("div", { style: {
|
|
13
|
+
padding: 8,
|
|
14
|
+
border: '1px dashed #f97316',
|
|
15
|
+
fontSize: 12,
|
|
16
|
+
color: '#c2410c',
|
|
17
|
+
borderRadius: 4,
|
|
18
|
+
margin: 4,
|
|
19
|
+
...(node.style || {}),
|
|
20
|
+
}, children: [_jsxs("div", { style: { marginBottom: 4 }, children: ["Unknown component type: ", _jsx("code", { children: node.type })] }), children] }, node.id));
|
|
21
|
+
};
|
|
22
|
+
const SchemaAIRenderer = ({ schema }) => {
|
|
23
|
+
return renderNode(schema);
|
|
24
|
+
};
|
|
25
|
+
export default SchemaAIRenderer;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
## schemaAI 构建 dist 产物说明
|
|
2
|
+
|
|
3
|
+
本文档记录如何在本地为 `schemaAI` npm 包构建 `dist` 目录,以及当前构建范围的约定。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 当前构建范围
|
|
8
|
+
|
|
9
|
+
- **包路径**:`Others/utils-lib/npm-package`
|
|
10
|
+
- **入口文件**:`src/index.ts`
|
|
11
|
+
- 目前对外仅导出:
|
|
12
|
+
- `schemaAIRenderer`(最小可用 Renderer,用于将简单 schema 渲染为 React 组件树)
|
|
13
|
+
- **构建排除**:
|
|
14
|
+
- `src/core/EditorStore.tsx` 暂时被排除在构建之外(仅作为迁移中的镜像文件存在),对应配置见:
|
|
15
|
+
- `tsconfig.build.json` 中的:
|
|
16
|
+
```json
|
|
17
|
+
"exclude": [
|
|
18
|
+
"src/core/EditorStore.tsx"
|
|
19
|
+
]
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. 构建配置概要
|
|
25
|
+
|
|
26
|
+
- **`package.json` 关键字段**:
|
|
27
|
+
- `main`: `dist/index.cjs`
|
|
28
|
+
- `module`: `dist/index.esm.js`
|
|
29
|
+
- `types`: `dist/index.d.ts`
|
|
30
|
+
- `scripts`:
|
|
31
|
+
- `"build": "tsc -p tsconfig.build.json"`
|
|
32
|
+
- `"prepare": "npm run build"`(用于 `npm publish` 前自动构建)
|
|
33
|
+
- **`tsconfig.build.json` 核心选项**:
|
|
34
|
+
- `compilerOptions.outDir`: `dist`
|
|
35
|
+
- `compilerOptions.rootDir`: `src`
|
|
36
|
+
- 生成类型声明:`declaration: true`, `declarationMap: true`
|
|
37
|
+
- 使用 JSX:`jsx: "react-jsx"`
|
|
38
|
+
- 其他:`esModuleInterop`, `skipLibCheck`, `strict` 等
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 3. 本地构建步骤
|
|
43
|
+
|
|
44
|
+
在目录 `Others/utils-lib/npm-package` 下执行:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pnpm install # 或 npm install
|
|
48
|
+
pnpm run build # 或 npm run build
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
成功后应看到:
|
|
52
|
+
|
|
53
|
+
- 生成 `dist/` 目录,包含:
|
|
54
|
+
- 编译后的 JS 文件(cjs/esm,具体取决于后续 bundler/输出策略)。
|
|
55
|
+
- `.d.ts` 类型声明文件。
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 4. 与测试项目的关系
|
|
60
|
+
|
|
61
|
+
- 测试项目路径:`tests/schemaai-react-demo`
|
|
62
|
+
- 当前推荐的本地开发/调试方式:
|
|
63
|
+
- **直接使用本地源码相对导入**:
|
|
64
|
+
- 在 `schemaai-react-demo/src/App.tsx` 中:
|
|
65
|
+
```ts
|
|
66
|
+
import SchemaAIRenderer from '../../../src/renderer/Renderer';
|
|
67
|
+
```
|
|
68
|
+
- 用于快速验证 Renderer 行为,无需依赖 `npm link` 或已发布包。
|
|
69
|
+
- 在需要模拟真实 npm 包使用方式时,可以:
|
|
70
|
+
- 等 `schemaAI` 发布到 npm 后,在独立项目中 `npm install @michaeltangseng/schemaai`;
|
|
71
|
+
- 或在更简洁的根级 demo 工程中使用 `npm link`。
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 5. 后续演进计划(与构建相关)
|
|
76
|
+
|
|
77
|
+
- 当以下能力迁移完成后,将逐步纳入构建:
|
|
78
|
+
- 内聚到包内的 `types` / `constants` / `nodeUtils` 等基础依赖。
|
|
79
|
+
- 经过抽象的 `EditorStore` 能力(对应 `createEngineStore` 等 Public API)。
|
|
80
|
+
- 届时需同步更新:
|
|
81
|
+
- `tsconfig.build.json` 的 `exclude` 配置(移除 `EditorStore`)。
|
|
82
|
+
- `src/index.ts` 的导出列表,与 `docs/public-api.md` 中的 Public API 设计保持一致。
|
|
83
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: React Low-Code Engine npm-package 迁移与协作规则(供复制到 .cursor/rules 使用)
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
# React Low-Code Engine npm-package 规则(草案)
|
|
6
|
+
|
|
7
|
+
> 用途:这是为本项目准备的 Cursor 规则草案,**建议你将本文件内容复制到本机的 `.cursor/rules/` 目录下**,以便 Cursor 在会话开始时优先读取这些约定。
|
|
8
|
+
|
|
9
|
+
## 1. 作用范围
|
|
10
|
+
|
|
11
|
+
- 主要作用于:`Others/utils-lib/npm-package/**` 目录下的所有文件。
|
|
12
|
+
- 侧重内容:
|
|
13
|
+
- npm 包化的引擎核心能力(状态管理、renderer、schema、UIconfig 协议、插件机制)。
|
|
14
|
+
- 与 `react-low-code-engine` 主工程之间的边界与依赖。
|
|
15
|
+
|
|
16
|
+
## 2. 总体原则
|
|
17
|
+
|
|
18
|
+
- **先文档、后代码**:
|
|
19
|
+
- 任何结构性变更(目录调整、对外 API 变化)应先更新 `docs/migrate-plan.md` / `architecture.md`。
|
|
20
|
+
- 鼓励在实现前通过文档对齐思路,减少大范围重构。
|
|
21
|
+
- **保持可回滚**:
|
|
22
|
+
- 迁移时优先采取「复制 + 重构」方式,而不是直接剪切原始文件。
|
|
23
|
+
- 保持主工程中的旧实现可用,方便 A/B 测试与回退。
|
|
24
|
+
- **Public API 优先稳定**:
|
|
25
|
+
- 对外导出的 API(`src/index.ts`)一旦发布到 npm,非必要不做 breaking change。
|
|
26
|
+
- 如需重大变更,先在文档中标明「下一主版本变更计划」。
|
|
27
|
+
|
|
28
|
+
## 3. 代码风格与模块边界
|
|
29
|
+
|
|
30
|
+
- **模块划分建议**
|
|
31
|
+
- `src/core/`:仅包含与引擎生命周期、状态管理、命令系统强相关的逻辑。
|
|
32
|
+
- `src/renderer/`:仅负责「根据 schema 生成 React 节点树」,避免混入业务路由、鉴权等逻辑。
|
|
33
|
+
- `src/schema/`:定义 schema 类型、校验逻辑及默认值生成工具。
|
|
34
|
+
- `src/ui/`:承载与 UIconfig 协议相关的逻辑,将具体 UI 框架(如 antd、MUI)通过适配层隔离开。
|
|
35
|
+
- `src/plugins/`:统一插件注册与生命周期入口,避免在业务代码中直接操作内部插件表。
|
|
36
|
+
- **依赖方向**
|
|
37
|
+
- 允许:`core` 依赖 `schema` 类型。
|
|
38
|
+
- 不鼓励:`renderer` 反向依赖具体业务组件;应通过抽象/配置注入。
|
|
39
|
+
|
|
40
|
+
## 4. 与主工程的协作方式
|
|
41
|
+
|
|
42
|
+
- 任何从主工程迁移到 `npm-package` 的模块,需要满足:
|
|
43
|
+
- 不直接依赖业务路由、鉴权、具体 API 地址等信息。
|
|
44
|
+
- 对外通过参数/配置注入可变部分(例如后端接口、鉴权 token 获取方式)。
|
|
45
|
+
- 在迁移阶段,优先保证:
|
|
46
|
+
- 主工程仍可通过「旧路径」访问已有实现。
|
|
47
|
+
- 新实现通过 `npm link` / workspace 方式引入,逐步替换调用点。
|
|
48
|
+
|
|
49
|
+
## 5. AI 使用约定(给 Cursor 模型看的)
|
|
50
|
+
|
|
51
|
+
- 当你(AI)在 `Others/utils-lib/npm-package` 目录下工作时:
|
|
52
|
+
- **优先查看** `docs/migrate-plan.md` 与(如果存在的话)`docs/architecture.md`,再开始修改代码。
|
|
53
|
+
- 对于任何可能影响对外 API 的修改:
|
|
54
|
+
- 先在文档中增补「变更原因、影响范围、迁移方案」。
|
|
55
|
+
- 如果用户没有明确要求「立刻迁移代码」,优先:
|
|
56
|
+
- 更新迁移计划、补充 TODO 与接口设计草稿,
|
|
57
|
+
- 而不是擅自大规模搬运或重构。
|
|
58
|
+
|
|
59
|
+
## 6. 如何在本机启用本规则
|
|
60
|
+
|
|
61
|
+
- 建议在本机执行以下步骤(人工操作):
|
|
62
|
+
1. 在你的用户目录(例如 `~/.cursor/rules/`)下新建一个文件,例如:`react-low-code-engine-npm-package.mdc`。
|
|
63
|
+
2. 将本文件的全部内容复制过去并保存。
|
|
64
|
+
3. 重新打开本项目或新建与该项目相关的会话。
|
|
65
|
+
- 之后,Cursor 会在涉及该项目时优先参考这份规则文档。
|
|
66
|
+
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
## React Low-Code Engine → npm 包迁移规划
|
|
2
|
+
|
|
3
|
+
本计划用于指导将现有的 **React Low-Code Engine(schemaAI)相关功能**,逐步迁移到 `Others/utils-lib/npm-package` 目录下,打包成可发布到 npm 的独立库。当前阶段 **不迁移任何功能代码,只搭建骨架与约定**。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 目标与约束
|
|
8
|
+
|
|
9
|
+
- **目标**
|
|
10
|
+
- **提取通用的低代码引擎能力**(状态管理、schema 渲染器、组件协议等),发布为一个可复用的 npm 包。
|
|
11
|
+
- 支持在其他项目中通过 `import { ... } from '@your-scope/schemaAI'` 的方式消费。
|
|
12
|
+
- 保留现有项目中「应用层逻辑 / 具体业务配置」,避免与引擎核心强耦合。
|
|
13
|
+
- **约束**
|
|
14
|
+
- 迁移过程遵循 **小步快跑** 原则:先骨架、后接口、再内部实现。
|
|
15
|
+
- 保持现有 `react-low-code-engine` 运行不受影响(严禁一次性大改)。
|
|
16
|
+
- 优先保证 **向后兼容**:迁移过程中,新旧两套引用方式可并行存在一段时间。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. npm-package 目录目标结构
|
|
21
|
+
|
|
22
|
+
目标目录:`Others/utils-lib/npm-package`(当前阶段只创建目录和文档)
|
|
23
|
+
|
|
24
|
+
- `src/`
|
|
25
|
+
- `core/`:核心状态管理、撤销重做、命令系统。
|
|
26
|
+
- `renderer/`:schema 渲染器(React 组件树构建)。
|
|
27
|
+
- `schema/`:Schema 类型定义、校验与默认值。
|
|
28
|
+
- `ui/`:与 `UIconfig` 相关的 UI 原子样式 & 适配层。
|
|
29
|
+
- `plugins/`:插件机制入口、类型与注册系统。
|
|
30
|
+
- `index.ts`:对外导出统一入口(最终 npm 包主入口)。
|
|
31
|
+
- `config/`
|
|
32
|
+
- 构建工具配置(如 `tsconfig.json`、`rollup.config.mts` / `vite.config.ts` 等)。
|
|
33
|
+
- `scripts/`
|
|
34
|
+
- 发布脚本、构建脚本(例如 `build.mts`、`release.mts` 或简单的 Node 脚本)。
|
|
35
|
+
- `examples/`
|
|
36
|
+
- 使用示例:最小化 React 项目 / 代码片段,演示如何消费该 npm 包。
|
|
37
|
+
- `tests/`
|
|
38
|
+
- 针对核心模块的单元测试(可使用 Vitest / Jest)。
|
|
39
|
+
- `docs/`
|
|
40
|
+
- `migrate-plan.md`(本文件)
|
|
41
|
+
- `architecture.md`(后续补充:抽象后的 npm 包内部架构)
|
|
42
|
+
- `usage.md`(后续补充:npm 包使用说明)
|
|
43
|
+
|
|
44
|
+
> 说明:目录已通过命令预先创建(如存在),后续内容会逐步填充。
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 3. 分阶段迁移策略
|
|
49
|
+
|
|
50
|
+
### Phase 0:骨架与规则(当前阶段)
|
|
51
|
+
|
|
52
|
+
- [x] 在 `npm-package` 下创建基础目录结构(`src/`, `dist/`, `config/`, `scripts/`, `examples/`, `tests/`, `docs/`)。
|
|
53
|
+
- [ ] 起草 npm 包的 `package.json`(仅文档设计,不立即写入文件)。
|
|
54
|
+
- [x] 编写 `migrate-plan.md`,明确迁移边界、阶段与优先级。
|
|
55
|
+
- [x] 起草项目规则(Cursor `.cursor` 规则文档草案),统一 AI 辅助时的风格与约束。
|
|
56
|
+
|
|
57
|
+
### Phase 1:抽象边界与公共接口设计
|
|
58
|
+
|
|
59
|
+
- [x] 梳理当前 `react-low-code-engine` 中属于「引擎层」的模块(**示例清单,后续可补充/调整**):
|
|
60
|
+
- **核心状态管理与 command/undo 栈**
|
|
61
|
+
- `store/EditorStore.tsx`
|
|
62
|
+
- 负责:多页面管理(`Page`)、当前 `tree`、选中/hover 状态、撤销重做历史(`history.past/future`)、变量与 `runtimeValues`、modal/overlay 管理等。
|
|
63
|
+
- 逻辑上对应未来 npm 包中的 `createEngineStore` 能力。
|
|
64
|
+
- **Renderer(基于 schema 的 React 渲染)**
|
|
65
|
+
- `components/renderer/Renderer.tsx`
|
|
66
|
+
- 内部 `RenderNode` 等负责:依据 `NodeSchema` + `COMPONENT_REGISTRY` 渲染组件树,处理拖拽布局(`useDragDrop`)、选中/hover 高亮、容器布局(grid/flex 等)、事件绑定与执行(`executeUserCode`),以及基于 `nodeUtils` 的节点查找。
|
|
67
|
+
- 将来可抽象为 npm 包中的 `schemaAIRenderer` / 运行时渲染核心。
|
|
68
|
+
- **应用壳与多页面 orchestration(部分属于引擎层、部分是应用层)**
|
|
69
|
+
- `App.tsx`
|
|
70
|
+
- 引入 `EditorProvider`(基于 `EditorStore`)、`Canvas`、左/右侧面板、Dashboard 等。
|
|
71
|
+
- 负责:编辑器与 Dashboard 之间的路由切换、预览窗口打开、导入导出 schema(`ExportModal`)、撤销重做按钮等。
|
|
72
|
+
- 目前作为「应用壳」存在,其与引擎强相关的逻辑可在后续视情况提炼为可复用的 `schemaAI` 编辑器容器。
|
|
73
|
+
- **Schema 规范与 UIconfig 协议(待进一步梳理)**
|
|
74
|
+
- 预计涉及:
|
|
75
|
+
- 类型定义文件:`types.ts`(例如 `NodeSchema`, `Page`, `EventHandler`, `ThemeConfig`, `RBLayoutPercent` 等)。
|
|
76
|
+
- 与 UI 原子样式和布局配置相关的常量/工具:`constants` 中与 `COMPONENT_REGISTRY`、默认主题、布局比例等相关的部分。
|
|
77
|
+
- 文档层面的 UI 协议:`docs/UIconfig.md`。
|
|
78
|
+
- **插件机制及其生命周期(如图表、地图等)(待列出具体实现文件)**
|
|
79
|
+
- 已知入口(暂不迁移,仅在此标记):
|
|
80
|
+
- `plugins/runtimeRegistry.ts`:运行时组件注册与解析。
|
|
81
|
+
- `plugins` 目录下的具体插件实现(如 Recharts、MapLibre 等)。
|
|
82
|
+
- 目标:统一抽象为 npm 包 Public API 中的 `registerPlugin` / `createPlugin` 等。
|
|
83
|
+
- [x] 在文档中定义 **对外暴露的 Public API**(函数、组件、类型),形成初稿:
|
|
84
|
+
- `createEngineStore(...)`
|
|
85
|
+
- `<schemaAIRenderer schema={...} />`
|
|
86
|
+
- `registerPlugin(...)` 等。
|
|
87
|
+
// Public API 已在 `docs/public-api.md` 中维护,后续变更需同步更新该文档。
|
|
88
|
+
- [x] 明确哪些内容只作为 **内部实现**,不对外暴露(第一版约定):
|
|
89
|
+
- **内部实现优先**:
|
|
90
|
+
- `Canvas`、各类编辑器侧边栏面板、Dashboard、Orchestrator 等纯编辑器 UI。
|
|
91
|
+
- 与具体业务/后端接口强绑定的逻辑(如某些存储实现、业务路由)。
|
|
92
|
+
- 仅用于内部编辑器交互的 hook(如快捷键、面板展开状态等)。
|
|
93
|
+
- **公共 API 候选**:
|
|
94
|
+
- `EditorStore` 的精简版能力(对应 `createEngineStore`)。
|
|
95
|
+
- 运行态渲染入口(对应 `schemaAIRenderer`),以及未来的编辑态 Renderer 包装层。
|
|
96
|
+
- 通用 Schema 类型、UIconfig 协议、插件协议。
|
|
97
|
+
|
|
98
|
+
### Phase 2:代码迁移(只在计划确认后执行)
|
|
99
|
+
|
|
100
|
+
> 本阶段暂不实施,只在此做预演规划,后续单独执行。
|
|
101
|
+
|
|
102
|
+
- [ ] 从现有项目中 **复制**(非剪切)核心模块到 `src/` 对应目录,保持原始路径下仍可运行。
|
|
103
|
+
- [ ] 调整导出结构,使 `src/index.ts` 能对外导出稳定 API。
|
|
104
|
+
- [ ] 引入必要的构建配置(TS 编译、打包为 CJS/ESM),仍然只在 `npm-package` 内生效。
|
|
105
|
+
|
|
106
|
+
### Phase 3:本地验证与渐进集成
|
|
107
|
+
|
|
108
|
+
- [ ] 在 `examples/` 中新增一个小型 React 示例,使用 `npm-package` 提供的引擎能力。
|
|
109
|
+
- [ ] 在主工程中,选择一小块功能(例如单页面 renderer),改为从 `npm-package` 引入:
|
|
110
|
+
- 新路径:`import { Renderer } from '@your-scope/schemaAI'`
|
|
111
|
+
- 保留旧路径,便于 A/B 对比与回滚。
|
|
112
|
+
- [ ] 通过本地 `npm link` 或 `pnpm/yarn workspaces` 连接主工程与 `npm-package`。
|
|
113
|
+
|
|
114
|
+
### Phase 4:发布准备与 npm 发布
|
|
115
|
+
|
|
116
|
+
- [ ] 编写 `usage.md` 与对外 `README.md`(放在 `npm-package` 内)。
|
|
117
|
+
- [ ] 根据 `Others/utils-lib/examples` 下 `nzp-cli` 的 `PUBLISH.md` 和 `2FA_SETUP.md`,复用/裁剪一套 **发布 checklist**。
|
|
118
|
+
- [ ] 完成 `package.json` 中的:
|
|
119
|
+
- `name`, `version`, `main`, `module`, `types`, `files`, `scripts`, `repository`, `license` 等字段。
|
|
120
|
+
- [ ] 本地构建、自动化测试通过后,执行 `npm publish`(具体命令与 2FA 细节参照 `nzp-cli` 经验)。
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 4. 与现有工程的关系
|
|
125
|
+
|
|
126
|
+
- 迁移过程中,`react-low-code-engine` 仍然是主工程,`npm-package` 是一个「提炼出来的引擎子模块」。
|
|
127
|
+
- 优先把以下部分抽象为 npm 包能力:
|
|
128
|
+
- **通用引擎**:schema 驱动渲染、状态管理、命令系统。
|
|
129
|
+
- **插件协议**:统一插件注册/生命周期/配置格式。
|
|
130
|
+
- **UIconfig 协议**:与样式系统解耦,但暴露统一配置方式。
|
|
131
|
+
- 保持以下部分留在主工程中:
|
|
132
|
+
- 业务级 Dashboard、应用管理逻辑。
|
|
133
|
+
- 与具体业务绑定的 schema 模板。
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 5. 后续文档与协作约定
|
|
138
|
+
|
|
139
|
+
- 所有迁移决策(例如「某模块是否进入 npm 包」)应在本文件或 `docs/architecture.md` 中有简短记录。
|
|
140
|
+
- 每个 Phase 开始前,优先更新本计划,列出本阶段的「待确认问题」与「完成标准」。
|
|
141
|
+
- 如需调整目录结构或导出 API,优先更新:
|
|
142
|
+
- 本文件(迁移节奏与范围)
|
|
143
|
+
- `architecture.md`(结构 & 依赖关系)
|
|
144
|
+
- `usage.md`(对外使用方式)
|
|
145
|
+
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
## React Low-Code Engine npm 包 Public API 设计(初稿)
|
|
2
|
+
|
|
3
|
+
> 本文档仅定义 **目标 API 形态**,当前阶段不迁移代码,只用于在实现前对齐「对外怎么用」。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 包信息(预期)
|
|
8
|
+
|
|
9
|
+
- **包名(待定示例)**:`@your-scope/schemaAI`
|
|
10
|
+
- **入口文件**:
|
|
11
|
+
- `main`:`dist/index.cjs`
|
|
12
|
+
- `module`:`dist/index.esm.js`
|
|
13
|
+
- `types`:`dist/index.d.ts`
|
|
14
|
+
- **目标消费者**:
|
|
15
|
+
- React 应用(最低支持 React 18+)
|
|
16
|
+
- TypeScript 工程(完整类型导出)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. 顶层导出概览
|
|
21
|
+
|
|
22
|
+
假设用户在外部项目中的典型使用方式:
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import {
|
|
26
|
+
createEngineStore,
|
|
27
|
+
schemaAIProvider,
|
|
28
|
+
schemaAIRenderer,
|
|
29
|
+
registerPlugin,
|
|
30
|
+
defineComponentSchema,
|
|
31
|
+
useEngineState,
|
|
32
|
+
} from '@your-scope/schemaAI';
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
计划中的顶层导出主要分为几类:
|
|
36
|
+
|
|
37
|
+
- **引擎核心与状态管理**
|
|
38
|
+
- `createEngineStore`
|
|
39
|
+
- `schemaAIProvider`
|
|
40
|
+
- `useEngineState`
|
|
41
|
+
- **渲染与视图集成**
|
|
42
|
+
- `schemaAIRenderer`
|
|
43
|
+
- `schemaAICanvas`(可选,设计态/编辑器用)
|
|
44
|
+
- **插件与扩展机制**
|
|
45
|
+
- `registerPlugin`
|
|
46
|
+
- `createPlugin`
|
|
47
|
+
- **Schema 与 UI 协议**
|
|
48
|
+
- `defineComponentSchema`
|
|
49
|
+
- `createSchemaValidator`
|
|
50
|
+
- 类型导出:`EngineSchema`, `PageSchema`, `ComponentSchema`, `PluginDefinition`, `UIConfig` 等。
|
|
51
|
+
|
|
52
|
+
> 说明:下面每一节只定义接口形态和职责,不约束具体内部实现细节。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 3. 引擎核心与状态管理 API
|
|
57
|
+
|
|
58
|
+
### 3.1 `createEngineStore(options)`
|
|
59
|
+
|
|
60
|
+
**用途**:创建并配置一个引擎实例的核心状态容器,用于管理 schema、页面、变量、撤销/重做栈等。
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
import { createEngineStore } from '@your-scope/schemaAI';
|
|
64
|
+
|
|
65
|
+
const engine = createEngineStore({
|
|
66
|
+
initialSchema,
|
|
67
|
+
plugins,
|
|
68
|
+
historyLimit: 100,
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
- **入参(初稿)**:
|
|
73
|
+
- `initialSchema: EngineSchema`:初始应用 schema(包含页面、组件树等)。
|
|
74
|
+
- `plugins?: PluginDefinition[]`:预注册的插件列表。
|
|
75
|
+
- `historyLimit?: number`:撤销/重做历史长度上限。
|
|
76
|
+
- **返回(初稿)**:
|
|
77
|
+
- `store` 对象,封装以下能力:
|
|
78
|
+
- `getState(): EngineState`
|
|
79
|
+
- `subscribe(listener: (state: EngineState) => void): () => void`
|
|
80
|
+
- `dispatch(command: EngineCommand): void`
|
|
81
|
+
- `undo(): void`
|
|
82
|
+
- `redo(): void`
|
|
83
|
+
|
|
84
|
+
> 后续可在实现阶段,根据现有状态管理方案(如 Zustand/Redux/自研)做适配,但对外保持上述抽象不变。
|
|
85
|
+
|
|
86
|
+
### 3.2 `schemaAIProvider`
|
|
87
|
+
|
|
88
|
+
**用途**:在 React 组件树中注入引擎上下文,方便子组件消费状态和命令。
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
import { schemaAIProvider, createEngineStore } from '@your-scope/schemaAI';
|
|
92
|
+
|
|
93
|
+
const engine = createEngineStore({ initialSchema });
|
|
94
|
+
|
|
95
|
+
export function App() {
|
|
96
|
+
return (
|
|
97
|
+
<schemaAIProvider engine={engine}>
|
|
98
|
+
{/* 运行时或编辑器 UI */}
|
|
99
|
+
</schemaAIProvider>
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- **Props(初稿)**:
|
|
105
|
+
- `engine: EngineStore`:由 `createEngineStore` 创建的引擎实例。
|
|
106
|
+
- 可选 `children: ReactNode`。
|
|
107
|
+
|
|
108
|
+
### 3.3 `useEngineState(selector?)`
|
|
109
|
+
|
|
110
|
+
**用途**:在 React 组件中访问引擎状态,并支持选择器优化。
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
import { useEngineState } from '@your-scope/schemaAI';
|
|
114
|
+
|
|
115
|
+
function CurrentPageTitle() {
|
|
116
|
+
const title = useEngineState((state) => state.currentPage.title);
|
|
117
|
+
return <h1>{title}</h1>;
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
- **签名(初稿)**:
|
|
122
|
+
- `useEngineState<TSelected>(selector?: (state: EngineState) => TSelected): TSelected`
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 4. 渲染与视图集成 API
|
|
127
|
+
|
|
128
|
+
### 4.1 `schemaAIRenderer`
|
|
129
|
+
|
|
130
|
+
**用途**:根据传入的 schema 和上下文,将低代码描述渲染为真实的 React 组件树。可用于「运行态预览」或集成到业务页面中。
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
import { schemaAIRenderer } from '@your-scope/schemaAI';
|
|
134
|
+
|
|
135
|
+
function RuntimeView() {
|
|
136
|
+
return (
|
|
137
|
+
<schemaAIRenderer
|
|
138
|
+
schema={runtimeSchema}
|
|
139
|
+
pageId="home"
|
|
140
|
+
mode="runtime"
|
|
141
|
+
/>
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
- **Props(初稿)**:
|
|
147
|
+
- `schema: EngineSchema`:必填,当前要渲染的应用/页面 schema。
|
|
148
|
+
- `pageId?: string`:当前页面 ID;不填时可用 schema 内默认页。
|
|
149
|
+
- `mode?: 'runtime' | 'design'`:渲染模式(运行态/编辑态)。
|
|
150
|
+
- `onEvent?: (event: EngineEvent) => void`:运行时事件回调(如按钮点击、路由跳转等)。
|
|
151
|
+
- `componentsOverride?: Record<string, React.ComponentType<any>>`:允许外部替换部分组件实现。
|
|
152
|
+
|
|
153
|
+
### 4.2 `schemaAICanvas`(可选)
|
|
154
|
+
|
|
155
|
+
**用途**:专用于设计器场景的画布组件,支持选中、高亮、拖拽等 UI 反馈。
|
|
156
|
+
当前仅作为规划占位,具体 Props 和行为待后续基于现有编辑器实现进一步抽象。
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 5. 插件与扩展机制 API
|
|
161
|
+
|
|
162
|
+
### 5.1 `registerPlugin(plugin)`
|
|
163
|
+
|
|
164
|
+
**用途**:注册一个插件,使引擎能够识别新的组件类型、数据源或行为。
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
import { registerPlugin } from '@your-scope/schemaAI';
|
|
168
|
+
|
|
169
|
+
registerPlugin({
|
|
170
|
+
name: 'recharts-basic',
|
|
171
|
+
components: [/* ... */],
|
|
172
|
+
dataSources: [/* ... */],
|
|
173
|
+
});
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
- **入参(初稿)**:
|
|
177
|
+
- `plugin: PluginDefinition`
|
|
178
|
+
- `name: string`
|
|
179
|
+
- `components?: ComponentDefinition[]`
|
|
180
|
+
- `dataSources?: DataSourceDefinition[]`
|
|
181
|
+
- 其他扩展点:指令、动作、事件处理器等。
|
|
182
|
+
|
|
183
|
+
> 具体内部注册方式(全局/按引擎实例)在实现阶段细化,但对外保持 `registerPlugin` 这种使用方式。
|
|
184
|
+
|
|
185
|
+
### 5.2 `createPlugin(options)`
|
|
186
|
+
|
|
187
|
+
**用途**:帮助用户使用类型安全的方式创建插件定义。
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
import { createPlugin } from '@your-scope/schemaAI';
|
|
191
|
+
|
|
192
|
+
const RechartsPlugin = createPlugin({
|
|
193
|
+
name: 'recharts-basic',
|
|
194
|
+
components: [/* ... */],
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
- **入参/返回**:包装 `PluginDefinition`,提供更好的类型提示和默认值。
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 6. Schema 与 UI 协议 API
|
|
203
|
+
|
|
204
|
+
### 6.1 `defineComponentSchema(definition)`
|
|
205
|
+
|
|
206
|
+
**用途**:声明一个组件在引擎中的 schema 形态(props、事件、插槽、样式配置等),同时为编辑器和运行时提供统一的元数据。
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
import { defineComponentSchema } from '@your-scope/schemaAI';
|
|
210
|
+
|
|
211
|
+
export const ButtonSchema = defineComponentSchema({
|
|
212
|
+
type: 'button',
|
|
213
|
+
displayName: 'Button',
|
|
214
|
+
props: {
|
|
215
|
+
text: { type: 'string', default: 'Button' },
|
|
216
|
+
variant: { type: 'enum', options: ['primary', 'secondary'], default: 'primary' },
|
|
217
|
+
},
|
|
218
|
+
events: {
|
|
219
|
+
onClick: { description: 'Click event' },
|
|
220
|
+
},
|
|
221
|
+
uiConfig: {
|
|
222
|
+
/* 与 UIconfig 绑定的原子样式配置 */
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
- **入参(初稿)**:
|
|
228
|
+
- `definition: ComponentSchemaDefinition`:
|
|
229
|
+
- `type: string`
|
|
230
|
+
- `displayName?: string`
|
|
231
|
+
- `props?: Record<string, PropDefinition>`
|
|
232
|
+
- `events?: Record<string, EventDefinition>`
|
|
233
|
+
- `slots?: Record<string, SlotDefinition>`
|
|
234
|
+
- `uiConfig?: UIConfig`
|
|
235
|
+
- **返回**:
|
|
236
|
+
- 标准化后的 `ComponentSchema`,可用于插件注册与渲染。
|
|
237
|
+
|
|
238
|
+
### 6.2 `createSchemaValidator(options)`
|
|
239
|
+
|
|
240
|
+
**用途**:创建一个针对 EngineSchema 的校验器,用于在保存、导入或 AI 修改 schema 时进行检查。
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
import { createSchemaValidator } from '@your-scope/schemaAI';
|
|
244
|
+
|
|
245
|
+
const validate = createSchemaValidator({ plugins: [RechartsPlugin] });
|
|
246
|
+
|
|
247
|
+
const result = validate(schema);
|
|
248
|
+
if (!result.valid) {
|
|
249
|
+
console.error(result.errors);
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
- **返回结果(初稿)**:
|
|
254
|
+
- `{ valid: boolean; errors: SchemaValidationError[] }`
|
|
255
|
+
|
|
256
|
+
### 6.3 类型导出
|
|
257
|
+
|
|
258
|
+
为方便 TS 项目使用,计划导出常用类型:
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
import type {
|
|
262
|
+
EngineSchema,
|
|
263
|
+
PageSchema,
|
|
264
|
+
ComponentSchema,
|
|
265
|
+
EngineState,
|
|
266
|
+
EngineCommand,
|
|
267
|
+
PluginDefinition,
|
|
268
|
+
UIConfig,
|
|
269
|
+
} from '@your-scope/schemaAI';
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## 7. 未来可能扩展的 API(占位)
|
|
275
|
+
|
|
276
|
+
- **AI 相关接口**(待基于现有实现抽象):
|
|
277
|
+
- `applyAiSuggestion(schema, suggestion)`:对 schema 应用 AI 生成的变更。
|
|
278
|
+
- `diffSchemas(a, b)`:用于展示差异或生成变更说明。
|
|
279
|
+
- **跨页面路由与数据绑定**:
|
|
280
|
+
- `navigate(pageId, params)`:在运行时中触发页面跳转。
|
|
281
|
+
- 相关 hook,如 `useCurrentRoute`, `useBoundData(sourceRef)`。
|
|
282
|
+
|
|
283
|
+
> 这些暂时只作为「方向占位」,在实际实现前需要结合当前代码进一步细化。
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 8. 使用建议与版本策略(草案)
|
|
288
|
+
|
|
289
|
+
- **版本号策略**:
|
|
290
|
+
- 初始版本建议为 `0.x`,用于快速迭代设计。
|
|
291
|
+
- 当 Public API 相对稳定且已有外部项目依赖后,发布 `1.0.0`。
|
|
292
|
+
- **变更流程建议**:
|
|
293
|
+
- 任意可能影响上述 Public API 的变更:
|
|
294
|
+
- 先在本文件中更新接口说明;
|
|
295
|
+
- 在 `migrate-plan.md` 标注对应 Phase/里程碑;
|
|
296
|
+
- 再进行代码层实现与发布。
|
|
297
|
+
|