From fb6bdb4520a5f782464354422fdabcb0ffa8b86b Mon Sep 17 00:00:00 2001 From: mazhaobo Date: Wed, 16 Oct 2024 17:06:15 +0800 Subject: [PATCH 01/75] =?UTF-8?q?feat(engine):=20=E5=BC=80=E6=94=BEworkben?= =?UTF-8?q?ch=E8=87=AA=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit init参数增加WorkSpaceWorkbench和Workspace,以替换内置的框架结构 --- packages/engine/src/engine-core.ts | 14 +++++++---- packages/shell/src/api/common.tsx | 7 +++--- .../types/src/shell/type/engine-options.ts | 23 +++++++++++++------ 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/packages/engine/src/engine-core.ts b/packages/engine/src/engine-core.ts index 3b4f3edaab..48b4a21c24 100644 --- a/packages/engine/src/engine-core.ts +++ b/packages/engine/src/engine-core.ts @@ -30,7 +30,11 @@ import { PluginPreference, IDesigner, } from '@felce/lowcode-designer'; -import { Skeleton as InnerSkeleton, registerDefaults } from '@felce/lowcode-editor-skeleton'; +import { + Skeleton as InnerSkeleton, + registerDefaults, + ISkeleton, +} from '@felce/lowcode-editor-skeleton'; import { Workspace as InnerWorkspace, Workbench as WorkSpaceWorkbench, @@ -108,10 +112,10 @@ globalContext.register(innerWorkspace, 'workspace'); const engineContext: Partial = {}; -const innerSkeleton = new InnerSkeleton(editor); +const innerSkeleton: ISkeleton = new InnerSkeleton(editor); editor.set('skeleton' as any, innerSkeleton); -const designer = new Designer({ editor, shellModelFactory }); +const designer: IDesigner = new Designer({ editor, shellModelFactory }); editor.set('designer' as any, designer); const { project: innerProject } = designer; @@ -248,7 +252,7 @@ export async function init( const disposeFun = await pluginPromise; disposeFun && disposeFun(); render( - createElement(WorkSpaceWorkbench, { + createElement(options?.WorkSpaceWorkbench || WorkSpaceWorkbench, { workspace: innerWorkspace, // skeleton: workspace.skeleton, className: 'engine-main', @@ -267,7 +271,7 @@ export async function init( await plugins.init(pluginPreference as any); render( - createElement(Workbench, { + createElement(options?.Workbench || Workbench, { skeleton: innerSkeleton, className: 'engine-main', topAreaItemClassName: 'engine-actionitem', diff --git a/packages/shell/src/api/common.tsx b/packages/shell/src/api/common.tsx index eee286fe5c..a5a3a2fc8c 100644 --- a/packages/shell/src/api/common.tsx +++ b/packages/shell/src/api/common.tsx @@ -59,6 +59,7 @@ import { Workbench as InnerWorkbench, SettingsPrimaryPane as InnerSettingsPrimaryPane, registerDefaults as InnerRegisterDefaults, + ISkeleton, } from '@felce/lowcode-editor-skeleton'; import { Editor, @@ -180,11 +181,11 @@ class DesignerCabin implements IPublicApiCommonDesignerCabin { } class SkeletonCabin implements IPublicApiCommonSkeletonCabin { - private readonly [skeletonSymbol]: InnerSkeleton; + private readonly [skeletonSymbol]: ISkeleton; readonly [skeletonCabinSymbol]: any; - constructor(skeleton: InnerSkeleton) { + constructor(skeleton: ISkeleton) { this[skeletonSymbol] = skeleton; this[skeletonCabinSymbol] = { Workbench: InnerWorkbench, @@ -430,7 +431,7 @@ export class Common implements IPublicApiCommon { private readonly __editorCabin: any; private readonly __utils: Utils; - constructor(editor: Editor, skeleton: InnerSkeleton) { + constructor(editor: Editor, skeleton: ISkeleton) { this.__designerCabin = new DesignerCabin(editor); this.__skeletonCabin = new SkeletonCabin(skeleton); this.__editorCabin = new EditorCabin(editor); diff --git a/packages/types/src/shell/type/engine-options.ts b/packages/types/src/shell/type/engine-options.ts index 8221c4089c..39b180bad5 100644 --- a/packages/types/src/shell/type/engine-options.ts +++ b/packages/types/src/shell/type/engine-options.ts @@ -1,8 +1,7 @@ import { RequestHandlersMap } from '@alilc/lowcode-datasource-types'; -import { ComponentType } from 'react'; +import { ComponentType, ReactNode } from 'react'; export interface IPublicTypeEngineOptions { - /** * 是否开启 condition 的能力,默认在设计器中不管 condition 是啥都正常展示 * when this is true, node that configured as conditional not renderring @@ -75,7 +74,10 @@ export interface IPublicTypeEngineOptions { /** * 定制画布中点击被忽略的 selectors,默认值:undefined */ - customizeIgnoreSelectors?: (defaultIgnoreSelectors: string[], e: MouseEvent) => string[]; + customizeIgnoreSelectors?: ( + defaultIgnoreSelectors: string[], + e: MouseEvent, + ) => string[]; /** * 禁止默认的设置面板,默认值:false @@ -137,7 +139,6 @@ export interface IPublicTypeEngineOptions { * 与 react-renderer 的 appHelper 一致,https://lowcode-engine.cn/site/docs/guide/expand/runtime/renderer#apphelper */ appHelper?: { - /** 全局公共函数 */ utils?: Record; @@ -189,11 +190,19 @@ export interface IPublicTypeEngineOptions { * 隐藏设计器辅助层 */ hideComponentAction?: boolean; + + /** + * 自定义的 WorkSpaceWorkbench + */ + WorkSpaceWorkbench?: ReactNode; + + /** + * 自定义的 Workbench + */ + Workbench?: ReactNode; } /** * @deprecated use IPublicTypeEngineOptions instead */ -export interface EngineOptions { - -} \ No newline at end of file +export interface EngineOptions {} From 32c4d4532e018062629157084d41563510da33c2 Mon Sep 17 00:00:00 2001 From: taojiu Date: Wed, 16 Oct 2024 18:14:45 +0800 Subject: [PATCH 02/75] =?UTF-8?q?docs:=20=E6=9B=B4=E6=94=B9cdn=E5=9C=B0?= =?UTF-8?q?=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/docs/api/setters.md | 2 +- docs/docs/guide/create/useEditor.md | 22 +++++++++++++++------- docs/docs/guide/design/setter.md | 2 +- docs/docs/participate/index.md | 8 ++++---- packages/engine/README-en_US.md | 14 +++++++------- packages/engine/README.md | 14 +++++++------- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/docs/docs/api/setters.md b/docs/docs/api/setters.md index 9b3c9d705d..4e1eac744f 100644 --- a/docs/docs/api/setters.md +++ b/docs/docs/api/setters.md @@ -73,7 +73,7 @@ registerSetter( ```typescript import { setters, skeleton } from '@felce/lowcode-engine'; -import { setterMap, pluginMap } from '@alilc/lowcode-engine-ext'; +import { setterMap, pluginMap } from '@felce/lowcode-engine-ext'; import { IPublicModelPluginContext } from '@felce/lowcode-types'; const SetterRegistry = (ctx: IPublicModelPluginContext) => { diff --git a/docs/docs/guide/create/useEditor.md b/docs/docs/guide/create/useEditor.md index 151e6cd5af..91b6c6538a 100644 --- a/docs/docs/guide/create/useEditor.md +++ b/docs/docs/guide/create/useEditor.md @@ -13,9 +13,11 @@ sidebar_position: 0 1. 确保本地安装了 Node.js 和 npm,如果没有,[您可以通过 nvm 进行快捷的安装](https://github.com/nvm-sh/nvm) 2. 确保为 npm [设置了可以访问的 npm 源,保证安装过程无网络问题](https://npmmirror.com/) 3. 安装官方命令行工具 + ```bash npm install -g @alilc/create-element@latest ``` + 4. 通过命令行工具创建 ```bash @@ -31,17 +33,23 @@ sidebar_position: 0 > 注 @alilc/create-element 版本需 >= 1.0.4,若看不到`编辑器`选项,请重新执行步骤 3 5. 进入创建后的目录 + ```bash cd editor-project-name ``` + 6. 安装依赖 + ```bash npm install ``` + 7. 安装依赖成功后,启动项目 (注意观察上一步的输出,如有 error 等失败信息,请先进行排查) + ```bash npm start ``` + 执行后如果看到这个界面,说明项目启动成功。您可以继续看后续章节了。本章节后续内容均为高级配置方式。 ![image.png](https://img.alicdn.com/imgextra/i4/O1CN013qJVoV1OAcFNKFrIQ_!!6000000001665-2-tps-3060-1634.png) @@ -60,7 +68,7 @@ sidebar_position: 0 @@ -72,7 +80,7 @@ sidebar_position: 0 @@ -91,18 +99,18 @@ sidebar_position: 0 ``` -> 注:如果 unpkg 的服务比较缓慢,您可以使用官方 CDN 来获得确定版本的低代码引擎,如对于引擎的 1.0.18 版本,可用以下官方 CDN 替代 +> 注:如果 unpkg 的服务比较缓慢,您可以使用官方 cnpm CDN 来获得确定版本的低代码引擎,如对于引擎的 1.4.0 版本,可用以下cnpm CDN 替代 > -> - [https://uipaas-assets.com/prod/npm/@felce/lowcode-engine/1.0.18/dist/js/engine-core.js](https://uipaas-assets.com/prod/npm/@felce/lowcode-engine/1.0.18/dist/js/engine-core.js) +> - [https://registry.npmmirror.com/@felce/lowcode-engine/1.4.0/files/dist/js/engine-core.js](https://registry.npmmirror.com/@felce/lowcode-engine/1.4.0/files/dist/js/engine-core.js) ### 配置打包 @@ -116,7 +124,7 @@ sidebar_position: 0 "prop-types": "var window.PropTypes", "@alifd/next": "var window.Next", "@felce/lowcode-engine": "var window.AliLowCodeEngine", - "@alilc/lowcode-engine-ext": "var window.AliLowCodeEngineExt", + "@felce/lowcode-engine-ext": "var window.AliLowCodeEngineExt", "moment": "var window.moment", "lodash": "var window._" } diff --git a/docs/docs/guide/design/setter.md b/docs/docs/guide/design/setter.md index 62b795d9b7..5bd6c33ad4 100644 --- a/docs/docs/guide/design/setter.md +++ b/docs/docs/guide/design/setter.md @@ -18,7 +18,7 @@ sidebar_position: 6 ## npm 包与仓库信息 -- npm 包:@alilc/lowcode-engine-ext +- npm 包:@felce/lowcode-engine-ext - 仓库:[https://github.com/fe-lce/lowcode-engine-ext](https://github.com/fe-lce/lowcode-engine-ext) ## 设置器模块原理 diff --git a/docs/docs/participate/index.md b/docs/docs/participate/index.md index 1a602a73bf..f468bad42a 100644 --- a/docs/docs/participate/index.md +++ b/docs/docs/participate/index.md @@ -34,19 +34,19 @@ npm install && npm run setup { "proxy": [ [ - "https://uipaas-assets.com/prod/npm/@felce/lowcode-engine/(.*)/dist/js/engine-core.js", + "https://registry.npmmirror.com/@felce/lowcode-engine/(.*)/dist/js/engine-core.js", "http://localhost:5555/js/AliLowCodeEngine.js" ], [ - "https://uipaas-assets.com/prod/npm/@felce/lowcode-engine/(.*)/dist/css/engine-core.css", + "https://registry.npmmirror.com/@felce/lowcode-engine/(.*)/dist/css/engine-core.css", "http://localhost:5555/css/AliLowCodeEngine.css" ], [ - "https?://uipaas-assets.com/prod/npm/@felce/lowcode-engine/(.*)/dist/js/react-simulator-renderer.js", + "https://registry.npmmirror.com/@felce/lowcode-engine/(.*)/dist/js/react-simulator-renderer.js", "http://localhost:5555/js/ReactSimulatorRenderer.js" ], [ - "https?://uipaas-assets.com/prod/npm/@felce/lowcode-engine/(.*)/dist/css/react-simulator-renderer.css", + "https://registry.npmmirror.com/@felce/lowcode-engine/(.*)/dist/css/react-simulator-renderer.css", "http://localhost:5555/css/ReactSimulatorRenderer.css" ] ] diff --git a/packages/engine/README-en_US.md b/packages/engine/README-en_US.md index 6f889e5e5b..c08b1e64f7 100644 --- a/packages/engine/README-en_US.md +++ b/packages/engine/README-en_US.md @@ -101,7 +101,7 @@ init(document.getElementById('lce')); { "externals": { "@felce/lowcode-engine": "var window.AliLowCodeEngine", - "@alilc/lowcode-engine-ext": "var window.AliLowCodeEngineExt" + "@felce/lowcode-engine-ext": "var window.AliLowCodeEngineExt" } } ``` @@ -111,22 +111,22 @@ init(document.getElementById('lce')); #### unpkg ```html -https://unpkg.com/@felce/lowcode-engine@1.4.0-beta.0/dist/js/engine-core.js -https://unpkg.com/@felce/lowcode-react-simulator-renderer@1.4.0-beta.0/dist/js/react-simulator-renderer.js +https://unpkg.com/@felce/lowcode-engine@1.4.0/dist/js/engine-core.js +https://unpkg.com/@felce/lowcode-react-simulator-renderer@1.4.0/dist/js/react-simulator-renderer.js ``` #### npmmirror ```html -https://registry.npmmirror.com/@felce/lowcode-engine/1.4.0-beta.0/files/dist/js/engine-core.js -https://registry.npmmirror.com/@felce/lowcode-react-simulator-renderer/1.4.0-beta.0/files/dist/js/react-simulator-renderer.js +https://registry.npmmirror.com/@felce/lowcode-engine/1.4.0/files/dist/js/engine-core.js +https://registry.npmmirror.com/@felce/lowcode-react-simulator-renderer/1.4.0/files/dist/js/react-simulator-renderer.js ``` #### jsdelivr ```html -https://cdn.jsdelivr.net/npm/@felce/lowcode-engine@1.4.0-beta.0/dist/js/engine-core.js -https://cdn.jsdelivr.net/npm/@felce/lowcode-react-simulator-renderer@1.4.0-beta.0/dist/js/react-simulator-renderer.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-engine@1.4.0/dist/js/engine-core.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-react-simulator-renderer@1.4.0/dist/js/react-simulator-renderer.js ``` #### Method 5: Use your own cdn diff --git a/packages/engine/README.md b/packages/engine/README.md index e4a896ff98..ee9b288a1e 100644 --- a/packages/engine/README.md +++ b/packages/engine/README.md @@ -112,7 +112,7 @@ init(document.getElementById('lce')); { "externals": { "@felce/lowcode-engine": "var window.AliLowCodeEngine", - "@alilc/lowcode-engine-ext": "var window.AliLowCodeEngineExt" + "@felce/lowcode-engine-ext": "var window.AliLowCodeEngineExt" } } ``` @@ -122,22 +122,22 @@ init(document.getElementById('lce')); #### unpkg ```html -https://unpkg.com/@felce/lowcode-engine@1.4.0-beta.0/dist/js/engine-core.js -https://unpkg.com/@felce/lowcode-react-simulator-renderer@1.4.0-beta.0/dist/js/react-simulator-renderer.js +https://unpkg.com/@felce/lowcode-engine@1.4.0/dist/js/engine-core.js +https://unpkg.com/@felce/lowcode-react-simulator-renderer@1.4.0/dist/js/react-simulator-renderer.js ``` #### npmmirror ```html -https://registry.npmmirror.com/@felce/lowcode-engine/1.4.0-beta.0/files/dist/js/engine-core.js -https://registry.npmmirror.com/@felce/lowcode-react-simulator-renderer/1.4.0-beta.0/files/dist/js/react-simulator-renderer.js +https://registry.npmmirror.com/@felce/lowcode-engine/1.4.0/files/dist/js/engine-core.js +https://registry.npmmirror.com/@felce/lowcode-react-simulator-renderer/1.4.0/files/dist/js/react-simulator-renderer.js ``` #### jsdelivr ```html -https://cdn.jsdelivr.net/npm/@felce/lowcode-engine@1.4.0-beta.0/dist/js/engine-core.js -https://cdn.jsdelivr.net/npm/@felce/lowcode-react-simulator-renderer@1.4.0-beta.0/dist/js/react-simulator-renderer.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-engine@1.4.0/dist/js/engine-core.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-react-simulator-renderer@1.4.0/dist/js/react-simulator-renderer.js ``` #### 使用自有 cdn From dd25dccdeb2be16fb4e6b36249300946d889f980 Mon Sep 17 00:00:00 2001 From: taojiu Date: Wed, 16 Oct 2024 18:15:15 +0800 Subject: [PATCH 03/75] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=94=B9ext?= =?UTF-8?q?=E6=8C=87=E5=90=91=E5=88=B0felce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/engine/build.umd.json | 2 +- packages/engine/package.json | 2 +- packages/engine/src/inner-plugins/setter-registry.ts | 2 +- packages/ignitor/build.json | 2 +- packages/react-simulator-renderer/build.umd.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/engine/build.umd.json b/packages/engine/build.umd.json index 92d5a1bfd3..32d150b215 100644 --- a/packages/engine/build.umd.json +++ b/packages/engine/build.umd.json @@ -15,7 +15,7 @@ "monaco-editor/esm/vs/editor/editor.api": "var window.monaco", "monaco-editor/esm/vs/editor/editor.main.js": "var window.monaco", "@alifd/next": "var Next", - "@alilc/lowcode-engine-ext": "var window.AliLowCodeEngineExt", + "@felce/lowcode-engine-ext": "var window.AliLowCodeEngineExt", "moment": "var moment", "lodash": "var _" }, diff --git a/packages/engine/package.json b/packages/engine/package.json index b6e167d96e..a9eddba852 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -19,7 +19,7 @@ "license": "MIT", "dependencies": { "@alifd/next": "^1.26.0", - "@alilc/lowcode-engine-ext": "^1.0.0", + "@felce/lowcode-engine-ext": "^1.1.0", "@felce/lowcode-designer": "1.4.0", "@felce/lowcode-editor-core": "1.4.0", "@felce/lowcode-editor-skeleton": "1.4.0", diff --git a/packages/engine/src/inner-plugins/setter-registry.ts b/packages/engine/src/inner-plugins/setter-registry.ts index cdb6092d14..e2c857642d 100644 --- a/packages/engine/src/inner-plugins/setter-registry.ts +++ b/packages/engine/src/inner-plugins/setter-registry.ts @@ -6,7 +6,7 @@ export const setterRegistry = (ctx: IPublicModelPluginContext) => { init() { const { config } = ctx; if (config.get('disableDefaultSetters')) return; - const builtinSetters = require('@alilc/lowcode-engine-ext')?.setters; + const builtinSetters = require('@felce/lowcode-engine-ext')?.setters; if (builtinSetters) { ctx.setters.registerSetter(builtinSetters); } diff --git a/packages/ignitor/build.json b/packages/ignitor/build.json index 5b7ec07d65..6055d193ba 100644 --- a/packages/ignitor/build.json +++ b/packages/ignitor/build.json @@ -17,7 +17,7 @@ "@alifd/next": "var window.Next", "rax": "var window.Rax", "@felce/lowcode-engine": "var window.AliLowCodeEngine", - "@alilc/lowcode-engine-ext": "var window.AliLowCodeEngineExt", + "@felce/lowcode-engine-ext": "var window.AliLowCodeEngineExt", "moment": "var moment", "lodash": "var _" }, diff --git a/packages/react-simulator-renderer/build.umd.json b/packages/react-simulator-renderer/build.umd.json index 1052bb0765..ff20a23782 100644 --- a/packages/react-simulator-renderer/build.umd.json +++ b/packages/react-simulator-renderer/build.umd.json @@ -10,7 +10,7 @@ "react-dom": "var window.ReactDOM", "prop-types": "var window.PropTypes", "@alifd/next": "var Next", - "@alilc/lowcode-engine-ext": "var window.AliLowCodeEngineExt", + "@felce/lowcode-engine-ext": "var window.AliLowCodeEngineExt", "moment": "var moment", "lodash": "var _" }, From c885587d2b67ab2095bc5f760ea8620d251fe380 Mon Sep 17 00:00:00 2001 From: taojiu Date: Mon, 21 Oct 2024 22:49:07 +0800 Subject: [PATCH 04/75] =?UTF-8?q?chore:=20=E4=BF=AE=E5=A4=8D=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=AE=9A=E4=B9=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除dragon中不再支持的util,修改相关引用 --- packages/designer/src/context-menu-actions.ts | 29 ++++++---- .../designer/src/designer/active-tracker.ts | 7 ++- packages/designer/src/designer/designer.ts | 18 ++++--- .../src/designer/drag-ghost/index.tsx | 18 ++++--- packages/designer/src/designer/dragon.ts | 54 +++++-------------- .../designer/src/document/document-view.tsx | 9 ++-- .../designer/tests/designer/dragon.test.ts | 4 +- packages/editor-skeleton/src/area.ts | 23 ++++---- packages/editor-skeleton/src/skeleton.ts | 9 ++-- packages/editor-skeleton/src/widget/widget.ts | 24 ++------- packages/plugin-designer/src/index.tsx | 3 ++ packages/types/src/shell/model/area.ts | 8 +++ packages/types/src/shell/model/drag-object.ts | 4 +- packages/types/src/shell/model/dragon.ts | 29 +++++++--- packages/types/src/shell/model/index.ts | 2 + packages/types/src/shell/model/widget.ts | 23 ++++++++ packages/utils/src/is-plain-object.ts | 2 +- 17 files changed, 143 insertions(+), 123 deletions(-) create mode 100644 packages/types/src/shell/model/area.ts create mode 100644 packages/types/src/shell/model/widget.ts diff --git a/packages/designer/src/context-menu-actions.ts b/packages/designer/src/context-menu-actions.ts index 4bb052aa3a..17a277dd22 100644 --- a/packages/designer/src/context-menu-actions.ts +++ b/packages/designer/src/context-menu-actions.ts @@ -19,7 +19,7 @@ import './context-menu-actions.scss'; export interface IContextMenuActions { actions: IPublicTypeContextMenuAction[]; - adjustMenuLayoutFn: (actions: IPublicTypeContextMenuItem[]) => IPublicTypeContextMenuItem[]; + // adjustMenuLayoutFn: (actions: IPublicTypeContextMenuItem[]) => IPublicTypeContextMenuItem[]; addMenuAction: IPublicApiMaterial['addContextMenuOption']; @@ -57,7 +57,11 @@ export class GlobalContextMenuActions { event.preventDefault(); const actions: IPublicTypeContextMenuAction[] = []; - let contextMenu: ContextMenuActions = this.contextMenuActionsMap.values().next().value; + let contextMenu: ContextMenuActions | undefined = this.contextMenuActionsMap + .values() + .next().value; + if (!contextMenu) return; + this.contextMenuActionsMap.forEach((contextMenu) => { actions.push(...contextMenu.actions); }); @@ -90,12 +94,17 @@ export class GlobalContextMenuActions { pluginContext, }); - const target = event.target; + const target = event.target as HTMLElement; + + if (!target) { + console.warn('context menu target is null'); + return; + } - const { top, left } = target?.getBoundingClientRect(); + const { top, left } = target.getBoundingClientRect(); const menuInstance = Menu.create({ - target: event.target, + target: target, offset: [event.clientX - left, event.clientY - top], children: menuNode, className: 'engine-context-menu', @@ -177,7 +186,7 @@ export class ContextMenuActions implements IContextMenuActions { ) as IPublicModelPluginContext; const menus: IPublicTypeContextMenuItem[] = parseContextMenuProperties(actions, { - nodes: nodes.map((d) => designer.shellModelFactory.createNode(d)!), + nodes: nodes.map((d) => designer.shellModelFactory!.createNode(d)!), destroy, event, pluginContext, @@ -191,7 +200,7 @@ export class ContextMenuActions implements IContextMenuActions { const menuNode = parseContextMenuAsReactNode(layoutMenu, { destroy, - nodes: nodes.map((d) => designer.shellModelFactory.createNode(d)!), + nodes: nodes.map((d) => designer.shellModelFactory!.createNode(d)!), pluginContext, }); @@ -210,10 +219,10 @@ export class ContextMenuActions implements IContextMenuActions { originalEvent.stopPropagation(); originalEvent.preventDefault(); // 如果右键的节点不在 当前选中的节点中,选中该节点 - if (!designer.currentSelection.has(node.id)) { - designer.currentSelection.select(node.id); + if (!designer.currentSelection!.has(node.id)) { + designer.currentSelection!.select(node.id); } - const nodes = designer.currentSelection.getNodes(); + const nodes = designer.currentSelection!.getNodes(); this.handleContextMenu(nodes, originalEvent); }, ), diff --git a/packages/designer/src/designer/active-tracker.ts b/packages/designer/src/designer/active-tracker.ts index 69ce1122b9..2b08dc380c 100644 --- a/packages/designer/src/designer/active-tracker.ts +++ b/packages/designer/src/designer/active-tracker.ts @@ -3,9 +3,8 @@ import { obx, IEventBus, createModuleEventBus } from '@felce/lowcode-editor-core import { IPublicTypeActiveTarget, IPublicModelActiveTracker } from '@felce/lowcode-types'; import { isNode } from '@felce/lowcode-utils'; -export interface IActiveTracker extends Omit { - _target: ActiveTarget | INode; - +export interface IActiveTracker + extends Omit { track(originalTarget: ActiveTarget | INode): void; onChange(fn: (target: ActiveTarget) => void): () => void; @@ -16,7 +15,7 @@ export interface ActiveTarget extends Omit { } export class ActiveTracker implements IActiveTracker { - @obx.ref private _target?: ActiveTarget | INode; + @obx.ref private _target: ActiveTarget | INode; private emitter: IEventBus = createModuleEventBus('ActiveTracker'); diff --git a/packages/designer/src/designer/designer.ts b/packages/designer/src/designer/designer.ts index 70ceaa4442..b01bc873c8 100644 --- a/packages/designer/src/designer/designer.ts +++ b/packages/designer/src/designer/designer.ts @@ -1,3 +1,4 @@ +import { BuiltinSimulatorProps } from './../builtin-simulator/host'; import { ComponentType } from 'react'; import { obx, @@ -55,13 +56,13 @@ const logger = new Logger({ level: 'warn', bizName: 'designer' }); export interface DesignerProps { [key: string]: any; editor: IPublicModelEditor; - shellModelFactory: IShellModelFactory; + shellModelFactory?: IShellModelFactory; className?: string; style?: object; defaultSchema?: IPublicTypeProjectSchema; hotkeys?: object; viewName?: string; - simulatorProps?: Record | ((document: DocumentModel) => object); + simulatorProps?: ((project: Project) => BuiltinSimulatorProps) | BuiltinSimulatorProps; simulatorComponent?: ComponentType; dragGhostComponent?: ComponentType; suspensed?: boolean; @@ -71,13 +72,13 @@ export interface DesignerProps { onDragstart?: (e: IPublicModelLocateEvent) => void; onDrag?: (e: IPublicModelLocateEvent) => void; onDragend?: ( - e: { dragObject: IPublicModelDragObject; copy: boolean }, + e: { dragObject: IPublicModelDragObject; copy?: boolean }, loc?: DropLocation, ) => void; } export interface IDesigner { - readonly shellModelFactory: IShellModelFactory; + readonly shellModelFactory?: IShellModelFactory; viewName: string | undefined; @@ -89,7 +90,7 @@ export interface IDesigner { get componentActions(): ComponentActions; - get contextMenuActions(): ContextMenuActions; + get contextMenuActions(): IContextMenuActions; get editor(): IPublicModelEditor; @@ -97,7 +98,7 @@ export interface IDesigner { get simulatorComponent(): ComponentType | undefined; - get currentSelection(): ISelection; + get currentSelection(): ISelection | undefined; createScroller(scrollable: IPublicTypeScrollable): IPublicModelScroller; @@ -162,7 +163,7 @@ export class Designer implements IDesigner { readonly bemToolsManager = new BemToolsManager(this); - readonly shellModelFactory: IShellModelFactory; + readonly shellModelFactory?: IShellModelFactory; private _dropLocation?: DropLocation; @@ -448,9 +449,10 @@ export class Designer implements IDesigner { this._simulatorComponent = props.simulatorComponent; } if (props.simulatorProps !== this.props.simulatorProps) { + const oldDesignMode = this.simulatorProps?.designMode; this._simulatorProps = props.simulatorProps; // 重新 setupSelection - if (props.simulatorProps?.designMode !== this.props.simulatorProps?.designMode) { + if (this.simulatorProps?.designMode !== oldDesignMode) { this.setupSelection(); } } diff --git a/packages/designer/src/designer/drag-ghost/index.tsx b/packages/designer/src/designer/drag-ghost/index.tsx index 8fd4d6e9fe..d1d12d52c6 100644 --- a/packages/designer/src/designer/drag-ghost/index.tsx +++ b/packages/designer/src/designer/drag-ghost/index.tsx @@ -1,7 +1,6 @@ import { Component, ReactElement } from 'react'; import { observer, obx, Title, makeObservable } from '@felce/lowcode-editor-core'; import { Designer } from '../designer'; -import { isDragNodeObject } from '../dragon'; import { isSimulatorHost } from '../../simulator'; import './ghost.less'; import { @@ -9,6 +8,7 @@ import { IPublicTypeNodeSchema, IPublicModelDragObject, } from '@felce/lowcode-types'; +import { isDragNodeObject } from '@felce/lowcode-utils'; type offBinding = () => any; @@ -16,7 +16,7 @@ type offBinding = () => any; export default class DragGhost extends Component<{ designer: Designer }> { private dispose: offBinding[] = []; - @obx.ref private titles: (string | IPublicTypeI18nData | ReactElement)[] | null = null; + @obx.ref private titles: (string | IPublicTypeI18nData | ReactElement | null)[] | null = null; @obx.ref private x = 0; @@ -58,17 +58,19 @@ export default class DragGhost extends Component<{ designer: Designer }> { ]; } - getTitles(dragObject: IPublicModelDragObject) { + getTitles(dragObject: IPublicModelDragObject | null) { + if (!dragObject) return null; + if (isDragNodeObject(dragObject)) { - return dragObject.nodes.map((node) => node.title); + return dragObject.nodes.map((node) => node?.title || null); } const dataList = Array.isArray(dragObject.data) ? dragObject.data : [dragObject.data]; - return dataList.map( - (item: IPublicTypeNodeSchema, i) => - this.props.designer.getComponentMeta(item.componentName).title, - ); + return dataList.map((item: IPublicTypeNodeSchema | null) => { + if (!item) return null; + return this.props.designer.getComponentMeta(item.componentName).title; + }); } componentWillUnmount() { diff --git a/packages/designer/src/designer/dragon.ts b/packages/designer/src/designer/dragon.ts index a34273a904..27c3d93be3 100644 --- a/packages/designer/src/designer/dragon.ts +++ b/packages/designer/src/designer/dragon.ts @@ -1,20 +1,16 @@ -import { obx, makeObservable, IEventBus, createModuleEventBus } from '@felce/lowcode-editor-core'; +import { IEventBus, createModuleEventBus, makeObservable, obx } from '@felce/lowcode-editor-core'; import { - IPublicTypeDragNodeObject, - IPublicTypeDragAnyObject, - IPublicEnumDragObjectType, - IPublicTypeDragNodeDataObject, IPublicModelDragObject, - IPublicModelNode, IPublicModelDragon, IPublicModelLocateEvent, + IPublicModelNode, IPublicModelSensor, } from '@felce/lowcode-types'; -import { setNativeSelection, cursor } from '@felce/lowcode-utils'; +import { cursor, isDragNodeObject, setNativeSelection } from '@felce/lowcode-utils'; import { INode, Node } from '../document'; import { ISimulatorHost, isSimulatorHost } from '../simulator'; -import { IDesigner } from './designer'; import { makeEventsHandler } from '../utils/misc'; +import { IDesigner } from './designer'; export interface ILocateEvent extends IPublicModelLocateEvent { readonly type: 'LocateEvent'; @@ -25,31 +21,6 @@ export interface ILocateEvent extends IPublicModelLocateEvent { sensor?: IPublicModelSensor; } -/** - * @deprecated use same function in @felce/lowcode-utils - */ -export function isDragNodeObject(obj: any): obj is IPublicTypeDragNodeObject { - return obj && obj.type === IPublicEnumDragObjectType.Node; -} - -/** - * @deprecated use same function in @felce/lowcode-utils - */ -export function isDragNodeDataObject(obj: any): obj is IPublicTypeDragNodeDataObject { - return obj && obj.type === IPublicEnumDragObjectType.NodeData; -} - -/** - * @deprecated use same function in @felce/lowcode-utils - */ -export function isDragAnyObject(obj: any): obj is IPublicTypeDragAnyObject { - return ( - obj && - obj.type !== IPublicEnumDragObjectType.NodeData && - obj.type !== IPublicEnumDragObjectType.Node - ); -} - export function isLocateEvent(e: any): e is ILocateEvent { return e && e.type === 'LocateEvent'; } @@ -88,7 +59,7 @@ export function setShaken(e: any) { e.shaken = true; } -function getSourceSensor(dragObject: IPublicModelDragObject): ISimulatorHost | null { +function getSourceSensor(dragObject: IPublicModelDragObject): ISimulatorHost | null { if (!isDragNodeObject(dragObject)) { return null; } @@ -144,7 +115,7 @@ export class Dragon implements IDragon { * @param shell container element * @param boost boost got a drag object */ - from(shell: Element, boost: (e: MouseEvent) => IPublicModelDragObject | null) { + from(shell: Element, boost: (e: MouseEvent) => IPublicModelDragObject | null) { const mousedown = (e: MouseEvent) => { // ESC or RightClick if (e.which === 3 || e.button === 2) { @@ -172,7 +143,7 @@ export class Dragon implements IDragon { * @param boostEvent 拖拽初始时事件 */ boost( - dragObject: IPublicModelDragObject, + dragObject: IPublicModelDragObject, boostEvent: MouseEvent | DragEvent, fromRglNode?: INode | IPublicModelNode, ) { @@ -257,7 +228,7 @@ export class Dragon implements IDragon { /* istanbul ignore next */ if (isRGL) { // 禁止被拖拽元素的阻断 - const nodeInst = dragObject.nodes[0].getDOMNode(); + const nodeInst = dragObject.nodes?.[0]?.getDOMNode(); if (nodeInst && nodeInst.style) { this.nodeInstPointerEvents = true; nodeInst.style.pointerEvents = 'none'; @@ -275,7 +246,7 @@ export class Dragon implements IDragon { this.emitter.emit('rgl.add.placeholder', { rglNode, fromRglNode, - node: locateEvent.dragObject?.nodes[0], + node: locateEvent.dragObject?.nodes?.[0], event: e, }); designer.clearLocation(); @@ -349,7 +320,7 @@ export class Dragon implements IDragon { const over = (e?: any) => { // 禁止被拖拽元素的阻断 if (this.nodeInstPointerEvents) { - const nodeInst = dragObject.nodes[0].getDOMNode(); + const nodeInst = dragObject.nodes?.[0]?.getDOMNode(); if (nodeInst && nodeInst.style) { nodeInst.style.pointerEvents = ''; } @@ -361,7 +332,7 @@ export class Dragon implements IDragon { const { isRGL, rglNode } = getRGL(e); /* istanbul ignore next */ if (isRGL && this._canDrop && this._dragging) { - const tarNode = dragObject.nodes[0]; + const tarNode = dragObject.nodes?.[0]; if (rglNode.id !== tarNode.id) { // 避免死循环 this.emitter.emit('rgl.drop', { @@ -489,6 +460,7 @@ export class Dragon implements IDragon { } else if (e.sensor) { sensor = e.sensor; } else if (sourceSensor) { + // FIXME: 这里为什么会把simulator拿过来? sensor = sourceSensor; } } @@ -640,7 +612,7 @@ export class Dragon implements IDragon { }; } - onDragend(func: (x: { dragObject: IPublicModelDragObject; copy: boolean }) => any) { + onDragend(func: (x: { dragObject: IPublicModelDragObject; copy: boolean }) => any) { this.emitter.on('dragend', func); return () => { this.emitter.removeListener('dragend', func); diff --git a/packages/designer/src/document/document-view.tsx b/packages/designer/src/document/document-view.tsx index 1c42ce6a63..9a14d1b66a 100644 --- a/packages/designer/src/document/document-view.tsx +++ b/packages/designer/src/document/document-view.tsx @@ -1,9 +1,12 @@ -import { Component } from 'react'; -import classNames from 'classnames'; import { observer } from '@felce/lowcode-editor-core'; -import { DocumentModel, IDocumentModel } from './document-model'; +import classNames from 'classnames'; +import { Component } from 'react'; import { BuiltinSimulatorHostView } from '../builtin-simulator'; +import { IDocumentModel } from './document-model'; +/** + * @deprecated 暂时没用到 + */ @observer export class DocumentView extends Component<{ document: IDocumentModel }> { render() { diff --git a/packages/designer/tests/designer/dragon.test.ts b/packages/designer/tests/designer/dragon.test.ts index a7bd35655b..b2e88fa023 100644 --- a/packages/designer/tests/designer/dragon.test.ts +++ b/packages/designer/tests/designer/dragon.test.ts @@ -5,9 +5,6 @@ import { DocumentModel } from '../../src/document/document-model'; import { Designer } from '../../src/designer/designer'; import { Dragon, - isDragNodeObject, - isDragNodeDataObject, - isDragAnyObject, isLocateEvent, isShaken, setShaken, @@ -18,6 +15,7 @@ import { IPublicEnumDragObjectType } from '@felce/lowcode-types'; import formSchema from '../fixtures/schema/form'; import { fireEvent } from '@testing-library/react'; import { shellModelFactory } from '../../../engine/src/modules/shell-model-factory'; +import { isDragAnyObject, isDragNodeDataObject, isDragNodeObject } from '@felce/lowcode-utils'; describe('Dragon 测试', () => { let editor: Editor; diff --git a/packages/editor-skeleton/src/area.ts b/packages/editor-skeleton/src/area.ts index c0ad92c894..6c3b45c72c 100644 --- a/packages/editor-skeleton/src/area.ts +++ b/packages/editor-skeleton/src/area.ts @@ -1,23 +1,22 @@ /* eslint-disable max-len */ import { obx, computed, makeObservable } from '@felce/lowcode-editor-core'; import { Logger } from '@felce/lowcode-utils'; -import { IPublicTypeWidgetBaseConfig } from '@felce/lowcode-types'; +import { + IPublicTypeWidgetBaseConfig, + IPublicModelArea, + IPublicModelWidget, +} from '@felce/lowcode-types'; import { WidgetContainer } from './widget/widget-container'; import { ISkeleton } from './skeleton'; -import { IWidget } from './widget/widget'; const logger = new Logger({ level: 'warn', bizName: 'skeleton:area' }); -export interface IArea { - isEmpty(): boolean; - add(config: T | C): T; - remove(config: T | string): number; - setVisible(flag: boolean): void; - hide(): void; - show(): void; -} -export class Area - implements IArea +export interface IArea extends IPublicModelArea {} + +export class Area< + C extends IPublicTypeWidgetBaseConfig = any, + T extends IPublicModelWidget = IPublicModelWidget, +> implements IArea { @obx private _visible = true; diff --git a/packages/editor-skeleton/src/skeleton.ts b/packages/editor-skeleton/src/skeleton.ts index 8b7d46f4cc..45639ee202 100644 --- a/packages/editor-skeleton/src/skeleton.ts +++ b/packages/editor-skeleton/src/skeleton.ts @@ -68,6 +68,9 @@ export interface ISkeleton | 'remove' | 'hideArea' | 'add' + | 'getAreaItems' + | 'onDisableWidget' + | 'onEnableWidget' > { editor: IEditor; @@ -456,14 +459,14 @@ export class Skeleton implements ISkeleton { const { content, ...restConfig } = config; if (content) { if (isPlainObject(content) && !isValidElement(content)) { - Object.keys(content).forEach((key) => { + Object.keys(content).forEach((key: any) => { if (/props$/i.test(key) && restConfig[key]) { restConfig[key] = { ...restConfig[key], - ...content[key], + ...(content as unknown as IPublicTypePanelConfig)[key], }; } else { - restConfig[key] = content[key]; + restConfig[key] = (content as unknown as IPublicTypePanelConfig)[key]; } }); } else { diff --git a/packages/editor-skeleton/src/widget/widget.ts b/packages/editor-skeleton/src/widget/widget.ts index 04c074e5b5..a05860cff8 100644 --- a/packages/editor-skeleton/src/widget/widget.ts +++ b/packages/editor-skeleton/src/widget/widget.ts @@ -5,27 +5,9 @@ import { getEvent } from '@felce/lowcode-shell'; import { WidgetConfig } from '../types'; import { ISkeleton } from '../skeleton'; import { WidgetView } from '../components/widget-views'; -import { IPublicTypeTitleContent, IPublicTypeWidgetBaseConfig } from '@felce/lowcode-types'; +import { IPublicModelWidget, IPublicTypeTitleContent } from '@felce/lowcode-types'; -export interface IWidget { - readonly name: string; - readonly content: ReactNode; - readonly align?: string; - readonly isWidget: true; - readonly visible: boolean; - readonly disabled?: boolean; - readonly body: ReactNode; - readonly skeleton: ISkeleton; - readonly config: IPublicTypeWidgetBaseConfig; - - getName(): string; - getContent(): any; - show(): void; - hide(): void; - toggle(): void; - enable?(): void; - disable?(): void; -} +export interface IWidget extends IPublicModelWidget {} export class Widget implements IWidget { readonly isWidget = true; @@ -138,6 +120,6 @@ export class Widget implements IWidget { } } -export function isWidget(obj: any): obj is IWidget { +export function isWidget(obj: any): obj is IPublicModelWidget { return obj && obj.isWidget; } diff --git a/packages/plugin-designer/src/index.tsx b/packages/plugin-designer/src/index.tsx index 0183cf675b..53898ec324 100644 --- a/packages/plugin-designer/src/index.tsx +++ b/packages/plugin-designer/src/index.tsx @@ -3,14 +3,17 @@ import { Editor, engineConfig } from '@felce/lowcode-editor-core'; import { DesignerView, Designer } from '@felce/lowcode-designer'; import { Asset, getLogger } from '@felce/lowcode-utils'; import './index.scss'; +import { IPublicModelEngineConfig } from '@felce/lowcode-types'; const logger = getLogger({ level: 'warn', bizName: 'plugin:plugin-designer' }); export interface PluginProps { engineEditor: Editor; + engineConfig: IPublicModelEngineConfig; } interface DesignerPluginState { + utilsMetadata?: any[] | null; componentMetadatas?: any[] | null; library?: any[] | null; extraEnvironment?: any[] | null; diff --git a/packages/types/src/shell/model/area.ts b/packages/types/src/shell/model/area.ts new file mode 100644 index 0000000000..a736e99136 --- /dev/null +++ b/packages/types/src/shell/model/area.ts @@ -0,0 +1,8 @@ +export interface IPublicModelArea { + isEmpty(): boolean; + add(config: T | C): T; + remove(config: T | string): number; + setVisible(flag: boolean): void; + hide(): void; + show(): void; +} diff --git a/packages/types/src/shell/model/drag-object.ts b/packages/types/src/shell/model/drag-object.ts index 92d92eca35..0ca749b5e9 100644 --- a/packages/types/src/shell/model/drag-object.ts +++ b/packages/types/src/shell/model/drag-object.ts @@ -2,10 +2,10 @@ import { IPublicEnumDragObjectType } from '../enum'; import { IPublicTypeNodeSchema } from '../type'; import { IPublicModelNode } from './node'; -export class IPublicModelDragObject { +export class IPublicModelDragObject { type: IPublicEnumDragObjectType.Node | IPublicEnumDragObjectType.NodeData; data: IPublicTypeNodeSchema | IPublicTypeNodeSchema[] | null; - nodes: (IPublicModelNode | null)[] | null; + nodes: (Node | null)[] | null; } diff --git a/packages/types/src/shell/model/dragon.ts b/packages/types/src/shell/model/dragon.ts index 917149faf3..4eadde52a2 100644 --- a/packages/types/src/shell/model/dragon.ts +++ b/packages/types/src/shell/model/dragon.ts @@ -1,12 +1,15 @@ /* eslint-disable max-len */ -import { IPublicTypeDisposable, IPublicTypeDragNodeDataObject, IPublicTypeDragObject } from '../type'; -import { IPublicModelDragObject, IPublicModelLocateEvent, IPublicModelNode } from './'; +import { IPublicTypeDisposable, IPublicTypeDragObject } from '../type'; +import { + IPublicModelDragObject, + IPublicModelLocateEvent, + IPublicModelNode, +} from './'; export interface IPublicModelDragon< Node = IPublicModelNode, - LocateEvent = IPublicModelLocateEvent + LocateEvent = IPublicModelLocateEvent, > { - /** * 是否正在拖动 * is dragging or not @@ -35,7 +38,12 @@ export interface IPublicModelDragon< * @param func * @returns */ - onDragend(func: (o: { dragObject: IPublicModelDragObject; copy?: boolean }) => any): IPublicTypeDisposable; + onDragend( + func: (o: { + dragObject: IPublicModelDragObject; + copy?: boolean; + }) => any, + ): IPublicTypeDisposable; /** * 设置拖拽监听的区域 shell,以及自定义拖拽转换函数 boost @@ -45,7 +53,10 @@ export interface IPublicModelDragon< * @param shell 拖拽监听的区域 * @param boost 拖拽转换函数 */ - from(shell: Element, boost: (e: MouseEvent) => IPublicTypeDragNodeDataObject | null): any; + from( + shell: Element, + boost: (e: MouseEvent) => IPublicModelDragObject | null, + ): any; /** * 发射拖拽对象 @@ -54,7 +65,11 @@ export interface IPublicModelDragon< * @param dragObject 拖拽对象 * @param boostEvent 拖拽初始时事件 */ - boost(dragObject: IPublicTypeDragObject, boostEvent: MouseEvent | DragEvent, fromRglNode?: Node): void; + boost( + dragObject: IPublicTypeDragObject, + boostEvent: MouseEvent | DragEvent, + fromRglNode?: Node, + ): void; /** * 添加投放感应区 diff --git a/packages/types/src/shell/model/index.ts b/packages/types/src/shell/model/index.ts index ffe6347ac2..6fe6b96679 100644 --- a/packages/types/src/shell/model/index.ts +++ b/packages/types/src/shell/model/index.ts @@ -33,3 +33,5 @@ export * from './setting-field'; export * from './editor-view'; export * from './skeleton-item'; export * from './simulator-render'; +export * from './area'; +export * from './widget'; diff --git a/packages/types/src/shell/model/widget.ts b/packages/types/src/shell/model/widget.ts new file mode 100644 index 0000000000..0446e7698a --- /dev/null +++ b/packages/types/src/shell/model/widget.ts @@ -0,0 +1,23 @@ +import { ISkeleton } from '@felce/lowcode-editor-skeleton'; +import { ReactNode } from 'react'; +import { IPublicTypeWidgetBaseConfig } from '../type'; + +export interface IPublicModelWidget { + readonly name: string; + readonly content: ReactNode; + readonly align?: string; + readonly isWidget: true; + readonly visible: boolean; + readonly disabled?: boolean; + readonly body: ReactNode; + readonly skeleton: ISkeleton; + readonly config: IPublicTypeWidgetBaseConfig; + + getName(): string; + getContent(): any; + show(): void; + hide(): void; + toggle(): void; + enable?(): void; + disable?(): void; +} diff --git a/packages/utils/src/is-plain-object.ts b/packages/utils/src/is-plain-object.ts index 17bc6266f1..acca4bc207 100644 --- a/packages/utils/src/is-plain-object.ts +++ b/packages/utils/src/is-plain-object.ts @@ -1,6 +1,6 @@ import { isObject } from './is-object'; -export function isPlainObject(value: any): value is any { +export function isPlainObject(value: any): value is Record { if (!isObject(value)) { return false; } From f4ab840bf647f30278ca1dd61a49fa76d4a2f36d Mon Sep 17 00:00:00 2001 From: taojiu Date: Mon, 21 Oct 2024 23:06:29 +0800 Subject: [PATCH 05/75] =?UTF-8?q?chore:=20=E4=BF=AE=E5=A4=8D=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E5=A4=84workspace=E3=80=81init=E7=9A=84=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/editor-core/src/config.ts | 2 +- packages/engine/src/engine-core.ts | 13 +++++++------ packages/shell/src/api/common.tsx | 4 ++-- packages/types/src/shell/api/common.ts | 22 ++++++++++------------ packages/workspace/src/workspace.ts | 2 +- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/packages/editor-core/src/config.ts b/packages/editor-core/src/config.ts index dc6dbdbeb0..1c747fd299 100644 --- a/packages/editor-core/src/config.ts +++ b/packages/editor-core/src/config.ts @@ -270,7 +270,7 @@ export class EngineConfig implements IEngineConfig { * * @param {IPublicTypeEngineOptions} engineOptions */ - setEngineOptions(engineOptions: IPublicTypeEngineOptions) { + setEngineOptions(engineOptions?: IPublicTypeEngineOptions) { if (!engineOptions || !isPlainObject(engineOptions)) { return; } diff --git a/packages/engine/src/engine-core.ts b/packages/engine/src/engine-core.ts index 48b4a21c24..28182c96ac 100644 --- a/packages/engine/src/engine-core.ts +++ b/packages/engine/src/engine-core.ts @@ -232,27 +232,28 @@ export async function init( await destroy(); let engineOptions = null; if (isPlainObject(container)) { - engineOptions = container; + engineOptions = container as IPublicTypeEngineOptions; engineContainer = document.createElement('div'); engineContainer.id = 'engine'; document.body.appendChild(engineContainer); } else { engineOptions = options; - engineContainer = container; if (!container) { engineContainer = document.createElement('div'); engineContainer.id = 'engine'; document.body.appendChild(engineContainer); + } else { + engineContainer = container; } } - engineConfig.setEngineOptions(engineOptions as any); + engineConfig.setEngineOptions(engineOptions); const { Workbench } = common.skeletonCabin; if (options && options.enableWorkspaceMode) { const disposeFun = await pluginPromise; disposeFun && disposeFun(); render( - createElement(options?.WorkSpaceWorkbench || WorkSpaceWorkbench, { + createElement(options?.WorkSpaceWorkbench || (WorkSpaceWorkbench as any), { workspace: innerWorkspace, // skeleton: workspace.skeleton, className: 'engine-main', @@ -268,10 +269,10 @@ export async function init( return; } - await plugins.init(pluginPreference as any); + await plugins.init(pluginPreference); render( - createElement(options?.Workbench || Workbench, { + createElement(options?.Workbench || (Workbench as any), { skeleton: innerSkeleton, className: 'engine-main', topAreaItemClassName: 'engine-actionitem', diff --git a/packages/shell/src/api/common.tsx b/packages/shell/src/api/common.tsx index a5a3a2fc8c..8647363b6c 100644 --- a/packages/shell/src/api/common.tsx +++ b/packages/shell/src/api/common.tsx @@ -427,7 +427,7 @@ class EditorCabin implements IPublicApiCommonEditorCabin { export class Common implements IPublicApiCommon { private readonly __designerCabin: any; - private readonly __skeletonCabin: any; + private readonly __skeletonCabin: IPublicApiCommonSkeletonCabin; private readonly __editorCabin: any; private readonly __utils: Utils; @@ -460,7 +460,7 @@ export class Common implements IPublicApiCommon { return this.__designerCabin; } - get skeletonCabin(): any { + get skeletonCabin(): IPublicApiCommonSkeletonCabin { return this.__skeletonCabin; } diff --git a/packages/types/src/shell/api/common.ts b/packages/types/src/shell/api/common.ts index 05ef0da17f..26613b2e67 100644 --- a/packages/types/src/shell/api/common.ts +++ b/packages/types/src/shell/api/common.ts @@ -1,10 +1,12 @@ - import { Component, ReactNode } from 'react'; -import { IPublicTypeI18nData, IPublicTypeNodeSchema, IPublicTypeTitleContent } from '../type'; +import { + IPublicTypeI18nData, + IPublicTypeNodeSchema, + IPublicTypeTitleContent, +} from '../type'; import { IPublicEnumTransitionType } from '../enum'; export interface IPublicApiCommonUtils { - /** * 是否为合法的 schema 结构 * check if data is valid NodeSchema @@ -30,9 +32,9 @@ export interface IPublicApiCommonUtils { * @returns {(IPublicTypeNodeSchema | undefined)} */ getNodeSchemaById( - schema: IPublicTypeNodeSchema, - nodeId: string, - ): IPublicTypeNodeSchema | undefined; + schema: IPublicTypeNodeSchema, + nodeId: string, + ): IPublicTypeNodeSchema | undefined; // TODO: add comments getConvertedExtraKey(key: string): string; @@ -76,16 +78,14 @@ export interface IPublicApiCommonUtils { intl(data: IPublicTypeI18nData | string, params?: object): string; } export interface IPublicApiCommonSkeletonCabin { - /** * 编辑器框架 View * get Workbench Component */ - get Workbench(): Component; + get Workbench(): ReactNode; } export interface IPublicApiCommonEditorCabin { - /** * Title 组件 * @experimental unstable API, pay extra caution when trying to use this @@ -103,11 +103,9 @@ export interface IPublicApiCommonEditorCabin { }>; } -export interface IPublicApiCommonDesignerCabin { -} +export interface IPublicApiCommonDesignerCabin {} export interface IPublicApiCommon { - get utils(): IPublicApiCommonUtils; /** diff --git a/packages/workspace/src/workspace.ts b/packages/workspace/src/workspace.ts index f229cbab67..27a4e26401 100644 --- a/packages/workspace/src/workspace.ts +++ b/packages/workspace/src/workspace.ts @@ -37,7 +37,7 @@ const CHANGE_EVENT = 'resource.list.change'; export interface IWorkspace extends Omit< - IPublicApiWorkspace, + IPublicApiWorkspace, 'resourceList' | 'plugins' | 'openEditorWindow' | 'removeEditorWindow' > { readonly registryInnerPlugin: ( From bdd4d4e59131ac7c00cb9554674df91d53cf28e5 Mon Sep 17 00:00:00 2001 From: taojiu Date: Sun, 27 Oct 2024 23:31:32 +0800 Subject: [PATCH 06/75] chore(release): publish 1.4.1 --- lerna.json | 2 +- packages/designer/package.json | 8 ++++---- packages/editor-core/package.json | 6 +++--- packages/editor-skeleton/package.json | 10 +++++----- packages/engine/package.json | 20 +++++++++---------- packages/ignitor/package.json | 2 +- packages/plugin-command/package.json | 6 +++--- packages/plugin-designer/package.json | 8 ++++---- packages/plugin-outline-pane/package.json | 6 +++--- packages/react-renderer/package.json | 4 ++-- .../react-simulator-renderer/package.json | 10 +++++----- packages/renderer-core/package.json | 8 ++++---- packages/shell/package.json | 14 ++++++------- packages/types/package.json | 2 +- packages/utils/package.json | 4 ++-- packages/workspace/package.json | 12 +++++------ 16 files changed, 61 insertions(+), 61 deletions(-) diff --git a/lerna.json b/lerna.json index d0d5e9aea2..4ba0590f28 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "lerna": "4.0.0", - "version": "1.4.0", + "version": "1.4.1", "npmClient": "yarn", "useWorkspaces": true, "packages": [ diff --git a/packages/designer/package.json b/packages/designer/package.json index 563e3d2979..10608a3504 100644 --- a/packages/designer/package.json +++ b/packages/designer/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-designer", - "version": "1.4.0", + "version": "1.4.1", "description": "Designer for Ali LowCode Engine", "main": "lib/index.js", "module": "es/index.js", @@ -15,9 +15,9 @@ }, "license": "MIT", "dependencies": { - "@felce/lowcode-editor-core": "1.4.0", - "@felce/lowcode-types": "1.4.0", - "@felce/lowcode-utils": "1.4.0", + "@felce/lowcode-editor-core": "1.4.1", + "@felce/lowcode-types": "1.4.1", + "@felce/lowcode-utils": "1.4.1", "classnames": "^2.2.6", "react": "^16", "react-dom": "^16.7.0", diff --git a/packages/editor-core/package.json b/packages/editor-core/package.json index 4775509fb9..242d2def51 100644 --- a/packages/editor-core/package.json +++ b/packages/editor-core/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-editor-core", - "version": "1.4.0", + "version": "1.4.1", "description": "Core Api for Ali lowCode engine", "license": "MIT", "main": "lib/index.js", @@ -16,8 +16,8 @@ }, "dependencies": { "@alifd/next": "^1.26.0", - "@felce/lowcode-types": "1.4.0", - "@felce/lowcode-utils": "1.4.0", + "@felce/lowcode-types": "1.4.1", + "@felce/lowcode-utils": "1.4.1", "classnames": "^2.2.6", "debug": "^4.1.1", "intl-messageformat": "^9.3.1", diff --git a/packages/editor-skeleton/package.json b/packages/editor-skeleton/package.json index 7840e73ba7..9dde413572 100644 --- a/packages/editor-skeleton/package.json +++ b/packages/editor-skeleton/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-editor-skeleton", - "version": "1.4.0", + "version": "1.4.1", "description": "alibaba lowcode editor skeleton", "main": "lib/index.js", "module": "es/index.js", @@ -19,10 +19,10 @@ ], "dependencies": { "@alifd/next": "^1.26.0", - "@felce/lowcode-designer": "1.4.0", - "@felce/lowcode-editor-core": "1.4.0", - "@felce/lowcode-types": "1.4.0", - "@felce/lowcode-utils": "1.4.0", + "@felce/lowcode-designer": "1.4.1", + "@felce/lowcode-editor-core": "1.4.1", + "@felce/lowcode-types": "1.4.1", + "@felce/lowcode-utils": "1.4.1", "classnames": "^2.2.6", "react": "^16.8.1", "react-dom": "^16.8.1" diff --git a/packages/engine/package.json b/packages/engine/package.json index a9eddba852..8aaee62691 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-engine", - "version": "1.4.0", + "version": "1.4.1", "description": "An enterprise-class low-code technology stack with scale-out design / 一套面向扩展设计的企业级低代码技术体系", "main": "lib/engine-core.js", "module": "es/engine-core.js", @@ -19,16 +19,16 @@ "license": "MIT", "dependencies": { "@alifd/next": "^1.26.0", + "@felce/lowcode-designer": "1.4.1", + "@felce/lowcode-editor-core": "1.4.1", + "@felce/lowcode-editor-skeleton": "1.4.1", "@felce/lowcode-engine-ext": "^1.1.0", - "@felce/lowcode-designer": "1.4.0", - "@felce/lowcode-editor-core": "1.4.0", - "@felce/lowcode-editor-skeleton": "1.4.0", - "@felce/lowcode-plugin-command": "1.4.0", - "@felce/lowcode-plugin-designer": "1.4.0", - "@felce/lowcode-plugin-outline-pane": "1.4.0", - "@felce/lowcode-shell": "1.4.0", - "@felce/lowcode-utils": "1.4.0", - "@felce/lowcode-workspace": "1.4.0", + "@felce/lowcode-plugin-command": "1.4.1", + "@felce/lowcode-plugin-designer": "1.4.1", + "@felce/lowcode-plugin-outline-pane": "1.4.1", + "@felce/lowcode-shell": "1.4.1", + "@felce/lowcode-utils": "1.4.1", + "@felce/lowcode-workspace": "1.4.1", "react": "^16.8.1", "react-dom": "^16.8.1" }, diff --git a/packages/ignitor/package.json b/packages/ignitor/package.json index e71de7e671..186ad28be6 100644 --- a/packages/ignitor/package.json +++ b/packages/ignitor/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-ignitor", - "version": "1.4.0", + "version": "1.4.1", "description": "点火器,bootstrap lce project", "main": "lib/index.js", "private": true, diff --git a/packages/plugin-command/package.json b/packages/plugin-command/package.json index 51bd003ae7..bfcea56483 100644 --- a/packages/plugin-command/package.json +++ b/packages/plugin-command/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-plugin-command", - "version": "1.4.0", + "version": "1.4.1", "description": "> TODO: description", "author": "liujuping ", "homepage": "https://github.com/fe-lce/lowcode-engine#readme", @@ -30,8 +30,8 @@ "url": "https://github.com/fe-lce/lowcode-engine/issues" }, "dependencies": { - "@felce/lowcode-types": "1.4.0", - "@felce/lowcode-utils": "1.4.0" + "@felce/lowcode-types": "1.4.1", + "@felce/lowcode-utils": "1.4.1" }, "devDependencies": { "@alib/build-scripts": "^0.1.18" diff --git a/packages/plugin-designer/package.json b/packages/plugin-designer/package.json index 61b3298efd..348a6a1947 100644 --- a/packages/plugin-designer/package.json +++ b/packages/plugin-designer/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-plugin-designer", - "version": "1.4.0", + "version": "1.4.1", "description": "alibaba lowcode editor designer plugin", "files": [ "es", @@ -18,9 +18,9 @@ ], "author": "xiayang.xy", "dependencies": { - "@felce/lowcode-designer": "1.4.0", - "@felce/lowcode-editor-core": "1.4.0", - "@felce/lowcode-utils": "1.4.0", + "@felce/lowcode-designer": "1.4.1", + "@felce/lowcode-editor-core": "1.4.1", + "@felce/lowcode-utils": "1.4.1", "react": "^16.8.1", "react-dom": "^16.8.1" }, diff --git a/packages/plugin-outline-pane/package.json b/packages/plugin-outline-pane/package.json index 3b57e6df1c..5998e947fe 100644 --- a/packages/plugin-outline-pane/package.json +++ b/packages/plugin-outline-pane/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-plugin-outline-pane", - "version": "1.4.0", + "version": "1.4.1", "description": "Outline pane for Ali lowCode engine", "files": [ "es", @@ -13,8 +13,8 @@ }, "dependencies": { "@alifd/next": "^1.26.0", - "@felce/lowcode-types": "1.4.0", - "@felce/lowcode-utils": "1.4.0", + "@felce/lowcode-types": "1.4.1", + "@felce/lowcode-utils": "1.4.1", "classnames": "^2.2.6", "react": "^16", "react-dom": "^16.7.0", diff --git a/packages/react-renderer/package.json b/packages/react-renderer/package.json index ac178de6a6..3357a54421 100644 --- a/packages/react-renderer/package.json +++ b/packages/react-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-react-renderer", - "version": "1.4.0", + "version": "1.4.1", "description": "react renderer for ali lowcode engine", "main": "lib/index.js", "module": "es/index.js", @@ -22,7 +22,7 @@ ], "dependencies": { "@alifd/next": "^1.26.0", - "@felce/lowcode-renderer-core": "1.4.0" + "@felce/lowcode-renderer-core": "1.4.1" }, "devDependencies": { "@alib/build-scripts": "^0.1.18", diff --git a/packages/react-simulator-renderer/package.json b/packages/react-simulator-renderer/package.json index a6bd187309..daae6b8459 100644 --- a/packages/react-simulator-renderer/package.json +++ b/packages/react-simulator-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-react-simulator-renderer", - "version": "1.4.0", + "version": "1.4.1", "description": "react simulator renderer for alibaba lowcode designer", "main": "lib/index.js", "module": "es/index.js", @@ -17,10 +17,10 @@ "test:cov": "build-scripts test --config build.test.json --jest-coverage" }, "dependencies": { - "@felce/lowcode-designer": "1.4.0", - "@felce/lowcode-react-renderer": "1.4.0", - "@felce/lowcode-types": "1.4.0", - "@felce/lowcode-utils": "1.4.0", + "@felce/lowcode-designer": "1.4.1", + "@felce/lowcode-react-renderer": "1.4.1", + "@felce/lowcode-types": "1.4.1", + "@felce/lowcode-utils": "1.4.1", "classnames": "^2.2.6", "mobx": "^6.3.0", "mobx-react": "^7.2.0", diff --git a/packages/renderer-core/package.json b/packages/renderer-core/package.json index 9e0b33f1a3..45bac74aa3 100644 --- a/packages/renderer-core/package.json +++ b/packages/renderer-core/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-renderer-core", - "version": "1.4.0", + "version": "1.4.1", "description": "renderer core", "license": "MIT", "main": "lib/index.js", @@ -16,8 +16,8 @@ }, "dependencies": { "@alilc/lowcode-datasource-engine": "^1.0.0", - "@felce/lowcode-types": "1.4.0", - "@felce/lowcode-utils": "1.4.0", + "@felce/lowcode-types": "1.4.1", + "@felce/lowcode-utils": "1.4.1", "classnames": "^2.2.6", "debug": "^4.1.1", "fetch-jsonp": "^1.1.3", @@ -33,7 +33,7 @@ "@alib/build-scripts": "^0.1.18", "@alifd/next": "^1.26.0", "@babel/plugin-transform-typescript": "^7.16.8", - "@felce/lowcode-designer": "1.4.0", + "@felce/lowcode-designer": "1.4.1", "@testing-library/react": "^11.2.2", "@types/classnames": "^2.2.11", "@types/debug": "^4.1.5", diff --git a/packages/shell/package.json b/packages/shell/package.json index 693cfaa2ec..86f42902f1 100644 --- a/packages/shell/package.json +++ b/packages/shell/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-shell", - "version": "1.4.0", + "version": "1.4.1", "description": "Shell Layer for AliLowCodeEngine", "main": "lib/index.js", "module": "es/index.js", @@ -14,12 +14,12 @@ "license": "MIT", "dependencies": { "@alifd/next": "^1.26.0", - "@felce/lowcode-designer": "1.4.0", - "@felce/lowcode-editor-core": "1.4.0", - "@felce/lowcode-editor-skeleton": "1.4.0", - "@felce/lowcode-types": "1.4.0", - "@felce/lowcode-utils": "1.4.0", - "@felce/lowcode-workspace": "1.4.0", + "@felce/lowcode-designer": "1.4.1", + "@felce/lowcode-editor-core": "1.4.1", + "@felce/lowcode-editor-skeleton": "1.4.1", + "@felce/lowcode-types": "1.4.1", + "@felce/lowcode-utils": "1.4.1", + "@felce/lowcode-workspace": "1.4.1", "classnames": "^2.2.6", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.5", diff --git a/packages/types/package.json b/packages/types/package.json index 1a6f8f7430..10362eb7e2 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-types", - "version": "1.4.0", + "version": "1.4.1", "description": "Types for Ali lowCode engine", "files": [ "es", diff --git a/packages/utils/package.json b/packages/utils/package.json index abf50b017c..51b5b2efc9 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-utils", - "version": "1.4.0", + "version": "1.4.1", "description": "Utils for Ali lowCode engine", "files": [ "lib", @@ -14,7 +14,7 @@ }, "dependencies": { "@alifd/next": "^1.26.0", - "@felce/lowcode-types": "1.4.0", + "@felce/lowcode-types": "1.4.1", "events": "^3.3.0", "lodash": "^4.17.21", "mobx": "^6.3.0", diff --git a/packages/workspace/package.json b/packages/workspace/package.json index 0383c958bc..cfb8514c19 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -1,6 +1,6 @@ { "name": "@felce/lowcode-workspace", - "version": "1.4.0", + "version": "1.4.1", "description": "Shell Layer for AliLowCodeEngine", "main": "lib/index.js", "module": "es/index.js", @@ -15,11 +15,11 @@ }, "license": "MIT", "dependencies": { - "@felce/lowcode-designer": "1.4.0", - "@felce/lowcode-editor-core": "1.4.0", - "@felce/lowcode-editor-skeleton": "1.4.0", - "@felce/lowcode-types": "1.4.0", - "@felce/lowcode-utils": "1.4.0", + "@felce/lowcode-designer": "1.4.1", + "@felce/lowcode-editor-core": "1.4.1", + "@felce/lowcode-editor-skeleton": "1.4.1", + "@felce/lowcode-types": "1.4.1", + "@felce/lowcode-utils": "1.4.1", "classnames": "^2.2.6", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.5", From 92af6b49efa19ee398dab7132e8817331f462d13 Mon Sep 17 00:00:00 2001 From: taojiu Date: Sun, 27 Oct 2024 23:41:37 +0800 Subject: [PATCH 07/75] =?UTF-8?q?docs(README):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AE=A1=E5=88=92=E5=92=8C=E8=BF=9B=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了前言和思想变化等内容,精简了文档结构 - 更新了当前主要任务列表,包括修复积压问题、支持自定义 workbench 等 - 新增了计划部分,列出了具体的开发任务和目标 - 保留了联系方式和致谢等内容 --- packages/engine/README-en_US.md | 36 +++++++++------------ packages/engine/README.md | 57 +++++++++++++++------------------ 2 files changed, 40 insertions(+), 53 deletions(-) diff --git a/packages/engine/README-en_US.md b/packages/engine/README-en_US.md index 6f889e5e5b..527eb6e35e 100644 --- a/packages/engine/README-en_US.md +++ b/packages/engine/README-en_US.md @@ -1,24 +1,3 @@ -## Preface - -This project is forked from [alibaba/lowcode-engine](https://github.com/alibaba/lowcode-engine) (v1.3.2 on September 6, 2024). -Since the original project's version 1 has been determined to no longer have community open source maintenance, and there is no definite plan for version 2. Therefore, this project was born, and it is expected to continue open source maintenance. -Of course, from now on, related designs will also be completely independent and not related to the design of the original project's version 2. If you expect to continue following the original project's version 2 route in the future, please choose this project carefully. - -### Changes in thinking - -This project will change some ideas, abandon some peripheral function development, mainly provide core low-code functions, and be a pure low-code kernel. Modules such as workspace will have a lower priority. -More internal modules will be transferred to plugins (incomplete) and provided as default plugins instead of being encapsulated inside. The overall development direction is shifting towards a more open one. -At the same time, for each sub-module, more interfaces will be opened through the shell module to support more customized needs. -Finally, the toolchain will be upgraded as appropriate. It is planned to switch to a newer packaging tool, etc., but the priority will be relatively low. - -### Plans - -Currently, the project has just been forked. The main work is to replace the namespace. To avoid naming conflicts with the original project, the namespace of this repository is adjusted to `@felce`, which is taken from the abbreviation of lowcode-engine. -Current main tasks: - -- Adjust the namespace of the main project. -- Fix backlogged issues. -

LowCodeEngine

@@ -176,6 +155,21 @@ About Pull Request: - set the target branch to **develop** other than **main** +### Plan + +Current main tasks: + +- [ ] Fix backlog issues +- [x] Modify namespace +- [x] Support custom workbench +- [ ] Upgrade to React 18 +- [ ] Upgrade build scripts (or replace with Vite) +- [ ] Merge Vue canvas and renderer into the project +- [ ] Core module refactoring to achieve framework independence +- [ ] Independent built-in plugin for custom loading +- [ ] Independent settings plugin +- [ ] Optimize rendering performance + ## ❤️ Contributors Special thanks to everyone who contributed to this project. diff --git a/packages/engine/README.md b/packages/engine/README.md index e4a896ff98..f1a7bb9220 100644 --- a/packages/engine/README.md +++ b/packages/engine/README.md @@ -1,35 +1,3 @@ -## 前言 - -本工程 fork 于[alibaba/lowcode-engine](https://github.com/alibaba/lowcode-engine) (2024 年 9 月 6 日 v1.3.2)。 - -由于原工程 V1 确定不再进行社区开源维护,V2 版没有确切计划。因此诞生了本项目,期望继续开源维护。 - -当然,自此开始相关设计也会完全独立,与原工程 V2 的设计不相关联,如果期望后续能继续走原工程 V2 路线,请慎重选择本项目。 - -### 思想变化 - -本项目将转变部分思路,舍弃部分外围的功能开发,以提供核心低码功能为主,做纯粹低代码内核。如 workspace 等模块将降低优先级。 - -更多的内部模块将转移到 plugins 中(未完成),作为默认插件提供,而不是封装到内部。整体向更开放的开发方向转变。 - -同时,针对各子模块,将通过 shell 模块开放更多的接口,以支持更多定制化需求。 - -最后,将酌情升级工具链,计划切换到更新的打包工具等,不过优先级会比较低。 - -### 计划 - -目前工程刚 fork,主要工作是进行命名空间的替换,为避免与原工程命名冲突,本仓库命名空间调整为`@felce`,取自 lowcode-engine 的缩写。 -当前主要任务: - -- 主要工程的命名空间调整 -- 修复积压问题 - -## 联系方式 - -微信搜索 kunsile-002 添加我的微信,或者扫码加群: - - -

LowCodeEngine

@@ -186,6 +154,31 @@ lowcode-engine 启动后,提供了几个 umd 文件,可以结合 [lowcode-de 关于提交 PR: 请将目标合并分支设置为 **develop**,不要指定 **main** 分支,在发布正式版本后,develop 分支将会合入 main 分支。 +### 计划 + +当前主要任务: + +- [ ] 修复积压问题 +- [x] 修改namespace +- [x] 支持自定义workbentch +- [ ] 升级到react18 +- [ ] 升级build-scripts(或者替换成vite) +- [ ] 合并vue画布和renderer到工程内部 +- [ ] 核心模块重构,实现框架无关 +- [ ] 独立内置插件,实现自定义加载 +- [ ] 独立settings插件 +- [ ] 优化渲染性能 + +## 声明 + +本工程 fork 于[alibaba/lowcode-engine](https://github.com/alibaba/lowcode-engine) (2024 年 9 月 6 日 v1.3.2)。 + +## 联系方式 + +微信搜索 kunsile-002 添加我的微信,或者扫码加群: + + + ## ❤️ 致谢 感谢所有为引擎项目贡献力量的同学们~ From fd42491c3e0adfdf602bd65d1d1a3f8e9a880e24 Mon Sep 17 00:00:00 2001 From: taojiu Date: Mon, 28 Oct 2024 01:39:09 +0800 Subject: [PATCH 08/75] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0vue=E7=9A=84ren?= =?UTF-8?q?derer=E5=92=8Csimulator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/docs/faq/faq017.md | 6 +- docs/docs/participate/index.md | 8 + packages/engine/README-en_US.md | 17 +- packages/engine/README.md | 17 +- packages/ignitor/build.json | 3 +- packages/ignitor/package.json | 1 + packages/react-renderer/package.json | 1 + .../react-simulator-renderer/package.json | 3 + packages/vue-renderer/CHANGELOG.md | 135 +++ packages/vue-renderer/README.md | 1 + packages/vue-renderer/build.json | 3 + packages/vue-renderer/build.plugin.cjs | 10 + packages/vue-renderer/build.umd.json | 24 + packages/vue-renderer/package.json | 40 + packages/vue-renderer/src/config.ts | 27 + packages/vue-renderer/src/core/base.ts | 89 ++ packages/vue-renderer/src/core/hoc.ts | 168 ++++ packages/vue-renderer/src/core/index.ts | 2 + packages/vue-renderer/src/core/live.ts | 54 ++ packages/vue-renderer/src/core/use.ts | 807 ++++++++++++++++++ .../vue-renderer/src/data-source/index.ts | 163 ++++ .../vue-renderer/src/data-source/interface.ts | 26 + .../vue-renderer/src/data-source/request.ts | 140 +++ .../vue-renderer/src/hooks/current-node.ts | 48 ++ packages/vue-renderer/src/hooks/index.ts | 2 + .../src/hooks/renderer-context.ts | 42 + packages/vue-renderer/src/index.ts | 4 + packages/vue-renderer/src/renderer.ts | 113 +++ packages/vue-renderer/src/renderers/index.ts | 6 + packages/vue-renderer/src/renderers/page.ts | 19 + packages/vue-renderer/src/utils/array.ts | 5 + packages/vue-renderer/src/utils/i18n.ts | 25 + packages/vue-renderer/src/utils/index.ts | 4 + packages/vue-renderer/src/utils/parse.ts | 101 +++ packages/vue-renderer/src/utils/scope.ts | 67 ++ packages/vue-renderer/tsconfig.json | 4 + packages/vue-simulator-renderer/CHANGELOG.md | 132 +++ packages/vue-simulator-renderer/README.md | 1 + packages/vue-simulator-renderer/build.json | 3 + .../vue-simulator-renderer/build.plugin.cjs | 10 + .../vue-simulator-renderer/build.umd.json | 29 + packages/vue-simulator-renderer/package.json | 40 + .../vue-simulator-renderer/public/index.html | 10 + .../src/buildin-components/index.ts | 3 + .../src/buildin-components/leaf.ts | 26 + .../src/buildin-components/page.ts | 24 + .../src/buildin-components/slot.ts | 46 + packages/vue-simulator-renderer/src/host.ts | 3 + .../vue-simulator-renderer/src/index.less | 122 +++ packages/vue-simulator-renderer/src/index.ts | 19 + .../vue-simulator-renderer/src/interface.ts | 52 ++ .../src/simulator-view.ts | 72 ++ .../vue-simulator-renderer/src/simulator.ts | 349 ++++++++ .../src/utils/build-components.ts | 94 ++ .../src/utils/check-node.ts | 11 + .../src/utils/closest-node.ts | 71 ++ .../src/utils/comp-node.ts | 65 ++ .../src/utils/cursor.ts | 61 ++ .../src/utils/find-dom-nodes.ts | 57 ++ .../src/utils/get-client-rects.ts | 15 + .../vue-simulator-renderer/src/utils/index.ts | 8 + .../src/utils/logger.ts | 3 + .../src/utils/navtive-selection.ts | 15 + packages/vue-simulator-renderer/tsconfig.json | 4 + scripts/build.sh | 6 + scripts/sync.sh | 4 +- 66 files changed, 3520 insertions(+), 20 deletions(-) create mode 100644 packages/vue-renderer/CHANGELOG.md create mode 100644 packages/vue-renderer/README.md create mode 100644 packages/vue-renderer/build.json create mode 100644 packages/vue-renderer/build.plugin.cjs create mode 100644 packages/vue-renderer/build.umd.json create mode 100644 packages/vue-renderer/package.json create mode 100644 packages/vue-renderer/src/config.ts create mode 100644 packages/vue-renderer/src/core/base.ts create mode 100644 packages/vue-renderer/src/core/hoc.ts create mode 100644 packages/vue-renderer/src/core/index.ts create mode 100644 packages/vue-renderer/src/core/live.ts create mode 100644 packages/vue-renderer/src/core/use.ts create mode 100644 packages/vue-renderer/src/data-source/index.ts create mode 100644 packages/vue-renderer/src/data-source/interface.ts create mode 100644 packages/vue-renderer/src/data-source/request.ts create mode 100644 packages/vue-renderer/src/hooks/current-node.ts create mode 100644 packages/vue-renderer/src/hooks/index.ts create mode 100644 packages/vue-renderer/src/hooks/renderer-context.ts create mode 100644 packages/vue-renderer/src/index.ts create mode 100644 packages/vue-renderer/src/renderer.ts create mode 100644 packages/vue-renderer/src/renderers/index.ts create mode 100644 packages/vue-renderer/src/renderers/page.ts create mode 100644 packages/vue-renderer/src/utils/array.ts create mode 100644 packages/vue-renderer/src/utils/i18n.ts create mode 100644 packages/vue-renderer/src/utils/index.ts create mode 100644 packages/vue-renderer/src/utils/parse.ts create mode 100644 packages/vue-renderer/src/utils/scope.ts create mode 100644 packages/vue-renderer/tsconfig.json create mode 100644 packages/vue-simulator-renderer/CHANGELOG.md create mode 100644 packages/vue-simulator-renderer/README.md create mode 100644 packages/vue-simulator-renderer/build.json create mode 100644 packages/vue-simulator-renderer/build.plugin.cjs create mode 100644 packages/vue-simulator-renderer/build.umd.json create mode 100644 packages/vue-simulator-renderer/package.json create mode 100644 packages/vue-simulator-renderer/public/index.html create mode 100644 packages/vue-simulator-renderer/src/buildin-components/index.ts create mode 100644 packages/vue-simulator-renderer/src/buildin-components/leaf.ts create mode 100644 packages/vue-simulator-renderer/src/buildin-components/page.ts create mode 100644 packages/vue-simulator-renderer/src/buildin-components/slot.ts create mode 100644 packages/vue-simulator-renderer/src/host.ts create mode 100644 packages/vue-simulator-renderer/src/index.less create mode 100644 packages/vue-simulator-renderer/src/index.ts create mode 100644 packages/vue-simulator-renderer/src/interface.ts create mode 100644 packages/vue-simulator-renderer/src/simulator-view.ts create mode 100644 packages/vue-simulator-renderer/src/simulator.ts create mode 100644 packages/vue-simulator-renderer/src/utils/build-components.ts create mode 100644 packages/vue-simulator-renderer/src/utils/check-node.ts create mode 100644 packages/vue-simulator-renderer/src/utils/closest-node.ts create mode 100644 packages/vue-simulator-renderer/src/utils/comp-node.ts create mode 100644 packages/vue-simulator-renderer/src/utils/cursor.ts create mode 100644 packages/vue-simulator-renderer/src/utils/find-dom-nodes.ts create mode 100644 packages/vue-simulator-renderer/src/utils/get-client-rects.ts create mode 100644 packages/vue-simulator-renderer/src/utils/index.ts create mode 100644 packages/vue-simulator-renderer/src/utils/logger.ts create mode 100644 packages/vue-simulator-renderer/src/utils/navtive-selection.ts create mode 100644 packages/vue-simulator-renderer/tsconfig.json diff --git a/docs/docs/faq/faq017.md b/docs/docs/faq/faq017.md index f2c7afa273..33f9576bf7 100644 --- a/docs/docs/faq/faq017.md +++ b/docs/docs/faq/faq017.md @@ -3,9 +3,7 @@ title: vue 画布支持说明 sidebar_position: 17 tags: [FAQ] --- + #### 低代码引擎官方是否支持 Vue 画布 -短期没有支持的计划 -#### 社区研发的 Vue 画布 -##### 肯耐珂萨团队实现的 Vue 画布 -github:[https://github.com/KNXCloud/lowcode-engine-vue](https://github.com/KNXCloud/lowcode-engine-vue) +fork修改自 github:[https://github.com/KNXCloud/lowcode-engine-vue](https://github.com/KNXCloud/lowcode-engine-vue) diff --git a/docs/docs/participate/index.md b/docs/docs/participate/index.md index f468bad42a..c833dc5463 100644 --- a/docs/docs/participate/index.md +++ b/docs/docs/participate/index.md @@ -48,6 +48,14 @@ npm install && npm run setup [ "https://registry.npmmirror.com/@felce/lowcode-engine/(.*)/dist/css/react-simulator-renderer.css", "http://localhost:5555/css/ReactSimulatorRenderer.css" + ], + [ + "https://registry.npmmirror.com/@felce/lowcode-engine/(.*)/dist/js/vue-simulator-renderer.js", + "http://localhost:5555/js/VueSimulatorRenderer.js" + ], + [ + "https://registry.npmmirror.com/@felce/lowcode-engine/(.*)/dist/css/vue-simulator-renderer.css", + "http://localhost:5555/css/VueSimulatorRenderer.css" ] ] } diff --git a/packages/engine/README-en_US.md b/packages/engine/README-en_US.md index 1223894fea..b367cb30eb 100644 --- a/packages/engine/README-en_US.md +++ b/packages/engine/README-en_US.md @@ -90,27 +90,30 @@ init(document.getElementById('lce')); #### unpkg ```html -https://unpkg.com/@felce/lowcode-engine@1.4.0/dist/js/engine-core.js -https://unpkg.com/@felce/lowcode-react-simulator-renderer@1.4.0/dist/js/react-simulator-renderer.js +https://unpkg.com/@felce/lowcode-engine@1.4.1/dist/js/engine-core.js +https://unpkg.com/@felce/lowcode-react-simulator-renderer@1.4.1/dist/js/react-simulator-renderer.js +https://unpkg.com/@felce/lowcode-vue-simulator-renderer@1.4.1/dist/js/react-simulator-renderer.js ``` #### npmmirror ```html -https://registry.npmmirror.com/@felce/lowcode-engine/1.4.0/files/dist/js/engine-core.js -https://registry.npmmirror.com/@felce/lowcode-react-simulator-renderer/1.4.0/files/dist/js/react-simulator-renderer.js +https://registry.npmmirror.com/@felce/lowcode-engine/1.4.1/files/dist/js/engine-core.js +https://registry.npmmirror.com/@felce/lowcode-react-simulator-renderer/1.4.1/files/dist/js/react-simulator-renderer.js +https://registry.npmmirror.com/@felce/lowcode-vue-simulator-renderer/1.4.1/files/dist/js/react-simulator-renderer.js ``` #### jsdelivr ```html -https://cdn.jsdelivr.net/npm/@felce/lowcode-engine@1.4.0/dist/js/engine-core.js -https://cdn.jsdelivr.net/npm/@felce/lowcode-react-simulator-renderer@1.4.0/dist/js/react-simulator-renderer.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-engine@1.4.1/dist/js/engine-core.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-react-simulator-renderer@1.4.1/dist/js/react-simulator-renderer.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-vue-simulator-renderer@1.4.1/dist/js/react-simulator-renderer.js ``` #### Method 5: Use your own cdn -Pass the files under packages/engine/dist and packages/react-simulator-renderer/dist in the source code to your cdn provider +Pass the files under packages/engine/dist and packages/react-simulator-renderer/dist(packages/vue-simulator-renderer/dist) in the source code to your cdn provider ## 🔗 Related Links diff --git a/packages/engine/README.md b/packages/engine/README.md index 56353cc436..9688550b72 100644 --- a/packages/engine/README.md +++ b/packages/engine/README.md @@ -90,27 +90,30 @@ init(document.getElementById('lce')); #### unpkg ```html -https://unpkg.com/@felce/lowcode-engine@1.4.0/dist/js/engine-core.js -https://unpkg.com/@felce/lowcode-react-simulator-renderer@1.4.0/dist/js/react-simulator-renderer.js +https://unpkg.com/@felce/lowcode-engine@1.4.1/dist/js/engine-core.js +https://unpkg.com/@felce/lowcode-react-simulator-renderer@1.4.1/dist/js/react-simulator-renderer.js +https://unpkg.com/@felce/lowcode-react-simulator-renderer@1.4.1/dist/js/vue-simulator-renderer.js ``` #### npmmirror ```html -https://registry.npmmirror.com/@felce/lowcode-engine/1.4.0/files/dist/js/engine-core.js -https://registry.npmmirror.com/@felce/lowcode-react-simulator-renderer/1.4.0/files/dist/js/react-simulator-renderer.js +https://registry.npmmirror.com/@felce/lowcode-engine/1.4.1/files/dist/js/engine-core.js +https://registry.npmmirror.com/@felce/lowcode-react-simulator-renderer/1.4.1/files/dist/js/react-simulator-renderer.js +https://registry.npmmirror.com/@felce/lowcode-vue-simulator-renderer/1.4.1/files/dist/js/react-simulator-renderer.js ``` #### jsdelivr ```html -https://cdn.jsdelivr.net/npm/@felce/lowcode-engine@1.4.0/dist/js/engine-core.js -https://cdn.jsdelivr.net/npm/@felce/lowcode-react-simulator-renderer@1.4.0/dist/js/react-simulator-renderer.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-engine@1.4.1/dist/js/engine-core.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-react-simulator-renderer@1.4.1/dist/js/react-simulator-renderer.js +https://cdn.jsdelivr.net/npm/@felce/lowcode-vue-simulator-renderer@1.4.1/dist/js/react-simulator-renderer.js ``` #### 使用自有 cdn -将源码中 packages/engine/dist 和 packages/react-simulator-renderer/dist 下的文件传至你的 cdn 提供商 +将源码中 packages/engine/dist 和 packages/react-simulator-renderer/dist(packages/vue-simulator-renderer/dist) 下的文件传至你的 cdn 提供商 ## 🔗 相关链接 diff --git a/packages/ignitor/build.json b/packages/ignitor/build.json index 6055d193ba..61c714a654 100644 --- a/packages/ignitor/build.json +++ b/packages/ignitor/build.json @@ -1,7 +1,8 @@ { "entry": { "AliLowCodeEngine": "../engine/src/index.ts", - "ReactSimulatorRenderer": "../react-simulator-renderer/src/index.ts" + "ReactSimulatorRenderer": "../react-simulator-renderer/src/index.ts", + "VueSimulatorRenderer": "../vue-simulator-renderer/src/index.ts" }, "vendor": false, "devServer": { diff --git a/packages/ignitor/package.json b/packages/ignitor/package.json index 186ad28be6..de5442b8bb 100644 --- a/packages/ignitor/package.json +++ b/packages/ignitor/package.json @@ -15,6 +15,7 @@ "license": "MIT", "devDependencies": { "@alib/build-scripts": "^0.1.18", + "build-plugin-react-app": "^1.8.0", "fs-extra": "^10.0.0" }, "repository": { diff --git a/packages/react-renderer/package.json b/packages/react-renderer/package.json index 3357a54421..c11db3dae0 100644 --- a/packages/react-renderer/package.json +++ b/packages/react-renderer/package.json @@ -28,6 +28,7 @@ "@alib/build-scripts": "^0.1.18", "build-plugin-fusion": "^0.1.0", "build-plugin-moment-locales": "^0.1.0", + "build-plugin-react-app": "^1.8.0", "react": "^16.4.1", "react-dom": "^16.4.1", "react-test-renderer": "^16" diff --git a/packages/react-simulator-renderer/package.json b/packages/react-simulator-renderer/package.json index daae6b8459..3532ec0304 100644 --- a/packages/react-simulator-renderer/package.json +++ b/packages/react-simulator-renderer/package.json @@ -29,6 +29,9 @@ }, "devDependencies": { "@alib/build-scripts": "^0.1.18", + "build-plugin-fusion": "^0.1.0", + "build-plugin-moment-locales": "^0.1.0", + "build-plugin-react-app": "^1.8.0", "@types/classnames": "^2.2.7", "@types/node": "^13.7.1", "@types/react": "^16", diff --git a/packages/vue-renderer/CHANGELOG.md b/packages/vue-renderer/CHANGELOG.md new file mode 100644 index 0000000000..b44f8c06aa --- /dev/null +++ b/packages/vue-renderer/CHANGELOG.md @@ -0,0 +1,135 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.4.7](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.6...v1.4.7) (2022-08-30) + +### Bug Fixes + +- **vue-renderer:** 修复数据源初始化无法正常设置值到 state 中 ([97f3b08](https://github.com/fe-lce/lowcode-engine-vue/commit/97f3b08bf5fcb745ccc84bcb537a3170a53b3564)) + +## [1.4.6](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.5...v1.4.6) (2022-08-10) + +### Bug Fixes + +- **vue-renderer:** 修复跨层级更新子组件时组件渲染异常 ([44bbabb](https://github.com/fe-lce/lowcode-engine-vue/commit/44bbabbef9c7b945225a4a60031e479f6faf5b51)) + +## [1.4.3](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.2...v1.4.3) (2022-07-21) + +### Bug Fixes + +- **vue-renderer:** 调整 dataSource options 处理逻辑 ([9b9642a](https://github.com/fe-lce/lowcode-engine-vue/commit/9b9642ac8bb78bd7f77af9ae99f6596e7aa00106)) + +### Features + +- **hooks:** 提供 hooks 用于自定义组件和画布通讯 ([7af68a9](https://github.com/fe-lce/lowcode-engine-vue/commit/7af68a985fd1374d3a2d6a17b80e735a30bb54fe)) +- **vue-renderer:** 新增 dataSource 对象便于调用数据源接口 ([08c9704](https://github.com/fe-lce/lowcode-engine-vue/commit/08c970457ba5691df14e8d122ba2192a90a3e529)) + +## [1.4.2](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.1...v1.4.2) (2022-07-14) + +### Bug Fixes + +- **vue-renderer:** 修复 schema id 为纯数字开头时导致的渲染报错 ([f98faa7](https://github.com/fe-lce/lowcode-engine-vue/commit/f98faa78758d76a3af65ba87736424442ec6aada)) + +## [1.4.1](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.0...v1.4.1) (2022-07-12) + +### Bug Fixes + +- **vue-renderer:** 修复默认插槽错误渲染导致部分组件渲染异常 ([8c116de](https://github.com/fe-lce/lowcode-engine-vue/commit/8c116debd7a2db4526b4d8a51aab4569cd419c1e)) +- **vue-renderer:** 修复组件非根属性更新导致的组件渲染异常 ([95f950e](https://github.com/fe-lce/lowcode-engine-vue/commit/95f950eeda727e48f3a5c9426b8c654f12268d9d)) + +# [1.4.0](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.5...v1.4.0) (2022-07-06) + +### Bug Fixes + +- **vue-renderer:** fix v-model binding failure ([844f4c2](https://github.com/fe-lce/lowcode-engine-vue/commit/844f4c253c6a4b9e235759cb558852cb4fba390a)) +- **vue-renderer:** ignore hidden in live mode ([9977c0a](https://github.com/fe-lce/lowcode-engine-vue/commit/9977c0ac76f4b6f207a85e4f0cf106c01ce724c5)) + +## [1.3.5](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.4...v1.3.5) (2022-07-04) + +### Features + +- **vue-renderer:** supports locked default slot ([af706b9](https://github.com/fe-lce/lowcode-engine-vue/commit/af706b94f6557962e36da5d705f921e0bd07a85e)) +- **vue-simulator-renderer:** exports renderer content ([f8f2e62](https://github.com/fe-lce/lowcode-engine-vue/commit/f8f2e629bcda43fe23e30ddae0e1ec633d86c60e)) + +## [1.3.2](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.1...v1.3.2) (2022-07-03) + +### Bug Fixes + +- **vue-renderer:** dataSource request error when params is empty ([5ddec10](https://github.com/fe-lce/lowcode-engine-vue/commit/5ddec107086a3fe53e5e45da144b18c3df83ca68)) + +## [1.3.1](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.0...v1.3.1) (2022-07-02) + +### Features + +- **vue-renderer:** supports ref prop ([9883532](https://github.com/fe-lce/lowcode-engine-vue/commit/9883532b717c53a7025dc3cf8f6282de96f7ebf5)) + +# [1.3.0](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.2.0...v1.3.0) (2022-07-01) + +### Features + +- **vue-renderer:** change slot params handle ([0139b3c](https://github.com/fe-lce/lowcode-engine-vue/commit/0139b3cb62e08a4fc2c29734485b65bef92710c7)) + +# [1.2.0](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.5...v1.2.0) (2022-06-30) + +### Features + +- **vue-renderer:** enhance slot and optimize scope ([f1454ea](https://github.com/fe-lce/lowcode-engine-vue/commit/f1454eaae738cf8c0a12e0e34bd5a576f43cc85c)) + +## [1.1.5](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.4...v1.1.5) (2022-06-30) + +### Features + +- **vue-renderer:** adapter naive private props ([2a36671](https://github.com/fe-lce/lowcode-engine-vue/commit/2a36671f0ec8b3295e5664e18549a345be64b2a1)) + +## [1.1.4](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.3...v1.1.4) (2022-06-27) + +### Bug Fixes + +- **vue-renderer:** extra props obtain failed ([a73ddea](https://github.com/fe-lce/lowcode-engine-vue/commit/a73ddea49688aa56aebebd8bf07db862053bf441)) + +## [1.1.3](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.2...v1.1.3) (2022-06-27) + +**Note:** Version bump only for package @felce/lowcode-vue-renderer + +## [1.1.2](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.1...v1.1.2) (2022-06-24) + +**Note:** Version bump only for package @felce/lowcode-vue-renderer + +## [1.1.1](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.0...v1.1.1) (2022-06-24) + +### Features + +- update versions ([ed20df8](https://github.com/fe-lce/lowcode-engine-vue/commit/ed20df8055dd13c75638774a9b12f409fdec8c94)) +- **vue-renderer|vue-simulator-renderer:** modify the el access method ([af454ea](https://github.com/fe-lce/lowcode-engine-vue/commit/af454ea47d44298ef04fd0ead2359403e2c1e77d)) + +# [1.1.0](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.5...v1.1.0) (2022-06-16) + +### Features + +- **vue-renderer:** supports v-model prop compile ([0ea42ae](https://github.com/fe-lce/lowcode-engine-vue/commit/0ea42ae71209c01eace47445c33421fef76a9f9e)) + +## [1.0.5](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.4...v1.0.5) (2022-06-15) + +### Bug Fixes + +- **vue-renderer:** 修复 Hoc 跨层级更新节点导致的渲染异常 ([aa683a0](https://github.com/fe-lce/lowcode-engine-vue/commit/aa683a0b767f1d80a89dbfeb5a1d480f4f08c6a3)) + +## [1.0.4](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.3...v1.0.4) (2022-06-15) + +### Bug Fixes + +- **vue-renderer:** 修复 hoc 移除节点功能异常 ([051ef81](https://github.com/fe-lce/lowcode-engine-vue/commit/051ef8183bd0ee7c7e3b6c8565543e739c987d5e)) + +## [1.0.3](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.2...v1.0.3) (2022-06-15) + +**Note:** Version bump only for package @felce/lowcode-vue-renderer + +## [1.0.2](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.1...v1.0.2) (2022-06-15) + +**Note:** Version bump only for package @felce/lowcode-vue-renderer + +## 1.0.1 (2022-06-15) + +**Note:** Version bump only for package @felce/lowcode-vue-renderer diff --git a/packages/vue-renderer/README.md b/packages/vue-renderer/README.md new file mode 100644 index 0000000000..fe84005413 --- /dev/null +++ b/packages/vue-renderer/README.md @@ -0,0 +1 @@ +../../README.md \ No newline at end of file diff --git a/packages/vue-renderer/build.json b/packages/vue-renderer/build.json new file mode 100644 index 0000000000..6f284f44f9 --- /dev/null +++ b/packages/vue-renderer/build.json @@ -0,0 +1,3 @@ +{ + "plugins": ["build-plugin-component"] +} diff --git a/packages/vue-renderer/build.plugin.cjs b/packages/vue-renderer/build.plugin.cjs new file mode 100644 index 0000000000..b7589abbc6 --- /dev/null +++ b/packages/vue-renderer/build.plugin.cjs @@ -0,0 +1,10 @@ +module.exports = ({ onGetWebpackConfig }) => { + onGetWebpackConfig((config) => { + config.module + .rule('mjs$') + .test(/\.mjs$/) + .include.add(/node_modules/) + .end() + .type('javascript/auto'); + }); +}; diff --git a/packages/vue-renderer/build.umd.json b/packages/vue-renderer/build.umd.json new file mode 100644 index 0000000000..ef38139cb7 --- /dev/null +++ b/packages/vue-renderer/build.umd.json @@ -0,0 +1,24 @@ +{ + "entry": { + "vue-renderer": "./src/index.ts" + }, + "sourceMap": false, + "library": "LCVueRenderer", + "libraryTarget": "umd", + "externals": { + "vue": "var window.Vue" + }, + "outputAssetsPath": { + "js": "", + "css": "" + }, + "polyfill": false, + "outputDir": "dist", + "vendor": false, + "ignoreHtmlTemplate": true, + "plugins": [ + "build-plugin-react-app", + ["build-plugin-moment-locales", { "locales": ["zh-cn"] }], + "./build.plugin.cjs" + ] +} diff --git a/packages/vue-renderer/package.json b/packages/vue-renderer/package.json new file mode 100644 index 0000000000..868da6d885 --- /dev/null +++ b/packages/vue-renderer/package.json @@ -0,0 +1,40 @@ +{ + "name": "@felce/lowcode-vue-renderer", + "main": "./lib/index.js", + "module": "./es/index.js", + "unpkg": "./dist/vue-renderer.js", + "version": "1.4.1", + "files": [ + "es", + "lib", + "dist" + ], + "scripts": { + "build": "build-scripts build", + "build:umd": "build-scripts build --config=build.umd.json", + "lint:type": "tsc -p ./tsconfig.json --noEmit", + "prepublishOnly": "pnpm build && pnpm build:umd" + }, + "homepage": "https://unpkg.com/@felce/lowcode-vue-renderer@1.4.1/build/index.html", + "dependencies": { + "@felce/lowcode-types": "^1.4.1", + "intl-messageformat": "^10.1.4", + "lodash-es": "^4.17.21" + }, + "devDependencies": { + "@felce/lowcode-designer": "^1.4.1", + "@types/lodash-es": "^4.17.6", + "build-plugin-component": "^1.11.0", + "build-plugin-moment-locales": "^0.1.3", + "build-plugin-react-app": "^1.8.0", + "vue": "^3.2.38" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "repository": { + "type": "http", + "url": "https://github.com/fe-lce/lowcode-engine-vue/tree/main/packages/vue-renderer" + } +} diff --git a/packages/vue-renderer/src/config.ts b/packages/vue-renderer/src/config.ts new file mode 100644 index 0000000000..9608ca5822 --- /dev/null +++ b/packages/vue-renderer/src/config.ts @@ -0,0 +1,27 @@ +import { RendererComponent } from './core'; +import { RENDERER_COMPS } from './renderers'; + +export type RendererModules = Record; + +export class Config { + private renderers: RendererModules = { ...RENDERER_COMPS }; + private configProvider: any = null; + + setConfigProvider(comp: any) { + this.configProvider = comp; + } + + getConfigProvider() { + return this.configProvider; + } + + setRenderers(renderers: RendererModules) { + this.renderers = renderers; + } + + getRenderers() { + return this.renderers; + } +} + +export default new Config(); diff --git a/packages/vue-renderer/src/core/base.ts b/packages/vue-renderer/src/core/base.ts new file mode 100644 index 0000000000..ef7b1cb689 --- /dev/null +++ b/packages/vue-renderer/src/core/base.ts @@ -0,0 +1,89 @@ +import { IPublicTypeNodeSchema, IPublicTypeRootSchema } from '@felce/lowcode-types'; +import { Node } from '@felce/lowcode-designer'; +import { Component, ComponentPublicInstance, PropType, VNodeProps } from 'vue'; +import { BlockScope, I18nMessages, RuntimeScope } from '../utils'; + +export const rendererProps = { + __scope: { + type: Object as PropType, + default: undefined, + }, + __schema: { + type: Object as PropType, + required: true, + }, + __designMode: { + type: String as PropType<'live' | 'design'>, + default: 'live', + }, + __components: { + type: Object as PropType>, + required: true, + }, + __locale: { + type: String, + default: undefined, + }, + __messages: { + type: Object as PropType, + default: () => ({}), + }, + __getNode: { + type: Function as PropType<(id: string) => Node | null>, + required: true, + }, + __triggerCompGetCtx: { + type: Function as PropType< + (schema: IPublicTypeNodeSchema, ref: ComponentPublicInstance) => void + >, + required: true, + }, +} as const; + +export interface RendererProps { + __scope?: BlockScope; + __locale?: string; + __messages?: I18nMessages; + __designMode?: 'live' | 'design'; + __schema: IPublicTypeRootSchema; + __components: Record; + __getNode: (id: string) => Node | null; + __triggerCompGetCtx: (schema: IPublicTypeNodeSchema, ref: ComponentPublicInstance) => void; +} + +export const baseRendererPropKeys = Object.keys(rendererProps) as (keyof RendererProps)[]; + +export type RendererComponent = { + new (...args: any[]): { + $props: VNodeProps & RendererProps; + }; +}; + +export const leafProps = { + comp: { + type: Object as PropType, + default: undefined, + }, + scope: { + type: Object as PropType, + default: () => ({}), + }, + schema: { + type: Object as PropType, + default: () => ({}), + }, +} as const; + +export interface LeafProps { + comp?: Component | null; + scope: RuntimeScope; + schema: IPublicTypeNodeSchema; +} + +export const leafPropKeys = Object.keys(rendererProps) as (keyof LeafProps)[]; + +export type LeafComponent = { + new (...args: any[]): { + $props: VNodeProps & LeafProps; + }; +}; diff --git a/packages/vue-renderer/src/core/hoc.ts b/packages/vue-renderer/src/core/hoc.ts new file mode 100644 index 0000000000..7e3b6c4a81 --- /dev/null +++ b/packages/vue-renderer/src/core/hoc.ts @@ -0,0 +1,168 @@ +import { ISlotNode } from '@felce/lowcode-designer'; +import { IPublicEnumTransformStage } from '@felce/lowcode-types'; +import { isJSSlot } from '@felce/lowcode-utils'; +import { isNil } from 'lodash-es'; +import { ComponentPublicInstance, defineComponent, Fragment, h, onUnmounted, reactive } from 'vue'; +import { useRendererContext } from '../hooks'; +import { ensureArray } from '../utils'; +import { leafProps } from './base'; +import { PropSchemaMap, SlotSchemaMap, useLeaf } from './use'; + +export const Hoc = defineComponent({ + name: 'Hoc', + props: leafProps, + setup(props) { + const { triggerCompGetCtx } = useRendererContext(); + const { node, locked, buildSchema, buildProps, buildSlots, buildLoop, buildShow } = + useLeaf(props); + + const { show, hidden, condition } = buildShow(props.schema); + const { loop, updateLoop, updateLoopArg, buildLoopScope } = buildLoop(props.schema); + + const compProps: PropSchemaMap = reactive({}); + const compSlots: SlotSchemaMap = reactive({}); + const result = buildSchema(); + Object.assign(compProps, result.props); + Object.assign(compSlots, result.slots); + + // hoc + if (node) { + const disposeFunctions: Array = []; + onUnmounted(() => disposeFunctions.forEach((dispose) => dispose?.())); + disposeFunctions.push( + node.onChildrenChange(() => { + const schema = node.export(IPublicEnumTransformStage.Render); + compSlots.default = ensureArray(schema.children); + }), + ); + disposeFunctions.push( + node.onPropChange((info) => { + const { key, prop, newValue, oldValue } = info; + + /** + * 是否为根属性的修改 + * + * @remark + * + * 对于 props + * + * ```js + * { + * color: 'red', + * border: { + * top: 12, + * left: 20, + * } + * } + * ``` + * + * 则,对于属性 `color` 的修改为根属性的修改,而对于 `border.top` 的修改为非根属性的修改 + */ + const isRootProp = prop.path.length === 1; + + /** 根属性的 key 值 */ + const rootPropKey: string = prop.path[0]; + + if (isRootProp && key) { + if (key === '___isLocked___') { + // 设计器控制组件锁定 + locked.value = newValue; + } else if (key === '___hidden___') { + // 设计器控制组件渲染 + hidden(newValue); + } else if (key === '___condition___') { + // 条件渲染更新 v-if + condition(newValue); + } else if (key === '___loop___') { + // 循环数据更新 v-for + updateLoop(newValue); + } else if (key === '___loopArgs___') { + // 循环参数初始化 (item, index) + updateLoopArg(newValue); + } else if (key === 'children') { + // 默认插槽更新 + if (isJSSlot(newValue)) { + const slotNode: ISlotNode = prop.slotNode; + const schema = slotNode.export(IPublicEnumTransformStage.Render); + compSlots.default = schema; + } else if (!isNil(newValue)) { + compSlots.default = ensureArray(newValue); + } else { + delete compSlots.default; + } + } else if (isJSSlot(newValue)) { + // 具名插槽更新 + const slotNode: ISlotNode = prop.slotNode; + const schema = slotNode.export(IPublicEnumTransformStage.Render); + compSlots[key] = schema; + } else if (isNil(newValue) && isJSSlot(oldValue)) { + // 具名插槽移除 + delete compSlots[key]; + } else { + // 普通根属性更新 + compProps[key] = newValue; + } + } else if (rootPropKey === '___loopArgs___') { + // 循环参数更新 (item, index) + updateLoopArg(newValue, key); + } else if (rootPropKey) { + // 普通非根属性更新 + compProps[rootPropKey] = node.getPropValue(rootPropKey); + } + }), + ); + } + + const getRef = (inst: ComponentPublicInstance) => { + triggerCompGetCtx(props.schema, inst); + }; + + return { + show, + loop, + compSlots, + compProps, + getRef, + buildSlots, + buildProps, + buildLoopScope, + }; + }, + render() { + const { + comp, + show, + loop, + compProps, + compSlots, + getRef, + buildSlots, + buildProps, + buildLoopScope, + } = this; + + if (!show) return null; + if (!comp) return h('div', 'component not found'); + + if (!loop) { + const props = buildProps(compProps, null, { ref: getRef }); + const slots = buildSlots(compSlots); + return h(comp, props, slots); + } + + if (!Array.isArray(loop)) { + console.warn('[vue-renderer]: loop must be array', loop); + return null; + } + + return h( + Fragment, + loop.map((item, index, arr) => { + const blockScope = buildLoopScope(item, index, arr.length); + const props = buildProps(compProps, blockScope, { ref: getRef }); + const slots = buildSlots(compSlots, blockScope); + return h(comp, props, slots); + }), + ); + }, +}); diff --git a/packages/vue-renderer/src/core/index.ts b/packages/vue-renderer/src/core/index.ts new file mode 100644 index 0000000000..abb99343c2 --- /dev/null +++ b/packages/vue-renderer/src/core/index.ts @@ -0,0 +1,2 @@ +export * from './base'; +export * from './use'; diff --git a/packages/vue-renderer/src/core/live.ts b/packages/vue-renderer/src/core/live.ts new file mode 100644 index 0000000000..b015b0f6c5 --- /dev/null +++ b/packages/vue-renderer/src/core/live.ts @@ -0,0 +1,54 @@ +import { defineComponent, Fragment, h } from 'vue'; +import { useLeaf } from './use'; +import { leafProps } from './base'; + +export const Live = defineComponent({ + props: leafProps, + setup(props) { + const { buildSchema, buildProps, buildLoop, buildSlots, buildShow } = useLeaf(props); + + const { show } = buildShow(props.schema); + const { loop, loopArgs } = buildLoop(props.schema); + const { props: compProps, slots: compSlots } = buildSchema(); + + return { + show, + loop, + loopArgs, + compProps, + compSlots, + buildSlots, + buildProps, + }; + }, + render() { + const { show, comp, loop, loopArgs, compProps, compSlots, buildProps, buildSlots } = + this; + + if (!show) return null; + if (!comp) return h('div', 'component not found'); + if (!loop) { + return h(comp, buildProps(compProps), buildSlots(compSlots)); + } + + if (!Array.isArray(loop)) { + console.warn('[vue-renderer]: loop must be array', loop); + return null; + } + + return h( + Fragment, + loop.map((item, index) => { + const blockScope = { + [loopArgs[0]]: item, + [loopArgs[1]]: index, + }; + return h( + comp, + buildProps(compProps, blockScope), + buildSlots(compSlots, blockScope) + ); + }) + ); + }, +}); diff --git a/packages/vue-renderer/src/core/use.ts b/packages/vue-renderer/src/core/use.ts new file mode 100644 index 0000000000..b17fd75ab8 --- /dev/null +++ b/packages/vue-renderer/src/core/use.ts @@ -0,0 +1,807 @@ +import { Prop } from '@felce/lowcode-designer'; +import { + CompositeValue, + IPublicEnumTransformStage, + IPublicTypeNodeData, + IPublicTypeNodeSchema, + IPublicTypeSlotSchema, + JSFunction, +} from '@felce/lowcode-types'; +import { + isDOMText, + isJSExpression, + isJSFunction, + isJSSlot, + isNodeSchema, + isObject, +} from '@felce/lowcode-utils'; +import { camelCase, isFunction, isNil, isString, pickBy } from 'lodash-es'; +import { + Component, + computed, + ComputedRef, + createTextVNode, + getCurrentInstance, + h, + inject, + InjectionKey, + isRef, + onBeforeMount, + onBeforeUnmount, + onBeforeUpdate, + onErrorCaptured, + onMounted, + onUnmounted, + onUpdated, + provide, + reactive, + Ref, + ref, + Slot, + Slots, + toDisplayString, + toRaw, + VNode, +} from 'vue'; +import { createDataSourceManager } from '../data-source'; +import { getCurrentNodeKey, getRendererContextKey, useRendererContext } from '../hooks'; +import { + BlockScope, + ensureArray, + getI18n, + MaybeArray, + mergeScope, + parseExpression, + parseSchema, + parseSlotScope, + RuntimeScope, +} from '../utils'; +import { LeafProps, RendererProps } from './base'; +import { Hoc } from './hoc'; +import { Live } from './live'; + +const currentNodeKey = getCurrentNodeKey(); + +const VUE_LIFTCYCLES_MAP = { + beforeMount: onBeforeMount, + mounted: onMounted, + beforeUpdate: onBeforeUpdate, + updated: onUpdated, + beforeUnmount: onBeforeUnmount, + unmounted: onUnmounted, + errorCaptured: onErrorCaptured, +}; + +// 适配 react lifecycle +const REACT_ADATPOR_LIFTCYCLES_MAP = { + componentDidMount: onMounted, + componentDidCatch: onErrorCaptured, + shouldComponentUpdate: onBeforeUpdate, + componentWillUnmount: onBeforeUnmount, +}; + +const LIFTCYCLES_MAP = { + ...VUE_LIFTCYCLES_MAP, + ...REACT_ADATPOR_LIFTCYCLES_MAP, +}; + +export function isLifecycleKey(key: string): key is keyof typeof LIFTCYCLES_MAP { + return key in LIFTCYCLES_MAP; +} + +export type SlotSchemaMap = { + [x: string]: IPublicTypeSlotSchema | IPublicTypeNodeData[] | undefined; +}; + +export type PropSchemaMap = { + [x: string]: unknown; +}; + +export function isNodeData(val: unknown): val is IPublicTypeNodeData | IPublicTypeNodeData[] { + if (Array.isArray(val)) { + return val.every((item) => isNodeData(item)); + } + return isDOMText(val) || isNodeSchema(val) || isJSExpression(val); +} + +export function isVueComponent(val: unknown): val is Component { + if (isFunction(val)) return true; + if (isObject(val) && ('render' in val || 'setup' in val)) { + return true; + } + return false; +} + +const IS_LOCKED: InjectionKey> = Symbol('IS_LOCKED'); + +export function useLocked(defaultValue: boolean) { + const selfLocked = ref(defaultValue); + const parentLocked = inject(IS_LOCKED, null); + + const locked = computed({ + get: () => parentLocked?.value || selfLocked.value, + set: (val) => (selfLocked.value = val), + }); + + provide(IS_LOCKED, locked); + + return locked; +} + +export function useLeaf(props: LeafProps) { + const { components, getNode, designMode } = useRendererContext(); + + const node = props.schema.id ? getNode(props.schema.id) : null; + // 仅在设计模式下生效 + const locked = node ? useLocked(node.isLocked) : ref(false); + + const isDesignMode = designMode === 'design'; + + provide(currentNodeKey, { + mode: designMode, + node: node, + isDesignerEnv: isDesignMode, + }); + + /** + * 渲染节点 vnode + * @param schema - 节点 schema + * @param base - 节点 leaf 组件,根据 designMode 的不同而不同 + * @param blockScope - 节点块级作用域 + * @param comp - 节点渲染的组件,若不传入,则根据节点的 componentName 推断 + */ + const render = ( + schema: IPublicTypeNodeData, + base: Component, + blockScope?: MaybeArray, + comp?: Component, + ) => { + const mergedScope = mergeScope(props.scope, blockScope); + + // 若 schema 不为 NodeSchema,则直接渲染 + if (isString(schema)) { + return createTextVNode(schema); + } else if (isJSExpression(schema)) { + const result = parseExpression(schema, mergedScope); + return createTextVNode(toDisplayString(result)); + } + + // 若不传入 comp,则根据节点的 componentName 推断 + if (!comp) { + const { componentName } = schema; + comp = components[componentName]; + } + + if (!comp) return h('div', 'component not found'); + + // 应用节点组件的私有属性,适配 naive-ui 的 grid,popover 等组件 + const privateProperties = pickBy(comp, (_, k) => { + return !!k.match(/^__[\s\S]+__/); + }); + if (Object.keys(privateProperties).length > 0) { + base = Object.create(base, Object.getOwnPropertyDescriptors(privateProperties)); + } + + // 渲染 leaf 组件 + return h(base, { + key: schema.id, + comp, + scope: mergedScope, + schema: schema, + } as any); + }; + + /** + * 渲染节点vnode (design 模式) + * @param nodeSchema - 节点 schema + * @param blockScope - 节点块级作用域 + * @param comp - 节点渲染的组件,若不传入,则根据节点的 componentName 推断 + */ + const renderHoc = ( + nodeSchema: IPublicTypeNodeData, + blockScope?: MaybeArray, + comp?: Component, + ): VNode | null => { + return render(nodeSchema, Hoc, blockScope, comp); + }; + + /** + * 渲染节点vnode (live 模式) + * @param nodeSchema - 节点 schema + * @param blockScope - 节点块级作用域 + * @param comp - 节点渲染的组件,若不传入,则根据节点的 componentName 推断 + */ + const renderLive = ( + nodeSchema: IPublicTypeNodeData, + blockScope?: MaybeArray, + comp?: Component, + ): VNode | null => { + return render(nodeSchema, Live, blockScope, comp); + }; + + /** + * 渲染组件 + */ + const renderComp = isDesignMode ? renderHoc : renderLive; + + /** + * 构建当前节点的 schema,获取 schema 的属性及插槽 + * + * - node 的 children 会被处理成默认插槽 + * - 类型为 JSSlot 的 prop 会被处理为具名插槽 + * - prop 和 node 中同时存在 children 时,prop children 会覆盖 node children + * - className prop 会被处理为 class prop + */ + const buildSchema = () => { + const schema = node ? node.export(IPublicEnumTransformStage.Render) : props.schema; + + const slotProps: SlotSchemaMap = {}; + const normalProps: PropSchemaMap = {}; + + // 处理节点默认插槽,可能会被属性插槽覆盖 + slotProps.default = ensureArray(schema.children); + + Object.entries(schema.props ?? {}).forEach(([key, val]) => { + if (isJSSlot(val)) { + // 处理具名插槽 + const prop = node?.getProp(key); + if (prop && prop.slotNode) { + // design 模式,从 prop 对象到处 schema + const slotSchema = prop.slotNode.export(IPublicEnumTransformStage.Render); + slotProps[key] = slotSchema; + } else if (val.value) { + // live 模式,直接获取 schema 值,若值为空则不渲染插槽 + slotProps[key] = { + componentName: 'Slot', + params: val.params, + children: val.value, + }; + } + } else if (key === 'className') { + // 适配 react className + normalProps.class = val; + } else if (key === 'children' && isNodeData(val)) { + // 处理属性中的默认插槽,属性的重默认插槽会覆盖节点 chilren 插槽 + slotProps.default = ensureArray(val); + } else { + // 处理普通属性 + normalProps[key] = val; + } + }); + + return { props: normalProps, slots: slotProps }; + }; + + /** + * 将单个属性 schema 转化成真实值 + * + * @param schema - 属性 schema + * @param scope - 当前作用域 + * @param blockScope - 当前块级作用域 + * @param prop - 属性对象,仅在 design 模式下有值 + */ + const buildProp = ( + schema: unknown, + scope: RuntimeScope, + blockScope?: BlockScope | null, + prop?: Prop | null, + ): any => { + if (isJSExpression(schema) || isJSFunction(schema)) { + // 处理表达式和函数 + return parseExpression(schema, scope); + } else if (isJSSlot(schema)) { + // 处理属性插槽 + let slotParams: string[]; + let slotSchema: IPublicTypeNodeData[] | IPublicTypeSlotSchema; + if (prop?.slotNode) { + // design 模式,从 prop 中导出 schema + slotSchema = prop.slotNode.export(IPublicEnumTransformStage.Render); + slotParams = slotSchema.params ?? []; + } else { + // live 模式,直接获取 schema 值 + slotSchema = ensureArray(schema.value); + slotParams = schema.params ?? []; + } + + // 返回 slot 函数 + return (...args: unknown[]) => { + const slotScope = parseSlotScope(args, slotParams); + const vnodes: VNode[] = []; + ensureArray(slotSchema).forEach((item) => { + const vnode = renderComp(item, [blockScope, slotScope]); + vnode && vnodes.push(vnode); + }); + return vnodes; + }; + } else if (Array.isArray(schema)) { + // 属性值为 array,递归处理属性的每一项 + return schema.map((item, idx) => buildProp(item, scope, blockScope, prop?.get(idx))); + } else if (schema && isObject(schema)) { + // 属性值为 object,递归处理属性的每一项 + const res: Record = {}; + Object.keys(schema).forEach((key) => { + if (key.startsWith('__')) return; + const val = schema[key]; + const childProp = prop?.get(key); + res[key] = buildProp(val, scope, blockScope, childProp); + }); + return res; + } + return schema; + }; + + /** + * 构建 ref prop,将 string ref 其转化为 function + * + * @param schema - prop schema + * @param scope - 当前作用域 + * @param blockScope - 当前块级作用域 + * @param prop - 属性对象,仅在 design 模式下有值 + */ + const buildRefProp = ( + schema: unknown, + scope: RuntimeScope, + blockScope?: BlockScope | null, + prop?: Prop | null, + ): any => { + if (isString(schema)) { + const field = schema; + let lastInst: unknown = null; + return (inst: unknown): void => { + let refs = scope.$.refs; + if (Object.keys(refs).length === 0) { + refs = scope.$.refs = {}; + } + if (isNil(scope.__loopRefIndex)) { + refs[field] = inst; + if (field in scope) { + scope[field] = inst; + } + } else { + let target = refs[field] as unknown[]; + if (!Array.isArray(target)) { + target = refs[field] = []; + if (field in scope) { + target = scope[field] = target; + } + } else if (field in scope) { + const scopeTarget = scope[field]; + if (!Array.isArray(scopeTarget) || toRaw(scopeTarget) !== target) { + target = scope[field] = target; + } else { + target = scopeTarget; + } + } + if (isNil(inst)) { + const idx = target.indexOf(lastInst); + idx >= 0 && target.splice(idx, 1); + } else { + target[scope.__loopRefIndex] = inst; + } + } + lastInst = inst; + }; + } else { + const propValue = buildProp(schema, scope, blockScope, prop); + return isString(propValue) ? buildRefProp(propValue, scope, blockScope, prop) : propValue; + } + }; + + /** + * 处理属性 schema,主要处理的目标: + * - ref 逻辑 (合并 ref function) + * - 事件绑定逻辑 (重复注册的事件转化为数组) + * - 双向绑定逻辑 (v-model) + * - 指令绑定逻辑 TODO + * @param target - 组件属性目标对象 + * @param key - 属性名 + * @param val - 属性值 + */ + const processProp = (target: Record, key: string, val: unknown) => { + if (key.startsWith('v-model')) { + // 双向绑定逻辑 + const matched = key.match(/v-model(?::(\w+))?$/); + if (!matched) return target; + + const valueProp = camelCase(matched[1] ?? 'modelValue'); + const eventProp = `onUpdate:${valueProp}`; + + // 若值为表达式,则自定注册 onUpdate 事件,实现双向绑定 + if (isJSExpression(val)) { + const updateEventFn: JSFunction = { + type: 'JSFunction', + value: `function ($event) {${val.value} = $event}`, + }; + target[eventProp] = + eventProp in target + ? ensureArray(target[eventProp]).concat(updateEventFn) + : updateEventFn; + } + target[valueProp] = val; + } else if (key.startsWith('v-') && isJSExpression(val)) { + // TODO: 指令绑定逻辑 + } else if (key.match(/^on[A-Z]/) && isJSFunction(val)) { + // 事件绑定逻辑 + + // normalize: onUpdateXxx => onUpdate:xxx + const matched = key.match(/onUpdate(?::?(\w+))$/); + if (matched) { + key = `onUpdate:${camelCase(matched[1])}`; + } + + // 若事件名称重复,则自动转化为数组 + target[key] = key in target ? ensureArray(target[key]).concat(val) : val; + } else if (key === 'ref' && 'ref' in target) { + // ref 合并逻辑 + const sourceRef = val; + const targetRef = target.ref; + if (isFunction(targetRef) && isFunction(sourceRef)) { + target.ref = (...args: unknown[]) => { + sourceRef(...args); + targetRef(...args); + }; + } else { + target.ref = [targetRef, sourceRef].filter(isFunction).pop(); + } + } else { + target[key] = val; + } + }; + + /** + * 构建属性,将整个属性 schema 转化为真实的属性值 + * @param propsSchema - 属性 schema + * @param blockScope - 当前块级作用域 + * @param extraProps - 运行时附加属性 + */ + const buildProps = ( + propsSchema: Record, + blockScope?: BlockScope | null, + extraProps?: Record, + ): any => { + // 属性预处理 + const processed: Record = {}; + Object.keys(propsSchema).forEach((propKey) => { + processProp(processed, propKey, propsSchema[propKey]); + }); + + // 将属性 schema 转化成真实的属性值 + const parsedProps: Record = {}; + const mergedScope = blockScope ? mergeScope(props.scope, blockScope) : props.scope; + Object.keys(processed).forEach((propName) => { + const schema = processed[propName]; + parsedProps[propName] = + propName === 'ref' + ? buildRefProp(schema, mergedScope, blockScope, node?.getProp(propName)) + : buildProp(schema, mergedScope, blockScope, node?.getProp(propName)); + }); + + // 应用运行时附加的属性值 + if (extraProps) { + Object.keys(extraProps).forEach((propKey) => { + processProp(parsedProps, propKey, extraProps[propKey]); + }); + } + + return parsedProps; + }; + + const buildLoop = (schema: IPublicTypeNodeSchema) => { + const loop = ref() as Ref; + const loopArgs = ref(['item', 'index']) as Ref<[string, string]>; + + if (schema.loop) loop.value = schema.loop; + if (schema.loopArgs) { + schema.loopArgs.forEach((v, i) => { + loopArgs.value[i] = v; + }); + } + + return { + loop: computed(() => { + if (!loop.value) return null; + return parseSchema(loop.value, props.scope); + }), + loopArgs, + updateLoop(value: CompositeValue): void { + loop.value = value; + }, + updateLoopArg(value: string | [string, string], idx?: number): void { + if (Array.isArray(value)) { + value.forEach((v, i) => { + loopArgs.value[i] = v; + }); + } else if (!isNil(idx)) { + loopArgs.value[idx] = value; + } + }, + buildLoopScope(item, index, len): BlockScope { + const scope = props.scope; + const offset = scope.__loopRefOffset ?? 0; + const [itemKey, indexKey] = loopArgs.value; + return { + [itemKey]: item, + [indexKey]: index, + __loopScope: true, + __loopRefIndex: offset + index, + __loopRefOffset: len * index, + }; + }, + } as { + loop: ComputedRef; + loopArgs: Ref<[string, string]>; + updateLoop(value: CompositeValue): void; + /** + * 更新所有循环参数 + * + * @example + * + * updateLoopArg(['item', 'index']) + * + * @param value - 新的参数 + */ + updateLoopArg(value: [string, string]): void; + /** + * 更新指定参数 + * + * @example + * + * updateLoopArg('item', 0); + * + * @param value - 新的参数 + * @param idx - 参数的位置 + */ + updateLoopArg(value: string, idx?: number | string): void; + /** + * 构建循环局部作用域 + * + * @param item - 循环项 + * @param index - 循环索引 + * @param len - 循环目标数组长度 + */ + buildLoopScope(item: unknown, index: number, len: number): BlockScope; + }; + }; + + const buildShow = (schema: IPublicTypeNodeSchema) => { + const hidden = isDesignMode ? ref(schema.hidden ?? false) : ref(false); + const condition = ref(schema.condition ?? true); + + const show = computed(() => { + if (hidden.value) return false; + const { value: showCondition } = condition; + if (typeof showCondition === 'boolean') return showCondition; + return !!parseSchema(showCondition, props.scope); + }); + + return { + show, + hidden: (val: boolean) => { + hidden.value = val; + }, + condition: (val: unknown) => { + condition.value = val; + }, + }; + }; + + /** + * 装饰默认插槽,当插槽为空时,渲染插槽占位符,便于拖拽 + * + * @param slot - 插槽渲染函数 + */ + const decorateDefaultSlot = (slot: Slot): Slot => { + return (...args: unknown[]) => { + const vnodes = slot(...args); + if (!vnodes.length) { + const isLocked = locked.value; + const className = { + 'lc-container-locked': isLocked, + 'lc-container-placeholder': true, + }; + const placeholder = isLocked ? '锁定元素及子元素无法编辑' : '拖拽组件或模板到这里'; + vnodes.push(h('div', { class: className }, placeholder)); + } + return vnodes; + }; + }; + + /** + * 构建所有插槽 schema,将 schema 构建成 slot 函数 + * @param slots - 插槽 schema + * @param blockScope - 插槽块级作用域 + */ + const buildSlots = (slots: SlotSchemaMap, blockScope?: BlockScope | null): Slots => { + return Object.keys(slots).reduce( + (prev, next) => { + const slotSchema = slots[next]; + const isDefaultSlot = next === 'default'; + + // 插槽数据为 null 或 undefined 时不渲染插槽 + if (isNil(slotSchema)) return prev; + + // 默认插槽内容为空,且当前节点不是容器节点时,不渲染默认插槽 + if ( + isDefaultSlot && + !node?.isContainer() && + Array.isArray(slotSchema) && + slotSchema.length === 0 + ) + return prev; + + let renderSlot: Slot; + + if (Array.isArray(slotSchema)) { + // 插槽为数组,则当前插槽不可拖拽编辑,直接渲染插槽内容 + renderSlot = () => { + return slotSchema + .map((item) => renderComp(item, blockScope)) + .filter((vnode): vnode is VNode => !isNil(vnode)); + }; + } else if (slotSchema.id) { + // 存在 slot id,则当前插槽可拖拽编辑,渲染 Hoc + renderSlot = (...args: unknown[]) => { + const vnode = renderComp(slotSchema, [ + blockScope, + parseSlotScope(args, slotSchema.params ?? []), + ]); + return isNil(vnode) ? [] : [vnode]; + }; + } else { + // 不存在 slot id,插槽不可拖拽编辑,直接渲染插槽内容 + renderSlot = (...args: unknown[]) => { + const slotScope = parseSlotScope(args, slotSchema.params ?? []); + return ensureArray(slotSchema.children) + .map((item) => renderComp(item, [blockScope, slotScope])) + .filter((vnode): vnode is VNode => !isNil(vnode)); + }; + } + + prev[next] = + isDefaultSlot && isDesignMode && node?.isContainer() + ? decorateDefaultSlot(renderSlot) // 当节点为容器节点,且为设计模式下,则装饰默认插槽 + : renderSlot; + + return prev; + }, + {} as Record, + ); + }; + + return { + node, + locked, + buildShow, + renderComp, + buildLoop, + buildProps, + buildSlots, + buildSchema, + }; +} + +export function useRenderer(props: RendererProps) { + const { scope } = useRootScope(props); + + const leafProps: LeafProps = reactive({ + comp: null, + scope: scope, + schema: computed(() => props.__schema), + }); + + const contextKey = getRendererContextKey(); + + const designModeRef = computed(() => props.__designMode); + const componentsRef = computed(() => props.__components); + + provide( + contextKey, + reactive({ + designMode: designModeRef, + components: componentsRef, + getNode: (id: string) => props.__getNode?.(id) ?? null, + triggerCompGetCtx: computed(() => props.__triggerCompGetCtx), + }), + ); + + return { scope, designModeRef, componentsRef, ...useLeaf(leafProps) }; +} + +export function useRootScope(rendererProps: RendererProps) { + const { __schema: schema, __scope: extraScope } = rendererProps; + + const { + props: propsSchema, + state: stateSchema, + methods: methodsSchema, + lifeCycles: lifeCyclesSchema, + } = schema ?? {}; + + // 将全局属性配置应用到 scope 中 + const instance = getCurrentInstance()!; + const scope = instance.proxy! as RuntimeScope; + const data = (instance.data = reactive({} as Record)); + + // 处理 props + const props = parseSchema(propsSchema) ?? {}; + Object.assign(instance.props, props); + + // 处理 state + const states = parseSchema(stateSchema) ?? {}; + Object.assign(data, states); + + // 处理 methods + const methods = parseSchema(methodsSchema, scope) ?? {}; + Object.assign(scope, methods); + + // 处理 lifecycle + const lifeCycles = parseSchema(lifeCyclesSchema, scope); + if (isObject(lifeCycles)) { + Object.keys(lifeCycles).forEach((lifeCycle) => { + if (isLifecycleKey(lifeCycle)) { + const callback = lifeCycles[lifeCycle]; + const hook = LIFTCYCLES_MAP[lifeCycle]; + isFunction(callback) && hook(callback, instance); + } + }); + } + + // 处理 css + let style: HTMLStyleElement | null = null; + if (schema.id) { + style = document.querySelector(`style[data-id="${schema.id}"]`); + } + if (schema.css) { + if (!style) { + style = document.createElement('style'); + if (schema.id) { + style.setAttribute('data-id', schema.id); + } + const head = document.head || document.getElementsByTagName('head')[0]; + head.appendChild(style); + } + if (style.innerHTML !== schema.css) { + style.innerHTML = schema.css; + } + } else if (style) { + style.parentElement?.removeChild(style); + } + + /** + * 添加属性到作用域,若属性为 ref,则添加到 data 中,否则添加到 ctx 中 + * + * @param source - 作用域属性来源 + */ + const addToScope = (source: BlockScope) => { + Object.keys(source).forEach((key) => { + const val = source[key]; + const target = isRef(val) ? data : scope; + Reflect.set(target, key, val); + }); + }; + + // 处理 renderer 额外传入的 scope + extraScope && addToScope(extraScope); + + // 处理 i18n + const i18n = (key: string, values?: any) => { + const { __locale: locale, __messages: messages } = rendererProps; + return getI18n(key, values, locale, messages); + }; + + const currentLocale = computed(() => rendererProps.__locale); + addToScope({ i18n, currentLocale }); + + // 处理 dataSource + const { dataSource, dataSourceMap, reloadDataSource } = createDataSourceManager( + schema.dataSource ?? { list: [], dataHandler: undefined }, + scope, + ); + addToScope({ dataSource, dataSourceMap, reloadDataSource }); + reloadDataSource(); + + return { + scope, + addToScope, + }; +} diff --git a/packages/vue-renderer/src/data-source/index.ts b/packages/vue-renderer/src/data-source/index.ts new file mode 100644 index 0000000000..18ff435dad --- /dev/null +++ b/packages/vue-renderer/src/data-source/index.ts @@ -0,0 +1,163 @@ +import { InterpretDataSource, InterpretDataSourceConfig } from '@felce/lowcode-types'; +import { isPlainObject } from '@felce/lowcode-utils'; +import { isBoolean, isFunction, isUndefined } from 'lodash-es'; +import { computed, reactive, ref, shallowRef } from 'vue'; +import { parseSchema, RuntimeScope } from '../utils'; +import { DataSourceStatus, RequestParams } from './interface'; +import { request, Response } from './request'; + +const same = (v: T) => v; +const noop = () => void 0; +const alwaysTrue = () => true; + +export type ExecutionFunc = ( + params?: RequestParams, + otherOptions?: Record, +) => Promise; + +export interface DataSourceItem { + data: T; + error: unknown; + loading: boolean; + status: DataSourceStatus; + isInit: boolean; + load: ExecutionFunc; +} + +export function createDataSourceItem( + config: InterpretDataSourceConfig, + request: CallableFunction | null, + scope: RuntimeScope, +): DataSourceItem { + const data = shallowRef(); + const error = shallowRef(); + const status = ref(DataSourceStatus.Initial); + const loading = computed(() => status.value === DataSourceStatus.Loading); + const isInit = computed(() => !!parseSchema(config.isInit, scope)); + + const { willFetch, shouldFetch, dataHandler, errorHandler } = config; + + const hooks = { + willFetch: willFetch ? parseSchema(willFetch, scope) : same, + shouldFetch: shouldFetch ? parseSchema(shouldFetch, scope) : alwaysTrue, + dataHandler: dataHandler ? parseSchema(dataHandler, scope) : (res: Response) => res.data, + errorHandler: errorHandler ? parseSchema(errorHandler, scope) : noop, + }; + + const load: ExecutionFunc = async (inputParams, otherOptions = {}) => { + try { + const { type, options, id } = config; + const { headers: inputHeaders, assignToScope = true, ...inputOptions } = otherOptions; + if (!request) { + throw new Error('unsupport fetch type: ' + type); + } + + const shouldFetch = isFunction(hooks.shouldFetch) + ? hooks.shouldFetch() + : isBoolean(hooks.shouldFetch) + ? hooks.shouldFetch + : true; + + if (!shouldFetch) { + status.value = DataSourceStatus.Error; + throw new Error(`the ${id} request should not fetch, please check the condition`); + } + + const { + params: parsedParams, + headers: parsedHeaders, + ...parsedOptions + } = parseSchema(options ?? {}, scope); + + status.value = DataSourceStatus.Loading; + const res = await request( + hooks.willFetch({ + ...parsedOptions, + ...inputOptions, + headers: { + ...(parsedHeaders as object), + ...(inputHeaders as object), + }, + params: + isPlainObject(parsedParams) && isPlainObject(inputParams) + ? { + ...parsedParams, + ...inputParams, + } + : (inputParams ?? parsedParams), + }), + ); + status.value = DataSourceStatus.Loaded; + const _data = (data.value = hooks.dataHandler(res)); + if (!isUndefined(data) && assignToScope) { + scope[id] = _data; + } + return _data; + } catch (err) { + status.value = DataSourceStatus.Error; + error.value = err; + hooks.errorHandler(err); + throw err; + } + }; + + return reactive({ + data, + error, + loading, + status, + isInit, + load, + }); +} + +export function createDataSourceManager( + { list, dataHandler }: InterpretDataSource, + scope: RuntimeScope, +) { + const dataSource: Record = {}; + const dataSourceMap: Record = {}; + + list.forEach((next) => { + const config = { dataHandler, ...next }; + const dataSourceItem = createDataSourceItem(config, request, scope); + + const func: ExecutionFunc = (params, otherOptions) => { + const mergedOptions = { + assignToScope: false, + ...otherOptions, + }; + return dataSourceItem.load(params, mergedOptions); + }; + + dataSource[next.id] = func; + dataSourceMap[next.id] = dataSourceItem; + }); + + /** + * 重新加载数据源 + * + * - 若传入 id 则加载对应 id 的数据源 + * - 若不传入 id,则加载 isInit 为 true 的数据源 + */ + const reloadDataSource = ( + id?: string, + params?: RequestParams, + otherOptions?: Record, + ) => { + if (id) { + const dataSource = dataSourceMap[id]; + if (!dataSource) { + throw new Error('dataSource not found, id: ' + id); + } + return dataSource.load(params, otherOptions); + } + const promises = Object.keys(dataSourceMap) + .map((id) => dataSourceMap[id]) + .filter((ds) => ds.isInit) + .map((ds) => ds.load()); + return Promise.all(promises); + }; + + return { dataSource, dataSourceMap, reloadDataSource }; +} diff --git a/packages/vue-renderer/src/data-source/interface.ts b/packages/vue-renderer/src/data-source/interface.ts new file mode 100644 index 0000000000..3c9e43d75e --- /dev/null +++ b/packages/vue-renderer/src/data-source/interface.ts @@ -0,0 +1,26 @@ +export type ResponseType = 'blob' | 'arrayBuffer' | 'formData' | 'text' | 'json'; + +export type RequestMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'OPTIONS'; + +export type RequestParams = Record; + +export interface RequestOptions { + uri: string; + params: RequestParams; + method: RequestMethod; + isCors: boolean; + timeout: number; + headers: Record; + responseType?: ResponseType; +} + +export enum DataSourceStatus { + /** 初始状态,尚未加载 */ + Initial = 'init', + /** 正在加载 */ + Loading = 'loading', + /** 已加载(无错误) */ + Loaded = 'loaded', + /** 加载出错了 */ + Error = 'error', +} diff --git a/packages/vue-renderer/src/data-source/request.ts b/packages/vue-renderer/src/data-source/request.ts new file mode 100644 index 0000000000..b7ee961c6b --- /dev/null +++ b/packages/vue-renderer/src/data-source/request.ts @@ -0,0 +1,140 @@ +import { isPlainObject } from '@felce/lowcode-utils'; +import { RequestOptions, ResponseType } from './interface'; + +function serializeParams(obj: Record) { + const result: string[] = []; + Object.keys(obj).forEach((key) => { + const val = obj[key]; + if (val === null || val === undefined || val === '') { + return; + } + if (typeof val === 'object') { + result.push(`${key}=${encodeURIComponent(JSON.stringify(val))}`); + } else { + result.push(`${key}=${encodeURIComponent(String(val))}`); + } + }); + return result.join('&'); +} + +function buildUrl(dataAPI: string, params?: Record) { + if (!params) return dataAPI; + const paramStr = serializeParams(params); + if (paramStr) { + return dataAPI.indexOf('?') > 0 ? `${dataAPI}&${paramStr}` : `${dataAPI}?${paramStr}`; + } + return dataAPI; +} + +function find(o: Record, k: string): [string, string] | [] { + for (const key in o) { + if (key.toLowerCase() === k) { + return [o[key], key]; + } + } + return []; +} + +function isValidResponseType(type: string): type is ResponseType { + return ['arrayBuffer', 'blob', 'formData', 'json', 'text'].includes(type); +} + +function createFormData(data: Record): FormData { + const formData = new FormData(); + for (const key in data) { + const value = data[key]; + if (value instanceof Blob) { + formData.append(key, value); + } else { + formData.append(key, String(value)); + } + } + return formData; +} + +const bodyParseStrategies: Record) => BodyInit> = { + 'application/json': (data) => JSON.stringify(data), + 'multipart/form-data': (data) => (isPlainObject(data) ? createFormData(data) : data), + 'application/x-www-form-urlencoded': (data) => serializeParams(data), +}; + +function parseRequestBody(contentType: string, data: Record): BodyInit { + const parser = Object.keys(bodyParseStrategies).find((key) => contentType.includes(key)); + return parser ? bodyParseStrategies[parser](data) : (data as unknown as BodyInit); +} + +export class RequestError extends Error { + constructor( + message: string, + public code: number, + public data?: T, + ) { + super(message); + } +} + +export class Response { + constructor( + public code: number, + public data: T, + ) {} +} + +export async function request(options: RequestOptions): Promise { + const { uri, method, timeout, params = {}, headers = {}, responseType = 'json' } = options; + + let url: string; + const requestHeaders: Record = { + Accept: 'application/json', + ...headers, + }; + + const fetchOptions: RequestInit = { + method, + headers: requestHeaders, + }; + + if (method === 'GET' || method === 'DELETE' || method === 'OPTIONS') { + url = buildUrl(uri, params); + } else { + url = uri; + const [contentType, key] = find(requestHeaders, 'content-type'); + fetchOptions.body = parseRequestBody(contentType ?? 'application/json', params); + + if (contentType === 'multipart/form-data') { + key && delete requestHeaders[key]; + } + } + + if (timeout) { + const controller = new AbortController(); + fetchOptions.signal = controller.signal; + setTimeout(() => controller.abort(), timeout); + } + + const res = await fetch(url, fetchOptions); + const code = res.status; + + if (code >= 200 && code < 300) { + if (code === 204) { + if (method === 'DELETE') { + return new Response(code, null); + } else { + throw new RequestError(res.statusText, code); + } + } else { + if (!isValidResponseType(responseType)) { + throw new RequestError(`invalid response type: ${responseType}`, -1); + } + return new Response(code, await res[responseType]()); + } + } else if (code >= 400) { + try { + const data = await res.json(); + throw new RequestError(res.statusText, code, data); + } catch { + throw new RequestError(res.statusText, code); + } + } + throw new RequestError(res.statusText, code); +} diff --git a/packages/vue-renderer/src/hooks/current-node.ts b/packages/vue-renderer/src/hooks/current-node.ts new file mode 100644 index 0000000000..22eff78e2b --- /dev/null +++ b/packages/vue-renderer/src/hooks/current-node.ts @@ -0,0 +1,48 @@ +import { Node } from '@felce/lowcode-designer'; +import { IPublicTypeNodeSchema } from '@alilc/lowcode-types'; +import { inject, InjectionKey } from 'vue'; +import { DesignMode } from './renderer-context'; + +export interface EnvNode { + mode: DesignMode; + node: Node | null; + isDesignerEnv: boolean; +} + +export interface DesignerEnvNode extends EnvNode { + mode: 'design'; + node: Node; + isDesignerEnv: true; +} + +export interface LiveEnvNode extends EnvNode { + mode: 'live'; + node: null; + isDesignerEnv: false; +} + +export type CurrentNode = DesignerEnvNode | LiveEnvNode; + +export function getCurrentNodeKey(): InjectionKey { + let key = (window as any).__currentNode; + if (!key) { + key = Symbol('__currentNode'); + (window as any).__currentNode = key; + } + return key; +} + +export function useCurrentNode(): CurrentNode { + const key = getCurrentNodeKey(); + return inject( + key, + () => { + return { + mode: 'live', + node: null, + isDesignerEnv: false, + } as LiveEnvNode; + }, + true, + ); +} diff --git a/packages/vue-renderer/src/hooks/index.ts b/packages/vue-renderer/src/hooks/index.ts new file mode 100644 index 0000000000..1b6daacb55 --- /dev/null +++ b/packages/vue-renderer/src/hooks/index.ts @@ -0,0 +1,2 @@ +export * from './current-node'; +export * from './renderer-context'; diff --git a/packages/vue-renderer/src/hooks/renderer-context.ts b/packages/vue-renderer/src/hooks/renderer-context.ts new file mode 100644 index 0000000000..377aa0f900 --- /dev/null +++ b/packages/vue-renderer/src/hooks/renderer-context.ts @@ -0,0 +1,42 @@ +import { Component, ComponentPublicInstance, InjectionKey, inject, getCurrentInstance } from 'vue'; +import { Node } from '@felce/lowcode-designer'; +import { IPublicTypeNodeSchema } from '@alilc/lowcode-types'; + +export type DesignMode = 'live' | 'design'; + +export interface RendererContext { + readonly components: Record; + readonly designMode: DesignMode; + getNode(id: string): Node | null; + triggerCompGetCtx(schema: IPublicTypeNodeSchema, val: ComponentPublicInstance): void; +} + +export function getRendererContextKey(): InjectionKey { + let key = (window as any).__rendererContext; + if (!key) { + key = Symbol('__rendererContext'); + (window as any).__rendererContext = key; + } + return key; +} + +export function useRendererContext() { + const key = getRendererContextKey(); + return inject( + key, + () => { + const props = getCurrentInstance()?.props ?? {}; + return { + components: getPropValue(props, 'components', {}), + designMode: getPropValue(props, 'designMode', 'live'), + getNode: getPropValue(props, 'getNode', () => null), + triggerCompGetCtx: getPropValue(props, 'triggerCompGetCtx', () => void 0), + }; + }, + true, + ); +} + +function getPropValue(props: Record, key: string, defaultValue: T): T { + return (props[key] || props[`__${key}`] || defaultValue) as T; +} diff --git a/packages/vue-renderer/src/index.ts b/packages/vue-renderer/src/index.ts new file mode 100644 index 0000000000..c20a5a7cb8 --- /dev/null +++ b/packages/vue-renderer/src/index.ts @@ -0,0 +1,4 @@ +export * from './core'; +export { default as config, type Config } from './config'; +export { Renderer as default } from './renderer'; +export type { RendererProps } from './renderer'; diff --git a/packages/vue-renderer/src/renderer.ts b/packages/vue-renderer/src/renderer.ts new file mode 100644 index 0000000000..95b99f1998 --- /dev/null +++ b/packages/vue-renderer/src/renderer.ts @@ -0,0 +1,113 @@ +import { IPublicTypeNodeSchema, IPublicTypeRootSchema } from '@felce/lowcode-types'; +import { Node } from '@felce/lowcode-designer'; +import { PropType, Component, ComponentPublicInstance, h, computed, defineComponent } from 'vue'; +import config from './config'; +import { RENDERER_COMPS } from './renderers'; +import { I18nMessages, BlockScope } from './utils'; + +interface RendererProps { + scope?: BlockScope; + schema: IPublicTypeRootSchema; + components: Record; + designMode?: 'live' | 'design'; + device?: string; + locale?: string; + messages?: I18nMessages; + getNode?: (id: string) => Node | null; + onCompGetCtx?: (schema: IPublicTypeNodeSchema, ref: ComponentPublicInstance) => void; +} + +const Renderer = defineComponent({ + props: { + scope: { + type: Object as PropType, + default: undefined, + }, + schema: { + type: Object as PropType, + required: true, + }, + components: { + type: Object as PropType>, + required: true, + }, + /** 设计模式,可选值:live、design */ + designMode: { + type: String as PropType<'live' | 'design'>, + default: 'live', + }, + /** 设备信息 */ + device: { + type: String, + default: undefined, + }, + /** 语言 */ + locale: { + type: String, + default: undefined, + }, + messages: { + type: Object as PropType, + default: () => ({}), + }, + getNode: { + type: Function as PropType<(id: string) => Node | null>, + default: undefined, + }, + /** 组件获取 ref 时触发的钩子 */ + onCompGetCtx: { + type: Function as PropType< + (schema: IPublicTypeNodeSchema, ref: ComponentPublicInstance) => void + >, + default: undefined, + }, + }, + setup(props: RendererProps) { + const triggerCompGetCtx = (schema: IPublicTypeNodeSchema, val: ComponentPublicInstance) => { + val && props.onCompGetCtx?.(schema, val); + }; + + const getNode = (id: string) => props.getNode?.(id) ?? null; + + const componentsRef = computed(() => ({ + ...config.getRenderers(), + ...props.components, + })); + + const renderContent = () => { + const { value: components } = componentsRef; + const { schema, scope, locale, messages, designMode } = props; + if (!schema) return null; + + const { componentName } = schema!; + let Comp = components[componentName] || components[`${componentName}Renderer`]; + if (Comp && !(Comp as any).__renderer__) { + Comp = RENDERER_COMPS[`${componentName}Renderer`]; + } + + return Comp + ? h(Comp, { + key: schema.__ctx ? `${schema.__ctx.lceKey}_${schema.__ctx.idx || '0'}` : schema.id, + __scope: scope, + __schema: schema, + __locale: locale, + __messages: messages, + __components: components, + __designMode: designMode, + __getNode: getNode, + __triggerCompGetCtx: triggerCompGetCtx, + } as any) + : null; + }; + + return () => { + const { device, locale } = props; + const configProvider = config.getConfigProvider(); + return configProvider + ? h(configProvider, { device, locale }, { default: renderContent }) + : renderContent(); + }; + }, +}) as new (...args: any[]) => { $props: RendererProps }; + +export { RendererProps, Renderer }; diff --git a/packages/vue-renderer/src/renderers/index.ts b/packages/vue-renderer/src/renderers/index.ts new file mode 100644 index 0000000000..a7bca30a00 --- /dev/null +++ b/packages/vue-renderer/src/renderers/index.ts @@ -0,0 +1,6 @@ +import { RendererComponent } from '../core'; +import { PageRenderer } from './page'; + +export const RENDERER_COMPS: Record = { + PageRenderer, +}; diff --git a/packages/vue-renderer/src/renderers/page.ts b/packages/vue-renderer/src/renderers/page.ts new file mode 100644 index 0000000000..bd11fa8c72 --- /dev/null +++ b/packages/vue-renderer/src/renderers/page.ts @@ -0,0 +1,19 @@ +import { defineComponent, h } from 'vue'; +import { useRenderer, rendererProps } from '../core'; + +const Page = defineComponent((props, { slots }) => { + return () => h('div', { class: 'lc-page', ...props }, slots); +}); + +export const PageRenderer = defineComponent({ + props: rendererProps, + __renderer__: true, + setup(props) { + const { renderComp, componentsRef } = useRenderer(props); + return () => { + const { __schema: schema } = props; + const { value: components } = componentsRef; + return renderComp(schema, null, components.Page || Page); + }; + }, +}); diff --git a/packages/vue-renderer/src/utils/array.ts b/packages/vue-renderer/src/utils/array.ts new file mode 100644 index 0000000000..6a89bc1a9f --- /dev/null +++ b/packages/vue-renderer/src/utils/array.ts @@ -0,0 +1,5 @@ +export function ensureArray(val: T | T[] | undefined | null): T[] { + return val ? (Array.isArray(val) ? val : [val]) : []; +} + +export type MaybeArray = T | T[]; diff --git a/packages/vue-renderer/src/utils/i18n.ts b/packages/vue-renderer/src/utils/i18n.ts new file mode 100644 index 0000000000..191e01ff66 --- /dev/null +++ b/packages/vue-renderer/src/utils/i18n.ts @@ -0,0 +1,25 @@ +import IntlMessageFormat from 'intl-messageformat'; + +export type I18nMessages = { + [locale: string]: Record; +}; + +/** + * 用于处理国际化字符串 + * @param key - 语料标识 + * @param values - 字符串模版变量 + * @param locale - 国际化标识,例如 zh-CN、en-US + * @param messages - 国际化语言包 + */ +export function getI18n( + key: string, + values = {}, + locale = 'zh-CN', + messages: I18nMessages = {} +) { + if (!messages || !messages[locale] || !messages[locale][key]) { + return ''; + } + const formater = new IntlMessageFormat(messages[locale][key], locale); + return formater.format(values); +} diff --git a/packages/vue-renderer/src/utils/index.ts b/packages/vue-renderer/src/utils/index.ts new file mode 100644 index 0000000000..51d6fa7af6 --- /dev/null +++ b/packages/vue-renderer/src/utils/index.ts @@ -0,0 +1,4 @@ +export { getI18n, type I18nMessages } from './i18n'; +export { mergeScope, type RuntimeScope, type BlockScope } from './scope'; +export { ensureArray, type MaybeArray } from './array'; +export { parseSchema, parseExpression, parseI18n, parseSlotScope } from './parse'; diff --git a/packages/vue-renderer/src/utils/parse.ts b/packages/vue-renderer/src/utils/parse.ts new file mode 100644 index 0000000000..6f79bc23fb --- /dev/null +++ b/packages/vue-renderer/src/utils/parse.ts @@ -0,0 +1,101 @@ +import { IPublicTypeI18nData, JSExpression, JSFunction } from '@felce/lowcode-types'; +import { isI18nData, isJSExpression, isJSFunction, isPlainObject } from '@felce/lowcode-utils'; +import { isFunction, isString } from 'lodash-es'; +import { ensureArray } from './array'; +import { BlockScope, RuntimeScope } from './scope'; + +export const EXPRESSION_TYPE = { + JSEXPRESSION: 'JSExpression', + JSFUNCTION: 'JSFunction', + JSSLOT: 'JSSlot', + JSBLOCK: 'JSBlock', + I18N: 'i18n', +} as const; + +export function inSameDomain() { + try { + return window.parent !== window && window.parent.location.host === window.location.host; + } catch (e) { + return false; + } +} + +export function parseI18n(i18nInfo: IPublicTypeI18nData, scope?: RuntimeScope) { + return parseExpression( + { + type: EXPRESSION_TYPE.JSEXPRESSION, + value: `this.i18n('${i18nInfo.key}')`, + }, + scope, + ) as string | undefined; +} + +export function parseExpression(str: JSFunction, scope?: RuntimeScope): CallableFunction; +export function parseExpression(str: JSExpression, scope?: RuntimeScope): unknown; +export function parseExpression( + str: JSExpression | JSFunction, + scope?: RuntimeScope, +): CallableFunction | unknown; +export function parseExpression( + str: JSExpression | JSFunction, + scope?: RuntimeScope, +): CallableFunction | unknown { + try { + const contextArr = ['"use strict";', 'var __self = arguments[0];']; + contextArr.push('return '); + let tarStr: string; + + tarStr = (str.value || '').trim(); + + tarStr = tarStr.replace(/this(\W|$)/g, (_a: string, b: string) => `__self${b}`); + tarStr = contextArr.join('\n') + tarStr; + + // 默认调用顶层窗口的parseObj, 保障new Function的window对象是顶层的window对象 + if (inSameDomain() && (window.parent as any).__newFunc) { + return (window.parent as any).__newFunc(tarStr)(self); + } + return new Function('$scope', `with($scope || {}) { ${tarStr} }`)(scope); + } catch (err) { + console.warn('parseExpression.error', err, str, self); + return undefined; + } +} + +export function parseSchema(schema: IPublicTypeI18nData, scope?: RuntimeScope): string | undefined; +export function parseSchema(schema: JSFunction, scope?: RuntimeScope): CallableFunction; +export function parseSchema(schema: JSExpression, scope?: RuntimeScope): unknown; +export function parseSchema( + schema: T, + scope: RuntimeScope, +): Record; +export function parseSchema(schema: T, scope?: RuntimeScope): T; +export function parseSchema(schema: unknown, scope?: RuntimeScope): unknown { + if (isJSExpression(schema) || isJSFunction(schema)) { + return parseExpression(schema, scope); + } else if (isI18nData(schema)) { + return parseI18n(schema, scope); + } else if (isString(schema)) { + return schema.trim(); + } else if (Array.isArray(schema)) { + return schema.map((item) => parseSchema(item, scope)); + } else if (isFunction(schema)) { + return schema.bind(scope); + } else if (isPlainObject(schema)) { + if (!schema) return schema; + const res: Record = {}; + Object.keys(schema).forEach((key) => { + if (key.startsWith('__')) return; + res[key] = parseSchema(schema[key], scope); + }); + return res; + } + return schema; +} + +export function parseSlotScope(args: unknown[], params: string[]): BlockScope { + const slotParams: BlockScope = {}; + ensureArray(params).forEach((item, idx) => { + slotParams[item] = args[idx]; + }); + return slotParams; +} diff --git a/packages/vue-renderer/src/utils/scope.ts b/packages/vue-renderer/src/utils/scope.ts new file mode 100644 index 0000000000..0191db3c33 --- /dev/null +++ b/packages/vue-renderer/src/utils/scope.ts @@ -0,0 +1,67 @@ +import { ComponentPublicInstance, isProxy, reactive } from 'vue'; +import { MaybeArray } from './array'; +import { DataSourceItem } from '../data-source'; +import { isObject } from '@felce/lowcode-utils'; + +export interface BlockScope { + [x: string]: unknown; +} + +export interface RuntimeScope extends BlockScope, ComponentPublicInstance { + i18n(key: string, values: any): string; + currentLocale: string; + dataSourceMap: Record; + reloadDataSource(): Promise; + __loopScope?: boolean; + __loopRefIndex?: number; + __loopRefOffset?: number; +} + +function isRuntimeScope(scope: object): scope is RuntimeScope { + return '$' in scope; +} + +function isValidScope(scope: unknown): scope is BlockScope | RuntimeScope { + // 为 null、undefined,或者不是对象 + if (!scope || !isObject(scope)) return false; + + // runtime scope + if (isRuntimeScope(scope)) return true; + + // scope 属性不为空 + if (Object.keys(scope).length > 0) return true; + return false; +} + +export function mergeScope( + scope: RuntimeScope, + ...blockScope: MaybeArray[] +): RuntimeScope; +export function mergeScope(...blockScope: MaybeArray[]): BlockScope; +export function mergeScope( + ...scopes: MaybeArray[] +): RuntimeScope | BlockScope { + const normalizedScope: (RuntimeScope | BlockScope)[] = []; + scopes.flat().forEach((scope) => { + isValidScope(scope) && normalizedScope.push(scope); + }); + + if (normalizedScope.length <= 1) return normalizedScope[0]; + + const [rootScope, ...resScopes] = normalizedScope; + return resScopes.reduce((result, scope) => { + if (isRuntimeScope(scope)) { + if (!isRuntimeScope(result)) { + const temp = result; + result = scope; + scope = temp; + } else { + return scope; + } + } + + const descriptors = Object.getOwnPropertyDescriptors(scope); + result = Object.create(result, descriptors); + return isProxy(scope) ? reactive(result) : result; + }, rootScope); +} diff --git a/packages/vue-renderer/tsconfig.json b/packages/vue-renderer/tsconfig.json new file mode 100644 index 0000000000..7513033f03 --- /dev/null +++ b/packages/vue-renderer/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["./src"] +} diff --git a/packages/vue-simulator-renderer/CHANGELOG.md b/packages/vue-simulator-renderer/CHANGELOG.md new file mode 100644 index 0000000000..afd272f42e --- /dev/null +++ b/packages/vue-simulator-renderer/CHANGELOG.md @@ -0,0 +1,132 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.4.7](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.6...v1.4.7) (2022-08-30) + +### Features + +- **vue-simulator-renderer:** slot 组件自动撑满父级容器高度 ([87dd933](https://github.com/fe-lce/lowcode-engine-vue/commit/87dd933f1144481403cff0ecc1b96a470ba0a4de)) + +## [1.4.6](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.5...v1.4.6) (2022-08-10) + +### Bug Fixes + +- **vue-simulator-renderer:** 修复移动画布组件位置导致的渲染错误 ([2fc636d](https://github.com/fe-lce/lowcode-engine-vue/commit/2fc636d8521ecb15bef23c5c3ee2181c3cad42cd)) + +## [1.4.5](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.4...v1.4.5) (2022-07-29) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.4.4](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.3...v1.4.4) (2022-07-21) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.4.3](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.2...v1.4.3) (2022-07-21) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.4.2](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.1...v1.4.2) (2022-07-14) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.4.1](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.4.0...v1.4.1) (2022-07-12) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +# [1.4.0](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.5...v1.4.0) (2022-07-06) + +### Features + +- **vue-simulator-renderer:** 适配模态框组件拖拽及组件元素定位 ([9a4a03a](https://github.com/fe-lce/lowcode-engine-vue/commit/9a4a03afc0b35f520254529650e94a46d30e89fd)) + +## [1.3.5](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.4...v1.3.5) (2022-07-04) + +### Features + +- **vue-simulator-renderer:** exports renderer content ([f8f2e62](https://github.com/fe-lce/lowcode-engine-vue/commit/f8f2e629bcda43fe23e30ddae0e1ec633d86c60e)) + +## [1.3.4](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.3...v1.3.4) (2022-07-03) + +### Bug Fixes + +- **vue-simulator-renderer:** disable vue prod devtools ([531ee0e](https://github.com/fe-lce/lowcode-engine-vue/commit/531ee0ec1b4aac96dace063f87f8c59cbc21d996)) + +## [1.3.3](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.2...v1.3.3) (2022-07-03) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.3.2](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.1...v1.3.2) (2022-07-03) + +### Features + +- **vue-simulator-renderer:** build vue-router as internal dependency ([91d3d31](https://github.com/fe-lce/lowcode-engine-vue/commit/91d3d31b302f37cb9cebc12d4b0e61c54d26436c)) + +## [1.3.1](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.3.0...v1.3.1) (2022-07-02) + +### Features + +- **vue-renderer:** supports ref prop ([9883532](https://github.com/fe-lce/lowcode-engine-vue/commit/9883532b717c53a7025dc3cf8f6282de96f7ebf5)) +- **vue-simulator-renderer:** add page builtin-component ([79178ff](https://github.com/fe-lce/lowcode-engine-vue/commit/79178ffb83b02f23ce1505577fe683aab73a2de3)) + +# [1.3.0](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.2.0...v1.3.0) (2022-07-01) + +### Features + +- **vue-renderer:** change slot params handle ([0139b3c](https://github.com/fe-lce/lowcode-engine-vue/commit/0139b3cb62e08a4fc2c29734485b65bef92710c7)) + +# [1.2.0](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.5...v1.2.0) (2022-06-30) + +### Features + +- **vue-renderer:** enhance slot and optimize scope ([f1454ea](https://github.com/fe-lce/lowcode-engine-vue/commit/f1454eaae738cf8c0a12e0e34bd5a576f43cc85c)) + +## [1.1.5](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.4...v1.1.5) (2022-06-30) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.1.4](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.3...v1.1.4) (2022-06-27) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.1.3](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.2...v1.1.3) (2022-06-27) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.1.2](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.1...v1.1.2) (2022-06-24) + +### Bug Fixes + +- **vue-simulator-renderer:** failed to get instance uid ([cdb25ca](https://github.com/fe-lce/lowcode-engine-vue/commit/cdb25ca10fe38eea0000a4ef4889d9e40158c980)) + +## [1.1.1](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.1.0...v1.1.1) (2022-06-24) + +### Features + +- update versions ([ed20df8](https://github.com/fe-lce/lowcode-engine-vue/commit/ed20df8055dd13c75638774a9b12f409fdec8c94)) +- **vue-renderer|vue-simulator-renderer:** modify the el access method ([af454ea](https://github.com/fe-lce/lowcode-engine-vue/commit/af454ea47d44298ef04fd0ead2359403e2c1e77d)) + +# [1.1.0](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.5...v1.1.0) (2022-06-16) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.0.5](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.4...v1.0.5) (2022-06-15) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.0.4](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.3...v1.0.4) (2022-06-15) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.0.3](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.2...v1.0.3) (2022-06-15) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## [1.0.2](https://github.com/fe-lce/lowcode-engine-vue/compare/v1.0.1...v1.0.2) (2022-06-15) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer + +## 1.0.1 (2022-06-15) + +**Note:** Version bump only for package @felce/lowcode-vue-simulator-renderer diff --git a/packages/vue-simulator-renderer/README.md b/packages/vue-simulator-renderer/README.md new file mode 100644 index 0000000000..fe84005413 --- /dev/null +++ b/packages/vue-simulator-renderer/README.md @@ -0,0 +1 @@ +../../README.md \ No newline at end of file diff --git a/packages/vue-simulator-renderer/build.json b/packages/vue-simulator-renderer/build.json new file mode 100644 index 0000000000..6f284f44f9 --- /dev/null +++ b/packages/vue-simulator-renderer/build.json @@ -0,0 +1,3 @@ +{ + "plugins": ["build-plugin-component"] +} diff --git a/packages/vue-simulator-renderer/build.plugin.cjs b/packages/vue-simulator-renderer/build.plugin.cjs new file mode 100644 index 0000000000..b7589abbc6 --- /dev/null +++ b/packages/vue-simulator-renderer/build.plugin.cjs @@ -0,0 +1,10 @@ +module.exports = ({ onGetWebpackConfig }) => { + onGetWebpackConfig((config) => { + config.module + .rule('mjs$') + .test(/\.mjs$/) + .include.add(/node_modules/) + .end() + .type('javascript/auto'); + }); +}; diff --git a/packages/vue-simulator-renderer/build.umd.json b/packages/vue-simulator-renderer/build.umd.json new file mode 100644 index 0000000000..9a20deeffd --- /dev/null +++ b/packages/vue-simulator-renderer/build.umd.json @@ -0,0 +1,29 @@ +{ + "entry": { + "vue-simulator-renderer": "./src/index.ts" + }, + "define": { + "__VUE_PROD_DEVTOOLS__": "false" + }, + "sourceMap": true, + "library": "LCVueSimulatorRenderer", + "libraryTarget": "umd", + "externals": { + "vue": "var window.Vue", + "lodash": "var window._", + "moment": "var window.moment" + }, + "outputAssetsPath": { + "js": "", + "css": "" + }, + "polyfill": false, + "outputDir": "dist", + "vendor": false, + "ignoreHtmlTemplate": true, + "plugins": [ + "build-plugin-react-app", + ["build-plugin-moment-locales", { "locales": ["zh-cn"] }], + "./build.plugin.cjs" + ] +} diff --git a/packages/vue-simulator-renderer/package.json b/packages/vue-simulator-renderer/package.json new file mode 100644 index 0000000000..4f912a21b6 --- /dev/null +++ b/packages/vue-simulator-renderer/package.json @@ -0,0 +1,40 @@ +{ + "name": "@felce/lowcode-vue-simulator-renderer", + "main": "./lib/index.js", + "module": "./es/index.js", + "unpkg": "./dist/vue-simulator-renderer.js", + "version": "1.4.1", + "files": [ + "es", + "lib", + "dist" + ], + "scripts": { + "start": "build-scripts start --disable-open --port 5559 --config=build.umd.json", + "build": "build-scripts build", + "build:umd": "build-scripts build --config=build.umd.json", + "lint:type": "tsc -p ./tsconfig.json --noEmit", + "prepublishOnly": "pnpm build && pnpm build:umd" + }, + "homepage": "https://unpkg.com/@felce/lowcode-vue-simulator-renderer@1.4.1/build/index.html", + "dependencies": { + "@felce/lowcode-types": "^1.4.1", + "@felce/lowcode-vue-renderer": "^1.4.1", + "vue-router": "^4.1.5" + }, + "devDependencies": { + "@felce/lowcode-designer": "^1.4.1", + "build-plugin-component": "^1.11.0", + "build-plugin-moment-locales": "^0.1.3", + "build-plugin-react-app": "^1.8.0", + "vue": "^3.2.38" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "repository": { + "type": "http", + "url": "https://github.com/fe-lce/lowcode-engine-vue/tree/main/packages/vue-simulator-renderer" + } +} diff --git a/packages/vue-simulator-renderer/public/index.html b/packages/vue-simulator-renderer/public/index.html new file mode 100644 index 0000000000..e61dd7c6f4 --- /dev/null +++ b/packages/vue-simulator-renderer/public/index.html @@ -0,0 +1,10 @@ + + + + + + + LowCodeEngine VueSimulator + + + diff --git a/packages/vue-simulator-renderer/src/buildin-components/index.ts b/packages/vue-simulator-renderer/src/buildin-components/index.ts new file mode 100644 index 0000000000..8bdb3b825d --- /dev/null +++ b/packages/vue-simulator-renderer/src/buildin-components/index.ts @@ -0,0 +1,3 @@ +export { default as Leaf } from './leaf'; +export { default as Slot } from './slot'; +export { default as Page } from './page'; diff --git a/packages/vue-simulator-renderer/src/buildin-components/leaf.ts b/packages/vue-simulator-renderer/src/buildin-components/leaf.ts new file mode 100644 index 0000000000..d032ffd864 --- /dev/null +++ b/packages/vue-simulator-renderer/src/buildin-components/leaf.ts @@ -0,0 +1,26 @@ +import { defineComponent, renderSlot } from 'vue'; + +const Leaf = defineComponent({ + name: 'Leaf', + render() { + return renderSlot(this.$slots, 'default'); + }, +}); + +Object.assign(Leaf, { + displayName: 'Leaf', + componentMetadata: { + componentName: 'Leaf', + configure: { + props: [ + { + name: 'children', + setter: 'StringSetter', + }, + ], + supports: false, + }, + }, +}); + +export default Leaf; diff --git a/packages/vue-simulator-renderer/src/buildin-components/page.ts b/packages/vue-simulator-renderer/src/buildin-components/page.ts new file mode 100644 index 0000000000..e6bebf587a --- /dev/null +++ b/packages/vue-simulator-renderer/src/buildin-components/page.ts @@ -0,0 +1,24 @@ +import { defineComponent, h } from 'vue'; + +const Page = defineComponent((props, { slots }) => { + return () => h('div', { class: 'lc-page', ...props }, slots); +}); + +Object.assign(Page, { + displayName: 'Page', + componentMetadata: { + componentName: 'Page', + configure: { + supports: { + style: true, + className: true, + }, + component: { + isContainer: true, + disableBehaviors: '*', + }, + }, + }, +}); + +export default Page; diff --git a/packages/vue-simulator-renderer/src/buildin-components/slot.ts b/packages/vue-simulator-renderer/src/buildin-components/slot.ts new file mode 100644 index 0000000000..dc3cedb6ef --- /dev/null +++ b/packages/vue-simulator-renderer/src/buildin-components/slot.ts @@ -0,0 +1,46 @@ +import { defineComponent, h } from 'vue'; + +const Slot = defineComponent({ + render() { + return h('div', { class: 'lc-container' }, this.$slots); + }, +}); + +Object.assign(Slot, { + displayName: 'Slot', + componentMetadata: { + componentName: 'Slot', + configure: { + props: [ + { + name: '___title', + title: '插槽标题', + setter: 'StringSetter', + defaultValue: '插槽容器', + }, + { + name: '___params', + title: '插槽入参', + setter: { + componentName: 'ArraySetter', + props: { + itemSetter: { + componentName: 'StringSetter', + props: { + placeholder: '参数名称', + }, + }, + }, + }, + }, + ], + component: { + isContainer: true, + disableBehaviors: '*', + }, + supports: false, + }, + }, +}); + +export default Slot; diff --git a/packages/vue-simulator-renderer/src/host.ts b/packages/vue-simulator-renderer/src/host.ts new file mode 100644 index 0000000000..eec166a5a0 --- /dev/null +++ b/packages/vue-simulator-renderer/src/host.ts @@ -0,0 +1,3 @@ +import { BuiltinSimulatorHost } from '@felce/lowcode-designer'; + +export const host: BuiltinSimulatorHost = (window as any).LCSimulatorHost; diff --git a/packages/vue-simulator-renderer/src/index.less b/packages/vue-simulator-renderer/src/index.less new file mode 100644 index 0000000000..91ee4a5a91 --- /dev/null +++ b/packages/vue-simulator-renderer/src/index.less @@ -0,0 +1,122 @@ +body, +html { + display: block; + margin: 0; + padding: 0; + background: white; +} + +html.engine-design-mode { + padding-bottom: 0; +} + +html.engine-cursor-move, +html.engine-cursor-move * { + cursor: grabbing !important; +} + +html.engine-cursor-copy, +html.engine-cursor-copy * { + cursor: copy !important; +} + +html.engine-cursor-ew-resize, +html.engine-cursor-ew-resize * { + cursor: ew-resize !important; +} + +html.lc-cursor-dragging, +html.lc-cursor-dragging * { + cursor: move !important; +} + +html.lc-cursor-x-resizing, +html.lc-cursor-x-resizing * { + cursor: col-resize; +} + +html.lc-cursor-y-resizing, +html.lc-cursor-y-resizing * { + cursor: row-resize; +} + +html.lc-cursor-copy, +html.lc-cursor-copy * { + cursor: copy !important; +} + +::-webkit-scrollbar { + width: 5px; + height: 5px; +} + +::-webkit-scrollbar-thumb { + background-color: rgb(0 0 0 / 30%); + border-radius: 5px; +} + +.lc-container { + height: 100%; + + &:empty { + display: flex; + align-items: center; + min-width: 140px; + height: 66px; + max-height: 100%; + overflow: hidden; + color: #a7b1bd; + text-align: center; + background: #f2f3f5; + outline: 1px dashed rgb(31 56 88 / 20%); + outline-offset: -1px !important; + + &::before { + z-index: 1; + width: 100%; + font-size: 14px; + white-space: nowrap; + content: '\62D6\62FD\7EC4\4EF6\6216\6A21\677F\5230\8FD9\91CC'; + } + } +} + +.lc-container-placeholder { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + min-height: 60px; + color: rgb(167 177 189); + font-size: 14px; + background-color: rgb(240 240 240); + border: 1px dotted; + + &.lc-container-locked { + background: #eccfcf; + } +} + +body.engine-document { + &::after, + &::before { + display: table; + content: ''; + } + + &::after { + clear: both; + } +} + +.engine-live-editing { + outline: none; + box-shadow: 0 0 0 2px rgb(102 188 92); + cursor: text; + user-select: text; +} + +#app { + height: 100vh; +} diff --git a/packages/vue-simulator-renderer/src/index.ts b/packages/vue-simulator-renderer/src/index.ts new file mode 100644 index 0000000000..8ac19cb175 --- /dev/null +++ b/packages/vue-simulator-renderer/src/index.ts @@ -0,0 +1,19 @@ +import simulator from './simulator'; +import './index.less'; + +const win = window as any; + +if (typeof win !== 'undefined') { + win.SimulatorRenderer = simulator; +} + +win.addEventListener('beforeunload', () => { + win.LCSimulatorHost = null; + win.SimulatorRenderer = null; + simulator.dispose(); +}); + +export default simulator; +export * from '@felce/lowcode-vue-renderer'; +export { config as vueRendererConfig, default as VueRenderer } from '@felce/lowcode-vue-renderer'; +export * from './interface'; diff --git a/packages/vue-simulator-renderer/src/interface.ts b/packages/vue-simulator-renderer/src/interface.ts new file mode 100644 index 0000000000..ff91d5c2e5 --- /dev/null +++ b/packages/vue-simulator-renderer/src/interface.ts @@ -0,0 +1,52 @@ +import { Router } from 'vue-router'; +import { Config } from '@felce/lowcode-vue-renderer'; +import { Component, ComponentPublicInstance, App } from 'vue'; +import { + IPublicTypeComponentSchema, + IPublicTypeNpmInfo, + IPublicTypeRootSchema, +} from '@felce/lowcode-types'; +import { BuiltinSimulatorRenderer, DocumentModel, Node } from '@felce/lowcode-designer'; + +export type MinxedComponent = IPublicTypeNpmInfo | Component | IPublicTypeComponentSchema; + +export type ComponentInstance = ComponentPublicInstance; + +export interface SimulatorViewLayout { + Component?: Component; + componentName?: string; + props?: Record; +} + +export interface VueSimulatorRenderer extends BuiltinSimulatorRenderer { + app: App; + config: Config; + router: Router; + layout: SimulatorViewLayout; + device: string; + locale: string; + designMode: 'design'; + libraryMap: Record; + components: Record; + autoRender: boolean; + componentsMap: Record; + documentInstances: DocumentInstance[]; + requestHandlersMap: Record; + dispose(): void; + rerender(): void; + getCurrentDocument(): DocumentInstance | undefined; +} + +export interface DocumentInstance { + readonly id: string; + readonly key: string; + readonly path: string; + readonly document: DocumentModel; + readonly instancesMap: Map; + readonly schema: IPublicTypeRootSchema; + getComponentInstance(id: number): ComponentInstance | null; + mountInstance(id: string, instance: ComponentInstance): (() => void) | void; + unmountIntance(id: string, instance: ComponentInstance): void; + rerender(): void; + getNode(id: string): Node | null; +} diff --git a/packages/vue-simulator-renderer/src/simulator-view.ts b/packages/vue-simulator-renderer/src/simulator-view.ts new file mode 100644 index 0000000000..862a8b3f58 --- /dev/null +++ b/packages/vue-simulator-renderer/src/simulator-view.ts @@ -0,0 +1,72 @@ +import { defineComponent, h, PropType, renderSlot } from 'vue'; +import LowCodeRenderer from '@felce/lowcode-vue-renderer'; +import { DocumentInstance, VueSimulatorRenderer } from './interface'; +import { RouterView } from 'vue-router'; + +export const Layout = defineComponent({ + props: { + simulator: { + type: Object as PropType, + required: true, + }, + }, + render() { + const { simulator, $slots } = this; + const { layout, getComponent } = simulator; + if (layout) { + const { Component, props = {}, componentName } = layout; + if (Component) { + return h(Component, { ...props, key: 'layout', simulator } as any, $slots); + } + const ComputedComponent = componentName && getComponent(componentName); + if (ComputedComponent) { + return h(ComputedComponent, { ...props, key: 'layout', simulator }, $slots); + } + } + return renderSlot($slots, 'default'); + }, +}); + +export const SimulatorRendererView = defineComponent({ + props: { + simulator: { + type: Object as PropType, + required: true, + }, + }, + render() { + const { simulator } = this; + return h(Layout, { simulator }, { default: () => h(RouterView) }); + }, +}); + +export const Renderer = defineComponent({ + props: { + simulator: { + type: Object as PropType, + required: true, + }, + documentInstance: { + type: Object as PropType, + required: true, + }, + }, + render() { + const { documentInstance, simulator } = this; + const { schema } = documentInstance; + const { designMode, device, locale, components } = simulator; + + if (!simulator.autoRender) return null; + + return h(LowCodeRenderer, { + schema: schema, + components: components, + locale: locale, + messages: {}, + designMode: designMode, + device: device, + getNode: (id) => documentInstance.getNode(id), + onCompGetCtx: (schema, ref) => documentInstance.mountInstance(schema.id!, ref), + }); + }, +}); diff --git a/packages/vue-simulator-renderer/src/simulator.ts b/packages/vue-simulator-renderer/src/simulator.ts new file mode 100644 index 0000000000..bc1fdc797f --- /dev/null +++ b/packages/vue-simulator-renderer/src/simulator.ts @@ -0,0 +1,349 @@ +import { DocumentModel } from '@felce/lowcode-designer'; +import { IPublicEnumTransformStage } from '@felce/lowcode-types'; +import { AssetLoader } from '@felce/lowcode-utils'; +import { config } from '@felce/lowcode-vue-renderer'; +import { + Component, + computed, + createApp, + markRaw, + onUnmounted, + reactive, + Ref, + ref, + shallowRef, +} from 'vue'; +import { createMemoryHistory, createRouter } from 'vue-router'; +import { Leaf, Page, Slot } from './buildin-components'; +import { host } from './host'; +import { + ComponentInstance, + DocumentInstance, + MinxedComponent, + SimulatorViewLayout, + VueSimulatorRenderer, +} from './interface'; +import { Renderer, SimulatorRendererView } from './simulator-view'; +import { + ComponentRecord, + cursor, + findDOMNodes, + getClientRects, + getClosestNodeInstance, + getClosestNodeInstanceByComponent, + getCompRootData, + isComponentRecord, + setCompRootData, + setNativeSelection, +} from './utils'; +import { buildComponents, getSubComponent } from './utils/build-components'; + +const loader = new AssetLoader(); + +const builtinComponents = { Slot, Leaf, Page }; + +function createDocumentInstance(document: DocumentModel): DocumentInstance { + /** 记录单个节点的组件实例列表 */ + const instancesMap = new Map(); + /** 记录 vue 组件实例和组件 uid 的映射关系 */ + const vueInstanceMap = new Map(); + + const timestamp = ref(Date.now()); + + const checkInstanceMounted = (instance: ComponentInstance): boolean => { + return instance.$.isMounted; + }; + + const setHostInstance = ( + docId: string, + nodeId: string, + instances: ComponentInstance[] | null, + ) => { + const instanceRecords = !instances + ? null + : instances.map((inst) => new ComponentRecord(docId, nodeId, inst.$.uid)); + host.setInstance(docId, nodeId, instanceRecords); + }; + + const getComponentInstance = (id: number) => { + return vueInstanceMap.get(id); + }; + + const mountInstance = (id: string, instance: ComponentInstance) => { + const docId = document.id; + if (instance == null) { + let instances = instancesMap.get(id); + if (instances) { + instances = instances.filter(checkInstanceMounted); + if (instances.length > 0) { + instancesMap.set(id, instances); + setHostInstance(docId, id, instances); + } else { + instancesMap.delete(id); + setHostInstance(docId, id, null); + } + } + return; + } + + const el = instance.$el; + + const origId = getCompRootData(el).nodeId; + if (origId && origId !== id) { + // 另外一个节点的 instance 在此被复用了,需要从原来地方卸载 + unmountIntance(origId, instance); + } + + onUnmounted(() => unmountIntance(id, instance), instance.$); + + setCompRootData(el, { + nodeId: id, + docId: docId, + instance: instance, + }); + let instances = instancesMap.get(id); + if (instances) { + const l = instances.length; + instances = instances.filter(checkInstanceMounted); + let updated = instances.length !== l; + if (!instances.includes(instance)) { + instances.push(instance); + updated = true; + } + if (!updated) return; + } else { + instances = [instance]; + } + vueInstanceMap.set(instance.$.uid, instance); + instancesMap.set(id, instances); + setHostInstance(docId, id, instances); + }; + + const unmountIntance = (id: string, instance: ComponentInstance) => { + const instances = instancesMap.get(id); + if (instances) { + const i = instances.indexOf(instance); + if (i > -1) { + const [instance] = instances.splice(i, 1); + vueInstanceMap.delete(instance.$.uid); + setHostInstance(document.id, id, instances); + } + } + }; + + const getNode: DocumentInstance['getNode'] = (id) => { + return id ? document.getNode(id) : null; + }; + + return reactive({ + id: computed(() => document.id), + path: computed(() => { + const { fileName } = document; + return fileName.startsWith('/') ? fileName : `/${fileName}`; + }), + key: computed(() => `${document.id}:${timestamp.value}`), + schema: computed(() => document.export(IPublicEnumTransformStage.Render)), + document: computed(() => document), + instancesMap: computed(() => instancesMap), + getNode, + mountInstance, + unmountIntance, + getComponentInstance, + rerender: () => void (timestamp.value = Date.now()), + }) as DocumentInstance; +} + +function createSimulatorRenderer() { + const layout: Ref = shallowRef({}); + const device: Ref = shallowRef('default'); + const locale: Ref = shallowRef(); + const autoRender = shallowRef(host.autoRender); + const designMode: Ref = shallowRef('design'); + const libraryMap: Ref> = shallowRef({}); + const components: Ref> = shallowRef({}); + const componentsMap: Ref> = shallowRef({}); + const requestHandlersMap: Ref> = shallowRef({}); + const documentInstances: Ref = shallowRef([]); + + const disposeFunctions: Array<() => void> = []; + + const documentInstanceMap = new Map(); + + function _buildComponents() { + components.value = { + ...builtinComponents, + ...buildComponents(libraryMap.value, componentsMap.value, simulator.createComponent), + }; + } + + const simulator = reactive({ + config: markRaw(config), + layout, + device, + designMode, + libraryMap, + components, + autoRender, + componentsMap, + documentInstances, + requestHandlersMap, + isSimulatorRenderer: true, + }) as VueSimulatorRenderer; + + simulator.app = markRaw(createApp(SimulatorRendererView, { simulator })); + simulator.router = markRaw( + createRouter({ + history: createMemoryHistory('/'), + routes: [], + }), + ); + + simulator.getComponent = (componentName) => { + const paths = componentName.split('.'); + const subs: string[] = []; + while (paths.length > 0) { + const component = components.value[componentName]; + if (component) { + return getSubComponent(component, subs); + } + const sub = paths.pop(); + if (!sub) break; + subs.unshift(sub); + componentName = paths.join('.'); + } + return null!; + }; + + simulator.getClosestNodeInstance = (el, specId) => { + if (isComponentRecord(el)) { + const { cid, did } = el; + const documentInstance = documentInstanceMap.get(did); + const instance = documentInstance?.getComponentInstance(cid) ?? null; + return instance && getClosestNodeInstanceByComponent(instance.$, specId); + } + return getClosestNodeInstance(el, specId); + }; + + simulator.findDOMNodes = (instance: ComponentRecord) => { + if (instance) { + const { did, cid } = instance; + const documentInstance = documentInstanceMap.get(did); + const compInst = documentInstance?.getComponentInstance(cid); + return compInst ? findDOMNodes(compInst) : null; + } + return null; + }; + + simulator.getClientRects = (element) => getClientRects(element); + simulator.setNativeSelection = (enable) => setNativeSelection(enable); + simulator.setDraggingState = (state) => cursor.setDragging(state); + simulator.setCopyState = (state) => cursor.setCopy(state); + simulator.clearState = () => cursor.release(); + simulator.createComponent = () => null; + simulator.rerender = () => documentInstances.value.forEach((doc) => doc.rerender()); + simulator.dispose = () => { + simulator.app.unmount(); + disposeFunctions.forEach((fn) => fn()); + }; + simulator.getCurrentDocument = () => { + const crr = host.project.currentDocument; + const docs = documentInstances.value; + return docs.find((doc) => doc.id === crr.id); + }; + + let running = false; + simulator.run = () => { + if (running) return; + running = true; + const containerId = 'app'; + let container = document.getElementById(containerId); + if (!container) { + container = document.createElement('div'); + document.body.appendChild(container); + container.id = containerId; + } + document.documentElement.classList.add('engine-page'); + document.body.classList.add('engine-document'); + simulator.app.use(simulator.router).mount(container); + host.project.setRendererReady(simulator); + }; + + disposeFunctions.push( + host.connect(simulator, () => { + // sync layout config + layout.value = host.project.get('config').layout; + + // todo: split with others, not all should recompute + if ( + libraryMap.value !== host.libraryMap || + componentsMap.value !== host.designer.componentsMap + ) { + libraryMap.value = host.libraryMap || {}; + componentsMap.value = host.designer.componentsMap; + _buildComponents(); + } + + locale.value = host.locale; + + // sync device + device.value = host.device; + + // sync designMode + designMode.value = host.designMode; + + // sync requestHandlersMap + requestHandlersMap.value = host.requestHandlersMap; + }), + ); + + disposeFunctions.push( + host.autorun(() => { + const { router } = simulator; + documentInstances.value = host.project.documents.map((doc) => { + let documentInstance = documentInstanceMap.get(doc.id); + if (!documentInstance) { + documentInstance = createDocumentInstance(doc); + documentInstanceMap.set(doc.id, documentInstance); + router.addRoute({ + name: documentInstance.id, + path: documentInstance.path, + component: Renderer, + props: () => ({ + key: documentInstance?.key, + documentInstance, + simulator, + }), + }); + } + return documentInstance; + }); + router.getRoutes().forEach((route) => { + const id = route.name as string; + const hasDoc = documentInstances.value.some((doc) => doc.id === id); + if (!hasDoc) { + router.removeRoute(id); + documentInstanceMap.delete(id); + } + }); + const inst = simulator.getCurrentDocument(); + if (inst && inst.id !== router.currentRoute.value.name) { + router.replace({ name: inst.id }); + } + }), + ); + + host.componentsConsumer.consume(async (componentsAsset) => { + if (componentsAsset) { + await loader.load(componentsAsset); + _buildComponents(); + } + }); + + host.injectionConsumer.consume(() => { + // TODO: handle designer injection + }); + + return simulator; +} + +export default createSimulatorRenderer(); diff --git a/packages/vue-simulator-renderer/src/utils/build-components.ts b/packages/vue-simulator-renderer/src/utils/build-components.ts new file mode 100644 index 0000000000..c09f986a49 --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/build-components.ts @@ -0,0 +1,94 @@ +import { Component, defineComponent, h } from 'vue'; +import type { IPublicTypeComponentSchema, IPublicTypeNpmInfo } from '@felce/lowcode-types'; +import { isComponentSchema, isESModule } from '@felce/lowcode-utils'; +import { isVueComponent } from '@felce/lowcode-vue-renderer'; + +export function accessLibrary(library: string | Record) { + if (typeof library !== 'string') { + return library; + } + + return (window as any)[library] || generateHtmlComp(library); +} + +export function generateHtmlComp(library: string) { + if (['a', 'img', 'div', 'span', 'svg'].includes(library)) { + return defineComponent((_, { attrs, slots }) => { + return () => h(library, attrs, slots); + }); + } +} + +export function getSubComponent(library: any, paths: string[]) { + const l = paths.length; + if (l < 1 || !library) { + return library; + } + let i = 0; + let component: any; + while (i < l) { + const key = paths[i]!; + let ex: any; + try { + component = library[key]; + } catch (e) { + ex = e; + component = null; + } + if (i === 0 && component == null && key === 'default') { + if (ex) { + return l === 1 ? library : null; + } + component = library; + } else if (component == null) { + return null; + } + library = component; + i++; + } + return component; +} + +export function findComponent( + libraryMap: Record, + componentName: string, + npm?: IPublicTypeNpmInfo, +) { + if (!npm) { + return accessLibrary(componentName); + } + const exportName = npm.exportName || npm.componentName || componentName; + const libraryName = libraryMap[npm.package] || exportName; + const library = accessLibrary(libraryName); + const paths = npm.exportName && npm.subName ? npm.subName.split('.') : []; + if (npm.destructuring) { + paths.unshift(exportName); + } else if (isESModule(library)) { + paths.unshift('default'); + } + return getSubComponent(library, paths); +} + +export function buildComponents( + libraryMap: Record, + componentsMap: Record, + createComponent?: (schema: IPublicTypeComponentSchema) => Component | null, +) { + const components: any = {}; + Object.keys(componentsMap).forEach((componentName) => { + let component = componentsMap[componentName]; + if (isComponentSchema(component)) { + if (createComponent) { + components[componentName] = createComponent(component as IPublicTypeComponentSchema); + } + } else if (isVueComponent(component)) { + components[componentName] = component; + } else { + component = findComponent(libraryMap, componentName, component); + if (component) { + components[componentName] = component; + } + } + }); + return components; +} diff --git a/packages/vue-simulator-renderer/src/utils/check-node.ts b/packages/vue-simulator-renderer/src/utils/check-node.ts new file mode 100644 index 0000000000..7a3b69e98c --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/check-node.ts @@ -0,0 +1,11 @@ +export function isCommentNode(el: Element | Text | Comment | Node): el is Comment { + return el.nodeType === 8; +} + +export function isTextNode(el: Element | Text | Comment | Node): el is Text { + return el.nodeType === 3; +} + +export function isEmptyNode(el: Element | Text | Comment | Node): boolean { + return isCommentNode(el) || (isTextNode(el) && el.nodeValue === ''); +} diff --git a/packages/vue-simulator-renderer/src/utils/closest-node.ts b/packages/vue-simulator-renderer/src/utils/closest-node.ts new file mode 100644 index 0000000000..ca878da432 --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/closest-node.ts @@ -0,0 +1,71 @@ +// FIXME 不知道要取什么 +import { NodeInstance } from '@felce/lowcode-designer'; +import { ComponentInternalInstance } from 'vue'; +import { isCommentNode } from './check-node'; +import { + ComponentRecord, + getCompRootData, + isVNodeHTMLElement, + isCompRootHTMLElement, +} from './comp-node'; +import { warn } from './logger'; + +export function getClosestNodeInstance( + el: Element, + specId: string | undefined, +): NodeInstance | null { + if (!document.contains(el)) { + return null; + } + if (isVNodeHTMLElement(el)) { + const component = el.__vueParentComponent; + return getClosestNodeInstanceByComponent(component, specId); + } + + if (!isCommentNode(el) && !('__vue_app__' in el)) { + warn('__vnode 没有找到,请使用 vue 非生产环境版本'); + warn('https://unpkg.com/vue/dist/vue.runtime.global.js'); + } + return getClosestNodeInstanceByElement(el, specId); +} + +export function getClosestNodeInstanceByComponent( + instance: ComponentInternalInstance | null, + specId: string | undefined, +): NodeInstance | null { + while (instance) { + const el = instance.vnode.el as Element; + if (el && isCompRootHTMLElement(el)) { + const { nodeId, docId, instance } = getCompRootData(el); + if (!specId || specId === nodeId) { + return { + docId, + nodeId, + instance: new ComponentRecord(docId, nodeId, instance.$.uid), + }; + } + } + instance = instance.parent; + } + return null; +} + +export function getClosestNodeInstanceByElement( + el: Element, + specId: string | undefined, +): NodeInstance | null { + while (el) { + if (isCompRootHTMLElement(el)) { + const { nodeId, docId, instance } = getCompRootData(el); + if (!specId || specId === nodeId) { + return { + docId, + nodeId, + instance: new ComponentRecord(docId, nodeId, instance.$.uid), + }; + } + } + el = el.parentElement as Element; + } + return null; +} diff --git a/packages/vue-simulator-renderer/src/utils/comp-node.ts b/packages/vue-simulator-renderer/src/utils/comp-node.ts new file mode 100644 index 0000000000..7d12fdc319 --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/comp-node.ts @@ -0,0 +1,65 @@ +import { isObject } from '@felce/lowcode-utils'; +import { isNil } from 'lodash-es'; +import { ComponentInternalInstance, isProxy, VNode } from 'vue'; +import { ComponentInstance } from '../interface'; + +const SYMBOL_VDID = Symbol('_LCDocId'); +const SYMBOL_VNID = Symbol('_LCNodeId'); +const SYMBOL_VInstance = Symbol('_LCVueInstance'); +const SYMBOL_RECORD_FLAG = Symbol('_LCVueCompRecord'); + +export interface VNodeHTMLElement extends HTMLElement { + __vnode: VNode; + __vueParentComponent: ComponentInternalInstance; +} + +export interface CompRootHTMLElement extends HTMLElement { + [SYMBOL_VDID]: string; + [SYMBOL_VNID]: string; + [SYMBOL_VInstance]: ComponentInstance; +} + +export interface CompRootData { + docId: string; + nodeId: string; + instance: ComponentInstance; +} + +export class ComponentRecord { + [SYMBOL_RECORD_FLAG] = true; + constructor( + public did: string, + public nid: string, + public cid: number, + ) {} +} + +export function isVNodeHTMLElement(el: unknown): el is VNodeHTMLElement { + return isObject(el) && isNil(el.__vueParentComponent); +} + +export function isCompRootHTMLElement(el: Element | null | undefined): el is CompRootHTMLElement { + return isObject(el) && SYMBOL_VDID in el; +} + +export function isComponentRecord(el: unknown): el is ComponentRecord { + return isObject(el) && SYMBOL_RECORD_FLAG in el; +} + +export function isInternalInstance(el: unknown): el is ComponentInternalInstance { + return isObject(el) && isProxy(el.proxy); +} + +export function getCompRootData(el: CompRootHTMLElement): CompRootData { + return { + docId: el[SYMBOL_VDID], + nodeId: el[SYMBOL_VNID], + instance: el[SYMBOL_VInstance], + }; +} + +export function setCompRootData(el: CompRootHTMLElement, data: CompRootData): void { + el[SYMBOL_VDID] = data.docId; + el[SYMBOL_VNID] = data.nodeId; + el[SYMBOL_VInstance] = data.instance; +} diff --git a/packages/vue-simulator-renderer/src/utils/cursor.ts b/packages/vue-simulator-renderer/src/utils/cursor.ts new file mode 100644 index 0000000000..9c5a7ac6f2 --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/cursor.ts @@ -0,0 +1,61 @@ +class Cursor { + private states = new Set(); + + setDragging(flag: boolean) { + if (flag) { + this.addState('dragging'); + } else { + this.removeState('dragging'); + } + } + + setXResizing(flag: boolean) { + if (flag) { + this.addState('x-resizing'); + } else { + this.removeState('x-resizing'); + } + } + + setYResizing(flag: boolean) { + if (flag) { + this.addState('y-resizing'); + } else { + this.removeState('y-resizing'); + } + } + + setCopy(flag: boolean) { + if (flag) { + this.addState('copy'); + } else { + this.removeState('copy'); + } + } + + isCopy() { + return this.states.has('copy'); + } + + release() { + for (const state of this.states) { + this.removeState(state); + } + } + + addState(state: string) { + if (!this.states.has(state)) { + this.states.add(state); + document.documentElement.classList.add(`lc-cursor-${state}`); + } + } + + private removeState(state: string) { + if (this.states.has(state)) { + this.states.delete(state); + document.documentElement.classList.remove(`lc-cursor-${state}`); + } + } +} + +export const cursor = new Cursor(); diff --git a/packages/vue-simulator-renderer/src/utils/find-dom-nodes.ts b/packages/vue-simulator-renderer/src/utils/find-dom-nodes.ts new file mode 100644 index 0000000000..510280a594 --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/find-dom-nodes.ts @@ -0,0 +1,57 @@ +import { ComponentInternalInstance } from 'vue'; +import { ComponentInstance } from '../interface'; +import { isVNodeHTMLElement } from './comp-node'; +import { isEmptyNode } from './check-node'; + +export function findDOMNodes(instance: ComponentInstance) { + const els: (Element | Text)[] = []; + + const el: Element | Text = instance.$el; + + if (isEmptyNode(el)) { + appendSiblingElement(els, instance.$, el, (node) => { + return node.previousSibling; + }); + appendSiblingElement(els, instance.$, el, (node) => { + return node.nextSibling; + }); + } else { + els.push(el); + } + + return els; +} + +function appendSiblingElement( + target: (Element | Text)[], + instance: ComponentInternalInstance, + el: Element | Text, + next: (el: Node) => Node | null +) { + let nextNode = next(el); + while (nextNode) { + if (isEmptyNode(nextNode)) { + nextNode = next(nextNode); + continue; + } + if (isVNodeHTMLElement(nextNode)) { + const childInstance = nextNode.__vueParentComponent; + if (isChildInstance(instance, childInstance)) { + target.unshift(nextNode); + nextNode = next(nextNode); + continue; + } + } + break; + } +} + +function isChildInstance( + target: ComponentInternalInstance, + source: ComponentInternalInstance | null +): boolean { + if (source == null) return false; + if (target.uid > source.uid) return false; + if (target.uid === source.uid) return true; + return isChildInstance(target, source.parent); +} diff --git a/packages/vue-simulator-renderer/src/utils/get-client-rects.ts b/packages/vue-simulator-renderer/src/utils/get-client-rects.ts new file mode 100644 index 0000000000..5f483d71f8 --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/get-client-rects.ts @@ -0,0 +1,15 @@ +import { isElement } from '@felce/lowcode-utils'; + +// a range for test TextNode clientRect +const cycleRange = document.createRange(); + +export function getClientRects(node: Element | Text) { + if (!node.parentNode) return []; + + if (isElement(node)) { + return [node.getBoundingClientRect()]; + } + + cycleRange.selectNode(node); + return Array.from(cycleRange.getClientRects()); +} diff --git a/packages/vue-simulator-renderer/src/utils/index.ts b/packages/vue-simulator-renderer/src/utils/index.ts new file mode 100644 index 0000000000..a384885be9 --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/index.ts @@ -0,0 +1,8 @@ +export * from './get-client-rects'; +export * from './comp-node'; +export * from './check-node'; +export * from './closest-node'; +export * from './find-dom-nodes'; +export * from './logger'; +export * from './cursor'; +export * from './navtive-selection'; diff --git a/packages/vue-simulator-renderer/src/utils/logger.ts b/packages/vue-simulator-renderer/src/utils/logger.ts new file mode 100644 index 0000000000..5a39ae2aea --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/logger.ts @@ -0,0 +1,3 @@ +export function warn(...messages: string[]): void { + return console.warn('[vue-simulator-renderer]:', ...messages); +} diff --git a/packages/vue-simulator-renderer/src/utils/navtive-selection.ts b/packages/vue-simulator-renderer/src/utils/navtive-selection.ts new file mode 100644 index 0000000000..76f51f48aa --- /dev/null +++ b/packages/vue-simulator-renderer/src/utils/navtive-selection.ts @@ -0,0 +1,15 @@ +let nativeSelectionEnabled = true; +const preventSelection = (e: Event) => { + if (nativeSelectionEnabled) { + return null; + } + e.preventDefault(); + e.stopPropagation(); + return false; +}; +document.addEventListener('selectstart', preventSelection, true); +document.addEventListener('dragstart', preventSelection, true); + +export function setNativeSelection(enableFlag: boolean) { + nativeSelectionEnabled = enableFlag; +} diff --git a/packages/vue-simulator-renderer/tsconfig.json b/packages/vue-simulator-renderer/tsconfig.json new file mode 100644 index 0000000000..7513033f03 --- /dev/null +++ b/packages/vue-simulator-renderer/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["./src"] +} diff --git a/scripts/build.sh b/scripts/build.sh index 0be5f8871f..5e098c8496 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -14,6 +14,8 @@ lerna run build \ --scope @felce/lowcode-plugin-outline-pane \ --scope @felce/lowcode-react-renderer \ --scope @felce/lowcode-react-simulator-renderer \ + --scope @felce/lowcode-vue-renderer \ + --scope @felce/lowcode-vue-simulator-renderer \ --scope @felce/lowcode-renderer-core \ --scope @felce/lowcode-workspace \ --scope @felce/lowcode-engine \ @@ -23,7 +25,11 @@ lerna run build:umd \ --scope @felce/lowcode-engine \ --scope @felce/lowcode-react-simulator-renderer \ --scope @felce/lowcode-react-renderer \ + --scope @felce/lowcode-vue-simulator-renderer \ + --scope @felce/lowcode-vue-renderer \ --stream cp ./packages/react-simulator-renderer/dist/js/* ./packages/engine/dist/js/ cp ./packages/react-simulator-renderer/dist/css/* ./packages/engine/dist/css/ +cp ./packages/vue-simulator-renderer/dist/js/* ./packages/engine/dist/js/ +cp ./packages/vue-simulator-renderer/dist/css/* ./packages/engine/dist/css/ diff --git a/scripts/sync.sh b/scripts/sync.sh index dfab8991c3..1f96129172 100755 --- a/scripts/sync.sh +++ b/scripts/sync.sh @@ -12,6 +12,8 @@ tnpm sync @felce/lowcode-plugin-outline-pane tnpm sync @felce/lowcode-renderer-core tnpm sync @felce/lowcode-react-renderer tnpm sync @felce/lowcode-react-simulator-renderer +tnpm sync @felce/lowcode-vue-renderer +tnpm sync @felce/lowcode-vue-simulator-renderer tnpm sync @felce/lowcode-engine tnpm sync @felce/lowcode-workspace -tnpm sync @felce/lowcode-plugin-command \ No newline at end of file +tnpm sync @felce/lowcode-plugin-command From 044349dd4675a1a960d1a9e2181efa0fbb3988c0 Mon Sep 17 00:00:00 2001 From: mazhaobo Date: Mon, 11 Nov 2024 11:34:38 +0800 Subject: [PATCH 09/75] =?UTF-8?q?chore:=20=E8=BF=81=E7=A7=BBreact=E5=92=8C?= =?UTF-8?q?vue=E7=9A=84renderer=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/code-generator/.gitignore | 122 - modules/code-generator/.prettierrc.js | 7 - modules/code-generator/.versionrc | 3 - modules/code-generator/CHANGELOG.md | 266 - modules/code-generator/CONTRIBUTING.md | 40 - modules/code-generator/README.md | 123 - modules/code-generator/babel.config.js | 1 - .../bin/lowcode-code-generator.js | 52 - modules/code-generator/example-schema.json | 276 - modules/code-generator/example-schema.json5 | 276 - modules/code-generator/jest.config.js | 10 - modules/code-generator/jest.setup.js | 12 - modules/code-generator/package.json | 155 - modules/code-generator/scripts/build-cli.js | 56 - .../scripts/build-standalone-loader.js | 73 - .../scripts/build-standalone-worker.js | 107 - .../scripts/build-standalone.js | 135 - .../scripts/build-template-static-files.js | 125 - modules/code-generator/scripts/build-types | 10 - modules/code-generator/scripts/build.js | 75 - .../scripts/move-files-to-build-dest.js | 24 - .../code-generator/scripts/run-demo-project | 55 - .../code-generator/scripts/test-standalone.js | 17 - .../src/analyzer/componentAnalyzer.ts | 35 - modules/code-generator/src/cli/index.ts | 2 - .../code-generator/src/cli/init-solution.ts | 65 - modules/code-generator/src/cli/run.ts | 146 - .../src/cli/solutions/example-solution.ts | 795 --- modules/code-generator/src/config/env.ts | 3 - modules/code-generator/src/const/file.ts | 3 - modules/code-generator/src/const/generator.ts | 129 - modules/code-generator/src/const/index.ts | 33 - .../jsx/handlers/transformJsExpression.ts | 49 - .../jsx/handlers/transformThis2Context.ts | 29 - .../src/core/jsx/util/isLiteralAtomicExpr.ts | 12 - .../core/jsx/util/isSimpleStraightLiteral.ts | 17 - .../src/generator/ChunkBuilder.ts | 123 - .../src/generator/CodeBuilder.ts | 103 - .../src/generator/ModuleBuilder.ts | 118 - .../src/generator/ProjectBuilder.ts | 372 -- modules/code-generator/src/index.ts | 121 - .../code-generator/src/parser/SchemaParser.ts | 394 -- .../src/plugins/common/esmodule.ts | 479 -- .../src/plugins/common/requireUtils.ts | 25 - .../src/plugins/common/styleImport.ts | 64 - .../src/plugins/component/rax/commonDeps.ts | 35 - .../src/plugins/component/rax/const.ts | 18 - .../plugins/component/rax/containerClass.ts | 157 - .../component/rax/containerInitState.ts | 66 - .../component/rax/containerInjectContext.ts | 145 - .../rax/containerInjectDataSourceEngine.ts | 196 - .../component/rax/containerInjectUtils.ts | 69 - .../component/rax/containerLifeCycle.ts | 146 - .../plugins/component/rax/containerMethods.ts | 84 - .../src/plugins/component/rax/jsx.ts | 327 - .../src/plugins/component/react/const.ts | 9 - .../plugins/component/react/containerClass.ts | 145 - .../component/react/containerInitState.ts | 63 - .../react/containerInjectConstants.ts | 55 - .../component/react/containerInjectContext.ts | 91 - .../react/containerInjectDataSourceEngine.ts | 206 - .../component/react/containerInjectI18n.ts | 56 - .../component/react/containerInjectUtils.ts | 125 - .../component/react/containerLifeCycle.ts | 117 - .../component/react/containerMethod.ts | 70 - .../src/plugins/component/react/jsx.ts | 153 - .../component/react/reactCommonDeps.ts | 33 - .../src/plugins/component/style/css.ts | 52 - .../src/plugins/project/constants.ts | 59 - .../plugins/project/framework/icejs/index.ts | 17 - .../project/framework/icejs/plugins/entry.ts | 56 - .../framework/icejs/plugins/entryHtml.ts | 46 - .../framework/icejs/plugins/globalStyle.ts | 56 - .../framework/icejs/plugins/packageJSON.ts | 125 - .../project/framework/icejs/plugins/router.ts | 84 - .../icejs/template/files/README.md.ts | 73 - .../icejs/template/files/abc.json.ts | 17 - .../icejs/template/files/build.json.ts | 32 - .../icejs/template/files/editorconfig.ts | 25 - .../icejs/template/files/eslintignore.ts | 28 - .../icejs/template/files/eslintrc.js.ts | 16 - .../icejs/template/files/gitignore.ts | 36 - .../icejs/template/files/jsconfig.json.ts | 24 - .../icejs/template/files/prettierignore.ts | 22 - .../icejs/template/files/prettierrc.js.ts | 16 - .../components/Footer/index.jsx.ts | 25 - .../components/Footer/index.style.ts | 26 - .../BasicLayout/components/Logo/index.jsx.ts | 27 - .../components/Logo/index.style.ts | 31 - .../components/PageNav/index.jsx.ts | 81 - .../src/layouts/BasicLayout/index.jsx.ts | 92 - .../src/layouts/BasicLayout/menuConfig.js.ts | 22 - .../icejs/template/files/stylelintignore.ts | 20 - .../icejs/template/files/stylelintrc.js.ts | 16 - .../icejs/template/files/tsconfig.json.ts | 46 - .../project/framework/icejs/template/index.ts | 52 - .../framework/icejs/template/static-files.ts | 50 - .../plugins/project/framework/icejs3/index.ts | 17 - .../framework/icejs3/plugins/appConfig.ts | 50 - .../framework/icejs3/plugins/buildConfig.ts | 165 - .../framework/icejs3/plugins/globalStyle.ts | 56 - .../framework/icejs3/plugins/layout.ts | 41 - .../framework/icejs3/plugins/packageJSON.ts | 117 - .../icejs3/template/files/README.md.ts | 12 - .../icejs3/template/files/browserslistrc.ts | 14 - .../icejs3/template/files/document.ts | 41 - .../icejs3/template/files/gitignore.ts | 36 - .../components/Footer/index.jsx.ts | 25 - .../components/Footer/index.style.ts | 26 - .../BasicLayout/components/Logo/index.jsx.ts | 27 - .../components/Logo/index.style.ts | 31 - .../components/PageNav/index.jsx.ts | 79 - .../src/layouts/BasicLayout/index.jsx.ts | 92 - .../src/layouts/BasicLayout/menuConfig.js.ts | 22 - .../icejs3/template/files/tsconfig.ts | 38 - .../icejs3/template/files/typings.ts | 20 - .../framework/icejs3/template/index.ts | 57 - .../framework/icejs3/template/static-files.ts | 33 - .../plugins/project/framework/rax/index.ts | 19 - .../framework/rax/plugins/appConfig.ts | 50 - .../framework/rax/plugins/buildConfig.ts | 51 - .../project/framework/rax/plugins/entry.ts | 61 - .../framework/rax/plugins/entryDocument.ts | 63 - .../framework/rax/plugins/globalStyle.ts | 64 - .../framework/rax/plugins/packageJSON.ts | 120 - .../rax/template/files/.eslintignore.ts | 15 - .../rax/template/files/.eslintrc.js.ts | 16 - .../rax/template/files/.gitignore.ts | 16 - .../rax/template/files/.prettierignore.ts | 15 - .../rax/template/files/.prettierrc.js.ts | 16 - .../rax/template/files/.stylelintignore.ts | 15 - .../rax/template/files/.stylelintrc.js.ts | 16 - .../framework/rax/template/files/README.md.ts | 16 - .../rax/template/files/jsconfig.json.ts | 16 - .../rax/template/files/tsconfig.json.ts | 16 - .../project/framework/rax/template/index.ts | 60 - .../framework/rax/template/static-files.ts | 29 - .../rax/types/RaxFrameworkOptions.ts | 81 - .../src/plugins/project/i18n.ts | 132 - .../src/plugins/project/utils.ts | 155 - .../code-generator/src/polyfills/buffer.ts | 9 - .../code-generator/src/postprocessor/index.ts | 3 - .../src/postprocessor/prettier/index.ts | 46 - .../src/publisher/disk/index.ts | 72 - .../src/publisher/disk/utils.ts | 78 - .../code-generator/src/publisher/zip/index.ts | 72 - .../code-generator/src/publisher/zip/utils.ts | 63 - modules/code-generator/src/solutions/icejs.ts | 117 - .../code-generator/src/solutions/icejs3.ts | 113 - .../code-generator/src/solutions/rax-app.ts | 89 - .../code-generator/src/standalone-loader.ts | 133 - .../code-generator/src/standalone-worker.ts | 81 - modules/code-generator/src/standalone.ts | 120 - modules/code-generator/src/types/analyze.ts | 7 - modules/code-generator/src/types/core.ts | 255 - modules/code-generator/src/types/deps.ts | 38 - modules/code-generator/src/types/error.ts | 17 - modules/code-generator/src/types/file.ts | 14 - modules/code-generator/src/types/index.ts | 7 - .../code-generator/src/types/intermediate.ts | 83 - modules/code-generator/src/types/jsx.ts | 40 - modules/code-generator/src/types/publisher.ts | 17 - modules/code-generator/src/typings.d.ts | 1 - .../code-generator/src/utils/OrderedSet.ts | 33 - modules/code-generator/src/utils/Scope.ts | 28 - .../code-generator/src/utils/ScopeBindings.ts | 56 - modules/code-generator/src/utils/aopHelper.ts | 27 - modules/code-generator/src/utils/common.ts | 55 - .../code-generator/src/utils/compositeType.ts | 232 - .../code-generator/src/utils/dataSource.ts | 47 - modules/code-generator/src/utils/debug.ts | 3 - .../src/utils/encodeJsxAttrString.ts | 18 - modules/code-generator/src/utils/errors.ts | 26 - .../src/utils/expressionParser.ts | 386 -- modules/code-generator/src/utils/format.ts | 12 - modules/code-generator/src/utils/index.ts | 32 - .../code-generator/src/utils/jsExpression.ts | 151 - modules/code-generator/src/utils/jsSlot.ts | 69 - .../code-generator/src/utils/jsxHelpers.ts | 11 - modules/code-generator/src/utils/nodeToJSX.ts | 416 -- .../code-generator/src/utils/pathHelper.ts | 41 - .../code-generator/src/utils/resultHelper.ts | 251 - modules/code-generator/src/utils/schema.ts | 152 - .../src/utils/templateHelper.ts | 30 - modules/code-generator/src/utils/theme.ts | 20 - modules/code-generator/src/utils/validate.ts | 14 - modules/code-generator/src/utils/version.ts | 29 - .../code-generator/standalone-loader/index.js | 2 - .../standalone-loader/package.json | 6 - .../code-generator/standalone-worker/index.js | 6 - .../standalone-worker/package.json | 5 - modules/code-generator/standalone/index.js | 6 - .../code-generator/standalone/package.json | 5 - .../static-files/rax/.eslintignore.template | 8 - .../static-files/rax/.eslintrc.js.template | 15 - .../static-files/rax/.gitignore.template | 18 - .../static-files/rax/.prettierignore.template | 8 - .../static-files/rax/.prettierrc.js.template | 3 - .../rax/.stylelintignore.template | 8 - .../static-files/rax/.stylelintrc.js.template | 3 - .../static-files/rax/README.md.template | 15 - .../static-files/rax/jsconfig.json.template | 10 - .../static-files/rax/tsconfig.json.template | 33 - .../code-generator/tests/bugfix/.gitignore | 1 - .../tests/bugfix/i18n-with-params.schema.json | 52 - .../tests/bugfix/i18n-with-params.test.ts | 54 - .../icejs-import-wrong-naming.schema.json | 34 - .../bugfix/icejs-import-wrong-naming.test.ts | 222 - .../bugfix/icejs-js-function1.schema.json | 1308 ---- .../tests/bugfix/icejs-js-function1.test.ts | 44 - .../icejs-missing-imports-1.schema.json | 903 --- .../bugfix/icejs-missing-imports-1.test.ts | 44 - ...cejs-package-json-dependencies.schema.json | 57 - .../icejs-package-json-dependencies.test.ts | 50 - .../tests/bugfix/icejs-page-map1.schema.json | 47 - .../tests/bugfix/icejs-page-map1.test.ts | 38 - .../tests/bugfix/page-element1.schema.json | 844 --- .../tests/bugfix/page-element1.test.ts | 80 - .../tests/bugfix/page-element2.schema.json | 844 --- .../tests/bugfix/page-element2.test.ts | 80 - .../bugfix/strict-mode-context-1.schema.json | 677 -- .../bugfix/strict-mode-context-1.test.ts | 57 - .../tolerate-eval-errors-1-loop.schema.json | 58 - .../tolerate-eval-errors-1-loop.test.ts | 52 - ...rate-eval-errors-2-nested-loop.schema.json | 70 - ...tolerate-eval-errors-2-nested-loop.test.ts | 56 - modules/code-generator/tests/cli.test.ts | 43 - .../tests/fixtures/test-cases/.gitignore | 1 - .../expected/demo-project/.browserslistrc | 3 - .../demo1/expected/demo-project/.gitignore | 25 - .../demo1/expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../demo1/expected/demo-project/package.json | 44 - .../demo1/expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 13 - .../demo1/expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 0 .../demo-project/src/pages/Test/index.jsx | 205 - .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../demo1/expected/demo-project/src/utils.js | 47 - .../test-cases/icejs3-app/demo1/schema.json5 | 276 - .../expected/demo-project/.browserslistrc | 3 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../expected/demo-project/package.json | 48 - .../expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Aaaa/index.css | 0 .../demo-project/src/pages/Aaaa/index.jsx | 118 - .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../expected/demo-project/src/utils.js | 61 - .../demo2-utils-name-alias/schema.json5 | 123 - .../expected/demo-project/.browserslistrc | 3 - .../demo2/expected/demo-project/.gitignore | 25 - .../demo2/expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../demo2/expected/demo-project/package.json | 42 - .../demo2/expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 13 - .../demo2/expected/demo-project/src/i18n.js | 86 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 0 .../demo-project/src/pages/Test/index.jsx | 129 - .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../demo2/expected/demo-project/src/utils.js | 47 - .../test-cases/icejs3-app/demo2/schema.json5 | 256 - .../expected/demo-project/.browserslistrc | 3 - .../demo3/expected/demo-project/.gitignore | 25 - .../demo3/expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../demo3/expected/demo-project/package.json | 42 - .../demo3/expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 13 - .../demo3/expected/demo-project/src/i18n.js | 86 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 0 .../demo-project/src/pages/Test/index.jsx | 107 - .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../demo3/expected/demo-project/src/utils.js | 47 - .../test-cases/icejs3-app/demo3/schema.json5 | 159 - .../expected/demo-project/.browserslistrc | 3 - .../demo4/expected/demo-project/.gitignore | 25 - .../demo4/expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../demo4/expected/demo-project/package.json | 45 - .../demo4/expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 6 - .../demo4/expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 292 - .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../demo4/expected/demo-project/src/utils.js | 47 - .../test-cases/icejs3-app/demo4/schema.json5 | 353 - .../expected/demo-project/.browserslistrc | 3 - .../demo5/expected/demo-project/.gitignore | 25 - .../demo5/expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../demo5/expected/demo-project/package.json | 46 - .../demo5/expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 6 - .../demo5/expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 389 -- .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../demo5/expected/demo-project/src/utils.js | 47 - .../test-cases/icejs3-app/demo5/schema.json5 | 677 -- .../expected/demo-project/.browserslistrc | 3 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../expected/demo-project/package.json | 44 - .../expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 13 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 0 .../demo-project/src/pages/Test/index.jsx | 205 - .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../expected/demo-project/src/utils.js | 47 - .../demo6-literal-condition/schema.json5 | 273 - .../expected/demo-project/.browserslistrc | 3 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../expected/demo-project/package.json | 45 - .../expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 1076 --- .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../expected/demo-project/src/utils.js | 47 - .../demo7-literal-condition2/schema.json5 | 1703 ----- .../expected/demo-project/.browserslistrc | 3 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../expected/demo-project/package.json | 44 - .../expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Example/index.css | 0 .../demo-project/src/pages/Example/index.jsx | 116 - .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../expected/demo-project/src/utils.js | 47 - .../demo8-datasource-prop/schema.json5 | 65 - .../expected/demo-project/.browserslistrc | 3 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../expected/demo-project/package.json | 43 - .../expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/$/index.css | 0 .../demo-project/src/pages/$/index.jsx | 125 - .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../expected/demo-project/src/utils.js | 47 - .../demo9-datasource-engine/schema.json5 | 59 - .../expected/demo-project/.browserslistrc | 3 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../expected/demo-project/package.json | 46 - .../expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 822 --- .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../expected/demo-project/src/utils.js | 47 - .../icejs3-app/demo_10-jsslot/schema.json5 | 1206 ---- .../expected/demo-project/.browserslistrc | 3 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/README.md | 1 - .../expected/demo-project/ice.config.mts | 89 - .../expected/demo-project/package.json | 46 - .../expected/demo-project/src/app.ts | 13 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/document.tsx | 29 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 68 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 976 --- .../demo-project/src/pages/layout.jsx | 10 - .../expected/demo-project/src/typings.d.ts | 9 - .../expected/demo-project/src/utils.js | 47 - .../icejs3-app/demo_11-jsslot-2/schema.json5 | 1457 ----- .../expected/demo-project/.eslintignore | 8 - .../demo01/expected/demo-project/.eslintrc.js | 15 - .../demo01/expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../demo01/expected/demo-project/README.md | 15 - .../demo01/expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../demo01/expected/demo-project/package.json | 29 - .../demo01/expected/demo-project/src/app.js | 9 - .../demo01/expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../demo01/expected/demo-project/src/i18n.js | 68 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 142 - .../demo01/expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../test-cases/rax-app/demo01/schema.json5 | 54 - .../expected/demo-project/.eslintignore | 8 - .../demo02/expected/demo-project/.eslintrc.js | 15 - .../demo02/expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../demo02/expected/demo-project/README.md | 15 - .../demo02/expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../demo02/expected/demo-project/package.json | 35 - .../demo02/expected/demo-project/src/app.js | 9 - .../demo02/expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 9 - .../demo02/expected/demo-project/src/i18n.js | 68 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 347 - .../demo02/expected/demo-project/src/utils.js | 70 - .../expected/demo-project/tsconfig.json | 33 - .../test-cases/rax-app/demo02/schema.json5 | 374 -- .../expected/demo-project/.eslintignore | 8 - .../demo03/expected/demo-project/.eslintrc.js | 15 - .../demo03/expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../demo03/expected/demo-project/README.md | 15 - .../demo03/expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../demo03/expected/demo-project/package.json | 30 - .../demo03/expected/demo-project/src/app.js | 9 - .../demo03/expected/demo-project/src/app.json | 19 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 9 - .../demo03/expected/demo-project/src/i18n.js | 68 - .../demo-project/src/pages/Detail/index.css | 0 .../demo-project/src/pages/Detail/index.jsx | 151 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 151 - .../demo-project/src/pages/List/index.css | 0 .../demo-project/src/pages/List/index.jsx | 154 - .../demo03/expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../test-cases/rax-app/demo03/schema.json5 | 175 - .../test-cases/rax-app/demo04/README.md | 1 - .../expected/demo-project/.eslintignore | 8 - .../demo04/expected/demo-project/.eslintrc.js | 15 - .../demo04/expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../demo04/expected/demo-project/README.md | 15 - .../demo04/expected/demo-project/build.json | 8 - .../expected/demo-project/jsconfig.json | 10 - .../demo04/expected/demo-project/package.json | 30 - .../demo04/expected/demo-project/src/app.js | 9 - .../demo04/expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 9 - .../demo04/expected/demo-project/src/i18n.js | 68 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 146 - .../demo04/expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../test-cases/rax-app/demo04/schema.json5 | 85 - .../expected/demo-project/.eslintignore | 8 - .../demo05/expected/demo-project/.eslintrc.js | 15 - .../demo05/expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../demo05/expected/demo-project/README.md | 15 - .../demo05/expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../demo05/expected/demo-project/package.json | 29 - .../demo05/expected/demo-project/src/app.js | 9 - .../demo05/expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../demo05/expected/demo-project/src/i18n.js | 75 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 148 - .../demo05/expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../test-cases/rax-app/demo05/schema.json5 | 72 - .../expected/demo-project/.eslintignore | 8 - .../expected/demo-project/.eslintrc.js | 15 - .../expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../expected/demo-project/README.md | 15 - .../expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../expected/demo-project/package.json | 30 - .../expected/demo-project/src/app.js | 9 - .../expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../expected/demo-project/src/i18n.js | 75 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 154 - .../expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../rax-app/demo06-jsslot/schema.json5 | 84 - .../expected/demo-project/.eslintignore | 8 - .../expected/demo-project/.eslintrc.js | 15 - .../expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../expected/demo-project/README.md | 15 - .../expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../expected/demo-project/package.json | 29 - .../expected/demo-project/src/app.js | 9 - .../expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../expected/demo-project/src/i18n.js | 75 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 148 - .../expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../demo07-newline-in-props/schema.json5 | 78 - .../expected/demo-project/.eslintignore | 8 - .../expected/demo-project/.eslintrc.js | 15 - .../expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../expected/demo-project/README.md | 15 - .../expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../expected/demo-project/package.json | 30 - .../expected/demo-project/src/app.js | 9 - .../expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../expected/demo-project/src/i18n.js | 75 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 154 - .../expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../schema.json5 | 90 - .../expected/demo-project/.eslintignore | 8 - .../expected/demo-project/.eslintrc.js | 15 - .../expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../expected/demo-project/README.md | 15 - .../expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../expected/demo-project/package.json | 30 - .../expected/demo-project/src/app.js | 9 - .../expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../expected/demo-project/src/i18n.js | 75 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 157 - .../expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../schema.json5 | 94 - .../expected/demo-project/.eslintignore | 8 - .../expected/demo-project/.eslintrc.js | 15 - .../expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../expected/demo-project/README.md | 15 - .../expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../expected/demo-project/package.json | 30 - .../expected/demo-project/src/app.js | 9 - .../expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../expected/demo-project/src/i18n.js | 75 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 159 - .../expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../schema.json5 | 89 - .../expected/demo-project/.eslintignore | 8 - .../expected/demo-project/.eslintrc.js | 15 - .../expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../expected/demo-project/README.md | 15 - .../expected/demo-project/build.json | 8 - .../expected/demo-project/jsconfig.json | 10 - .../expected/demo-project/package.json | 33 - .../expected/demo-project/src/app.js | 9 - .../expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../expected/demo-project/src/i18n.js | 68 - .../demo-project/src/pages/Aaaa/index.css | 0 .../demo-project/src/pages/Aaaa/index.jsx | 171 - .../expected/demo-project/src/utils.js | 61 - .../expected/demo-project/tsconfig.json | 33 - .../demo11-utils-name-alias/schema.json5 | 136 - .../expected/demo-project/.eslintignore | 8 - .../expected/demo-project/.eslintrc.js | 15 - .../expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../expected/demo-project/README.md | 15 - .../expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../expected/demo-project/package.json | 29 - .../expected/demo-project/src/app.js | 9 - .../expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../expected/demo-project/src/i18n.js | 75 - .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 162 - .../expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../rax-app/demo12-refs/schema.json5 | 73 - .../expected/demo-project/.eslintignore | 8 - .../expected/demo-project/.eslintrc.js | 15 - .../expected/demo-project/.gitignore | 18 - .../expected/demo-project/.prettierignore | 8 - .../expected/demo-project/.prettierrc.js | 3 - .../expected/demo-project/.stylelintignore | 8 - .../expected/demo-project/.stylelintrc.js | 3 - .../expected/demo-project/README.md | 15 - .../expected/demo-project/build.json | 5 - .../expected/demo-project/jsconfig.json | 10 - .../expected/demo-project/package.json | 29 - .../expected/demo-project/src/app.js | 9 - .../expected/demo-project/src/app.json | 11 - .../expected/demo-project/src/constants.js | 3 - .../demo-project/src/document/index.jsx | 25 - .../expected/demo-project/src/global.css | 3 - .../expected/demo-project/src/i18n.js | 68 - .../demo-project/src/pages/Example/index.css | 0 .../demo-project/src/pages/Example/index.jsx | 173 - .../expected/demo-project/src/utils.js | 45 - .../expected/demo-project/tsconfig.json | 33 - .../demo13-datasource-prop/schema.json5 | 65 - .../demo1/expected/demo-project/.editorconfig | 14 - .../demo1/expected/demo-project/.eslintignore | 17 - .../demo1/expected/demo-project/.eslintrc.js | 5 - .../demo1/expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../demo1/expected/demo-project/README.md | 62 - .../demo1/expected/demo-project/abc.json | 6 - .../demo1/expected/demo-project/build.json | 21 - .../demo1/expected/demo-project/jsconfig.json | 13 - .../demo1/expected/demo-project/package.json | 50 - .../expected/demo-project/public/index.html | 12 - .../demo1/expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 13 - .../demo1/expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 0 .../demo-project/src/pages/Test/index.jsx | 205 - .../demo1/expected/demo-project/src/routes.js | 18 - .../demo1/expected/demo-project/src/utils.js | 47 - .../demo1/expected/demo-project/tsconfig.json | 35 - .../test-cases/react-app/demo1/schema.json5 | 276 - .../expected/demo-project/.editorconfig | 14 - .../expected/demo-project/.eslintignore | 17 - .../expected/demo-project/.eslintrc.js | 5 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../expected/demo-project/README.md | 62 - .../expected/demo-project/abc.json | 6 - .../expected/demo-project/build.json | 21 - .../expected/demo-project/jsconfig.json | 13 - .../expected/demo-project/package.json | 53 - .../expected/demo-project/public/index.html | 12 - .../expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Aaaa/index.css | 0 .../demo-project/src/pages/Aaaa/index.jsx | 118 - .../expected/demo-project/src/routes.js | 18 - .../expected/demo-project/src/utils.js | 61 - .../expected/demo-project/tsconfig.json | 35 - .../demo2-utils-name-alias/schema.json5 | 123 - .../demo2/expected/demo-project/.editorconfig | 14 - .../demo2/expected/demo-project/.eslintignore | 17 - .../demo2/expected/demo-project/.eslintrc.js | 5 - .../demo2/expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../demo2/expected/demo-project/README.md | 62 - .../demo2/expected/demo-project/abc.json | 6 - .../demo2/expected/demo-project/build.json | 21 - .../demo2/expected/demo-project/jsconfig.json | 13 - .../demo2/expected/demo-project/package.json | 48 - .../expected/demo-project/public/index.html | 12 - .../demo2/expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 13 - .../demo2/expected/demo-project/src/i18n.js | 86 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 0 .../demo-project/src/pages/Test/index.jsx | 129 - .../demo2/expected/demo-project/src/routes.js | 18 - .../demo2/expected/demo-project/src/utils.js | 47 - .../demo2/expected/demo-project/tsconfig.json | 35 - .../test-cases/react-app/demo2/schema.json5 | 256 - .../demo3/expected/demo-project/.editorconfig | 14 - .../demo3/expected/demo-project/.eslintignore | 17 - .../demo3/expected/demo-project/.eslintrc.js | 5 - .../demo3/expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../demo3/expected/demo-project/README.md | 62 - .../demo3/expected/demo-project/abc.json | 6 - .../demo3/expected/demo-project/build.json | 21 - .../demo3/expected/demo-project/jsconfig.json | 13 - .../demo3/expected/demo-project/package.json | 48 - .../expected/demo-project/public/index.html | 12 - .../demo3/expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 13 - .../demo3/expected/demo-project/src/i18n.js | 86 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 0 .../demo-project/src/pages/Test/index.jsx | 107 - .../demo3/expected/demo-project/src/routes.js | 18 - .../demo3/expected/demo-project/src/utils.js | 47 - .../demo3/expected/demo-project/tsconfig.json | 35 - .../test-cases/react-app/demo3/schema.json5 | 159 - .../demo4/expected/demo-project/.editorconfig | 14 - .../demo4/expected/demo-project/.eslintignore | 17 - .../demo4/expected/demo-project/.eslintrc.js | 5 - .../demo4/expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../demo4/expected/demo-project/README.md | 62 - .../demo4/expected/demo-project/abc.json | 6 - .../demo4/expected/demo-project/build.json | 21 - .../demo4/expected/demo-project/jsconfig.json | 13 - .../demo4/expected/demo-project/package.json | 50 - .../expected/demo-project/public/index.html | 12 - .../demo4/expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 6 - .../demo4/expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 292 - .../demo4/expected/demo-project/src/routes.js | 18 - .../demo4/expected/demo-project/src/utils.js | 47 - .../demo4/expected/demo-project/tsconfig.json | 35 - .../test-cases/react-app/demo4/schema.json5 | 353 - .../demo5/expected/demo-project/.editorconfig | 14 - .../demo5/expected/demo-project/.eslintignore | 17 - .../demo5/expected/demo-project/.eslintrc.js | 5 - .../demo5/expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../demo5/expected/demo-project/README.md | 62 - .../demo5/expected/demo-project/abc.json | 6 - .../demo5/expected/demo-project/build.json | 21 - .../demo5/expected/demo-project/jsconfig.json | 13 - .../demo5/expected/demo-project/package.json | 51 - .../expected/demo-project/public/index.html | 12 - .../demo5/expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 6 - .../demo5/expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 389 -- .../demo5/expected/demo-project/src/routes.js | 18 - .../demo5/expected/demo-project/src/utils.js | 47 - .../demo5/expected/demo-project/tsconfig.json | 35 - .../test-cases/react-app/demo5/schema.json5 | 677 -- .../expected/demo-project/.editorconfig | 14 - .../expected/demo-project/.eslintignore | 17 - .../expected/demo-project/.eslintrc.js | 5 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../expected/demo-project/README.md | 62 - .../expected/demo-project/abc.json | 6 - .../expected/demo-project/build.json | 21 - .../expected/demo-project/jsconfig.json | 13 - .../expected/demo-project/package.json | 50 - .../expected/demo-project/public/index.html | 12 - .../expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 13 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 0 .../demo-project/src/pages/Test/index.jsx | 205 - .../expected/demo-project/src/routes.js | 18 - .../expected/demo-project/src/utils.js | 47 - .../expected/demo-project/tsconfig.json | 35 - .../demo6-literal-condition/schema.json5 | 273 - .../expected/demo-project/.editorconfig | 14 - .../expected/demo-project/.eslintignore | 17 - .../expected/demo-project/.eslintrc.js | 5 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../expected/demo-project/README.md | 62 - .../expected/demo-project/abc.json | 6 - .../expected/demo-project/build.json | 21 - .../expected/demo-project/jsconfig.json | 13 - .../expected/demo-project/package.json | 50 - .../expected/demo-project/public/index.html | 12 - .../expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 1076 --- .../expected/demo-project/src/routes.js | 18 - .../expected/demo-project/src/utils.js | 47 - .../expected/demo-project/tsconfig.json | 35 - .../demo7-literal-condition2/schema.json5 | 1703 ----- .../expected/demo-project/.editorconfig | 14 - .../expected/demo-project/.eslintignore | 17 - .../expected/demo-project/.eslintrc.js | 5 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../expected/demo-project/README.md | 62 - .../expected/demo-project/abc.json | 6 - .../expected/demo-project/build.json | 21 - .../expected/demo-project/jsconfig.json | 13 - .../expected/demo-project/package.json | 49 - .../expected/demo-project/public/index.html | 12 - .../expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Example/index.css | 0 .../demo-project/src/pages/Example/index.jsx | 116 - .../expected/demo-project/src/routes.js | 18 - .../expected/demo-project/src/utils.js | 47 - .../expected/demo-project/tsconfig.json | 35 - .../demo8-datasource-prop/schema.json5 | 65 - .../expected/demo-project/.editorconfig | 14 - .../expected/demo-project/.eslintignore | 17 - .../expected/demo-project/.eslintrc.js | 5 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../expected/demo-project/README.md | 62 - .../expected/demo-project/abc.json | 6 - .../expected/demo-project/build.json | 21 - .../expected/demo-project/jsconfig.json | 13 - .../expected/demo-project/package.json | 49 - .../expected/demo-project/public/index.html | 12 - .../expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/$/index.css | 0 .../demo-project/src/pages/$/index.jsx | 125 - .../expected/demo-project/src/routes.js | 18 - .../expected/demo-project/src/utils.js | 47 - .../expected/demo-project/tsconfig.json | 35 - .../demo9-datasource-engine/schema.json5 | 59 - .../expected/demo-project/.editorconfig | 14 - .../expected/demo-project/.eslintignore | 17 - .../expected/demo-project/.eslintrc.js | 5 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../expected/demo-project/README.md | 62 - .../expected/demo-project/abc.json | 6 - .../expected/demo-project/build.json | 21 - .../expected/demo-project/jsconfig.json | 13 - .../expected/demo-project/package.json | 51 - .../expected/demo-project/public/index.html | 12 - .../expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 822 --- .../expected/demo-project/src/routes.js | 18 - .../expected/demo-project/src/utils.js | 47 - .../expected/demo-project/tsconfig.json | 35 - .../react-app/demo_10-jsslot/schema.json5 | 1206 ---- .../expected/demo-project/.editorconfig | 14 - .../expected/demo-project/.eslintignore | 17 - .../expected/demo-project/.eslintrc.js | 5 - .../expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../expected/demo-project/README.md | 62 - .../expected/demo-project/abc.json | 6 - .../expected/demo-project/build.json | 21 - .../expected/demo-project/jsconfig.json | 13 - .../expected/demo-project/package.json | 51 - .../expected/demo-project/public/index.html | 12 - .../expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 6 - .../expected/demo-project/src/i18n.js | 77 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 8 - .../demo-project/src/pages/Test/index.jsx | 976 --- .../expected/demo-project/src/routes.js | 18 - .../expected/demo-project/src/utils.js | 47 - .../expected/demo-project/tsconfig.json | 35 - .../react-app/demo_11-jsslot-2/schema.json5 | 1457 ----- .../demo1/expected/demo-project/.editorconfig | 14 - .../demo1/expected/demo-project/.eslintignore | 17 - .../demo1/expected/demo-project/.eslintrc.js | 5 - .../demo1/expected/demo-project/.gitignore | 25 - .../expected/demo-project/.prettierignore | 11 - .../expected/demo-project/.prettierrc.js | 5 - .../expected/demo-project/.stylelintignore | 9 - .../expected/demo-project/.stylelintrc.js | 5 - .../demo1/expected/demo-project/README.md | 62 - .../demo1/expected/demo-project/abc.json | 6 - .../demo1/expected/demo-project/build.json | 22 - .../demo1/expected/demo-project/jsconfig.json | 13 - .../demo1/expected/demo-project/package.json | 44 - .../expected/demo-project/public/index.html | 12 - .../demo1/expected/demo-project/src/app.js | 11 - .../expected/demo-project/src/constants.js | 3 - .../expected/demo-project/src/global.scss | 13 - .../demo1/expected/demo-project/src/i18n.js | 33 - .../BasicLayout/components/Footer/index.jsx | 14 - .../components/Footer/index.module.scss | 15 - .../BasicLayout/components/Logo/index.jsx | 16 - .../components/Logo/index.module.scss | 20 - .../BasicLayout/components/PageNav/index.jsx | 70 - .../src/layouts/BasicLayout/index.jsx | 81 - .../src/layouts/BasicLayout/menuConfig.js | 11 - .../demo-project/src/pages/Test/index.css | 0 .../demo-project/src/pages/Test/index.jsx | 79 - .../demo1/expected/demo-project/src/routes.js | 18 - .../demo1/expected/demo-project/src/utils.js | 47 - .../demo1/expected/demo-project/tsconfig.json | 35 - .../react-module/demo1/schema.json5 | 296 - .../tests/helpers/solutionHelper.ts | 106 - .../__snapshots__/requireUtils.test.ts.snap | 18 - .../tests/plugins/common/requireUtils.test.ts | 17 - .../p0-condition-at-root.test.ts.snap | 355 - .../plugins/jsx/p0-condition-at-root.test.ts | 104 - .../__snapshots__/prettier.test.ts.snap | 44 - .../tests/postprocessor/prettier.test.ts | 39 - modules/code-generator/tests/public/README.md | 1 - .../__snapshots__/p0-basic.test.ts.snap | 178 - .../SchemaParser/data/schema-with-slot.json | 1457 ----- .../public/SchemaParser/p0-basic.test.ts | 13 - .../code-generator/tests/public/cli.test.ts | 32 - .../tests/public/publisher/disk/disk.test.ts | 56 - .../tests/public/publisher/zip/zip.test.ts | 87 - .../tests/public/solutions/icejs3-app.test.ts | 67 - .../tests/public/solutions/rax-app.test.ts | 68 - .../tests/public/solutions/react-app.test.ts | 67 - .../tests/utils/compositeType.test.ts | 141 - .../code-generator/tests/utils/errors.test.ts | 27 - .../expressionParser/jsExpression.test.ts | 45 - ...parseExpressionConvertThis2Context.test.ts | 95 - .../parseExpressionGetGlobalVariables.test.ts | 134 - .../parseExpressionGetKeywords.test.ts | 31 - .../tests/utils/flattenResult.test.ts | 60 - .../utils/resultHelper/example-result.json | 46 - .../tests/utils/resultHelper/findFile.test.ts | 34 - .../utils/resultHelper/globFiles.test.ts | 67 - .../resultHelper/removeDirsFromResult.test.ts | 101 - .../removeFilesFromResult.test.ts | 102 - .../utils/resultHelper/scanFiles.test.ts | 68 - .../utils/schema/data/schema-with-slot.json | 1457 ----- .../tests/utils/schema/handleSubNodes.test.ts | 92 - .../tests/utils/validate.test.ts | 20 - .../tests/utils/version.test.ts | 33 - modules/code-generator/tsconfig.json | 8 - modules/material-parser/README.md | 22 - modules/material-parser/build.test.json | 5 - modules/material-parser/demo/component.jsx | 81 - modules/material-parser/demo/component.tsx | 54 - modules/material-parser/demo/parse-jsx.js | 11 - modules/material-parser/demo/parse-tsx.js | 11 - modules/material-parser/jest.config.js | 20 - modules/material-parser/package.json | 76 - modules/material-parser/schemas/schema.json | 537 -- modules/material-parser/schemas/schema.yml | 351 - modules/material-parser/scripts/transform.js | 35 - modules/material-parser/src/core/index.ts | 10 - .../material-parser/src/core/schema/types.ts | 163 - modules/material-parser/src/generate.ts | 65 - modules/material-parser/src/index.ts | 70 - modules/material-parser/src/localize.ts | 126 - .../src/parse/dynamic/index.ts | 121 - .../src/parse/dynamic/requireInSandbox.ts | 37 - modules/material-parser/src/parse/index.ts | 80 - .../parse/js/handlers/defaultPropsHandler.ts | 138 - .../src/parse/js/handlers/index.ts | 22 - .../parse/js/handlers/preProcessHandler.ts | 3 - .../src/parse/js/handlers/propTypeHandler.ts | 139 - .../parse/js/handlers/propTypeJsDocHandler.ts | 64 - modules/material-parser/src/parse/js/index.ts | 42 - .../src/parse/js/resolver/checkIsIIFE.ts | 8 - .../parse/js/resolver/findAssignedMethods.ts | 37 - .../src/parse/js/resolver/index.ts | 393 -- .../resolver/isReactComponentStaticMember.ts | 14 - .../src/parse/js/resolver/isStaticMethod.ts | 15 - .../js/resolver/resolveExportDeclaration.ts | 53 - .../src/parse/js/resolver/resolveHOC.ts | 42 - .../src/parse/js/resolver/resolveIIFE.ts | 20 - .../src/parse/js/resolver/resolveImport.ts | 179 - .../js/resolver/resolveTranspiledClass.ts | 31 - .../src/parse/js/utils/cache.ts | 18 - .../src/parse/js/utils/evaluate.ts | 103 - .../src/parse/js/utils/findJSFilePath.ts | 15 - .../src/parse/js/utils/getComposedPath.ts | 52 - .../src/parse/js/utils/getName.ts | 13 - .../src/parse/js/utils/getRoot.ts | 7 - .../src/parse/js/utils/makeProxy.ts | 23 - .../material-parser/src/parse/transform.ts | 306 - .../src/parse/ts/generateDTS.ts | 56 - modules/material-parser/src/parse/ts/index.ts | 609 -- .../src/parse/ts/tsconfig.json | 11 - modules/material-parser/src/scan.ts | 78 - modules/material-parser/src/types/Basic.ts | 5 - .../material-parser/src/types/ChannelType.ts | 9 - modules/material-parser/src/types/DSLType.ts | 4 - .../material-parser/src/types/IAccesser.ts | 14 - .../src/types/IExtensionConfigManifest.ts | 13 - .../src/types/IMaterialParsedModel.ts | 22 - .../src/types/IMaterialScanModel.ts | 23 - .../src/types/IMaterializeOptions.ts | 117 - modules/material-parser/src/types/Meta.ts | 14 - modules/material-parser/src/types/index.ts | 8 - modules/material-parser/src/utils.ts | 138 - modules/material-parser/src/validate/index.ts | 14 - .../material-parser/src/validate/schema.json | 548 -- .../test/__snapshots__/dynamic.test.ts.snap | 27 - .../test/__snapshots__/index.test.ts.snap | 1753 ----- .../test/__snapshots__/online.test.ts.snap | 5780 ----------------- modules/material-parser/test/dynamic.test.ts | 14 - .../test/fixtures/dts-component/index.d.ts | 168 - .../test/fixtures/dts-component/package.json | 5 - .../test/fixtures/dts-component/src/data.js | 1264 ---- .../test/fixtures/dts-component/src/i18n.js | 27 - .../test/fixtures/dts-component/src/index.jsx | 142 - .../test/fixtures/dts-component/src/main.scss | 40 - .../dts-component/src/scss/variable.scss | 12 - .../es/basic/AIMakeBlank/amContainer.js | 11 - .../es/basic/AIMakeBlank/amManifest.js | 144 - .../es/basic/AIMakeBlank/container.js | 6 - .../es/basic/AIMakeBlank/index.js | 74 - .../es/basic/AIMakeBlank/manifest.js | 1 - .../es/basic/AIMakeBlank/manifest.json | 1 - .../es/basic/AIMakeIcon/IconFont.js | 67 - .../es/basic/AIMakeIcon/amContainer.js | 13 - .../es/basic/AIMakeIcon/amManifest.js | 82 - .../es/basic/AIMakeIcon/container.js | 6 - .../es/basic/AIMakeIcon/index.js | 71 - .../es/basic/AIMakeIcon/manifest.js | 1 - .../es/basic/AIMakeIcon/manifest.json | 1 - .../es/basic/AIMakeImage/amContainer.js | 11 - .../es/basic/AIMakeImage/amManifest.js | 86 - .../es/basic/AIMakeImage/container.js | 6 - .../es/basic/AIMakeImage/index.js | 54 - .../es/basic/AIMakeImage/manifest.js | 1 - .../es/basic/AIMakeImage/manifest.json | 1 - .../es/basic/AIMakeLink/amContainer.js | 11 - .../es/basic/AIMakeLink/amManifest.js | 102 - .../es/basic/AIMakeLink/container.js | 6 - .../es/basic/AIMakeLink/index.js | 73 - .../es/basic/AIMakeLink/manifest.js | 1 - .../es/basic/AIMakeLink/manifest.json | 1 - .../es/basic/AIMakePlaceholder/amContainer.js | 11 - .../es/basic/AIMakePlaceholder/amManifest.js | 102 - .../es/basic/AIMakePlaceholder/container.js | 6 - .../es/basic/AIMakePlaceholder/index.js | 65 - .../es/basic/AIMakePlaceholder/manifest.js | 1 - .../es/basic/AIMakePlaceholder/manifest.json | 1 - .../es/basic/AIMakeText/amContainer.js | 11 - .../es/basic/AIMakeText/amManifest.js | 115 - .../es/basic/AIMakeText/container.js | 6 - .../es/basic/AIMakeText/index.js | 95 - .../es/basic/AIMakeText/manifest.js | 1 - .../es/basic/AIMakeText/manifest.json | 1 - .../es/basic/Root/amContainer.js | 11 - .../es/basic/Root/amManifest.js | 25 - .../es/basic/Root/container.js | 6 - .../es/basic/Root/index.js | 51 - .../es/basic/Root/manifest.js | 1 - .../es/basic/Root/manifest.json | 1 - .../es/basic/style/index.css | 15 - .../es/basic/style/index.js | 1 - .../es/basic/style/index.less | 8 - .../es/basic/utils/HOCBackgroundProps.js | 74 - .../es/basic/utils/HOCBoxModelProps.js | 103 - .../es/basic/utils/HOCFlexLayoutProps.js | 90 - .../es/basic/utils/HOCLayoutProps.js | 82 - .../es/basic/utils/HOCTextProps.js | 82 - .../multiple-exported-component/es/index.js | 9 - .../multiple-exported-component/package.json | 22 - .../src/basic/AIMakeBlank/amContainer.js | 6 - .../src/basic/AIMakeBlank/amManifest.js | 158 - .../src/basic/AIMakeBlank/container.js | 5 - .../src/basic/AIMakeBlank/index.js | 61 - .../src/basic/AIMakeBlank/manifest.js | 1 - .../src/basic/AIMakeBlank/manifest.json | 1 - .../src/basic/AIMakeIcon/IconFont.js | 51 - .../src/basic/AIMakeIcon/amContainer.js | 7 - .../src/basic/AIMakeIcon/amManifest.js | 89 - .../src/basic/AIMakeIcon/container.js | 5 - .../src/basic/AIMakeIcon/index.js | 59 - .../src/basic/AIMakeIcon/manifest.js | 1 - .../src/basic/AIMakeIcon/manifest.json | 1 - .../src/basic/AIMakeImage/amContainer.js | 6 - .../src/basic/AIMakeImage/amManifest.js | 99 - .../src/basic/AIMakeImage/container.js | 5 - .../src/basic/AIMakeImage/index.js | 26 - .../src/basic/AIMakeImage/manifest.js | 1 - .../src/basic/AIMakeImage/manifest.json | 1 - .../src/basic/AIMakeLink/amContainer.js | 6 - .../src/basic/AIMakeLink/amManifest.js | 115 - .../src/basic/AIMakeLink/container.js | 5 - .../src/basic/AIMakeLink/index.js | 57 - .../src/basic/AIMakeLink/manifest.js | 1 - .../src/basic/AIMakeLink/manifest.json | 1 - .../basic/AIMakePlaceholder/amContainer.js | 6 - .../src/basic/AIMakePlaceholder/amManifest.js | 115 - .../src/basic/AIMakePlaceholder/container.js | 5 - .../src/basic/AIMakePlaceholder/index.js | 45 - .../src/basic/AIMakePlaceholder/manifest.js | 1 - .../src/basic/AIMakePlaceholder/manifest.json | 1 - .../src/basic/AIMakeText/amContainer.js | 6 - .../src/basic/AIMakeText/amManifest.js | 119 - .../src/basic/AIMakeText/container.js | 5 - .../src/basic/AIMakeText/index.js | 72 - .../src/basic/AIMakeText/manifest.js | 1 - .../src/basic/AIMakeText/manifest.json | 1 - .../src/basic/Root/amContainer.js | 6 - .../src/basic/Root/amManifest.js | 29 - .../src/basic/Root/container.js | 5 - .../src/basic/Root/index.js | 29 - .../src/basic/Root/manifest.js | 1 - .../src/basic/Root/manifest.json | 1 - .../src/basic/style/index.js | 1 - .../src/basic/style/index.less | 8 - .../src/basic/utils/HOCBackgroundProps.js | 44 - .../src/basic/utils/HOCBoxModelProps.js | 75 - .../src/basic/utils/HOCFlexLayoutProps.js | 61 - .../src/basic/utils/HOCLayoutProps.js | 52 - .../src/basic/utils/HOCTextProps.js | 52 - .../multiple-exported-component/src/index.js | 17 - .../test/fixtures/rax-component/package.json | 64 - .../test/fixtures/rax-component/src/index.css | 5 - .../test/fixtures/rax-component/src/index.tsx | 22 - .../single-exported-component/es/container.js | 6 - .../single-exported-component/es/index.js | 97 - .../single-exported-component/es/main.css | 6 - .../single-exported-component/es/main.scss | 11 - .../single-exported-component/es/manifest.js | 1 - .../es/manifest.json | 1 - .../single-exported-component/package.json | 30 - .../single-exported-component/src/index.js | 90 - .../single-exported-component/src/main.scss | 11 - .../transpiled-component/package.json | 8 - .../test/fixtures/ts-component/package.json | 34 - .../test/fixtures/ts-component/src/index.tsx | 9 - .../fixtures/ts-component/src/main-module.tsx | 104 - .../fixtures/ts-component/src/sub-module.tsx | 22 - .../test/fixtures/ts-component2/package.json | 62 - .../test/fixtures/ts-component2/src/empty.tsx | 22 - .../fixtures/ts-component2/src/index.scss | 49 - .../test/fixtures/ts-component2/src/index.tsx | 71 - .../fixtures/without-display-name/index.js | 12 - .../without-display-name/package.json | 9 - modules/material-parser/test/helpers/index.ts | 10 - modules/material-parser/test/index.test.ts | 110 - modules/material-parser/test/localize.test.ts | 6 - modules/material-parser/test/online.test.ts | 53 - .../validate/__snapshots__/index.test.ts.snap | 23 - .../validate/fixtures/basic-error/schema.json | 18 - .../fixtures/basic-success/schema.json | 19 - .../validate/fixtures/configure/schema.json | 68 - .../fixtures/props-basic-type/schema.json | 71 - .../fixtures/props-complex-type/schema.json | 95 - .../test/validate/index.test.ts | 25 - modules/material-parser/tsconfig.json | 19 - modules/material-parser/webpack.config.js | 40 - packages/editor-core/package.json | 3 +- packages/engine/README.md | 35 + packages/ignitor/build.json | 3 +- packages/ignitor/package.json | 3 +- packages/react-renderer/README.md | 0 packages/react-renderer/build.json | 9 - packages/react-renderer/build.test.json | 6 - packages/react-renderer/build.umd.json | 28 - packages/react-renderer/demo/compose.md | 35 - .../demo/config/components/A.jsx | 11 - .../demo/config/components/Div.jsx | 11 - .../demo/config/components/Image.jsx | 15 - .../demo/config/components/Text.jsx | 27 - .../demo/config/components/index.js | 175 - .../react-renderer/demo/config/constants.js | 3 - packages/react-renderer/demo/config/utils.js | 10 - packages/react-renderer/demo/dataSource.md | 35 - packages/react-renderer/demo/i18n.md | 40 - packages/react-renderer/demo/list.md | 35 - .../react-renderer/demo/schemas/compose.js | 61 - .../react-renderer/demo/schemas/dataSource.js | 37 - packages/react-renderer/demo/schemas/i18n.js | 20 - packages/react-renderer/demo/schemas/list.js | 225 - packages/react-renderer/demo/schemas/table.js | 367 -- packages/react-renderer/demo/table.md | 35 - packages/react-renderer/jest.config.js | 26 - packages/react-renderer/package.json | 47 - packages/react-renderer/src/index.ts | 71 - .../tests/__snapshots__/index.test.tsx.snap | 865 --- .../tests/fixtures/schema/basic.ts | 567 -- packages/react-renderer/tests/index.test.tsx | 31 - packages/react-renderer/tsconfig.json | 9 - packages/react-simulator-renderer/.babelrc | 6 - .../react-simulator-renderer/babel.config.js | 1 - packages/react-simulator-renderer/build.json | 3 - .../react-simulator-renderer/build.plugin.js | 5 - .../react-simulator-renderer/build.test.json | 6 - .../react-simulator-renderer/build.umd.json | 37 - .../react-simulator-renderer/jest.config.js | 27 - .../react-simulator-renderer/package.json | 52 - .../react-simulator-renderer/src/README.md | 1 - .../builtin-components/builtin-components.ts | 413 -- .../src/builtin-components/leaf.tsx | 24 - .../src/builtin-components/slot.tsx | 58 - packages/react-simulator-renderer/src/host.ts | 4 - .../react-simulator-renderer/src/index.ts | 17 - .../src/locale/en-US.json | 4 - .../src/locale/index.ts | 21 - .../src/locale/zh-CN.json | 4 - .../src/renderer-view.tsx | 295 - .../src/renderer.less | 95 - .../react-simulator-renderer/src/renderer.ts | 662 -- .../src/utils/get-client-rects.ts | 13 - .../src/utils/is-dom-node.ts | 3 - .../src/utils/misc.ts | 35 - .../src/utils/react-find-dom-nodes.ts | 41 - .../react-simulator-renderer/src/utils/url.ts | 74 - .../test/schema/basic.ts | 81 - .../renderer/__snapshots__/demo.test.tsx.snap | 42 - .../test/src/renderer/demo.test.tsx | 31 - .../test/utils/components.tsx | 7 - .../test/utils/host.ts | 79 - .../react-simulator-renderer/tsconfig.json | 9 - packages/renderer-core/babel.config.js | 1 - packages/renderer-core/build.json | 10 - packages/renderer-core/build.test.json | 6 - packages/renderer-core/jest.config.js | 33 - packages/renderer-core/package.json | 61 - packages/renderer-core/src/adapter/index.ts | 104 - packages/renderer-core/src/components/Div.tsx | 15 - .../src/components/VisualDom/index.css | 19 - .../src/components/VisualDom/index.tsx | 33 - packages/renderer-core/src/context/index.ts | 13 - packages/renderer-core/src/hoc/index.tsx | 88 - packages/renderer-core/src/hoc/leaf.tsx | 629 -- packages/renderer-core/src/index.ts | 9 - packages/renderer-core/src/renderer/addon.tsx | 82 - packages/renderer-core/src/renderer/base.tsx | 1164 ---- packages/renderer-core/src/renderer/block.tsx | 38 - .../renderer-core/src/renderer/component.tsx | 50 - packages/renderer-core/src/renderer/index.ts | 17 - packages/renderer-core/src/renderer/page.tsx | 63 - .../renderer-core/src/renderer/renderer.tsx | 208 - packages/renderer-core/src/renderer/temp.tsx | 60 - packages/renderer-core/src/types/index.ts | 359 - packages/renderer-core/src/utils/common.ts | 400 -- .../renderer-core/src/utils/data-helper.ts | 314 - packages/renderer-core/src/utils/index.ts | 3 - .../renderer-core/src/utils/is-use-loop.ts | 23 - packages/renderer-core/src/utils/logger.ts | 3 - packages/renderer-core/src/utils/request.ts | 198 - .../tests/adapter/adapter.test.ts | 101 - .../tests/fixtures/schema/basic.ts | 567 -- .../tests/fixtures/unhandled-rejection.ts | 7 - .../hoc/__snapshots__/leaf.test.tsx.snap | 148 - .../renderer-core/tests/hoc/leaf.test.tsx | 604 -- packages/renderer-core/tests/mock/loop.ts | 221 - packages/renderer-core/tests/mock/sample.ts | 184 - .../renderer-core/tests/mock/styleMock.js | 5 - .../__snapshots__/renderer.test.tsx.snap | 1395 ---- .../tests/renderer/base.test.tsx | 222 - .../tests/renderer/renderer.test.tsx | 447 -- packages/renderer-core/tests/setup.ts | 14 - .../renderer-core/tests/utils/common.test.ts | 463 -- .../renderer-core/tests/utils/components.tsx | 38 - .../tests/utils/data-helper.test.ts | 559 -- .../tests/utils/is-use-loop.test.ts | 31 - packages/renderer-core/tests/utils/node.ts | 97 - .../tests/utils/react-env-init.ts | 66 - .../renderer-core/tests/utils/request.test.ts | 159 - packages/renderer-core/tsconfig.json | 8 - packages/vue-renderer/CHANGELOG.md | 135 - packages/vue-renderer/README.md | 1 - packages/vue-renderer/build.json | 3 - packages/vue-renderer/build.plugin.cjs | 10 - packages/vue-renderer/build.umd.json | 24 - packages/vue-renderer/package.json | 40 - packages/vue-renderer/src/config.ts | 27 - packages/vue-renderer/src/core/base.ts | 89 - packages/vue-renderer/src/core/hoc.ts | 168 - packages/vue-renderer/src/core/index.ts | 2 - packages/vue-renderer/src/core/live.ts | 54 - packages/vue-renderer/src/core/use.ts | 807 --- .../vue-renderer/src/data-source/index.ts | 163 - .../vue-renderer/src/data-source/interface.ts | 26 - .../vue-renderer/src/data-source/request.ts | 140 - .../vue-renderer/src/hooks/current-node.ts | 48 - packages/vue-renderer/src/hooks/index.ts | 2 - .../src/hooks/renderer-context.ts | 42 - packages/vue-renderer/src/index.ts | 4 - packages/vue-renderer/src/renderer.ts | 113 - packages/vue-renderer/src/renderers/index.ts | 6 - packages/vue-renderer/src/renderers/page.ts | 19 - packages/vue-renderer/src/utils/array.ts | 5 - packages/vue-renderer/src/utils/i18n.ts | 25 - packages/vue-renderer/src/utils/index.ts | 4 - packages/vue-renderer/src/utils/parse.ts | 101 - packages/vue-renderer/src/utils/scope.ts | 67 - packages/vue-renderer/tsconfig.json | 4 - packages/vue-simulator-renderer/CHANGELOG.md | 132 - packages/vue-simulator-renderer/README.md | 1 - packages/vue-simulator-renderer/build.json | 3 - .../vue-simulator-renderer/build.plugin.cjs | 10 - .../vue-simulator-renderer/build.umd.json | 29 - packages/vue-simulator-renderer/package.json | 40 - .../vue-simulator-renderer/public/index.html | 10 - .../src/buildin-components/index.ts | 3 - .../src/buildin-components/leaf.ts | 26 - .../src/buildin-components/page.ts | 24 - .../src/buildin-components/slot.ts | 46 - packages/vue-simulator-renderer/src/host.ts | 3 - .../vue-simulator-renderer/src/index.less | 122 - packages/vue-simulator-renderer/src/index.ts | 19 - .../vue-simulator-renderer/src/interface.ts | 52 - .../src/simulator-view.ts | 72 - .../vue-simulator-renderer/src/simulator.ts | 349 - .../src/utils/build-components.ts | 94 - .../src/utils/check-node.ts | 11 - .../src/utils/closest-node.ts | 71 - .../src/utils/comp-node.ts | 65 - .../src/utils/cursor.ts | 61 - .../src/utils/find-dom-nodes.ts | 57 - .../src/utils/get-client-rects.ts | 15 - .../vue-simulator-renderer/src/utils/index.ts | 8 - .../src/utils/logger.ts | 3 - .../src/utils/navtive-selection.ts | 15 - packages/vue-simulator-renderer/tsconfig.json | 4 - scripts/build.sh | 16 +- scripts/sync-oss.js | 47 - scripts/sync.sh | 19 - 1614 files changed, 41 insertions(+), 109544 deletions(-) delete mode 100644 modules/code-generator/.gitignore delete mode 100644 modules/code-generator/.prettierrc.js delete mode 100644 modules/code-generator/.versionrc delete mode 100644 modules/code-generator/CHANGELOG.md delete mode 100644 modules/code-generator/CONTRIBUTING.md delete mode 100644 modules/code-generator/README.md delete mode 100644 modules/code-generator/babel.config.js delete mode 100755 modules/code-generator/bin/lowcode-code-generator.js delete mode 100644 modules/code-generator/example-schema.json delete mode 100644 modules/code-generator/example-schema.json5 delete mode 100644 modules/code-generator/jest.config.js delete mode 100644 modules/code-generator/jest.setup.js delete mode 100644 modules/code-generator/package.json delete mode 100644 modules/code-generator/scripts/build-cli.js delete mode 100644 modules/code-generator/scripts/build-standalone-loader.js delete mode 100644 modules/code-generator/scripts/build-standalone-worker.js delete mode 100644 modules/code-generator/scripts/build-standalone.js delete mode 100644 modules/code-generator/scripts/build-template-static-files.js delete mode 100755 modules/code-generator/scripts/build-types delete mode 100644 modules/code-generator/scripts/build.js delete mode 100644 modules/code-generator/scripts/move-files-to-build-dest.js delete mode 100755 modules/code-generator/scripts/run-demo-project delete mode 100644 modules/code-generator/scripts/test-standalone.js delete mode 100644 modules/code-generator/src/analyzer/componentAnalyzer.ts delete mode 100644 modules/code-generator/src/cli/index.ts delete mode 100644 modules/code-generator/src/cli/init-solution.ts delete mode 100644 modules/code-generator/src/cli/run.ts delete mode 100644 modules/code-generator/src/cli/solutions/example-solution.ts delete mode 100644 modules/code-generator/src/config/env.ts delete mode 100644 modules/code-generator/src/const/file.ts delete mode 100644 modules/code-generator/src/const/generator.ts delete mode 100644 modules/code-generator/src/const/index.ts delete mode 100644 modules/code-generator/src/core/jsx/handlers/transformJsExpression.ts delete mode 100644 modules/code-generator/src/core/jsx/handlers/transformThis2Context.ts delete mode 100644 modules/code-generator/src/core/jsx/util/isLiteralAtomicExpr.ts delete mode 100644 modules/code-generator/src/core/jsx/util/isSimpleStraightLiteral.ts delete mode 100644 modules/code-generator/src/generator/ChunkBuilder.ts delete mode 100644 modules/code-generator/src/generator/CodeBuilder.ts delete mode 100644 modules/code-generator/src/generator/ModuleBuilder.ts delete mode 100644 modules/code-generator/src/generator/ProjectBuilder.ts delete mode 100644 modules/code-generator/src/index.ts delete mode 100644 modules/code-generator/src/parser/SchemaParser.ts delete mode 100644 modules/code-generator/src/plugins/common/esmodule.ts delete mode 100644 modules/code-generator/src/plugins/common/requireUtils.ts delete mode 100644 modules/code-generator/src/plugins/common/styleImport.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/commonDeps.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/const.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/containerClass.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/containerInitState.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/containerInjectContext.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/containerInjectDataSourceEngine.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/containerInjectUtils.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/containerLifeCycle.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/containerMethods.ts delete mode 100644 modules/code-generator/src/plugins/component/rax/jsx.ts delete mode 100644 modules/code-generator/src/plugins/component/react/const.ts delete mode 100644 modules/code-generator/src/plugins/component/react/containerClass.ts delete mode 100644 modules/code-generator/src/plugins/component/react/containerInitState.ts delete mode 100644 modules/code-generator/src/plugins/component/react/containerInjectConstants.ts delete mode 100644 modules/code-generator/src/plugins/component/react/containerInjectContext.ts delete mode 100644 modules/code-generator/src/plugins/component/react/containerInjectDataSourceEngine.ts delete mode 100644 modules/code-generator/src/plugins/component/react/containerInjectI18n.ts delete mode 100644 modules/code-generator/src/plugins/component/react/containerInjectUtils.ts delete mode 100644 modules/code-generator/src/plugins/component/react/containerLifeCycle.ts delete mode 100644 modules/code-generator/src/plugins/component/react/containerMethod.ts delete mode 100644 modules/code-generator/src/plugins/component/react/jsx.ts delete mode 100644 modules/code-generator/src/plugins/component/react/reactCommonDeps.ts delete mode 100644 modules/code-generator/src/plugins/component/style/css.ts delete mode 100644 modules/code-generator/src/plugins/project/constants.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/index.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/plugins/entry.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/plugins/entryHtml.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/plugins/globalStyle.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/plugins/packageJSON.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/plugins/router.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/README.md.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/abc.json.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/build.json.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/editorconfig.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/eslintignore.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/eslintrc.js.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/gitignore.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/jsconfig.json.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/prettierignore.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/prettierrc.js.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.jsx.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.style.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.jsx.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.style.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/PageNav/index.jsx.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/index.jsx.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/menuConfig.js.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/stylelintignore.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/stylelintrc.js.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/files/tsconfig.json.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/index.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs/template/static-files.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/index.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/plugins/appConfig.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/plugins/buildConfig.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/plugins/globalStyle.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/plugins/layout.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/plugins/packageJSON.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/README.md.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/browserslistrc.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/document.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/gitignore.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/Footer/index.jsx.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/Footer/index.style.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/Logo/index.jsx.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/Logo/index.style.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/PageNav/index.jsx.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/index.jsx.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/menuConfig.js.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/tsconfig.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/files/typings.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/index.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/icejs3/template/static-files.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/index.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/plugins/appConfig.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/plugins/buildConfig.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/plugins/entry.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/plugins/entryDocument.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/plugins/globalStyle.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/plugins/packageJSON.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/.eslintignore.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/.eslintrc.js.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/.gitignore.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/.prettierignore.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/.prettierrc.js.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/.stylelintignore.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/.stylelintrc.js.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/README.md.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/jsconfig.json.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/files/tsconfig.json.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/index.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/template/static-files.ts delete mode 100644 modules/code-generator/src/plugins/project/framework/rax/types/RaxFrameworkOptions.ts delete mode 100644 modules/code-generator/src/plugins/project/i18n.ts delete mode 100644 modules/code-generator/src/plugins/project/utils.ts delete mode 100644 modules/code-generator/src/polyfills/buffer.ts delete mode 100644 modules/code-generator/src/postprocessor/index.ts delete mode 100644 modules/code-generator/src/postprocessor/prettier/index.ts delete mode 100644 modules/code-generator/src/publisher/disk/index.ts delete mode 100644 modules/code-generator/src/publisher/disk/utils.ts delete mode 100644 modules/code-generator/src/publisher/zip/index.ts delete mode 100644 modules/code-generator/src/publisher/zip/utils.ts delete mode 100644 modules/code-generator/src/solutions/icejs.ts delete mode 100644 modules/code-generator/src/solutions/icejs3.ts delete mode 100644 modules/code-generator/src/solutions/rax-app.ts delete mode 100644 modules/code-generator/src/standalone-loader.ts delete mode 100644 modules/code-generator/src/standalone-worker.ts delete mode 100644 modules/code-generator/src/standalone.ts delete mode 100644 modules/code-generator/src/types/analyze.ts delete mode 100644 modules/code-generator/src/types/core.ts delete mode 100644 modules/code-generator/src/types/deps.ts delete mode 100644 modules/code-generator/src/types/error.ts delete mode 100644 modules/code-generator/src/types/file.ts delete mode 100644 modules/code-generator/src/types/index.ts delete mode 100644 modules/code-generator/src/types/intermediate.ts delete mode 100644 modules/code-generator/src/types/jsx.ts delete mode 100644 modules/code-generator/src/types/publisher.ts delete mode 100644 modules/code-generator/src/typings.d.ts delete mode 100644 modules/code-generator/src/utils/OrderedSet.ts delete mode 100644 modules/code-generator/src/utils/Scope.ts delete mode 100644 modules/code-generator/src/utils/ScopeBindings.ts delete mode 100644 modules/code-generator/src/utils/aopHelper.ts delete mode 100644 modules/code-generator/src/utils/common.ts delete mode 100644 modules/code-generator/src/utils/compositeType.ts delete mode 100644 modules/code-generator/src/utils/dataSource.ts delete mode 100644 modules/code-generator/src/utils/debug.ts delete mode 100644 modules/code-generator/src/utils/encodeJsxAttrString.ts delete mode 100644 modules/code-generator/src/utils/errors.ts delete mode 100644 modules/code-generator/src/utils/expressionParser.ts delete mode 100644 modules/code-generator/src/utils/format.ts delete mode 100644 modules/code-generator/src/utils/index.ts delete mode 100644 modules/code-generator/src/utils/jsExpression.ts delete mode 100644 modules/code-generator/src/utils/jsSlot.ts delete mode 100644 modules/code-generator/src/utils/jsxHelpers.ts delete mode 100644 modules/code-generator/src/utils/nodeToJSX.ts delete mode 100644 modules/code-generator/src/utils/pathHelper.ts delete mode 100644 modules/code-generator/src/utils/resultHelper.ts delete mode 100644 modules/code-generator/src/utils/schema.ts delete mode 100644 modules/code-generator/src/utils/templateHelper.ts delete mode 100644 modules/code-generator/src/utils/theme.ts delete mode 100644 modules/code-generator/src/utils/validate.ts delete mode 100644 modules/code-generator/src/utils/version.ts delete mode 100644 modules/code-generator/standalone-loader/index.js delete mode 100644 modules/code-generator/standalone-loader/package.json delete mode 100644 modules/code-generator/standalone-worker/index.js delete mode 100644 modules/code-generator/standalone-worker/package.json delete mode 100644 modules/code-generator/standalone/index.js delete mode 100644 modules/code-generator/standalone/package.json delete mode 100644 modules/code-generator/static-files/rax/.eslintignore.template delete mode 100644 modules/code-generator/static-files/rax/.eslintrc.js.template delete mode 100644 modules/code-generator/static-files/rax/.gitignore.template delete mode 100644 modules/code-generator/static-files/rax/.prettierignore.template delete mode 100644 modules/code-generator/static-files/rax/.prettierrc.js.template delete mode 100644 modules/code-generator/static-files/rax/.stylelintignore.template delete mode 100644 modules/code-generator/static-files/rax/.stylelintrc.js.template delete mode 100644 modules/code-generator/static-files/rax/README.md.template delete mode 100644 modules/code-generator/static-files/rax/jsconfig.json.template delete mode 100644 modules/code-generator/static-files/rax/tsconfig.json.template delete mode 100644 modules/code-generator/tests/bugfix/.gitignore delete mode 100644 modules/code-generator/tests/bugfix/i18n-with-params.schema.json delete mode 100644 modules/code-generator/tests/bugfix/i18n-with-params.test.ts delete mode 100644 modules/code-generator/tests/bugfix/icejs-import-wrong-naming.schema.json delete mode 100644 modules/code-generator/tests/bugfix/icejs-import-wrong-naming.test.ts delete mode 100644 modules/code-generator/tests/bugfix/icejs-js-function1.schema.json delete mode 100644 modules/code-generator/tests/bugfix/icejs-js-function1.test.ts delete mode 100644 modules/code-generator/tests/bugfix/icejs-missing-imports-1.schema.json delete mode 100644 modules/code-generator/tests/bugfix/icejs-missing-imports-1.test.ts delete mode 100644 modules/code-generator/tests/bugfix/icejs-package-json-dependencies.schema.json delete mode 100644 modules/code-generator/tests/bugfix/icejs-package-json-dependencies.test.ts delete mode 100644 modules/code-generator/tests/bugfix/icejs-page-map1.schema.json delete mode 100644 modules/code-generator/tests/bugfix/icejs-page-map1.test.ts delete mode 100644 modules/code-generator/tests/bugfix/page-element1.schema.json delete mode 100644 modules/code-generator/tests/bugfix/page-element1.test.ts delete mode 100644 modules/code-generator/tests/bugfix/page-element2.schema.json delete mode 100644 modules/code-generator/tests/bugfix/page-element2.test.ts delete mode 100644 modules/code-generator/tests/bugfix/strict-mode-context-1.schema.json delete mode 100644 modules/code-generator/tests/bugfix/strict-mode-context-1.test.ts delete mode 100644 modules/code-generator/tests/bugfix/tolerate-eval-errors-1-loop.schema.json delete mode 100644 modules/code-generator/tests/bugfix/tolerate-eval-errors-1-loop.test.ts delete mode 100644 modules/code-generator/tests/bugfix/tolerate-eval-errors-2-nested-loop.schema.json delete mode 100644 modules/code-generator/tests/bugfix/tolerate-eval-errors-2-nested-loop.test.ts delete mode 100644 modules/code-generator/tests/cli.test.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo1/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/pages/Aaaa/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/pages/Aaaa/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2-utils-name-alias/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo2/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo3/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo4/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo5/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo6-literal-condition/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo7-literal-condition2/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/pages/Example/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/pages/Example/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo8-datasource-prop/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/pages/$/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/pages/$/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo9-datasource-engine/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_10-jsslot/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/.browserslistrc delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/ice.config.mts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/app.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/document.tsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/pages/layout.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/typings.d.ts delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/icejs3-app/demo_11-jsslot-2/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo01/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo02/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/pages/Detail/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/pages/Detail/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/pages/List/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/pages/List/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo03/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo04/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo05/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo06-jsslot/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo07-newline-in-props/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo08-jsslot-with-multiple-children/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo09-jsslot-with-conditional-children/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo10-jsslot-with-loop-children/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/src/pages/Aaaa/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/src/pages/Aaaa/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo11-utils-name-alias/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/src/pages/Home/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/src/pages/Home/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo12-refs/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/src/app.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/src/document/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/src/global.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/src/pages/Example/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/src/pages/Example/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/rax-app/demo13-datasource-prop/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo1/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/pages/Aaaa/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/pages/Aaaa/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2-utils-name-alias/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo2/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo3/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo4/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo5/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo6-literal-condition/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo7-literal-condition2/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/pages/Example/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/pages/Example/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo8-datasource-prop/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/pages/$/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/pages/$/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo9-datasource-engine/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_10-jsslot/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-app/demo_11-jsslot-2/schema.json5 delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/.editorconfig delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/.eslintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/.eslintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/.gitignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/.prettierignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/.prettierrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/.stylelintignore delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/.stylelintrc.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/README.md delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/abc.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/build.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/jsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/package.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/public/index.html delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/app.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/constants.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/global.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/i18n.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/layouts/BasicLayout/components/Footer/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/layouts/BasicLayout/components/Logo/index.module.scss delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/layouts/BasicLayout/components/PageNav/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/layouts/BasicLayout/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/layouts/BasicLayout/menuConfig.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/pages/Test/index.css delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/pages/Test/index.jsx delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/routes.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/src/utils.js delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/expected/demo-project/tsconfig.json delete mode 100644 modules/code-generator/tests/fixtures/test-cases/react-module/demo1/schema.json5 delete mode 100644 modules/code-generator/tests/helpers/solutionHelper.ts delete mode 100644 modules/code-generator/tests/plugins/common/__snapshots__/requireUtils.test.ts.snap delete mode 100644 modules/code-generator/tests/plugins/common/requireUtils.test.ts delete mode 100644 modules/code-generator/tests/plugins/jsx/__snapshots__/p0-condition-at-root.test.ts.snap delete mode 100644 modules/code-generator/tests/plugins/jsx/p0-condition-at-root.test.ts delete mode 100644 modules/code-generator/tests/postprocessor/__snapshots__/prettier.test.ts.snap delete mode 100644 modules/code-generator/tests/postprocessor/prettier.test.ts delete mode 100644 modules/code-generator/tests/public/README.md delete mode 100644 modules/code-generator/tests/public/SchemaParser/__snapshots__/p0-basic.test.ts.snap delete mode 100644 modules/code-generator/tests/public/SchemaParser/data/schema-with-slot.json delete mode 100644 modules/code-generator/tests/public/SchemaParser/p0-basic.test.ts delete mode 100644 modules/code-generator/tests/public/cli.test.ts delete mode 100644 modules/code-generator/tests/public/publisher/disk/disk.test.ts delete mode 100644 modules/code-generator/tests/public/publisher/zip/zip.test.ts delete mode 100644 modules/code-generator/tests/public/solutions/icejs3-app.test.ts delete mode 100644 modules/code-generator/tests/public/solutions/rax-app.test.ts delete mode 100644 modules/code-generator/tests/public/solutions/react-app.test.ts delete mode 100644 modules/code-generator/tests/utils/compositeType.test.ts delete mode 100644 modules/code-generator/tests/utils/errors.test.ts delete mode 100644 modules/code-generator/tests/utils/expressionParser/jsExpression.test.ts delete mode 100644 modules/code-generator/tests/utils/expressionParser/parseExpressionConvertThis2Context.test.ts delete mode 100644 modules/code-generator/tests/utils/expressionParser/parseExpressionGetGlobalVariables.test.ts delete mode 100644 modules/code-generator/tests/utils/expressionParser/parseExpressionGetKeywords.test.ts delete mode 100644 modules/code-generator/tests/utils/flattenResult.test.ts delete mode 100644 modules/code-generator/tests/utils/resultHelper/example-result.json delete mode 100644 modules/code-generator/tests/utils/resultHelper/findFile.test.ts delete mode 100644 modules/code-generator/tests/utils/resultHelper/globFiles.test.ts delete mode 100644 modules/code-generator/tests/utils/resultHelper/removeDirsFromResult.test.ts delete mode 100644 modules/code-generator/tests/utils/resultHelper/removeFilesFromResult.test.ts delete mode 100644 modules/code-generator/tests/utils/resultHelper/scanFiles.test.ts delete mode 100644 modules/code-generator/tests/utils/schema/data/schema-with-slot.json delete mode 100644 modules/code-generator/tests/utils/schema/handleSubNodes.test.ts delete mode 100644 modules/code-generator/tests/utils/validate.test.ts delete mode 100644 modules/code-generator/tests/utils/version.test.ts delete mode 100644 modules/code-generator/tsconfig.json delete mode 100644 modules/material-parser/README.md delete mode 100644 modules/material-parser/build.test.json delete mode 100644 modules/material-parser/demo/component.jsx delete mode 100644 modules/material-parser/demo/component.tsx delete mode 100644 modules/material-parser/demo/parse-jsx.js delete mode 100644 modules/material-parser/demo/parse-tsx.js delete mode 100644 modules/material-parser/jest.config.js delete mode 100644 modules/material-parser/package.json delete mode 100644 modules/material-parser/schemas/schema.json delete mode 100644 modules/material-parser/schemas/schema.yml delete mode 100644 modules/material-parser/scripts/transform.js delete mode 100644 modules/material-parser/src/core/index.ts delete mode 100644 modules/material-parser/src/core/schema/types.ts delete mode 100644 modules/material-parser/src/generate.ts delete mode 100644 modules/material-parser/src/index.ts delete mode 100644 modules/material-parser/src/localize.ts delete mode 100644 modules/material-parser/src/parse/dynamic/index.ts delete mode 100644 modules/material-parser/src/parse/dynamic/requireInSandbox.ts delete mode 100644 modules/material-parser/src/parse/index.ts delete mode 100644 modules/material-parser/src/parse/js/handlers/defaultPropsHandler.ts delete mode 100644 modules/material-parser/src/parse/js/handlers/index.ts delete mode 100644 modules/material-parser/src/parse/js/handlers/preProcessHandler.ts delete mode 100644 modules/material-parser/src/parse/js/handlers/propTypeHandler.ts delete mode 100644 modules/material-parser/src/parse/js/handlers/propTypeJsDocHandler.ts delete mode 100644 modules/material-parser/src/parse/js/index.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/checkIsIIFE.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/findAssignedMethods.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/index.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/isReactComponentStaticMember.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/isStaticMethod.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/resolveExportDeclaration.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/resolveHOC.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/resolveIIFE.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/resolveImport.ts delete mode 100644 modules/material-parser/src/parse/js/resolver/resolveTranspiledClass.ts delete mode 100644 modules/material-parser/src/parse/js/utils/cache.ts delete mode 100644 modules/material-parser/src/parse/js/utils/evaluate.ts delete mode 100644 modules/material-parser/src/parse/js/utils/findJSFilePath.ts delete mode 100644 modules/material-parser/src/parse/js/utils/getComposedPath.ts delete mode 100644 modules/material-parser/src/parse/js/utils/getName.ts delete mode 100644 modules/material-parser/src/parse/js/utils/getRoot.ts delete mode 100644 modules/material-parser/src/parse/js/utils/makeProxy.ts delete mode 100644 modules/material-parser/src/parse/transform.ts delete mode 100644 modules/material-parser/src/parse/ts/generateDTS.ts delete mode 100644 modules/material-parser/src/parse/ts/index.ts delete mode 100644 modules/material-parser/src/parse/ts/tsconfig.json delete mode 100644 modules/material-parser/src/scan.ts delete mode 100644 modules/material-parser/src/types/Basic.ts delete mode 100644 modules/material-parser/src/types/ChannelType.ts delete mode 100644 modules/material-parser/src/types/DSLType.ts delete mode 100644 modules/material-parser/src/types/IAccesser.ts delete mode 100644 modules/material-parser/src/types/IExtensionConfigManifest.ts delete mode 100644 modules/material-parser/src/types/IMaterialParsedModel.ts delete mode 100644 modules/material-parser/src/types/IMaterialScanModel.ts delete mode 100644 modules/material-parser/src/types/IMaterializeOptions.ts delete mode 100644 modules/material-parser/src/types/Meta.ts delete mode 100644 modules/material-parser/src/types/index.ts delete mode 100644 modules/material-parser/src/utils.ts delete mode 100644 modules/material-parser/src/validate/index.ts delete mode 100644 modules/material-parser/src/validate/schema.json delete mode 100644 modules/material-parser/test/__snapshots__/dynamic.test.ts.snap delete mode 100644 modules/material-parser/test/__snapshots__/index.test.ts.snap delete mode 100644 modules/material-parser/test/__snapshots__/online.test.ts.snap delete mode 100644 modules/material-parser/test/dynamic.test.ts delete mode 100644 modules/material-parser/test/fixtures/dts-component/index.d.ts delete mode 100644 modules/material-parser/test/fixtures/dts-component/package.json delete mode 100644 modules/material-parser/test/fixtures/dts-component/src/data.js delete mode 100644 modules/material-parser/test/fixtures/dts-component/src/i18n.js delete mode 100644 modules/material-parser/test/fixtures/dts-component/src/index.jsx delete mode 100644 modules/material-parser/test/fixtures/dts-component/src/main.scss delete mode 100644 modules/material-parser/test/fixtures/dts-component/src/scss/variable.scss delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeBlank/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeBlank/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeBlank/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeBlank/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeBlank/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeBlank/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeIcon/IconFont.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeIcon/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeIcon/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeIcon/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeIcon/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeIcon/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeIcon/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeImage/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeImage/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeImage/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeImage/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeImage/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeImage/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeLink/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeLink/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeLink/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeLink/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeLink/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeLink/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakePlaceholder/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakePlaceholder/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakePlaceholder/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakePlaceholder/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakePlaceholder/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakePlaceholder/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeText/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeText/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeText/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeText/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeText/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/AIMakeText/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/Root/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/Root/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/Root/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/Root/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/Root/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/Root/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/style/index.css delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/style/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/style/index.less delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/utils/HOCBackgroundProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/utils/HOCBoxModelProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/utils/HOCFlexLayoutProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/utils/HOCLayoutProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/basic/utils/HOCTextProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/es/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/package.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeBlank/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeBlank/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeBlank/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeBlank/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeBlank/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeBlank/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeIcon/IconFont.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeIcon/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeIcon/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeIcon/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeIcon/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeIcon/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeIcon/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeImage/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeImage/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeImage/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeImage/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeImage/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeImage/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeLink/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeLink/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeLink/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeLink/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeLink/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeLink/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakePlaceholder/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakePlaceholder/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakePlaceholder/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakePlaceholder/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakePlaceholder/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakePlaceholder/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeText/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeText/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeText/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeText/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeText/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/AIMakeText/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/Root/amContainer.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/Root/amManifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/Root/container.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/Root/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/Root/manifest.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/Root/manifest.json delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/style/index.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/style/index.less delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/utils/HOCBackgroundProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/utils/HOCBoxModelProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/utils/HOCFlexLayoutProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/utils/HOCLayoutProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/basic/utils/HOCTextProps.js delete mode 100644 modules/material-parser/test/fixtures/multiple-exported-component/src/index.js delete mode 100644 modules/material-parser/test/fixtures/rax-component/package.json delete mode 100644 modules/material-parser/test/fixtures/rax-component/src/index.css delete mode 100644 modules/material-parser/test/fixtures/rax-component/src/index.tsx delete mode 100644 modules/material-parser/test/fixtures/single-exported-component/es/container.js delete mode 100644 modules/material-parser/test/fixtures/single-exported-component/es/index.js delete mode 100644 modules/material-parser/test/fixtures/single-exported-component/es/main.css delete mode 100644 modules/material-parser/test/fixtures/single-exported-component/es/main.scss delete mode 100644 modules/material-parser/test/fixtures/single-exported-component/es/manifest.js delete mode 100644 modules/material-parser/test/fixtures/single-exported-component/es/manifest.json delete mode 100644 modules/material-parser/test/fixtures/single-exported-component/package.json delete mode 100644 modules/material-parser/test/fixtures/single-exported-component/src/index.js delete mode 100644 modules/material-parser/test/fixtures/single-exported-component/src/main.scss delete mode 100644 modules/material-parser/test/fixtures/transpiled-component/package.json delete mode 100644 modules/material-parser/test/fixtures/ts-component/package.json delete mode 100644 modules/material-parser/test/fixtures/ts-component/src/index.tsx delete mode 100644 modules/material-parser/test/fixtures/ts-component/src/main-module.tsx delete mode 100644 modules/material-parser/test/fixtures/ts-component/src/sub-module.tsx delete mode 100644 modules/material-parser/test/fixtures/ts-component2/package.json delete mode 100644 modules/material-parser/test/fixtures/ts-component2/src/empty.tsx delete mode 100644 modules/material-parser/test/fixtures/ts-component2/src/index.scss delete mode 100644 modules/material-parser/test/fixtures/ts-component2/src/index.tsx delete mode 100644 modules/material-parser/test/fixtures/without-display-name/index.js delete mode 100644 modules/material-parser/test/fixtures/without-display-name/package.json delete mode 100644 modules/material-parser/test/helpers/index.ts delete mode 100644 modules/material-parser/test/index.test.ts delete mode 100644 modules/material-parser/test/localize.test.ts delete mode 100644 modules/material-parser/test/online.test.ts delete mode 100644 modules/material-parser/test/validate/__snapshots__/index.test.ts.snap delete mode 100644 modules/material-parser/test/validate/fixtures/basic-error/schema.json delete mode 100644 modules/material-parser/test/validate/fixtures/basic-success/schema.json delete mode 100644 modules/material-parser/test/validate/fixtures/configure/schema.json delete mode 100644 modules/material-parser/test/validate/fixtures/props-basic-type/schema.json delete mode 100644 modules/material-parser/test/validate/fixtures/props-complex-type/schema.json delete mode 100644 modules/material-parser/test/validate/index.test.ts delete mode 100644 modules/material-parser/tsconfig.json delete mode 100644 modules/material-parser/webpack.config.js delete mode 100644 packages/react-renderer/README.md delete mode 100644 packages/react-renderer/build.json delete mode 100644 packages/react-renderer/build.test.json delete mode 100644 packages/react-renderer/build.umd.json delete mode 100644 packages/react-renderer/demo/compose.md delete mode 100644 packages/react-renderer/demo/config/components/A.jsx delete mode 100644 packages/react-renderer/demo/config/components/Div.jsx delete mode 100644 packages/react-renderer/demo/config/components/Image.jsx delete mode 100644 packages/react-renderer/demo/config/components/Text.jsx delete mode 100644 packages/react-renderer/demo/config/components/index.js delete mode 100644 packages/react-renderer/demo/config/constants.js delete mode 100644 packages/react-renderer/demo/config/utils.js delete mode 100644 packages/react-renderer/demo/dataSource.md delete mode 100644 packages/react-renderer/demo/i18n.md delete mode 100644 packages/react-renderer/demo/list.md delete mode 100644 packages/react-renderer/demo/schemas/compose.js delete mode 100644 packages/react-renderer/demo/schemas/dataSource.js delete mode 100644 packages/react-renderer/demo/schemas/i18n.js delete mode 100644 packages/react-renderer/demo/schemas/list.js delete mode 100644 packages/react-renderer/demo/schemas/table.js delete mode 100644 packages/react-renderer/demo/table.md delete mode 100644 packages/react-renderer/jest.config.js delete mode 100644 packages/react-renderer/package.json delete mode 100644 packages/react-renderer/src/index.ts delete mode 100644 packages/react-renderer/tests/__snapshots__/index.test.tsx.snap delete mode 100644 packages/react-renderer/tests/fixtures/schema/basic.ts delete mode 100644 packages/react-renderer/tests/index.test.tsx delete mode 100644 packages/react-renderer/tsconfig.json delete mode 100644 packages/react-simulator-renderer/.babelrc delete mode 100644 packages/react-simulator-renderer/babel.config.js delete mode 100644 packages/react-simulator-renderer/build.json delete mode 100644 packages/react-simulator-renderer/build.plugin.js delete mode 100644 packages/react-simulator-renderer/build.test.json delete mode 100644 packages/react-simulator-renderer/build.umd.json delete mode 100644 packages/react-simulator-renderer/jest.config.js delete mode 100644 packages/react-simulator-renderer/package.json delete mode 100644 packages/react-simulator-renderer/src/README.md delete mode 100644 packages/react-simulator-renderer/src/builtin-components/builtin-components.ts delete mode 100644 packages/react-simulator-renderer/src/builtin-components/leaf.tsx delete mode 100644 packages/react-simulator-renderer/src/builtin-components/slot.tsx delete mode 100644 packages/react-simulator-renderer/src/host.ts delete mode 100644 packages/react-simulator-renderer/src/index.ts delete mode 100644 packages/react-simulator-renderer/src/locale/en-US.json delete mode 100644 packages/react-simulator-renderer/src/locale/index.ts delete mode 100644 packages/react-simulator-renderer/src/locale/zh-CN.json delete mode 100644 packages/react-simulator-renderer/src/renderer-view.tsx delete mode 100644 packages/react-simulator-renderer/src/renderer.less delete mode 100644 packages/react-simulator-renderer/src/renderer.ts delete mode 100644 packages/react-simulator-renderer/src/utils/get-client-rects.ts delete mode 100644 packages/react-simulator-renderer/src/utils/is-dom-node.ts delete mode 100644 packages/react-simulator-renderer/src/utils/misc.ts delete mode 100644 packages/react-simulator-renderer/src/utils/react-find-dom-nodes.ts delete mode 100644 packages/react-simulator-renderer/src/utils/url.ts delete mode 100644 packages/react-simulator-renderer/test/schema/basic.ts delete mode 100644 packages/react-simulator-renderer/test/src/renderer/__snapshots__/demo.test.tsx.snap delete mode 100644 packages/react-simulator-renderer/test/src/renderer/demo.test.tsx delete mode 100644 packages/react-simulator-renderer/test/utils/components.tsx delete mode 100644 packages/react-simulator-renderer/test/utils/host.ts delete mode 100644 packages/react-simulator-renderer/tsconfig.json delete mode 100644 packages/renderer-core/babel.config.js delete mode 100644 packages/renderer-core/build.json delete mode 100644 packages/renderer-core/build.test.json delete mode 100644 packages/renderer-core/jest.config.js delete mode 100644 packages/renderer-core/package.json delete mode 100644 packages/renderer-core/src/adapter/index.ts delete mode 100644 packages/renderer-core/src/components/Div.tsx delete mode 100644 packages/renderer-core/src/components/VisualDom/index.css delete mode 100644 packages/renderer-core/src/components/VisualDom/index.tsx delete mode 100644 packages/renderer-core/src/context/index.ts delete mode 100644 packages/renderer-core/src/hoc/index.tsx delete mode 100644 packages/renderer-core/src/hoc/leaf.tsx delete mode 100644 packages/renderer-core/src/index.ts delete mode 100644 packages/renderer-core/src/renderer/addon.tsx delete mode 100644 packages/renderer-core/src/renderer/base.tsx delete mode 100644 packages/renderer-core/src/renderer/block.tsx delete mode 100644 packages/renderer-core/src/renderer/component.tsx delete mode 100644 packages/renderer-core/src/renderer/index.ts delete mode 100644 packages/renderer-core/src/renderer/page.tsx delete mode 100644 packages/renderer-core/src/renderer/renderer.tsx delete mode 100644 packages/renderer-core/src/renderer/temp.tsx delete mode 100644 packages/renderer-core/src/types/index.ts delete mode 100644 packages/renderer-core/src/utils/common.ts delete mode 100644 packages/renderer-core/src/utils/data-helper.ts delete mode 100644 packages/renderer-core/src/utils/index.ts delete mode 100644 packages/renderer-core/src/utils/is-use-loop.ts delete mode 100644 packages/renderer-core/src/utils/logger.ts delete mode 100644 packages/renderer-core/src/utils/request.ts delete mode 100644 packages/renderer-core/tests/adapter/adapter.test.ts delete mode 100644 packages/renderer-core/tests/fixtures/schema/basic.ts delete mode 100644 packages/renderer-core/tests/fixtures/unhandled-rejection.ts delete mode 100644 packages/renderer-core/tests/hoc/__snapshots__/leaf.test.tsx.snap delete mode 100644 packages/renderer-core/tests/hoc/leaf.test.tsx delete mode 100644 packages/renderer-core/tests/mock/loop.ts delete mode 100644 packages/renderer-core/tests/mock/sample.ts delete mode 100644 packages/renderer-core/tests/mock/styleMock.js delete mode 100644 packages/renderer-core/tests/renderer/__snapshots__/renderer.test.tsx.snap delete mode 100644 packages/renderer-core/tests/renderer/base.test.tsx delete mode 100644 packages/renderer-core/tests/renderer/renderer.test.tsx delete mode 100644 packages/renderer-core/tests/setup.ts delete mode 100644 packages/renderer-core/tests/utils/common.test.ts delete mode 100644 packages/renderer-core/tests/utils/components.tsx delete mode 100644 packages/renderer-core/tests/utils/data-helper.test.ts delete mode 100644 packages/renderer-core/tests/utils/is-use-loop.test.ts delete mode 100644 packages/renderer-core/tests/utils/node.ts delete mode 100644 packages/renderer-core/tests/utils/react-env-init.ts delete mode 100644 packages/renderer-core/tests/utils/request.test.ts delete mode 100644 packages/renderer-core/tsconfig.json delete mode 100644 packages/vue-renderer/CHANGELOG.md delete mode 100644 packages/vue-renderer/README.md delete mode 100644 packages/vue-renderer/build.json delete mode 100644 packages/vue-renderer/build.plugin.cjs delete mode 100644 packages/vue-renderer/build.umd.json delete mode 100644 packages/vue-renderer/package.json delete mode 100644 packages/vue-renderer/src/config.ts delete mode 100644 packages/vue-renderer/src/core/base.ts delete mode 100644 packages/vue-renderer/src/core/hoc.ts delete mode 100644 packages/vue-renderer/src/core/index.ts delete mode 100644 packages/vue-renderer/src/core/live.ts delete mode 100644 packages/vue-renderer/src/core/use.ts delete mode 100644 packages/vue-renderer/src/data-source/index.ts delete mode 100644 packages/vue-renderer/src/data-source/interface.ts delete mode 100644 packages/vue-renderer/src/data-source/request.ts delete mode 100644 packages/vue-renderer/src/hooks/current-node.ts delete mode 100644 packages/vue-renderer/src/hooks/index.ts delete mode 100644 packages/vue-renderer/src/hooks/renderer-context.ts delete mode 100644 packages/vue-renderer/src/index.ts delete mode 100644 packages/vue-renderer/src/renderer.ts delete mode 100644 packages/vue-renderer/src/renderers/index.ts delete mode 100644 packages/vue-renderer/src/renderers/page.ts delete mode 100644 packages/vue-renderer/src/utils/array.ts delete mode 100644 packages/vue-renderer/src/utils/i18n.ts delete mode 100644 packages/vue-renderer/src/utils/index.ts delete mode 100644 packages/vue-renderer/src/utils/parse.ts delete mode 100644 packages/vue-renderer/src/utils/scope.ts delete mode 100644 packages/vue-renderer/tsconfig.json delete mode 100644 packages/vue-simulator-renderer/CHANGELOG.md delete mode 100644 packages/vue-simulator-renderer/README.md delete mode 100644 packages/vue-simulator-renderer/build.json delete mode 100644 packages/vue-simulator-renderer/build.plugin.cjs delete mode 100644 packages/vue-simulator-renderer/build.umd.json delete mode 100644 packages/vue-simulator-renderer/package.json delete mode 100644 packages/vue-simulator-renderer/public/index.html delete mode 100644 packages/vue-simulator-renderer/src/buildin-components/index.ts delete mode 100644 packages/vue-simulator-renderer/src/buildin-components/leaf.ts delete mode 100644 packages/vue-simulator-renderer/src/buildin-components/page.ts delete mode 100644 packages/vue-simulator-renderer/src/buildin-components/slot.ts delete mode 100644 packages/vue-simulator-renderer/src/host.ts delete mode 100644 packages/vue-simulator-renderer/src/index.less delete mode 100644 packages/vue-simulator-renderer/src/index.ts delete mode 100644 packages/vue-simulator-renderer/src/interface.ts delete mode 100644 packages/vue-simulator-renderer/src/simulator-view.ts delete mode 100644 packages/vue-simulator-renderer/src/simulator.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/build-components.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/check-node.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/closest-node.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/comp-node.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/cursor.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/find-dom-nodes.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/get-client-rects.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/index.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/logger.ts delete mode 100644 packages/vue-simulator-renderer/src/utils/navtive-selection.ts delete mode 100644 packages/vue-simulator-renderer/tsconfig.json delete mode 100644 scripts/sync-oss.js delete mode 100755 scripts/sync.sh diff --git a/modules/code-generator/.gitignore b/modules/code-generator/.gitignore deleted file mode 100644 index bf10c9f823..0000000000 --- a/modules/code-generator/.gitignore +++ /dev/null @@ -1,122 +0,0 @@ -# project custom -build -es -dist -output -package-lock.json -yarn.lock -deploy-space/packages -deploy-space/.env -/demo/ -/demo-output*/ -/generated/ - -# IDE -.vscode -.idea - -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release -lib - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# mac config files -.DS_Store - -# codealike -codealike.json -.node - -# def publish -.package - -# types -/types - -# backup files -*.bak - -# tests -tests/fixtures/**/actual - - - diff --git a/modules/code-generator/.prettierrc.js b/modules/code-generator/.prettierrc.js deleted file mode 100644 index 24c5859e6e..0000000000 --- a/modules/code-generator/.prettierrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - printWidth: 100, - tabWidth: 2, - semi: true, - singleQuote: true, - trailingComma: 'all', -}; diff --git a/modules/code-generator/.versionrc b/modules/code-generator/.versionrc deleted file mode 100644 index a41c11e264..0000000000 --- a/modules/code-generator/.versionrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "releaseCommitMessageFormat": "chore(release): code-generator - {{currentTag}}" -} \ No newline at end of file diff --git a/modules/code-generator/CHANGELOG.md b/modules/code-generator/CHANGELOG.md deleted file mode 100644 index 8a6c546cd8..0000000000 --- a/modules/code-generator/CHANGELOG.md +++ /dev/null @@ -1,266 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - -### [1.0.7-beta.2](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.3...@felce/lowcode-code-generator@1.0.7-beta.2) (2022-11-24) - -### Bug Fixes - -- 🐛 解决 react 中 jsx 出码的时候对于循环数据漏包 \_\_$evalArray 的问题 ([3b9b177](https://github.com/fe-lce/lowcode-engine/commit/3b9b177b052169cd0c1078cf8b488f04cb374dac)) -- 🐛 解决出码缺乏对于 i18n 数据的 params 的处理的问题 ([2cf788c](https://github.com/fe-lce/lowcode-engine/commit/2cf788c1716ae63fef20004348c59a5a65c6b3d2)), closes [#288](https://github.com/fe-lce/lowcode-engine/issues/288) -- 🐛 解决小程序环境没有 window, 而 rax 出码中却默认在 \_\_$eval 中用到 window 的问题 ([ce531ae](https://github.com/fe-lce/lowcode-engine/commit/ce531aeb457711fac92d828b431cfc3d643b3682)) -- add support for jsx expression ([453e069](https://github.com/fe-lce/lowcode-engine/commit/453e0699ece06d98e59227e23248baf1de4082aa)) -- 修复生成的 icejs 项目不支持 constants 的问题, fixes [#1259](https://github.com/fe-lce/lowcode-engine/issues/1259) ([a079fbc](https://github.com/fe-lce/lowcode-engine/commit/a079fbc256f8275e8a69eb6d8abb6f6b08179578)) -- 修正 react 框架出码中在严格模式对 methods 和 context 的处理 ([b1a6100](https://github.com/fe-lce/lowcode-engine/commit/b1a61006bba4292790899c7c49c9c611a9384472)) - -### [1.0.7-beta.1](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.7-beta.0...@felce/lowcode-code-generator@1.0.7-beta.1) (2022-10-26) - -### Bug Fixes - -- fix empty string lost when generate variable ([2cf74cd](https://github.com/fe-lce/lowcode-engine/commit/2cf74cd04b4f48a3501d37329d39784f6964366a)) - -### [1.0.7-beta.0](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.6-beta.0...@felce/lowcode-code-generator@1.0.7-beta.0) (2022-10-25) - -### [1.0.6-beta.0](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.3...@felce/lowcode-code-generator@1.0.6-beta.0) (2022-10-25) - -### Features - -- 🎸 设计态支持数据源引擎配置 ([04631f8](https://github.com/fe-lce/lowcode-engine/commit/04631f813782dbf6d175f51c40ccc75ca4c099d2)) -- 大纲树支持节点过滤 ([f30db20](https://github.com/fe-lce/lowcode-engine/commit/f30db20606f5f2fdac0017305b1dda7ab2258c4b)) -- 为 renderer 追加 displayName,以支持后续的反射功能 ([6399cce](https://github.com/fe-lce/lowcode-engine/commit/6399cce05ae494dac6facf4366949b0b97576079)) -- 资产包支持一个package从另一个package异步导出 ([#1150](https://github.com/fe-lce/lowcode-engine/issues/1150)) ([6b78157](https://github.com/fe-lce/lowcode-engine/commit/6b78157b211d6eabf60297b9ce980a3e10cc8272)) -- add availableActions for ComponentMeta ([de1f60b](https://github.com/fe-lce/lowcode-engine/commit/de1f60bbee157267e2c2212df1077cc49ce506f4)) -- add code coverage action ([ed3ddcf](https://github.com/fe-lce/lowcode-engine/commit/ed3ddcf5c942a8e78e1f247e41d4159da97e75a8)) -- add componentMeta getter for setingPropEntry ([2f8b954](https://github.com/fe-lce/lowcode-engine/commit/2f8b9545de0210260001a832b52f608238ac4191)) -- add expanded to shell SettingPropEntry ([534e294](https://github.com/fe-lce/lowcode-engine/commit/534e29429d445d97c71d95d4c4e492868527bb6b)) -- add flag createIfNode for ShellNode#getProp ([152a24d](https://github.com/fe-lce/lowcode-engine/commit/152a24d65528d0a3b7990c9aa87e6d8d09aa9b2a)) -- add getComponentsMap() for DocumentModel ([f956645](https://github.com/fe-lce/lowcode-engine/commit/f9566454ef83eb4c48b68d63a766c3d0ff927c73)) -- add getExtraPropValue setExtraPropValue to shell SettingPropEntry ([70e7c1c](https://github.com/fe-lce/lowcode-engine/commit/70e7c1c2e8998e80d58447759efdf651105724a9)) -- add id setter for DocumentModel ([941ae05](https://github.com/fe-lce/lowcode-engine/commit/941ae0592586334694c48197aaa6692d49cefbce)) -- add importSchema event for documentModel ([4b8ec09](https://github.com/fe-lce/lowcode-engine/commit/4b8ec09e86e3950a9d4066c28e681a59273b4c93)) -- add isGroup & items to shell SettingPropEntry ([7b76ff3](https://github.com/fe-lce/lowcode-engine/commit/7b76ff357e4e638454c31a9b1324fb68966ec522)) -- add mergeChldren API for shell node ([a47d4ee](https://github.com/fe-lce/lowcode-engine/commit/a47d4eea28cf4479e3b3a2bd1d194a6433666825)) -- add onMountNode event for DocumentModel ([dcc247c](https://github.com/fe-lce/lowcode-engine/commit/dcc247c7d54f6af2ed36d46bfd79c7eacf7bd604)) -- add renderer for simulatorHost ([1cfc8d6](https://github.com/fe-lce/lowcode-engine/commit/1cfc8d668b8897ef3a53c11520312cc6d18338f9)) -- add script for synchronizing packages to intranet registry ([b4f463e](https://github.com/fe-lce/lowcode-engine/commit/b4f463e7d45f7b476de04bd4d98ad9f74d53cf13)) -- add scrollToNode for simulator host ([#1075](https://github.com/fe-lce/lowcode-engine/issues/1075)) ([0bcd9ff](https://github.com/fe-lce/lowcode-engine/commit/0bcd9ff78227aeddaf2fdc22d10fbd662fed91d3)) -- add setVisible for Node ([ba90327](https://github.com/fe-lce/lowcode-engine/commit/ba90327eac0f5f82f6349bb9a7684bf51259e9c9)) -- add showArea & hideArea method for skeleton ([8f6b53e](https://github.com/fe-lce/lowcode-engine/commit/8f6b53e67d89ee7af754132f0994a759522b3821)) -- add slotNode for shell prop ([d9a44c5](https://github.com/fe-lce/lowcode-engine/commit/d9a44c5de7861e9180567b4afb787e381cefac61)) -- add some features ([18d1a4f](https://github.com/fe-lce/lowcode-engine/commit/18d1a4fe1d952bcd4715e693def09fee94da49a5)) -- add some necessary methods and attributes ([4fd7f27](https://github.com/fe-lce/lowcode-engine/commit/4fd7f27f8eb33b66324ede279b412940fc1f7032)) -- add some params for onDragstart & onDrag & onDragend ([d1c9838](https://github.com/fe-lce/lowcode-engine/commit/d1c9838343ba1bdd4c02c1cfbf1f920dd8c87e7d)) -- add top attrbute for Shell SettingPropEntry ([51aca3d](https://github.com/fe-lce/lowcode-engine/commit/51aca3d330b6483c05b71867f1b362a9f5db6cfe)) -- added lowcode engine standard specs ([f25feba](https://github.com/fe-lce/lowcode-engine/commit/f25feba63f181efa83f1a8dff530e1c39ab1b34c)) -- added lowcode engine standard specs ([57df803](https://github.com/fe-lce/lowcode-engine/commit/57df803179ca9cec4e8ab1dac1be577175732e65)) -- added thisRequiredInJSE API to control whether JSExpression expression access context must use this ([#702](https://github.com/fe-lce/lowcode-engine/issues/702)) ([da7f77e](https://github.com/fe-lce/lowcode-engine/commit/da7f77ee91b3bf441a4a57614872df32d6a1d041)) -- assetLoader loda scripts with async=false ([f6ad4a1](https://github.com/fe-lce/lowcode-engine/commit/f6ad4a157df8c0ff7db327f4770f454998693d9a)) -- change loop sertter config, set defaultValue prop to JsonSetter ([aa6b9c8](https://github.com/fe-lce/lowcode-engine/commit/aa6b9c8f7a5353771af9f46216310f044e57c533)) -- cp dist files of simulator-renderer to that of engine ([03c5397](https://github.com/fe-lce/lowcode-engine/commit/03c53971df6de8c35620fd77743ac4f57a82d323)) -- export nodeChildrenSymbol && remove some unnecessary editor.set ([e83adce](https://github.com/fe-lce/lowcode-engine/commit/e83adcee815eea73b6b1ed4f43f4d684c11818ca)) -- fix render-core leaf hoc component condition config should get from leaf exportSchema fn ([85704c3](https://github.com/fe-lce/lowcode-engine/commit/85704c36946191a1b88db789cfac59e9d027a371)) -- low-code components support lifecycle and function execution ([176583f](https://github.com/fe-lce/lowcode-engine/commit/176583f48af573d30c0d2c36faa3d901b0541c06)) -- **material-parser:** check module before install it; fix default value issue in ts parser ([fc452f7](https://github.com/fe-lce/lowcode-engine/commit/fc452f7166f02acfba6076c1a9425e6f5880b5f6)) -- modify the output method of rendering module parsing errors ([8255b79](https://github.com/fe-lce/lowcode-engine/commit/8255b7945836ee5d25fae73913faa6d0af7b3ff3)) -- pass e to customizeIgnoreSelectors ([900b239](https://github.com/fe-lce/lowcode-engine/commit/900b2394323e85f0dce5df83dfc773f96da23e24)) -- refine nesting drawer ([4c032d0](https://github.com/fe-lce/lowcode-engine/commit/4c032d0d0ead9731c038bd62dccc4a7d96435183)) -- refine nesting drawer ([94a211e](https://github.com/fe-lce/lowcode-engine/commit/94a211e2795f74721cfd2ae3ff38a1d3607e9cd0)) -- refine pop drawer ([abf8fae](https://github.com/fe-lce/lowcode-engine/commit/abf8fae3ef4d62b5688362e1b98f1b508a207029)) -- requestHandlersMap should be optional ([ee7160e](https://github.com/fe-lce/lowcode-engine/commit/ee7160ea3c625d421c07730ef51711b8f14392a0)) -- return unbind function for onChangeDetecting & onChangeSelection ([30267cb](https://github.com/fe-lce/lowcode-engine/commit/30267cb173fca2cd80a61450b9f2fe2bceac0f06)) -- support for hiding settings tabs when there is only one item ([#669](https://github.com/fe-lce/lowcode-engine/issues/669)) ([cbd95a1](https://github.com/fe-lce/lowcode-engine/commit/cbd95a1778415406670f37507ce957af6b3ecd4a)) -- support for NotFoundComponent design state is optional ([#1013](https://github.com/fe-lce/lowcode-engine/issues/1013)) ([d3c891e](https://github.com/fe-lce/lowcode-engine/commit/d3c891e2a46d138e31c81a7f9b804a8240154df5)) -- support opening document with id ([3f7c0cd](https://github.com/fe-lce/lowcode-engine/commit/3f7c0cd5191b7924f2630c58e6439f4d4a936ac9)) -- support SPA mode ([1f9150e](https://github.com/fe-lce/lowcode-engine/commit/1f9150e4b260d522bd7cb31497069b700a1e8576)) -- sync utils/constants ([#506](https://github.com/fe-lce/lowcode-engine/issues/506)) ([2871b5b](https://github.com/fe-lce/lowcode-engine/commit/2871b5ba4c3dbf1ed76bf4d6359fb457190a9b22)) -- the tips when dragging a component from the component panel same with the moving component ([dbe0764](https://github.com/fe-lce/lowcode-engine/commit/dbe0764ff4901450f03ca56b62167fbc87d2524a)) - -### Bug Fixes - -- 🐛 解决 react 中 jsx 出码的时候对于循环数据漏包 \_\_$evalArray 的问题 ([3b9b177](https://github.com/fe-lce/lowcode-engine/commit/3b9b177b052169cd0c1078cf8b488f04cb374dac)) -- 🐛 解决出码缺乏对于 i18n 数据的 params 的处理的问题 ([2cf788c](https://github.com/fe-lce/lowcode-engine/commit/2cf788c1716ae63fef20004348c59a5a65c6b3d2)), closes [#288](https://github.com/fe-lce/lowcode-engine/issues/288) -- 🐛 解决小程序环境没有 window, 而 rax 出码中却默认在 \_\_$eval 中用到 window 的问题 ([ce531ae](https://github.com/fe-lce/lowcode-engine/commit/ce531aeb457711fac92d828b431cfc3d643b3682)) -- 🐛 修复数据源引擎请求处理器映射严格模式下被过滤的问题 ([75626d8](https://github.com/fe-lce/lowcode-engine/commit/75626d877db017b8862b1d5e64d75f3af7ff667a)) -- 🐛 修正 i18n 里面的一个参数命名问题 ([20c6fca](https://github.com/fe-lce/lowcode-engine/commit/20c6fca03e99b11fa5c257cbbda0d4d23f410090)) -- 新元素无法在大纲树拖拽 ([3d41fd5](https://github.com/fe-lce/lowcode-engine/commit/3d41fd5d0783048a7cfb54c6f80d058856153d25)) -- 修复React17选中组件bug ([750d282](https://github.com/fe-lce/lowcode-engine/commit/750d282c03a880204fefdef01e180510465b82f8)) -- 修正 react 框架出码中在严格模式对 methods 和 context 的处理 ([b1a6100](https://github.com/fe-lce/lowcode-engine/commit/b1a61006bba4292790899c7c49c9c611a9384472)) -- 左侧抽屉固定模式层级不足 ([c657cee](https://github.com/fe-lce/lowcode-engine/commit/c657cee0694e3126dee89588a2aa17c4e118f786)) -- add lowcode-designer, lowcode-utils dependencies ([d250242](https://github.com/fe-lce/lowcode-engine/commit/d2502427ca988881747a35bd8da49f024939b833)) -- add support for jsx expression ([1043ef8](https://github.com/fe-lce/lowcode-engine/commit/1043ef82b1e9ceefc3b74fd21eb28e9a740bd1db)) -- addon-combine affect metadata unexpectedly ([fc5fbc6](https://github.com/fe-lce/lowcode-engine/commit/fc5fbc63a04a32bc887754f32e74c76149d74b05)) -- adjust synchronize-order of packages ([81a7304](https://github.com/fe-lce/lowcode-engine/commit/81a73049bd848524e1156761ded08ddf325863ba)) -- change typescript type export to export type ([50e4a03](https://github.com/fe-lce/lowcode-engine/commit/50e4a03b7d810131ce413cc057b43d4a726f1ebe)) -- change typescript type export to export type ([573504b](https://github.com/fe-lce/lowcode-engine/commit/573504b0e3537ca60d234ce2b2f3feedb323405e)) -- declare parameter appHelper for valid engine options ([058a842](https://github.com/fe-lce/lowcode-engine/commit/058a84226af8ca19d8c7d63599d80d0cdf70281c)) -- defaultValue should be evaluated inspite of condition result is falsy, fixes [#1045](https://github.com/fe-lce/lowcode-engine/issues/1045) ([fcfce3c](https://github.com/fe-lce/lowcode-engine/commit/fcfce3cbeb5a53600c40aea07ffef19c9c9591c4)) -- delete the defaultValue configuration outside the loop ([acf7449](https://github.com/fe-lce/lowcode-engine/commit/acf7449ca231d45e8ed7e1d9416817ea11b1266f)) -- delete unused typescript types ([63f5d2c](https://github.com/fe-lce/lowcode-engine/commit/63f5d2ca3e0bda92898fd0df28c9500707812082)) -- delete unused typescript types ([2432aed](https://github.com/fe-lce/lowcode-engine/commit/2432aed83d55407d2f8b5f94910ada7ea78bb59e)) -- designer/loadIncrementalAssets await Sequential ([#841](https://github.com/fe-lce/lowcode-engine/issues/841)) ([8232424](https://github.com/fe-lce/lowcode-engine/commit/823242469743d235923b3b946ec7d2db70887ead)) -- error thrown when triggering undo after save schema on SchemaPane ([9be46e7](https://github.com/fe-lce/lowcode-engine/commit/9be46e7b34e3a40cbc489dbae4bfd0915c2090e3)) -- fallback focusNode to root if empty ([a9a118f](https://github.com/fe-lce/lowcode-engine/commit/a9a118fe6e79080245c6eea42ed26772b7c784ca)) -- **filter:** unique key prop warning ([3fe6e41](https://github.com/fe-lce/lowcode-engine/commit/3fe6e41536cd3a9b9c7eaca5b353de4bd1f91b11)) -- **filter:** unique key prop warning ([06e6920](https://github.com/fe-lce/lowcode-engine/commit/06e6920602bdf21b6e1ffe5cfa3dfe4856e7c57e)) -- fix css resources with parameters not loading correctly ([f859752](https://github.com/fe-lce/lowcode-engine/commit/f85975211814147d40ae5330a76cb21cb6c66916)) -- fix css resources with parameters not loading correctly ([9a5a04a](https://github.com/fe-lce/lowcode-engine/commit/9a5a04ac9560fb6a51bf4e0ed8ea446381d39c35)) -- fix dataSource needs to be compatible due to empty schema ([98bc477](https://github.com/fe-lce/lowcode-engine/commit/98bc477d80dbf7993f89befdb42762d78a55fb1b)) -- fix displayName spell mistake ([2b2bcbd](https://github.com/fe-lce/lowcode-engine/commit/2b2bcbdaebde6a3ce974072f586386ef7ef3497c)) -- fix internal project.getSchema default stage is error ([0d40db2](https://github.com/fe-lce/lowcode-engine/commit/0d40db2581f4fe5a9e22f763f21aec641e366c34)) -- fix lint issues for renderer-core/renderer/base ([d85437d](https://github.com/fe-lce/lowcode-engine/commit/d85437d4af1043371e27dfde98cecf914b93a126)) -- fix lint issues for renderer-core/renderer/base ([4b59190](https://github.com/fe-lce/lowcode-engine/commit/4b59190c7f9d518bc7efac44b7eeee73f1b5d177)) -- fix low-code component rendering problems: 1. thisRequiredInJSE does not take effect 2. jsx components cannot obtain source components ([5dd4625](https://github.com/fe-lce/lowcode-engine/commit/5dd462544fbbbccfa97165f2bcfeed8629fab2a3)) -- fix material-spec demo ([438cccd](https://github.com/fe-lce/lowcode-engine/commit/438cccd58e4341638070c1d8b2d4e78e4e20e3fb)) -- fix misused doc urls ([16a8857](https://github.com/fe-lce/lowcode-engine/commit/16a88578634b9da2f04698df5ca5a5e69151bb97)) -- fix monitor utils incorrect assignment method ([bf280c6](https://github.com/fe-lce/lowcode-engine/commit/bf280c6fa1e46d084fc8f20323164816fad4076f)) -- fix outline-pane invisible occasionally when dragging tree node ([031c7f2](https://github.com/fe-lce/lowcode-engine/commit/031c7f25f10a6cfebfc7929c9226f4e4167a359f)) -- fix outline-tree initialization failed ([a2d5c6f](https://github.com/fe-lce/lowcode-engine/commit/a2d5c6fd90ca0226bbbfea01a4b28c8b8d307a78)) -- fix render module state expression initialization exception ([5bd68ee](https://github.com/fe-lce/lowcode-engine/commit/5bd68ee6b448fa58b022870b3f8175d8b77febde)) -- fix render module state expression initialization exception ([9c545cc](https://github.com/fe-lce/lowcode-engine/commit/9c545cca6004f65e2f206ea001cefa3fa3cfa807)) -- fix setter hooks error ([8a3a0b8](https://github.com/fe-lce/lowcode-engine/commit/8a3a0b824162e25a930711c6fef511b4b369e897)) -- fix test case failures of designer ([4b0521a](https://github.com/fe-lce/lowcode-engine/commit/4b0521a47494f78e120f75021e0a076fb00ce53e)) -- Fix the conversion failure of some props expressions under Slot props of low-code components ([7db5461](https://github.com/fe-lce/lowcode-engine/commit/7db5461706c739fac673b2466bc2fda7661242e4)) -- fix the leaf hoc component fails to monitor Node changes, and modify the logic for get node ([6ee6b07](https://github.com/fe-lce/lowcode-engine/commit/6ee6b07a10ba4aac583def52d8ff1fa78d111d0b)) -- fix the leaf hoc component fails to monitor Node changes, and modify the logic for get node ([f400172](https://github.com/fe-lce/lowcode-engine/commit/f4001728259047b09db75d76a8c3ef1e1bcb4e0a)) -- fix the problem that material.getComponentMetasMap returns the wrong result ([e02933c](https://github.com/fe-lce/lowcode-engine/commit/e02933c18bc15519b2eba8ad946282502a509611)) -- Fix the rendering error caused by incorrect key value when configuring the loop ([1026763](https://github.com/fe-lce/lowcode-engine/commit/1026763dc5a77d4395a1e86e5a0084ab4fb4230c)) -- fix the unit test failure problem caused by thisRequiredInJSE modification ([c2c59b7](https://github.com/fe-lce/lowcode-engine/commit/c2c59b7ff72ba06156bbcdb952262739d6188209)) -- fix unnecessary props calculation ([f1fed75](https://github.com/fe-lce/lowcode-engine/commit/f1fed75f39be8289ede1ec558b04428a69e25b5f)) -- fixed an issue where materials would be rendered multiple times ([9d187cc](https://github.com/fe-lce/lowcode-engine/commit/9d187ccb7de55857e861d3fc881c610506872d03)) -- fixed an issue where materials would be rendered multiple times ([64cc328](https://github.com/fe-lce/lowcode-engine/commit/64cc3283c15342151a8f93c46a276681f3575153)) -- fixed focusNodeSelector configuration not taking effect ([9beae9c](https://github.com/fe-lce/lowcode-engine/commit/9beae9c3269901bf03a29033121c7d480571bce5)) -- fixed the issue that thisRequiredInJSE did not take effect in some scenarios ([7e5a919](https://github.com/fe-lce/lowcode-engine/commit/7e5a919f9352397f11741fd911495996469c0256)) -- in ES require changed to import ([b4d7d6d](https://github.com/fe-lce/lowcode-engine/commit/b4d7d6d8c290a335a2c1f60731d4417b23444941)) -- in ES require changed to import ([7c8cd36](https://github.com/fe-lce/lowcode-engine/commit/7c8cd36a10a7caa61de31a15abd93ab8a97fbe08)) -- leaf should be type of ShellNode other than InnerNode ([5bb8cf5](https://github.com/fe-lce/lowcode-engine/commit/5bb8cf5d12d38d70b69fa28deb2f8aa0afa9b9b9)) -- lowcode component exec lifecycle has error ([f99a47e](https://github.com/fe-lce/lowcode-engine/commit/f99a47e502080134454795f5e361cfa4fba3f03b)) -- lowcode component leaf dont have export prop, exec leaf.export make error ([9d51dcd](https://github.com/fe-lce/lowcode-engine/commit/9d51dcdae38850be0206861f2cae74ca68805c25)) -- missing engine options config info ([a79875c](https://github.com/fe-lce/lowcode-engine/commit/a79875cf8698d3912b50526d97f6ac72e9a21fc9)) -- missing engine options config info ([9ccded0](https://github.com/fe-lce/lowcode-engine/commit/9ccded006ef44cd538abaa140250e519243bf090)) -- npm run clean error in windows ([a176e9d](https://github.com/fe-lce/lowcode-engine/commit/a176e9d245981fb5718c8d144f477202b3796be6)) -- project event listeners will not be invoked sometimes ([a0c772f](https://github.com/fe-lce/lowcode-engine/commit/a0c772fb903cf5eb9e0b811b64bbe3846d4ba8ac)) -- project.exportSchema api lack stage param & setAssets should be a async fn ([0ea76a7](https://github.com/fe-lce/lowcode-engine/commit/0ea76a746fac8ea8e7b999d42434c468c85d6372)) -- project.exportSchema should export componentsMap of all documents ([969a130](https://github.com/fe-lce/lowcode-engine/commit/969a130b373fb028f8051e96cb9d79f1de0a2a1c)) -- removed incorrectly calling childWhitelist hook logic during drag and drop ([#1141](https://github.com/fe-lce/lowcode-engine/issues/1141)) ([6576346](https://github.com/fe-lce/lowcode-engine/commit/6576346b9185bedb090be9c84129e077cf5389b3)) -- renderer not rendering correct components when loading components with loadAsyncLibrary api ([9b3b4f9](https://github.com/fe-lce/lowcode-engine/commit/9b3b4f9b0e35ef3ea2f0117f0cdb2254e15d5389)) -- should pass index param when creating a Prop instance under a list type Prop instance, fix [#780](https://github.com/fe-lce/lowcode-engine/issues/780) ([a8de3f2](https://github.com/fe-lce/lowcode-engine/commit/a8de3f299c7b26fa939d2b2ea1428143e2b5fb01)) -- simulator eclipses setting area [#773](https://github.com/fe-lce/lowcode-engine/issues/773) ([b4b30a3](https://github.com/fe-lce/lowcode-engine/commit/b4b30a359932f5c0e8fde1b28f54a883c87901d8)) -- spec typo ([#1064](https://github.com/fe-lce/lowcode-engine/issues/1064)) ([ecb9dca](https://github.com/fe-lce/lowcode-engine/commit/ecb9dca2b9386ef6fadfd009d161a9203b9b9558)) -- try catch calculation of dynamic setter ([f61e2a2](https://github.com/fe-lce/lowcode-engine/commit/f61e2a2b8a3d8d6754474cd392bc259917c7eb10)) -- type=legao dont make request ([98ececa](https://github.com/fe-lce/lowcode-engine/commit/98ececa9c11f93e5f849b201b5b5e7ff453733d7)) -- **types:** rrror declaration of the children prop ([951d1cb](https://github.com/fe-lce/lowcode-engine/commit/951d1cb103fa46c0e7926d6138657c7d10cc4f88)) -- use the original object if it is not a shell object ([5ea53f7](https://github.com/fe-lce/lowcode-engine/commit/5ea53f706b6571946bcfa56b8655b55717381771)) -- use the outer documentation url of unique key, fixes [#868](https://github.com/fe-lce/lowcode-engine/issues/868) ([d770007](https://github.com/fe-lce/lowcode-engine/commit/d770007ff8c39e6cf527e07a7d6468dbb88c776d)) -- use the outer documentation url of unique key, fixes [#868](https://github.com/fe-lce/lowcode-engine/issues/868) ([912ee22](https://github.com/fe-lce/lowcode-engine/commit/912ee22180a424f63298c319c62fb481513af904)) -- use uppercase resize trigger names based on material spec ([7fda0ef](https://github.com/fe-lce/lowcode-engine/commit/7fda0efe131e0e2e3141849cf3f87307e7ce1b36)) -- when designMode is not design, the hidden attribute does not take effect ([3dd0b6d](https://github.com/fe-lce/lowcode-engine/commit/3dd0b6d0a86267e3029c176ff49aff793ce3e186)) - -### [1.0.4](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.4-beta.0...@felce/lowcode-code-generator@1.0.4) (2022-04-12) - -### Bug Fixes - -- 🐛 解决 react 中 jsx 出码的时候对于循环数据漏包 \_\_$evalArray 的问题 ([eb4cc69](https://github.com/fe-lce/lowcode-engine/commit/eb4cc693f5dbcae54546c569eb8fa331d074e062)) - -### [1.0.4-beta.1](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.4-beta.0...@felce/lowcode-code-generator@1.0.4-beta.1) (2022-04-11) - -### Bug Fixes - -- 🐛 解决 react 中 jsx 出码的时候对于循环数据漏包 \_\_$evalArray 的问题 ([987f4ce](https://github.com/fe-lce/lowcode-engine/commit/987f4cea54ef8a75d0b63a0268b5a20b2938b8a7)) - -### [1.0.4-beta.0](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.3...@felce/lowcode-code-generator@1.0.4-beta.0) (2022-04-10) - -### Features - -- **material-parser:** check module before install it; fix default value issue in ts parser ([fc452f7](https://github.com/fe-lce/lowcode-engine/commit/fc452f7166f02acfba6076c1a9425e6f5880b5f6)) - -### Bug Fixes - -- 🐛 修正 i18n 里面的一个参数命名问题 ([1e9e388](https://github.com/fe-lce/lowcode-engine/commit/1e9e388ce9104d76c4f6d9bc513c57e5059d7982)) -- 🐛 解决出码缺乏对于 i18n 数据的 params 的处理的问题 ([1eb9add](https://github.com/fe-lce/lowcode-engine/commit/1eb9addd8df2323f9aabac87af32ac2efcd6bf22)), closes [#288](https://github.com/fe-lce/lowcode-engine/issues/288) -- 🐛 解决小程序环境没有 window, 而 rax 出码中却默认在 \_\_$eval 中用到 window 的问题 ([67dabb0](https://github.com/fe-lce/lowcode-engine/commit/67dabb04beb32b6e94eb1276222e53b416e47c9d)) -- Fix the conversion failure of some props expressions under Slot props of low-code components ([7db5461](https://github.com/fe-lce/lowcode-engine/commit/7db5461706c739fac673b2466bc2fda7661242e4)) -- fix unnecessary props calculation ([f1fed75](https://github.com/fe-lce/lowcode-engine/commit/f1fed75f39be8289ede1ec558b04428a69e25b5f)) -- 修正 react 框架出码中在严格模式对 methods 和 context 的处理 ([79db4ac](https://github.com/fe-lce/lowcode-engine/commit/79db4ac97f34f24b7f7460fb3fc67521967f8cc5)) - -### [1.0.3](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.2...@felce/lowcode-code-generator@1.0.3) (2022-03-29) - -### Features - -- add getConvertedExtraKey / getOriginalExtraKey to utils ([8e7bb9d](https://github.com/fe-lce/lowcode-engine/commit/8e7bb9d4b86454dd77c6928eb769cd764cad8630)) - -### Bug Fixes - -- 🐛 出码: 解决 componentName 和 exportName 不一致时生成的 import 语句的问题 ([eefc091](https://github.com/fe-lce/lowcode-engine/commit/eefc091ee7e86d6214d20d486212cb5aff237946)) -- component cannot be redisplayed by configuration after rendering is closed ([c54f369](https://github.com/fe-lce/lowcode-engine/commit/c54f369e1860d818479dda9d6429f851c0b08fa6)) -- fix loop configuration auto fill empty array issue ([d087092](https://github.com/fe-lce/lowcode-engine/commit/d087092fd712eff0556adacda692d3ff6f2f9f22)) -- make important true by default ([c63b6e1](https://github.com/fe-lce/lowcode-engine/commit/c63b6e1bfadc3fc87ed41840952e02ffbff24fab)) -- make insertAfter & insertBefore work ([70fd372](https://github.com/fe-lce/lowcode-engine/commit/70fd3720d098d6e227acb9281ee22feee66b9c0b)) -- npm源 ([437adcc](https://github.com/fe-lce/lowcode-engine/commit/437adccf5f2dbb400de6e2bef10cfc4b65286f2b)) -- prop should return undefined when all items are undefined ([5bb9ec7](https://github.com/fe-lce/lowcode-engine/commit/5bb9ec7a1dfaabfdb5369226b54d5f63a7999e59)) -- should not create new prop while querying fileName ([19c207d](https://github.com/fe-lce/lowcode-engine/commit/19c207d29de045f473ba73baaf34e7294d40261a)) -- variable binding lost after modify the mock value ([ef95b56](https://github.com/fe-lce/lowcode-engine/commit/ef95b5683273d8302bde1582de8afe3d87a808d8)) -- Workbench should receive the original skeleton other than shell skeleton ([d5c3ca1](https://github.com/fe-lce/lowcode-engine/commit/d5c3ca1068ce2c2140980bd059d0da333574dc34)) - -### [1.0.2](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.2-beta.1...@felce/lowcode-code-generator@1.0.2) (2022-03-08) - -### [1.0.2-beta.1](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.2-beta.0...@felce/lowcode-code-generator@1.0.2-beta.1) (2022-03-08) - -### Bug Fixes - -- 🐛 补充 icejs 模板中缺失的依赖包 ([a94553e](https://github.com/fe-lce/lowcode-engine/commit/a94553e503d439b67478df6a34950d9e3d15a063)) - -### [1.0.2-beta.0](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.0...@felce/lowcode-code-generator@1.0.2-beta.0) (2022-03-08) - -### Features - -- 在 skeleton 增加几个方法和事件 ([a7d436a](https://github.com/fe-lce/lowcode-engine/commit/a7d436a0525a0ce0c7229710077111f283b452f4)) -- modify npm private control & version ([ee55d02](https://github.com/fe-lce/lowcode-engine/commit/ee55d024a7f964ccf35a0efabec817364cea8041)) -- modify yuque link in README ([d522034](https://github.com/fe-lce/lowcode-engine/commit/d522034879d20a7b5ed12f8fe02a30662a2ea7c6)) -- remove CHANGELOG.md ([b996414](https://github.com/fe-lce/lowcode-engine/commit/b996414c436b5d2439c8368eb4e001cdbcd02892)) -- remove module field in material-parser package.json ([6141c27](https://github.com/fe-lce/lowcode-engine/commit/6141c273c9c32eea22b5374679fe625e6ea15394)) -- rename build:umd ([23c7959](https://github.com/fe-lce/lowcode-engine/commit/23c795931e1d5cf43e9c21cd902441c69c1ecc63)) -- replace tnpm with npm ([36caf0f](https://github.com/fe-lce/lowcode-engine/commit/36caf0f18980c16f7ebb82ac845ad6b33e033567)) -- support UMD packageing for react-renderer ([982d0d6](https://github.com/fe-lce/lowcode-engine/commit/982d0d676b3dfbfc10a2190c0040126d6925ed37)) - -### Bug Fixes - -- 🐛 去掉 npm 上没有的依赖 ([#68](https://github.com/fe-lce/lowcode-engine/issues/68)) ([e7ce779](https://github.com/fe-lce/lowcode-engine/commit/e7ce77987eb05871dd1675d2a88367c5569bfbff)) -- 兼容 setters 为空的情况 ([56b459a](https://github.com/fe-lce/lowcode-engine/commit/56b459a017a8350a911ef20f0166d1e62b6390e4)) -- 解决 package.json 中误添加了没有用到的数据源类型的 handler 的包的问题 ([#56](https://github.com/fe-lce/lowcode-engine/issues/56)) ([76341c8](https://github.com/fe-lce/lowcode-engine/commit/76341c8456b227192bb65537dc3d16033db0b3a1)) -- 解决出码的一些问题 ([#87](https://github.com/fe-lce/lowcode-engine/issues/87)) ([4a01c97](https://github.com/fe-lce/lowcode-engine/commit/4a01c97ea6bf23eb677888ba1aba54e5c9f4f630)) -- 修复 setup 的逻辑 ([1cfb15a](https://github.com/fe-lce/lowcode-engine/commit/1cfb15aebea9796af23b2135f2aa4409d81283d7)) -- 修正一些对内的地址 ([07cc1f2](https://github.com/fe-lce/lowcode-engine/commit/07cc1f2954530c64a1a3d260e8d532c9e19892e8)) -- 增加必要的方法 ([1b38a81](https://github.com/fe-lce/lowcode-engine/commit/1b38a812653656aa02100a3b1b2a581188d1b3ef)) -- fix tsconfig of material-parser ([46725cb](https://github.com/fe-lce/lowcode-engine/commit/46725cb9f3166912c8f5b42f1e0b1177158c1ee3)) -- lint&fix auto generated types.ts ([7dde970](https://github.com/fe-lce/lowcode-engine/commit/7dde9701c7960b29523abddf32421cdbac47016d)) -- The outline tree does not display the loop flag when the loop is an empty array ([191e284](https://github.com/fe-lce/lowcode-engine/commit/191e284f2fa190c2b3aecb4df31849b2bdc99d38)) - -### [1.0.1](https://github.com/fe-lce/lowcode-engine/compare/@felce/lowcode-code-generator@1.0.0...@felce/lowcode-code-generator@1.0.1) (2022-03-08) - -### Features - -- 在 skeleton 增加几个方法和事件 ([a7d436a](https://github.com/fe-lce/lowcode-engine/commit/a7d436a0525a0ce0c7229710077111f283b452f4)) -- modify npm private control & version ([ee55d02](https://github.com/fe-lce/lowcode-engine/commit/ee55d024a7f964ccf35a0efabec817364cea8041)) -- modify yuque link in README ([d522034](https://github.com/fe-lce/lowcode-engine/commit/d522034879d20a7b5ed12f8fe02a30662a2ea7c6)) -- remove CHANGELOG.md ([b996414](https://github.com/fe-lce/lowcode-engine/commit/b996414c436b5d2439c8368eb4e001cdbcd02892)) -- remove module field in material-parser package.json ([6141c27](https://github.com/fe-lce/lowcode-engine/commit/6141c273c9c32eea22b5374679fe625e6ea15394)) -- rename build:umd ([23c7959](https://github.com/fe-lce/lowcode-engine/commit/23c795931e1d5cf43e9c21cd902441c69c1ecc63)) -- replace tnpm with npm ([36caf0f](https://github.com/fe-lce/lowcode-engine/commit/36caf0f18980c16f7ebb82ac845ad6b33e033567)) -- support UMD packageing for react-renderer ([982d0d6](https://github.com/fe-lce/lowcode-engine/commit/982d0d676b3dfbfc10a2190c0040126d6925ed37)) - -### Bug Fixes - -- 🐛 修正一些示例地址 ([8d21283](https://github.com/fe-lce/lowcode-engine/commit/8d212832e77a1ec763db668683917705774acd0d)) -- 兼容 setters 为空的情况 ([56b459a](https://github.com/fe-lce/lowcode-engine/commit/56b459a017a8350a911ef20f0166d1e62b6390e4)) -- 修复 setup 的逻辑 ([1cfb15a](https://github.com/fe-lce/lowcode-engine/commit/1cfb15aebea9796af23b2135f2aa4409d81283d7)) -- 修正一些对内的地址 ([07cc1f2](https://github.com/fe-lce/lowcode-engine/commit/07cc1f2954530c64a1a3d260e8d532c9e19892e8)) -- 增加必要的方法 ([1b38a81](https://github.com/fe-lce/lowcode-engine/commit/1b38a812653656aa02100a3b1b2a581188d1b3ef)) -- fix tsconfig of material-parser ([46725cb](https://github.com/fe-lce/lowcode-engine/commit/46725cb9f3166912c8f5b42f1e0b1177158c1ee3)) -- lint&fix auto generated types.ts ([7dde970](https://github.com/fe-lce/lowcode-engine/commit/7dde9701c7960b29523abddf32421cdbac47016d)) -- The outline tree does not display the loop flag when the loop is an empty array ([191e284](https://github.com/fe-lce/lowcode-engine/commit/191e284f2fa190c2b3aecb4df31849b2bdc99d38)) - -## 1.0.0 (2022-02-17) - -### Features - -- first commit - genesis ([4f4ac51](https://github.com/fe-lce/lowcode-engine/commit/4f4ac5115d18357a7399632860808f6cffc33fad)) diff --git a/modules/code-generator/CONTRIBUTING.md b/modules/code-generator/CONTRIBUTING.md deleted file mode 100644 index 5950d40025..0000000000 --- a/modules/code-generator/CONTRIBUTING.md +++ /dev/null @@ -1,40 +0,0 @@ -# 如何共建 - -1. 拉取最新代码,切换到 develop 分支,基于 develop 分支切出一个 feature 或 hotfix 分支 -2. 到 `lowcode-engine` 项目根目录下,执行 `lerna bootstrap && lerna run build --scope "@felce/lowcode-types"` 来安装依赖并构建 -3. 到 `lowcode-engine/modules/code-generator`下,安装依赖(`npm i`),然后先跑一遍 `npm test` 看看是否所有用例都能通过 (如果网络条件不太好,建议使用 [cnpm - 淘宝提供的中国 NPM 镜像](https://npmmirror.com/)) -4. 在 tests 目录下编写您的需求/问题的测试用例 -5. 修改 src 下的一些代码,然后运行 `npm test` 或 `npm start` 启动 jest 进行调测 -6. 确保所有的测试用例都能通过时,提 MR 给 @牧毅 -- MR 将在 1 个工作日内给您回复意见。 - -当然,欢迎提前私聊沟通 @牧毅,或加入 低代码渲染/出码服务金牌用户群 讨论沟通。 - -# FAQ - -## 如何查看单测覆盖率? - -执行 `npm test:cov` 命令,这样会自动生成单测覆盖率的报告到 `coverage` 目录下。 - -## 如何只执行一个测试用例? - -```sh -npm test -t 'demo2-utils-name-alias' -``` - -## 更新特定测试用例的 expected: - -```sh -npm test:update-snapshots -t 'demo2-utils-name-alias' -``` - -## 如何只执行某个测试用例文件? - -执行 `npx jest 测试用例的文件路径` 即可,如: - -```sh -npx jest tests/plugins/common/requireUtils.test.ts -``` - -## 如何调试某个测试用例? - -建议需要打断点的地方通过 VSCode 打上断点,然后打开 VSCode 的 JavaScript Debug Terminal,在其中执行 `npx jest tests/path/to/your/test/file.ts` 或 `npx jest -t your-test-case-title` 来执行你的测试用例 -- 这样执行到打了断点的语句时会自动断住,以便调试。 diff --git a/modules/code-generator/README.md b/modules/code-generator/README.md deleted file mode 100644 index cf61fba9ce..0000000000 --- a/modules/code-generator/README.md +++ /dev/null @@ -1,123 +0,0 @@ -# 出码 - -所谓出码,即将低代码编排出的 schema 进行解析并转换成最终可执行的代码的过程。本模块提供有 Icejs 和 Rax 两套框架的出码方案,并提供了强大而灵活的扩展机制。 - -## 使用方法 - -### 1) 通过命令行快速体验 - -欢迎使用命令行工具快速体验:`npx @felce/lowcode-code-generator -i example-schema.json -o generated -s icejs` - ---其中 example-schema.json 可以从[这里下载](https://unpkg.com/@felce/lowcode-code-generator@beta/example-schema.json) - -### 2) 通过设计器插件快速体验 - -1. 安装依赖: `npm install --save @alilc/lowcode-plugin-code-generator` -2. 注册插件: - -```ts -import { plugins } from '@felce/lowcode-engine'; -import CodeGenPlugin from '@alilc/lowcode-plugin-code-generator'; - -// 在你的初始化函数中: -await plugins.register(CodeGenPlugin); - -// 如果您不希望自动加上出码按钮,则可以这样注册 -await plugins.register(CodeGenPlugin, { disableCodeGenActionBtn: true }); -``` - -然后运行你的低代码编辑器项目即可 -- 在设计器的右上角会出现一个“出码”按钮,点击即可在浏览器中出码并预览。 - -### 3)服务端出码接入 - -此代码生成器一开始就是为服务端出码设计的,你可以直接这样来在 node.js 环境中使用: - -1. 安装依赖: `npm install --save @felce/lowcode-code-generator` -2. 引入代码生成器: - -```js -import CodeGenerator from '@felce/lowcode-code-generator'; -``` - -3. 创建项目构建器: - -```js -const projectBuilder = CodeGenerator.solutions.icejs(); -``` - -4. 生成代码 - -```js -const project = await projectBuilder.generateProject( - schema, // 编排搭建出来的 schema -); -``` - -5. 将生成的代码写入到磁盘中(也可以生成一个 zip 包) - -```js -// 写入磁盘 -await CodeGenerator.publishers.disk().publish({ - project, // 上一步生成的 project - outputPath: '/path/to/your/output/dir', // 输出目录 - projectSlug: 'your-project-slug', // 项目标识 -}); - -// 写入到 zip 包 -await CodeGenerator.publishers.zip().publish({ - project, // 上一步生成的 project - outputPath: '/path/to/your/output/dir', // 输出目录 - projectSlug: 'your-project-slug', // 项目标识 -- 对应生成 your-project-slug.zip 文件 -}); -``` - -注:一般来说在服务端出码可以跟 github/gitlab, CI 和 CD 流程等一起串起来使用,通常用于优化性能。 - -### 4)浏览器中出码接入 - -随着现在电脑性能和浏览器技术的发展,出码其实已经不必非得在服务端做了,借助于 Web Worker 特性,可以在浏览器中进行出码: - -1. 安装依赖: `npm install --save @felce/lowcode-code-generator` -2. 引入代码生成器: - -```js -import * as CodeGenerator from '@felce/lowcode-code-generator/standalone-loader'; -``` - -3. 【可选】提前初始化代码生成器: - -```js -// 提前初始化下,这样后面用的时候更快(这个 init 内部会提前准备好创建 worker 的一些资源) -await CodeGenerator.init(); -``` - -4. 出码 - -```js -const project = await CodeGenerator.generateCode({ - solution: 'icejs', // 出码方案 (目前内置有 icejs 和 rax ) - schema, // 编排搭建出来的 schema -}); - -console.log(project); // 出码结果(默认是递归结构描述的,可以传 flattenResult: true 以生成扁平结构的结果) -``` - -注:一般来说在浏览器中出码适合做即时预览功能。 - -5. 下载 zip 包 - -```js -// 写入到 zip 包 -await CodeGenerator.publishers.zip().publish({ - project, // 上一步生成的 project - projectSlug: 'your-project-slug', // 项目标识 -- 对应下载 your-project-slug.zip 文件 -}); -``` - -### 5)自定义出码 - -前端框架灵活多变,默认内置的出码方案很难满足所有人的需求,好在此代码生成器支持非常灵活的插件机制 -- 欢迎参考 ./src/plugins/xxx 来编写您自己的出码插件,然后参考 ./src/solutions/xxx 将各种插件组合成一套适合您的业务场景的出码方案。 - -## 参与共建 - -欢迎参与共建,如何共建请参阅:[./CONTRIBUTING.md](https://github.com/fe-lce/lowcode-engine/blob/main/modules/code-generator/CONTRIBUTING.md) diff --git a/modules/code-generator/babel.config.js b/modules/code-generator/babel.config.js deleted file mode 100644 index c5986f2bc0..0000000000 --- a/modules/code-generator/babel.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../../babel.config'); \ No newline at end of file diff --git a/modules/code-generator/bin/lowcode-code-generator.js b/modules/code-generator/bin/lowcode-code-generator.js deleted file mode 100755 index 79c36c49a0..0000000000 --- a/modules/code-generator/bin/lowcode-code-generator.js +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable no-var */ -/* eslint-disable prefer-arrow-callback */ -/* eslint-disable @typescript-eslint/no-require-imports */ - -var program = require('commander'); - -program - .command('generate', { isDefault: true }) - .description('Generate code from ali lowcode schema') - .requiredOption('-s, --solution ', 'specify the solution to use (icejs/rax/recore)') - .option('-i, --input ', 'specify the input schema file') - .option('-o, --output ', 'specify the output directory', 'generated') - .option('-c, --cwd ', 'specify the working directory', '.') - .option('-q, --quiet', 'be quiet, do not output anything unless get error', false) - .option('-v, --verbose', 'be verbose, output more information', false) - .option('--solution-options ', 'specify the solution options', '{}') - .arguments('[input-schema] ali lowcode schema JSON file') - .action(function doGenerate(inputSchema, command) { - var options = command.opts(); - if (options.cwd) { - process.chdir(options.cwd); - } - - require('../dist/cli') - .run(inputSchema ? [inputSchema] : [], options) - .then((retCode) => { - process.exit(retCode); - }); - }); - -program - .command('init-solution') - .option('-c, --cwd ', 'specify the working directory', '.') - .option('-q, --quiet', 'be quiet, do not output anything unless get error', false) - .option('-v, --verbose', 'be verbose, output more information', false) - .arguments('') - .action(function initSolution(solutionName, command) { - var options = command.opts(); - if (options.cwd) { - process.chdir(options.cwd); - } - - require('../dist/cli') - .initSolution([solutionName], options) - .then((retCode) => { - process.exit(retCode); - }); - }); - -program.parse(process.argv); - diff --git a/modules/code-generator/example-schema.json b/modules/code-generator/example-schema.json deleted file mode 100644 index 5e31b1bea9..0000000000 --- a/modules/code-generator/example-schema.json +++ /dev/null @@ -1,276 +0,0 @@ -{ - "version": "1.0.0", - "componentsMap": [ - { - "componentName": "Button", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Button" - }, - { - "componentName": "Button.Group", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Button", - "subName": "Group" - }, - { - "componentName": "Input", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Input" - }, - { - "componentName": "Form", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Form" - }, - { - "componentName": "Form.Item", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Form", - "subName": "Item" - }, - { - "componentName": "NumberPicker", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "NumberPicker" - }, - { - "componentName": "Select", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Select" - } - ], - "componentsTree": [ - { - "componentName": "Page", - "id": "node$1", - "meta": { - "title": "测试", - "router": "/" - }, - "props": { - "ref": "outerView", - "autoLoading": true - }, - "fileName": "test", - "state": { - "text": "outer" - }, - "lifeCycles": { - "componentDidMount": { - "type": "JSFunction", - "value": "function componentDidMount() { console.log('componentDidMount'); }" - } - }, - "dataSource": { - "list": [ - { - "id": "urlParams", - "type": "urlParams" - }, - - { - "id": "user", - "type": "fetch", - "options": { - "method": "GET", - "uri": "https://shs.xxx.com/mock/1458/demo/user", - "isSync": true - }, - "dataHandler": { - "type": "JSFunction", - "value": "function (response) {\nif (!response.data.success){\n throw new Error(response.data.message);\n }\n return response.data.data;\n}" - } - }, - - { - "id": "orders", - "type": "fetch", - "options": { - "method": "GET", - "uri": "https://shs.xxx.com/mock/1458/demo/orders", - "isSync": true - }, - "dataHandler": { - "type": "JSFunction", - "value": "function (response) {\nif (!response.data.success){\n throw new Error(response.data.message);\n }\n return response.data.data.result;\n}" - } - } - ], - "dataHandler": { - "type": "JSFunction", - "value": "function (dataMap) {\n console.info(\"All datasources loaded:\", dataMap);\n}" - } - }, - "children": [ - { - "componentName": "Form", - "id": "node$2", - "props": { - "labelCol": { - "type": "JSExpression", - "value": "this.state.colNum" - }, - "style": {}, - "ref": "testForm" - }, - "children": [ - { - "componentName": "Form.Item", - "id": "node$3", - "props": { - "label": "姓名:", - "name": "name", - "initValue": "李雷" - }, - "children": [ - { - "componentName": "Input", - "id": "node$4", - "props": { - "placeholder": "请输入", - "size": "medium", - "style": { - "width": 320 - } - } - } - ] - }, - { - "componentName": "Form.Item", - "id": "node$5", - "props": { - "label": "年龄:", - "name": "age", - "initValue": "22" - }, - "children": [ - { - "componentName": "NumberPicker", - "id": "node$6", - "props": { - "size": "medium", - "type": "normal" - } - } - ] - }, - { - "componentName": "Form.Item", - "id": "node$7", - "props": { - "label": "职业:", - "name": "profession" - }, - "children": [ - { - "componentName": "Select", - "id": "node$8", - "props": { - "dataSource": [ - { - "label": "教师", - "value": "t" - }, - { - "label": "医生", - "value": "d" - }, - { - "label": "歌手", - "value": "s" - } - ] - } - } - ] - }, - { - "componentName": "Div", - "id": "node$9", - "props": { - "style": { - "textAlign": "center" - } - }, - "children": [ - { - "componentName": "Button.Group", - "id": "node$a", - "props": {}, - "children": [ - { - "componentName": "Button", - "id": "node$b", - "condition": { - "type": "JSExpression", - "value": "this.index >= 1" - }, - "loop": ["a", "b", "c"], - "props": { - "type": "primary", - "style": { - "margin": "0 5px 0 5px" - } - }, - "children": [ - { - "type": "JSExpression", - "value": "this.item" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ], - "constants": { - "ENV": "prod", - "DOMAIN": "xxx.xxx.com" - }, - "css": "body {font-size: 12px;} .table { width: 100px;}", - "config": { - "sdkVersion": "1.0.3", - "historyMode": "hash", - "targetRootID": "J_Container", - "layout": { - "componentName": "BasicLayout", - "props": { - "logo": "...", - "name": "测试网站" - } - }, - "theme": { - "package": "@alife/theme-fusion", - "version": "^0.1.0", - "primary": "#ff9966" - } - }, - "meta": { - "name": "demo应用", - "git_group": "appGroup", - "project_name": "app_demo", - "description": "这是一个测试应用", - "spma": "spa23d", - "creator": "Test" - } -} diff --git a/modules/code-generator/example-schema.json5 b/modules/code-generator/example-schema.json5 deleted file mode 100644 index 4ab02999ec..0000000000 --- a/modules/code-generator/example-schema.json5 +++ /dev/null @@ -1,276 +0,0 @@ -{ - version: '1.0.0', - componentsMap: [ - { - componentName: 'Button', - package: '@alifd/next', - version: '1.19.18', - destructuring: true, - exportName: 'Button', - }, - { - componentName: 'Button.Group', - package: '@alifd/next', - version: '1.19.18', - destructuring: true, - exportName: 'Button', - subName: 'Group', - }, - { - componentName: 'Input', - package: '@alifd/next', - version: '1.19.18', - destructuring: true, - exportName: 'Input', - }, - { - componentName: 'Form', - package: '@alifd/next', - version: '1.19.18', - destructuring: true, - exportName: 'Form', - }, - { - componentName: 'Form.Item', - package: '@alifd/next', - version: '1.19.18', - destructuring: true, - exportName: 'Form', - subName: 'Item', - }, - { - componentName: 'NumberPicker', - package: '@alifd/next', - version: '1.19.18', - destructuring: true, - exportName: 'NumberPicker', - }, - { - componentName: 'Select', - package: '@alifd/next', - version: '1.19.18', - destructuring: true, - exportName: 'Select', - }, - ], - componentsTree: [ - { - componentName: 'Page', - id: 'node$1', - meta: { - title: '测试', - router: '/', - }, - props: { - ref: 'outerView', - autoLoading: true, - }, - fileName: 'test', - state: { - text: 'outer', - }, - lifeCycles: { - componentDidMount: { - type: 'JSFunction', - value: "function componentDidMount() { console.log('componentDidMount'); }", - }, - }, - dataSource: { - list: [ - { - id: 'urlParams', - type: 'urlParams', - }, - - { - id: 'user', - type: 'fetch', - options: { - method: 'GET', - uri: 'https://shs.xxx.com/mock/1458/demo/user', - isSync: true, - }, - dataHandler: { - type: 'JSFunction', - value: 'function (response) {\nif (!response.data.success){\n throw new Error(response.data.message);\n }\n return response.data.data;\n}', - }, - }, - - { - id: 'orders', - type: 'fetch', - options: { - method: 'GET', - uri: 'https://shs.xxx.com/mock/1458/demo/orders', - isSync: true, - }, - dataHandler: { - type: 'JSFunction', - value: 'function (response) {\nif (!response.data.success){\n throw new Error(response.data.message);\n }\n return response.data.data.result;\n}', - }, - }, - ], - dataHandler: { - type: 'JSFunction', - value: 'function (dataMap) {\n console.info("All datasources loaded:", dataMap);\n}', - }, - }, - children: [ - { - componentName: 'Form', - id: 'node$2', - props: { - labelCol: { - type: 'JSExpression', - value: 'this.state.colNum', - }, - style: {}, - ref: 'testForm', - }, - children: [ - { - componentName: 'Form.Item', - id: 'node$3', - props: { - label: '姓名:', - name: 'name', - initValue: '李雷', - }, - children: [ - { - componentName: 'Input', - id: 'node$4', - props: { - placeholder: '请输入', - size: 'medium', - style: { - width: 320, - }, - }, - }, - ], - }, - { - componentName: 'Form.Item', - id: 'node$5', - props: { - label: '年龄:', - name: 'age', - initValue: '22', - }, - children: [ - { - componentName: 'NumberPicker', - id: 'node$6', - props: { - size: 'medium', - type: 'normal', - }, - }, - ], - }, - { - componentName: 'Form.Item', - id: 'node$7', - props: { - label: '职业:', - name: 'profession', - }, - children: [ - { - componentName: 'Select', - id: 'node$8', - props: { - dataSource: [ - { - label: '教师', - value: 't', - }, - { - label: '医生', - value: 'd', - }, - { - label: '歌手', - value: 's', - }, - ], - }, - }, - ], - }, - { - componentName: 'Div', - id: 'node$9', - props: { - style: { - textAlign: 'center', - }, - }, - children: [ - { - componentName: 'Button.Group', - id: 'node$a', - props: {}, - children: [ - { - componentName: 'Button', - id: 'node$b', - condition: { - type: 'JSExpression', - value: 'this.index >= 1', - }, - loop: ['a', 'b', 'c'], - props: { - type: 'primary', - style: { - margin: '0 5px 0 5px', - }, - }, - children: [ - { - type: 'JSExpression', - value: 'this.item', - }, - ], - }, - ], - }, - ], - }, - ], - }, - ], - }, - ], - constants: { - ENV: 'prod', - DOMAIN: 'xxx.xxx.com', - }, - css: 'body {font-size: 12px;} .table { width: 100px;}', - config: { - sdkVersion: '1.0.3', - historyMode: 'hash', - targetRootID: 'J_Container', - layout: { - componentName: 'BasicLayout', - props: { - logo: '...', - name: '测试网站', - }, - }, - theme: { - package: '@alife/theme-fusion', - version: '^0.1.0', - primary: '#ff9966', - }, - }, - meta: { - name: 'demo应用', - git_group: 'appGroup', - project_name: 'app_demo', - description: '这是一个测试应用', - spma: 'spa23d', - creator: 'Test', - }, -} diff --git a/modules/code-generator/jest.config.js b/modules/code-generator/jest.config.js deleted file mode 100644 index 0f908143da..0000000000 --- a/modules/code-generator/jest.config.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - transformIgnorePatterns: ['/node_modules/(?!core-js)/'], - moduleFileExtensions: ['ts', 'tsx', 'js', 'json'], - collectCoverage: false, - collectCoverageFrom: ['src/**/*.{ts,tsx}', '!**/node_modules/**', '!**/vendor/**'], - testMatch: ['/tests/**/*.test.ts'], - setupFiles: ['./jest.setup.js'], -}; diff --git a/modules/code-generator/jest.setup.js b/modules/code-generator/jest.setup.js deleted file mode 100644 index 67da56145a..0000000000 --- a/modules/code-generator/jest.setup.js +++ /dev/null @@ -1,12 +0,0 @@ -// 对于 standalone 模式的专门 polyfills -if (process.env.TEST_TARGET === 'standalone') { - // 模拟浏览器环境 - global.window = global; - global.self = global; - - // 将所有测试用例里面的 './src' 都替换为 './dist/standalone' - jest.mock('./src', () => require('./dist/standalone')); -} - -// 如果在调试模式下,则不限制超时时间 -jest.setTimeout(typeof v8debug === 'object' ? Infinity : 30 * 1000); diff --git a/modules/code-generator/package.json b/modules/code-generator/package.json deleted file mode 100644 index 48f7c423aa..0000000000 --- a/modules/code-generator/package.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "name": "@felce/lowcode-code-generator", - "version": "1.1.7", - "description": "出码引擎 for LowCode Engine", - "license": "MIT", - "main": "lib/index.js", - "module": "es/index.js", - "typings": "types/index.d.ts", - "files": [ - "bin", - "lib", - "es", - "demo", - "dist", - "types", - "standalone", - "standalone-worker", - "standalone-loader", - "loader", - "CHANGELOG.md", - "README.md", - "CONTRIBUTING.md", - "example-schema.json", - "example-schema.json5" - ], - "bin": { - "lowcode-code-generator": "bin/lowcode-code-generator.js" - }, - "scripts": { - "start": "jest --watchAll", - "build": "npm run clean && node scripts/build", - "build:standalone": "node scripts/build-standalone", - "clean": "rimraf es lib dist types generated demo coverage output test-cases/*/*/actual", - "lint": "eslint --ext .jsx,.js,.ts,.tsx src/", - "lintfix": "eslint --ext .jsx,.js,.ts,.tsx --fix src/", - "check:types": "tsc --noEmit", - "template": "node ./scripts/build-template-static-files.js", - "test": "npm run test:normal && npm run test:standalone", - "test:normal": "jest", - "test:standalone": "node scripts/test-standalone", - "test:cov": "jest --coverage", - "test:update-snapshots": "cross-env UPDATE_EXPECTED=true jest -u", - "analyze:standalone": "ANALYZE=true node scripts/build-standalone", - "release:beta": "standard-version -t @felce/lowcode-code-generator\\@ -r patch --prerelease beta && git push --follow-tags && npm publish --tag beta", - "release:patch": "standard-version -t @felce/lowcode-code-generator\\@ -r patch && git push --follow-tags && npm publish", - "release:minor": "standard-version -t @felce/lowcode-code-generator\\@ -r minor && git push --follow-tags && npm publish", - "prepublishOnly": "npm run build", - "demo": "node bin/lowcode-code-generator.js -i example-schema.json -o demo -s icejs" - }, - "standard-version": { - "skip": { - "changelog": true - } - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged", - "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" - } - }, - "lint-staged": { - "**/*.{js,jsx,ts,tsx}": "eslint" - }, - "dependencies": { - "@felce/lowcode-types": "^1.0.0", - "@babel/generator": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/runtime": "^7.12.5", - "@babel/traverse": "^7.12.12", - "@babel/types": "^7.12.12", - "@types/debug": "^4.1.7", - "@types/fs-extra": "^9.0.12", - "@types/glob": "^7.2.0", - "@types/lodash": "^4.14.162", - "@types/node-fetch": "2.x", - "@types/qs": "^6.9.6", - "@types/semver": "^7.3.4", - "buffer": "^6.0.3", - "chalk": "^4.1.0", - "change-case": "^3.1.0", - "commander": "^6.1.0", - "debug": "^4.3.2", - "file-saver": "^2.0.5", - "fp-ts": "^2.11.9", - "fs-extra": "9.x", - "glob": "^7.2.0", - "html-entities": "^2.3.2", - "json5": "^2.2.0", - "jsonc": "^2.0.0", - "jszip": "^3.5.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "mock-fs": "^5.1.2", - "moment": "^2.29.1", - "nanomatch": "^1.2.13", - "node-fetch": "2.x", - "path-browserify": "^1.0.1", - "prettier": "^2.5.1", - "qs": "^6.10.1", - "semver": "^7.3.4", - "short-uuid": "^3.1.1", - "babel-jest": "^26.5.2", - "tslib": "^2.3.1" - }, - "browser": { - "path": "path-browserify", - "lodash": "lodash-es", - "prettier": "prettier/standalone" - }, - "devDependencies": { - "@iceworks/spec": "^1.4.2", - "@types/babel__traverse": "^7.11.0", - "@types/file-saver": "^2.0.7", - "@types/jest": "^27.0.2", - "@types/lodash": "^4.14.162", - "@types/node": "^14.14.20", - "@types/prettier": "^2.4.2", - "@typescript-eslint/eslint-plugin": "^4.12.0", - "@typescript-eslint/parser": "^4.12.0", - "concurrently": "^6.5.1", - "cross-env": "^7.0.3", - "esbuild": "^0.14.5", - "esbuild-plugin-alias": "^0.2.1", - "esbuild-plugin-ignore": "^1.1.0", - "esbuild-visualizer": "^0.3.1", - "eslint": "^7.17.0", - "eslint-config-ali": "^11.4.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-react": "^7.22.0", - "eslint-plugin-react-hooks": "^4.2.0", - "jest": "^26.5.2", - "jest-util": "^27.4.2", - "rimraf": "^3.0.2", - "standard-version": "^9.1.1", - "ts-jest": "^26.5.2", - "ts-loader": "^6.2.2", - "ts-node": "^8.10.2", - "tsconfig-paths": "^3.9.0", - "typescript": "4.x", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": ">=10.0.0" - }, - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "repository": { - "type": "http", - "url": "https://github.com/fe-lce/lowcode-engine/tree/main/modules/code-generator" - }, - "bugs": "https://github.com/fe-lce/lowcode-engine/issues", - "homepage": "https://github.com/fe-lce/lowcode-engine/#readme" -} diff --git a/modules/code-generator/scripts/build-cli.js b/modules/code-generator/scripts/build-cli.js deleted file mode 100644 index 40fcb731a6..0000000000 --- a/modules/code-generator/scripts/build-cli.js +++ /dev/null @@ -1,56 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable @typescript-eslint/no-require-imports */ -const esbuild = require('esbuild'); -const ignorePlugin = require('esbuild-plugin-ignore'); - -// 执行脚本 -(async () => { - try { - console.log('building...'); - const result = await esbuild.build({ - entryPoints: ['src/cli/index.ts'], - outfile: 'dist/cli.js', - bundle: true, - platform: 'node', - target: ['node10'], - format: 'cjs', - sourcemap: true, - sourcesContent: true, - plugins: [ - ignorePlugin([ - // @felce/lowcode-types 中误依赖了 react,这里忽略下 - { - resourceRegExp: /^react$/, - contextRegExp: /./, - }, - { - resourceRegExp: /setter-config/, - contextRegExp: /lowcode-types/, - }, - ]), - ], - define: {}, - treeShaking: true, - minify: false, - minifyWhitespace: false, - minifyIdentifiers: false, - minifySyntax: false, - legalComments: 'external', - external: Object.keys(require('../package.json').dependencies), - }); - if (result.errors.length > 0) { - throw result.errors; - } - - if (result.warnings.length > 0) { - result.warnings.forEach((warnings) => { - console.warn(warnings); - }); - } - - console.log('done'); - } catch (e) { - console.error(e); - process.exit(1); - } -})(); diff --git a/modules/code-generator/scripts/build-standalone-loader.js b/modules/code-generator/scripts/build-standalone-loader.js deleted file mode 100644 index bee318dddb..0000000000 --- a/modules/code-generator/scripts/build-standalone-loader.js +++ /dev/null @@ -1,73 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable @typescript-eslint/no-require-imports */ -const esbuild = require('esbuild'); - -const packageVersion = require('../package.json').version; -console.log('build standalone-loader: packageVersion=%s', packageVersion); - -const enableAnalyze = process.env.ANALYZE === 'true'; -const buildConfig = { - entryPoints: ['src/standalone-loader.ts'], - outfile: 'dist/standalone-loader.js', - metafile: enableAnalyze, - bundle: true, - target: ['chrome69'], - format: 'cjs', - sourcemap: true, - sourcesContent: true, - external: Object.keys(require('../package.json').dependencies), - define: { - process: JSON.stringify({ - env: { - NODE_ENV: 'production', - STANDALONE: 'true', - }, - }), - __PACKAGE_VERSION__: JSON.stringify(packageVersion), - }, - minify: false, - minifyWhitespace: false, - minifyIdentifiers: false, - minifySyntax: false, - legalComments: 'external', - treeShaking: true, -}; - -// 执行脚本 -(async () => { - try { - console.log('building cjs...'); - const result = await esbuild.build({ - ...buildConfig, - }); - if (result.errors.length > 0) { - throw result.errors; - } - - if (result.warnings.length > 0) { - result.warnings.forEach((warnings) => { - console.warn(warnings); - }); - } - - const result2 = await esbuild.build({ - ...buildConfig, - outfile: buildConfig.outfile.replace(/\.js$/, '.esm.js'), - format: 'esm', - }); - if (result2.errors.length > 0) { - throw result2.errors; - } - - if (result2.warnings.length > 0) { - result2.warnings.forEach((warnings) => { - console.warn(warnings); - }); - } - - console.log('done'); - } catch (e) { - console.error(e); - process.exit(1); - } -})(); diff --git a/modules/code-generator/scripts/build-standalone-worker.js b/modules/code-generator/scripts/build-standalone-worker.js deleted file mode 100644 index 3134566b24..0000000000 --- a/modules/code-generator/scripts/build-standalone-worker.js +++ /dev/null @@ -1,107 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable @typescript-eslint/no-require-imports */ -const esbuild = require('esbuild'); -const { spawnSync } = require('child_process'); -const ignorePlugin = require('esbuild-plugin-ignore'); -const fs = require('fs'); -const path = require('path'); - -const enableAnalyze = process.env.ANALYZE === 'true'; -const buildConfig = { - entryPoints: ['src/standalone-worker.ts'], - outfile: 'dist/standalone-worker.js', - metafile: enableAnalyze, - bundle: true, - target: ['chrome69'], - format: 'iife', - sourcemap: true, - sourcesContent: true, - plugins: [ - ignorePlugin([ - { - resourceRegExp: /^fs$/, - contextRegExp: /./, - }, - // @felce/lowcode-types 中误依赖了 react,这里忽略下 - { - resourceRegExp: /^react$/, - contextRegExp: /./, - }, - { - resourceRegExp: /setter-config/, - contextRegExp: /lowcode-types|..[\\/]types/, - }, - ]), - ], - define: { - process: JSON.stringify({ - env: { - NODE_ENV: 'production', - STANDALONE: 'true', - }, - }), - }, - treeShaking: true, -}; - -// 执行脚本 -(async () => { - try { - console.log('building...'); - const result = await esbuild.build({ - ...buildConfig, - minify: false, - minifyWhitespace: false, - minifyIdentifiers: false, - minifySyntax: false, - legalComments: 'external', - }); - if (result.errors.length > 0) { - throw result.errors; - } - - if (result.warnings.length > 0) { - result.warnings.forEach((warnings) => { - console.warn(warnings); - }); - } - - if (enableAnalyze) { - const metaFile = buildConfig.outfile.replace(/\.js/, '.meta.json'); - const statsFile = buildConfig.outfile.replace(/\.js/, '.stats.html'); - fs.writeFileSync(metaFile, JSON.stringify(result.metafile || {}), { encoding: 'utf-8' }); - spawnSync('npx', ['esbuild-visualizer', '--metadata', metaFile, '--filename', statsFile], { - shell: true, - stdio: 'inherit', - }); - spawnSync('open', [statsFile], { - shell: true, - stdio: 'inherit', - }); - return; - } - - const outFileContent = fs.readFileSync(buildConfig.outfile, 'utf-8'); - - console.log('minifying...'); - const minifiedOutFile = buildConfig.outfile.replace(/\.js$/, '.min.js'); - const minifiedResult = esbuild.transformSync(outFileContent, { - minify: true, - sourcemap: true, - sourcesContent: true, - sourcefile: path.basename(buildConfig.outfile), - }); - - fs.writeFileSync(minifiedOutFile, minifiedResult.code, { encoding: 'utf-8' }); - fs.writeFileSync(`${minifiedOutFile}.map`, minifiedResult.map, { encoding: 'utf-8' }); - - minifiedResult.warnings.forEach((warnings) => { - console.log(warnings); - }); - - console.log('done'); - } catch (e) { - console.error(e); - process.exit(1); - } -})(); diff --git a/modules/code-generator/scripts/build-standalone.js b/modules/code-generator/scripts/build-standalone.js deleted file mode 100644 index 804a7754db..0000000000 --- a/modules/code-generator/scripts/build-standalone.js +++ /dev/null @@ -1,135 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable @typescript-eslint/no-require-imports */ -const esbuild = require('esbuild'); -const { spawnSync } = require('child_process'); -const ignorePlugin = require('esbuild-plugin-ignore'); -const fs = require('fs'); -const path = require('path'); - -const UMD_GLOBAL_NAME = 'AliLowCodeCodeGenerator'; - -const enableAnalyze = process.env.ANALYZE === 'true'; -const buildConfig = { - entryPoints: ['src/standalone.ts'], - outfile: 'dist/standalone.js', - metafile: enableAnalyze, - bundle: true, - target: ['chrome69'], - format: 'cjs', - sourcemap: true, - sourcesContent: true, - plugins: [ - ignorePlugin([ - { - resourceRegExp: /^fs$/, - contextRegExp: /./, - }, - // @felce/lowcode-types 中误依赖了 react,这里忽略下 - { - resourceRegExp: /^react$/, - contextRegExp: /./, - }, - { - resourceRegExp: /setter-config/, - contextRegExp: /lowcode-types|..[\\/]types/, - }, - ]), - ], - define: { - process: JSON.stringify({ - env: { - NODE_ENV: 'production', - STANDALONE: 'true', - }, - }), - }, - treeShaking: true, -}; - -// 执行脚本 -(async () => { - try { - console.log('building...'); - const result = await esbuild.build({ - ...buildConfig, - minify: false, - minifyWhitespace: false, - minifyIdentifiers: false, - minifySyntax: false, - legalComments: 'external', - }); - if (result.errors.length > 0) { - throw result.errors; - } - - if (result.warnings.length > 0) { - result.warnings.forEach((warnings) => { - console.warn(warnings); - }); - } - - if (enableAnalyze) { - const metaFile = buildConfig.outfile.replace(/\.js/, '.meta.json'); - const statsFile = buildConfig.outfile.replace(/\.js/, '.stats.html'); - fs.writeFileSync(metaFile, JSON.stringify(result.metafile || {}), { encoding: 'utf-8' }); - spawnSync('npx', ['esbuild-visualizer', '--metadata', metaFile, '--filename', statsFile], { - shell: true, - stdio: 'inherit', - }); - spawnSync('open', [statsFile], { - shell: true, - stdio: 'inherit', - }); - return; - } - - const outFileContent = transformCjsToUmdFile(buildConfig.outfile); - - console.log('minifying...'); - const minifiedOutFile = buildConfig.outfile.replace(/\.js$/, '.min.js'); - const minifiedResult = esbuild.transformSync(outFileContent, { - minify: true, - sourcemap: true, - sourcesContent: true, - sourcefile: path.basename(buildConfig.outfile), - }); - - fs.writeFileSync(minifiedOutFile, minifiedResult.code, { encoding: 'utf-8' }); - fs.writeFileSync(`${minifiedOutFile}.map`, minifiedResult.map, { encoding: 'utf-8' }); - - minifiedResult.warnings.forEach((warnings) => { - console.log(warnings); - }); - - console.log('done'); - } catch (e) { - console.error(e); - process.exit(1); - } -})(); - -// esbuild 没有直接提供 UMD 格式,所以这里我们自行包装转换下 -function transformCjsToUmdFile(file) { - const globalName = UMD_GLOBAL_NAME; - const fileContent = fs.readFileSync(file, { encoding: 'utf-8' }); - const transformedFileContent = `(function (global, factory) { - if (typeof exports === 'object' && typeof module !== 'undefined'){ - factory(module, exports); - } else if (typeof define === 'function' && define.amd) { - define(['module', 'exports'], factory); - } else { - global = global || self; - var m = { exports: {} }; - factory(m, m.exports); - global.${globalName} = m.exports; - } -}(this, function (module, exports) { - 'use strict'; - ${fileContent}; - return module.exports; -})); -`; - - fs.writeFileSync(file, transformedFileContent, { encoding: 'utf-8' }); - return transformedFileContent; -} diff --git a/modules/code-generator/scripts/build-template-static-files.js b/modules/code-generator/scripts/build-template-static-files.js deleted file mode 100644 index c802498a06..0000000000 --- a/modules/code-generator/scripts/build-template-static-files.js +++ /dev/null @@ -1,125 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable @typescript-eslint/quotes */ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -/* eslint-disable @typescript-eslint/no-require-imports */ -// @ts-check -// 这个文件是用来构建模板中的静态文件的 -const fs = require('fs'); -const glob = require('glob'); -const path = require('path'); -const JSON5 = require('json5'); -const { spawnSync } = require('child_process'); - -const PROJECT_ROOT = path.join(__dirname, '..'); - -const TEMPLATES = [ - { - sourceDir: path.join(PROJECT_ROOT, 'static-files/rax'), - outputDir: path.join(PROJECT_ROOT, 'src/plugins/project/framework/rax/template'), - }, -]; - -try { - TEMPLATES.forEach(buildTemplateStaticFiles); - console.log('All done.'); -} catch (e) { - console.error(e); - process.exit(1); -} - -function buildTemplateStaticFiles({ sourceDir, outputDir }) { - console.log('processing %s template...', path.dirname(sourceDir)); - - // 扫描所有的目录 - const sourceFiles = glob.sync('**/*', { - nodir: true, - dot: true, - cwd: sourceDir, - }); - - console.log('got %d files: %o', sourceFiles.length, sourceFiles); - - const staticFiles = { - imports: [], - runs: [], - }; - - // 生成对应的文件 - sourceFiles.forEach((sourceFileName, index) => { - console.log('processing %s', sourceFileName); - const sourceFileContent = fs.readFileSync(path.join(sourceDir, sourceFileName), 'utf-8'); - const sourceFileRealName = sourceFileName.replace(/\.template$/, ''); - const outputFileName = `${sourceFileRealName}.ts`; - const outputFileFullPath = path.join(outputDir, 'files', outputFileName); - - const sourceFileExtName = path.extname(sourceFileRealName); - const sourceFileBaseName = path.basename(sourceFileRealName, sourceFileExtName); - - // 确保目录存在 - fs.mkdirSync(path.dirname(outputFileFullPath), { recursive: true }); - - // 写入文件 - fs.writeFileSync( - outputFileFullPath, - [ - `/* eslint-disable max-len */`, - `/* Note: this file is generated by "npm run template", please dont modify this file directly */`, - `/* -- instead, you should modify "${path.relative( - PROJECT_ROOT, - path.join(sourceDir, sourceFileName), - )}" and run "npm run template" */`, - `import { ResultFile } from '@felce/lowcode-types';`, - '', - `export default function getFile(): [string[], ResultFile] {`, - ` return ${JSON5.stringify([ - // 文件目录: - path.dirname(sourceFileRealName).split(path.sep).filter(Boolean), - // 文件名和内容: - { - name: sourceFileBaseName, - ext: sourceFileExtName.replace(/^\./, ''), - content: sourceFileContent, - }, - ])};`, - `}`, - '', - ].join('\n'), - { - encoding: 'utf-8', - }, - ); - - staticFiles.imports.push(`import file${index} from './files/${sourceFileRealName}';`); - - staticFiles.runs.push(` runFileGenerator(root, file${index})`); - }); - - console.log('generating static-files.ts...'); - fs.writeFileSync( - path.join(outputDir, 'static-files.ts'), - [ - `/* Note: this file is generated by "npm run template", please dont modify this file directly */`, - `import { ResultDir } from '@felce/lowcode-types'; - - import { createResultDir } from '../../../../../utils/resultHelper'; - import { runFileGenerator } from '../../../../../utils/templateHelper';`, - ...staticFiles.imports, - '', - `export function generateStaticFiles(root = createResultDir('.')): ResultDir {`, - ...staticFiles.runs, - ` return root;`, - `}`, - '', - ].join('\n'), - { encoding: 'utf-8' }, - ); - - // prettier 一把 - console.log('run prettier...'); - spawnSync('npx', ['prettier', '--write', `${outputDir}`], { - stdio: 'inherit', - shell: true, - }); - - console.log('done %s', path.basename(sourceDir)); -} diff --git a/modules/code-generator/scripts/build-types b/modules/code-generator/scripts/build-types deleted file mode 100755 index 61414063c6..0000000000 --- a/modules/code-generator/scripts/build-types +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -echo building types... -tsc --outDir types --declaration --emitDeclarationOnly && \ - echo built types... && \ - rm -rf types/packages && \ - mv types/modules/code-generator/src/* types/ && \ - rm -rf types/modules - - diff --git a/modules/code-generator/scripts/build.js b/modules/code-generator/scripts/build.js deleted file mode 100644 index 841eacab55..0000000000 --- a/modules/code-generator/scripts/build.js +++ /dev/null @@ -1,75 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable @typescript-eslint/no-require-imports */ -const _ = require('lodash'); -const esbuild = require('esbuild'); -const concurrently = require('concurrently'); -const argv = require('yargs-parser')(process.argv.slice(2)); -const packageJson = require('../package.json'); - -if (!argv.format) { - buildAll(); -} else { - buildFormat(argv.format, argv.out || 'dist'); -} - -function buildAll() { - concurrently( - [ - { name: 'build:types', command: 'sh scripts/build-types' }, - { name: 'build:cjs', command: 'node scripts/build --format=cjs --out=lib' }, - { name: 'build:esm', command: 'node scripts/build --format=esm --out=es' }, - { name: 'build:standalone', command: 'node scripts/build-standalone' }, - { name: 'build:standalone-worker', command: 'node scripts/build-standalone-worker' }, - { name: 'build:standalone-loader', command: 'node scripts/build-standalone-loader' }, - { name: 'build:cli', command: 'node scripts/build-cli' }, - ], - { - prefix: 'name', - killOthers: ['failure'], - restartTries: 0, - }, - ).then( - () => { - console.log('all done.'); - }, - () => { - process.exit(1); - }, - ); -} - -function buildFormat(format, outDir) { - try { - console.log('building %s...', format); - const startTime = Date.now(); - const result = esbuild.buildSync({ - entryPoints: ['src/index.ts'], - outfile: `${outDir}/index.js`, - bundle: true, - platform: 'node', - target: ['node10'], - format, - sourcemap: true, - sourcesContent: true, - define: {}, - treeShaking: true, - external: _.keys(packageJson.dependencies), - minify: false, - legalComments: 'external', - }); - if (result.errors.length > 0) { - throw result.errors; - } - - if (result.warnings.length > 0) { - result.warnings.forEach((warnings) => { - console.warn(warnings); - }); - } - - console.log('built %s in %ds', format, ((Date.now() - startTime) / 1000).toFixed(2)); - } catch (e) { - console.error(e); - process.exit(1); - } -} diff --git a/modules/code-generator/scripts/move-files-to-build-dest.js b/modules/code-generator/scripts/move-files-to-build-dest.js deleted file mode 100644 index 736df9968f..0000000000 --- a/modules/code-generator/scripts/move-files-to-build-dest.js +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -const fs = require('fs'); -const { spawnSync } = require('child_process'); - -const BUILD_DEST = process.env.BUILD_DEST || '.package'; - -fs.mkdirSync(BUILD_DEST, { recursive: true }); - -const distFiles = [...require('../package.json').files, 'package.json']; - -distFiles.forEach((file) => { - console.log('mv %s', file); - if (file === BUILD_DEST) { - fs.mkdirSync(`${BUILD_DEST}/${file}`, { recursive: true }); - spawnSync('mv', [`${file}/*`, `${BUILD_DEST}/${file}/`], { shell: true, stdio: 'inherit' }); - } -}); - -distFiles.forEach((file) => { - console.log('mv %s', file); - if (file !== BUILD_DEST) { - spawnSync('mv', [file, `${BUILD_DEST}/${file}`], { shell: true, stdio: 'inherit' }); - } -}); diff --git a/modules/code-generator/scripts/run-demo-project b/modules/code-generator/scripts/run-demo-project deleted file mode 100755 index 1ad7dce234..0000000000 --- a/modules/code-generator/scripts/run-demo-project +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env node - -// @ts-check -const program = require('commander'); -const { spawnSync } = require('child_process'); -const glob = require('glob'); -const fs = require('fs'); -const path = require('path'); -const _ = require('lodash'); - -program - .option('--npm ', 'specify the npm command location or alias') - .arguments('') - .action((project, options) => { - try { - if (!fs.existsSync(project)) { - throw new Error(`Project ${project} does not exist`); - } - - const getProjectActualPath = [ - () => path.resolve(process.cwd(), project), - () => - path.resolve( - process.cwd(), - path.join( - project, - path.dirname(glob.sync('*/package.json', { cwd: project })[0] || ''), - ), - ), - ] - .map((x) => _.memoize(x)) - .find((x) => fs.existsSync(path.join(x(), 'package.json'))); - - if (!getProjectActualPath) { - throw new Error(`Project ${project} is not a valid project(no package.json)`); - } - - const projectActualPath = getProjectActualPath(); - if (path.resolve(process.cwd(), project) !== projectActualPath) { - console.log('Changing directory to', path.relative(process.cwd(), projectActualPath)); - } - - process.chdir(projectActualPath); - - const npm = options.npm || 'npm'; - const cmd = `${npm} install && ${npm} start`; - console.log('# %s', cmd); - spawnSync(cmd, { stdio: 'inherit', shell: true }); - } catch (err) { - console.log(err); - process.exit(1); - } - }); - -program.parse(process.argv); diff --git a/modules/code-generator/scripts/test-standalone.js b/modules/code-generator/scripts/test-standalone.js deleted file mode 100644 index 55d876d573..0000000000 --- a/modules/code-generator/scripts/test-standalone.js +++ /dev/null @@ -1,17 +0,0 @@ -// 测试 standalone 模式的基本功能 -// 注1:指定文件测试就直接在后面加文件: node scripts/test-standalone.js tests/public/rax-app.test.ts -// 注2:指定测试用例就直接在后面加`-t xxx`: node scripts/test-standalone.js tests/public/rax-app.test.ts -t demo01 -const { spawnSync } = require('child_process'); - -// 一定要先构建 -spawnSync('npm', ['run', 'build:standalone'], { shell: true, stdio: 'inherit' }); - -// 然后只执行特定的一些测试用例 -spawnSync('npx', ['jest', ...process.argv.slice(2)], { - env: { - ...process.env, - TEST_TARGET: 'standalone', - }, - shell: true, - stdio: 'inherit', -}); diff --git a/modules/code-generator/src/analyzer/componentAnalyzer.ts b/modules/code-generator/src/analyzer/componentAnalyzer.ts deleted file mode 100644 index 8a504aeec7..0000000000 --- a/modules/code-generator/src/analyzer/componentAnalyzer.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { IPublicTypeNodeSchema, IPublicTypeCompositeObject } from '@felce/lowcode-types'; -import type { TComponentAnalyzer } from '../types'; - -import { handleSubNodes } from '../utils/schema'; - -export const componentAnalyzer: TComponentAnalyzer = (container) => { - let hasRefAttr = false; - const nodeValidator = (n: IPublicTypeNodeSchema) => { - if (n.props) { - const props = n.props as IPublicTypeCompositeObject; - if (props.ref) { - hasRefAttr = true; - } - } - }; - - nodeValidator(container); - - if (!hasRefAttr && container.children) { - // eslint-disable-next-line @typescript-eslint/no-invalid-void-type - handleSubNodes( - container.children, - { - node: nodeValidator, - }, - { - rerun: true, - }, - ); - } - - return { - isUsingRef: hasRefAttr, - }; -}; diff --git a/modules/code-generator/src/cli/index.ts b/modules/code-generator/src/cli/index.ts deleted file mode 100644 index fcbbc8a349..0000000000 --- a/modules/code-generator/src/cli/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './run'; -export * from './init-solution'; diff --git a/modules/code-generator/src/cli/init-solution.ts b/modules/code-generator/src/cli/init-solution.ts deleted file mode 100644 index 63ee66ea87..0000000000 --- a/modules/code-generator/src/cli/init-solution.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* eslint-disable no-console */ -import * as fs from 'fs-extra'; -import * as path from 'path'; -import chalk from 'chalk'; -import * as changeCase from 'change-case'; -import { getErrorMessage } from '../utils/errors'; -import { getLowcodeSolutionTemplateFiles } from './solutions/example-solution'; - - -export async function initSolution(args: string[], options: { - quiet?: boolean; - verbose?: boolean; -}) { - try { - const cwd = process.cwd(); - let solutionName = args[0] || 'hello'; - let solutionPath = path.resolve(cwd, solutionName); - if (solutionName === '.') { - solutionName = path.basename(cwd); - solutionPath = cwd; - } - - const modifyFileContent = (content: string) => - content - .replace(/hello-world/g, changeCase.paramCase(solutionName)) - .replace(/HelloWorld/g, changeCase.pascalCase(solutionName)) - .replace(/Hello World/g, changeCase.titleCase(solutionName)); - - await ensureDirExists(solutionPath); - - const templateFiles = getLowcodeSolutionTemplateFiles(); - for (const templateFile of templateFiles) { - if (options.verbose) { - console.log('%s', chalk.gray(`creating file ${templateFile.file}`)); - } - - const templateFilePath = path.join(solutionPath, templateFile.file); - await ensureDirExists(path.dirname(templateFilePath)); - await fs.writeFile(templateFilePath, modifyFileContent(templateFile.content), { encoding: 'utf-8' }); - } - - if (!options.quiet) { - console.log('%s', chalk.green(`solution ${solutionName} created successfully`)); - } - - return 0; - } catch (e) { - console.log(chalk.red(getErrorMessage(e) || `Unexpected error: ${e}`)); - if (typeof e === 'object' && (e as { stack: string } | null)?.stack && options.verbose) { - console.log(chalk.gray((e as { stack: string }).stack)); - } - return 1; - } -} - -async function ensureDirExists(dirPath: string) { - try { - await fs.mkdir(dirPath, { recursive: true }); - } catch (e) { - if ((e as { code: string }).code === 'EEXIST') { - return;// ignore existing error - } - throw e; - } -} \ No newline at end of file diff --git a/modules/code-generator/src/cli/run.ts b/modules/code-generator/src/cli/run.ts deleted file mode 100644 index 304f5ea9aa..0000000000 --- a/modules/code-generator/src/cli/run.ts +++ /dev/null @@ -1,146 +0,0 @@ -/* eslint-disable no-console */ -import chalk from 'chalk'; -import * as fs from 'fs-extra'; -import JSON5 from 'json5'; -import { jsonc } from 'jsonc'; -import { spawnSync } from 'child_process'; -import * as path from 'path'; - -import { getErrorMessage } from '../utils/errors'; -import CodeGenerator from '..'; -import type { IProjectBuilder } from '..'; -import type { IPublicTypeProjectSchema } from '@felce/lowcode-types'; - -/** - * 执行出码 CLI 命令 - * @param args 入参数组 - * @param options 选项 - * @returns {Promise} 错误码 - */ -export async function run( - args: string[], - options: { - solution: string; - input?: string; - output?: string; - quiet?: boolean; - verbose?: boolean; - solutionOptions?: string; - }, -): Promise { - try { - const schemaFile = options.input || args[0]; - if (!schemaFile) { - throw new Error( - 'a schema file must be specified by `--input ` or by the first positional argument', - ); - } - - if ((options.input && args.length > 0) || args.length > 1) { - throw new Error( - 'only one schema file can be specified, either by `--input ` or by the first positional argument', - ); - } - - let solutionOptions = {}; - - if (options.solutionOptions) { - try { - solutionOptions = JSON.parse(options.solutionOptions); - } catch (err: any) { - throw new Error(`solution options parse error, error message is "${err.message}"`); - } - } - - // 读取 Schema - const schema = await loadSchemaFile(schemaFile); - - // 创建一个项目构建器 - const createProjectBuilder = await getProjectBuilderFactory(options.solution, { - quiet: options.quiet, - }); - const builder = createProjectBuilder(solutionOptions); - - // 生成代码 - const generatedSourceCodes = await builder.generateProject(schema); - - // 输出到磁盘 - const publisher = CodeGenerator.publishers.disk(); - - await publisher.publish({ - project: generatedSourceCodes, - outputPath: options.output || 'generated', - projectSlug: 'example', - createProjectFolder: false, - }); - return 0; - } catch (e) { - console.log(chalk.red(getErrorMessage(e) || `Unexpected error: ${e}`)); - if (typeof e === 'object' && (e as { stack: string } | null)?.stack && options.verbose) { - console.log(chalk.gray((e as { stack: string }).stack)); - } - return 1; - } -} - -async function getProjectBuilderFactory( - solution: string, - { quiet }: { quiet?: boolean }, -): Promise<(options: { [prop: string]: any }) => IProjectBuilder> { - if (solution in CodeGenerator.solutions) { - return CodeGenerator.solutions[solution as 'icejs' | 'rax']; - } - - const solutionPackageName = isLocalSolution(solution) - ? solution - : `${solution.startsWith('@') ? solution : `@alilc/lowcode-solution-${solution}`}`; - - if (!isLocalSolution(solution)) { - if (!quiet) { - console.log(`"${solution}" is not internal, installing it as ${solutionPackageName}...`); - } - - spawnSync('npm', ['i', solutionPackageName], { - stdio: quiet ? 'ignore' : 'inherit', - }); - } - - // eslint-disable-next-line @typescript-eslint/no-require-imports - const solutionExports = require( - !isLocalSolution(solution) - ? solutionPackageName - : `${path.isAbsolute(solution) ? solution : path.join(process.cwd(), solution)}`, - ); - - const projectBuilderFactory = - solutionExports.createProjectBuilder || - solutionExports.createAppBuilder || - solutionExports.default; - - if (typeof projectBuilderFactory !== 'function') { - throw new Error( - `"${solutionPackageName}" should export project builder factory via named export 'createProjectBuilder' or via default export`, - ); - } - - return projectBuilderFactory; -} - -function isLocalSolution(solution: string) { - return solution.startsWith('.') || solution.startsWith('/') || solution.startsWith('~'); -} - -async function loadSchemaFile(schemaFile: string): Promise { - if (!schemaFile) { - throw new Error('invalid schema file name'); - } - - const schemaFileContent = await fs.readFile(schemaFile, 'utf8'); - - if (/\.json5/.test(schemaFile)) { - return JSON5.parse(schemaFileContent); - } - - // 默认用 JSONC 的格式解析(兼容 JSON) - return jsonc.parse(schemaFileContent); -} diff --git a/modules/code-generator/src/cli/solutions/example-solution.ts b/modules/code-generator/src/cli/solutions/example-solution.ts deleted file mode 100644 index 6c779292fe..0000000000 --- a/modules/code-generator/src/cli/solutions/example-solution.ts +++ /dev/null @@ -1,795 +0,0 @@ -export function getLowcodeSolutionTemplateFiles() { - return [ - { - file: '.editorconfig', - content: `root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true -quote_type = single - -[*.md] -trim_trailing_whitespace = false -`, - }, - { - file: '.eslintignore', - content: `# 忽略目录 -node_modules/ -build/ -dist/ -test-cases/ -test/ -tests/ -output/ -es/ -lib/ -coverage/ - -# 忽略文件 -**/*.min.js -**/*-min.js -**/*.bundle.js -`, - }, - { - file: '.eslintrc.js', - content: `module.exports = { - extends: 'eslint-config-ali/typescript/react', - rules: { - 'max-len': ['error', { code: 200 }], - 'comma-dangle': 0, - }, -}; -`, - }, - { - file: '.gitignore', - content: `# project custom -build -es -lib -dist -output -package-lock.json -deploy-space/packages -deploy-space/.env -generated - -# IDE -.vscode -.idea - -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release -lib - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# mac config files -.DS_Store - -# codealike -codealike.json -.node -`, - }, - { - file: '.prettierignore', - content: '/test-cases/', - }, - { - file: '.prettierrc', - content: `{ - "tabWidth": 2, - "singleQuote": true, - "trailingComma": "es5" -} -`, - }, - { - file: 'CHANGELOG.md', - content: '', - }, - { - file: 'CONTRIBUTING.md', - content: `# 欢迎共建 - -# 注意 - -- 注意解决 eslint 问题 -- 注意代码格式化 -- 建议安装 prettier 插件 -- 发布前注意要跑通 demo 和所有的单测 - -## 本地调试运行 Demo - -\`\`\`sh -> npm run demo -\`\`\` - -## 本地跑单测 - -\`\`\`sh -> npm test -\`\`\` -`, - }, - { - file: 'README.md', - content: `# 低代码出码自定义方案之 Hello World - -## 直接执行 - -\`\`\`sh -> npx ali-lowcode-solution-hello-world demo-schema.json -\`\`\` - -## 本地调试运行 Demo - -\`\`\`sh -> npm run demo -\`\`\` -`, - }, - { - file: 'demo-schema.json', - content: `{ - "version": "1.0.0", - "componentsMap": [ - { - "componentName": "Button", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Button" - }, - { - "componentName": "Button.Group", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Button", - "subName": "Group" - }, - { - "componentName": "Input", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Input" - }, - { - "componentName": "Form", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Form" - }, - { - "componentName": "Form.Item", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Form", - "subName": "Item" - }, - { - "componentName": "NumberPicker", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "NumberPicker" - }, - { - "componentName": "Select", - "package": "@alifd/next", - "version": "1.19.18", - "destructuring": true, - "exportName": "Select" - } - ], - "componentsTree": [ - { - "componentName": "Page", - "id": "node$1", - "meta": { - "title": "测试", - "router": "/" - }, - "props": { - "ref": "outterView", - "autoLoading": true - }, - "fileName": "test", - "state": { - "text": "outter" - }, - "lifeCycles": { - "componentDidMount": { - "type": "JSFunction", - "value": "function componentDidMount() {\\n console.log('componentDidMount');\\n}" - } - }, - "methodsModule": { - "type": "JSModule", - "source": "export function helloWorld() {\\n console.log('Hello world!');\\n}\\n" - }, - "dataSource": { - "list": [ - { - "id": "urlParams", - "type": "urlParams" - }, - - { - "id": "user", - "type": "fetch", - "options": { - "method": "GET", - "uri": "https://shs.xxx.com/mock/1458/demo/user", - "isSync": true - }, - "dataHandler": { - "type": "JSExpression", - "value": "function (response) {\\nif (!response.data.success){\\n throw new Error(response.data.message);\\n }\\n return response.data.data;\\n}" - } - }, - - { - "id": "orders", - "type": "fetch", - "options": { - "method": "GET", - "uri": "https://shs.xxx.com/mock/1458/demo/orders", - "isSync": true - }, - "dataHandler": { - "type": "JSExpression", - "value": "function (response) {\\nif (!response.data.success){\\n throw new Error(response.data.message);\\n }\\n return response.data.data.result;\\n}" - } - } - ], - "dataHandler": { - "type": "JSExpression", - "value": "function (dataMap) {\\n console.info(\\"All datasources loaded:\\", dataMap);\\n}" - } - }, - "children": [ - { - "componentName": "Form", - "id": "node$2", - "props": { - "labelCol": { - "type": "JSExpression", - "value": "this.state.colNum" - }, - "style": {}, - "ref": "testForm" - }, - "children": [ - { - "componentName": "Form.Item", - "id": "node$3", - "props": { - "label": "姓名:", - "name": "name", - "initValue": "李雷" - }, - "children": [ - { - "componentName": "Input", - "id": "node$4", - "props": { - "placeholder": "请输入", - "size": "medium", - "style": { - "width": 320 - } - } - } - ] - }, - { - "componentName": "Form.Item", - "id": "node$5", - "props": { - "label": "年龄:", - "name": "age", - "initValue": "22" - }, - "children": [ - { - "componentName": "NumberPicker", - "id": "node$6", - "props": { - "size": "medium", - "type": "normal" - } - } - ] - }, - { - "componentName": "Form.Item", - "id": "node$7", - "props": { - "label": "职业:", - "name": "profession" - }, - "children": [ - { - "componentName": "Select", - "id": "node$8", - "props": { - "dataSource": [ - { - "label": "教师", - "value": "t" - }, - { - "label": "医生", - "value": "d" - }, - { - "label": "歌手", - "value": "s" - } - ] - } - } - ] - }, - { - "componentName": "Div", - "id": "node$9", - "props": { - "style": { - "textAlign": "center" - } - }, - "children": [ - { - "componentName": "Button.Group", - "id": "node$a", - "props": {}, - "children": [ - { - "componentName": "Button", - "id": "node$b", - "condition": { - "type": "JSExpression", - "value": "this.index >= 1" - }, - "loop": ["a", "b", "c"], - "props": { - "type": "primary", - "style": { - "margin": "0 5px 0 5px" - } - }, - "children": [ - { - "type": "JSExpression", - "value": "this.item" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ], - "constants": { - "ENV": "prod", - "DOMAIN": "xxx.xxx.com" - }, - "css": "body {font-size: 12px;} .table { width: 100px;}", - "config": { - "sdkVersion": "1.0.3", - "historyMode": "hash", - "targetRootID": "J_Container", - "layout": { - "componentName": "BasicLayout", - "props": { - "logo": "...", - "name": "测试网站" - } - }, - "theme": { - "package": "@alife/theme-fusion", - "version": "^0.1.0", - "primary": "#ff9966" - } - }, - "meta": { - "name": "demo应用", - "git_group": "appGroup", - "project_name": "app_demo", - "description": "这是一个测试应用", - "spma": "spa23d", - "creator": "月飞" - } -} -`, - }, - { - file: 'jest.config.js', - content: `module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testPathIgnorePatterns: ['/node_modules/', '/test-cases/', '/static-files/', '/lib/'], -}; -`, - }, - { - file: 'package.json', - content: `{ - "name": "ali-lowcode-solution-hello-world", - "version": "1.0.0", - "description": "AlLowCode Code Generate Solution - Hello World", - "files": [ - "src", - "lib", - "tests", - "jest.config.js", - ".editorconfig", - ".eslintignore", - ".eslintrc.js", - ".gitignore", - ".prettierignore", - ".prettierrc", - "CHANGELOG.md", - "CONTRIBUTING.md", - "demo-schema.json", - "package.json", - "README.md", - "tsconfig.json" - ], - "main": "lib/index.js", - "scripts": { - "start": "jest --watch", - "build": "npm run clean && concurrently 'npm run build:ts' 'npm run lint'", - "build:ts": "tsc", - "check:type": "tsc -p . --noEmit", - "clean": "rm -rf build dist lib generated", - "dev": "build-scripts start", - "lint": "eslint --ext .tsx,.ts,.js,.jsx src", - "lintfix": "eslint --fix --color --ext .tsx,.ts,.js,.jsx src", - "lint-staged": "lint-staged", - "prepublishOnly": "npm run build", - "postpublish": "git push origin master --tags", - "test": "jest", - "test:watch": "jest --watch", - "test:update-snapshots": "cross-env UPDATE_EXPECTED=true npx jest", - "demo": "npm run build && npx @felce/lowcode-code-generator --solution . --output generated demo-schema.json" - }, - "repository": { - "type": "git", - "url": "git@github.com:your-name/ali-lowcode-solution-hello-world.git" - }, - "author": "", - "license": "ISC", - "publishConfig": { - "registry": "https://registry.npm.xxx.com" - }, - "dependencies": { - "@felce/lowcode-code-generator": "^1.0.0", - "@felce/lowcode-types": "^1.0.0", - "tslib": "^2.3.0" - }, - "devDependencies": { - "@types/async": "^3.2.3", - "@types/jest": "^26.0.17", - "@typescript-eslint/eslint-plugin": "^4.28.4", - "@typescript-eslint/parser": "^4.28.4", - "async": "^3.2.0", - "babel-runtime": "^6.26.0", - "concurrently": "^5.2.0", - "cross-env": "^7.0.0", - "debug": "^4.1.1", - "eslint": "^7.31.0", - "eslint-config-ali": "^12.1.0", - "eslint-plugin-import": "^2.23.4", - "eslint-plugin-react": "^7.24.0", - "eslint-plugin-react-hooks": "^4.2.0", - "glob": "^7.2.0", - "husky": "4.2.5", - "jest": "^26.6.3", - "json5": "^2.2.0", - "lint-staged": "10.1.x", - "lodash": "^4.17.21", - "md5": "^2.2.1", - "prettier": "^2.3.2", - "ts-jest": "^26.4.4", - "ts-node": "^9.0.0", - "typescript": "4.x" - } -} -`, - }, - { - file: 'tsconfig.json', - content: `{ - "compilerOptions": { - "esModuleInterop": true, - "declaration": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "importHelpers": true, - "incremental": false, - "jsx": "react", - "moduleResolution": "node", - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "stripInternal": true, - "outDir": "./lib", - "declarationDir": "./lib", - "rootDirs": ["./src"], - "target": "es6", - "module": "commonjs", - "lib": ["esnext"], - "types": ["jest", "node"], - "noUnusedLocals": false, - "noUnusedParameters": false - }, - "include": ["src/**/*", "typings/**/*"] -} -`, - }, - { - file: 'src/index.ts', - content: `import CodeGen from '@felce/lowcode-code-generator'; - -import examplePlugin from './plugins/example'; - -export default function createHelloWorldProjectBuilder() { - return CodeGen.createProjectBuilder({ - template: CodeGen.solutionParts.icejs.template, - plugins: { - components: [ - CodeGen.plugins.icejs.reactCommonDeps(), - CodeGen.plugins.common.esModule({ fileType: 'jsx' }), - CodeGen.plugins.common.styleImport(), - CodeGen.plugins.icejs.containerClass(), - CodeGen.plugins.icejs.containerInjectContext(), - CodeGen.plugins.icejs.containerInjectUtils(), - CodeGen.plugins.icejs.containerInjectDataSourceEngine(), - CodeGen.plugins.icejs.containerInjectI18n(), - CodeGen.plugins.icejs.containerInjectConstants(), - CodeGen.plugins.icejs.containerInitState(), - CodeGen.plugins.icejs.containerLifeCycle(), - CodeGen.plugins.icejs.containerMethod(), - examplePlugin(), - CodeGen.plugins.icejs.jsx({ - nodeTypeMapping: { - Div: 'div', - Component: 'div', - Page: 'div', - Block: 'div', - }, - }), - CodeGen.plugins.style.css(), - ], - pages: [ - CodeGen.plugins.icejs.reactCommonDeps(), - CodeGen.plugins.common.esModule({ fileType: 'jsx' }), - CodeGen.plugins.common.styleImport(), - CodeGen.plugins.icejs.containerClass(), - CodeGen.plugins.icejs.containerInjectContext(), - CodeGen.plugins.icejs.containerInjectUtils(), - CodeGen.plugins.icejs.containerInjectDataSourceEngine(), - CodeGen.plugins.icejs.containerInjectI18n(), - CodeGen.plugins.icejs.containerInjectConstants(), - CodeGen.plugins.icejs.containerInitState(), - CodeGen.plugins.icejs.containerLifeCycle(), - CodeGen.plugins.icejs.containerMethod(), - examplePlugin(), - CodeGen.plugins.icejs.jsx({ - nodeTypeMapping: { - Div: 'div', - Component: 'div', - Page: 'div', - Block: 'div', - }, - }), - CodeGen.plugins.style.css(), - ], - router: [ - CodeGen.plugins.common.esModule(), - CodeGen.solutionParts.icejs.plugins.router(), - ], - entry: [CodeGen.solutionParts.icejs.plugins.entry()], - constants: [CodeGen.plugins.project.constants()], - utils: [ - CodeGen.plugins.common.esModule(), - CodeGen.plugins.project.utils('react'), - ], - i18n: [CodeGen.plugins.project.i18n()], - globalStyle: [CodeGen.solutionParts.icejs.plugins.globalStyle()], - htmlEntry: [CodeGen.solutionParts.icejs.plugins.entryHtml()], - packageJSON: [CodeGen.solutionParts.icejs.plugins.packageJSON()], - }, - postProcessors: [CodeGen.postprocessor.prettier()], - }); -} -`, - }, - { - file: 'src/plugins/example.ts', - content: `import { - ICodeStruct, - BuilderComponentPlugin, - BuilderComponentPluginFactory, - FileType, - ChunkType, - IContainerInfo, - COMMON_CHUNK_NAME, - CLASS_DEFINE_CHUNK_NAME, - DEFAULT_LINK_AFTER, -} from '@felce/lowcode-code-generator'; - -export interface PluginConfig { - fileType: string; -} - -const pluginFactory: BuilderComponentPluginFactory = ( - config? -) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo & { - methodsModule?: { - type?: 'JSModule'; - source?: string; - }; - }; - - if (ir.methodsModule?.type !== 'JSModule' || !ir.methodsModule?.source) { - return next; - } - - // 创建 methods.jsx - next.chunks.push({ - type: ChunkType.STRING, - subModule: 'methods', - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.CustomContent, - content: ir.methodsModule.source, - linkAfter: [], - }); - - // 引入对应的模块 - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: "import __$$methodsModule from './methods';", - linkAfter: [...DEFAULT_LINK_AFTER[COMMON_CHUNK_NAME.InternalDepsImport]], - }); - - // 将导出的东东都放到 class 上实例方法部分 - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: 'Object.assign(this, __$$methodsModule);', - linkAfter: [ - ...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent], - ], - }); - - return next; - }; - - return plugin; -}; - -export default pluginFactory; -`, - }, - { - file: 'tests/basic.test.ts', - content: `test('basic functions should be ok', () => { - // 这里放一些单元测试 - expect(0).toBe(0); -}); -`, - }, - ]; -} diff --git a/modules/code-generator/src/config/env.ts b/modules/code-generator/src/config/env.ts deleted file mode 100644 index 30d564c06e..0000000000 --- a/modules/code-generator/src/config/env.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as path from 'path'; - -export const CODE_GENERATOR_ROOT = path.join(__dirname, '../..'); diff --git a/modules/code-generator/src/const/file.ts b/modules/code-generator/src/const/file.ts deleted file mode 100644 index d29ea43a33..0000000000 --- a/modules/code-generator/src/const/file.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { FileType } from '../types/core'; - -export const FILE_TYPE_FAMILY = [[FileType.TSX, FileType.TS, FileType.JSX, FileType.JS]]; diff --git a/modules/code-generator/src/const/generator.ts b/modules/code-generator/src/const/generator.ts deleted file mode 100644 index 1197458381..0000000000 --- a/modules/code-generator/src/const/generator.ts +++ /dev/null @@ -1,129 +0,0 @@ -export const COMMON_CHUNK_NAME = { - ExternalDepsImport: 'CommonExternalDependencyImport', - InternalDepsImport: 'CommonInternalDependencyImport', - ImportAliasDefine: 'CommonImportAliasDefine', - FileVarDefine: 'CommonFileScopeVarDefine', - FileUtilDefine: 'CommonFileScopeMethodDefine', - FileMainContent: 'CommonFileMainContent', - FileExport: 'CommonFileExport', - StyleDepsImport: 'CommonStyleDepsImport', - StyleCssContent: 'CommonStyleCssContent', - HtmlContent: 'CommonHtmlContent', - CustomContent: 'CommonCustomContent', -}; - -export const CLASS_DEFINE_CHUNK_NAME = { - Start: 'CommonClassDefineStart', - ConstructorStart: 'CommonClassDefineConstructorStart', - ConstructorContent: 'CommonClassDefineConstructorContent', - ConstructorEnd: 'CommonClassDefineConstructorEnd', - StaticVar: 'CommonClassDefineStaticVar', - StaticMethod: 'CommonClassDefineStaticMethod', - InsVar: 'CommonClassDefineInsVar', - InsVarMethod: 'CommonClassDefineInsVarMethod', - InsMethod: 'CommonClassDefineInsMethod', - InsPrivateMethod: 'CommonClassDefineInsPrivateMethod', - End: 'CommonClassDefineEnd', -}; - -export const DEFAULT_LINK_AFTER = { - [COMMON_CHUNK_NAME.ExternalDepsImport]: [], - [COMMON_CHUNK_NAME.InternalDepsImport]: [COMMON_CHUNK_NAME.ExternalDepsImport], - [COMMON_CHUNK_NAME.ImportAliasDefine]: [ - COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport, - ], - [COMMON_CHUNK_NAME.FileVarDefine]: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - ], - [COMMON_CHUNK_NAME.FileUtilDefine]: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - ], - [CLASS_DEFINE_CHUNK_NAME.Start]: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - ], - [CLASS_DEFINE_CHUNK_NAME.ConstructorStart]: [ - CLASS_DEFINE_CHUNK_NAME.Start, - CLASS_DEFINE_CHUNK_NAME.StaticVar, - CLASS_DEFINE_CHUNK_NAME.StaticMethod, - CLASS_DEFINE_CHUNK_NAME.InsVar, - CLASS_DEFINE_CHUNK_NAME.InsVarMethod, - ], - [CLASS_DEFINE_CHUNK_NAME.ConstructorContent]: [CLASS_DEFINE_CHUNK_NAME.ConstructorStart], - [CLASS_DEFINE_CHUNK_NAME.ConstructorEnd]: [ - CLASS_DEFINE_CHUNK_NAME.ConstructorStart, - CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - ], - [CLASS_DEFINE_CHUNK_NAME.StaticVar]: [CLASS_DEFINE_CHUNK_NAME.Start], - [CLASS_DEFINE_CHUNK_NAME.StaticMethod]: [ - CLASS_DEFINE_CHUNK_NAME.Start, CLASS_DEFINE_CHUNK_NAME.StaticVar, - ], - [CLASS_DEFINE_CHUNK_NAME.InsVar]: [ - CLASS_DEFINE_CHUNK_NAME.Start, - CLASS_DEFINE_CHUNK_NAME.StaticVar, - CLASS_DEFINE_CHUNK_NAME.StaticMethod, - ], - [CLASS_DEFINE_CHUNK_NAME.InsVarMethod]: [ - CLASS_DEFINE_CHUNK_NAME.Start, - CLASS_DEFINE_CHUNK_NAME.StaticVar, - CLASS_DEFINE_CHUNK_NAME.StaticMethod, - CLASS_DEFINE_CHUNK_NAME.InsVar, - ], - [CLASS_DEFINE_CHUNK_NAME.InsMethod]: [ - CLASS_DEFINE_CHUNK_NAME.Start, - CLASS_DEFINE_CHUNK_NAME.StaticVar, - CLASS_DEFINE_CHUNK_NAME.StaticMethod, - CLASS_DEFINE_CHUNK_NAME.InsVar, - CLASS_DEFINE_CHUNK_NAME.InsVarMethod, - CLASS_DEFINE_CHUNK_NAME.ConstructorEnd, - ], - [CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod]: [ - CLASS_DEFINE_CHUNK_NAME.Start, - CLASS_DEFINE_CHUNK_NAME.StaticVar, - CLASS_DEFINE_CHUNK_NAME.StaticMethod, - CLASS_DEFINE_CHUNK_NAME.InsVar, - CLASS_DEFINE_CHUNK_NAME.InsVarMethod, - CLASS_DEFINE_CHUNK_NAME.InsMethod, - CLASS_DEFINE_CHUNK_NAME.ConstructorEnd, - ], - [CLASS_DEFINE_CHUNK_NAME.End]: [ - CLASS_DEFINE_CHUNK_NAME.Start, - CLASS_DEFINE_CHUNK_NAME.StaticVar, - CLASS_DEFINE_CHUNK_NAME.StaticMethod, - CLASS_DEFINE_CHUNK_NAME.InsVar, - CLASS_DEFINE_CHUNK_NAME.InsVarMethod, - CLASS_DEFINE_CHUNK_NAME.InsMethod, - CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod, - CLASS_DEFINE_CHUNK_NAME.ConstructorEnd, - ], - [COMMON_CHUNK_NAME.FileMainContent]: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - CLASS_DEFINE_CHUNK_NAME.End, - ], - [COMMON_CHUNK_NAME.FileExport]: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - CLASS_DEFINE_CHUNK_NAME.End, - COMMON_CHUNK_NAME.FileMainContent, - ], - [COMMON_CHUNK_NAME.StyleDepsImport]: [], - [COMMON_CHUNK_NAME.StyleCssContent]: [COMMON_CHUNK_NAME.StyleDepsImport], - [COMMON_CHUNK_NAME.HtmlContent]: [], -}; - -export const COMMON_SUB_MODULE_NAME = 'index'; diff --git a/modules/code-generator/src/const/index.ts b/modules/code-generator/src/const/index.ts deleted file mode 100644 index 24449ca429..0000000000 --- a/modules/code-generator/src/const/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -export const NATIVE_ELE_PKG = 'native'; - -export const CONTAINER_TYPE = { - COMPONENT: 'Component', - BLOCK: 'Block', - PAGE: 'Page', -}; - -export const SUPPORT_SCHEMA_VERSION_LIST = ['0.0.1', '1.0.0']; - -// built-in slot names which have been handled in ProjectBuilder -export const BUILTIN_SLOT_NAMES = [ - 'pages', - 'components', - 'router', - 'entry', - 'appConfig', - 'buildConfig', - 'constants', - 'utils', - 'i18n', - 'globalStyle', - 'htmlEntry', - 'packageJSON', - 'demo', -]; - -export const isBuiltinSlotName = function (name: string) { - return BUILTIN_SLOT_NAMES.includes(name); -}; - -export * from './file'; -export * from './generator'; diff --git a/modules/code-generator/src/core/jsx/handlers/transformJsExpression.ts b/modules/code-generator/src/core/jsx/handlers/transformJsExpression.ts deleted file mode 100644 index 3bdb8fb5c1..0000000000 --- a/modules/code-generator/src/core/jsx/handlers/transformJsExpression.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { IScope } from '../../../types'; -import { parseExpression } from '../../../utils/expressionParser'; -import { isLiteralAtomicExpr } from '../util/isLiteralAtomicExpr'; -import { isSimpleStraightLiteral } from '../util/isSimpleStraightLiteral'; -import { transformThis2Context } from './transformThis2Context'; - -export function transformJsExpr( - expr: string, - scope: IScope, - { dontWrapEval = false, dontTransformThis2ContextAtRootScope = false } = {}, -) { - if (!expr) { - return 'undefined'; - } - - if (isLiteralAtomicExpr(expr)) { - return expr; - } - - const exprAst = parseExpression(expr); - - // 对于下面这些比较安全的字面值,可以直接返回对应的表达式,而非包一层 - if (isSimpleStraightLiteral(exprAst)) { - return expr; - } - - if (dontWrapEval) { - return transformThis2Context(exprAst, scope, { - ignoreRootScope: dontTransformThis2ContextAtRootScope, - }); - } - - switch (exprAst.type) { - // 对于直接写个函数的,则不用再包下,因为这样不会抛出异常的 - case 'ArrowFunctionExpression': - case 'FunctionExpression': - return transformThis2Context(exprAst, scope, { - ignoreRootScope: dontTransformThis2ContextAtRootScope, - }); - - default: - break; - } - - // 其他的都需要包一层 - return `__$$eval(() => (${transformThis2Context(exprAst, scope, { - ignoreRootScope: dontTransformThis2ContextAtRootScope, - })}))`; -} diff --git a/modules/code-generator/src/core/jsx/handlers/transformThis2Context.ts b/modules/code-generator/src/core/jsx/handlers/transformThis2Context.ts deleted file mode 100644 index fbb1c17cbc..0000000000 --- a/modules/code-generator/src/core/jsx/handlers/transformThis2Context.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Expression } from '@babel/types'; -import generate from '@babel/generator'; -import { IScope } from '../../../types'; -import { parseExpressionConvertThis2Context } from '../../../utils/expressionParser'; - -/** - * 将所有的 this.xxx 替换为 __$$context.xxx - * @param expr - */ -export function transformThis2Context( - expr: string | Expression, - scope: IScope, - { ignoreRootScope = false } = {}, -): string { - if (ignoreRootScope && scope.parent == null) { - return typeof expr === 'string' ? expr : generate(expr).code; - } - - // 下面这种字符串替换的方式虽然简单直接,但是对于复杂场景会误匹配,故后期改成了解析 AST 然后修改 AST 最后再重新生成代码的方式 - // return expr - // .replace(/\bthis\.item\./g, () => 'item.') - // .replace(/\bthis\.index\./g, () => 'index.') - // .replace(/\bthis\./g, () => '__$$context.'); - return parseExpressionConvertThis2Context( - expr, - '__$$context', - scope.bindings?.getAllBindings() || [], - ); -} diff --git a/modules/code-generator/src/core/jsx/util/isLiteralAtomicExpr.ts b/modules/code-generator/src/core/jsx/util/isLiteralAtomicExpr.ts deleted file mode 100644 index fe0c95a9d1..0000000000 --- a/modules/code-generator/src/core/jsx/util/isLiteralAtomicExpr.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * 判断是否是原子类型的表达式 - */ -export function isLiteralAtomicExpr(expr: string): boolean { - return ( - expr === 'null' || - expr === 'undefined' || - expr === 'true' || - expr === 'false' || - /^-?\d+(\.\d+)?$/.test(expr) - ); -} diff --git a/modules/code-generator/src/core/jsx/util/isSimpleStraightLiteral.ts b/modules/code-generator/src/core/jsx/util/isSimpleStraightLiteral.ts deleted file mode 100644 index 0b071527bd..0000000000 --- a/modules/code-generator/src/core/jsx/util/isSimpleStraightLiteral.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Expression } from '@babel/types'; - -/** 判断是非是一些简单直接的字面值 */ -export function isSimpleStraightLiteral(expr: Expression): boolean { - switch (expr.type) { - case 'BigIntLiteral': - case 'BooleanLiteral': - case 'DecimalLiteral': - case 'NullLiteral': - case 'NumericLiteral': - case 'RegExpLiteral': - case 'StringLiteral': - return true; - default: - return false; - } -} diff --git a/modules/code-generator/src/generator/ChunkBuilder.ts b/modules/code-generator/src/generator/ChunkBuilder.ts deleted file mode 100644 index 6799d5940d..0000000000 --- a/modules/code-generator/src/generator/ChunkBuilder.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { BuilderComponentPlugin, IChunkBuilder, ICodeChunk, ICodeStruct, FileType } from '../types'; - -import { COMMON_SUB_MODULE_NAME } from '../const/generator'; -import { FILE_TYPE_FAMILY } from '../const/file'; - -interface ChunkGroupInfo { - chunk: ICodeChunk; - familyIdx?: number; -} - -function whichFamily(type: FileType): [number, FileType[]] | undefined { - const idx = FILE_TYPE_FAMILY.findIndex((family) => family.indexOf(type) >= 0); - if (idx < 0) { - return undefined; - } - return [idx, FILE_TYPE_FAMILY[idx]]; -} - -export const groupChunks = (chunks: ICodeChunk[]): ICodeChunk[][] => { - const tmp: Record> = {}; - const col = chunks.reduce((chunksSet: Record, chunk) => { - const fileKey = chunk.subModule || COMMON_SUB_MODULE_NAME; - if (!chunksSet[fileKey]) { - // eslint-disable-next-line no-param-reassign - chunksSet[fileKey] = []; - } - const res = whichFamily(chunk.fileType as FileType); - const info: ChunkGroupInfo = { - chunk, - }; - if (res) { - const [familyIdx, family] = res; - const rank = family.indexOf(chunk.fileType as FileType); - if (tmp[fileKey]) { - if (tmp[fileKey][familyIdx] !== undefined) { - if (tmp[fileKey][familyIdx] > rank) { - tmp[fileKey][familyIdx] = rank; - } - } else { - tmp[fileKey][familyIdx] = rank; - } - } else { - tmp[fileKey] = {}; - tmp[fileKey][familyIdx] = rank; - } - info.familyIdx = familyIdx; - } - - chunksSet[fileKey].push(info); - return chunksSet; - }, {}); - - const result: ICodeChunk[][] = []; - Object.keys(col).forEach((key) => { - const byType: Record = {}; - col[key].forEach((info) => { - let t: string = info.chunk.fileType; - if (info.familyIdx !== undefined) { - t = FILE_TYPE_FAMILY[info.familyIdx][tmp[key][info.familyIdx]]; - // eslint-disable-next-line no-param-reassign - info.chunk.fileType = t; - } - if (!byType[t]) { - byType[t] = []; - } - byType[t].push(info.chunk); - }); - result.push(...Object.keys(byType).map((t) => byType[t])); - }); - - return result; -}; - -/** - * 代码片段构建器 - * - * @export - * @class ChunkBuilder - * @template T - */ -export class ChunkBuilder implements IChunkBuilder { - private plugins: BuilderComponentPlugin[]; - - constructor(plugins: BuilderComponentPlugin[] = []) { - this.plugins = plugins; - } - - async run( - ir: unknown, - initialStructure: ICodeStruct = { - ir, - chunks: [], - depNames: [], - contextData: {}, - }, - ) { - const structure = initialStructure; - - const finalStructure: ICodeStruct = await this.plugins.reduce( - async (previousPluginOperation: Promise, plugin) => { - const modifiedStructure = await previousPluginOperation; - return plugin(modifiedStructure); - }, - Promise.resolve(structure), - ); - - const chunks = groupChunks(finalStructure.chunks); - - return { - chunks, - }; - } - - getPlugins() { - return this.plugins; - } - - addPlugin(plugin: BuilderComponentPlugin) { - this.plugins.push(plugin); - } -} - -export default ChunkBuilder; diff --git a/modules/code-generator/src/generator/CodeBuilder.ts b/modules/code-generator/src/generator/CodeBuilder.ts deleted file mode 100644 index e633babbf5..0000000000 --- a/modules/code-generator/src/generator/CodeBuilder.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { - ChunkContent, - ChunkType, - CodeGeneratorError, - CodeGeneratorFunction, - ICodeBuilder, - ICodeChunk, -} from '../types'; - -export class CodeBuilder implements ICodeBuilder { - private chunkDefinitions: ICodeChunk[] = []; - - private generators: { [key: string]: CodeGeneratorFunction } = { - [ChunkType.STRING]: (str: string) => str, // no-op for string chunks - [ChunkType.JSON]: (json: Record) => JSON.stringify(json), // stringify json to string - }; - - constructor(chunkDefinitions: ICodeChunk[] = []) { - this.chunkDefinitions = chunkDefinitions; - } - - /** - * Links all chunks together based on their requirements. Returns an array - * of ordered chunk names which need to be compiled and glued together. - */ - link(chunkDefinitions: ICodeChunk[] = []): string { - const chunks = chunkDefinitions || this.chunkDefinitions; - if (chunks.length <= 0) { - return ''; - } - - const unprocessedChunks = chunks.map((chunk) => { - return { - name: chunk.name, - type: chunk.type, - content: chunk.content, - linkAfter: this.cleanupInvalidChunks(chunk.linkAfter, chunks), - }; - }); - - const resultingString: string[] = []; - - while (unprocessedChunks.length > 0) { - let indexToRemove = 0; - for (let index = 0; index < unprocessedChunks.length; index++) { - if (unprocessedChunks[index].linkAfter.length <= 0) { - indexToRemove = index; - break; - } - } - - if (unprocessedChunks[indexToRemove].linkAfter.length > 0) { - throw new CodeGeneratorError( - 'Operation aborted. Reason: cyclic dependency between chunks.', - ); - } - - const { type, content, name } = unprocessedChunks[indexToRemove]; - const compiledContent = this.generateByType(type, content); - if (compiledContent) { - resultingString.push(`${compiledContent}\n`); - } - - unprocessedChunks.splice(indexToRemove, 1); - if (!unprocessedChunks.some((ch) => ch.name === name)) { - unprocessedChunks.forEach( - // remove the processed chunk from all the linkAfter arrays from the remaining chunks - (ch) => { - // eslint-disable-next-line no-param-reassign - ch.linkAfter = ch.linkAfter.filter((after) => after !== name); - }, - ); - } - } - - return resultingString.join('\n'); - } - - generateByType(type: string, content: unknown): string { - if (!content) { - return ''; - } - if (Array.isArray(content)) { - return content.map((contentItem) => this.generateByType(type, contentItem)).join('\n'); - } - - if (!this.generators[type]) { - throw new Error( - `Attempted to generate unknown type ${type}. Please register a generator for this type in builder/index.ts`, - ); - } - - return this.generators[type](content); - } - - // remove invalid chunks (which did not end up being created) from the linkAfter fields - // one use-case is when you want to remove the import plugin - private cleanupInvalidChunks(linkAfter: string[], chunks: ICodeChunk[]) { - return linkAfter.filter((chunkName) => chunks.some((chunk) => chunk.name === chunkName)); - } -} - -export default CodeBuilder; diff --git a/modules/code-generator/src/generator/ModuleBuilder.ts b/modules/code-generator/src/generator/ModuleBuilder.ts deleted file mode 100644 index d0fc943758..0000000000 --- a/modules/code-generator/src/generator/ModuleBuilder.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { IPublicTypeProjectSchema, ResultFile, ResultDir } from '@felce/lowcode-types'; - -import { - BuilderComponentPlugin, - CodeGeneratorError, - ICodeChunk, - ICompiledModule, - IContextData, - IModuleBuilder, - IParseResult, - ISchemaParser, - PostProcessor, -} from '../types'; - -import { COMMON_SUB_MODULE_NAME } from '../const/generator'; - -import { SchemaParser } from '../parser/SchemaParser'; -import { ChunkBuilder } from './ChunkBuilder'; -import { CodeBuilder } from './CodeBuilder'; -import { createResultFile, createResultDir, addFile } from '../utils/resultHelper'; - -export function createModuleBuilder( - options: { - plugins: BuilderComponentPlugin[]; - postProcessors: PostProcessor[]; - mainFileName?: string; - contextData?: IContextData; - } = { - plugins: [], - postProcessors: [], - }, -): IModuleBuilder { - const chunkGenerator = new ChunkBuilder(options.plugins); - const linker = new CodeBuilder(); - - const generateModule = async (input: unknown): Promise => { - const moduleMainName = options.mainFileName || COMMON_SUB_MODULE_NAME; - if (chunkGenerator.getPlugins().length <= 0) { - throw new CodeGeneratorError( - 'No plugins found. Component generation cannot work without any plugins!', - ); - } - - let files: ResultFile[] = []; - - const { chunks } = await chunkGenerator.run(input, { - ir: input, - chunks: [], - depNames: [], - contextData: options.contextData || {}, - }); - - chunks.forEach((fileChunkList) => { - const content = linker.link(fileChunkList); - const file = createResultFile( - fileChunkList[0].subModule || moduleMainName, - fileChunkList[0].fileType, - content, - ); - files.push(file); - }); - - if (options.postProcessors.length > 0) { - files = files.map((file) => { - let { content, ext: type, name } = file; - options.postProcessors.forEach((processer) => { - content = processer(content, type, name); - }); - - return createResultFile(file.name, type, content); - }); - } - - return { - files, - }; - }; - - const generateModuleCode = async ( - schema: IPublicTypeProjectSchema | string, - ): Promise => { - // Init - const schemaParser: ISchemaParser = new SchemaParser(); - const parseResult: IParseResult = schemaParser.parse(schema); - - const containerInfo = parseResult.containers[0]; - const { files } = await generateModule(containerInfo); - - const dir = createResultDir(containerInfo.moduleName); - files.forEach((file) => addFile(dir, file)); - - return dir; - }; - - const linkCodeChunks = (chunks: Record, fileName: string) => { - const files: ResultFile[] = []; - - Object.keys(chunks).forEach((fileKey) => { - const fileChunkList = chunks[fileKey]; - const content = linker.link(fileChunkList); - const file = createResultFile( - fileChunkList[0].subModule || fileName, - fileChunkList[0].fileType, - content, - ); - files.push(file); - }); - - return files; - }; - - return { - generateModule, - generateModuleCode, - linkCodeChunks, - addPlugin: chunkGenerator.addPlugin.bind(chunkGenerator), - }; -} diff --git a/modules/code-generator/src/generator/ProjectBuilder.ts b/modules/code-generator/src/generator/ProjectBuilder.ts deleted file mode 100644 index 4e6d57e151..0000000000 --- a/modules/code-generator/src/generator/ProjectBuilder.ts +++ /dev/null @@ -1,372 +0,0 @@ -import { ResultDir, ResultFile, IPublicTypeProjectSchema } from '@felce/lowcode-types'; - -import { - IModuleBuilder, - IParseResult, - IProjectBuilder, - IProjectPlugins, - IProjectTemplate, - ISchemaParser, - PostProcessor, -} from '../types'; - -import { SchemaParser } from '../parser/SchemaParser'; -import { createResultDir, addDirectory, addFile } from '../utils/resultHelper'; - -import { createModuleBuilder } from './ModuleBuilder'; -import { ProjectPreProcessor, ProjectPostProcessor, IContextData } from '../types/core'; -import { CodeGeneratorError } from '../types/error'; -import { isBuiltinSlotName } from '../const'; - -interface IModuleInfo { - moduleName?: string; - path: string[]; - files: ResultFile[]; -} - -export interface ProjectBuilderInitOptions { - /** 项目模板 */ - template: IProjectTemplate; - - /** 项目插件 */ - plugins: IProjectPlugins; - - /** 模块后置处理器 */ - postProcessors: PostProcessor[]; - - /** Schema 解析器 */ - schemaParser?: ISchemaParser; - - /** 项目级别的前置处理器 */ - projectPreProcessors?: ProjectPreProcessor[]; - - /** 项目级别的后置处理器 */ - projectPostProcessors?: ProjectPostProcessor[]; - - /** 是否处于严格模式 */ - inStrictMode?: boolean; - - /** 一些额外的上下文数据 */ - extraContextData?: Record; - - /** - * Hook which is used to customize original options, we can reorder/add/remove plugins/processors - * of the existing solution. - */ - customizeBuilderOptions?(originalOptions: ProjectBuilderInitOptions): ProjectBuilderInitOptions; -} - -export class ProjectBuilder implements IProjectBuilder { - /** 项目模板 */ - private template: IProjectTemplate; - - /** 项目插件 */ - private plugins: IProjectPlugins; - - /** 模块后置处理器 */ - private postProcessors: PostProcessor[]; - - /** Schema 解析器 */ - private schemaParser: ISchemaParser; - - /** 项目级别的前置处理器 */ - private projectPreProcessors: ProjectPreProcessor[]; - - /** 项目级别的后置处理器 */ - private projectPostProcessors: ProjectPostProcessor[]; - - /** 是否处于严格模式 */ - readonly inStrictMode: boolean; - - /** 一些额外的上下文数据 */ - readonly extraContextData: IContextData; - - constructor(builderOptions: ProjectBuilderInitOptions) { - let customBuilderOptions = builderOptions; - if (typeof builderOptions.customizeBuilderOptions === 'function') { - customBuilderOptions = builderOptions.customizeBuilderOptions(builderOptions); - } - const { - template, - plugins, - postProcessors, - schemaParser = new SchemaParser(), - projectPreProcessors = [], - projectPostProcessors = [], - inStrictMode = false, - extraContextData = {}, - } = customBuilderOptions; - this.template = template; - this.plugins = plugins; - this.postProcessors = postProcessors; - this.schemaParser = schemaParser; - this.projectPreProcessors = projectPreProcessors; - this.projectPostProcessors = projectPostProcessors; - this.inStrictMode = inStrictMode; - this.extraContextData = extraContextData; - } - - async generateProject(originalSchema: IPublicTypeProjectSchema | string): Promise { - // Init - const { schemaParser } = this; - - let schema: IPublicTypeProjectSchema = - typeof originalSchema === 'string' ? JSON.parse(originalSchema) : originalSchema; - - // Parse / Format - // Preprocess - for (const preProcessor of this.projectPreProcessors) { - // eslint-disable-next-line no-await-in-loop - schema = await preProcessor(schema); - } - - // Validate - if (!schemaParser.validate(schema)) { - throw new CodeGeneratorError('Schema is invalid'); - } - - // Collect Deps - // Parse JSExpression - const parseResult: IParseResult = schemaParser.parse(schema); - - const projectRoot = await this.template.generateTemplate(parseResult); - - let buildResult: IModuleInfo[] = []; - - const builders = this.createModuleBuilders({ - extraContextData: { - projectRemark: parseResult?.project?.projectRemark, - template: this.template, - }, - }); - // Generator Code module - // components - // pages - const containerBuildResult: IModuleInfo[] = await Promise.all( - parseResult.containers.map(async (containerInfo) => { - let builder: IModuleBuilder; - let path: string[]; - if (containerInfo.containerType === 'Page') { - builder = builders.pages; - path = this.template.slots.pages.path; - } else { - builder = builders.components; - path = this.template.slots.components.path; - } - - const { files } = await builder.generateModule(containerInfo); - - return { - moduleName: containerInfo.moduleName, - path, - files, - }; - }), - ); - buildResult = buildResult.concat(containerBuildResult); - - // router - if (parseResult.globalRouter && builders.router) { - const { files } = await builders.router.generateModule(parseResult.globalRouter); - - buildResult.push({ - path: this.template.slots.router.path, - files, - }); - } - - // entry - if (parseResult.project && builders.entry) { - const { files } = await builders.entry.generateModule(parseResult.project); - - buildResult.push({ - path: this.template.slots.entry.path, - files, - }); - } - - // appConfig - if (builders.appConfig) { - const { files } = await builders.appConfig.generateModule(parseResult); - - buildResult.push({ - path: this.template.slots.appConfig.path, - files, - }); - } - - // buildConfig - if (builders.buildConfig) { - const { files } = await builders.buildConfig.generateModule(parseResult); - - buildResult.push({ - path: this.template.slots.buildConfig.path, - files, - }); - } - - // constants? - if (parseResult.project && builders.constants && this.template.slots.constants) { - const { files } = await builders.constants.generateModule(parseResult.project); - - buildResult.push({ - path: this.template.slots.constants.path, - files, - }); - } - - // utils? - if (parseResult.globalUtils && builders.utils && this.template.slots.utils) { - const { files } = await builders.utils.generateModule(parseResult.globalUtils); - - buildResult.push({ - path: this.template.slots.utils.path, - files, - }); - } - - // i18n? - if (builders.i18n && this.template.slots.i18n) { - const { files } = await builders.i18n.generateModule(parseResult.project); - - buildResult.push({ - path: this.template.slots.i18n.path, - files, - }); - } - - // globalStyle - if (parseResult.project && builders.globalStyle) { - const { files } = await builders.globalStyle.generateModule(parseResult.project); - - buildResult.push({ - path: this.template.slots.globalStyle.path, - files, - }); - } - - // htmlEntry - if (parseResult.project && builders.htmlEntry) { - const { files } = await builders.htmlEntry.generateModule(parseResult.project); - - buildResult.push({ - path: this.template.slots.htmlEntry.path, - files, - }); - } - - // packageJSON - if (parseResult.project && builders.packageJSON) { - const { files } = await builders.packageJSON.generateModule(parseResult.project); - - buildResult.push({ - path: this.template.slots.packageJSON.path, - files, - }); - } - - // demo - if (parseResult.project && builders.demo) { - const { files } = await builders.demo.generateModule(parseResult.project); - buildResult.push({ - path: this.template.slots.demo.path, - files, - }); - } - - // handle extra slots - await this.generateExtraSlots(builders, parseResult, buildResult); - - // Post Process - const isSingleComponent = parseResult?.project?.projectRemark?.isSingleComponent; - // Combine Modules - buildResult.forEach((moduleInfo) => { - let targetDir = getDirFromRoot(projectRoot, moduleInfo.path); - // if project only contain single component, skip creation of directory. - if (moduleInfo.moduleName && !isSingleComponent) { - const dir = createResultDir(moduleInfo.moduleName); - addDirectory(targetDir, dir); - targetDir = dir; - } - moduleInfo.files.forEach((file) => addFile(targetDir, file)); - }); - - // post-processors - let finalResult = projectRoot; - for (const projectPostProcessor of this.projectPostProcessors) { - // eslint-disable-next-line no-await-in-loop - finalResult = await projectPostProcessor(finalResult, schema, originalSchema, { - template: this.template, - parseResult, - }); - } - - return finalResult; - } - - private createModuleBuilders( - extraContextData: Record = {}, - ): Record { - const builders: Record = {}; - - Object.keys(this.plugins).forEach((pluginName) => { - if (this.plugins[pluginName].length > 0) { - const options: { mainFileName?: string } = {}; - if (this.template.slots[pluginName] && this.template.slots[pluginName].fileName) { - options.mainFileName = this.template.slots[pluginName].fileName; - } - builders[pluginName] = createModuleBuilder({ - plugins: this.plugins[pluginName], - postProcessors: this.postProcessors, - contextData: { - // template: this.template, - inStrictMode: this.inStrictMode, - tolerateEvalErrors: true, - evalErrorsHandler: '', - ...this.extraContextData, - ...extraContextData, - }, - ...options, - }); - } - }); - - return builders; - } - - private async generateExtraSlots( - builders: Record, - parseResult: IParseResult, - buildResult: IModuleInfo[], - ) { - for (const slotName in this.template.slots) { - if (!isBuiltinSlotName(slotName)) { - const { files } = await builders[slotName].generateModule(parseResult); - buildResult.push({ - path: this.template.slots[slotName].path, - files, - }); - } - } - } -} - -export function createProjectBuilder(initOptions: ProjectBuilderInitOptions): IProjectBuilder { - return new ProjectBuilder(initOptions); -} - -function getDirFromRoot(root: ResultDir, path: string[]): ResultDir { - let current: ResultDir = root; - path.forEach((p) => { - const exist = current.dirs.find((d) => d.name === p); - if (exist) { - current = exist; - } else { - const newDir = createResultDir(p); - addDirectory(current, newDir); - current = newDir; - } - }); - - return current; -} diff --git a/modules/code-generator/src/index.ts b/modules/code-generator/src/index.ts deleted file mode 100644 index da9b12d877..0000000000 --- a/modules/code-generator/src/index.ts +++ /dev/null @@ -1,121 +0,0 @@ -/** - * 低代码引擎的出码模块,负责将编排产出的 Schema 转换成实际可执行的代码。 - * 注意:为了保持 API 的稳定性,这里所有导出的 API 均要显式命名方式导出 - * (即用 export { xxx } from 'xx' 的方式,不要直接 export * from 'xxx') - * 而且所有导出的 API 务必在 tests/public 中编写单元测试 - */ -import { createProjectBuilder } from './generator/ProjectBuilder'; -import { createModuleBuilder } from './generator/ModuleBuilder'; -import { createDiskPublisher } from './publisher/disk'; -import { createZipPublisher } from './publisher/zip'; -import createIceJsProjectBuilder, { plugins as icejsPlugins } from './solutions/icejs'; -import createIceJs3ProjectBuilder, { plugins as icejs3Plugins } from './solutions/icejs3'; -import createRaxAppProjectBuilder, { plugins as raxPlugins } from './solutions/rax-app'; - -// 引入说明 -import { REACT_CHUNK_NAME } from './plugins/component/react/const'; -import { COMMON_CHUNK_NAME, CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER } from './const/generator'; - -// 引入通用插件组 -import esmodule from './plugins/common/esmodule'; -import requireUtils from './plugins/common/requireUtils'; -import styleImport from './plugins/common/styleImport'; - -import css from './plugins/component/style/css'; -import constants from './plugins/project/constants'; -import i18n from './plugins/project/i18n'; -import utils from './plugins/project/utils'; -import prettier from './postprocessor/prettier'; - -// 引入全局常用工具 -import * as globalUtils from './utils'; - -import * as CONSTANTS from './const'; - -// 引入内置解决方案模块 -import icejs from './plugins/project/framework/icejs'; -import icejs3 from './plugins/project/framework/icejs3'; -import rax from './plugins/project/framework/rax'; - -export default { - createProjectBuilder, - createModuleBuilder, - solutions: { - icejs: createIceJsProjectBuilder, - icejs3: createIceJs3ProjectBuilder, - rax: createRaxAppProjectBuilder, - }, - solutionParts: { - icejs, - icejs3, - rax, - }, - publishers: { - disk: createDiskPublisher, - zip: createZipPublisher, - }, - plugins: { - common: { - - /** - * 处理 ES Module - * @deprecated please use esModule - */ - esmodule, - esModule: esmodule, - requireUtils, - styleImport, - }, - style: { - css, - }, - project: { - constants, - i18n, - utils, - }, - icejs: { - ...icejsPlugins, - }, - icejs3: { - ...icejs3Plugins, - }, - rax: { - ...raxPlugins, - }, - - /** - * @deprecated please use icejs - */ - react: { - ...icejsPlugins, - }, - }, - postprocessor: { - prettier, - }, - utils: globalUtils, - chunkNames: { - COMMON_CHUNK_NAME, - CLASS_DEFINE_CHUNK_NAME, - REACT_CHUNK_NAME, - }, - defaultLinkAfter: { - COMMON_DEFAULT_LINK_AFTER: DEFAULT_LINK_AFTER, - }, - constants: CONSTANTS, -}; - -// 一些类型定义 -export * from './types'; - -// 一些常量定义 -export * from './const'; - -// 一些工具函数 -export * from './analyzer/componentAnalyzer'; -export * from './parser/SchemaParser'; -export * from './generator/ChunkBuilder'; -export * from './generator/CodeBuilder'; -export * from './generator/ModuleBuilder'; -export * from './generator/ProjectBuilder'; diff --git a/modules/code-generator/src/parser/SchemaParser.ts b/modules/code-generator/src/parser/SchemaParser.ts deleted file mode 100644 index 83dfc9838b..0000000000 --- a/modules/code-generator/src/parser/SchemaParser.ts +++ /dev/null @@ -1,394 +0,0 @@ -/** - * 解析器是对输入的固定格式数据做拆解,使其符合引擎后续步骤预期,完成统一处理逻辑的步骤。 - * 本解析器面向的是标准 schema 协议。 - */ -import changeCase from 'change-case'; -import { - IPublicTypeUtilItem, - IPublicTypeNodeDataType, - IPublicTypeNodeSchema, - IPublicTypeContainerSchema, - IPublicTypeProjectSchema, - IPublicTypePropsMap, - IPublicTypeNodeData, - IPublicTypeNpmInfo, -} from '@felce/lowcode-types'; -import { - IPageMeta, - CodeGeneratorError, - CompatibilityError, - DependencyType, - IContainerInfo, - IDependency, - IExternalDependency, - IInternalDependency, - InternalDependencyType, - IParseResult, - ISchemaParser, - INpmPackage, - IRouterInfo, -} from '../types'; - -import { SUPPORT_SCHEMA_VERSION_LIST } from '../const'; - -import { getErrorMessage } from '../utils/errors'; -import { handleSubNodes, isValidContainerType, ContainerType } from '../utils/schema'; -import { uniqueArray } from '../utils/common'; -import { componentAnalyzer } from '../analyzer/componentAnalyzer'; -import { ensureValidClassName } from '../utils/validate'; -import type { ProjectRemark } from '../types/intermediate'; - -const defaultContainer: IContainerInfo = { - containerType: 'Component', - componentName: 'Component', - moduleName: 'Index', - fileName: 'Index', - css: '', - props: {}, -}; - -function getRootComponentName(typeName: string, maps: Record): string { - if (maps[typeName]) { - const rec = maps[typeName]; - if (rec.destructuring) { - return rec.componentName || typeName; - } - - const peerName = Object.keys(maps).find((depName: string) => { - const depInfo = maps[depName]; - return ( - depName !== typeName && - !depInfo.destructuring && - depInfo.package === rec.package && - depInfo.version === rec.version && - depInfo.main === rec.main && - depInfo.exportName === rec.exportName && - depInfo.subName === rec.subName - ); - }); - - return peerName || typeName; - } - return typeName; -} - -function processChildren(schema: IPublicTypeNodeSchema): void { - if (schema.props) { - if (Array.isArray(schema.props)) { - // FIXME: is array type props description - } else { - const nodeProps = schema.props as IPublicTypePropsMap; - if (nodeProps.children) { - if (!schema.children) { - // eslint-disable-next-line no-param-reassign - schema.children = nodeProps.children as IPublicTypeNodeDataType; - } else { - let _children: IPublicTypeNodeData[] = []; - - if (Array.isArray(schema.children)) { - _children = _children.concat(schema.children); - } else { - _children.push(schema.children); - } - - if (Array.isArray(nodeProps.children)) { - _children = _children.concat(nodeProps.children as IPublicTypeNodeData[]); - } else { - _children.push(nodeProps.children as IPublicTypeNodeData); - } - - // eslint-disable-next-line no-param-reassign - schema.children = _children; - } - delete nodeProps.children; - } - } - } -} - -function getInternalDep(internalDeps: Record, depName: string) { - const dep = internalDeps[depName]; - return dep && dep.type !== InternalDependencyType.PAGE ? dep : null; -} - -export class SchemaParser implements ISchemaParser { - validate(schema: IPublicTypeProjectSchema): boolean { - if (SUPPORT_SCHEMA_VERSION_LIST.indexOf(schema.version) < 0) { - throw new CompatibilityError(`Not support schema with version [${schema.version}]`); - } - - return true; - } - - parse(schemaSrc: IPublicTypeProjectSchema | string): IParseResult { - // TODO: collect utils depends in JSExpression - const compDeps: Record = {}; - const internalDeps: Record = {}; - let utilsDeps: IExternalDependency[] = []; - - const schema = this.decodeSchema(schemaSrc); - - // 解析三方组件依赖 - schema.componentsMap.forEach((info: any) => { - if (info.componentName) { - compDeps[info.componentName] = { - ...info, - dependencyType: DependencyType.External, - componentName: info.componentName, - exportName: info.exportName ?? info.componentName, - version: info.version || '*', - destructuring: info.destructuring ?? false, - }; - } - }); - - let containers: IContainerInfo[]; - // Test if this is a lowcode component without container - if (schema.componentsTree.length > 0) { - const firstRoot: IPublicTypeContainerSchema = schema - .componentsTree[0] as IPublicTypeContainerSchema; - - if (!firstRoot.fileName && !isValidContainerType(firstRoot)) { - // 整个 schema 描述一个容器,且无根节点定义 - const container: IContainerInfo = { - ...firstRoot, - ...defaultContainer, - props: firstRoot.props || defaultContainer.props, - css: firstRoot.css || defaultContainer.css, - moduleName: (firstRoot as IContainerInfo).moduleName || defaultContainer.moduleName, - children: schema.componentsTree as IPublicTypeNodeSchema[], - }; - containers = [container]; - } else { - // 普通带 1 到多个容器的 schema - containers = schema.componentsTree.map((n) => { - const subRoot = n as IPublicTypeContainerSchema; - const container: IContainerInfo = { - ...subRoot, - componentName: getRootComponentName(subRoot.componentName, compDeps), - containerType: subRoot.componentName, - moduleName: ensureValidClassName( - subRoot.componentName === ContainerType.Component - ? subRoot.fileName - : changeCase.pascalCase(subRoot.fileName), - ), - }; - return container; - }); - } - } else { - throw new CodeGeneratorError("Can't find anything to generate."); - } - - // 分析引用能力的依赖 - containers = containers.map((con) => ({ - ...con, - analyzeResult: componentAnalyzer(con as IPublicTypeContainerSchema), - })); - - // 建立所有容器的内部依赖索引 - containers.forEach((container) => { - let type; - switch (container.containerType) { - case 'Page': - type = InternalDependencyType.PAGE; - break; - case 'Block': - type = InternalDependencyType.BLOCK; - break; - default: - type = InternalDependencyType.COMPONENT; - break; - } - - const dep: IInternalDependency = { - type, - moduleName: container.moduleName, - destructuring: false, - exportName: container.moduleName, - dependencyType: DependencyType.Internal, - }; - - internalDeps[dep.moduleName] = dep; - }); - - const containersDeps = ([] as IDependency[]).concat(...containers.map((c) => c.deps || [])); - // TODO: 不应该在出码部分解决? - // 处理 children 写在了 props 里的情况 - containers.forEach((container) => { - if (container.children) { - // eslint-disable-next-line @typescript-eslint/no-invalid-void-type - handleSubNodes( - container.children, - { - node: (i: IPublicTypeNodeSchema) => processChildren(i), - }, - { - rerun: true, - }, - ); - } - }); - - containers.forEach((container) => { - const depNames = this.getComponentNames(container); - // eslint-disable-next-line no-param-reassign - container.deps = uniqueArray(depNames, (i: string) => i) - .map((depName) => getInternalDep(internalDeps, depName) || compDeps[depName]) - .filter(Boolean); - // container.deps = Object.keys(compDeps).map((depName) => compDeps[depName]); - }); - - // 分析路由配置 - const routes: IRouterInfo['routes'] = containers - .filter((container) => container.containerType === 'Page') - .map((page) => { - const { meta } = page; - if (meta) { - return { - path: (meta as IPageMeta).router || `/${page.fileName}`, // 如果无法找到页面路由信息,则用 fileName 做兜底 - fileName: page.fileName, - componentName: page.moduleName, - }; - } - - return { - path: '', - fileName: page.fileName, - componentName: page.moduleName, - }; - }); - - const routerDeps = routes - .map((r) => internalDeps[r.componentName] || compDeps[r.componentName]) - .filter((dep) => !!dep); - - // 分析 Utils 依赖 - let utils: IPublicTypeUtilItem[]; - if (schema.utils) { - utils = schema.utils; - utilsDeps = schema.utils - .filter( - (u): u is { name: string; type: 'npm' | 'tnpm'; content: IPublicTypeNpmInfo } => - u.type !== 'function', - ) - .map( - (u): IExternalDependency => ({ - ...u.content, - componentName: u.name, - version: u.content.version || '*', - destructuring: u.content.destructuring ?? false, - exportName: u.content.exportName ?? u.name, - }), - ); - } else { - utils = []; - } - - // 分析项目 npm 依赖 - let npms: INpmPackage[] = []; - containers.forEach((con) => { - const p = (con.deps || []) - .map((dep) => { - return dep.dependencyType === DependencyType.External ? dep : null; - }) - .filter((dep) => dep !== null); - const npmInfos: INpmPackage[] = p.filter(Boolean).map((i) => ({ - package: (i as IExternalDependency).package, - version: (i as IExternalDependency).version, - })); - npms.push(...npmInfos); - }); - - npms.push( - ...utilsDeps.map((utilsDep) => ({ - package: utilsDep.package, - version: utilsDep.version, - })), - ); - - npms = uniqueArray(npms, (i) => i.package).filter(Boolean); - - return { - containers, - globalUtils: { - utils, - deps: utilsDeps, - }, - globalI18n: schema.i18n, - globalRouter: { - routes, - deps: routerDeps, - }, - project: { - css: schema.css, - constants: schema.constants, - config: schema.config || {}, - meta: schema.meta || {}, - i18n: schema.i18n, - containersDeps, - utilsDeps, - packages: npms || [], - dataSourcesTypes: this.collectDataSourcesTypes(schema), - projectRemark: this.getProjectRemark(containers), - }, - }; - } - - getProjectRemark(containers: IContainerInfo[]): ProjectRemark { - return { - isSingleComponent: containers.length === 1 && containers[0].containerType === 'Component', - }; - } - - getComponentNames(children: IPublicTypeNodeDataType): string[] { - return handleSubNodes( - children, - { - node: (i: IPublicTypeNodeSchema) => i.componentName, - }, - { - rerun: true, - }, - ); - } - - decodeSchema(schemaSrc: string | IPublicTypeProjectSchema): IPublicTypeProjectSchema { - let schema: IPublicTypeProjectSchema; - if (typeof schemaSrc === 'string') { - try { - schema = JSON.parse(schemaSrc); - } catch (error) { - throw new CodeGeneratorError( - `Parse schema failed: ${getErrorMessage(error) || 'unknown reason'}`, - ); - } - } else { - schema = schemaSrc; - } - return schema; - } - - private collectDataSourcesTypes(schema: IPublicTypeProjectSchema): string[] { - const dataSourcesTypes = new Set(); - - // 数据源的默认类型为 fetch - const defaultDataSourceType = 'fetch'; - - // 收集应用级别的数据源 - schema.dataSource?.list?.forEach((ds) => { - dataSourcesTypes.add(ds.type || defaultDataSourceType); - }); - - // 收集容器级别的数据源(页面/组件/区块) - schema.componentsTree.forEach((rootNode) => { - rootNode.dataSource?.list?.forEach((ds) => { - dataSourcesTypes.add(ds.type || defaultDataSourceType); - }); - }); - - return Array.from(dataSourcesTypes.values()); - } -} - -export default SchemaParser; diff --git a/modules/code-generator/src/plugins/common/esmodule.ts b/modules/code-generator/src/plugins/common/esmodule.ts deleted file mode 100644 index 53f3f9418b..0000000000 --- a/modules/code-generator/src/plugins/common/esmodule.ts +++ /dev/null @@ -1,479 +0,0 @@ -import { flatMap, camelCase, get } from 'lodash'; -import { COMMON_CHUNK_NAME } from '../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - CodeGeneratorError, - DependencyType, - FileType, - ICodeChunk, - ICodeStruct, - IDependency, - IExternalDependency, - IInternalDependency, - IWithDependency, -} from '../../types'; - -import { isValidIdentifier } from '../../utils/validate'; - -// TODO: main 这个信息到底怎么用,是不是外部包不需要使用? -const DEP_MAIN_BLOCKLIST = ['lib', 'lib/index', 'es', 'es/index', 'main']; -const DEFAULT_EXPORT_NAME = '__default__'; - -function groupDepsByPack(deps: IDependency[]): Record { - const depMap: Record = {}; - - const addDep = (pkg: string, dep: IDependency) => { - if (!depMap[pkg]) { - depMap[pkg] = []; - } - depMap[pkg].push(dep); - }; - - deps.forEach((dep) => { - if (dep.dependencyType === DependencyType.Internal) { - addDep(`${(dep as IInternalDependency).moduleName}${dep.main ? `/${dep.main}` : ''}`, dep); - } else { - let depMain = ''; - // TODO: 部分类型的 main 暂时认为没用 - if (dep.main && DEP_MAIN_BLOCKLIST.indexOf(dep.main) < 0) { - depMain = dep.main; - } - if (depMain.substring(0, 1) === '/') { - depMain = depMain.substring(1); - } - addDep(`${(dep as IExternalDependency).package}${depMain ? `/${depMain}` : ''}`, dep); - } - }); - - return depMap; -} - -interface IDependencyItem { - exportName: string; - aliasName?: string; - isDefault?: boolean; - subName?: string; - nodeIdentifier?: string; // 与使用处的映射关系,理论上是不可变更的,如需变更需要提供额外信息 - source: IDependency; -} - -interface IExportItem { - exportName: string; - aliasNames: string[]; - isDefault?: boolean; - needOriginExport: boolean; -} - -function getDependencyIdentifier(info: IDependencyItem): string { - return info.aliasName || info.exportName; -} - -function getExportNameOfDep(dep: IDependency): string { - if (dep.destructuring) { - return ( - dep.exportName || - dep.componentName || - throwNewError('destructuring dependency must have exportName or componentName') - ); - } - - if (!dep.subName) { - return ( - dep.componentName || - dep.exportName || - throwNewError('dependency item must have componentName or exportName') - ); - } - - return ( - dep.exportName || - `__$${camelCase( - get(dep, 'moduleName') || - get(dep, 'package') || - throwNewError('dep.moduleName or dep.package is undefined'), - )}_default` - ); -} - -function throwNewError(msg: string): never { - throw new Error(msg); -} - -function buildPackageImport( - pkg: string, - deps: IDependency[], - targetFileType: string, - useAliasName: boolean, -): ICodeChunk[] { - // 如果压根没有包,则不生成对应的 import 语句(生成了没有任何意义) - if (!pkg || pkg === 'undefined' || pkg === 'null') { - // TODO: 要不要加个 warning? - return []; - } - - const chunks: ICodeChunk[] = []; - - const exportItems: Record = {}; - const defaultExportNames: string[] = []; - - const depsInfo: IDependencyItem[] = deps.map((dep) => { - const info: IDependencyItem = { - exportName: getExportNameOfDep(dep), - isDefault: !dep.destructuring, - subName: dep.subName || undefined, - nodeIdentifier: dep.componentName || undefined, - source: dep, - }; - - // 下面 5 个逻辑是清理不必要的冗余信息,做到数据结构归一化 - if (info.isDefault) { - if (defaultExportNames.indexOf(info.exportName) < 0) { - defaultExportNames.push(info.exportName); - } - } - - if (!info.subName) { - if (info.nodeIdentifier === info.exportName) { - info.nodeIdentifier = undefined; - } - - if (info.isDefault) { - info.aliasName = info.nodeIdentifier || info.exportName; - info.exportName = DEFAULT_EXPORT_NAME; - } - - if (info.nodeIdentifier) { - info.aliasName = info.nodeIdentifier; - info.nodeIdentifier = undefined; - } - } else { - if (info.isDefault) { - info.aliasName = info.exportName; - info.exportName = DEFAULT_EXPORT_NAME; - } - - if (info.nodeIdentifier === `${info.exportName}.${info.subName}`) { - info.nodeIdentifier = undefined; - } - } - - return info; - }); - - // 建立 export 项目的列表 - depsInfo.forEach((info) => { - if (!exportItems[info.exportName]) { - exportItems[info.exportName] = { - exportName: info.exportName, - isDefault: info.isDefault, - aliasNames: [], - needOriginExport: false, - }; - } - - if (!info.nodeIdentifier && !info.aliasName) { - exportItems[info.exportName].needOriginExport = true; - } - }); - - // 建立别名字典 - depsInfo.forEach((info) => { - if (info.aliasName) { - const { aliasNames } = exportItems[info.exportName]; - if (aliasNames.indexOf(info.aliasName) < 0) { - aliasNames.push(info.aliasName); - } - } - }); - - // fix: 父组件ImportAliasDefine, 与子组件import的父组件冲突情况 - depsInfo.forEach((info) => { - if (info.nodeIdentifier) { - const exportItem = exportItems[info.exportName]; - if (!exportItem.needOriginExport && exportItem.aliasNames.length > 0) { - // eslint-disable-next-line no-param-reassign - info.aliasName = exportItem.aliasNames[0]; - } - } - }); - - // 发现 nodeIdentifier 与 exportName 或者 aliasName 冲突的场景 - const nodeIdentifiers = depsInfo.map((info) => info.nodeIdentifier).filter(Boolean); - const conflictInfos = flatMap(Object.keys(exportItems), (exportName) => { - const exportItem = exportItems[exportName]; - const usedNames = [ - ...exportItem.aliasNames, - ...(exportItem.needOriginExport || exportItem.aliasNames.length <= 0 ? [exportName] : []), - ]; - const conflictNames = usedNames.filter((n) => nodeIdentifiers.indexOf(n) >= 0); - if (conflictNames.length > 0) { - return [ - ...(conflictNames.indexOf(exportName) >= 0 ? [[exportName, true, exportItem]] : []), - ...conflictNames.filter((n) => n !== exportName).map((n) => [n, false, exportItem]), - ]; - } - return []; - }); - - const conflictExports = conflictInfos.filter((c) => c[1]).map((c) => c[0] as string); - const conflictAlias = conflictInfos.filter((c) => !c[1]).map((c) => c[0] as string); - - const solutions: Record = {}; - - depsInfo.forEach((info) => { - if (info.aliasName && conflictAlias.indexOf(info.aliasName) >= 0) { - // find solution - let solution = solutions[info.aliasName]; - if (!solution) { - solution = `${info.aliasName}Alias`; - const conflictItem = (conflictInfos.find((c) => c[0] === info.aliasName) || - [])[2] as IExportItem; - conflictItem.aliasNames = conflictItem.aliasNames.filter((a) => a !== info.aliasName); - conflictItem.aliasNames.push(solution); - solutions[info.aliasName] = solution; - } - // eslint-disable-next-line no-param-reassign - info.aliasName = solution; - } - - if (conflictExports.indexOf(info.exportName) >= 0) { - // find solution - let solution = solutions[info.exportName]; - if (!solution) { - solution = `${info.exportName}Export`; - const conflictItem = (conflictInfos.find((c) => c[0] === info.exportName) || - [])[2] as IExportItem; - conflictItem.aliasNames.push(solution); - conflictItem.needOriginExport = false; - solutions[info.exportName] = solution; - } - // eslint-disable-next-line no-param-reassign - info.aliasName = solution; - } - }); - - // 判断是否所有依赖都有合法的 Identifier - depsInfo.forEach((info) => { - const name = info.aliasName || info.exportName; - if (!isValidIdentifier(name)) { - throw new CodeGeneratorError(`Invalid Identifier [${name}]`); - } - if (info.nodeIdentifier && !isValidIdentifier(info.nodeIdentifier)) { - throw new CodeGeneratorError(`Invalid Identifier [${info.nodeIdentifier}]`); - } - }); - - const aliasDefineStatements: Record = {}; - if (useAliasName) { - Object.keys(exportItems).forEach((exportName) => { - const aliasList = exportItems[exportName]?.aliasNames || []; - if (aliasList.length > 0) { - const srcName = exportItems[exportName].needOriginExport ? exportName : aliasList[0]; - const aliasNameList = exportItems[exportName].needOriginExport - ? aliasList - : aliasList.slice(1); - aliasNameList.forEach((a) => { - if (!aliasDefineStatements[a]) { - aliasDefineStatements[a] = `const ${a} = ${srcName};`; - } - }); - } - }); - } - - function getDefaultExportName(info: IDependencyItem): string { - if (info.isDefault) { - return defaultExportNames[0]; - } - return info.exportName; - } - - depsInfo.forEach((info) => { - // 如果是子组件,则导出父组件,并且根据自组件命名规则,判断是否需要定义标识符 - if (info.nodeIdentifier) { - // 前提,存在 nodeIdentifier 一定是有 subName 的,不然前面会优化掉 - const ownerName = getDependencyIdentifier(info); - - chunks.push({ - type: ChunkType.STRING, - fileType: targetFileType, - name: COMMON_CHUNK_NAME.ImportAliasDefine, - content: useAliasName ? `const ${info.nodeIdentifier} = ${ownerName}.${info.subName};` : '', - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport], - ext: { - originalName: `${getDefaultExportName(info)}.${info.subName}`, - aliasName: info.nodeIdentifier, - dependency: info.source, - }, - }); - } else if (info.aliasName) { - // default 方式的导入会生成单独de import 语句,无需生成赋值语句 - if (info.isDefault && defaultExportNames.find((n) => n === info.aliasName)) { - delete aliasDefineStatements[info.aliasName]; - return; - } - - let contentStatement = ''; - if (aliasDefineStatements[info.aliasName]) { - contentStatement = aliasDefineStatements[info.aliasName]; - delete aliasDefineStatements[info.aliasName]; - } - - chunks.push({ - type: ChunkType.STRING, - fileType: targetFileType, - name: COMMON_CHUNK_NAME.ImportAliasDefine, - content: contentStatement, - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport], - ext: { - originalName: getDefaultExportName(info), - aliasName: info.aliasName, - dependency: info.source, - }, - }); - } - }); - - // 可能会剩余一些存在二次转换的定义 - Object.keys(aliasDefineStatements).forEach((a) => { - chunks.push({ - type: ChunkType.STRING, - fileType: targetFileType, - name: COMMON_CHUNK_NAME.ImportAliasDefine, - content: aliasDefineStatements[a], - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport], - }); - }); - - const exportItemList = Object.keys(exportItems).map((k) => exportItems[k]); - const defaultExport = exportItemList.filter((item) => item.isDefault); - const otherExports = exportItemList.filter((item) => !item.isDefault); - - const statementL = ['import']; - if (defaultExport.length > 0) { - if (useAliasName) { - statementL.push(defaultExportNames[0]); - } else { - statementL.push(defaultExport[0].aliasNames[0]); - } - if (otherExports.length > 0) { - statementL.push(', '); - } - } - if (otherExports.length > 0) { - const items = otherExports.map((item) => { - return !useAliasName || item.needOriginExport || item.aliasNames.length <= 0 - ? item.exportName - : `${item.exportName} as ${item.aliasNames[0]}`; - }); - statementL.push(`{ ${items.join(', ')} }`); - } - statementL.push('from'); - - const getInternalDependencyModuleId = () => `@/${(deps[0] as IInternalDependency).type}/${pkg}`; - - if (deps[0].dependencyType === DependencyType.Internal) { - // TODO: Internal Deps path use project slot setting - statementL.push(`'${getInternalDependencyModuleId()}';`); - chunks.push({ - type: ChunkType.STRING, - fileType: targetFileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: statementL.join(' '), - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - } else { - statementL.push(`'${pkg}';`); - chunks.push({ - type: ChunkType.STRING, - fileType: targetFileType, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: statementL.join(' '), - linkAfter: [], - }); - } - - // 处理下一些额外的 default 方式的导入 - if (defaultExportNames.length > 1) { - if (deps[0].dependencyType === DependencyType.Internal) { - defaultExportNames.slice(1).forEach((exportName) => { - chunks.push({ - type: ChunkType.STRING, - fileType: targetFileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: `import ${exportName} from '${getInternalDependencyModuleId()}';`, - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - }); - } else { - defaultExportNames.slice(1).forEach((exportName) => { - chunks.push({ - type: ChunkType.STRING, - fileType: targetFileType, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: `import ${exportName} from '${pkg}';`, - linkAfter: [], - }); - - chunks.push({ - type: ChunkType.STRING, - fileType: targetFileType, - name: COMMON_CHUNK_NAME.ImportAliasDefine, - content: '', - linkAfter: [], - ext: { - aliasName: exportName, - originalName: exportName, - dependency: { - package: pkg, - componentName: exportName, - }, - }, - }); - }); - } - } - - return chunks; -} - -export interface PluginConfig { - fileType?: string; // 导出的文件类型 - useAliasName?: boolean; // 是否使用 componentName 重命名组件 identifier - filter?: (deps: IDependency[]) => IDependency[]; // 支持过滤能力 -} - -const pluginFactory: BuilderComponentPluginFactory = (config?: PluginConfig) => { - const cfg = { - fileType: FileType.JS, - useAliasName: true, - ...(config || {}), - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IWithDependency; - - if (ir && ir.deps && ir.deps.length > 0) { - const deps = cfg.filter ? cfg.filter(ir.deps) : ir.deps; - const packs = groupDepsByPack(deps); - - Object.keys(packs).forEach((pkg) => { - const chunks = buildPackageImport(pkg, packs[pkg], cfg.fileType, cfg.useAliasName); - next.chunks.push(...chunks); - }); - } - - return next; - }; - - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/common/requireUtils.ts b/modules/code-generator/src/plugins/common/requireUtils.ts deleted file mode 100644 index 4dacf68e5a..0000000000 --- a/modules/code-generator/src/plugins/common/requireUtils.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { COMMON_CHUNK_NAME } from '../../const/generator'; - -import { BuilderComponentPlugin, BuilderComponentPluginFactory, ChunkType, FileType, ICodeStruct } from '../../types'; - -// TODO: How to merge this logic to common deps -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: 'import * from \'react\';', - linkAfter: [], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/common/styleImport.ts b/modules/code-generator/src/plugins/common/styleImport.ts deleted file mode 100644 index 23e1293025..0000000000 --- a/modules/code-generator/src/plugins/common/styleImport.ts +++ /dev/null @@ -1,64 +0,0 @@ -import changeCase from 'change-case'; -import { - FileType, - BuilderComponentPluginFactory, - BuilderComponentPlugin, - ICodeStruct, - IWithDependency, - ChunkType, -} from '../../types'; - -import { COMMON_CHUNK_NAME } from '../../const/generator'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IWithDependency; - const { chunks } = next; - - if (ir && ir.deps && ir.deps.length > 0) { - let lowcodeMaterialsStyleAdded = false; - let fusionUIStyleAdded = false; - let nextStyleAddedMap: Record = {}; - ir.deps.forEach((dep: any) => { - if (dep.package === '@alifd/next' && !nextStyleAddedMap[dep.exportName]) { - chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: `import '@alifd/next/lib/${changeCase.paramCase(dep.exportName)}/style';`, - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - nextStyleAddedMap[dep.exportName] = true; - } else if (dep.package === '@alilc/lowcode-materials' && !lowcodeMaterialsStyleAdded) { - chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: 'import \'@alilc/lowcode-materials/lib/style\';', - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - lowcodeMaterialsStyleAdded = true; - } else if (dep.package === '@alifd/fusion-ui' && !fusionUIStyleAdded) { - chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: 'import \'@alifd/fusion-ui/lib/style\';', - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - fusionUIStyleAdded = true; - } - }); - } - - return next; - }; - - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/rax/commonDeps.ts b/modules/code-generator/src/plugins/component/rax/commonDeps.ts deleted file mode 100644 index 99285aad84..0000000000 --- a/modules/code-generator/src/plugins/component/rax/commonDeps.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { COMMON_CHUNK_NAME } from '../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, -} from '../../../types'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: ` - // 注意: 出码引擎注入的临时变量默认都以 "__$$" 开头,禁止在搭建的代码中直接访问。 - // 例外:rax 框架的导出名和各种组件名除外。 - import { createElement, Component } from 'rax'; - import { getSearchParams as __$$getSearchParams } from 'rax-app'; - `, - linkAfter: [], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/rax/const.ts b/modules/code-generator/src/plugins/component/rax/const.ts deleted file mode 100644 index a0a07b550c..0000000000 --- a/modules/code-generator/src/plugins/component/rax/const.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const RAX_CHUNK_NAME = { - ClassDidMountBegin: 'RaxComponentClassDidMountBegin', - ClassDidMountContent: 'RaxComponentClassDidMountContent', - ClassDidMountEnd: 'RaxComponentClassDidMountEnd', - ClassWillUnmountBegin: 'RaxComponentClassWillUnmountBegin', - ClassWillUnmountContent: 'RaxComponentClassWillUnmountContent', - ClassWillUnmountEnd: 'RaxComponentClassWillUnmountEnd', - ClassRenderBegin: 'RaxComponentClassRenderBegin', - ClassRenderPre: 'RaxComponentClassRenderPre', - ClassRenderJSX: 'RaxComponentClassRenderJSX', - ClassRenderEnd: 'RaxComponentClassRenderEnd', - MethodsBegin: 'RaxComponentMethodsBegin', - MethodsContent: 'RaxComponentMethodsContent', - MethodsEnd: 'RaxComponentMethodsEnd', - LifeCyclesBegin: 'RaxComponentLifeCyclesBegin', - LifeCyclesContent: 'RaxComponentLifeCyclesContent', - LifeCyclesEnd: 'RaxComponentLifeCyclesEnd', -}; diff --git a/modules/code-generator/src/plugins/component/rax/containerClass.ts b/modules/code-generator/src/plugins/component/rax/containerClass.ts deleted file mode 100644 index 5e923635b4..0000000000 --- a/modules/code-generator/src/plugins/component/rax/containerClass.ts +++ /dev/null @@ -1,157 +0,0 @@ -import changeCase from 'change-case'; -import { - COMMON_CHUNK_NAME, - CLASS_DEFINE_CHUNK_NAME, - DEFAULT_LINK_AFTER, -} from '../../../const/generator'; -import { RAX_CHUNK_NAME } from './const'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; -import { ensureValidClassName } from '../../../utils/validate'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - - // 将模块名转换成 PascalCase 的格式,并添加特定后缀,防止命名冲突 - const componentClassName = ensureValidClassName( - `${changeCase.pascalCase(ir.moduleName)}$$Page`, - ); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: CLASS_DEFINE_CHUNK_NAME.Start, - content: `class ${componentClassName} extends Component {`, - linkAfter: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: CLASS_DEFINE_CHUNK_NAME.End, - content: '}', - linkAfter: [ - CLASS_DEFINE_CHUNK_NAME.Start, - CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod, - RAX_CHUNK_NAME.ClassRenderEnd, - RAX_CHUNK_NAME.MethodsEnd, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorStart, - content: 'constructor(props, context) { super(props); ', - linkAfter: DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorStart], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorEnd, - content: '} /* end of constructor */', - linkAfter: DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorEnd], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: RAX_CHUNK_NAME.ClassDidMountBegin, - content: 'componentDidMount() {', - linkAfter: [ - CLASS_DEFINE_CHUNK_NAME.Start, - CLASS_DEFINE_CHUNK_NAME.InsVar, - CLASS_DEFINE_CHUNK_NAME.InsMethod, - CLASS_DEFINE_CHUNK_NAME.ConstructorEnd, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: RAX_CHUNK_NAME.ClassDidMountEnd, - content: '} /* end of componentDidMount */', - linkAfter: [RAX_CHUNK_NAME.ClassDidMountBegin, RAX_CHUNK_NAME.ClassDidMountContent], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: RAX_CHUNK_NAME.ClassWillUnmountBegin, - content: 'componentWillUnmount() {', - linkAfter: [ - CLASS_DEFINE_CHUNK_NAME.Start, - CLASS_DEFINE_CHUNK_NAME.InsVar, - CLASS_DEFINE_CHUNK_NAME.InsMethod, - RAX_CHUNK_NAME.ClassDidMountEnd, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: RAX_CHUNK_NAME.ClassWillUnmountEnd, - content: '} /* end of componentWillUnmount */', - linkAfter: [RAX_CHUNK_NAME.ClassWillUnmountBegin, RAX_CHUNK_NAME.ClassWillUnmountContent], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: RAX_CHUNK_NAME.ClassRenderBegin, - content: 'render() {', - linkAfter: [RAX_CHUNK_NAME.ClassDidMountEnd, RAX_CHUNK_NAME.ClassWillUnmountEnd], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: RAX_CHUNK_NAME.ClassRenderEnd, - content: '} /* end of render */', - linkAfter: [ - RAX_CHUNK_NAME.ClassRenderBegin, - RAX_CHUNK_NAME.ClassRenderPre, - RAX_CHUNK_NAME.ClassRenderJSX, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.FileExport, - content: `export default ${componentClassName};`, - linkAfter: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - CLASS_DEFINE_CHUNK_NAME.End, - ], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/rax/containerInitState.ts b/modules/code-generator/src/plugins/component/rax/containerInitState.ts deleted file mode 100644 index bf37881a2a..0000000000 --- a/modules/code-generator/src/plugins/component/rax/containerInitState.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../../const/generator'; - -import { generateCompositeType } from '../../../utils/compositeType'; -import { Scope } from '../../../utils/Scope'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; - -export interface PluginConfig { - fileType: string; - implementType: 'inConstructor' | 'insMember' | 'hooks'; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - implementType: 'insMember', - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - const scope = Scope.createRootScope(); - - const state = ir.state || {}; - const fields = Object.keys(state).map((stateName) => { - // TODO: 这里用什么 handlers? - const value = generateCompositeType(state[stateName], scope); - return `${JSON.stringify(stateName)}: ${value}`; - }); - - if (cfg.implementType === 'inConstructor') { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: `this.state = { ${fields.join(',')} };`, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]], - }); - } else if (cfg.implementType === 'insMember') { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: `state = { ${fields.join(',')} };`, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]], - }); - } - // TODO: hooks state?? - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/rax/containerInjectContext.ts b/modules/code-generator/src/plugins/component/rax/containerInjectContext.ts deleted file mode 100644 index fed943aabc..0000000000 --- a/modules/code-generator/src/plugins/component/rax/containerInjectContext.ts +++ /dev/null @@ -1,145 +0,0 @@ -/* eslint-disable @typescript-eslint/indent */ -import { CLASS_DEFINE_CHUNK_NAME, COMMON_CHUNK_NAME } from '../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; -import { RAX_CHUNK_NAME } from './const'; -import { DEFAULT_LINK_AFTER } from '../../../const'; - -export interface PluginConfig { - fileType: string; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - const useRef = !!ir.analyzeResult?.isUsingRef; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: "import __$$constants from '../../constants';", - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - - // TODO: i18n 是可选的,如果没有 i18n 这个文件怎么办?该怎么判断? - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: "import * as __$$i18n from '../../i18n';", - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: ` - __$$i18n._inject2(this); - `, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: ` - _context = this._createContext(); - `, - linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start], - }); - - // TODO: 按照目前的实现方案,代码的插拔能力太弱了,需要有一些变化。 - // Step 1: 增加前置的分析器 - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod, - content: ` - _createContext() { - const self = this; - const context = { - get state() { - return self.state; - }, - setState(newState, callback) { - self.setState(newState, callback); - }, - get dataSourceMap() { - return self._dataSourceEngine.dataSourceMap || {}; - }, - async reloadDataSource() { - await self._dataSourceEngine.reloadDataSource(); - }, - get utils() { - return self._utils; - }, - get page() { - return context; - }, - get component() { - return context; - }, - get props() { - return self.props; - }, - get constants() { - return __$$constants; - }, - i18n: __$$i18n.i18n, - i18nFormat: __$$i18n.i18nFormat, - getLocale: __$$i18n.getLocale, - setLocale(locale) { - __$$i18n.setLocale(locale); - self.forceUpdate(); - },${ - useRef - ? ` - $(refName) { - return self._refsManager.get(refName); - }, - $$(refName) { - return self._refsManager.getAll(refName); - }, - get _refsManager() { - if (!self._refsManager) { - self._refsManager = new RefsManager(); - } - return self._refsManager; - }, - ` - : '' - } - ...this._methods, - }; - - return context; - } - `, - linkAfter: [RAX_CHUNK_NAME.ClassRenderEnd], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/rax/containerInjectDataSourceEngine.ts b/modules/code-generator/src/plugins/component/rax/containerInjectDataSourceEngine.ts deleted file mode 100644 index 930a279e24..0000000000 --- a/modules/code-generator/src/plugins/component/rax/containerInjectDataSourceEngine.ts +++ /dev/null @@ -1,196 +0,0 @@ -/* eslint-disable @typescript-eslint/indent */ - -import { - IPublicTypeCompositeValue, - IPublicTypeJSExpression, - InterpretDataSourceConfig, - isJSExpression, - isJSFunction, -} from '@felce/lowcode-types'; -import changeCase from 'change-case'; - -import { CLASS_DEFINE_CHUNK_NAME, COMMON_CHUNK_NAME } from '../../../const/generator'; -import { Scope } from '../../../utils/Scope'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IScope, -} from '../../../types'; - -import { generateCompositeType } from '../../../utils/compositeType'; -import { parseExpressionConvertThis2Context } from '../../../utils/expressionParser'; -import { isContainerSchema } from '../../../utils/schema'; -import { RaxFrameworkOptions } from '../../project/framework/rax/types/RaxFrameworkOptions'; -import { RAX_CHUNK_NAME } from './const'; - -export interface PluginConfig extends RaxFrameworkOptions { - fileType?: string; - - /** - * 数据源的 handlers 的映射配置 - * @deprecated 请使用 datasourceConfig.handlersPackages 来配置 - */ - dataSourceHandlersPackageMap?: Record; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - dataSourceHandlersPackageMap: - config?.dataSourceHandlersPackageMap || config?.datasourceConfig?.handlersPackages, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const scope = Scope.createRootScope(); - const dataSourceConfig = isContainerSchema(pre.ir) ? pre.ir.dataSource : null; - const dataSourceItems: InterpretDataSourceConfig[] = - (dataSourceConfig && dataSourceConfig.list) || []; - const dataSourceEngineOptions = { runtimeConfig: true }; - if (dataSourceItems.length > 0) { - const requestHandlersMap: Record = {}; - - dataSourceItems.forEach((ds) => { - const dsType = ds.type || 'fetch'; - if (!(dsType in requestHandlersMap) && dsType !== 'custom') { - const handlerFactoryName = `__$$create${changeCase.pascal(dsType)}RequestHandler`; - - requestHandlersMap[dsType] = { - type: 'JSExpression', - value: `${handlerFactoryName}(${ - dsType === 'urlParams' ? '__$$getSearchParams()' : '' - })`, - }; - - const handlerFactoryExportName = `create${changeCase.pascal(dsType)}Handler`; - const handlerPkgName = - cfg.dataSourceHandlersPackageMap?.[dsType] || - `@alilc/lowcode-datasource-${changeCase.kebab(dsType)}-handler`; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: ` - import { ${handlerFactoryExportName} as ${handlerFactoryName} } from '${handlerPkgName}'; - `, - linkAfter: [], - }); - } - }); - - Object.assign(dataSourceEngineOptions, { requestHandlersMap }); - } - - const datasourceEnginePackageName = - cfg.datasourceConfig?.enginePackage || '@alilc/lowcode-datasource-engine'; - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: ` - import { create as __$$createDataSourceEngine } from '${datasourceEnginePackageName}/runtime'; - `, - linkAfter: [], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType!, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: ` - _dataSourceConfig = this._defineDataSourceConfig(); - _dataSourceEngine = __$$createDataSourceEngine( - this._dataSourceConfig, - this._context, - ${generateCompositeType(dataSourceEngineOptions, scope)} - );`, - linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType!, - name: RAX_CHUNK_NAME.ClassDidMountContent, - content: ` - this._dataSourceEngine.reloadDataSource(); - `, - linkAfter: [RAX_CHUNK_NAME.ClassDidMountBegin], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType!, - name: CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod, - content: ` -_defineDataSourceConfig() { - const __$$context = this._context; - return (${generateCompositeType( - { - ...dataSourceConfig, - list: [ - ...dataSourceItems.map((item) => ({ - // 数据源引擎默认的 errorHandler 是空的,而且并不会触发组件重新渲染…… - // 这会导致页面状态不能正常展示,故这里处理下: - errorHandler: { - type: 'JSFunction', - value: `function (err){ - setTimeout(() => { - this.setState({ __refresh: Date.now() + Math.random() }); - }, 0); - throw err; - }`, - }, - ...item, - isInit: - typeof item.isInit === 'boolean' || typeof item.isInit === 'undefined' - ? (item.isInit ?? true) - : wrapAsFunction(item.isInit, scope), - options: wrapAsFunction(item.options, scope), - })), - ], - }, - scope, - { - handlers: { - function: (jsFunc) => parseExpressionConvertThis2Context(jsFunc.value, '__$$context'), - expression: (jsExpr) => parseExpressionConvertThis2Context(jsExpr.value, '__$$context'), - }, - }, - )}); -} - `, - linkAfter: [RAX_CHUNK_NAME.ClassRenderEnd], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; - -function wrapAsFunction( - value: IPublicTypeCompositeValue, - scope: IScope, -): IPublicTypeCompositeValue { - if (isJSExpression(value) || isJSFunction(value)) { - return { - type: 'JSExpression', - value: `function(){ return ((${value.value}))}`, - }; - } - - return { - type: 'JSExpression', - value: `function(){return((${generateCompositeType(value, scope)}))}`, - }; -} diff --git a/modules/code-generator/src/plugins/component/rax/containerInjectUtils.ts b/modules/code-generator/src/plugins/component/rax/containerInjectUtils.ts deleted file mode 100644 index 32d3f4bb02..0000000000 --- a/modules/code-generator/src/plugins/component/rax/containerInjectUtils.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { CLASS_DEFINE_CHUNK_NAME, COMMON_CHUNK_NAME } from '../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; -import { RAX_CHUNK_NAME } from './const'; - -export interface PluginConfig { - fileType: string; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - const useRef = !!ir.analyzeResult?.isUsingRef; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - // TODO: 下面这个路径有没有更好的方式来获取?而非写死 - content: ` - import __$$projectUtils${useRef ? ', { RefsManager }' : ''} from '../../utils'; - `, - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: '_utils = this._defineUtils();', - linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod, - - content: ` - _defineUtils() { - return { - ...__$$projectUtils, - }; - }`, - linkAfter: [RAX_CHUNK_NAME.ClassRenderEnd], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/rax/containerLifeCycle.ts b/modules/code-generator/src/plugins/component/rax/containerLifeCycle.ts deleted file mode 100644 index 5db72248a8..0000000000 --- a/modules/code-generator/src/plugins/component/rax/containerLifeCycle.ts +++ /dev/null @@ -1,146 +0,0 @@ -import _ from 'lodash'; -import { isJSExpression, isJSFunction } from '@felce/lowcode-types'; - -import { CLASS_DEFINE_CHUNK_NAME } from '../../../const/generator'; -import { RAX_CHUNK_NAME } from './const'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - FileType, - ChunkType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; -import { debug } from '../../../utils/debug'; -import { isJSExpressionFn } from '../../../utils/common'; - -export interface PluginConfig { - fileType: string; - exportNameMapping: Record; - normalizeNameMapping: Record; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - exportNameMapping: {}, - normalizeNameMapping: { - didMount: 'componentDidMount', - willUnmount: 'componentWillUnmount', - }, - ...config, - }; - - const exportNameMapping = new Map(Object.entries(cfg.exportNameMapping)); - const normalizeNameMapping = new Map(Object.entries(cfg.normalizeNameMapping)); - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - // Rax 先只支持 didMount 和 willUnmount 吧 - - const ir = next.ir as IContainerInfo; - const { lifeCycles } = ir; - - if (lifeCycles && !_.isEmpty(lifeCycles)) { - Object.entries(lifeCycles).forEach(([lifeCycleName, lifeCycleMethodExpr]) => { - // 过滤掉非法数据(有些场景下会误传入空字符串或 null) - if ( - !isJSFunction(lifeCycles[lifeCycleName]) && - !isJSExpressionFn(lifeCycles[lifeCycleName]) && - !isJSExpression(lifeCycles[lifeCycleName]) - ) { - return; - } - - const normalizeName = normalizeNameMapping.get(lifeCycleName) || lifeCycleName; - const exportName = exportNameMapping.get(lifeCycleName) || lifeCycleName; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.LifeCyclesContent, - content: `${exportName}: (${lifeCycleMethodExpr.value}),`, - linkAfter: [RAX_CHUNK_NAME.LifeCyclesBegin], - }); - - if (normalizeName === 'constructor') { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: `this._lifeCycles.${exportName}();`, - linkAfter: [CLASS_DEFINE_CHUNK_NAME.ConstructorStart], - }); - } else if (normalizeName === 'componentDidMount') { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.ClassDidMountContent, - content: `this._lifeCycles.${exportName}();`, - linkAfter: [RAX_CHUNK_NAME.ClassDidMountBegin], - }); - } else if (normalizeName === 'componentWillUnmount') { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.ClassWillUnmountContent, - content: `this._lifeCycles.${exportName}();`, - linkAfter: [RAX_CHUNK_NAME.ClassWillUnmountBegin], - }); - } else { - debug(`[CodeGen]: unknown life cycle: ${lifeCycleName}`); - } - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: '_lifeCycles = this._defineLifeCycles();', - linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.LifeCyclesBegin, - content: ` - _defineLifeCycles() { - const __$$lifeCycles = ({ - `, - linkAfter: [RAX_CHUNK_NAME.ClassRenderEnd, CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.LifeCyclesEnd, - content: ` - }); - - // 为所有的方法绑定上下文 - Object.entries(__$$lifeCycles).forEach(([lifeCycleName, lifeCycleMethod]) => { - if (typeof lifeCycleMethod === 'function') { - __$$lifeCycles[lifeCycleName] = (...args) => { - return lifeCycleMethod.apply(this._context, args); - } - } - }); - - return __$$lifeCycles; - } - `, - linkAfter: [RAX_CHUNK_NAME.LifeCyclesBegin, RAX_CHUNK_NAME.LifeCyclesContent], - }); - } - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/rax/containerMethods.ts b/modules/code-generator/src/plugins/component/rax/containerMethods.ts deleted file mode 100644 index 6e23dc090f..0000000000 --- a/modules/code-generator/src/plugins/component/rax/containerMethods.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { CLASS_DEFINE_CHUNK_NAME } from '../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; - -import { RAX_CHUNK_NAME } from './const'; - -export interface PluginConfig { - fileType: string; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: ` - _methods = this._defineMethods(); - `, - linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.MethodsBegin, - content: ` - _defineMethods() { - return ({ - `, - linkAfter: [ - RAX_CHUNK_NAME.ClassRenderEnd, - CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod, - RAX_CHUNK_NAME.LifeCyclesEnd, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.MethodsEnd, - content: ` - }); - } - `, - linkAfter: [RAX_CHUNK_NAME.MethodsBegin, RAX_CHUNK_NAME.MethodsContent], - }); - - if (ir.methods && Object.keys(ir.methods).length > 0) { - Object.entries(ir.methods).forEach(([methodName, methodDefine]) => { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.MethodsContent, - content: `${methodName}: (${methodDefine.value}),`, - linkAfter: [RAX_CHUNK_NAME.MethodsBegin], - }); - }); - } - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/rax/jsx.ts b/modules/code-generator/src/plugins/component/rax/jsx.ts deleted file mode 100644 index 9b10669e6b..0000000000 --- a/modules/code-generator/src/plugins/component/rax/jsx.ts +++ /dev/null @@ -1,327 +0,0 @@ -import { - IPublicTypeNodeSchema, - IPublicTypeJSExpression, - IPublicTypeNpmInfo, - IPublicTypeCompositeValue, - isJSExpression, -} from '@felce/lowcode-types'; - -import _ from 'lodash'; -import changeCase from 'change-case'; -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - CodePiece, - FileType, - ICodeChunk, - ICodeStruct, - IContainerInfo, - PIECE_TYPE, - HandlerSet, - IScope, - NodeGeneratorConfig, - NodePlugin, - AttrPlugin, -} from '../../../types'; - -import { RAX_CHUNK_NAME } from './const'; -import { COMMON_CHUNK_NAME } from '../../../const/generator'; - -import { generateExpression } from '../../../utils/jsExpression'; -import { - createNodeGenerator, - generateConditionReactCtrl, - generateReactExprInJS, -} from '../../../utils/nodeToJSX'; -import { generateCompositeType } from '../../../utils/compositeType'; -import { Scope } from '../../../utils/Scope'; -import { parseExpressionGetGlobalVariables } from '../../../utils/expressionParser'; -import { transformThis2Context } from '../../../core/jsx/handlers/transformThis2Context'; -import { transformJsExpr } from '../../../core/jsx/handlers/transformJsExpression'; - -export interface PluginConfig { - fileType: string; - - /** 是否要忽略小程序 */ - ignoreMiniApp?: boolean; -} - -// TODO: componentName 若并非大写字符打头,甚至并非是一个有效的 JS 标识符怎么办?? -// FIXME: 我想了下,这块应该放到解析阶段就去做掉,对所有 componentName 做 identifier validate,然后对不合法的做统一替换。 -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - const rootScope = Scope.createRootScope(); - const { tolerateEvalErrors = true, evalErrorsHandler = '' } = next.contextData; - - // Rax 构建到小程序的时候,不能给组件起起别名,得直接引用,故这里将所有的别名替换掉 - // 先收集下所有的 alias 的映射 - const componentsNameAliasMap = new Map(); - next.chunks.forEach((chunk) => { - if (isImportAliasDefineChunk(chunk)) { - componentsNameAliasMap.set(chunk.ext.aliasName, chunk.ext.originalName); - } - }); - - // 注意:这里其实隐含了一个假设:schema 中的 componentName 应该是一个有效的 JS 标识符,而且是大写字母打头的 - // FIXME: 为了快速修复临时加的逻辑,需要用 pre-process 的方式替代处理。 - const mapComponentNameToAliasOrKeepIt = (componentName: string) => - componentsNameAliasMap.get(componentName) || componentName; - - // 然后过滤掉所有的别名 chunks - next.chunks = next.chunks.filter((chunk) => !isImportAliasDefineChunk(chunk)); - - // 如果直接按目前的 React 的方式之间出码 JSX 的话,会有 3 个问题: - // 1. 小程序出码的时候,循环变量没法拿到 - // 2. 小程序出码的时候,很容易出现 Uncaught TypeError: Cannot read property 'avatar' of undefined 这样的异常(如下图的 50 行) -- 因为若直接出码,Rax 构建到小程序的时候会立即计算所有在视图中用到的变量 - // 3. 通过 this.xxx 能拿到的东西太多了,而且自定义的 methods 可能会无意间破坏 Rax 框架或小程序框架在页面 this 上的东东 - const customHandlers: HandlerSet = { - expression(input: IPublicTypeJSExpression, scope: IScope) { - return transformJsExpr(generateExpression(input, scope), scope, { - dontWrapEval: !tolerateEvalErrors, - }); - }, - function(input, scope: IScope) { - return transformThis2Context(input.value || 'null', scope); - }, - }; - - // 创建代码生成器 - const commonNodeGenerator = createNodeGenerator({ - handlers: customHandlers, - tagMapping: mapComponentNameToAliasOrKeepIt, - nodePlugins: [generateReactExprInJS, generateConditionReactCtrl, generateRaxLoopCtrl], - attrPlugins: [generateNodeAttrForRax.bind({ cfg })], - }); - - // 生成 JSX 代码 - const jsxContent = commonNodeGenerator(ir, rootScope); - - if (!cfg.ignoreMiniApp) { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: "import { isMiniApp as __$$isMiniApp } from 'universal-env';", - linkAfter: [], - }); - } - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.ClassRenderPre, - // TODO: setState, dataSourceMap, reloadDataSource, utils, i18n, i18nFormat, getLocale, setLocale 这些在 Rax 的编译模式下不能在视图中直接访问,需要转化成 this.xxx - content: ` - const __$$context = this._context; - const { state, setState, dataSourceMap, reloadDataSource, utils, constants, i18n, i18nFormat, getLocale, setLocale } = __$$context; - `, - linkAfter: [RAX_CHUNK_NAME.ClassRenderBegin], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: RAX_CHUNK_NAME.ClassRenderJSX, - content: `return ${jsxContent};`, - linkAfter: [RAX_CHUNK_NAME.ClassRenderBegin, RAX_CHUNK_NAME.ClassRenderPre], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.CustomContent, - content: [ - tolerateEvalErrors && - ` - function __$$eval(expr) { - try { - return expr(); - } catch (error) { - ${evalErrorsHandler} - } - } - - function __$$evalArray(expr) { - const res = __$$eval(expr); - return Array.isArray(res) ? res : []; - } - `, - ` - function __$$createChildContext(oldContext, ext) { - return Object.assign({}, oldContext, ext); - } - `, - ] - .filter(Boolean) - .join('\n'), - linkAfter: [COMMON_CHUNK_NAME.FileExport], - }); - - return next; - - function generateRaxLoopCtrl( - nodeItem: IPublicTypeNodeSchema, - scope: IScope, - config?: NodeGeneratorConfig, - next?: NodePlugin, - ): CodePiece[] { - if (nodeItem.loop) { - const loopItemName = nodeItem.loopArgs?.[0] || 'item'; - const loopIndexName = nodeItem.loopArgs?.[1] || 'index'; - const subScope = scope.createSubScope([loopItemName, loopIndexName]); - const pieces: CodePiece[] = next ? next(nodeItem, subScope, config) : []; - - const loopDataExpr = tolerateEvalErrors - ? `__$$evalArray(() => (${transformThis2Context( - generateCompositeType(nodeItem.loop, scope, { handlers: config?.handlers }), - scope, - )}))` - : `(${transformThis2Context( - generateCompositeType(nodeItem.loop, scope, { handlers: config?.handlers }), - scope, - )})`; - - pieces.unshift({ - value: `${loopDataExpr}.map((${loopItemName}, ${loopIndexName}) => ((__$$context) => (`, - type: PIECE_TYPE.BEFORE, - }); - - pieces.push({ - value: `))(__$$createChildContext(__$$context, { ${loopItemName}, ${loopIndexName} })))`, - type: PIECE_TYPE.AFTER, - }); - - return pieces; - } - - return next ? next(nodeItem, scope, config) : []; - } - }; - - return plugin; -}; - -export default pluginFactory; - -function isImportAliasDefineChunk(chunk: ICodeChunk): chunk is ICodeChunk & { - ext: { - aliasName: string; - originalName: string; - dependency: IPublicTypeNpmInfo; - }; -} { - return ( - chunk.name === COMMON_CHUNK_NAME.ImportAliasDefine && - !!chunk.ext && - typeof chunk.ext.aliasName === 'string' && - typeof chunk.ext.originalName === 'string' && - !!(chunk.ext.dependency as IPublicTypeNpmInfo | null)?.componentName - ); -} - -function generateNodeAttrForRax( - this: { cfg: PluginConfig }, - attrData: { attrName: string; attrValue: IPublicTypeCompositeValue }, - scope: IScope, - config?: NodeGeneratorConfig, - next?: AttrPlugin, -): CodePiece[] { - if (!this.cfg.ignoreMiniApp && /^on/.test(attrData.attrName)) { - // else: onXxx 的都是事件处理函数需要特殊处理下 - return generateEventHandlerAttrForRax(attrData.attrName, attrData.attrValue, scope, config); - } - - if (attrData.attrName === 'ref') { - return [ - { - name: attrData.attrName, - value: `__$$context._refsManager.linkRef('${attrData.attrValue}')`, - type: PIECE_TYPE.ATTR, - }, - ]; - } - - return next ? next(attrData, scope, config) : []; -} - -function generateEventHandlerAttrForRax( - attrName: string, - attrValue: IPublicTypeCompositeValue, - scope: IScope, - config?: NodeGeneratorConfig, -): CodePiece[] { - // -- 事件处理函数中 JSExpression 转成 JSFunction 来处理,避免当 JSExpression 处理的时候多包一层 eval 而导致 Rax 转码成小程序的时候出问题 - const valueExpr = generateCompositeType( - isJSExpression(attrValue) ? { type: 'JSFunction', value: attrValue.value } : attrValue, - scope, - { - handlers: config?.handlers, - }, - ); - - // 查询当前作用域下的变量 - const currentScopeVariables = scope.bindings?.getAllBindings() || []; - if (currentScopeVariables.length <= 0) { - return [ - { - type: PIECE_TYPE.ATTR, - name: attrName, - value: valueExpr, - }, - ]; - } - - // 提取出所有的未定义的全局变量 - const undeclaredVariablesInValueExpr = parseExpressionGetGlobalVariables(valueExpr); - const referencedLocalVariables = _.intersection( - undeclaredVariablesInValueExpr, - currentScopeVariables, - ); - if (referencedLocalVariables.length <= 0) { - return [ - { - type: PIECE_TYPE.ATTR, - name: attrName, - value: valueExpr, - }, - ]; - } - - const wrappedAttrValueExpr = [ - '(...__$$args) => {', - ' if (__$$isMiniApp) {', - ' const __$$event = __$$args[0];', - ...referencedLocalVariables.map( - (localVar) => `const ${localVar} = __$$event.target.dataset.${localVar};`, - ), - ` return (${valueExpr}).apply(this, __$$args);`, - ' } else {', - ` return (${valueExpr}).apply(this, __$$args);`, - ' }', - '}', - ].join('\n'); - - return [ - ...referencedLocalVariables.map((localVar) => ({ - type: PIECE_TYPE.ATTR, - name: `data-${changeCase.snake(localVar)}`, - value: localVar, - })), - { - type: PIECE_TYPE.ATTR, - name: attrName, - value: wrappedAttrValueExpr, - }, - ]; -} diff --git a/modules/code-generator/src/plugins/component/react/const.ts b/modules/code-generator/src/plugins/component/react/const.ts deleted file mode 100644 index 6294668276..0000000000 --- a/modules/code-generator/src/plugins/component/react/const.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const REACT_CHUNK_NAME = { - ClassRenderStart: 'ReactComponentClassRenderStart', - ClassRenderPre: 'ReactComponentClassRenderPre', - ClassRenderEnd: 'ReactComponentClassRenderEnd', - ClassRenderJSX: 'ReactComponentClassRenderJSX', - ClassDidMountStart: 'ReactComponentClassDidMountStart', - ClassDidMountEnd: 'ReactComponentClassDidMountEnd', - ClassDidMountContent: 'ReactComponentClassDidMountContent', -}; diff --git a/modules/code-generator/src/plugins/component/react/containerClass.ts b/modules/code-generator/src/plugins/component/react/containerClass.ts deleted file mode 100644 index eab6cbebee..0000000000 --- a/modules/code-generator/src/plugins/component/react/containerClass.ts +++ /dev/null @@ -1,145 +0,0 @@ -import changeCase from 'change-case'; -import { - COMMON_CHUNK_NAME, - CLASS_DEFINE_CHUNK_NAME, - DEFAULT_LINK_AFTER, -} from '../../../const/generator'; -import { REACT_CHUNK_NAME } from './const'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; -import { ensureValidClassName } from '../../../utils/validate'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - - // 将模块名转换成 PascalCase 的格式,并添加特定后缀,防止命名冲突 - const componentClassName = ensureValidClassName( - `${changeCase.pascalCase(ir.moduleName)}$$${ir.containerType}`, - ); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: CLASS_DEFINE_CHUNK_NAME.Start, - content: `class ${componentClassName} extends React.Component {`, - linkAfter: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - ], - }); - - if (ir.containerType === 'Component') { - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: `static displayName = '${ir.moduleName}';`, - linkAfter: [ - CLASS_DEFINE_CHUNK_NAME.Start, - ], - }); - } - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: CLASS_DEFINE_CHUNK_NAME.End, - content: '}', - linkAfter: [ - ...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.End], - REACT_CHUNK_NAME.ClassRenderEnd, - REACT_CHUNK_NAME.ClassDidMountEnd, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorStart, - content: 'constructor(props, context) { super(props); ', - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorStart]], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorEnd, - content: '}', - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorEnd]], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: REACT_CHUNK_NAME.ClassDidMountStart, - content: 'componentDidMount() {', - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.End]], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: REACT_CHUNK_NAME.ClassDidMountEnd, - content: '}', - linkAfter: [REACT_CHUNK_NAME.ClassDidMountContent, REACT_CHUNK_NAME.ClassDidMountStart], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: REACT_CHUNK_NAME.ClassRenderStart, - content: 'render() {', - linkAfter: [ - ...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.End], - REACT_CHUNK_NAME.ClassDidMountEnd, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: REACT_CHUNK_NAME.ClassRenderEnd, - content: '}', - linkAfter: [ - REACT_CHUNK_NAME.ClassRenderStart, - REACT_CHUNK_NAME.ClassRenderPre, - REACT_CHUNK_NAME.ClassRenderJSX, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.FileExport, - content: `export default ${componentClassName};`, - linkAfter: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - CLASS_DEFINE_CHUNK_NAME.End, - ], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/react/containerInitState.ts b/modules/code-generator/src/plugins/component/react/containerInitState.ts deleted file mode 100644 index d1dd0d1ddf..0000000000 --- a/modules/code-generator/src/plugins/component/react/containerInitState.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../../const/generator'; - -import { generateCompositeType } from '../../../utils/compositeType'; -import { Scope } from '../../../utils/Scope'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; - -export interface PluginConfig { - fileType?: string; - implementType: 'inConstructor' | 'insMember' | 'hooks'; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig & { fileType: string } = { - fileType: FileType.JSX, - implementType: 'inConstructor', - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - const scope = Scope.createRootScope(); - - const state = ir.state || {}; - const fields = Object.keys(state).map((stateName) => { - const value = generateCompositeType(state[stateName], scope); - return `${stateName}: ${value},`; - }); - - if (cfg.implementType === 'inConstructor') { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: `this.state = { ${fields.join('')} };`, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]], - }); - } else if (cfg.implementType === 'insMember') { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: `state = { ${fields.join('')} };`, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]], - }); - } - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/react/containerInjectConstants.ts b/modules/code-generator/src/plugins/component/react/containerInjectConstants.ts deleted file mode 100644 index 92cd4a3920..0000000000 --- a/modules/code-generator/src/plugins/component/react/containerInjectConstants.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { - CLASS_DEFINE_CHUNK_NAME, - COMMON_CHUNK_NAME, - DEFAULT_LINK_AFTER, -} from '../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, -} from '../../../types'; - -export interface PluginConfig { - fileType: string; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: "import __$$constants from '../../constants';", - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: ` - get constants() { - return __$$constants || {}; - } - `, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/react/containerInjectContext.ts b/modules/code-generator/src/plugins/component/react/containerInjectContext.ts deleted file mode 100644 index 434a5cf1c7..0000000000 --- a/modules/code-generator/src/plugins/component/react/containerInjectContext.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { CLASS_DEFINE_CHUNK_NAME } from '../../../const/generator'; - -import { Scope } from '../../../utils/Scope'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; -import { DEFAULT_LINK_AFTER } from '../../../const'; - -export interface PluginConfig { - fileType: string; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - const scope = Scope.createRootScope(); - - const { inStrictMode } = next.contextData; - if (!inStrictMode) { - // 非严格模式下,上下文就是自己 - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: ` - _context = this; - `, - linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start], - }); - } else { - // 严格模式下的上下文只保留协议中规定的那些 - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: ` - _context = this._createContext(); - `, - linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod, - content: ` - _createContext() { - const self = this; - const context = { - get state() { return self.state; }, - setState(newState, callback) { self.setState(newState, callback); }, - get dataSourceMap() { return self._dataSourceEngine.dataSourceMap || {}; }, - async reloadDataSource() { await self._dataSourceEngine.reloadDataSource(); }, - get utils() { return self.utils; }, - get page() { return context; }, - get component() { return context; }, - get props() { return self.props; }, - get constants() { return self.constants; }, - get $() { return self.$ }, - get $$() { return self.$$ }, - ...this._methods, - }; - - return context; - } - `, - linkAfter: DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod], - }); - } - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/react/containerInjectDataSourceEngine.ts b/modules/code-generator/src/plugins/component/react/containerInjectDataSourceEngine.ts deleted file mode 100644 index ac7aa72ae2..0000000000 --- a/modules/code-generator/src/plugins/component/react/containerInjectDataSourceEngine.ts +++ /dev/null @@ -1,206 +0,0 @@ -/* eslint-disable @typescript-eslint/indent */ - -import { - IPublicTypeCompositeValue, - IPublicTypeJSExpression, - InterpretDataSourceConfig, - isJSExpression, - isJSFunction, -} from '@felce/lowcode-types'; -import changeCase from 'change-case'; - -import { - CLASS_DEFINE_CHUNK_NAME, - COMMON_CHUNK_NAME, - DEFAULT_LINK_AFTER, -} from '../../../const/generator'; -import { Scope } from '../../../utils/Scope'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IScope, -} from '../../../types'; - -import { generateCompositeType } from '../../../utils/compositeType'; -import { parseExpressionConvertThis2Context } from '../../../utils/expressionParser'; -import { isValidContainerType } from '../../../utils/schema'; -import { REACT_CHUNK_NAME } from './const'; -import { isJSExpressionFn } from '../../../utils/common'; - -export interface PluginConfig { - fileType?: string; - - /** - * 数据源配置 - */ - datasourceConfig?: { - /** 数据源引擎的版本 */ - engineVersion?: string; - - /** 数据源引擎的包名 */ - enginePackage?: string; - - /** 数据源 handlers 的版本 */ - handlersVersion?: { - [key: string]: string; - }; - - /** 数据源 handlers 的包名 */ - handlersPackages?: { - [key: string]: string; - }; - }; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg = { - ...config, - fileType: config?.fileType || FileType.JSX, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const scope = Scope.createRootScope(); - const dataSourceConfig = isValidContainerType(pre.ir) ? pre.ir.dataSource : null; - const dataSourceItems: InterpretDataSourceConfig[] = - (dataSourceConfig && dataSourceConfig.list) || []; - const dataSourceEngineOptions = { runtimeConfig: true }; - if (dataSourceItems.length > 0) { - const requestHandlersMap: Record = {}; - - dataSourceItems.forEach((ds) => { - const dsType = ds.type || 'fetch'; - if (!(dsType in requestHandlersMap) && dsType !== 'custom') { - const handlerFactoryName = `__$$create${changeCase.pascal(dsType)}RequestHandler`; - - requestHandlersMap[dsType] = { - type: 'JSExpression', - value: - handlerFactoryName + (dsType === 'urlParams' ? '(window.location.search)' : '()'), - }; - - const handlerFactoryExportName = `create${changeCase.pascal(dsType)}Handler`; - const handlerPkgName = - cfg.datasourceConfig?.handlersPackages?.[dsType] || - `@alilc/lowcode-datasource-${changeCase.kebab(dsType)}-handler`; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: ` - import { ${handlerFactoryExportName} as ${handlerFactoryName} } from '${handlerPkgName}'; - `, - linkAfter: [], - }); - } - }); - - Object.assign(dataSourceEngineOptions, { requestHandlersMap }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: ` - import { create as __$$createDataSourceEngine } from '@alilc/lowcode-datasource-engine/runtime'; - `, - linkAfter: [], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: ` - _dataSourceConfig = this._defineDataSourceConfig(); - _dataSourceEngine = __$$createDataSourceEngine( - this._dataSourceConfig, - this, - ${generateCompositeType(dataSourceEngineOptions, scope)} - ); - - get dataSourceMap() { - return this._dataSourceEngine.dataSourceMap || {}; - } - - reloadDataSource = async () => { - await this._dataSourceEngine.reloadDataSource(); - } - - `, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]], - }); - - next.chunks.unshift({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: REACT_CHUNK_NAME.ClassDidMountContent, - content: ` - this._dataSourceEngine.reloadDataSource(); - `, - linkAfter: [REACT_CHUNK_NAME.ClassDidMountStart], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsMethod, - content: ` - _defineDataSourceConfig() { - const _this = this; - return (${generateCompositeType( - { - ...dataSourceConfig, - list: [ - ...dataSourceItems.map((item) => ({ - ...item, - isInit: wrapAsFunction(item.isInit, scope), - options: wrapAsFunction(item.options, scope), - })), - ], - }, - scope, - { - handlers: { - function: (jsFunc) => parseExpressionConvertThis2Context(jsFunc.value, '_this'), - expression: (jsExpr) => parseExpressionConvertThis2Context(jsExpr.value, '_this'), - }, - }, - )}); - } - `, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]], - }); - } - - return next; - }; - return plugin; -}; - -export default pluginFactory; - -function wrapAsFunction( - value: IPublicTypeCompositeValue, - scope: IScope, -): IPublicTypeCompositeValue { - if (isJSExpression(value) || isJSFunction(value) || isJSExpressionFn(value)) { - return { - type: 'JSExpression', - value: `function(){ return ((${value.value}))}.bind(this)`, - }; - } - - return { - type: 'JSExpression', - value: `function(){return((${generateCompositeType(value, scope)}))}.bind(this)`, - }; -} diff --git a/modules/code-generator/src/plugins/component/react/containerInjectI18n.ts b/modules/code-generator/src/plugins/component/react/containerInjectI18n.ts deleted file mode 100644 index aff42af15f..0000000000 --- a/modules/code-generator/src/plugins/component/react/containerInjectI18n.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - CLASS_DEFINE_CHUNK_NAME, - COMMON_CHUNK_NAME, - DEFAULT_LINK_AFTER, -} from '../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, -} from '../../../types'; -import { getSlotRelativePath } from '../../../utils/pathHelper'; - -export interface PluginConfig { - fileType: string; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: ` - import * as __$$i18n from '${getSlotRelativePath({ contextData: next.contextData, from: 'components', to: 'i18n' })}'; - `, - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: ` - __$$i18n._inject2(this); - `, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/react/containerInjectUtils.ts b/modules/code-generator/src/plugins/component/react/containerInjectUtils.ts deleted file mode 100644 index d9eb14f769..0000000000 --- a/modules/code-generator/src/plugins/component/react/containerInjectUtils.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { - CLASS_DEFINE_CHUNK_NAME, - COMMON_CHUNK_NAME, - DEFAULT_LINK_AFTER, -} from '../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; -import { getSlotRelativePath } from '../../../utils/pathHelper'; - -export interface PluginConfig { - fileType?: string; - - /** prefer using class property to define utils */ - preferClassProperty?: boolean; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig & { fileType: string } = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - next.contextData.useRefApi = true; - const useRef = !!ir.analyzeResult?.isUsingRef; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: ` - import utils${useRef ? ', { RefsManager }' : ''} from '${getSlotRelativePath({ contextData: next.contextData, from: 'components', to: 'utils' })}'; - `, - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - - if (cfg.preferClassProperty) { - // mode: class property - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsVar, - content: 'utils = utils;', - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]], - }); - } else { - // mode: assign in constructor - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: 'this.utils = utils;', - linkAfter: [CLASS_DEFINE_CHUNK_NAME.ConstructorStart], - }); - } - - if (useRef) { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: 'this._refsManager = new RefsManager();', - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsMethod, - content: ` - $ = (refName) => { - return this._refsManager.get(refName); - } - `, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsMethod, - content: ` - $$ = (refName) => { - return this._refsManager.getAll(refName); - } - `, - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]], - }); - } else { - // useRef 为 false 的时候是指没有组件在 props 中配置 ref 属性,但这个时候其实也可能有代码访问 this.$/$$ 所以还是加上个空的代码 - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsMethod, - content: ' $ = () => null; ', - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsMethod, - content: ' $$ = () => []; ', - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]], - }); - } - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/react/containerLifeCycle.ts b/modules/code-generator/src/plugins/component/react/containerLifeCycle.ts deleted file mode 100644 index ec4c46e8bd..0000000000 --- a/modules/code-generator/src/plugins/component/react/containerLifeCycle.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../../const/generator'; -import { REACT_CHUNK_NAME } from './const'; - -import { generateFunction } from '../../../utils/jsExpression'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeChunk, - ICodeStruct, - IContainerInfo, -} from '../../../types'; -import { isJSFunction, isJSExpression } from '@felce/lowcode-types'; -import { isJSExpressionFn } from '../../../utils/common'; - -export interface PluginConfig { - fileType?: string; - exportNameMapping?: Record; - normalizeNameMapping?: Record; - exclude?: string[]; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg = { - fileType: FileType.JSX, - exportNameMapping: {}, - normalizeNameMapping: {}, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - - if (ir.lifeCycles) { - const { lifeCycles } = ir; - const chunks = Object.keys(lifeCycles) - .map((lifeCycleName) => { - // 过滤掉非法数据(有些场景下会误传入空字符串或 null) - if ( - !isJSFunction(lifeCycles[lifeCycleName]) && - !isJSExpressionFn(lifeCycles[lifeCycleName]) && - !isJSExpression(lifeCycles[lifeCycleName]) - ) { - return null; - } - - let normalizeName; - // constructor会取到对象的构造函数 - if (lifeCycleName === 'constructor') { - normalizeName = lifeCycleName; - } else { - normalizeName = cfg.normalizeNameMapping[lifeCycleName] || lifeCycleName; - } - - if (cfg?.exclude?.includes(normalizeName)) { - return null; - } - - const exportName = cfg.exportNameMapping[lifeCycleName] || lifeCycleName; - if (normalizeName === 'constructor') { - return { - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: generateFunction(lifeCycles[lifeCycleName], { isBlock: true }), - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorStart]], - }; - } - - if (normalizeName === 'componentDidMount') { - return { - type: ChunkType.STRING, - fileType: cfg.fileType, - name: REACT_CHUNK_NAME.ClassDidMountContent, - content: generateFunction(lifeCycles[lifeCycleName], { isBlock: true }), - linkAfter: [REACT_CHUNK_NAME.ClassDidMountStart], - }; - } - - if (normalizeName === 'render') { - return { - type: ChunkType.STRING, - fileType: cfg.fileType, - name: REACT_CHUNK_NAME.ClassRenderPre, - content: generateFunction(lifeCycles[lifeCycleName], { isBlock: true }), - linkAfter: [REACT_CHUNK_NAME.ClassRenderStart], - }; - } - - return { - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsMethod, - content: generateFunction(lifeCycles[lifeCycleName], { - name: exportName, - isMember: true, - }), - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]], - }; - }) - .filter((i) => !!i); - - next.chunks.push(...chunks.filter((x): x is ICodeChunk => x !== null)); - } - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/react/containerMethod.ts b/modules/code-generator/src/plugins/component/react/containerMethod.ts deleted file mode 100644 index fc4a387057..0000000000 --- a/modules/code-generator/src/plugins/component/react/containerMethod.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../../const/generator'; - -import { generateFunction } from '../../../utils/jsExpression'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeChunk, - ICodeStruct, - IContainerInfo, -} from '../../../types'; -import { isValidIdentifier } from '../../../utils/validate'; - -export interface PluginConfig { - fileType: string; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - const { inStrictMode } = next.contextData; - - if (!ir.methods) { - return next; - } - - // 将这些 methods 都定义到 class 上 - const { methods } = ir; - const chunks = Object.keys(methods).map((methodName) => ({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.InsMethod, - content: generateFunction(methods[methodName], { name: methodName, isMember: true }), - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]], - })); - next.chunks.push(...chunks); - - // 严格模式下需要将这些方法都挂到上下文中 - if (inStrictMode) { - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: Object.keys(ir.methods) - .map((methodName) => - isValidIdentifier(methodName) ? `.${methodName}` : `[${JSON.stringify(methodName)}]`, - ) - .map((method) => `this._context${method} = this${method};`) - .join('\n'), - linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]], - }); - } - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/react/jsx.ts b/modules/code-generator/src/plugins/component/react/jsx.ts deleted file mode 100644 index f8a46c4825..0000000000 --- a/modules/code-generator/src/plugins/component/react/jsx.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - HandlerSet, - ICodeStruct, - IContainerInfo, - IScope, - NodeGeneratorConfig, - PIECE_TYPE, -} from '../../../types'; - -import { REACT_CHUNK_NAME } from './const'; -import { COMMON_CHUNK_NAME } from '../../../const/generator'; - -import { createReactNodeGenerator } from '../../../utils/nodeToJSX'; -import { Scope } from '../../../utils/Scope'; -import { IPublicTypeJSExpression } from '@felce/lowcode-types'; -import { generateExpression } from '../../../utils/jsExpression'; -import { transformJsExpr } from '../../../core/jsx/handlers/transformJsExpression'; -import { transformThis2Context } from '../../../core/jsx/handlers/transformThis2Context'; -import { generateCompositeType } from '../../../utils/compositeType'; - -export interface PluginConfig { - fileType?: string; - nodeTypeMapping?: Record; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg = { - fileType: FileType.JSX, - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - nodeTypeMapping: {} as Record, - ...config, - }; - - const { nodeTypeMapping } = cfg; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const { tolerateEvalErrors = true, evalErrorsHandler = '' } = next.contextData; - - // 这里会将内部的一些子上下文的访问(this.xxx)转换为 __$$context.xxx 的形式 - // 与 Rax 所不同的是,这里不会将最顶层的 this 转换掉 - const customHandlers: HandlerSet = { - expression(input: IPublicTypeJSExpression, scope: IScope, config) { - return transformJsExpr(generateExpression(input, scope), scope, { - dontWrapEval: !(config?.tolerateEvalErrors ?? tolerateEvalErrors), - dontTransformThis2ContextAtRootScope: true, - }); - }, - function(input, scope: IScope) { - return transformThis2Context( - generateCompositeType( - { - type: 'JSFunction', - value: input.value || 'function () {}', - }, - Scope.createRootScope(), - ), - scope, - { ignoreRootScope: true }, - ); - }, - }; - - const generatorPlugins: NodeGeneratorConfig = { - handlers: customHandlers, - tagMapping: (v) => nodeTypeMapping[v] || v, - tolerateEvalErrors, - }; - - if (next.contextData.useRefApi) { - generatorPlugins.attrPlugins = [ - (attrData, scope, pluginCfg, nextFunc) => { - if (attrData.attrName === 'ref') { - return [ - { - name: attrData.attrName, - value: `this._refsManager.linkRef('${attrData.attrValue}')`, - type: PIECE_TYPE.ATTR, - }, - ]; - } - - return nextFunc ? nextFunc(attrData, scope, pluginCfg) : []; - }, - ]; - } - - const generator = createReactNodeGenerator(generatorPlugins); - - const ir = next.ir as IContainerInfo; - const scope: IScope = Scope.createRootScope(); - const jsxContent = generator(ir, scope); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: REACT_CHUNK_NAME.ClassRenderJSX, - content: ` - const __$$context = this._context || this; - const { state } = __$$context; - return ${jsxContent}; - `, - linkAfter: [REACT_CHUNK_NAME.ClassRenderStart, REACT_CHUNK_NAME.ClassRenderPre], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.CustomContent, - content: [ - tolerateEvalErrors && - ` - function __$$eval(expr) { - try { - return expr(); - } catch (error) { - ${evalErrorsHandler} - } - } - - function __$$evalArray(expr) { - const res = __$$eval(expr); - return Array.isArray(res) ? res : []; - } - `, - ` - function __$$createChildContext(oldContext, ext) { - const childContext = { - ...oldContext, - ...ext, - }; - childContext.__proto__ = oldContext; - return childContext; - } - `, - ] - .filter(Boolean) - .join('\n'), - linkAfter: [COMMON_CHUNK_NAME.FileExport], - }); - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/react/reactCommonDeps.ts b/modules/code-generator/src/plugins/component/react/reactCommonDeps.ts deleted file mode 100644 index f42aaf61bd..0000000000 --- a/modules/code-generator/src/plugins/component/react/reactCommonDeps.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { COMMON_CHUNK_NAME } from '../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, -} from '../../../types'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JSX, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: ` -// 注意: 出码引擎注入的临时变量默认都以 "__$$" 开头,禁止在搭建的代码中直接访问。 -// 例外:react 框架的导出名和各种组件名除外。 -import React from \'react\';`, - linkAfter: [], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/component/style/css.ts b/modules/code-generator/src/plugins/component/style/css.ts deleted file mode 100644 index 4ef94fdd7c..0000000000 --- a/modules/code-generator/src/plugins/component/style/css.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { COMMON_CHUNK_NAME } from '../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IContainerInfo, -} from '../../../types'; - -export interface PluginConfig { - fileType: string; - moduleFileType: string; -} - -const pluginFactory: BuilderComponentPluginFactory = (config?) => { - const cfg: PluginConfig = { - fileType: FileType.CSS, - moduleFileType: FileType.JSX, - ...config, - }; - - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IContainerInfo; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: COMMON_CHUNK_NAME.StyleCssContent, - content: ir.css, - linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.moduleFileType, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: `import './index.${cfg.fileType}';`, - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/project/constants.ts b/modules/code-generator/src/plugins/project/constants.ts deleted file mode 100644 index 18b286c934..0000000000 --- a/modules/code-generator/src/plugins/project/constants.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { COMMON_CHUNK_NAME } from '../../const/generator'; -import { generateCompositeType } from '../../utils/compositeType'; -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IProjectInfo, -} from '../../types'; -import { Scope } from '../../utils/Scope'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IProjectInfo; - const scope = Scope.createRootScope(); - const constantStr = generateCompositeType(ir.constants || {}, scope); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JS, - name: COMMON_CHUNK_NAME.FileVarDefine, - content: ` - const __$$constants = (${constantStr}); - `, - linkAfter: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JS, - name: COMMON_CHUNK_NAME.FileExport, - content: ` - export default __$$constants; - `, - linkAfter: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - COMMON_CHUNK_NAME.FileMainContent, - ], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/project/framework/icejs/index.ts b/modules/code-generator/src/plugins/project/framework/icejs/index.ts deleted file mode 100644 index e9c8f255fa..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import template from './template'; -import entry from './plugins/entry'; -import entryHtml from './plugins/entryHtml'; -import globalStyle from './plugins/globalStyle'; -import packageJSON from './plugins/packageJSON'; -import router from './plugins/router'; - -export default { - template, - plugins: { - entry, - entryHtml, - globalStyle, - packageJSON, - router, - }, -}; diff --git a/modules/code-generator/src/plugins/project/framework/icejs/plugins/entry.ts b/modules/code-generator/src/plugins/project/framework/icejs/plugins/entry.ts deleted file mode 100644 index b5dc2d8f8a..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/plugins/entry.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { COMMON_CHUNK_NAME } from '../../../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, -} from '../../../../../types'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JS, - name: COMMON_CHUNK_NAME.ExternalDepsImport, - content: ` - import { createApp } from 'ice'; - `, - linkAfter: [], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JS, - name: COMMON_CHUNK_NAME.FileMainContent, - content: ` - const appConfig = { - app: { - rootId: 'app', - }, - router: { - type: 'hash', - }, - }; - createApp(appConfig); - `, - linkAfter: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - ], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/project/framework/icejs/plugins/entryHtml.ts b/modules/code-generator/src/plugins/project/framework/icejs/plugins/entryHtml.ts deleted file mode 100644 index e5837a8dde..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/plugins/entryHtml.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { COMMON_CHUNK_NAME } from '../../../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IProjectInfo, -} from '../../../../../types'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IProjectInfo; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.HTML, - name: COMMON_CHUNK_NAME.HtmlContent, - content: ` - - - - - - - ${ir?.meta?.name || 'Ice App'} - - -
- - - `, - linkAfter: [], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/project/framework/icejs/plugins/globalStyle.ts b/modules/code-generator/src/plugins/project/framework/icejs/plugins/globalStyle.ts deleted file mode 100644 index 3daaeecdc0..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/plugins/globalStyle.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { COMMON_CHUNK_NAME } from '../../../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IProjectInfo, -} from '../../../../../types'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IProjectInfo; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.SCSS, - name: COMMON_CHUNK_NAME.StyleDepsImport, - content: ` - // 引入默认全局样式 - @import '@alifd/next/reset.scss'; - `, - linkAfter: [], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.SCSS, - name: COMMON_CHUNK_NAME.StyleCssContent, - content: ` - body { - -webkit-font-smoothing: antialiased; - } - `, - linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.SCSS, - name: COMMON_CHUNK_NAME.StyleCssContent, - content: ir.css || '', - linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/project/framework/icejs/plugins/packageJSON.ts b/modules/code-generator/src/plugins/project/framework/icejs/plugins/packageJSON.ts deleted file mode 100644 index cc8003c1e7..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/plugins/packageJSON.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { PackageJSON } from '@felce/lowcode-types'; - -import { COMMON_CHUNK_NAME } from '../../../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IProjectInfo, -} from '../../../../../types'; -import { buildDataSourceDependencies } from '../../../../../utils/dataSource'; - -interface IIceJsPackageJSON extends PackageJSON { - ideMode: { - name: string; - }; - iceworks: { - type: string; - adapter: string; - }; - originTemplate: string; -} - -export type IceJsPackageJsonPluginConfig = { - /** - * 数据源配置 - */ - datasourceConfig?: { - /** 数据源引擎的版本 */ - engineVersion?: string; - /** 数据源引擎的包名 */ - enginePackage?: string; - /** 数据源 handlers 的版本 */ - handlersVersion?: { - [key: string]: string; - }; - /** 数据源 handlers 的包名 */ - handlersPackages?: { - [key: string]: string; - }; - }; - /** 包名 */ - packageName?: string; - /** 版本 */ - packageVersion?: string; -}; - -const pluginFactory: BuilderComponentPluginFactory = (cfg) => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IProjectInfo; - - const packageJson: IIceJsPackageJSON = { - name: cfg?.packageName || 'icejs-demo-app', - version: cfg?.packageVersion || '0.1.5', - description: '轻量级模板,使用 JavaScript,仅包含基础的 Layout。', - dependencies: { - moment: '^2.24.0', - react: '^16.4.1', - 'react-dom': '^16.4.1', - 'react-router': '^5.2.1', - '@alifd/theme-design-pro': '^0.x', - 'intl-messageformat': '^9.3.6', - '@ice/store': '^1.4.3', - '@loadable/component': '^5.15.2', - - // 数据源相关的依赖: - ...buildDataSourceDependencies(ir, cfg?.datasourceConfig), - }, - devDependencies: { - '@ice/spec': '^1.0.0', - 'build-plugin-fusion': '^0.1.0', - 'build-plugin-moment-locales': '^0.1.0', - eslint: '^6.0.1', - 'ice.js': '^1.0.0', - stylelint: '^13.2.0', - }, - scripts: { - start: 'icejs start', - build: 'icejs build', - lint: 'npm run eslint && npm run stylelint', - eslint: 'eslint --cache --ext .js,.jsx ./', - stylelint: 'stylelint ./**/*.scss', - }, - ideMode: { - name: 'ice-react', - }, - iceworks: { - type: 'react', - adapter: 'adapter-react-v3', - }, - engines: { - node: '>=8.0.0', - }, - repository: { - type: 'git', - url: 'http://gitlab.xxx.com/msd/leak-scan/tree/master', - }, - private: true, - originTemplate: '@alifd/scaffold-lite-js', - }; - - ir.packages.forEach((packageInfo) => { - packageJson.dependencies[packageInfo.package] = packageInfo.version; - }); - - next.chunks.push({ - type: ChunkType.JSON, - fileType: FileType.JSON, - name: COMMON_CHUNK_NAME.FileMainContent, - content: packageJson, - linkAfter: [], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/project/framework/icejs/plugins/router.ts b/modules/code-generator/src/plugins/project/framework/icejs/plugins/router.ts deleted file mode 100644 index 0e2e8c1f79..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/plugins/router.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { COMMON_CHUNK_NAME } from '../../../../../const/generator'; - -import { - BuilderComponentPlugin, - BuilderComponentPluginFactory, - ChunkType, - FileType, - ICodeStruct, - IRouterInfo, -} from '../../../../../types'; - -const pluginFactory: BuilderComponentPluginFactory = () => { - const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { - const next: ICodeStruct = { - ...pre, - }; - - const ir = next.ir as IRouterInfo; - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JS, - name: COMMON_CHUNK_NAME.InternalDepsImport, - content: ` - import BasicLayout from '@/layouts/BasicLayout'; - `, - linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JS, - name: COMMON_CHUNK_NAME.FileVarDefine, - content: ` - const routerConfig = [ - { - path: '/', - component: BasicLayout, - children: [ - ${ir.routes - .map( - (route) => ` - { - path: '${route.path}', - component: ${route.componentName}, - } - `, - ) - .join(',')} - ], - }, - ]; - `, - linkAfter: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileUtilDefine, - ], - }); - - next.chunks.push({ - type: ChunkType.STRING, - fileType: FileType.JS, - name: COMMON_CHUNK_NAME.FileExport, - content: ` - export default routerConfig; - `, - linkAfter: [ - COMMON_CHUNK_NAME.ExternalDepsImport, - COMMON_CHUNK_NAME.InternalDepsImport, - COMMON_CHUNK_NAME.FileUtilDefine, - COMMON_CHUNK_NAME.ImportAliasDefine, - COMMON_CHUNK_NAME.FileVarDefine, - COMMON_CHUNK_NAME.FileMainContent, - ], - }); - - return next; - }; - return plugin; -}; - -export default pluginFactory; diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/README.md.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/README.md.ts deleted file mode 100644 index 1a0af6c022..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/README.md.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - 'README', - 'md', - ` -## Scaffold Lite - -> 轻量级模板,使用 JavaScript,仅包含基础的 Layout。 - -## 使用 - -\`\`\`bash -# 安装依赖 -$ npm install - -# 启动服务 -$ npm start # visit http://localhost:3333 -\`\`\` - -[More docs](https://ice.work/docs/guide/about). - -## 目录 - -\`\`\`md -├── build/ # 构建产物 -├── mock/ # 本地模拟数据 -│ ├── index.[j,t]s -├── public/ -│ ├── index.html # 应用入口 HTML -│ └── favicon.png # Favicon -├── src/ # 源码路径 -│ ├── components/ # 自定义业务组件 -│ │ └── Guide/ -│ │ ├── index.[j,t]sx -│ │ ├── index.module.scss -│ ├── layouts/ # 布局组件 -│ │ └── BasicLayout/ -│ │ ├── index.[j,t]sx -│ │ └── index.module.scss -│ ├── pages/ # 页面 -│ │ └── Home/ # home 页面,约定路由转成小写 -│ │ ├── components/ # 页面级自定义业务组件 -│ │ ├── models.[j,t]sx # 页面级数据状态 -│ │ ├── index.[j,t]sx # 页面入口 -│ │ └── index.module.scss # 页面样式文件 -│ ├── configs/ # [可选] 配置文件 -│ │ └── menu.[j,t]s # [可选] 菜单配置 -│ ├── models/ # [可选] 应用级数据状态 -│ │ └── user.[j,t]s -│ ├── utils/ # [可选] 工具库 -│ ├── global.scss # 全局样式 -│ ├── routes.[j,t]s # 路由配置 -│ └── app.[j,t]s[x] # 应用入口脚本 -├── build.json # 工程配置 -├── README.md -├── package.json -├── .editorconfig -├── .eslintignore -├── .eslintrc.[j,t]s -├── .gitignore -├── .stylelintignore -├── .stylelintrc.[j,t]s -├── .gitignore -└── [j,t]sconfig.json -\`\`\` - `, - ); - - return [[], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/abc.json.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/abc.json.ts deleted file mode 100644 index 64c69e8c88..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/abc.json.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; - -export default function getFile(): [string[], ResultFile] { - return [ - [], - { - name: 'abc', - ext: 'json', - content: ` -{ - "type": "ice-app", - "builder": "@ali/builder-ice-app" -} - `, - }, - ]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/build.json.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/build.json.ts deleted file mode 100644 index 38baba44ad..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/build.json.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; - -export default function getFile(): [string[], ResultFile] { - return [ - [], - { - name: 'build', - ext: 'json', - content: ` -{ - "entry": "src/app.js", - "plugins": [ - [ - "build-plugin-fusion", - { - "themePackage": "@alifd/theme-design-pro" - } - ], - [ - "build-plugin-moment-locales", - { - "locales": [ - "zh-cn" - ] - } - ] - ] -} - `, - }, - ]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/editorconfig.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/editorconfig.ts deleted file mode 100644 index 047a28d4c6..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/editorconfig.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - '.editorconfig', - '', - ` -# http://editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false - `, - ); - - return [[], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/eslintignore.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/eslintignore.ts deleted file mode 100644 index 6f217227b3..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/eslintignore.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - '.eslintignore', - '', - ` -# 忽略目录 -build/ -tests/ -demo/ -.ice/ - -# node 覆盖率文件 -coverage/ - -# 忽略文件 -**/*-min.js -**/*.min.js - -package-lock.json -yarn.lock - `, - ); - - return [[], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/eslintrc.js.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/eslintrc.js.ts deleted file mode 100644 index 2d2838991f..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/eslintrc.js.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - '.eslintrc', - 'js', - ` -const { eslint } = require('@ice/spec'); - -module.exports = eslint; - `, - ); - - return [[], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/gitignore.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/gitignore.ts deleted file mode 100644 index 5f93665286..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/gitignore.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - '.gitignore', - '', - ` -# See https://help.github.com/ignore-files/ for more about ignoring files. - -# dependencies -node_modules/ - -# production -build/ -dist/ -tmp/ -lib/ - -# misc -.idea/ -.happypack -.DS_Store -*.swp -*.dia~ -.ice - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -index.module.scss.d.ts - `, - ); - - return [[], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/jsconfig.json.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/jsconfig.json.ts deleted file mode 100644 index a859c38376..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/jsconfig.json.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - 'jsconfig', - 'json', - ` -{ - "compilerOptions": { - "baseUrl": ".", - "jsx": "react", - "paths": { - "@/*": ["./src/*"], - "ice": [".ice/index.ts"], - "ice/*": [".ice/pages/*"] - } - } -} - `, - ); - - return [[], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/prettierignore.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/prettierignore.ts deleted file mode 100644 index 18e55fd6ed..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/prettierignore.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - '.prettierignore', - '', - ` -build/ -tests/ -demo/ -.ice/ -coverage/ -**/*-min.js -**/*.min.js -package-lock.json -yarn.lock - `, - ); - - return [[], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/prettierrc.js.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/prettierrc.js.ts deleted file mode 100644 index ae48aaaf17..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/prettierrc.js.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - '.prettierrc', - 'js', - ` -const { prettier } = require('@ice/spec'); - -module.exports = prettier; - `, - ); - - return [[], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.jsx.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.jsx.ts deleted file mode 100644 index ae5b302ba1..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.jsx.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - 'index', - 'jsx', - ` -import React from 'react'; -import styles from './index.module.scss'; - -export default function Footer() { - return ( -

- Alibaba Fusion -
- © 2019-现在 Alibaba Fusion & ICE -

- ); -} - `, - ); - - return [['src', 'layouts', 'BasicLayout', 'components', 'Footer'], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.style.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.style.ts deleted file mode 100644 index 7204e9903c..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.style.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - 'index', - 'module.scss', - ` -.footer { - line-height: 20px; - text-align: center; -} - -.logo { - font-weight: bold; - font-size: 16px; -} - -.copyright { - font-size: 12px; -} - `, - ); - - return [['src', 'layouts', 'BasicLayout', 'components', 'Footer'], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.jsx.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.jsx.ts deleted file mode 100644 index bce1af8443..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.jsx.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - 'index', - 'jsx', - ` -import React from 'react'; -import { Link } from 'ice'; -import styles from './index.module.scss'; - -export default function Logo({ image, text, url }) { - return ( -
- - {image && logo} - {text} - -
- ); -} - `, - ); - - return [['src', 'layouts', 'BasicLayout', 'components', 'Logo'], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.style.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.style.ts deleted file mode 100644 index 50fa8d001c..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.style.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - 'index', - 'module.scss', - ` -.logo{ - display: flex; - align-items: center; - justify-content: center; - color: $color-text1-1; - font-weight: bold; - font-size: 14px; - line-height: 22px; - - &:visited, &:link { - color: $color-text1-1; - } - - img { - height: 24px; - margin-right: 10px; - } -} - `, - ); - - return [['src', 'layouts', 'BasicLayout', 'components', 'Logo'], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/PageNav/index.jsx.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/PageNav/index.jsx.ts deleted file mode 100644 index 02b8791bd1..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/PageNav/index.jsx.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - 'index', - 'jsx', - ` -import React from 'react'; -import PropTypes from 'prop-types'; -import { Link, withRouter } from 'ice'; -import { Nav } from '@alifd/next'; -import { asideMenuConfig } from '../../menuConfig'; - -const { SubNav } = Nav; -const NavItem = Nav.Item; - -function getNavMenuItems(menusData) { - if (!menusData) { - return []; - } - - return menusData - .filter(item => item.name && !item.hideInMenu) - .map((item, index) => getSubMenuOrItem(item, index)); -} - -function getSubMenuOrItem(item, index) { - if (item.children && item.children.some(child => child.name)) { - const childrenItems = getNavMenuItems(item.children); - - if (childrenItems && childrenItems.length > 0) { - const subNav = ( - - {childrenItems} - - ); - return subNav; - } - - return null; - } - - const navItem = ( - - {item.name} - - ); - return navItem; -} - -const Navigation = (props, context) => { - const { location } = props; - const { pathname } = location; - const { isCollapse } = context; - return ( - - ); -}; - -Navigation.contextTypes = { - isCollapse: PropTypes.bool, -}; -const PageNav = withRouter(Navigation); -export default PageNav; - `, - ); - - return [['src', 'layouts', 'BasicLayout', 'components', 'PageNav'], file]; -} diff --git a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/index.jsx.ts b/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/index.jsx.ts deleted file mode 100644 index c544e96101..0000000000 --- a/modules/code-generator/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/index.jsx.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { ResultFile } from '@felce/lowcode-types'; -import { createResultFile } from '../../../../../../../../../utils/resultHelper'; - -export default function getFile(): [string[], ResultFile] { - const file = createResultFile( - 'index', - 'jsx', - ` -import React, { useState } from 'react'; -import { Shell, ConfigProvider } from '@alifd/next'; -import PageNav from './components/PageNav'; -import Logo from './components/Logo'; -import Footer from './components/Footer'; - -(function() { - const throttle = function(type, name, obj = window) { - let running = false; - - const func = () => { - if (running) { - return; - } - - running = true; - requestAnimationFrame(() => { - obj.dispatchEvent(new CustomEvent(name)); - running = false; - }); - }; - - obj.addEventListener(type, func); - }; - - throttle('resize', 'optimizedResize'); -})(); - -export default function BasicLayout({ children }) { - const getDevice = width => { - const isPhone = - typeof navigator !== 'undefined' && navigator && navigator.userAgent.match(/phone/gi); - - if (width < 680 || isPhone) { - return 'phone'; - } - if (width < 1280 && width > 680) { - return 'tablet'; - } - return 'desktop'; - }; - - const [device, setDevice] = useState(getDevice(NaN)); - window.addEventListener('optimizedResize', e => { - setDevice(getDevice(e && e.target && e.target.innerWidth)); - }); - return ( - - - - - - - - - - - - {children} - -