From c4bfeaa201a3ab9fd6593f912e3711b2b5702f49 Mon Sep 17 00:00:00 2001 From: JackLian Date: Thu, 5 Jan 2023 16:54:11 +0800 Subject: [PATCH] refactor: reorganize types --- .eslintrc.js | 7 ++ .../code-generator/src/parser/SchemaParser.ts | 6 +- modules/code-generator/src/types/core.ts | 19 +++-- modules/code-generator/src/utils/nodeToJSX.ts | 6 +- .../bem-tools/border-detecting.tsx | 3 - .../designer/src/builtin-simulator/host.ts | 21 +++-- .../live-editing/live-editing.ts | 1 - .../src/builtin-simulator/renderer.ts | 4 +- packages/designer/src/designer/clipboard.ts | 15 ---- packages/designer/src/designer/designer.ts | 14 +++- packages/designer/src/designer/dragon.ts | 15 ++-- .../designer/src/document/document-model.ts | 7 +- packages/designer/src/document/node/node.ts | 14 ++-- .../designer/src/document/node/props/prop.ts | 8 +- packages/designer/src/simulator.ts | 21 ++++- packages/designer/src/types/index.ts | 6 ++ packages/editor-core/src/editor.ts | 29 +++---- packages/editor-skeleton/src/area.ts | 10 ++- .../src/controllers/pane-controller.ts | 22 +++-- .../rax-simulator-renderer/src/renderer.ts | 10 +-- .../react-simulator-renderer/src/renderer.ts | 9 +- packages/shell/src/api/canvas.ts | 3 +- packages/shell/src/api/common.tsx | 5 +- packages/shell/src/model/document-model.ts | 9 +- packages/types/src/activity.ts | 6 +- packages/types/src/assets.ts | 25 +++--- packages/types/src/designer.ts | 25 ------ packages/types/src/dragon.ts | 82 ------------------- packages/types/src/editor-skeleton.ts | 8 -- packages/types/src/editor.ts | 34 -------- packages/types/src/index.ts | 19 ----- packages/types/src/node.ts | 10 --- packages/types/src/schema.ts | 19 ----- .../types/src/shell/model/document-model.ts | 6 +- packages/types/src/shell/model/editor.ts | 19 ++--- packages/types/src/shell/model/index.ts | 3 +- packages/types/src/shell/model/sensor.ts | 42 ++++++++++ .../src/shell/type/editor-get-options.ts | 5 ++ .../types/src/shell/type/editor-get-result.ts | 4 + .../src/shell/type/editor-register-options.ts | 19 +++++ .../types/src/shell/type/editor-value-key.ts | 2 + packages/types/src/shell/type/index.ts | 12 ++- .../types/src/shell/type/node-data-type.ts | 3 + .../types/src/shell/type/node-instance.ts | 8 ++ .../types/src/shell/type/on-change-options.ts | 6 ++ packages/types/src/shell/type/slot-schema.ts | 17 ++++ packages/utils/src/schema.ts | 4 + 47 files changed, 300 insertions(+), 342 deletions(-) delete mode 100644 packages/types/src/designer.ts delete mode 100644 packages/types/src/dragon.ts delete mode 100644 packages/types/src/editor-skeleton.ts delete mode 100644 packages/types/src/node.ts delete mode 100644 packages/types/src/schema.ts create mode 100644 packages/types/src/shell/model/sensor.ts create mode 100644 packages/types/src/shell/type/editor-get-options.ts create mode 100644 packages/types/src/shell/type/editor-get-result.ts create mode 100644 packages/types/src/shell/type/editor-register-options.ts create mode 100644 packages/types/src/shell/type/editor-value-key.ts create mode 100644 packages/types/src/shell/type/node-data-type.ts create mode 100644 packages/types/src/shell/type/node-instance.ts create mode 100644 packages/types/src/shell/type/on-change-options.ts create mode 100644 packages/types/src/shell/type/slot-schema.ts diff --git a/.eslintrc.js b/.eslintrc.js index 1455cdfd4..a74dc274e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -41,5 +41,12 @@ module.exports = { '@typescript-eslint/dot-notation': 0, // for lint performance '@typescript-eslint/restrict-plus-operands': 0, // for lint performance 'no-unexpected-multiline': 1, + 'no-multiple-empty-lines': ['error', { "max": 1 }], + 'lines-around-comment': ['error', { + "beforeBlockComment": true, + "afterBlockComment": false, + "afterLineComment": false, + "allowBlockStart": true, + }], } }; diff --git a/modules/code-generator/src/parser/SchemaParser.ts b/modules/code-generator/src/parser/SchemaParser.ts index 8c563ba16..3108fee47 100644 --- a/modules/code-generator/src/parser/SchemaParser.ts +++ b/modules/code-generator/src/parser/SchemaParser.ts @@ -5,7 +5,7 @@ import changeCase from 'change-case'; import { IPublicTypeUtilItem, - NodeDataType, + IPublicTypeNodeDataType, IPublicTypeNodeSchema, IPublicTypeContainerSchema, IPublicTypeProjectSchema, @@ -81,7 +81,7 @@ function processChildren(schema: IPublicTypeNodeSchema): void { if (nodeProps.children) { if (!schema.children) { // eslint-disable-next-line no-param-reassign - schema.children = nodeProps.children as NodeDataType; + schema.children = nodeProps.children as IPublicTypeNodeDataType; } else { let _children: IPublicTypeNodeData[] = []; @@ -331,7 +331,7 @@ export class SchemaParser implements ISchemaParser { }; } - getComponentNames(children: NodeDataType): string[] { + getComponentNames(children: IPublicTypeNodeDataType): string[] { return handleSubNodes( children, { diff --git a/modules/code-generator/src/types/core.ts b/modules/code-generator/src/types/core.ts index b2c110823..6c33d0e25 100644 --- a/modules/code-generator/src/types/core.ts +++ b/modules/code-generator/src/types/core.ts @@ -5,7 +5,7 @@ import { IPublicTypeCompositeObject, ResultDir, ResultFile, - NodeDataType, + IPublicTypeNodeDataType, IPublicTypeProjectSchema, IPublicTypeJSExpression, IPublicTypeJSFunction, @@ -65,7 +65,10 @@ export interface ICodeStruct extends IBaseCodeStruct { /** 上下文数据,用来在插件之间共享一些数据 */ export interface IContextData extends IProjectBuilderOptions { - /** 是否使用了 Ref 的 API (this.$/this.$$) */ + + /** + * 是否使用了 Ref 的 API (this.$/this.$$) + * */ useRefApi?: boolean; /** @@ -108,6 +111,7 @@ export interface IModuleBuilder { * @interface ICodeGenerator */ export interface ICodeGenerator { + /** * 出码接口,把 Schema 转换成代码文件系统描述 * @@ -138,26 +142,27 @@ export interface IProjectPlugins { } export interface IProjectBuilderOptions { - /** 是否处于严格模式(默认: 否) */ + + /** 是否处于严格模式 (默认:否) */ inStrictMode?: boolean; /** * 是否要容忍对 JSExpression 求值时的异常 * 默认:true - * 注: 如果容忍异常,则会在求值时包裹 try-catch 块, + * 注:如果容忍异常,则会在求值时包裹 try-catch 块, * catch 到异常时默认会抛出一个 CustomEvent 事件里面包含异常信息和求值的表达式 */ tolerateEvalErrors?: boolean; /** * 容忍异常的时候的的错误处理语句块 - * 默认: 无 + * 默认:无 * 您可以设置为一个语句块,比如: * window.dispatchEvent(new CustomEvent('lowcode-eval-error', { error, expr })) * * 一般可以结合埋点监控模块用来监控求值异常 * - * 其中: + * 其中: * - error: 异常信息 * - expr: 求值的表达式 */ @@ -205,7 +210,7 @@ type CompositeTypeGenerator = | BaseGenerator | Array>; -export type NodeGenerator = (nodeItem: NodeDataType, scope: IScope) => T; +export type NodeGenerator = (nodeItem: IPublicTypeNodeDataType, scope: IScope) => T; // FIXME: 在新的实现中,添加了第一参数 this: CustomHandlerSet 作为上下文。究其本质 // scopeBindings?: IScopeBindings; diff --git a/modules/code-generator/src/utils/nodeToJSX.ts b/modules/code-generator/src/utils/nodeToJSX.ts index bb03523c0..73dba862c 100644 --- a/modules/code-generator/src/utils/nodeToJSX.ts +++ b/modules/code-generator/src/utils/nodeToJSX.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; import { pipe } from 'fp-ts/function'; -import { IPublicTypeNodeSchema, isNodeSchema, NodeDataType, IPublicTypeCompositeValue } from '@alilc/lowcode-types'; +import { IPublicTypeNodeSchema, isNodeSchema, IPublicTypeNodeDataType, IPublicTypeCompositeValue } from '@alilc/lowcode-types'; import { IScope, @@ -365,7 +365,7 @@ export function generateReactExprInJS( const handleChildren = (v: string[]) => v.join(''); export function createNodeGenerator(cfg: NodeGeneratorConfig = {}): NodeGenerator { - const generateNode = (nodeItem: NodeDataType, scope: IScope): string => { + const generateNode = (nodeItem: IPublicTypeNodeDataType, scope: IScope): string => { if (_.isArray(nodeItem)) { const resList = nodeItem.map((n) => generateNode(n, scope)); return handleChildren(resList); @@ -390,7 +390,7 @@ export function createNodeGenerator(cfg: NodeGeneratorConfig = {}): NodeGenerato return `{${valueStr}}`; }; - return (nodeItem: NodeDataType, scope: IScope) => unwrapJsExprQuoteInJsx(generateNode(nodeItem, scope)); + return (nodeItem: IPublicTypeNodeDataType, scope: IScope) => unwrapJsExprQuoteInJsx(generateNode(nodeItem, scope)); } const defaultReactGeneratorConfig: NodeGeneratorConfig = { diff --git a/packages/designer/src/builtin-simulator/bem-tools/border-detecting.tsx b/packages/designer/src/builtin-simulator/bem-tools/border-detecting.tsx index 710ba3e53..f316e1c7a 100644 --- a/packages/designer/src/builtin-simulator/bem-tools/border-detecting.tsx +++ b/packages/designer/src/builtin-simulator/bem-tools/border-detecting.tsx @@ -6,7 +6,6 @@ import { getClosestNode } from '@alilc/lowcode-utils'; import { intl } from '../../locale'; import { BuiltinSimulatorHost } from '../host'; - export class BorderDetectingInstance extends PureComponent<{ title: IPublicTypeTitleContent; rect: DOMRect | null; @@ -77,11 +76,9 @@ export class BorderDetecting extends Component<{ host: BuiltinSimulatorHost }> { const { host } = this.props; const { current } = this; - const canHoverHook = current?.componentMeta.getMetadata()?.configure.advanced?.callbacks?.onHoverHook; const canHover = (canHoverHook && typeof canHoverHook === 'function') ? canHoverHook(current.internalToShellNode()) : true; - if (!canHover || !current || host.viewport.scrolling || host.liveEditing.editing) { return null; } diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 5dee3f246..2171050c8 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -57,7 +57,7 @@ import { IPublicEnumTransitionType, IPublicEnumDragObjectType, IPublicTypeDragNodeObject, - NodeInstance, + IPublicTypeNodeInstance, IPublicTypeComponentInstance, IPublicTypeLocationChildrenDetail, IPublicTypeLocationDetailType, @@ -173,7 +173,6 @@ export class BuiltinSimulatorHost implements ISimulatorHost | null { + ): IPublicTypeNodeInstance | null { return this.renderer?.getClosestNodeInstance(from, specId) || null; } @@ -1028,7 +1027,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost | null { + getNodeInstanceFromElement(target: Element | null): IPublicTypeNodeInstance | null { if (!target) { return null; } @@ -1111,14 +1110,14 @@ export class BuiltinSimulatorHost implements ISimulatorHost | undefined; + let nodeInstance: IPublicTypeNodeInstance | undefined; if (target) { const ref = this.getNodeInstanceFromElement(target); diff --git a/packages/designer/src/builtin-simulator/live-editing/live-editing.ts b/packages/designer/src/builtin-simulator/live-editing/live-editing.ts index a054d1723..e92e266ee 100644 --- a/packages/designer/src/builtin-simulator/live-editing/live-editing.ts +++ b/packages/designer/src/builtin-simulator/live-editing/live-editing.ts @@ -214,7 +214,6 @@ function selectRange(doc: Document, range: Range) { } } - function queryPropElement(rootElement: HTMLElement, targetElement: HTMLElement, selector?: string) { if (!selector) { return null; diff --git a/packages/designer/src/builtin-simulator/renderer.ts b/packages/designer/src/builtin-simulator/renderer.ts index e2c92f3b6..be32b6be6 100644 --- a/packages/designer/src/builtin-simulator/renderer.ts +++ b/packages/designer/src/builtin-simulator/renderer.ts @@ -1,5 +1,5 @@ import { Component } from '../simulator'; -import { IPublicTypeNodeSchema, IPublicTypeComponentInstance, NodeInstance } from '@alilc/lowcode-types'; +import { IPublicTypeNodeSchema, IPublicTypeComponentInstance, IPublicTypeNodeInstance } from '@alilc/lowcode-types'; export interface BuiltinSimulatorRenderer { readonly isSimulatorRenderer: true; @@ -8,7 +8,7 @@ export interface BuiltinSimulatorRenderer { getClosestNodeInstance( from: IPublicTypeComponentInstance, nodeId?: string, - ): NodeInstance | null; + ): IPublicTypeNodeInstance | null; findDOMNodes(instance: IPublicTypeComponentInstance): Array | null; getClientRects(element: Element | Text): DOMRect[]; setNativeSelection(enableFlag: boolean): void; diff --git a/packages/designer/src/designer/clipboard.ts b/packages/designer/src/designer/clipboard.ts index 03546f11e..a43b51b0e 100644 --- a/packages/designer/src/designer/clipboard.ts +++ b/packages/designer/src/designer/clipboard.ts @@ -18,23 +18,8 @@ function getDataFromPasteEvent(event: ClipboardEvent) { }; } } catch (error) { - /* - const html = clipboardData.getData('text/html'); - if (html !== '') { - // TODO: clear the html - return { - code: '
', - maps: {}, - }; - } - */ // TODO: open the parser implement return { }; - /* - return { - code: clipboardData.getData('text/plain'), - maps: {}, - }; */ } } diff --git a/packages/designer/src/designer/designer.ts b/packages/designer/src/designer/designer.ts index 999dc84a5..bf98a812a 100644 --- a/packages/designer/src/designer/designer.ts +++ b/packages/designer/src/designer/designer.ts @@ -13,10 +13,12 @@ import { IShellModelFactory, IPublicModelDragObject, IPublicModelScrollable, - IDesigner, IPublicModelScroller, IPublicTypeLocationData, IPublicEnumTransformStage, + IPublicModelDragon, + IPublicModelActiveTracker, + IPublicModelDropLocation, } from '@alilc/lowcode-types'; import { megreAssets, IPublicTypeAssetsJson, isNodeSchema, isDragNodeObject, isDragNodeDataObject, isLocationChildrenDetail, Logger } from '@alilc/lowcode-utils'; import { Project } from '../project'; @@ -57,6 +59,16 @@ export interface DesignerProps { [key: string]: any; } +export interface IDesigner { + get dragon(): IPublicModelDragon; + get activeTracker(): IPublicModelActiveTracker; + createScroller(scrollable: IPublicModelScrollable): IPublicModelScroller; + + /** + * 创建插入位置,考虑放到 dragon 中 + */ + createLocation(locationData: IPublicTypeLocationData): IPublicModelDropLocation; +} export class Designer implements IDesigner { dragon: Dragon; diff --git a/packages/designer/src/designer/dragon.ts b/packages/designer/src/designer/dragon.ts index 963c187bd..29a67a9ab 100644 --- a/packages/designer/src/designer/dragon.ts +++ b/packages/designer/src/designer/dragon.ts @@ -8,7 +8,7 @@ import { IPublicModelNode, IPublicModelDragon, IPublicModelLocateEvent, - ISensor, + IPublicModelSensor, } from '@alilc/lowcode-types'; import { setNativeSelection, cursor } from '@alilc/lowcode-utils'; import { Node } from '../document'; @@ -22,7 +22,7 @@ export interface ILocateEvent extends IPublicModelLocateEvent { /** * 激活的感应器 */ - sensor?: ISensor; + sensor?: IPublicModelSensor; } @@ -52,6 +52,7 @@ export function isLocateEvent(e: any): e is ILocateEvent { } const SHAKE_DISTANCE = 4; + /** * mouse shake check */ @@ -103,16 +104,16 @@ export interface IDragon extends IPublicModelDragon { * Drag-on 拖拽引擎 */ export class Dragon implements IDragon { - private sensors: ISensor[] = []; + private sensors: IPublicModelSensor[] = []; key = Math.random(); /** * current active sensor, 可用于感应区高亮 */ - @obx.ref private _activeSensor: ISensor | undefined; + @obx.ref private _activeSensor: IPublicModelSensor | undefined; - get activeSensor(): ISensor | undefined { + get activeSensor(): IPublicModelSensor | undefined { return this._activeSensor; } @@ -173,7 +174,7 @@ export class Dragon implements IDragon { const forceCopyState = isDragNodeObject(dragObject) && dragObject.nodes.some((node: Node | IPublicModelNode) => (typeof node.isSlot === 'function' ? node.isSlot() : node.isSlot)); const isBoostFromDragAPI = isDragEvent(boostEvent); - let lastSensor: ISensor | undefined; + let lastSensor: IPublicModelSensor | undefined; this._dragging = false; @@ -462,7 +463,7 @@ export class Dragon implements IDragon { /* istanbul ignore next */ const chooseSensor = (e: ILocateEvent) => { // this.sensors will change on dragstart - const sensors: ISensor[] = this.sensors.concat(masterSensors as ISensor[]); + const sensors: IPublicModelSensor[] = this.sensors.concat(masterSensors as IPublicModelSensor[]); let sensor = e.sensor && e.sensor.isEnter(e) ? e.sensor diff --git a/packages/designer/src/document/document-model.ts b/packages/designer/src/document/document-model.ts index 679931bc7..6fd30394b 100644 --- a/packages/designer/src/document/document-model.ts +++ b/packages/designer/src/document/document-model.ts @@ -15,8 +15,7 @@ import { IPublicApiProject, IPublicModelDropLocation, IPublicEnumTransformStage, - IPublicOnChangeOptions, - EDITOR_EVENT, + IPublicTypeOnChangeOptions, } from '@alilc/lowcode-types'; import { Project } from '../project'; import { ISimulatorHost } from '../simulator'; @@ -27,6 +26,7 @@ import { Selection } from './selection'; import { History } from './history'; import { ModalNodesManager } from './node'; import { uniqueId, isPlainObject, compatStage, isJSExpression, isDOMText, isNodeSchema, isDragNodeObject, isDragNodeDataObject } from '@alilc/lowcode-utils'; +import { EDITOR_EVENT } from '../types'; export type GetDataType = T extends undefined ? NodeType extends { @@ -168,7 +168,7 @@ export class DocumentModel implements IDocumentModel { }; } - onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): () => void { + onChangeNodeChildren(fn: (info: IPublicTypeOnChangeOptions) => void): () => void { this.designer.editor?.eventBus.on(EDITOR_EVENT.NODE_VISIBLE_CHANGE, fn); return () => { @@ -338,7 +338,6 @@ export class DocumentModel implements IDocumentModel { @obx.ref private _dropLocation: IDropLocation | null = null; - set dropLocation(loc: IPublicModelDropLocation | null) { this._dropLocation = loc; // pub event diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 67eb817bf..96ac3b073 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -6,17 +6,15 @@ import { IPublicTypePropsList, IPublicTypeNodeData, IPublicTypeI18nData, - SlotSchema, + IPublicTypeSlotSchema, IPublicTypePageSchema, IPublicTypeComponentSchema, - NodeStatus, IPublicTypeCompositeValue, GlobalEvent, IPublicTypeComponentAction, IPublicModelNode, IPublicModelExclusiveGroup, IPublicEnumTransformStage, - EDITOR_EVENT, } from '@alilc/lowcode-types'; import { compatStage, isDOMText, isJSExpression } from '@alilc/lowcode-utils'; import { SettingTopEntry } from '@alilc/lowcode-designer'; @@ -28,8 +26,13 @@ import { ComponentMeta } from '../../component-meta'; import { ExclusiveGroup, isExclusiveGroup } from './exclusive-group'; import { includeSlot, removeSlot } from '../../utils/slot'; import { foreachReverse } from '../../utils/tree'; -import { NodeRemoveOptions } from '../../types'; +import { NodeRemoveOptions, EDITOR_EVENT } from '../../types'; +export interface NodeStatus { + locking: boolean; + pseudo: boolean; + inPlaceEditing: boolean; +} export interface INode extends IPublicModelNode { @@ -1235,14 +1238,13 @@ function ensureNode(node: any, document: DocumentModel): Node { return nodeInstance; } - export interface LeafNode extends Node { readonly children: null; } export type IPublicTypePropChangeOptions = Omit; -export type SlotNode = Node; +export type SlotNode = Node; export type PageNode = Node; export type ComponentNode = Node; export type RootNode = PageNode | ComponentNode; diff --git a/packages/designer/src/document/node/props/prop.ts b/packages/designer/src/document/node/props/prop.ts index cef83f52e..41aee7dea 100644 --- a/packages/designer/src/document/node/props/prop.ts +++ b/packages/designer/src/document/node/props/prop.ts @@ -1,5 +1,5 @@ import { untracked, computed, obx, engineConfig, action, makeObservable, mobx, runInAction } from '@alilc/lowcode-editor-core'; -import { IPublicTypeCompositeValue, GlobalEvent, IPublicTypeJSSlot, SlotSchema, IPublicEnumTransformStage } from '@alilc/lowcode-types'; +import { IPublicTypeCompositeValue, GlobalEvent, IPublicTypeJSSlot, IPublicTypeSlotSchema, IPublicEnumTransformStage } from '@alilc/lowcode-types'; import { uniqueId, isPlainObject, hasOwnProperty, compatStage, isJSExpression, isJSSlot } from '@alilc/lowcode-utils'; import { valueToSource } from './value-to-source'; import { Props } from './props'; @@ -314,10 +314,10 @@ export class Prop implements IPropParent { @action setAsSlot(data: IPublicTypeJSSlot) { this._type = 'slot'; - let slotSchema: SlotSchema; + let slotSchema: IPublicTypeSlotSchema; // 当 data.value 的结构为 { componentName: 'Slot' } 时,复用部分 slotSchema 数据 if ((isPlainObject(data.value) && data.value?.componentName === 'Slot')) { - const value = data.value as SlotSchema; + const value = data.value as IPublicTypeSlotSchema; slotSchema = { componentName: 'Slot', title: value.title || value.props?.slotTitle, @@ -325,7 +325,7 @@ export class Prop implements IPropParent { name: value.name || value.props?.slotName, params: value.params || value.props?.slotParams, children: data.value, - } as SlotSchema; + } as IPublicTypeSlotSchema; } else { slotSchema = { componentName: 'Slot', diff --git a/packages/designer/src/simulator.ts b/packages/designer/src/simulator.ts index baa0fd793..642e5ad67 100644 --- a/packages/designer/src/simulator.ts +++ b/packages/designer/src/simulator.ts @@ -1,5 +1,5 @@ import { ComponentType } from 'react'; -import { IPublicTypeComponentMetadata, IPublicTypeNodeSchema, IPublicModelScrollable, IPublicTypeComponentInstance, ISensor, NodeInstance } from '@alilc/lowcode-types'; +import { IPublicTypeComponentMetadata, IPublicTypeNodeSchema, IPublicModelScrollable, IPublicTypeComponentInstance, IPublicModelSensor, IPublicTypeNodeInstance } from '@alilc/lowcode-types'; import { Point, ScrollTarget, ILocateEvent } from './designer'; import { BuiltinSimulatorRenderer } from './builtin-simulator/renderer'; import { Node, INode } from './document'; @@ -11,6 +11,7 @@ export const AutoFit = '100%'; export interface IScrollable extends IPublicModelScrollable { } export interface IViewport extends IScrollable { + /** * 视口大小 */ @@ -32,22 +33,27 @@ export interface IViewport extends IScrollable { * 视口矩形维度 */ readonly bounds: DOMRect; + /** * 内容矩形维度 */ readonly contentBounds: DOMRect; + /** * 视口滚动对象 */ readonly scrollTarget?: ScrollTarget; + /** * 是否滚动中 */ readonly scrolling: boolean; + /** * 内容当前滚动 X */ readonly scrollX: number; + /** * 内容当前滚动 Y */ @@ -72,8 +78,9 @@ export interface DropContainer { /** * 模拟器控制进程协议 */ -export interface ISimulatorHost

extends ISensor { +export interface ISimulatorHost

extends IPublicModelSensor { readonly isSimulator: true; + /** * 获得边界维度等信息 */ @@ -104,14 +111,17 @@ export interface ISimulatorHost

extends ISensor { * 设置文字拖选 */ setNativeSelection(enableFlag: boolean): void; + /** * 设置拖拽态 */ setDraggingState(state: boolean): void; + /** * 设置拷贝态 */ setCopyState(state: boolean): void; + /** * 清除所有态:拖拽态、拷贝态 */ @@ -128,24 +138,28 @@ export interface ISimulatorHost

extends ISensor { * 描述组件 */ generateComponentMetadata(componentName: string): IPublicTypeComponentMetadata; + /** * 根据组件信息获取组件类 */ getComponent(componentName: string): Component | any; + /** * 根据节点获取节点的组件实例 */ getComponentInstances(node: Node): IPublicTypeComponentInstance[] | null; + /** * 根据 schema 创建组件类 */ createComponent(schema: IPublicTypeNodeSchema): Component | null; + /** * 根据节点获取节点的组件运行上下文 */ getComponentContext(node: Node): object | null; - getClosestNodeInstance(from: IPublicTypeComponentInstance, specId?: string): NodeInstance | null; + getClosestNodeInstance(from: IPublicTypeComponentInstance, specId?: string): IPublicTypeNodeInstance | null; computeRect(node: Node): DOMRect | null; @@ -158,6 +172,7 @@ export interface ISimulatorHost

extends ISensor { postEvent(evtName: string, evtData: any): void; rerender(): void; + /** * 销毁 */ diff --git a/packages/designer/src/types/index.ts b/packages/designer/src/types/index.ts index e18f97145..50fd82bcd 100644 --- a/packages/designer/src/types/index.ts +++ b/packages/designer/src/types/index.ts @@ -11,4 +11,10 @@ export const utils = { getNodeSchemaById, }; +export enum EDITOR_EVENT { + NODE_CHILDREN_CHANGE = 'node.children.change', + + NODE_VISIBLE_CHANGE = 'node.visible.change', +} + export type Utils = typeof utils; \ No newline at end of file diff --git a/packages/editor-core/src/editor.ts b/packages/editor-core/src/editor.ts index e837fc530..5fa6bb894 100644 --- a/packages/editor-core/src/editor.ts +++ b/packages/editor-core/src/editor.ts @@ -7,8 +7,8 @@ import { IPublicModelEditor, EditorConfig, PluginClassSet, - KeyType, - GetReturnType, + IPublicTypeEditorValueKey, + IPublicTypeEditorGetResult, HookConfig, IPublicTypeComponentDescription, IPublicTypeRemoteComponentDescription, @@ -61,10 +61,11 @@ export class Editor extends (EventEmitter as any) implements IPublicModelEditor this.setMaxListeners(200); this.eventBus = new EventBus(this); } + /** * Ioc Container */ - @obx.shallow private context = new Map(); + @obx.shallow private context = new Map(); get locale() { return globalLocale.getLocale(); @@ -76,15 +77,15 @@ export class Editor extends (EventEmitter as any) implements IPublicModelEditor get( keyOrType: KeyOrType, - ): GetReturnType | undefined { + ): IPublicTypeEditorGetResult | undefined { return this.context.get(keyOrType as any); } - has(keyOrType: KeyType): boolean { + has(keyOrType: IPublicTypeEditorValueKey): boolean { return this.context.has(keyOrType); } - set(key: KeyType, data: any): void | Promise { + set(key: IPublicTypeEditorValueKey, data: any): void | Promise { if (key === 'assets') { return this.setAssets(data); } @@ -172,7 +173,7 @@ export class Editor extends (EventEmitter as any) implements IPublicModelEditor this.notifyGot('assets'); } - onceGot(keyOrType: KeyOrType): Promise> { + onceGot(keyOrType: KeyOrType): Promise> { const x = this.context.get(keyOrType); if (x !== undefined) { return Promise.resolve(x); @@ -182,9 +183,9 @@ export class Editor extends (EventEmitter as any) implements IPublicModelEditor }); } - onGot( + onGot( keyOrType: KeyOrType, - fn: (data: GetReturnType) => void, + fn: (data: IPublicTypeEditorGetResult) => void, ): () => void { const x = this.context.get(keyOrType); if (x !== undefined) { @@ -198,7 +199,7 @@ export class Editor extends (EventEmitter as any) implements IPublicModelEditor } } - register(data: any, key?: KeyType): void { + register(data: any, key?: IPublicTypeEditorValueKey): void { this.context.set(key || data, data); this.notifyGot(key || data); } @@ -273,7 +274,7 @@ export class Editor extends (EventEmitter as any) implements IPublicModelEditor /* eslint-disable */ private waits = new Map< - KeyType, + IPublicTypeEditorValueKey, Array<{ once?: boolean; resolve: (data: any) => void; @@ -281,7 +282,7 @@ export class Editor extends (EventEmitter as any) implements IPublicModelEditor >(); /* eslint-enable */ - private notifyGot(key: KeyType) { + private notifyGot(key: IPublicTypeEditorValueKey) { let waits = this.waits.get(key); if (!waits) { return; @@ -301,7 +302,7 @@ export class Editor extends (EventEmitter as any) implements IPublicModelEditor } } - private setWait(key: KeyType, resolve: (data: any) => void, once?: boolean) { + private setWait(key: IPublicTypeEditorValueKey, resolve: (data: any) => void, once?: boolean) { const waits = this.waits.get(key); if (waits) { waits.push({ resolve, once }); @@ -310,7 +311,7 @@ export class Editor extends (EventEmitter as any) implements IPublicModelEditor } } - private delWait(key: KeyType, fn: any) { + private delWait(key: IPublicTypeEditorValueKey, fn: any) { const waits = this.waits.get(key); if (!waits) { return; diff --git a/packages/editor-skeleton/src/area.ts b/packages/editor-skeleton/src/area.ts index f0dac5757..e96103ad6 100644 --- a/packages/editor-skeleton/src/area.ts +++ b/packages/editor-skeleton/src/area.ts @@ -1,12 +1,20 @@ /* eslint-disable max-len */ import { obx, computed, makeObservable } from '@alilc/lowcode-editor-core'; import { Logger } from '@alilc/lowcode-utils'; -import { IPublicTypeWidgetBaseConfig, IArea } from '@alilc/lowcode-types'; +import { IPublicTypeWidgetBaseConfig } from '@alilc/lowcode-types'; import { WidgetContainer } from './widget/widget-container'; import { Skeleton } 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 { @obx private _visible = true; diff --git a/packages/plugin-outline-pane/src/controllers/pane-controller.ts b/packages/plugin-outline-pane/src/controllers/pane-controller.ts index a368c8288..be3b6b9ce 100644 --- a/packages/plugin-outline-pane/src/controllers/pane-controller.ts +++ b/packages/plugin-outline-pane/src/controllers/pane-controller.ts @@ -9,7 +9,7 @@ import { import { IPublicModelDragObject, IPublicModelScrollable, - ISensor, + IPublicModelSensor, IPublicTypeLocationChildrenDetail, IPublicTypeLocationDetailType, IPublicModelNode, @@ -24,7 +24,7 @@ import { IndentTrack } from '../helper/indent-track'; import DwellTimer from '../helper/dwell-timer'; import { ITreeBoard, TreeMaster } from './tree-master'; -export class PaneController implements ISensor, ITreeBoard, IPublicModelScrollable { +export class PaneController implements IPublicModelSensor, ITreeBoard, IPublicModelScrollable { private pluginContext: IPublicModelPluginContext; private treeMaster?: TreeMaster; @@ -50,12 +50,12 @@ export class PaneController implements ISensor, ITreeBoard, IPublicModelScrollab setup(); } - /** -------------------- ISensor begin -------------------- */ + /** -------------------- IPublicModelSensor begin -------------------- */ private indentTrack = new IndentTrack(); /** - * @see ISensor + * @see IPublicModelSensor */ fixEvent(e: IPublicModelLocateEvent): IPublicModelLocateEvent { if (e.fixed) { @@ -77,7 +77,7 @@ export class PaneController implements ISensor, ITreeBoard, IPublicModelScrollab } /** - * @see ISensor + * @see IPublicModelSensor */ locate(e: IPublicModelLocateEvent): IPublicModelDropLocation | undefined | null { this.sensing = true; @@ -213,7 +213,7 @@ export class PaneController implements ISensor, ITreeBoard, IPublicModelScrollab } /** - * @see ISensor + * @see IPublicModelSensor */ isEnter(e: IPublicModelLocateEvent): boolean { if (!this._shell) { @@ -224,7 +224,7 @@ export class PaneController implements ISensor, ITreeBoard, IPublicModelScrollab } /** - * @see ISensor + * @see IPublicModelSensor */ deactiveSensor() { this.sensing = false; @@ -234,15 +234,15 @@ export class PaneController implements ISensor, ITreeBoard, IPublicModelScrollab } private _sensorAvailable = false; + /** - * @see ISensor + * @see IPublicModelSensor */ get sensorAvailable() { return this._sensorAvailable; } - /** -------------------- ISensor end -------------------- */ - + /** -------------------- IPublicModelSensor end -------------------- */ /** -------------------- ITreeBoard begin -------------------- */ @@ -564,7 +564,6 @@ export class PaneController implements ISensor, ITreeBoard, IPublicModelScrollab return this._scrollTarget; } - private scroller?: IPublicModelScroller; purge() { @@ -573,7 +572,6 @@ export class PaneController implements ISensor, ITreeBoard, IPublicModelScrollab this.treeMaster?.removeBoard(this); } - private _shell: HTMLDivElement | null = null; mount(shell: HTMLDivElement | null) { diff --git a/packages/rax-simulator-renderer/src/renderer.ts b/packages/rax-simulator-renderer/src/renderer.ts index 2e4369608..2dca4506e 100644 --- a/packages/rax-simulator-renderer/src/renderer.ts +++ b/packages/rax-simulator-renderer/src/renderer.ts @@ -1,5 +1,5 @@ import { BuiltinSimulatorRenderer, Component, DocumentModel, Node } from '@alilc/lowcode-designer'; -import { IPublicTypeComponentSchema, IPublicTypeNodeSchema, IPublicTypeNpmInfo, IPublicEnumTransformStage, NodeInstance } from '@alilc/lowcode-types'; +import { IPublicTypeComponentSchema, IPublicTypeNodeSchema, IPublicTypeNpmInfo, IPublicEnumTransformStage, IPublicTypeNodeInstance } from '@alilc/lowcode-types'; import { Asset, compatibleLegaoSchema, cursor, isElement, isESModule, isPlainObject, isReactComponent, setNativeSelection } from '@alilc/lowcode-utils'; import LowCodeRenderer from '@alilc/lowcode-rax-renderer'; import { computed, observable as obx, makeObservable, configure } from 'mobx'; @@ -94,7 +94,7 @@ function isValidDesignModeRaxComponentInstance( raxComponentInst: any, ): raxComponentInst is { props: { - _leaf: Exclude['node'], null | undefined>; + _leaf: Exclude['node'], null | undefined>; }; } { const leaf = raxComponentInst?.props?._leaf; @@ -370,6 +370,7 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer { @computed get componentsMap(): any { return this._componentsMap; } + /** * 加载资源 */ @@ -396,7 +397,7 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer { } } - getNodeInstance(dom: HTMLElement): NodeInstance | null { + getNodeInstance(dom: HTMLElement): IPublicTypeNodeInstance | null { const INTERNAL = '_internal'; let instance: any = dom; if (!isElement(instance)) { @@ -429,7 +430,7 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer { return null; } - getClosestNodeInstance(from: any, nodeId?: string): NodeInstance | null { + getClosestNodeInstance(from: any, nodeId?: string): IPublicTypeNodeInstance | null { const el: any = from; if (el) { // if (isElement(el)) { @@ -510,7 +511,6 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer { doc.getElementsByTagName('head')[0].appendChild(s); } - const renderer = this; const { componentsMap: components } = renderer; diff --git a/packages/react-simulator-renderer/src/renderer.ts b/packages/react-simulator-renderer/src/renderer.ts index faa438a24..e76bfb585 100644 --- a/packages/react-simulator-renderer/src/renderer.ts +++ b/packages/react-simulator-renderer/src/renderer.ts @@ -17,7 +17,7 @@ import { AssetLoader, getProjectUtils, } from '@alilc/lowcode-utils'; -import { IPublicTypeComponentSchema, IPublicEnumTransformStage, IPublicTypeNodeSchema, NodeInstance } from '@alilc/lowcode-types'; +import { IPublicTypeComponentSchema, IPublicEnumTransformStage, IPublicTypeNodeSchema, IPublicTypeNodeInstance } from '@alilc/lowcode-types'; // just use types import { BuiltinSimulatorRenderer, Component, DocumentModel, Node } from '@alilc/lowcode-designer'; import LowCodeRenderer from '@alilc/lowcode-react-renderer'; @@ -368,6 +368,7 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer { * 画布是否自动监听事件来重绘节点 */ autoRepaintNode = true; + /** * 加载资源 */ @@ -399,7 +400,7 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer { } } - getClosestNodeInstance(from: ReactInstance, nodeId?: string): NodeInstance | null { + getClosestNodeInstance(from: ReactInstance, nodeId?: string): IPublicTypeNodeInstance | null { return getClosestNodeInstance(from, nodeId); } @@ -557,7 +558,7 @@ const SYMBOL_VDID = Symbol('_LCDocId'); function getClosestNodeInstance( from: ReactInstance, specId?: string, - ): NodeInstance | null { + ): IPublicTypeNodeInstance | null { let el: any = from; if (el) { if (isElement(el)) { @@ -587,7 +588,7 @@ function getClosestNodeInstance( return null; } -function getNodeInstance(fiberNode: any, specId?: string): NodeInstance | null { +function getNodeInstance(fiberNode: any, specId?: string): IPublicTypeNodeInstance | null { const instance = fiberNode?.stateNode; if (instance && SYMBOL_VNID in instance) { const nodeId = instance[SYMBOL_VNID]; diff --git a/packages/shell/src/api/canvas.ts b/packages/shell/src/api/canvas.ts index 9e729467f..4436514fb 100644 --- a/packages/shell/src/api/canvas.ts +++ b/packages/shell/src/api/canvas.ts @@ -4,7 +4,6 @@ import { IPublicModelScrollTarget, IPublicModelScrollable, IPublicModelScroller, - IDesigner, IPublicTypeLocationData, IPublicModelEditor, IPublicModelDragon, @@ -12,13 +11,13 @@ import { } from '@alilc/lowcode-types'; import { ScrollTarget as InnerScrollTarget, + IDesigner, } from '@alilc/lowcode-designer'; import { editorSymbol, designerSymbol, nodeSymbol } from '../symbols'; import { Dragon } from '../model'; import { DropLocation } from '../model/drop-location'; import { ActiveTracker } from '../model/active-tracker'; - export class Canvas implements IPublicApiCanvas { private readonly [editorSymbol]: IPublicModelEditor; diff --git a/packages/shell/src/api/common.tsx b/packages/shell/src/api/common.tsx index c77b80610..ee87bea15 100644 --- a/packages/shell/src/api/common.tsx +++ b/packages/shell/src/api/common.tsx @@ -25,7 +25,6 @@ import { IPublicTypeLocationDetailType as InnerLocationDetailType, IPublicApiCommonEditorCabin, IPublicModelDragon, - IDesigner, } from '@alilc/lowcode-types'; import { SettingField as InnerSettingField, @@ -35,6 +34,7 @@ import { ScrollTarget as InnerScrollTarget, getConvertedExtraKey as innerGetConvertedExtraKey, getOriginalExtraKey as innerGetOriginalExtraKey, + IDesigner, } from '@alilc/lowcode-designer'; import { Skeleton as InnerSkeleton, @@ -63,6 +63,7 @@ import { ReactNode, Component } from 'react'; class DesignerCabin implements IPublicApiCommonDesignerCabin { private readonly [editorSymbol]: Editor; + /** * @deprecated */ @@ -240,6 +241,7 @@ class EditorCabin implements IPublicApiCommonEditorCabin { constructor(editor: Editor) { this[editorSymbol] = editor; } + /** * Title 组件 * @experimental unstable API, pay extra caution when trying to use this @@ -335,7 +337,6 @@ class EditorCabin implements IPublicApiCommonEditorCabin { } } - export class Common implements IPublicApiCommon { private readonly __designerCabin: any; private readonly __skeletonCabin: any; diff --git a/packages/shell/src/model/document-model.ts b/packages/shell/src/model/document-model.ts index f771d62ec..256cbd960 100644 --- a/packages/shell/src/model/document-model.ts +++ b/packages/shell/src/model/document-model.ts @@ -3,14 +3,13 @@ import { DocumentModel as InnerDocumentModel, Node as InnerNode, isDragNodeObject, - IOnChangeOptions as InnerOnChangeOptions, } from '@alilc/lowcode-designer'; import { IPublicEnumTransformStage, IPublicTypeRootSchema, GlobalEvent, IPublicModelDocumentModel, - IPublicOnChangeOptions, + IPublicTypeOnChangeOptions, IPublicModelDragObject, IPublicTypeDragNodeObject, IPublicTypeDragNodeDataObject, @@ -45,6 +44,7 @@ export class DocumentModel implements IPublicModelDocumentModel { selection: IPublicModelSelection; detecting: IPublicModelDetecting; history: IPublicModelHistory; + /** * @deprecated use canvas API instead */ @@ -141,6 +141,7 @@ export class DocumentModel implements IPublicModelDocumentModel { set dropLocation(loc: IPublicModelDropLocation | null) { this[documentSymbol].dropLocation = loc; } + /** * 根据 nodeId 返回 Node 实例 * get node instance by nodeId @@ -297,8 +298,8 @@ export class DocumentModel implements IPublicModelDocumentModel { * 当前 document 的节点 children 变更事件 * @param fn */ - onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): void { - this[documentSymbol].onChangeNodeChildren((info?: IPublicOnChangeOptions) => { + onChangeNodeChildren(fn: (info: IPublicTypeOnChangeOptions) => void): void { + this[documentSymbol].onChangeNodeChildren((info?: IPublicTypeOnChangeOptions) => { if (!info) { return; } diff --git a/packages/types/src/activity.ts b/packages/types/src/activity.ts index ee0ce859a..8549df7b3 100644 --- a/packages/types/src/activity.ts +++ b/packages/types/src/activity.ts @@ -7,7 +7,7 @@ export enum ActivityType { 'COMPOSITE' = 'composite', } -export interface IActivityPayload { +interface IActivityPayload { schema: IPublicTypeNodeSchema; location?: { parent: { @@ -20,6 +20,10 @@ export interface IActivityPayload { newValue: any; } +/** + * TODO: not sure if this is used anywhere + * @deprecated + */ export type ActivityData = { type: ActivityType; payload: IActivityPayload; diff --git a/packages/types/src/assets.ts b/packages/types/src/assets.ts index f7bdfa022..852ed0038 100644 --- a/packages/types/src/assets.ts +++ b/packages/types/src/assets.ts @@ -1,12 +1,3 @@ - -export interface AssetItem { - type: AssetType; - content?: string | null; - device?: string; - level?: AssetLevel; - id?: string; -} - export enum AssetLevel { // 环境依赖库 比如 react, react-dom Environment = 1, @@ -41,12 +32,20 @@ export enum AssetType { Bundle = 'bundle', } +export interface AssetItem { + type: AssetType; + content?: string | null; + device?: string; + level?: AssetLevel; + id?: string; +} + +export type AssetList = Array; + +export type Asset = AssetList | AssetBundle | AssetItem | URL; + export interface AssetBundle { type: AssetType.Bundle; level?: AssetLevel; assets?: Asset | AssetList | null; } - -export type Asset = AssetList | AssetBundle | AssetItem | URL; - -export type AssetList = Array; diff --git a/packages/types/src/designer.ts b/packages/types/src/designer.ts deleted file mode 100644 index 55f1c8e0b..000000000 --- a/packages/types/src/designer.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IPublicModelNode, IPublicModelDragon, IPublicModelDropLocation, IPublicModelScroller, IPublicModelScrollable, IPublicTypeComponentInstance, IPublicTypeLocationData, IPublicModelActiveTracker } from './shell'; - - -export interface IPublicOnChangeOptions { - type: string; - node: IPublicModelNode; -} - - -export interface NodeInstance { - docId: string; - nodeId: string; - instance: T; - node?: Node | null; -} - -export interface IDesigner { - get dragon(): IPublicModelDragon; - get activeTracker(): IPublicModelActiveTracker; - createScroller(scrollable: IPublicModelScrollable): IPublicModelScroller; - /** - * 创建插入位置,考虑放到 dragon 中 - */ - createLocation(locationData: IPublicTypeLocationData): IPublicModelDropLocation; -} diff --git a/packages/types/src/dragon.ts b/packages/types/src/dragon.ts deleted file mode 100644 index 188397e0a..000000000 --- a/packages/types/src/dragon.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { NodeInstance } from './designer'; -import { - IPublicModelDocumentModel, - IPublicModelLocateEvent, - IPublicModelDropLocation, - IPublicTypeComponentInstance, -} from './shell'; -import { IPublicTypeDragObject } from './shell/type/drag-object'; - - -export interface LocateEvent { - readonly type: 'LocateEvent'; - /** - * 浏览器窗口坐标系 - */ - readonly globalX: number; - readonly globalY: number; - /** - * 原始事件 - */ - readonly originalEvent: MouseEvent | DragEvent; - /** - * 拖拽对象 - */ - readonly dragObject: IPublicTypeDragObject; - - /** - * 激活的感应器 - */ - sensor?: ISensor; - - // ======= 以下是 激活的 sensor 将填充的值 ======== - /** - * 浏览器事件响应目标 - */ - target?: Element | null; - /** - * 当前激活文档画布坐标系 - */ - canvasX?: number; - canvasY?: number; - /** - * 激活或目标文档 - */ - documentModel?: IPublicModelDocumentModel; - /** - * 事件订正标识,初始构造时,从发起端构造,缺少 canvasX,canvasY, 需要经过订正才有 - */ - fixed?: true; -} - - -/** - * 拖拽敏感板 - */ -export interface ISensor { - /** - * 是否可响应,比如面板被隐藏,可设置该值 false - */ - readonly sensorAvailable: boolean; - /** - * 给事件打补丁 - */ - fixEvent(e: IPublicModelLocateEvent): IPublicModelLocateEvent; - /** - * 定位并激活 - */ - locate(e: IPublicModelLocateEvent): IPublicModelDropLocation | undefined | null; - /** - * 是否进入敏感板区域 - */ - isEnter(e: IPublicModelLocateEvent): boolean; - /** - * 取消激活 - */ - deactiveSensor(): void; - - /** - * 获取节点实例 - */ - getNodeInstanceFromElement?: (e: Element | null) => NodeInstance | null; -} \ No newline at end of file diff --git a/packages/types/src/editor-skeleton.ts b/packages/types/src/editor-skeleton.ts deleted file mode 100644 index f04e89933..000000000 --- a/packages/types/src/editor-skeleton.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface IArea { - isEmpty(): boolean; - add(config: T | C): T; - remove(config: T | string): number; - setVisible(flag: boolean): void; - hide(): void; - show(): void; -} \ No newline at end of file diff --git a/packages/types/src/editor.ts b/packages/types/src/editor.ts index 1334f4439..3691a7f94 100644 --- a/packages/types/src/editor.ts +++ b/packages/types/src/editor.ts @@ -1,34 +1,6 @@ import { ReactNode, ComponentType } from 'react'; import { IPublicTypeNpmInfo, IPublicModelEditor } from './shell'; -export type KeyType = (new (...args: any[]) => any) | symbol | string; -export type ClassType = new (...args: any[]) => any; -export interface GetOptions { - forceNew?: boolean; - sourceCls?: ClassType; -} -export type GetReturnType = T extends undefined - ? ClsType extends { - prototype: infer R; - } - ? R - : any - : T; - -/** - * duck-typed power-di - * - * @see https://www.npmjs.com/package/power-di - */ -export interface PowerDIRegisterOptions { - /** default: true */ - singleton?: boolean; - /** if data a class, auto new a instance. - * if data a function, auto run(lazy). - * default: true */ - autoNew?: boolean; -} - export interface EditorConfig { skeleton?: SkeletonConfig; theme?: ThemeConfig; @@ -172,10 +144,4 @@ export interface PluginStatus { export interface PluginStatusSet { [key: string]: PluginStatus; -} - -export enum EDITOR_EVENT { - NODE_CHILDREN_CHANGE = 'node.children.change', - - NODE_VISIBLE_CHANGE = 'node.visible.change', } \ No newline at end of file diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 5e7217550..d14dc9b99 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -1,29 +1,10 @@ export * from '@alilc/lowcode-datasource-types'; export * from './editor'; -export * from './shell/type/field-extra-props'; -export * from './shell/type/i18n-map'; -export * from './shell/type/icon-config'; -export * from './shell/type/metadata'; -export * from './shell/type/npm'; -export * from './shell/type/prop-types'; -export * from './schema'; export * from './activity'; -export * from './shell/type/tip-config'; -export * from './shell/type/title-content'; -export * from './utils'; -export * from './shell/type/value-type'; -export * from './shell/type/setter-config'; -export * from './shell/model/setting-target'; -export * from './node'; -export * from './shell/enum/transform-stage'; export * from './code-intermediate'; export * from './code-result'; export * from './assets'; export * as GlobalEvent from './event'; -export * from './shell/type/props-transducer'; -export * from './editor-skeleton'; -export * from './designer'; -export * from './dragon'; export * from './shell'; export * from './shell-model-factory'; // TODO: remove this in future versions diff --git a/packages/types/src/node.ts b/packages/types/src/node.ts deleted file mode 100644 index 732a38c9c..000000000 --- a/packages/types/src/node.ts +++ /dev/null @@ -1,10 +0,0 @@ - -export interface NodeStatus { - locking: boolean; - pseudo: boolean; - inPlaceEditing: boolean; -} - -export interface LeafNode extends Node { - readonly children: null; -} diff --git a/packages/types/src/schema.ts b/packages/types/src/schema.ts deleted file mode 100644 index 0641b057c..000000000 --- a/packages/types/src/schema.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { IPublicTypeNodeSchema } from './shell/type/node-schema'; -import { IPublicTypeNodeData } from './shell/type/node-data'; - -export type NodeDataType = IPublicTypeNodeData | IPublicTypeNodeData[]; -/** - * Slot schema 描述 - */ -export interface SlotSchema extends IPublicTypeNodeSchema { - componentName: 'Slot'; - name?: string; - title?: string; - params?: string[]; - props?: { - slotTitle?: string; - slotName?: string; - slotParams?: string[]; - }; - children?: IPublicTypeNodeSchema[]; -} diff --git a/packages/types/src/shell/model/document-model.ts b/packages/types/src/shell/model/document-model.ts index 48ad9cbd3..e43d409a9 100644 --- a/packages/types/src/shell/model/document-model.ts +++ b/packages/types/src/shell/model/document-model.ts @@ -2,7 +2,7 @@ import { IPublicTypeRootSchema, IPublicTypeDragNodeDataObject, IPublicTypeDragNo import { IPublicEnumTransformStage } from '../enum'; import { IPublicApiProject } from '../api'; import { IPublicModelDropLocation, IPublicModelDetecting, IPublicModelNode, IPublicModelSelection, IPublicModelHistory, IPublicModelModalNodesManager } from './'; -import { IPublicOnChangeOptions } from '@alilc/lowcode-types'; +import { IPublicTypeOnChangeOptions } from '@alilc/lowcode-types'; export interface IPublicModelDocumentModel { @@ -168,12 +168,11 @@ export interface IPublicModelDocumentModel { */ onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): void; - /** * 当前 document 的节点 children 变更事件 * @param fn */ - onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): void; + onChangeNodeChildren(fn: (info: IPublicTypeOnChangeOptions) => void): void; /** * 当前 document 节点属性修改事件 @@ -210,7 +209,6 @@ export interface IPublicModelDocumentModel { */ set dropLocation(loc: IPublicModelDropLocation | null); - /** * 设置聚焦节点变化的回调 * triggered focused node is set mannually from plugin diff --git a/packages/types/src/shell/model/editor.ts b/packages/types/src/shell/model/editor.ts index b6045b910..4f7211387 100644 --- a/packages/types/src/shell/model/editor.ts +++ b/packages/types/src/shell/model/editor.ts @@ -3,27 +3,26 @@ import { EventEmitter } from 'events'; import StrictEventEmitter from 'strict-event-emitter-types'; import * as GlobalEvent from '../../event'; import { IPublicApiEvent } from '../api'; -import { GetOptions, GetReturnType, KeyType, PowerDIRegisterOptions } from '../../editor'; - +import { IPublicTypeEditorValueKey, IPublicTypeEditorGetOptions, IPublicTypeEditorGetResult, IPublicTypeEditorRegisterOptions } from '../type'; export interface IPublicModelEditor extends StrictEventEmitter { get: ( keyOrType: KeyOrType, - opt?: GetOptions - ) => GetReturnType | undefined; + opt?: IPublicTypeEditorGetOptions + ) => IPublicTypeEditorGetResult | undefined; - has: (keyOrType: KeyType) => boolean; + has: (keyOrType: IPublicTypeEditorValueKey) => boolean; - set: (key: KeyType, data: any) => void | Promise; + set: (key: IPublicTypeEditorValueKey, data: any) => void | Promise; - onceGot: (keyOrType: KeyOrType) => Promise>; + onceGot: (keyOrType: KeyOrType) => Promise>; - onGot: ( + onGot: ( keyOrType: KeyOrType, - fn: (data: GetReturnType) => void + fn: (data: IPublicTypeEditorGetResult) => void ) => () => void; - register: (data: any, key?: KeyType, options?: PowerDIRegisterOptions) => void; + register: (data: any, key?: IPublicTypeEditorValueKey, options?: IPublicTypeEditorRegisterOptions) => void; get eventBus(): IPublicApiEvent; } diff --git a/packages/types/src/shell/model/index.ts b/packages/types/src/shell/model/index.ts index e1daf63a0..5b02d0224 100644 --- a/packages/types/src/shell/model/index.ts +++ b/packages/types/src/shell/model/index.ts @@ -26,4 +26,5 @@ export * from './setting-target'; export * from './engine-config'; export * from './editor'; export * from './preference'; -export * from './plugin-instance'; \ No newline at end of file +export * from './plugin-instance'; +export * from './sensor'; \ No newline at end of file diff --git a/packages/types/src/shell/model/sensor.ts b/packages/types/src/shell/model/sensor.ts new file mode 100644 index 000000000..405cd7866 --- /dev/null +++ b/packages/types/src/shell/model/sensor.ts @@ -0,0 +1,42 @@ +import { IPublicTypeNodeInstance } from '../type/node-instance'; +import { + IPublicModelLocateEvent, + IPublicModelDropLocation, + IPublicTypeComponentInstance, +} from '..'; + +/** + * 拖拽敏感板 + */ +export interface IPublicModelSensor { + + /** + * 是否可响应,比如面板被隐藏,可设置该值 false + */ + readonly sensorAvailable: boolean; + + /** + * 给事件打补丁 + */ + fixEvent(e: IPublicModelLocateEvent): IPublicModelLocateEvent; + + /** + * 定位并激活 + */ + locate(e: IPublicModelLocateEvent): IPublicModelDropLocation | undefined | null; + + /** + * 是否进入敏感板区域 + */ + isEnter(e: IPublicModelLocateEvent): boolean; + + /** + * 取消激活 + */ + deactiveSensor(): void; + + /** + * 获取节点实例 + */ + getNodeInstanceFromElement?: (e: Element | null) => IPublicTypeNodeInstance | null; +} diff --git a/packages/types/src/shell/type/editor-get-options.ts b/packages/types/src/shell/type/editor-get-options.ts new file mode 100644 index 000000000..ed5477057 --- /dev/null +++ b/packages/types/src/shell/type/editor-get-options.ts @@ -0,0 +1,5 @@ + +export interface IPublicTypeEditorGetOptions { + forceNew?: boolean; + sourceCls?: new (...args: any[]) => any; +} diff --git a/packages/types/src/shell/type/editor-get-result.ts b/packages/types/src/shell/type/editor-get-result.ts new file mode 100644 index 000000000..af3639ac0 --- /dev/null +++ b/packages/types/src/shell/type/editor-get-result.ts @@ -0,0 +1,4 @@ + +export type IPublicTypeEditorGetResult = T extends undefined ? ClsType extends { + prototype: infer R; +} ? R : any : T; diff --git a/packages/types/src/shell/type/editor-register-options.ts b/packages/types/src/shell/type/editor-register-options.ts new file mode 100644 index 000000000..385346581 --- /dev/null +++ b/packages/types/src/shell/type/editor-register-options.ts @@ -0,0 +1,19 @@ +/** + * duck-typed power-di + * + * @see https://www.npmjs.com/package/power-di + */ +export interface IPublicTypeEditorRegisterOptions { + + /** + * default: true + */ + singleton?: boolean; + + /** + * if data a class, auto new a instance. + * if data a function, auto run(lazy). + * default: true + */ + autoNew?: boolean; +} diff --git a/packages/types/src/shell/type/editor-value-key.ts b/packages/types/src/shell/type/editor-value-key.ts new file mode 100644 index 000000000..8c0d3c6c9 --- /dev/null +++ b/packages/types/src/shell/type/editor-value-key.ts @@ -0,0 +1,2 @@ + +export type IPublicTypeEditorValueKey = (new (...args: any[]) => any) | symbol | string; diff --git a/packages/types/src/shell/type/index.ts b/packages/types/src/shell/type/index.ts index c1f70b605..9a44dade4 100644 --- a/packages/types/src/shell/type/index.ts +++ b/packages/types/src/shell/type/index.ts @@ -1,6 +1,6 @@ // this folder contains all interfaces/types working as type definition // - some exists as type TypeName -// - some althought exists as interfaces , but there won`t be a class implements them. +// - some althought exists as interfaces , but there won`t be any class implements them. // all of above cases will with prefix IPublicType, eg. IPublicTypeSomeName export * from './location'; export * from './active-target'; @@ -74,4 +74,12 @@ export * from './widget-config-area'; export * from './hotkey-callback'; export * from './plugin-register-options'; export * from './resource-options'; -export * from './engine-options'; \ No newline at end of file +export * from './engine-options'; +export * from './on-change-options'; +export * from './slot-schema'; +export * from './node-data-type'; +export * from './node-instance'; +export * from './editor-value-key'; +export * from './editor-get-options'; +export * from './editor-get-result'; +export * from './editor-register-options'; \ No newline at end of file diff --git a/packages/types/src/shell/type/node-data-type.ts b/packages/types/src/shell/type/node-data-type.ts new file mode 100644 index 000000000..d7f68041a --- /dev/null +++ b/packages/types/src/shell/type/node-data-type.ts @@ -0,0 +1,3 @@ +import { IPublicTypeNodeData } from './node-data'; + +export type IPublicTypeNodeDataType = IPublicTypeNodeData | IPublicTypeNodeData[]; diff --git a/packages/types/src/shell/type/node-instance.ts b/packages/types/src/shell/type/node-instance.ts new file mode 100644 index 000000000..e1d9789c8 --- /dev/null +++ b/packages/types/src/shell/type/node-instance.ts @@ -0,0 +1,8 @@ +import { IPublicTypeComponentInstance, IPublicModelNode } from '..'; + +export interface IPublicTypeNodeInstance { + docId: string; + nodeId: string; + instance: T; + node?: IPublicModelNode | null; +} diff --git a/packages/types/src/shell/type/on-change-options.ts b/packages/types/src/shell/type/on-change-options.ts new file mode 100644 index 000000000..a1b0c314d --- /dev/null +++ b/packages/types/src/shell/type/on-change-options.ts @@ -0,0 +1,6 @@ +import { IPublicModelNode } from '..'; + +export interface IPublicTypeOnChangeOptions { + type: string; + node: IPublicModelNode; +} diff --git a/packages/types/src/shell/type/slot-schema.ts b/packages/types/src/shell/type/slot-schema.ts new file mode 100644 index 000000000..d4c1f5d97 --- /dev/null +++ b/packages/types/src/shell/type/slot-schema.ts @@ -0,0 +1,17 @@ +import { IPublicTypeNodeSchema } from './node-schema'; + +/** + * Slot schema 描述 + */ +export interface IPublicTypeSlotSchema extends IPublicTypeNodeSchema { + componentName: 'Slot'; + name?: string; + title?: string; + params?: string[]; + props?: { + slotTitle?: string; + slotName?: string; + slotParams?: string[]; + }; + children?: IPublicTypeNodeSchema[]; +} diff --git a/packages/utils/src/schema.ts b/packages/utils/src/schema.ts index f82ca1a4c..58dfb3045 100644 --- a/packages/utils/src/schema.ts +++ b/packages/utils/src/schema.ts @@ -119,6 +119,10 @@ function getNodeSchemaFromPropsById(props: any, nodeId: string): IPublicTypeNode } } +/** + * TODO: not sure if this is used anywhere + * @deprecated + */ export function applyActivities(pivotSchema: IPublicTypeRootSchema, activities: any, options?: any): IPublicTypeRootSchema { let schema = { ...pivotSchema }; if (!Array.isArray(activities)) {