mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-02-28 21:20:28 +00:00
Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3681622 * chore: remove unnecessary code * refactor: react-render using TypeScript * chore: build-script * refactor: editor-skeleton * refactor: designer * refactor: material-parser * refactor: editor-setters * refactor: js to ts for rax-provider Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3678180 * refactor: rax-provider * feat: add build command * chore: compilerOptions for rax-provider * refactor: JS to TS for Rax Renderer Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3678935 * refactor: rax-renderer * Merge remote-tracking branch 'origin/refactor/js-to-ts' into refactor/js2ts-rax-renderer * Merge remote-tracking branch 'origin/refactor/js-to-ts' into refactor/js2ts-rax-renderer * refactor: ts-nocheck * chore: ts compile error * fix: ts rootDir * fix: compile error * chore: using same tsconfig for rax component * refactor: ts compile rax-renderer && rax-provider * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/js-to-ts # Conflicts: # packages/rax-render/src/utils/appHelper.js # packages/rax-render/src/utils/appHelper.ts # packages/utils/src/appHelper.ts * refactor: no JS file * refactor: remove lint * feat: add xima * feat: add eslint ignore * style: fix by lint * feat: lint command * fix: using the same eslint config * style: eslint settings * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/plugin-event-bind-dialog/src/index.tsx # packages/plugin-source-editor/src/index.tsx # packages/runtime/src/core/container.ts # packages/runtime/src/core/provider.ts * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/designer/src/document/document-model.ts # packages/designer/src/document/node/node-children.ts # packages/designer/src/document/node/props/prop.ts # packages/plugin-source-editor/src/index.tsx * fix: 修改dataSource items -> list * Merge remote-tracking branch 'origin/relase/1.0.0' into refactor/code-style # Conflicts: # packages/react-renderer/package.json * refactor: component-panel plugin-component-pane 代码规范化 Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3703771 * feat: support bizcomps * refactor: component-panel * style: eslint * Merge branch 'refactor/code-style' into fix/ducheng-source-style * style: code style * Merge branch 'fix/ducheng-source-style' into 'refactor/code-style' Code review title: Fix/ducheng source style Code review Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3705972 * style: for demo * style: for demo-server * style: for plugin-event-bind-dialog * style: for plugin-sample-preview * style: for plugin-undo-redo * style: plugin-variable-bind-dialog * style: types * style: for utils * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/editor-setters/src/expression-setter/locale/snippets.ts # packages/editor-setters/src/json-setter/locale/snippets.ts # packages/editor-setters/src/locale/snippets.ts # packages/plugin-components-pane/package.json # packages/rax-render/src/hoc/compWrapper.tsx # packages/rax-render/src/utils/index.ts # packages/react-renderer/src/context/appContext.ts * style: editor-preset-general editor-preset-general 代码规范化 Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3707974 * style: editor-preset-general * fix: should set field * fix: should set field - demo-server * refactor(style): fix code style for designer refactor(style): fix code style for editor-core refactor(style): fix code style for editor-skeleton refactor(style): fix code style for react-simulator-renderer refactor(style): fix code style for rax-simulator-renderer * Merge branch 'refactor/lihao-code-style' into 'refactor/code-style' Code review title: refactor(style): fix code style for designer Code review description: refactor(style): fix code style for editor-core refactor(style): fix code style for editor-skeleton refactor(style): fix code style for react-simulator-renderer refactor(style): fix code style for rax-simulator-renderer Code review Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3709472 * style: react/no-multi-comp set to 0 for designer * style: ignore editor-prset-vision * style: fix for plugin-outline-pane * style: fix for rax-provider * style: react-provider * style: runtime * style: rax-render * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/editor-setters/src/expression-setter/index.tsx # packages/plugin-source-editor/src/index.tsx # packages/plugin-source-editor/src/transform.ts * refactor: material parser code style 1. 修复eslint问题 2. instanceOf => any 3. 修复node类型解析失败问题 Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3716330 * refactor: material parser code style * refactor: code-generator code style 1. rax 出码合并 2. code style 修复 注:合并的代码中带了 datasource 的 Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3717159 * Merge branch 'feat/rax-code-generator' of gitlab.alibaba-inc.com:ali-lowcode/ali-lowcode-engine into feat/rax-code-generator # Conflicts: # packages/code-generator/src/generator/ProjectBuilder.ts # packages/code-generator/src/parser/SchemaParser.ts # packages/code-generator/src/plugins/component/rax/jsx.ts # packages/code-generator/src/plugins/project/constants.ts # packages/code-generator/src/plugins/project/framework/rax/plugins/packageJSON.ts # packages/code-generator/src/plugins/project/i18n.ts # packages/code-generator/src/publisher/disk/index.ts # packages/code-generator/src/publisher/disk/utils.ts # packages/code-generator/src/types/core.ts # packages/code-generator/src/types/schema.ts # packages/code-generator/src/utils/compositeType.ts # packages/code-generator/src/utils/nodeToJSX.ts * refactor: code-generator * Merge remote-tracking branch 'origin/refactor/code-style' into refactor/code-style-code-generator # Conflicts: # .vscode/launch.json * Revert "refactor: code-generator code style " This reverts commit ebc78e8788f83e8fda0e146758af43b878125c10. * chore: eslintrc && eslintignore * style: for plugin-source-editor * style: fix by eslint --fix * style: scripts/ * style: datasource-engine * feat: pre-commit * Merge branch 'refactor/code-style' of gitlab.alibaba-inc.com:ali-lowcode/ali-lowcode-engine into refactor/code-style # Conflicts: # .eslintignore # packages/code-generator/src/parser/SchemaParser.ts # packages/code-generator/src/plugins/component/rax/containerInitState.ts # packages/code-generator/src/plugins/component/rax/containerInjectDataSourceEngine.ts # packages/code-generator/src/plugins/component/rax/containerLifeCycle.ts # packages/code-generator/src/plugins/project/framework/rax/plugins/buildConfig.ts # packages/code-generator/src/utils/OrderedSet.ts # packages/code-generator/src/utils/ScopeBindings.ts # packages/code-generator/src/utils/expressionParser.ts # packages/code-generator/src/utils/schema.ts # packages/datasource-engine/src/core/DataSourceEngine.ts # packages/datasource-engine/src/core/RuntimeDataSource.ts # packages/datasource-engine/src/types/IRuntimeContext.ts # packages/datasource-engine/src/types/index.ts * refactor: code style code-generator 对 code style 分支上次合并的 code-generator 修改做了 revert 重新在 code style 分支基础上对代码样式做了修复 rax 合并分支会另行 fix 后向 release 分支提 MR Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3719702 * refactor: code style fix * style: for code-generator * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/editor-skeleton/src/transducers/addon-combine.ts # packages/plugin-components-pane/package.json # packages/plugin-components-pane/src/components/base/index.tsx # packages/plugin-components-pane/src/components/component-list/index.tsx # packages/plugin-components-pane/src/i18n/index.ts # packages/plugin-components-pane/src/i18n/strings/index.ts # packages/plugin-components-pane/src/index.tsx # packages/plugin-event-bind-dialog/src/index.tsx # packages/plugin-source-editor/src/index.tsx # packages/plugin-source-editor/src/transform.ts * style: auto fix
310 lines
8.8 KiB
TypeScript
310 lines
8.8 KiB
TypeScript
import { isJSBlock, isJSExpression, isJSSlot, isI18nData } from '@ali/lowcode-types';
|
|
import { isPlainObject, hasOwnProperty } from '@ali/lowcode-utils';
|
|
import { globalContext, Editor } from '@ali/lowcode-editor-core';
|
|
import { Designer, LiveEditing, TransformStage, Node, getConvertedExtraKey } from '@ali/lowcode-designer';
|
|
import Outline, { OutlineBackupPane, getTreeMaster } from '@ali/lowcode-plugin-outline-pane';
|
|
import { toCss } from '@ali/vu-css-style';
|
|
import logger from '@ali/vu-logger';
|
|
import bus from './bus';
|
|
import { VE_EVENTS } from './base/const';
|
|
|
|
import DesignerPlugin from '@ali/lowcode-plugin-designer';
|
|
import { Skeleton, SettingsPrimaryPane, registerDefaults } from '@ali/lowcode-editor-skeleton';
|
|
|
|
import { deepValueParser } from './deep-value-parser';
|
|
import { liveEditingRule, liveEditingSaveHander } from './vc-live-editing';
|
|
|
|
export const editor = new Editor();
|
|
globalContext.register(editor, Editor);
|
|
|
|
export const skeleton = new Skeleton(editor);
|
|
editor.set(Skeleton, skeleton);
|
|
editor.set('skeleton', skeleton);
|
|
registerDefaults();
|
|
|
|
export const designer = new Designer({ editor });
|
|
editor.set(Designer, designer);
|
|
editor.set('designer', designer);
|
|
|
|
designer.project.onCurrentDocumentChange((doc) => {
|
|
doc.onRendererReady(() => {
|
|
bus.emit(VE_EVENTS.VE_PAGE_PAGE_READY);
|
|
});
|
|
});
|
|
|
|
interface Variable {
|
|
type: 'variable';
|
|
variable: string;
|
|
value: any;
|
|
}
|
|
|
|
function isVariable(obj: any): obj is Variable {
|
|
return obj && obj.type === 'variable';
|
|
}
|
|
|
|
function upgradePropsReducer(props: any) {
|
|
if (!props || !isPlainObject(props)) {
|
|
return props;
|
|
}
|
|
if (isJSBlock(props)) {
|
|
if (props.value.componentName === 'Slot') {
|
|
return {
|
|
type: 'JSSlot',
|
|
title: (props.value.props as any)?.slotTitle,
|
|
name: (props.value.props as any)?.slotName,
|
|
value: props.value.children,
|
|
};
|
|
} else {
|
|
return props.value;
|
|
}
|
|
}
|
|
if (isVariable(props)) {
|
|
return {
|
|
type: 'JSExpression',
|
|
value: props.variable,
|
|
mock: props.value,
|
|
};
|
|
}
|
|
const newProps: any = {};
|
|
Object.keys(props).forEach(key => {
|
|
if (/^__slot__/.test(key) && props[key] === true) {
|
|
return;
|
|
}
|
|
newProps[key] = upgradePropsReducer(props[key]);
|
|
});
|
|
return newProps;
|
|
}
|
|
|
|
// 升级 Props
|
|
designer.addPropsReducer(upgradePropsReducer, TransformStage.Upgrade);
|
|
|
|
function getCurrentFieldIds() {
|
|
const fieldIds: any = [];
|
|
const nodesMap = designer?.currentDocument?.nodesMap || new Map();
|
|
nodesMap.forEach((curNode: any) => {
|
|
const fieldId = nodesMap?.get(curNode.id)?.getPropValue('fieldId');
|
|
if (fieldId) {
|
|
fieldIds.push(fieldId);
|
|
}
|
|
});
|
|
return fieldIds;
|
|
}
|
|
|
|
// 节点 props 初始化
|
|
designer.addPropsReducer((props, node) => {
|
|
// run initials
|
|
const newProps: any = {
|
|
...props,
|
|
};
|
|
if (newProps.fieldId) {
|
|
const fieldIds = getCurrentFieldIds();
|
|
|
|
// 全局的关闭 uniqueIdChecker 信号,在 ve-utils 中实现
|
|
if (fieldIds.indexOf(props.fieldId) >= 0 && !(window as any).__disable_unique_id_checker__) {
|
|
newProps.fieldId = undefined;
|
|
}
|
|
}
|
|
const initials = node.componentMeta.getMetadata().experimental?.initials;
|
|
if (initials) {
|
|
const getRealValue = (propValue: any) => {
|
|
if (isVariable(propValue)) {
|
|
return propValue.value;
|
|
}
|
|
if (isJSExpression(propValue)) {
|
|
return propValue.mock;
|
|
}
|
|
return propValue;
|
|
};
|
|
initials.forEach((item) => {
|
|
// FIXME! this implements SettingTarget
|
|
try {
|
|
// FIXME! item.name could be 'xxx.xxx'
|
|
const ov = newProps[item.name];
|
|
const v = item.initial(node as any, getRealValue(ov));
|
|
if (ov === undefined && v !== undefined) {
|
|
newProps[item.name] = v;
|
|
}
|
|
} catch (e) {
|
|
if (hasOwnProperty(props, item.name)) {
|
|
newProps[item.name] = props[item.name];
|
|
}
|
|
}
|
|
if (newProps[item.name] && !node.props.has(item.name)) {
|
|
node.props.add(newProps[item.name], item.name);
|
|
}
|
|
});
|
|
}
|
|
return newProps;
|
|
}, TransformStage.Init);
|
|
|
|
designer.addPropsReducer((props: any, node: Node) => {
|
|
if (node.isRoot() && props && props.lifeCycles) {
|
|
return {
|
|
...props,
|
|
lifeCycles: {},
|
|
};
|
|
}
|
|
return props;
|
|
}, TransformStage.Render);
|
|
|
|
function filterReducer(props: any, node: Node): any {
|
|
const filters = node.componentMeta.getMetadata().experimental?.filters;
|
|
if (filters && filters.length) {
|
|
const newProps = { ...props };
|
|
filters.forEach((item) => {
|
|
// FIXME! item.name could be 'xxx.xxx'
|
|
if (!hasOwnProperty(newProps, item.name)) {
|
|
return;
|
|
}
|
|
try {
|
|
if (item.filter(node.settingEntry.getProp(item.name), props[item.name]) === false) {
|
|
delete newProps[item.name];
|
|
}
|
|
} catch (e) {
|
|
console.warn(e);
|
|
logger.trace(e);
|
|
}
|
|
});
|
|
return newProps;
|
|
}
|
|
return props;
|
|
}
|
|
designer.addPropsReducer(filterReducer, TransformStage.Save);
|
|
designer.addPropsReducer(filterReducer, TransformStage.Render);
|
|
|
|
function compatiableReducer(props: any) {
|
|
if (!props || !isPlainObject(props)) {
|
|
return props;
|
|
}
|
|
if (isJSSlot(props)) {
|
|
return {
|
|
type: 'JSBlock',
|
|
value: {
|
|
componentName: 'Slot',
|
|
children: props.value,
|
|
props: {
|
|
slotTitle: props.title,
|
|
slotName: props.name,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
// 为了能降级到老版本,建议在后期版本去掉以下代码
|
|
// if (isJSExpression(props) && !props.events) {
|
|
// return {
|
|
// type: 'variable',
|
|
// value: props.mock,
|
|
// variable: props.value,
|
|
// }
|
|
// }
|
|
const newProps: any = {};
|
|
Object.entries<any>(props).forEach(([key, val]) => {
|
|
newProps[key] = compatiableReducer(val);
|
|
});
|
|
return newProps;
|
|
}
|
|
// FIXME: Dirty fix, will remove this reducer
|
|
designer.addPropsReducer(compatiableReducer, TransformStage.Save);
|
|
// 兼容历史版本的 Page 组件
|
|
designer.addPropsReducer((props: any, node: Node) => {
|
|
const lifeCycleNames = ['didMount', 'willUnmount'];
|
|
if (node.isRoot()) {
|
|
lifeCycleNames.forEach(key => {
|
|
if (props[key]) {
|
|
const lifeCycles = node.props.getPropValue(getConvertedExtraKey('lifeCycles')) || {};
|
|
lifeCycles[key] = props[key];
|
|
node.props.setPropValue(getConvertedExtraKey('lifeCycles'), lifeCycles);
|
|
}
|
|
});
|
|
}
|
|
return props;
|
|
}, TransformStage.Save);
|
|
|
|
// 设计器组件样式处理
|
|
function stylePropsReducer(props: any, node: any) {
|
|
if (props && typeof props === 'object' && props.__style__) {
|
|
const cssId = `_style_pesudo_${ node.id.replace(/\$/g, '_')}`;
|
|
const cssClass = `_css_pesudo_${ node.id.replace(/\$/g, '_')}`;
|
|
const styleProp = props.__style__;
|
|
appendStyleNode(props, styleProp, cssClass, cssId);
|
|
}
|
|
if (props && typeof props === 'object' && props.pageStyle) {
|
|
const cssId = '_style_pesudo_engine-document';
|
|
const cssClass = 'engine-document';
|
|
const styleProp = props.pageStyle;
|
|
appendStyleNode(props, styleProp, cssClass, cssId);
|
|
}
|
|
if (props && typeof props === 'object' && props.containerStyle) {
|
|
const cssId = `_style_pesudo_${ node.id}`;
|
|
const cssClass = `_css_pesudo_${ node.id.replace(/\$/g, '_')}`;
|
|
const styleProp = props.containerStyle;
|
|
appendStyleNode(props, styleProp, cssClass, cssId);
|
|
}
|
|
return props;
|
|
}
|
|
|
|
function appendStyleNode(props: any, styleProp: any, cssClass: string, cssId: string) {
|
|
const doc = designer.currentDocument?.simulator?.contentDocument;
|
|
if (!doc) {
|
|
return;
|
|
}
|
|
const dom = doc.getElementById(cssId);
|
|
if (dom) {
|
|
dom.parentNode?.removeChild(dom);
|
|
}
|
|
if (typeof styleProp === 'object') {
|
|
styleProp = toCss(styleProp);
|
|
}
|
|
if (typeof styleProp === 'string') {
|
|
const s = doc.createElement('style');
|
|
props.className = cssClass;
|
|
s.setAttribute('type', 'text/css');
|
|
s.setAttribute('id', cssId);
|
|
doc.getElementsByTagName('head')[0].appendChild(s);
|
|
|
|
s.appendChild(doc.createTextNode(styleProp.replace(/(\d+)rpx/g, (a, b) => {
|
|
return `${b / 2}px`;
|
|
}).replace(/:root/g, `.${ cssClass}`)));
|
|
}
|
|
}
|
|
designer.addPropsReducer(stylePropsReducer, TransformStage.Render);
|
|
|
|
// 国际化 & Expression 渲染时处理
|
|
designer.addPropsReducer(deepValueParser, TransformStage.Render);
|
|
|
|
skeleton.add({
|
|
area: 'mainArea',
|
|
name: 'designer',
|
|
type: 'Widget',
|
|
content: DesignerPlugin,
|
|
});
|
|
skeleton.add({
|
|
area: 'rightArea',
|
|
name: 'settingsPane',
|
|
type: 'Panel',
|
|
content: SettingsPrimaryPane,
|
|
});
|
|
skeleton.add({
|
|
area: 'leftArea',
|
|
name: 'outlinePane',
|
|
type: 'PanelDock',
|
|
content: Outline,
|
|
panelProps: {
|
|
area: 'leftFixedArea',
|
|
},
|
|
});
|
|
skeleton.add({
|
|
area: 'rightArea',
|
|
name: 'backupOutline',
|
|
type: 'Panel',
|
|
props: {
|
|
condition: () => {
|
|
return designer.dragon.dragging && !getTreeMaster(designer).hasVisibleTreeBoard();
|
|
},
|
|
},
|
|
content: OutlineBackupPane,
|
|
});
|
|
|
|
LiveEditing.addLiveEditingSpecificRule(liveEditingRule);
|
|
LiveEditing.addLiveEditingSaveHandler(liveEditingSaveHander);
|