From eb73686c245d4c8164d4fecada5563f02122bbb5 Mon Sep 17 00:00:00 2001 From: liujuping Date: Thu, 15 Sep 2022 15:14:52 +0800 Subject: [PATCH 01/12] chore: added codecov with ci git action --- .github/workflows/ci.yml | 116 ++++++++++++++++++ .../code-generator/src/parser/SchemaParser.ts | 2 +- .../src/utils/expressionParser.ts | 4 +- packages/engine/README-zh_CN.md | 7 +- packages/engine/README.md | 5 + .../react-simulator-renderer/package.json | 3 +- 6 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..4636a1bdd --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,116 @@ +name: Node CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + upload-designer-codecov: + runs-on: ubuntu-latest + # if: ${{ github.event.pull_request.head.repo.full_name == 'alibaba/lowcode-engine' }} + steps: + - name: checkout + uses: actions/checkout@v2 + + - uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: install + run: npm i && npm run setup:skip-build + + - name: test designer + run: cd packages/designer && npm run test:cov && cd ../.. + + - name: Upload designer coverage to Codecov + uses: codecov/codecov-action@v3 + with: + # working-directory: packages/designer + directory: ./packages/designer/coverage + token: ${{ secrets.CODECOV_TOKEN }} + name: designer + fail_ci_if_error: true + verbose: true + + upload-renderer-core: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v2 + + - uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: install + run: npm i && npm run setup:skip-build + + - name: test renderer-core + run: cd packages/renderer-core && npm run test:cov && cd ../.. + + - name: Upload renderer-core coverage to Codecov + uses: codecov/codecov-action@v3 + with: + # working-directory: packages/designer + directory: ./packages/renderer-core/coverage + token: ${{ secrets.CODECOV_TOKEN }} + name: renderer-core + fail_ci_if_error: true + verbose: true + + upload-react-simulator-renderer: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v2 + + - uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: install + run: npm i && npm run setup:skip-build + + - name: test react-simulator-renderer + run: cd packages/react-simulator-renderer && npm run test:cov && cd ../.. + + - name: Upload react-simulator-renderer coverage to Codecov + uses: codecov/codecov-action@v3 + with: + # working-directory: packages/designer + directory: ./packages/react-simulator-renderer/coverage + token: ${{ secrets.CODECOV_TOKEN }} + name: react-simulator-renderer + fail_ci_if_error: true + verbose: true + + upload-code-generator: + runs-on: ubuntu-latest + # if: ${{ github.event.pull_request.head.repo.full_name == 'alibaba/lowcode-engine' }} + steps: + - name: checkout + uses: actions/checkout@v2 + + - uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: install + run: npm i && npm run setup:skip-build + + - name: test code-generator + run: cd modules/code-generator && npm i && npm run build && npm run test:cov && cd ../.. + + - name: Upload code-generator coverage to Codecov + uses: codecov/codecov-action@v3 + with: + # working-directory: packages/designer + directory: ./modules/code-generator/coverage + token: ${{ secrets.CODECOV_TOKEN }} + name: code-generator + fail_ci_if_error: true + verbose: true \ No newline at end of file diff --git a/modules/code-generator/src/parser/SchemaParser.ts b/modules/code-generator/src/parser/SchemaParser.ts index b7b9f2b0f..2e526d88b 100644 --- a/modules/code-generator/src/parser/SchemaParser.ts +++ b/modules/code-generator/src/parser/SchemaParser.ts @@ -123,7 +123,7 @@ export class SchemaParser implements ISchemaParser { const schema = this.decodeSchema(schemaSrc); // 解析三方组件依赖 - schema.componentsMap.forEach((info) => { + schema.componentsMap.forEach((info: any) => { if (info.componentName) { compDeps[info.componentName] = { ...info, diff --git a/modules/code-generator/src/utils/expressionParser.ts b/modules/code-generator/src/utils/expressionParser.ts index 3589fc3f5..58c6e6ca8 100644 --- a/modules/code-generator/src/utils/expressionParser.ts +++ b/modules/code-generator/src/utils/expressionParser.ts @@ -181,7 +181,7 @@ export function parseExpressionGetKeywords(expr: string | null | undefined): str const fieldValue = node[fieldName as keyof typeof node]; if (typeof fieldValue === 'object') { if (Array.isArray(fieldValue)) { - fieldValue.forEach((item) => { + fieldValue.forEach((item: any) => { addIdentifierIfNeeded(item); }); } else { @@ -233,7 +233,7 @@ export function parseExpressionGetGlobalVariables( const fieldValue = node[fieldName as keyof typeof node]; if (typeof fieldValue === 'object') { if (Array.isArray(fieldValue)) { - fieldValue.forEach((item) => { + fieldValue.forEach((item: any) => { addUndeclaredIdentifierIfNeeded(item, path); }); } else { diff --git a/packages/engine/README-zh_CN.md b/packages/engine/README-zh_CN.md index 91e90ad52..5a070affb 100644 --- a/packages/engine/README-zh_CN.md +++ b/packages/engine/README-zh_CN.md @@ -12,7 +12,9 @@ [![NPM version][npm-image]][npm-url] [![NPM downloads][download-image]][download-url] - [![][issues-helper-image]][issues-helper-url] [![Issues need help][help-wanted-image]][help-wanted-url] +[![][issues-helper-image]][issues-helper-url] [![Issues need help][help-wanted-image]][help-wanted-url] + +[![codecov][codecov-image-url]][codecov-url] [npm-image]: https://img.shields.io/npm/v/@alilc/lowcode-engine.svg?style=flat-square [npm-url]: http://npmjs.org/package/@alilc/lowcode-engine @@ -25,6 +27,9 @@ [issues-helper-image]: https://img.shields.io/badge/using-issues--helper-orange?style=flat-square [issues-helper-url]: https://github.com/actions-cool/issues-helper +[codecov-image-url]: https://codecov.io/gh/alibaba/lowcode-engine/branch/main/graph/badge.svg +[codecov-url]: https://codecov.io/gh/alibaba/lowcode-engine + [![](https://img.alicdn.com/imgextra/i2/O1CN01UhoS7C1sNNhySvfWi_!!6000000005754-2-tps-2878-1588.png)](https://lowcode-engine.cn) diff --git a/packages/engine/README.md b/packages/engine/README.md index c4cc5f8ae..63e967140 100644 --- a/packages/engine/README.md +++ b/packages/engine/README.md @@ -14,6 +14,8 @@ An enterprise-class low-code technology stack with scale-out design [![][issues-helper-image]][issues-helper-url] [![Issues need help][help-wanted-image]][help-wanted-url] +[![codecov][codecov-image-url]][codecov-url] + [npm-image]: https://img.shields.io/npm/v/@alilc/lowcode-engine.svg?style=flat-square [npm-url]: http://npmjs.org/package/@alilc/lowcode-engine @@ -25,6 +27,9 @@ An enterprise-class low-code technology stack with scale-out design [issues-helper-image]: https://img.shields.io/badge/using-issues--helper-orange?style=flat-square [issues-helper-url]: https://github.com/actions-cool/issues-helper +[codecov-image-url]: https://codecov.io/gh/alibaba/lowcode-engine/branch/main/graph/badge.svg +[codecov-url]: https://codecov.io/gh/alibaba/lowcode-engine + [![](https://img.alicdn.com/imgextra/i2/O1CN01UhoS7C1sNNhySvfWi_!!6000000005754-2-tps-2878-1588.png)](http://lowcode-engine.cn) diff --git a/packages/react-simulator-renderer/package.json b/packages/react-simulator-renderer/package.json index 348d5a605..f15f503d0 100644 --- a/packages/react-simulator-renderer/package.json +++ b/packages/react-simulator-renderer/package.json @@ -13,7 +13,8 @@ "scripts": { "test": "build-scripts test --config build.test.json", "build": "NODE_OPTIONS=--max_old_space_size=8192 build-scripts build --skip-demo", - "build:umd": "NODE_OPTIONS=--max_old_space_size=8192 build-scripts build --config build.umd.json" + "build:umd": "NODE_OPTIONS=--max_old_space_size=8192 build-scripts build --config build.umd.json", + "test:cov": "build-scripts test --config build.test.json --jest-coverage" }, "dependencies": { "@alilc/lowcode-designer": "1.0.14", From 2b2bcbdaebde6a3ce974072f586386ef7ef3497c Mon Sep 17 00:00:00 2001 From: "ruhuo.tan" Date: Thu, 15 Sep 2022 17:39:22 +0800 Subject: [PATCH 02/12] fix: fix displayName spell mistake --- packages/rax-renderer/src/hoc/compFactory.tsx | 2 +- packages/renderer-core/src/renderer/addon.tsx | 4 ++-- packages/renderer-core/src/renderer/block.tsx | 4 ++-- packages/renderer-core/src/renderer/component.tsx | 4 ++-- packages/renderer-core/src/renderer/page.tsx | 4 ++-- packages/renderer-core/src/renderer/renderer.tsx | 2 +- packages/renderer-core/src/renderer/temp.tsx | 4 ++-- packages/renderer-core/src/types/index.ts | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/rax-renderer/src/hoc/compFactory.tsx b/packages/rax-renderer/src/hoc/compFactory.tsx index 58c7aa763..c7c29cf35 100644 --- a/packages/rax-renderer/src/hoc/compFactory.tsx +++ b/packages/rax-renderer/src/hoc/compFactory.tsx @@ -17,7 +17,7 @@ export default function compFactory(schema, components = {}, componentsMap = {}, const AppContext = contextFactory(); class LNCompView extends Component { - static dislayName = 'lce-comp-factory'; + static displayName = 'lce-comp-factory'; static version = config.version || '0.0.0'; diff --git a/packages/renderer-core/src/renderer/addon.tsx b/packages/renderer-core/src/renderer/addon.tsx index 964de1858..19b8ae46e 100644 --- a/packages/renderer-core/src/renderer/addon.tsx +++ b/packages/renderer-core/src/renderer/addon.tsx @@ -6,7 +6,7 @@ import { IRendererAppHelper, IBaseRendererProps, IBaseRenderComponent } from '.. export default function addonRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class AddonRenderer extends BaseRenderer { - static dislayName = 'addon-renderer'; + static displayName = 'addon-renderer'; __namespace = 'addon'; @@ -69,7 +69,7 @@ export default function addonRendererFactory(): IBaseRenderComponent { return '插件 schema 结构异常!'; } - this.__debug(`${AddonRenderer.dislayName} render - ${__schema.fileName}`); + this.__debug(`${AddonRenderer.displayName} render - ${__schema.fileName}`); this.__generateCtx({ component: this, }); diff --git a/packages/renderer-core/src/renderer/block.tsx b/packages/renderer-core/src/renderer/block.tsx index f87997864..e9b53e1ad 100644 --- a/packages/renderer-core/src/renderer/block.tsx +++ b/packages/renderer-core/src/renderer/block.tsx @@ -4,7 +4,7 @@ import { IBaseRendererProps, IBaseRenderComponent } from '../types'; export default function blockRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class BlockRenderer extends BaseRenderer { - static dislayName = 'block-renderer'; + static displayName = 'block-renderer'; __namespace = 'block'; @@ -23,7 +23,7 @@ export default function blockRendererFactory(): IBaseRenderComponent { return '区块 schema 结构异常!'; } - this.__debug(`${BlockRenderer.dislayName} render - ${__schema?.fileName}`); + this.__debug(`${BlockRenderer.displayName} render - ${__schema?.fileName}`); this.__generateCtx({}); this.__render(); diff --git a/packages/renderer-core/src/renderer/component.tsx b/packages/renderer-core/src/renderer/component.tsx index 85b1fd4d3..0d3f9fa56 100644 --- a/packages/renderer-core/src/renderer/component.tsx +++ b/packages/renderer-core/src/renderer/component.tsx @@ -4,7 +4,7 @@ import { IBaseRendererProps, IBaseRenderComponent } from '../types'; export default function componentRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class CompRenderer extends BaseRenderer { - static dislayName = 'comp-renderer'; + static displayName = 'comp-renderer'; __namespace = 'component'; @@ -23,7 +23,7 @@ export default function componentRendererFactory(): IBaseRenderComponent { if (this.__checkSchema(__schema)) { return '自定义组件 schema 结构异常!'; } - this.__debug(`${CompRenderer.dislayName} render - ${__schema.fileName}`); + this.__debug(`${CompRenderer.displayName} render - ${__schema.fileName}`); this.__generateCtx({ component: this, diff --git a/packages/renderer-core/src/renderer/page.tsx b/packages/renderer-core/src/renderer/page.tsx index 817b9b128..9e0d63a38 100644 --- a/packages/renderer-core/src/renderer/page.tsx +++ b/packages/renderer-core/src/renderer/page.tsx @@ -4,7 +4,7 @@ import { IBaseRendererProps, IBaseRenderComponent } from '../types'; export default function pageRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class PageRenderer extends BaseRenderer { - static dislayName = 'page-renderer'; + static displayName = 'page-renderer'; __namespace = 'page'; @@ -34,7 +34,7 @@ export default function pageRendererFactory(): IBaseRenderComponent { if (this.__checkSchema(__schema)) { return '页面schema结构异常!'; } - this.__debug(`${PageRenderer.dislayName} render - ${__schema.fileName}`); + this.__debug(`${PageRenderer.displayName} render - ${__schema.fileName}`); this.__bindCustomMethods(this.props); this.__initDataSource(this.props); diff --git a/packages/renderer-core/src/renderer/renderer.tsx b/packages/renderer-core/src/renderer/renderer.tsx index 59d63f790..c7e98cca8 100644 --- a/packages/renderer-core/src/renderer/renderer.tsx +++ b/packages/renderer-core/src/renderer/renderer.tsx @@ -46,7 +46,7 @@ export default function rendererFactory(): IRenderComponent { } return class Renderer extends Component { - static dislayName = 'renderer'; + static displayName = 'renderer'; state: Partial = {}; diff --git a/packages/renderer-core/src/renderer/temp.tsx b/packages/renderer-core/src/renderer/temp.tsx index 79d825d09..a70292711 100644 --- a/packages/renderer-core/src/renderer/temp.tsx +++ b/packages/renderer-core/src/renderer/temp.tsx @@ -5,7 +5,7 @@ export default function tempRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class TempRenderer extends BaseRenderer { - static dislayName = 'temp-renderer'; + static displayName = 'temp-renderer'; __namespace = 'temp'; @@ -51,7 +51,7 @@ export default function tempRendererFactory(): IBaseRenderComponent { return '下钻编辑 schema 结构异常!'; } - this.__debug(`${TempRenderer.dislayName} render - ${__schema?.fileName}`); + this.__debug(`${TempRenderer.displayName} render - ${__schema?.fileName}`); return this.__renderContent(this.__renderContextProvider({ __ctx })); } diff --git a/packages/renderer-core/src/types/index.ts b/packages/renderer-core/src/types/index.ts index 7aa2f8ec4..9f0880633 100644 --- a/packages/renderer-core/src/types/index.ts +++ b/packages/renderer-core/src/types/index.ts @@ -288,7 +288,7 @@ export interface IRenderComponent { getNotFoundComponent(): any; getFaultComponent(): any; }; - dislayName: string; + displayName: string; defaultProps: IRendererProps; findDOMNode: (...args: any) => any; } From bca8cd23a4808a06dd743826cc2e6843f2147148 Mon Sep 17 00:00:00 2001 From: "ruhuo.tan" Date: Mon, 19 Sep 2022 19:01:02 +0800 Subject: [PATCH 03/12] chore: change displayName from kecab-case to PascalCase --- packages/rax-renderer/src/hoc/compFactory.tsx | 2 +- packages/renderer-core/src/renderer/addon.tsx | 2 +- packages/renderer-core/src/renderer/base.tsx | 2 +- packages/renderer-core/src/renderer/block.tsx | 2 +- packages/renderer-core/src/renderer/component.tsx | 2 +- packages/renderer-core/src/renderer/page.tsx | 2 +- packages/renderer-core/src/renderer/renderer.tsx | 2 +- packages/renderer-core/src/renderer/temp.tsx | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/rax-renderer/src/hoc/compFactory.tsx b/packages/rax-renderer/src/hoc/compFactory.tsx index c7c29cf35..1c821ab6d 100644 --- a/packages/rax-renderer/src/hoc/compFactory.tsx +++ b/packages/rax-renderer/src/hoc/compFactory.tsx @@ -17,7 +17,7 @@ export default function compFactory(schema, components = {}, componentsMap = {}, const AppContext = contextFactory(); class LNCompView extends Component { - static displayName = 'lce-comp-factory'; + static displayName = 'LceCompFactory'; static version = config.version || '0.0.0'; diff --git a/packages/renderer-core/src/renderer/addon.tsx b/packages/renderer-core/src/renderer/addon.tsx index 19b8ae46e..62aeddbba 100644 --- a/packages/renderer-core/src/renderer/addon.tsx +++ b/packages/renderer-core/src/renderer/addon.tsx @@ -6,7 +6,7 @@ import { IRendererAppHelper, IBaseRendererProps, IBaseRenderComponent } from '.. export default function addonRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class AddonRenderer extends BaseRenderer { - static displayName = 'addon-renderer'; + static displayName = 'AddonRenderer'; __namespace = 'addon'; diff --git a/packages/renderer-core/src/renderer/base.tsx b/packages/renderer-core/src/renderer/base.tsx index 76e2e85dc..aae951409 100644 --- a/packages/renderer-core/src/renderer/base.tsx +++ b/packages/renderer-core/src/renderer/base.tsx @@ -126,7 +126,7 @@ export default function baseRendererFactory(): IBaseRenderComponent { let scopeIdx = 0; return class BaseRenderer extends Component { - static displayName = 'base-renderer'; + static displayName = 'BaseRenderer'; static defaultProps = { __schema: {}, diff --git a/packages/renderer-core/src/renderer/block.tsx b/packages/renderer-core/src/renderer/block.tsx index e9b53e1ad..560b5924b 100644 --- a/packages/renderer-core/src/renderer/block.tsx +++ b/packages/renderer-core/src/renderer/block.tsx @@ -4,7 +4,7 @@ import { IBaseRendererProps, IBaseRenderComponent } from '../types'; export default function blockRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class BlockRenderer extends BaseRenderer { - static displayName = 'block-renderer'; + static displayName = 'BlockRenderer'; __namespace = 'block'; diff --git a/packages/renderer-core/src/renderer/component.tsx b/packages/renderer-core/src/renderer/component.tsx index 0d3f9fa56..58d5c0093 100644 --- a/packages/renderer-core/src/renderer/component.tsx +++ b/packages/renderer-core/src/renderer/component.tsx @@ -4,7 +4,7 @@ import { IBaseRendererProps, IBaseRenderComponent } from '../types'; export default function componentRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class CompRenderer extends BaseRenderer { - static displayName = 'comp-renderer'; + static displayName = 'CompRenderer'; __namespace = 'component'; diff --git a/packages/renderer-core/src/renderer/page.tsx b/packages/renderer-core/src/renderer/page.tsx index 9e0d63a38..ba1140c6b 100644 --- a/packages/renderer-core/src/renderer/page.tsx +++ b/packages/renderer-core/src/renderer/page.tsx @@ -4,7 +4,7 @@ import { IBaseRendererProps, IBaseRenderComponent } from '../types'; export default function pageRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class PageRenderer extends BaseRenderer { - static displayName = 'page-renderer'; + static displayName = 'PageRenderer'; __namespace = 'page'; diff --git a/packages/renderer-core/src/renderer/renderer.tsx b/packages/renderer-core/src/renderer/renderer.tsx index c7e98cca8..8db681a5f 100644 --- a/packages/renderer-core/src/renderer/renderer.tsx +++ b/packages/renderer-core/src/renderer/renderer.tsx @@ -46,7 +46,7 @@ export default function rendererFactory(): IRenderComponent { } return class Renderer extends Component { - static displayName = 'renderer'; + static displayName = 'Renderer'; state: Partial = {}; diff --git a/packages/renderer-core/src/renderer/temp.tsx b/packages/renderer-core/src/renderer/temp.tsx index a70292711..83adef7e3 100644 --- a/packages/renderer-core/src/renderer/temp.tsx +++ b/packages/renderer-core/src/renderer/temp.tsx @@ -5,7 +5,7 @@ export default function tempRendererFactory(): IBaseRenderComponent { const BaseRenderer = baseRendererFactory(); return class TempRenderer extends BaseRenderer { - static displayName = 'temp-renderer'; + static displayName = 'TempRenderer'; __namespace = 'temp'; From 89abae82e20194b385a406277ff3bee87636c1b7 Mon Sep 17 00:00:00 2001 From: wenyujie Date: Mon, 19 Sep 2022 17:50:47 +0800 Subject: [PATCH 04/12] chore(docs): update material-spec --- specs/material-spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/material-spec.md b/specs/material-spec.md index 790063e7a..77938bca1 100644 --- a/specs/material-spec.md +++ b/specs/material-spec.md @@ -617,7 +617,7 @@ component | screenshot | 组件快照 | String | 否 | | icon | 组件的小图标 | String (URL) | 是 | | tags | 组件标签 | String | 是 | -| keywards | 组件关键词,用于搜索联想 | String | 是 | +| keywords | 组件关键词,用于搜索联想 | String | 是 | | devMode | 组件研发模式 | String  (procode,lowcode) | 是 | | npm | npm 源引入完整描述对象 | Object | 否 | | npm.package | 源码组件库名 | String | 否 | From ecb9dca2b9386ef6fadfd009d161a9203b9b9558 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?DB=E7=BB=B4=E4=B8=80=28s=2Ey=29?= Date: Tue, 20 Sep 2022 10:06:21 +0800 Subject: [PATCH 05/12] fix: spec typo (#1064) --- specs/material-spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/material-spec.md b/specs/material-spec.md index 77938bca1..3733ae202 100644 --- a/specs/material-spec.md +++ b/specs/material-spec.md @@ -618,7 +618,7 @@ component | icon | 组件的小图标 | String (URL) | 是 | | tags | 组件标签 | String | 是 | | keywords | 组件关键词,用于搜索联想 | String | 是 | -| devMode | 组件研发模式 | String  (procode,lowcode) | 是 | +| devMode | 组件研发模式 | String  (proCode,lowCode) | 是 | | npm | npm 源引入完整描述对象 | Object | 否 | | npm.package | 源码组件库名 | String | 否 | | npm.exportName | 源码组件名称 | String | 否 | From f4001728259047b09db75d76a8c3ef1e1bcb4e0a Mon Sep 17 00:00:00 2001 From: liujuping Date: Wed, 21 Sep 2022 10:09:38 +0800 Subject: [PATCH 06/12] fix: fix the leaf hoc component fails to monitor Node changes, and modify the logic for get node --- packages/rax-simulator-renderer/src/renderer.ts | 1 + .../react-simulator-renderer/src/renderer.ts | 1 + packages/renderer-core/package.json | 1 + packages/renderer-core/src/hoc/leaf.tsx | 7 ++++++- packages/renderer-core/tests/hoc/leaf.test.tsx | 16 +++++++++++++++- 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/rax-simulator-renderer/src/renderer.ts b/packages/rax-simulator-renderer/src/renderer.ts index 0e42785e7..a123dfc7e 100644 --- a/packages/rax-simulator-renderer/src/renderer.ts +++ b/packages/rax-simulator-renderer/src/renderer.ts @@ -538,6 +538,7 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer { // mock _leaf,减少性能开销 const _leaf = { isEmpty: () => false, + isMock: true, }; viewProps._leaf = _leaf; return createElement(Comp, viewProps, children); diff --git a/packages/react-simulator-renderer/src/renderer.ts b/packages/react-simulator-renderer/src/renderer.ts index 5605ba479..2c6f9be06 100644 --- a/packages/react-simulator-renderer/src/renderer.ts +++ b/packages/react-simulator-renderer/src/renderer.ts @@ -465,6 +465,7 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer { // mock _leaf,减少性能开销 const _leaf = { isEmpty: () => false, + isMock: true, }; viewProps._leaf = _leaf; return createElement(Comp, viewProps, children); diff --git a/packages/renderer-core/package.json b/packages/renderer-core/package.json index 1466bf1fb..69acc9a5c 100644 --- a/packages/renderer-core/package.json +++ b/packages/renderer-core/package.json @@ -32,6 +32,7 @@ }, "devDependencies": { "@alib/build-scripts": "^0.1.18", + "@alifd/next": "^1.26.0", "@alilc/lowcode-designer": "1.0.14", "@alilc/lowcode-test-mate": "^1.0.1", "@babel/plugin-transform-typescript": "^7.16.8", diff --git a/packages/renderer-core/src/hoc/leaf.tsx b/packages/renderer-core/src/hoc/leaf.tsx index 3c1c96b72..d97140192 100644 --- a/packages/renderer-core/src/hoc/leaf.tsx +++ b/packages/renderer-core/src/hoc/leaf.tsx @@ -514,7 +514,12 @@ export function leafWrapper(Comp: types.IBaseRenderComponent, { } get leaf(): Node | undefined { - return this.props._leaf || getNode?.(componentCacheId); + if (this.props._leaf?.isMock) { + // 低代码组件作为一个整体更新,其内部的组件不需要监听相关事件 + return undefined; + } + + return getNode?.(componentCacheId); } render() { diff --git a/packages/renderer-core/tests/hoc/leaf.test.tsx b/packages/renderer-core/tests/hoc/leaf.test.tsx index 308a8b900..4539aae45 100644 --- a/packages/renderer-core/tests/hoc/leaf.test.tsx +++ b/packages/renderer-core/tests/hoc/leaf.test.tsx @@ -232,6 +232,9 @@ describe('mini unit render', () => { parent: MiniRenderDivNode, }); + nodeMap.set(miniRenderSchema.id, MiniRenderDivNode); + nodeMap.set(textSchema.id, TextNode); + component = renderer.create( // @ts-ignore @@ -277,6 +280,8 @@ describe('mini unit render', () => { }), }); + nodeMap.set(textSchema.id, TextNode); + renderer.create( // @ts-ignore
@@ -319,6 +324,8 @@ describe('mini unit render', () => { isRoot: true, }); + nodeMap.set(textSchema.id, TextNode); + const component = renderer.create( ); @@ -351,6 +358,8 @@ describe('mini unit render', () => { }) }); + nodeMap.set(textSchema.id, TextNode); + const component = renderer.create( ); @@ -370,7 +379,9 @@ describe('mini unit render', () => { }); it('parent is a mock leaf', () => { - const MiniRenderDivNode = {}; + const MiniRenderDivNode = { + isMock: true, + }; const component = renderer.create( // @ts-ignore @@ -409,6 +420,9 @@ describe('mini unit render', () => { hasLoop: true, }); + nodeMap.set(textSchema.id, TextNode); + nodeMap.set(miniRenderSchema.id, MiniRenderDivNode); + component = renderer.create( // @ts-ignore From 3d41fd5d0783048a7cfb54c6f80d058856153d25 Mon Sep 17 00:00:00 2001 From: jingyu Date: Wed, 3 Aug 2022 11:08:08 +0800 Subject: [PATCH 07/12] =?UTF-8?q?fix:=20=E6=96=B0=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=9C=A8=E5=A4=A7=E7=BA=B2=E6=A0=91=E6=8B=96?= =?UTF-8?q?=E6=8B=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/plugin-outline-pane/src/main.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/plugin-outline-pane/src/main.ts b/packages/plugin-outline-pane/src/main.ts index 1f2e23ffd..85c4021f0 100644 --- a/packages/plugin-outline-pane/src/main.ts +++ b/packages/plugin-outline-pane/src/main.ts @@ -152,7 +152,8 @@ export class OutlineMain implements ISensor, ITreeBoard, IScrollable { return canMove; }); - if (!operationalNodes || operationalNodes.length === 0) { + // 如果拖拽的是 Node 才需要后面的判断,拖拽 data 不需要 + if (isDragNodeObject(dragObject) && (!operationalNodes || operationalNodes.length === 0)) { return; } From 6ee6b07a10ba4aac583def52d8ff1fa78d111d0b Mon Sep 17 00:00:00 2001 From: liujuping Date: Wed, 21 Sep 2022 10:09:38 +0800 Subject: [PATCH 08/12] fix: fix the leaf hoc component fails to monitor Node changes, and modify the logic for get node --- packages/renderer-core/src/hoc/leaf.tsx | 5 ++--- .../renderer-core/tests/hoc/__snapshots__/leaf.test.tsx.snap | 2 ++ packages/renderer-core/tests/hoc/leaf.test.tsx | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/renderer-core/src/hoc/leaf.tsx b/packages/renderer-core/src/hoc/leaf.tsx index d97140192..d4fa2afef 100644 --- a/packages/renderer-core/src/hoc/leaf.tsx +++ b/packages/renderer-core/src/hoc/leaf.tsx @@ -5,7 +5,6 @@ import { EngineOptions } from '@alilc/lowcode-editor-core'; import { debounce } from '../utils/common'; import adapter from '../adapter'; import * as types from '../types/index'; -import { parseData } from '../utils'; export interface IComponentHocInfo { schema: any; @@ -363,12 +362,12 @@ export function leafWrapper(Comp: types.IBaseRenderComponent, { }; componentWillReceiveProps(nextProps: any) { - let { _leaf, componentId } = nextProps; + let { componentId } = nextProps; if (nextProps.__tag === this.props.__tag) { return null; } - _leaf = _leaf || getNode?.(componentId); + const _leaf = getNode?.(componentId); if (_leaf && this.curEventLeaf && _leaf !== this.curEventLeaf) { this.disposeFunctions.forEach((fn) => fn()); this.disposeFunctions = []; diff --git a/packages/renderer-core/tests/hoc/__snapshots__/leaf.test.tsx.snap b/packages/renderer-core/tests/hoc/__snapshots__/leaf.test.tsx.snap index 253a099c7..e0ddfa8c2 100644 --- a/packages/renderer-core/tests/hoc/__snapshots__/leaf.test.tsx.snap +++ b/packages/renderer-core/tests/hoc/__snapshots__/leaf.test.tsx.snap @@ -18,7 +18,9 @@ exports[`children this.props.children is array 1`] = ` exports[`lifecycle leaf change and make componentWillReceiveProps 1`] = `
content new leaf diff --git a/packages/renderer-core/tests/hoc/leaf.test.tsx b/packages/renderer-core/tests/hoc/leaf.test.tsx index 4539aae45..0e594bc5a 100644 --- a/packages/renderer-core/tests/hoc/leaf.test.tsx +++ b/packages/renderer-core/tests/hoc/leaf.test.tsx @@ -193,9 +193,10 @@ describe('lifecycle', () => { it('leaf change and make componentWillReceiveProps', () => { const newTextNodeLeaf = new Node(textSchema); + nodeMap.set(textSchema.id, newTextNodeLeaf); component.update((
- +
)); From 0bcd9ff78227aeddaf2fdc22d10fbd662fed91d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LeoYuan=20=E8=A2=81=E5=8A=9B=E7=9A=93?= Date: Fri, 23 Sep 2022 11:46:29 +0800 Subject: [PATCH 09/12] feat: add scrollToNode for simulator host (#1075) --- packages/shell/src/simulator-host.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/shell/src/simulator-host.ts b/packages/shell/src/simulator-host.ts index d22336c3e..077564550 100644 --- a/packages/shell/src/simulator-host.ts +++ b/packages/shell/src/simulator-host.ts @@ -1,7 +1,8 @@ import { BuiltinSimulatorHost, } from '@alilc/lowcode-designer'; -import { simulatorHostSymbol } from './symbols'; +import { simulatorHostSymbol, nodeSymbol } from './symbols'; +import type Node from './node'; export default class SimulatorHost { private readonly [simulatorHostSymbol]: BuiltinSimulatorHost; @@ -51,6 +52,14 @@ export default class SimulatorHost { return this[simulatorHostSymbol].get(key); } + /** + * scroll to specific node + * @param node + */ + scrollToNode(node: Node) { + this[simulatorHostSymbol].scrollToNode(node[nodeSymbol]); + } + /** * 刷新渲染画布 */ From 1f9150e4b260d522bd7cb31497069b700a1e8576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LeoYuan=20=E8=A2=81=E5=8A=9B=E7=9A=93?= Date: Mon, 19 Sep 2022 20:31:33 +0800 Subject: [PATCH 10/12] feat: support SPA mode --- .../src/builtin-simulator/create-simulator.ts | 2 +- .../designer/src/builtin-simulator/host.ts | 2 +- packages/engine/src/engine-core.ts | 28 ++++++++++++++----- .../src/renderer-view.tsx | 6 ++-- .../react-simulator-renderer/src/renderer.ts | 26 +++-------------- .../src/utils/misc.ts | 9 ++++++ 6 files changed, 38 insertions(+), 35 deletions(-) diff --git a/packages/designer/src/builtin-simulator/create-simulator.ts b/packages/designer/src/builtin-simulator/create-simulator.ts index 2ee0320d8..007286e9c 100644 --- a/packages/designer/src/builtin-simulator/create-simulator.ts +++ b/packages/designer/src/builtin-simulator/create-simulator.ts @@ -98,7 +98,7 @@ export function createSimulator( doc.close(); return new Promise((resolve) => { - const renderer = win.SimulatorRenderer || host.renderer; + const renderer = win.SimulatorRenderer; if (renderer) { return resolve(renderer); } diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 4bf049f5b..2fadbbf1a 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -850,7 +850,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost { - return this.getClosestNodeInstance(instance, context.nodeId)?.instance === context.instance; + return this.getClosestNodeInstance(instance, context?.nodeId)?.instance === context.instance; }); } diff --git a/packages/engine/src/engine-core.ts b/packages/engine/src/engine-core.ts index 6a5ab108c..aad924324 100644 --- a/packages/engine/src/engine-core.ts +++ b/packages/engine/src/engine-core.ts @@ -1,5 +1,5 @@ import { createElement } from 'react'; -import { render } from 'react-dom'; +import { render, unmountComponentAtNode } from 'react-dom'; import { globalContext, Editor, engineConfig, EngineOptions } from '@alilc/lowcode-editor-core'; import { Designer, @@ -16,7 +16,7 @@ import { import Outline, { OutlineBackupPane, getTreeMaster } from '@alilc/lowcode-plugin-outline-pane'; import DesignerPlugin from '@alilc/lowcode-plugin-designer'; -import { Hotkey, Project, Skeleton, Setters, Material, Event } from '@alilc/lowcode-shell'; +import { Hotkey, Project, Skeleton, Setters, Material, Event, DocumentModel } from '@alilc/lowcode-shell'; import { getLogger, isPlainObject } from '@alilc/lowcode-utils'; import './modules/live-editing'; import utils from './modules/utils'; @@ -184,7 +184,8 @@ engineConfig.set('isOpenSource', isOpenSource); await plugins.register(defaultPanelRegistry); })(); -let engineInited = false; +// container which will host LowCodeEngine DOM +let engineContainer: HTMLElement; // @ts-ignore webpack Define variable export const version = VERSION_PLACEHOLDER; engineConfig.set('ENGINE_VERSION', version); @@ -193,23 +194,22 @@ export async function init( options?: EngineOptions, pluginPreference?: PluginPreference, ) { - if (engineInited) return; - engineInited = true; + await destroy(); let engineOptions = null; - let engineContainer = null; if (isPlainObject(container)) { engineOptions = container; 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); } } - engineContainer.id = 'engine'; engineConfig.setEngineOptions(engineOptions as any); await plugins.init(pluginPreference as any); @@ -222,3 +222,17 @@ export async function init( engineContainer, ); } + +export async function destroy() { + // remove all documents + const { documents } = project; + if (Array.isArray(documents) && documents.length > 0) { + documents.forEach(((doc: DocumentModel) => project.removeDocument(doc))); + } + + // TODO: delete plugins except for core plugins + + // unmount DOM container, this will trigger React componentWillUnmount lifeCycle, + // so necessary cleanups will be done. + engineContainer && unmountComponentAtNode(engineContainer); +} diff --git a/packages/react-simulator-renderer/src/renderer-view.tsx b/packages/react-simulator-renderer/src/renderer-view.tsx index e855d583d..d042a4fa9 100644 --- a/packages/react-simulator-renderer/src/renderer-view.tsx +++ b/packages/react-simulator-renderer/src/renderer-view.tsx @@ -8,7 +8,7 @@ import { getClosestNode, isFromVC, isReactComponent } from '@alilc/lowcode-utils import { GlobalEvent } from '@alilc/lowcode-types'; import { SimulatorRendererContainer, DocumentInstance } from './renderer'; import { host } from './host'; - +import { isRendererDetached } from './utils/misc'; import './renderer.less'; // patch cloneElement avoid lost keyProps @@ -170,14 +170,12 @@ class Renderer extends Component<{ this.startTime = Date.now(); this.schemaChangedSymbol = false; - if (!container.autoRender) return null; + if (!container.autoRender || isRendererDetached()) return null; return ( Date: Fri, 23 Sep 2022 10:34:58 +0800 Subject: [PATCH 11/12] fix: fix material-spec demo --- specs/material-spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/material-spec.md b/specs/material-spec.md index 3733ae202..c823d6646 100644 --- a/specs/material-spec.md +++ b/specs/material-spec.md @@ -857,7 +857,7 @@ props 数组下对象字段描述: // 支持条件设置 "condition": true, // 支持样式设置 - "styles": true, + "style": true, } } } From d3c891e2a46d138e31c81a7f9b804a8240154df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=8F=8A=E8=90=8D=28=E7=B5=AE=E9=BB=8E=29?= Date: Fri, 23 Sep 2022 15:32:23 +0800 Subject: [PATCH 12/12] feat: support for NotFoundComponent design state is optional (#1013) --- .../designer/src/builtin-simulator/host.ts | 4 ++++ packages/designer/src/component-meta.ts | 21 ++++++++++++++-- .../tests/builtin-simulator/host.test.ts | 10 ++++++++ packages/editor-core/src/config.ts | 10 ++++++++ .../src/renderer-view.tsx | 1 + .../renderer/__snapshots__/demo.test.tsx.snap | 2 +- packages/renderer-core/src/adapter/index.ts | 12 +++++----- packages/renderer-core/src/renderer/base.tsx | 14 +++++------ .../renderer-core/src/renderer/renderer.tsx | 24 ++++++++++--------- packages/renderer-core/src/types/index.ts | 11 ++++++--- 10 files changed, 78 insertions(+), 31 deletions(-) diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 2fadbbf1a..db8625adb 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -232,6 +232,10 @@ export class BuiltinSimulatorHost implements ISimulatorHost false, + }, + }, + }, + }; + } this._npm = npm || this._npm; this._componentName = componentName; // 额外转换逻辑 - this._transformedMetadata = this.transformMetadata(metadata); + this._transformedMetadata = this.transformMetadata(_metadata); const { title } = this._transformedMetadata; if (title) { diff --git a/packages/designer/tests/builtin-simulator/host.test.ts b/packages/designer/tests/builtin-simulator/host.test.ts index 0329f06cb..746134c36 100644 --- a/packages/designer/tests/builtin-simulator/host.test.ts +++ b/packages/designer/tests/builtin-simulator/host.test.ts @@ -23,6 +23,7 @@ import { setShaken, } from '../../src/designer/dragon'; import { Project } from '../../src/project/project'; +import pageMetadata from '../fixtures/component-metadata/page'; import { Node } from '../../src/document/node/node'; import { Designer } from '../../src/designer/designer'; import { DocumentModel } from '../../src/document/document-model'; @@ -46,6 +47,7 @@ describe('Host 测试', () => { beforeEach(() => { designer = new Designer({ editor }); project = designer.project; + designer.createComponentMeta(pageMetadata); doc = project.createDocument(formSchema); host = new BuiltinSimulatorHost(designer.project); }); @@ -373,6 +375,14 @@ describe('Host 测试', () => { }, })).toBeNull(); }); + it('notFoundComponent', () => { + expect(host.locate({ + dragObject: { + type: DragObjectType.Node, + nodes: [doc.getNode('form')], + }, + })).toBeUndefined(); + }) it('locate', () => { host.locate({ dragObject: { diff --git a/packages/editor-core/src/config.ts b/packages/editor-core/src/config.ts index 985980673..06600fd01 100644 --- a/packages/editor-core/src/config.ts +++ b/packages/editor-core/src/config.ts @@ -137,6 +137,10 @@ const VALID_ENGINE_OPTIONS = { type: 'boolean', description: 'JSExpression 是否只支持使用 this 来访问上下文变量', }, + enableStrictNotFoundMode: { + type: 'boolean', + description: '当开启组件未找到严格模式时,渲染模块不会默认给一个容器组件', + }, }; export interface EngineOptions { /** @@ -258,6 +262,12 @@ export interface EngineOptions { * JSExpression 是否只支持使用 this 来访问上下文变量,假如需要兼容原来的 'state.xxx',则设置为 false */ thisRequiredInJSE?: boolean; + + /** + * @default false + * 当开启组件未找到严格模式时,渲染模块不会默认给一个容器组件 + */ + enableStrictNotFoundMode?: boolean; } const getStrictModeValue = (engineOptions: EngineOptions, defaultValue: boolean): boolean => { diff --git a/packages/react-simulator-renderer/src/renderer-view.tsx b/packages/react-simulator-renderer/src/renderer-view.tsx index d042a4fa9..e68d9c401 100644 --- a/packages/react-simulator-renderer/src/renderer-view.tsx +++ b/packages/react-simulator-renderer/src/renderer-view.tsx @@ -255,6 +255,7 @@ class Renderer extends Component<{ onCompGetRef={(schema: any, ref: ReactInstance | null) => { documentInstance.mountInstance(schema.id, ref); }} + enableStrictNotFoundMode={host.enableStrictNotFoundMode} /> ); } diff --git a/packages/react-simulator-renderer/test/src/renderer/__snapshots__/demo.test.tsx.snap b/packages/react-simulator-renderer/test/src/renderer/__snapshots__/demo.test.tsx.snap index afccf6241..0ebb606da 100644 --- a/packages/react-simulator-renderer/test/src/renderer/__snapshots__/demo.test.tsx.snap +++ b/packages/react-simulator-renderer/test/src/renderer/__snapshots__/demo.test.tsx.snap @@ -11,7 +11,7 @@ exports[`Base should be render NotFoundComponent 1`] = `
- Component Not Found + Text Component Not Found
diff --git a/packages/renderer-core/src/adapter/index.ts b/packages/renderer-core/src/adapter/index.ts index 661b3c17f..12896b137 100644 --- a/packages/renderer-core/src/adapter/index.ts +++ b/packages/renderer-core/src/adapter/index.ts @@ -21,21 +21,21 @@ class Adapter { } initRuntime() { - const Component: IGeneralConstructor = class { + const Component: IGeneralConstructor = class { setState() {} forceUpdate() {} render() {} - state: Record; - props: Record; + state: Readonly; + props: Readonly & Readonly<{ children?: any | undefined }>; refs: Record; context: Record; }; - const PureComponent: IGeneralConstructor = class { + const PureComponent = class { setState() {} forceUpdate() {} render() {} - state: Record; - props: Record; + state: Readonly; + props: Readonly & Readonly<{ children?: any | undefined }>; refs: Record; context: Record; }; diff --git a/packages/renderer-core/src/renderer/base.tsx b/packages/renderer-core/src/renderer/base.tsx index aae951409..2d58cac76 100644 --- a/packages/renderer-core/src/renderer/base.tsx +++ b/packages/renderer-core/src/renderer/base.tsx @@ -104,13 +104,7 @@ export default function baseRendererFactory(): IBaseRenderComponent { return customBaseRenderer; } - const runtime = adapter.getRuntime(); - const Component = runtime.Component as IGeneralConstructor< - IBaseRendererProps, - Record, - any - >; - const { createElement } = runtime; + const { Component, createElement } = adapter.getRuntime(); const Div = divFactory(); const VisualDom = visualDomFactory(); const AppContext = contextFactory(); @@ -125,7 +119,7 @@ export default function baseRendererFactory(): IBaseRenderComponent { const DEFAULT_LOOP_ARG_INDEX = 'index'; let scopeIdx = 0; - return class BaseRenderer extends Component { + return class BaseRenderer extends Component> { static displayName = 'BaseRenderer'; static defaultProps = { @@ -533,6 +527,10 @@ export default function baseRendererFactory(): IBaseRenderComponent { { componentName: schema.componentName, componentId: schema.id, + enableStrictNotFoundMode: engine.props.enableStrictNotFoundMode, + ref: (ref: any) => { + ref && engine.props?.onCompGetRef(schema, ref); + }, }, this.__getSchemaChildrenVirtualDom(schema, scope, Comp), ); diff --git a/packages/renderer-core/src/renderer/renderer.tsx b/packages/renderer-core/src/renderer/renderer.tsx index 8db681a5f..b308c251b 100644 --- a/packages/renderer-core/src/renderer/renderer.tsx +++ b/packages/renderer-core/src/renderer/renderer.tsx @@ -4,14 +4,11 @@ import contextFactory from '../context'; import { isFileSchema, isEmpty } from '../utils'; import baseRendererFactory from './base'; import divFactory from '../components/Div'; -import { IGeneralConstructor, IRenderComponent, IRendererProps, IRendererState } from '../types'; -import { RootSchema } from '@alilc/lowcode-types'; +import { IRenderComponent, IRendererProps, IRendererState } from '../types'; +import { NodeSchema, RootSchema } from '@alilc/lowcode-types'; export default function rendererFactory(): IRenderComponent { - const runtime = adapter.getRuntime(); - const Component = runtime.Component as IGeneralConstructor>; - const PureComponent = runtime.PureComponent as IGeneralConstructor>; - const { createElement, findDOMNode } = runtime; + const { PureComponent, Component, createElement, findDOMNode } = adapter.getRuntime(); const RENDERER_COMPS: any = adapter.getRenderers(); const BaseRenderer = baseRendererFactory(); const AppContext = contextFactory(); @@ -21,7 +18,7 @@ export default function rendererFactory(): IRenderComponent { const debug = Debug('renderer:entry'); - class FaultComponent extends PureComponent { + class FaultComponent extends PureComponent { render() { // FIXME: errorlog console.error('render error', this.props); @@ -35,17 +32,22 @@ export default function rendererFactory(): IRenderComponent { color: '#ff0000', border: '2px solid #ff0000', }, - }, '组件渲染异常,请查看控制台日志'); + }, `${this.props.componentName || ''} 组件渲染异常,请查看控制台日志`); } } - class NotFoundComponent extends PureComponent { + class NotFoundComponent extends PureComponent<{ + componentName: string; + } & IRendererProps> { render() { - return createElement(Div, this.props, this.props.children || 'Component Not Found'); + if (this.props.enableStrictNotFoundMode) { + return `${this.props.componentName || ''} Component Not Found`; + } + return createElement(Div, this.props, this.props.children || `${this.props.componentName || ''} Component Not Found`); } } - return class Renderer extends Component { + return class Renderer extends Component { static displayName = 'Renderer'; state: Partial = {}; diff --git a/packages/renderer-core/src/types/index.ts b/packages/renderer-core/src/types/index.ts index 9f0880633..2a4c0975e 100644 --- a/packages/renderer-core/src/types/index.ts +++ b/packages/renderer-core/src/types/index.ts @@ -21,12 +21,12 @@ interface IGeneralComponent

extends ComponentLifecycle } export type IGeneralConstructor< - P = { + T = { [key: string]: any; }, S = { [key: string]: any; - }, SS = any -> = new (props: any, context: any) => IGeneralComponent; + }, D = any +> = new (props: TT, context: any) => IGeneralComponent; /** * duck-typed History @@ -133,6 +133,11 @@ export interface IRendererProps { * JSExpression 是否只支持使用 this 来访问上下文变量 */ thisRequiredInJSE?: boolean; + /** + * @default false + * 当开启组件未找到严格模式时,渲染模块不会默认给一个容器组件 + */ + enableStrictNotFoundMode?: boolean; } export interface IRendererState {