mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-03-13 15:21:33 +00:00
fix: renderer not rendering correct components when loading components with loadAsyncLibrary api
This commit is contained in:
parent
d5daba8aaf
commit
9b3b4f9b0e
6
packages/react-simulator-renderer/.babelrc
Normal file
6
packages/react-simulator-renderer/.babelrc
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
["@babel/plugin-proposal-decorators", { "legacy": true }],
|
||||||
|
["@babel/plugin-proposal-class-properties", { "loose": true }]
|
||||||
|
]
|
||||||
|
}
|
||||||
6
packages/react-simulator-renderer/build.test.json
Normal file
6
packages/react-simulator-renderer/build.test.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
"build-plugin-component",
|
||||||
|
"@alilc/lowcode-test-mate/plugin/index.ts"
|
||||||
|
]
|
||||||
|
}
|
||||||
33
packages/react-simulator-renderer/jest.config.js
Normal file
33
packages/react-simulator-renderer/jest.config.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const { join } = require('path');
|
||||||
|
const esModules = ['zen-logger'].join('|');
|
||||||
|
const pkgNames = fs.readdirSync(join('..')).filter(pkgName => !pkgName.startsWith('.'));
|
||||||
|
|
||||||
|
const jestConfig = {
|
||||||
|
// transform: {
|
||||||
|
// '^.+\\.[jt]sx?$': 'babel-jest',
|
||||||
|
// // '^.+\\.(ts|tsx)$': 'ts-jest',
|
||||||
|
// // '^.+\\.(js|jsx)$': 'babel-jest',
|
||||||
|
// },
|
||||||
|
// testMatch: ['**/document/node/node.test.ts'],
|
||||||
|
// testMatch: ['**/designer/builtin-hotkey.test.ts'],
|
||||||
|
// testMatch: ['**/plugin/plugin-manager.test.ts'],
|
||||||
|
// testMatch: ['(/tests?/.*(test))\\.[jt]s$'],
|
||||||
|
transformIgnorePatterns: [
|
||||||
|
`/node_modules/(?!${esModules})/`,
|
||||||
|
],
|
||||||
|
setupFiles: ['./test/utils/host.ts'],
|
||||||
|
moduleFileExtensions: ['ts', 'tsx', 'js', 'json'],
|
||||||
|
collectCoverage: false,
|
||||||
|
collectCoverageFrom: [
|
||||||
|
'src/**/*.ts',
|
||||||
|
'!src/**/*.d.ts',
|
||||||
|
'!**/node_modules/**',
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
// 只对本仓库内的 pkg 做 mapping
|
||||||
|
jestConfig.moduleNameMapper = {};
|
||||||
|
jestConfig.moduleNameMapper[`^@alilc/lowcode\\-(${pkgNames.join('|')})$`] = '<rootDir>/../$1/src';
|
||||||
|
|
||||||
|
module.exports = jestConfig;
|
||||||
@ -11,6 +11,7 @@
|
|||||||
"dist"
|
"dist"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"test": "build-scripts test --config build.test.json",
|
||||||
"build": "NODE_OPTIONS=--max_old_space_size=8192 build-scripts build --skip-demo",
|
"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"
|
||||||
},
|
},
|
||||||
|
|||||||
81
packages/react-simulator-renderer/test/schema/basic.ts
Normal file
81
packages/react-simulator-renderer/test/schema/basic.ts
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
export default {
|
||||||
|
id: 'node_ockvuu8u911',
|
||||||
|
css: 'body{background-color:#f2f3f5}',
|
||||||
|
flows: [],
|
||||||
|
props: {
|
||||||
|
className: 'page_kvuu9hym',
|
||||||
|
pageStyle: {
|
||||||
|
backgroundColor: '#f2f3f5',
|
||||||
|
},
|
||||||
|
containerStyle: {},
|
||||||
|
templateVersion: '1.0.0',
|
||||||
|
},
|
||||||
|
state: {},
|
||||||
|
title: '',
|
||||||
|
methods: {
|
||||||
|
__initMethods__: {
|
||||||
|
type: 'JSExpression',
|
||||||
|
value: "function (exports, module) { \"use strict\";\n\nexports.__esModule = true;\nexports.func1 = func1;\nexports.helloPage = helloPage;\n\nfunction func1() {\n console.info('hello, this is a page function');\n}\n\nfunction helloPage() {\n // 你可以这么调用其他函数\n this.func1(); // 你可以这么调用组件的函数\n // this.$('textField_xxx').getValue();\n // 你可以这么使用「数据源面板」定义的「变量」\n // this.state.xxx\n // 你可以这么发送一个在「数据源面板」定义的「远程 API」\n // this.dataSourceMap['xxx'].load(data)\n // API 详见:https://go.alibaba-inc.com/help3/API\n} \n}",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
id: 'node_ockvuu8u915',
|
||||||
|
props: {
|
||||||
|
fieldId: 'div_kvuu9gl1',
|
||||||
|
behavior: 'NORMAL',
|
||||||
|
__style__: {},
|
||||||
|
customClassName: '',
|
||||||
|
useFieldIdAsDomId: false,
|
||||||
|
},
|
||||||
|
title: '',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
id: 'node_ockvuu8u916',
|
||||||
|
props: {
|
||||||
|
content: {
|
||||||
|
use: 'zh_CN',
|
||||||
|
type: 'JSExpression',
|
||||||
|
en_US: 'Tips content',
|
||||||
|
value: '"我是一个简单的测试页面"',
|
||||||
|
zh_CN: '我是一个简单的测试页面',
|
||||||
|
extType: 'i18n',
|
||||||
|
},
|
||||||
|
fieldId: 'text_kvuu9gl2',
|
||||||
|
maxLine: 0,
|
||||||
|
behavior: 'NORMAL',
|
||||||
|
__style__: {},
|
||||||
|
showTitle: false,
|
||||||
|
},
|
||||||
|
title: '',
|
||||||
|
condition: true,
|
||||||
|
componentName: 'Text',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
condition: true,
|
||||||
|
componentName: 'Div',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
condition: true,
|
||||||
|
dataSource: {
|
||||||
|
list: [],
|
||||||
|
sync: true,
|
||||||
|
online: [],
|
||||||
|
offline: [],
|
||||||
|
globalConfig: {
|
||||||
|
fit: {
|
||||||
|
type: 'JSExpression',
|
||||||
|
value: "function main(){\n 'use strict';\n\nvar __compiledFunc__ = function fit(response) {\n var content = response.content !== undefined ? response.content : response;\n var error = {\n message: response.errorMsg || response.errors && response.errors[0] && response.errors[0].msg || response.content || '远程数据源请求出错,success is false'\n };\n var success = true;\n if (response.success !== undefined) {\n success = response.success;\n } else if (response.hasError !== undefined) {\n success = !response.hasError;\n }\n return {\n content: content,\n success: success,\n error: error\n };\n};\n return __compiledFunc__.apply(this, arguments);\n}",
|
||||||
|
extType: 'function',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
lifeCycles: {
|
||||||
|
constructor: {
|
||||||
|
type: 'JSExpression',
|
||||||
|
value: "function constructor() {\nvar module = { exports: {} };\nvar _this = this;\nthis.__initMethods__(module.exports, module);\nObject.keys(module.exports).forEach(function(item) {\n if(typeof module.exports[item] === 'function'){\n _this[item] = module.exports[item];\n }\n});\n\n}",
|
||||||
|
extType: 'function',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
componentName: 'Page',
|
||||||
|
};
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`Base should be render NotFoundComponent 1`] = `
|
||||||
|
<div
|
||||||
|
className="lce-page page_kvuu9hym"
|
||||||
|
style={Object {}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
componentName="Div"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
componentName="Text"
|
||||||
|
>
|
||||||
|
Component Not Found
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Base should be render Text 1`] = `
|
||||||
|
<div
|
||||||
|
className="lce-page page_kvuu9hym"
|
||||||
|
style={Object {}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
componentName="Div"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
__designMode="design"
|
||||||
|
__style__={Object {}}
|
||||||
|
behavior="NORMAL"
|
||||||
|
componentId="node_ockvuu8u916"
|
||||||
|
fieldId="text_kvuu9gl2"
|
||||||
|
maxLine={0}
|
||||||
|
showTitle={false}
|
||||||
|
>
|
||||||
|
我是一个简单的测试页面
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
import renderer from 'react-test-renderer';
|
||||||
|
import rendererContainer from '../../../src/renderer';
|
||||||
|
import SimulatorRendererView from '../../../src/renderer-view';
|
||||||
|
import { Text } from '../../utils/components';
|
||||||
|
|
||||||
|
describe('Base', () => {
|
||||||
|
const component = renderer.create(
|
||||||
|
<SimulatorRendererView
|
||||||
|
rendererContainer={rendererContainer}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
it('should be render NotFoundComponent', () => {
|
||||||
|
let tree = component.toJSON();
|
||||||
|
expect(tree).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be render Text', () => {
|
||||||
|
// 更新 _componentsMap 值
|
||||||
|
(rendererContainer as any)._componentsMap.Text = Text;// = host.designer.componentsMap;
|
||||||
|
// 更新 components 列表
|
||||||
|
(rendererContainer as any).buildComponents();
|
||||||
|
|
||||||
|
expect(!!(rendererContainer.components as any).Text).toBeTruthy();
|
||||||
|
|
||||||
|
rendererContainer.rerender();
|
||||||
|
|
||||||
|
let tree = component.toJSON();
|
||||||
|
expect(tree).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
})
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
export const Text = ({
|
||||||
|
__tag,
|
||||||
|
content,
|
||||||
|
...props
|
||||||
|
}: any) => (<div {...props}>{content}</div>);
|
||||||
|
|
||||||
|
export const Page = (props: any) => (<div>{props.children}</div>);
|
||||||
75
packages/react-simulator-renderer/test/utils/host.ts
Normal file
75
packages/react-simulator-renderer/test/utils/host.ts
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import { Box, Breadcrumb, Form, Select, Input, Button, Table, Pagination, Dialog } from '@alifd/next';
|
||||||
|
import defaultSchema from '../schema/basic';
|
||||||
|
import { Page } from './components';
|
||||||
|
|
||||||
|
class Designer {
|
||||||
|
componentsMap = {
|
||||||
|
Box,
|
||||||
|
Breadcrumb,
|
||||||
|
'Breadcrumb.Item': Breadcrumb.Item,
|
||||||
|
Form,
|
||||||
|
'Form.Item': Form.Item,
|
||||||
|
Select,
|
||||||
|
Input,
|
||||||
|
Button,
|
||||||
|
'Button.Group': Button.Group,
|
||||||
|
Table,
|
||||||
|
Pagination,
|
||||||
|
Dialog,
|
||||||
|
Page,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Host {
|
||||||
|
designer = new Designer();
|
||||||
|
|
||||||
|
connect = () => {}
|
||||||
|
|
||||||
|
autorun = (fn: Function) => {
|
||||||
|
fn();
|
||||||
|
}
|
||||||
|
|
||||||
|
autoRender = true;
|
||||||
|
|
||||||
|
componentsConsumer = {
|
||||||
|
consume() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
schema = defaultSchema;
|
||||||
|
|
||||||
|
project = {
|
||||||
|
documents: [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
path: '/',
|
||||||
|
fileName: '',
|
||||||
|
export: () => {
|
||||||
|
return this.schema;
|
||||||
|
},
|
||||||
|
getNode: () => {},
|
||||||
|
}
|
||||||
|
],
|
||||||
|
get: () => ({}),
|
||||||
|
}
|
||||||
|
|
||||||
|
setInstance() {}
|
||||||
|
|
||||||
|
designMode = 'design'
|
||||||
|
|
||||||
|
get() {}
|
||||||
|
|
||||||
|
injectionConsumer = {
|
||||||
|
consume() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 下列的函数或者方法是方便测试用 */
|
||||||
|
mockSchema = (schema: any) => {
|
||||||
|
this.schema = schema;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(window as any).LCSimulatorHost) {
|
||||||
|
(window as any).LCSimulatorHost = new Host();
|
||||||
|
}
|
||||||
|
|
||||||
|
export default (window as any).LCSimulatorHost;
|
||||||
@ -463,8 +463,14 @@ export default function baseRendererFactory(): IBaseRenderComponent {
|
|||||||
|
|
||||||
if (!Comp) {
|
if (!Comp) {
|
||||||
console.error(`${schema.componentName} component is not found in components list! component list is:`, components || this.props.__container?.components);
|
console.error(`${schema.componentName} component is not found in components list! component list is:`, components || this.props.__container?.components);
|
||||||
Comp = engine.getNotFoundComponent();
|
return engine.createElement(
|
||||||
otherProps.__componentName = schema.componentName;
|
engine.getNotFoundComponent(),
|
||||||
|
{
|
||||||
|
componentName: schema.componentName,
|
||||||
|
componentId: schema.id,
|
||||||
|
},
|
||||||
|
this.__getSchemaChildrenVirtualDom(schema, scope, Comp),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// DesignMode 为 design 情况下,需要进入 leaf Hoc,进行相关事件注册
|
// DesignMode 为 design 情况下,需要进入 leaf Hoc,进行相关事件注册
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user