refactor(editor-core): refactor codes

This commit is contained in:
1ncounter 2024-04-16 16:13:23 +08:00
parent 35db123cbf
commit 1f1da44199
112 changed files with 604 additions and 546 deletions

View File

@ -223,7 +223,7 @@ delete(pluginName: string): void;
*/ */
getPluginPreference( getPluginPreference(
pluginName: string, pluginName: string,
): Record<string, IPublicTypePreferenceValueType> | null | undefined; ): Record<string, IPublicTypePluginPreferenceValueType> | null | undefined;
``` ```
## 相关类型定义 ## 相关类型定义

View File

@ -31,6 +31,7 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@alilc/lowcode-editor-core": "workspace:*", "@alilc/lowcode-editor-core": "workspace:*",
"@alilc/lowcode-shared": "workspace:*",
"@alilc/lowcode-types": "workspace:*", "@alilc/lowcode-types": "workspace:*",
"@alilc/lowcode-utils": "workspace:*", "@alilc/lowcode-utils": "workspace:*",
"@alifd/next": "^1.27.8", "@alifd/next": "^1.27.8",
@ -55,6 +56,7 @@
"peerDependencies": { "peerDependencies": {
"@alifd/next": "^1.27.8", "@alifd/next": "^1.27.8",
"@alilc/lowcode-editor-core": "workspace:*", "@alilc/lowcode-editor-core": "workspace:*",
"@alilc/lowcode-shared": "workspace:*",
"@alilc/lowcode-types": "workspace:*", "@alilc/lowcode-types": "workspace:*",
"@alilc/lowcode-utils": "workspace:*", "@alilc/lowcode-utils": "workspace:*",
"react": "^18.2.0", "react": "^18.2.0",

View File

@ -1,12 +1,13 @@
import * as React from 'react'; import * as React from 'react';
import { Component, Fragment, ReactElement, PureComponent } from 'react'; import { Component, Fragment, ReactElement, PureComponent } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { computed, observer, Title, globalLocale } from '@alilc/lowcode-editor-core'; import { computed, observer, globalLocale } from '@alilc/lowcode-editor-core';
import { IPublicTypeI18nData, IPublicTypeTitleContent } from '@alilc/lowcode-types'; import { IPublicTypeI18nData, IPublicTypeTitleContent } from '@alilc/lowcode-types';
import { isI18nData } from '@alilc/lowcode-utils'; import { isI18nData } from '@alilc/lowcode-utils';
import { DropLocation } from '../../designer'; import { DropLocation } from '../../designer';
import { BuiltinSimulatorHost } from '../../builtin-simulator/host'; import { BuiltinSimulatorHost } from '../../builtin-simulator/host';
import { INode } from '../../document/node'; import { INode } from '../../document/node';
import { Title } from '../../widgets';
export class BorderContainerInstance extends PureComponent<{ export class BorderContainerInstance extends PureComponent<{
title: IPublicTypeTitleContent; title: IPublicTypeTitleContent;

View File

@ -1,10 +1,11 @@
import { Component, Fragment, PureComponent } from 'react'; import { Component, Fragment, PureComponent } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { computed, observer, Title } from '@alilc/lowcode-editor-core'; import { computed, observer } from '@alilc/lowcode-editor-core';
import { IPublicTypeTitleContent } from '@alilc/lowcode-types'; import { IPublicTypeTitleContent } from '@alilc/lowcode-types';
import { getClosestNode } from '@alilc/lowcode-utils'; import { getClosestNode } from '@alilc/lowcode-utils';
import { intl } from '../../locale'; import { intl } from '../../locale';
import { BuiltinSimulatorHost } from '../host'; import { BuiltinSimulatorHost } from '../host';
import { Title } from '../../widgets';
export class BorderDetectingInstance extends PureComponent<{ export class BorderDetectingInstance extends PureComponent<{
title: IPublicTypeTitleContent; title: IPublicTypeTitleContent;

View File

@ -1,8 +1,10 @@
import { Overlay } from '@alifd/next'; import { Overlay } from '@alifd/next';
import React, { MouseEvent } from 'react'; import React, { MouseEvent } from 'react';
import { Title, observer } from '@alilc/lowcode-editor-core'; import { observer } from '@alilc/lowcode-editor-core';
import { canClickNode } from '@alilc/lowcode-utils'; import { canClickNode } from '@alilc/lowcode-utils';
import { INode } from '../../document'; import { INode } from '../../document';
import { Title } from '../../widgets';
import './index.less'; import './index.less';
const { Popup } = Overlay; const { Popup } = Overlay;

View File

@ -1,6 +1,6 @@
import { observable, computed, makeObservable, action } from '@alilc/lowcode-editor-core'; import { observable, computed, makeObservable, action } from '@alilc/lowcode-editor-core';
import { Point, ScrollTarget } from '../designer'; import { Point, ScrollTarget } from '../designer';
import { AutoFit, IViewport } from '../simulator'; import { AutoFit, AUTO_FIT, IViewport } from '../simulator';
export default class Viewport implements IViewport { export default class Viewport implements IViewport {
@observable.ref private rect?: DOMRect; @observable.ref private rect?: DOMRect;
@ -92,9 +92,9 @@ export default class Viewport implements IViewport {
this._contentHeight = this.height / this.scale; this._contentHeight = this.height / this.scale;
} }
@observable.ref private _contentWidth: number | AutoFit = AutoFit; @observable.ref private _contentWidth: number | AutoFit = AUTO_FIT;
@observable.ref private _contentHeight: number | AutoFit = AutoFit; @observable.ref private _contentHeight: number | AutoFit = AUTO_FIT;
@computed get contentHeight(): number | AutoFit { @computed get contentHeight(): number | AutoFit {
return this._contentHeight; return this._contentHeight;

View File

@ -150,7 +150,9 @@ export class ComponentActions {
) { ) {
transducer.level = level; transducer.level = level;
transducer.id = id; transducer.id = id;
const i = this.metadataTransducers.findIndex((item) => item.level != null && item.level > level); const i = this.metadataTransducers.findIndex(
(item) => item.level != null && item.level > level
);
if (i < 0) { if (i < 0) {
this.metadataTransducers.push(transducer); this.metadataTransducers.push(transducer);
} else { } else {

View File

@ -4,6 +4,7 @@ import {
IPublicTypeContextMenuItem, IPublicTypeContextMenuItem,
IPublicApiMaterial, IPublicApiMaterial,
IPublicModelPluginContext, IPublicModelPluginContext,
IPublicTypeDisposable
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { IDesigner, INode } from './designer'; import { IDesigner, INode } from './designer';
import { import {
@ -12,16 +13,18 @@ import {
parseContextMenuProperties, parseContextMenuProperties,
uniqueId, uniqueId,
} from '@alilc/lowcode-utils'; } from '@alilc/lowcode-utils';
import { type AnyFunction } from '@alilc/lowcode-shared';
import { Menu } from '@alifd/next'; import { Menu } from '@alifd/next';
import { engineConfig } from '@alilc/lowcode-editor-core'; import { engineConfig } from '@alilc/lowcode-editor-core';
import './context-menu-actions.scss';
let adjustMenuLayoutFn: Function = (actions: IPublicTypeContextMenuAction[]) => actions; import './context-menu-actions.less';
let adjustMenuLayoutFn: AnyFunction = (actions: IPublicTypeContextMenuAction[]) => actions;
export class GlobalContextMenuActions { export class GlobalContextMenuActions {
enableContextMenu: boolean; enableContextMenu: boolean;
dispose: Function[]; dispose: IPublicTypeDisposable[];
contextMenuActionsMap: Map<string, ContextMenuActions> = new Map(); contextMenuActionsMap: Map<string, ContextMenuActions> = new Map();
@ -50,7 +53,7 @@ export class GlobalContextMenuActions {
actions.push(...contextMenu.actions); actions.push(...contextMenu.actions);
}); });
let destroyFn: Function | undefined; let destroyFn: AnyFunction | undefined = undefined;
const destroy = () => { const destroy = () => {
destroyFn?.(); destroyFn?.();
@ -79,8 +82,7 @@ export class GlobalContextMenuActions {
}); });
const target = event.target; const target = event.target;
const { top, left } = (target as any).getBoundingClientRect();
const { top, left } = (target as any)?.getBoundingClientRect();
const menuInstance = Menu.create({ const menuInstance = Menu.create({
target: event.target, target: event.target,
@ -120,7 +122,7 @@ export class ContextMenuActions {
designer: IDesigner; designer: IDesigner;
dispose: Function[]; dispose: AnyFunction[];
enableContextMenu: boolean; enableContextMenu: boolean;
@ -154,7 +156,7 @@ export class ContextMenuActions {
const { bounds } = designer.project.simulator?.viewport || { bounds: { left: 0, top: 0 } }; const { bounds } = designer.project.simulator?.viewport || { bounds: { left: 0, top: 0 } };
const { left: simulatorLeft, top: simulatorTop } = bounds; const { left: simulatorLeft, top: simulatorTop } = bounds;
let destroyFn: Function | undefined; let destroyFn: AnyFunction | undefined = undefined;
const destroy = () => { const destroy = () => {
destroyFn?.(); destroyFn?.();

View File

@ -1,14 +1,16 @@
import { Component, ReactElement } from 'react'; import { Component, ReactElement } from 'react';
import { observer, observable, Title, makeObservable, action } from '@alilc/lowcode-editor-core'; import { observer, observable, makeObservable, action } from '@alilc/lowcode-editor-core';
import { Designer } from '../designer';
import { isSimulatorHost } from '../../simulator';
import './ghost.less';
import { import {
IPublicTypeI18nData, IPublicTypeI18nData,
IPublicTypeNodeSchema, IPublicTypeNodeSchema,
IPublicModelDragObject, IPublicModelDragObject,
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { isDragNodeObject } from '@alilc/lowcode-utils'; import { isDragNodeObject } from '@alilc/lowcode-utils';
import { Designer } from '../designer';
import { isSimulatorHost } from '../../simulator';
import { Title } from '../../widgets';
import './ghost.less';
type offBinding = () => any; type offBinding = () => any;

View File

@ -6,7 +6,6 @@ import { valueToSource } from './value-to-source';
import { IPropParent } from './props'; import { IPropParent } from './props';
import type { IProps } from './props'; import type { IProps } from './props';
import { ISlotNode, INode } from '../node'; import { ISlotNode, INode } from '../node';
// import { TransformStage } from '../transform-stage';
const { set: mobxSet, isObservableArray } = mobx; const { set: mobxSet, isObservableArray } = mobx;
export const UNSET = Symbol.for('unset'); export const UNSET = Symbol.for('unset');

View File

@ -5,7 +5,6 @@ import { uniqueId, compatStage } from '@alilc/lowcode-utils';
import { Prop, UNSET } from './prop'; import { Prop, UNSET } from './prop';
import type { IProp } from './prop'; import type { IProp } from './prop';
import { INode } from '../node'; import { INode } from '../node';
// import { TransformStage } from '../transform-stage';
interface ExtrasObject { interface ExtrasObject {
[key: string]: any; [key: string]: any;

View File

@ -4,6 +4,6 @@ export * from './designer';
export * from './document'; export * from './document';
export * from './project'; export * from './project';
export * from './builtin-simulator'; export * from './builtin-simulator';
export * from './plugin';
export * from './types'; export * from './types';
export * from './context-menu-actions'; export * from './context-menu-actions';
export * from './widgets';

View File

@ -1,4 +0,0 @@
export * from './plugin-context';
export * from './plugin-manager';
export * from './plugin-types';
export * from './plugin';

View File

@ -1,89 +0,0 @@
/* eslint-disable no-multi-assign */
import { engineConfig, createModuleEventBus } from '@alilc/lowcode-editor-core';
import {
IPublicApiHotkey,
IPublicApiProject,
IPublicApiSkeleton,
IPublicApiSetters,
IPublicApiMaterial,
IPublicApiEvent,
IPublicApiCommon,
IPublicModelPluginContext,
IPluginPreferenceMananger,
IPublicTypePreferenceValueType,
IPublicModelEngineConfig,
IPublicApiLogger,
IPublicApiPlugins,
IPublicTypePluginDeclaration,
IPublicApiCanvas,
IPublicApiWorkspace,
IPublicEnumPluginRegisterLevel,
IPublicModelWindow,
IPublicApiCommonUI,
IPublicApiCommand,
} from '@alilc/lowcode-types';
import {
IPluginContextOptions,
ILowCodePluginContextApiAssembler,
ILowCodePluginContextPrivate,
} from './plugin-types';
import { isValidPreferenceKey } from './plugin-utils';
export default class PluginContext implements
IPublicModelPluginContext, ILowCodePluginContextPrivate {
hotkey: IPublicApiHotkey;
project: IPublicApiProject;
skeleton: IPublicApiSkeleton;
setters: IPublicApiSetters;
material: IPublicApiMaterial;
event: IPublicApiEvent;
config: IPublicModelEngineConfig;
common: IPublicApiCommon;
logger: IPublicApiLogger;
plugins: IPublicApiPlugins;
preference: IPluginPreferenceMananger;
pluginEvent: IPublicApiEvent;
canvas: IPublicApiCanvas;
workspace: IPublicApiWorkspace;
registerLevel: IPublicEnumPluginRegisterLevel;
editorWindow: IPublicModelWindow;
commonUI: IPublicApiCommonUI;
isPluginRegisteredInWorkspace: false;
command: IPublicApiCommand;
constructor(
options: IPluginContextOptions,
contextApiAssembler: ILowCodePluginContextApiAssembler,
) {
const { pluginName = 'anonymous', meta = {} } = options;
contextApiAssembler.assembleApis(this, pluginName, meta);
this.pluginEvent = createModuleEventBus(pluginName, 200);
const enhancePluginContextHook = engineConfig.get('enhancePluginContextHook');
if (enhancePluginContextHook) {
enhancePluginContextHook(this);
}
}
setPreference(
pluginName: string,
preferenceDeclaration: IPublicTypePluginDeclaration,
): void {
const getPreferenceValue = (
key: string,
defaultValue?: IPublicTypePreferenceValueType,
): IPublicTypePreferenceValueType | undefined => {
if (!isValidPreferenceKey(key, preferenceDeclaration)) {
return undefined;
}
const pluginPreference = this.plugins.getPluginPreference(pluginName) || {};
if (pluginPreference[key] === undefined || pluginPreference[key] === null) {
return defaultValue;
}
return pluginPreference[key];
};
this.preference = {
getPreferenceValue,
};
}
}

View File

@ -1,104 +0,0 @@
import {
IPublicApiHotkey,
IPublicApiProject,
IPublicApiSkeleton,
IPublicApiSetters,
IPublicApiMaterial,
IPublicApiEvent,
IPublicApiCommon,
IPublicApiPlugins,
IPublicTypePluginConfig,
IPublicApiLogger,
IPublicTypePreferenceValueType,
IPublicModelEngineConfig,
IPublicTypePlugin,
IPublicApiCanvas,
IPublicApiWorkspace,
IPublicTypePluginMeta,
IPublicTypePluginRegisterOptions,
IPublicModelWindow,
IPublicEnumPluginRegisterLevel,
IPublicApiCommonUI,
IPublicApiCommand,
} from '@alilc/lowcode-types';
import PluginContext from './plugin-context';
export type PluginPreference = Map<string, Record<string, IPublicTypePreferenceValueType>>;
export interface ILowCodePluginRuntimeCore {
name: string;
dep: string[];
disabled: boolean;
config: IPublicTypePluginConfig;
logger: IPublicApiLogger;
meta: IPublicTypePluginMeta;
init(forceInit?: boolean): void;
isInited(): boolean;
destroy(): void;
toProxy(): any;
setDisabled(flag: boolean): void;
}
interface ILowCodePluginRuntimeExportsAccessor {
[propName: string]: any;
}
export type ILowCodePluginRuntime =
ILowCodePluginRuntimeCore & ILowCodePluginRuntimeExportsAccessor;
export interface ILowCodePluginContextPrivate {
set hotkey(hotkey: IPublicApiHotkey);
set project(project: IPublicApiProject);
set skeleton(skeleton: IPublicApiSkeleton);
set setters(setters: IPublicApiSetters);
set material(material: IPublicApiMaterial);
set event(event: IPublicApiEvent);
set config(config: IPublicModelEngineConfig);
set common(common: IPublicApiCommon);
set plugins(plugins: IPublicApiPlugins);
set logger(plugins: IPublicApiLogger);
set pluginEvent(event: IPublicApiEvent);
set canvas(canvas: IPublicApiCanvas);
set workspace(workspace: IPublicApiWorkspace);
set editorWindow(window: IPublicModelWindow);
set registerLevel(level: IPublicEnumPluginRegisterLevel);
set isPluginRegisteredInWorkspace(flag: boolean);
set commonUI(commonUI: IPublicApiCommonUI);
set command(command: IPublicApiCommand);
}
export interface ILowCodePluginContextApiAssembler {
assembleApis(
context: ILowCodePluginContextPrivate,
pluginName: string,
meta: IPublicTypePluginMeta,
): void;
}
interface ILowCodePluginManagerPluginAccessor {
[pluginName: string]: ILowCodePluginRuntime | any;
}
export interface ILowCodePluginManagerCore {
register(
pluginModel: IPublicTypePlugin,
pluginOptions?: any,
options?: IPublicTypePluginRegisterOptions,
): Promise<void>;
init(
pluginPreference?: Map<string, Record<string, IPublicTypePreferenceValueType>>
): Promise<void>;
get(pluginName: string): ILowCodePluginRuntime | undefined;
getAll(): ILowCodePluginRuntime[];
has(pluginName: string): boolean;
delete(pluginName: string): any;
setDisabled(pluginName: string, flag: boolean): void;
dispose(): void;
_getLowCodePluginContext (options: IPluginContextOptions): PluginContext;
}
export type ILowCodePluginManager = ILowCodePluginManagerCore & ILowCodePluginManagerPluginAccessor;
export interface IPluginContextOptions {
pluginName: string;
meta?: IPublicTypePluginMeta;
}

View File

@ -1,35 +0,0 @@
import { isPlainObject } from 'lodash-es';
import {
IPublicTypePluginRegisterOptions,
IPublicTypePluginDeclaration,
} from '@alilc/lowcode-types';
export function isValidPreferenceKey(
key: string,
preferenceDeclaration: IPublicTypePluginDeclaration,
): boolean {
if (!preferenceDeclaration || !Array.isArray(preferenceDeclaration.properties)) {
return false;
}
return preferenceDeclaration.properties.some((prop) => {
return prop.key === key;
});
}
export function isLowCodeRegisterOptions(opts: any): opts is IPublicTypePluginRegisterOptions {
return opts && ('autoInit' in opts || 'override' in opts);
}
export function filterValidOptions(opts: any, preferenceDeclaration: IPublicTypePluginDeclaration) {
if (!opts || !isPlainObject(opts)) return opts;
const filteredOpts = {} as any;
Object.keys(opts).forEach((key) => {
if (isValidPreferenceKey(key, preferenceDeclaration)) {
const v = opts[key];
if (v !== undefined && v !== null) {
filteredOpts[key] = v;
}
}
});
return filteredOpts;
}

View File

@ -2,6 +2,7 @@ import { Component } from 'react';
import { observer, engineConfig } from '@alilc/lowcode-editor-core'; import { observer, engineConfig } from '@alilc/lowcode-editor-core';
import { Designer } from '../designer'; import { Designer } from '../designer';
import { BuiltinSimulatorHostView } from '../builtin-simulator'; import { BuiltinSimulatorHostView } from '../builtin-simulator';
import './project.less'; import './project.less';
export class BuiltinLoading extends Component { export class BuiltinLoading extends Component {

View File

@ -6,8 +6,7 @@ import { INode } from './document';
import { IProject } from './project'; import { IProject } from './project';
export type AutoFit = '100%'; export type AutoFit = '100%';
// eslint-disable-next-line no-redeclare export const AUTO_FIT: AutoFit = '100%';
export const AutoFit = '100%';
export interface IScrollable extends IPublicTypeScrollable { export interface IScrollable extends IPublicTypeScrollable {
} }

View File

@ -1,20 +1,9 @@
import { isFormEvent, compatibleLegaoSchema, getNodeSchemaById, isNodeSchema } from '@alilc/lowcode-utils';
export type NodeRemoveOptions = { export type NodeRemoveOptions = {
suppressRemoveEvent?: boolean; suppressRemoveEvent?: boolean;
}; };
export const utils = {
isNodeSchema,
isFormEvent,
compatibleLegaoSchema,
getNodeSchemaById,
};
export enum EDITOR_EVENT { export enum EDITOR_EVENT {
NODE_CHILDREN_CHANGE = 'node.children.change', NODE_CHILDREN_CHANGE = 'node.children.change',
NODE_VISIBLE_CHANGE = 'node.visible.change', NODE_VISIBLE_CHANGE = 'node.visible.change',
} }
export type Utils = typeof utils;

View File

@ -1,3 +1,2 @@
export * from './invariant';
export * from './slot'; export * from './slot';
export * from './tree'; export * from './tree';

View File

@ -1,3 +1,2 @@
// TODO move another place
export * from './tip'; export * from './tip';
export * from './title'; export * from './title';

View File

@ -8,6 +8,7 @@ import {
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { intl } from '../../intl'; import { intl } from '../../intl';
import { Tip } from '../tip'; import { Tip } from '../tip';
import './title.less'; import './title.less';
/** /**
@ -41,12 +42,7 @@ function splitLabelByKeywords(label: string, keywords: string): string[] {
} }
export class Title extends Component<IPublicTypeTitleProps> { export class Title extends Component<IPublicTypeTitleProps> {
constructor(props: any) { handleClick = (e: React.MouseEvent) => {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick(e: React.MouseEvent) {
const { title, onClick } = this.props as any; const { title, onClick } = this.props as any;
const url = title && (title.docUrl || title.url); const url = title && (title.docUrl || title.url);
if (url) { if (url) {
@ -56,7 +52,7 @@ export class Title extends Component<IPublicTypeTitleProps> {
} }
// TODO: 操作交互冲突,目前 mixedSetter 仅有 2 个 setter 注册时用到了 onClick // TODO: 操作交互冲突,目前 mixedSetter 仅有 2 个 setter 注册时用到了 onClick
onClick && onClick(e); onClick && onClick(e);
} };
renderLabel = (label: string | IPublicTypeI18nData | ReactNode) => { renderLabel = (label: string | IPublicTypeI18nData | ReactNode) => {
const { match, keywords } = this.props; const { match, keywords } = this.props;

View File

@ -34,8 +34,7 @@
}, },
"dependencies": { "dependencies": {
"@alifd/next": "^1.27.8", "@alifd/next": "^1.27.8",
"@alilc/lowcode-types": "workspace:*", "@alilc/lowcode-shared": "workspace:*",
"@alilc/lowcode-utils": "workspace:*",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"intl-messageformat": "^10.5.1", "intl-messageformat": "^10.5.1",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
@ -44,8 +43,8 @@
"power-di": "^2.4.4", "power-di": "^2.4.4",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"semver": "^7.6.0",
"store": "^2.0.12", "store": "^2.0.12",
"strict-event-emitter-types": "^2.0.0",
"events": "^3.3.0" "events": "^3.3.0"
}, },
"devDependencies": { "devDependencies": {
@ -53,12 +52,12 @@
"@types/react": "^18.2.0", "@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0", "@types/react-dom": "^18.2.0",
"@types/store": "^2.0.2", "@types/store": "^2.0.2",
"@types/semver": "^7.5.8",
"less": "^4.2.0" "less": "^4.2.0"
}, },
"peerDependencies": { "peerDependencies": {
"@alifd/next": "^1.27.8", "@alifd/next": "^1.27.8",
"@alilc/lowcode-types": "workspace:*", "@alilc/lowcode-shared": "workspace:*",
"@alilc/lowcode-utils": "workspace:*",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0" "react-dom": "^18.2.0"
}, },

View File

@ -1,17 +1,76 @@
import { IPublicApiCommand, IPublicEnumTransitionType, IPublicModelPluginContext, IPublicTypeCommand, IPublicTypeCommandHandlerArgs, IPublicTypeListCommand } from '@alilc/lowcode-types';
import { checkPropTypes } from '@alilc/lowcode-utils'; import { checkPropTypes } from '@alilc/lowcode-utils';
import { type AnyFunction } from '@alilc/lowcode-shared';
export interface ICommand extends Command {} export interface Command {
/**
*
* commandName
* 使commandScope:commandName (commandScope meta )
*/
name: string;
export interface ICommandOptions { /**
*
*/
parameters?: CommandParameter[];
/**
*
*/
description?: string;
/**
*
*/
handler: (args: any) => void;
}
export interface CommandParameter {
/**
*
*/
name: string;
/**
*
*/
propType: string | IPublicTypePropType;
/**
*
*/
description: string;
/**
*
*/
defaultValue?: any;
}
/**
*
*/
export interface CommandHandlerArgs {
[key: string]: any;
}
export type ListCommand = Pick<Command, 'name' | 'description' | 'parameters'>;
export interface CommandOptions {
commandScope?: string; commandScope?: string;
} }
export class Command implements Omit<IPublicApiCommand, 'registerCommand' | 'batchExecuteCommand'> { /**
private commands: Map<string, IPublicTypeCommand> = new Map(); * 使
private commandErrors: Function[] = []; */
export class CommandManager {
private commands: Map<string, Command> = new Map();
private commandErrors: AnyFunction[] = [];
registerCommand(command: IPublicTypeCommand, options?: ICommandOptions): void { /**
*
*/
registerCommand(command: Command, options?: CommandOptions): void {
if (!options?.commandScope) { if (!options?.commandScope) {
throw new Error('plugin meta.commandScope is required.'); throw new Error('plugin meta.commandScope is required.');
} }
@ -25,6 +84,9 @@ export class Command implements Omit<IPublicApiCommand, 'registerCommand' | 'bat
}); });
} }
/**
*
*/
unregisterCommand(name: string): void { unregisterCommand(name: string): void {
if (!this.commands.has(name)) { if (!this.commands.has(name)) {
throw new Error(`Command '${name}' is not registered.`); throw new Error(`Command '${name}' is not registered.`);
@ -32,7 +94,10 @@ export class Command implements Omit<IPublicApiCommand, 'registerCommand' | 'bat
this.commands.delete(name); this.commands.delete(name);
} }
executeCommand(name: string, args: IPublicTypeCommandHandlerArgs): void { /**
*
*/
executeCommand(name: string, args: CommandHandlerArgs): void {
const command = this.commands.get(name); const command = this.commands.get(name);
if (!command) { if (!command) {
throw new Error(`Command '${name}' is not registered.`); throw new Error(`Command '${name}' is not registered.`);
@ -53,8 +118,11 @@ export class Command implements Omit<IPublicApiCommand, 'registerCommand' | 'bat
} }
} }
/**
*
*/
batchExecuteCommand( batchExecuteCommand(
commands: { name: string; args: IPublicTypeCommandHandlerArgs }[], commands: { name: string; args: CommandHandlerArgs }[],
pluginContext: IPublicModelPluginContext pluginContext: IPublicModelPluginContext
): void { ): void {
if (!commands || !commands.length) { if (!commands || !commands.length) {
@ -65,9 +133,12 @@ export class Command implements Omit<IPublicApiCommand, 'registerCommand' | 'bat
}, IPublicEnumTransitionType.REPAINT); }, IPublicEnumTransitionType.REPAINT);
} }
listCommands(): IPublicTypeListCommand[] { /**
*
*/
listCommands(): ListCommand[] {
return Array.from(this.commands.values()).map(d => { return Array.from(this.commands.values()).map(d => {
const result: IPublicTypeListCommand = { const result: ListCommand = {
name: d.name, name: d.name,
}; };
@ -83,6 +154,9 @@ export class Command implements Omit<IPublicApiCommand, 'registerCommand' | 'bat
}); });
} }
/**
*
*/
onCommandError(callback: (name: string, error: Error) => void): void { onCommandError(callback: (name: string, error: Error) => void): void {
this.commandErrors.push(callback); this.commandErrors.push(callback);
} }

View File

@ -1,13 +1,13 @@
import { get as lodashGet } from 'lodash-es'; import { get as lodashGet } from 'lodash-es';
import { isPlainObject, getLogger } from '@alilc/lowcode-utils'; import { isPlainObject, createLogger } from '@alilc/lowcode-utils';
import { import {
IPublicTypeEngineOptions, IPublicTypeEngineOptions,
IPublicModelEngineConfig, IPublicModelEngineConfig,
IPublicModelPreference, IPublicModelPreference,
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import Preference from './utils/preference'; import Preference from './preference';
const logger = getLogger({ level: 'log', bizName: 'config' }); const logger = createLogger({ level: 'log', bizName: 'config' });
// this default behavior will be different later // this default behavior will be different later
const STRICT_PLUGIN_MODE_DEFAULT = true; const STRICT_PLUGIN_MODE_DEFAULT = true;

View File

@ -1,3 +0,0 @@
export * from './setter';
export * from './ioc-context';
export * from '../widgets/tip/tip';

View File

@ -1,4 +1,4 @@
import { EventEmitter } from 'events'; import EventEmitter from 'events';
import { EventBus, IEventBus } from './event-bus'; import { EventBus, IEventBus } from './event-bus';
import { import {
IPublicModelEditor, IPublicModelEditor,
@ -12,12 +12,10 @@ import {
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { engineConfig } from './config'; import { engineConfig } from './config';
import { globalLocale } from './intl'; import { globalLocale } from './intl';
import { observable } from './utils'; import { observable } from './obx';
import { IPublicTypeAssetsJson, AssetLoader } from '@alilc/lowcode-utils'; import { IPublicTypeAssetsJson, AssetLoader } from '@alilc/lowcode-utils';
import { assetsTransform } from './utils/assets-transform'; import { assetsTransform } from './utils/assets-transform';
EventEmitter.defaultMaxListeners = 100;
// inner instance keys which should not be stored in config // inner instance keys which should not be stored in config
const keyBlacklist = [ const keyBlacklist = [
'designer', 'designer',
@ -31,23 +29,19 @@ const keyBlacklist = [
'innerPlugins', 'innerPlugins',
]; ];
const AssetsCache: { const AssetsCache: Record<string, IPublicTypeRemoteComponentDescription> = {};
[key: string]: IPublicTypeRemoteComponentDescription;
} = {};
export interface IEditor extends IPublicModelEditor { export interface IEditor extends IPublicModelEditor {
config?: EditorConfig; config?: EditorConfig;
components?: PluginClassSet; components?: PluginClassSet;
eventBus: IEventBus; eventBus: IEventBus;
init(config?: EditorConfig, components?: PluginClassSet): Promise<any>; init(config?: EditorConfig, components?: PluginClassSet): Promise<any>;
} }
export class Editor extends EventEmitter implements IEditor { export class Editor extends EventEmitter implements IEditor {
/** /**
* Ioc Container * Ioc Container
* ???
*/ */
@observable.shallow private context = new Map<IPublicTypeEditorValueKey, any>(); @observable.shallow private context = new Map<IPublicTypeEditorValueKey, any>();
@ -61,8 +55,6 @@ export class Editor extends EventEmitter implements IEditor {
components?: PluginClassSet; components?: PluginClassSet;
// readonly utils = utils;
private hooks: HookConfig[] = []; private hooks: HookConfig[] = [];
private waits = new Map< private waits = new Map<
@ -122,7 +114,6 @@ export class Editor extends EventEmitter implements IEditor {
} }
}); });
assets.components = componentDescriptions; assets.components = componentDescriptions;
assets.componentList = assets.componentList || [];
// 如果有远程组件描述协议,则自动加载并补充到资产包中,同时出发 designer.incrementalAssetsReady 通知组件面板更新数据 // 如果有远程组件描述协议,则自动加载并补充到资产包中,同时出发 designer.incrementalAssetsReady 通知组件面板更新数据
if (remoteComponentDescriptions && remoteComponentDescriptions.length) { if (remoteComponentDescriptions && remoteComponentDescriptions.length) {
@ -143,7 +134,6 @@ export class Editor extends EventEmitter implements IEditor {
AssetsCache[exportName] = component; AssetsCache[exportName] = component;
function setAssetsComponent(component: any, extraNpmInfo: any = {}) { function setAssetsComponent(component: any, extraNpmInfo: any = {}) {
const components = component.components; const components = component.components;
assets.componentList = assets.componentList?.concat(component.componentList || []);
if (Array.isArray(components)) { if (Array.isArray(components)) {
components.forEach((d) => { components.forEach((d) => {
assets.components = assets.components.concat( assets.components = assets.components.concat(

View File

@ -2,6 +2,8 @@ import { IPublicApiEvent } from '@alilc/lowcode-types';
import { Logger } from '@alilc/lowcode-utils'; import { Logger } from '@alilc/lowcode-utils';
import EventEmitter from 'events'; import EventEmitter from 'events';
EventEmitter.defaultMaxListeners = 100;
const logger = new Logger({ level: 'warn', bizName: 'event-bus' }); const logger = new Logger({ level: 'warn', bizName: 'event-bus' });
const moduleLogger = new Logger({ level: 'warn', bizName: 'module-event-bus' }); const moduleLogger = new Logger({ level: 'warn', bizName: 'module-event-bus' });

View File

@ -1,3 +1,7 @@
/**
* key event helperhttps://www.toptal.com/developers/keycode
*/
import { isEqual } from 'lodash-es'; import { isEqual } from 'lodash-es';
import { globalContext } from './di'; import { globalContext } from './di';
import { import {
@ -226,7 +230,7 @@ function getReverseMap(): CtrlKeyMap {
continue; continue;
} }
if (MAP.hasOwnProperty(key)) { if (Object.prototype.hasOwnProperty.call(MAP, key)) {
REVERSE_MAP[MAP[key]] = key; REVERSE_MAP[MAP[key]] = key;
} }
} }

View File

@ -3,7 +3,9 @@ export * from './editor';
export * from './utils'; export * from './utils';
export * from './di'; export * from './di';
export * from './hotkey'; export * from './hotkey';
export * from './widgets';
export * from './config'; export * from './config';
export * from './event-bus'; export * from './event-bus';
export * from './command'; export * from './command';
export * from './setter';
export * from './plugin';
export * from './obx';

View File

@ -1,8 +1,8 @@
import { IEventBus, createModuleEventBus } from '../event-bus'; import { IEventBus, createModuleEventBus } from '../event-bus';
import { observable, computed } from '../utils/obx'; import { observable, computed } from '../obx';
import { Logger } from '@alilc/lowcode-utils'; import { createLogger } from '@alilc/lowcode-shared';
const logger = new Logger({ level: 'warn', bizName: 'globalLocale' }); const logger = createLogger({ level: 'warn', bizName: 'globalLocale' });
const languageMap: { [key: string]: string } = { const languageMap: { [key: string]: string } = {
en: 'en-US', en: 'en-US',

View File

@ -0,0 +1,83 @@
import { type IEventBus, createModuleEventBus } from '../event-bus';
import type { PluginMeta, PluginPreferenceValue, PluginDeclaration } from './plugin';
import { type LowCodePluginManager } from './manager';
import { isValidPreferenceKey } from './utils';
import { engineConfig } from '../config';
export interface PluginContextOptions {
pluginName: string;
meta?: PluginMeta;
}
export interface LowCodePluginContextApiAssembler<ContextExtra extends Record<string, any>> {
assembleApis(
context: LowCodePluginContext<ContextExtra>,
pluginName: string,
meta: PluginMeta,
): void;
}
export interface PluginPreferenceMananger {
getPreferenceValue: (
key: string,
defaultValue?: PluginPreferenceValue,
) => PluginPreferenceValue | undefined;
}
export type LowCodePluginContext<ContextExtra extends Record<string, any>> = {
pluginEvent: IEventBus;
preference: PluginPreferenceMananger;
setPreference(pluginName: string, preferenceDeclaration: PluginDeclaration): void;
} & ContextExtra;
/**
* create plugin context
* todo: refactor setPreference
*/
export function createPluginContext<ContextExtra extends Record<string, any>>(
options: PluginContextOptions,
manager: LowCodePluginManager<ContextExtra>,
contextApiAssembler: LowCodePluginContextApiAssembler<LowCodePluginContext<ContextExtra>>
): LowCodePluginContext<ContextExtra> {
const { pluginName = 'anonymous', meta = {} } = options;
const pluginEvent = createModuleEventBus(pluginName, 200);
let _pluginName = pluginName;
let _preferenceDeclaration: PluginDeclaration;
const preferenceMananger: PluginPreferenceMananger = {
getPreferenceValue: (
key,
defaultValue?,
) => {
if (!isValidPreferenceKey(key, _preferenceDeclaration)) {
return undefined;
}
const pluginPreference = manager.getPluginPreference(_pluginName) || {};
if (pluginPreference[key] === undefined || pluginPreference[key] === null) {
return defaultValue;
}
return pluginPreference[key];
}
};
const contextBase = {
pluginEvent,
preference: preferenceMananger,
setPreference(
pluginName: string,
preferenceDeclaration: PluginDeclaration,
): void {
_pluginName = pluginName;
_preferenceDeclaration = preferenceDeclaration;
}
} as LowCodePluginContext<ContextExtra>;
contextApiAssembler.assembleApis(contextBase, pluginName, meta);
const enhancePluginContextHook = engineConfig.get('enhancePluginContextHook');
if (enhancePluginContextHook) {
enhancePluginContextHook(contextBase);
}
return contextBase;
}

View File

@ -0,0 +1,4 @@
export * from './context';
export * from './manager';
export * from './runtime';
export * from './plugin';

View File

@ -1,25 +1,17 @@
import { engineConfig } from '@alilc/lowcode-editor-core'; import { createLogger, invariant } from '@alilc/lowcode-shared';
import { getLogger } from '@alilc/lowcode-utils'; import { filterValidOptions, isLowCodeRegisterOptions, sequencify } from './utils';
import { LowCodePluginRuntime } from './runtime';
import { satisfies as semverSatisfies } from 'semver';
import type { PluginCreater, PluginPreferenceValue, PluginPreference } from './plugin';
import { engineConfig } from '../config';
import { import {
ILowCodePluginRuntime, type LowCodePluginContext,
ILowCodePluginManager, type LowCodePluginContextApiAssembler,
IPluginContextOptions, createPluginContext,
PluginPreference, PluginContextOptions
ILowCodePluginContextApiAssembler, } from './context';
} from './plugin-types';
import { filterValidOptions, isLowCodeRegisterOptions } from './plugin-utils';
import { LowCodePluginRuntime } from './plugin';
import LowCodePluginContext from './plugin-context';
import { invariant } from '../utils';
import sequencify from './sequencify';
import semverSatisfies from 'semver/functions/satisfies';
import {
IPublicTypePluginRegisterOptions,
IPublicTypePreferenceValueType,
IPublicTypePlugin,
} from '@alilc/lowcode-types';
const logger = getLogger({ level: 'warn', bizName: 'designer:pluginManager' }); const logger = createLogger({ level: 'warn', bizName: 'designer:pluginManager' });
// 保留的事件前缀 // 保留的事件前缀
const RESERVED_EVENT_PREFIX = [ const RESERVED_EVENT_PREFIX = [
@ -42,28 +34,43 @@ const RESERVED_EVENT_PREFIX = [
'context', 'context',
]; ];
export class LowCodePluginManager implements ILowCodePluginManager { export interface PluginRegisterOptions {
private plugins: ILowCodePluginRuntime[] = []; /**
* Will enable plugin registered with auto-initialization immediately
* other than plugin-manager init all plugins at certain time.
* It is helpful when plugin register is later than plugin-manager initialization.
*/
autoInit?: boolean;
/**
* allow overriding existing plugin with same name when override === true
*/
override?: boolean;
}
pluginsMap: Map<string, ILowCodePluginRuntime> = new Map(); /**
pluginContextMap: Map<string, LowCodePluginContext> = new Map(); * plugin manager
*/
export class LowCodePluginManager<ContextExtra extends Record<string, any>> {
private plugins: LowCodePluginRuntime<ContextExtra>[] = [];
private pluginsMap: Map<string, LowCodePluginRuntime<ContextExtra>> = new Map();
private pluginContextMap: Map<string, LowCodePluginContext<ContextExtra>> = new Map();
private pluginPreference?: PluginPreference = new Map(); private pluginPreference?: PluginPreference = new Map();
contextApiAssembler: ILowCodePluginContextApiAssembler;
constructor( constructor(
contextApiAssembler: ILowCodePluginContextApiAssembler, private contextApiAssembler: LowCodePluginContextApiAssembler<
LowCodePluginContext<ContextExtra>
>,
readonly viewName = 'global', readonly viewName = 'global',
) { ) {}
this.contextApiAssembler = contextApiAssembler;
}
_getLowCodePluginContext = (options: IPluginContextOptions) => { private _getLowCodePluginContext = (options: PluginContextOptions) => {
const { pluginName } = options; const { pluginName } = options;
let context = this.pluginContextMap.get(pluginName); let context = this.pluginContextMap.get(pluginName);
if (!context) { if (!context) {
context = new LowCodePluginContext(options, this.contextApiAssembler); context = createPluginContext(options, this, this.contextApiAssembler);
this.pluginContextMap.set(pluginName, context); this.pluginContextMap.set(pluginName, context);
} }
return context; return context;
@ -83,9 +90,9 @@ export class LowCodePluginManager implements ILowCodePluginManager {
* @param registerOptions - the plugin register options * @param registerOptions - the plugin register options
*/ */
async register( async register(
pluginModel: IPublicTypePlugin, pluginModel: PluginCreater<LowCodePluginContext<ContextExtra>>,
options?: any, options?: any,
registerOptions?: IPublicTypePluginRegisterOptions, registerOptions?: PluginRegisterOptions,
): Promise<void> { ): Promise<void> {
// registerOptions maybe in the second place // registerOptions maybe in the second place
if (isLowCodeRegisterOptions(options)) { if (isLowCodeRegisterOptions(options)) {
@ -104,6 +111,7 @@ export class LowCodePluginManager implements ILowCodePluginManager {
`plugin ${pluginName} is trying to use ${eventPrefix} as event prefix, which is a reserved event prefix, please use another one`, `plugin ${pluginName} is trying to use ${eventPrefix} as event prefix, which is a reserved event prefix, please use another one`,
); );
} }
const ctx = this._getLowCodePluginContext({ pluginName, meta }); const ctx = this._getLowCodePluginContext({ pluginName, meta });
const customFilterValidOptions = engineConfig.get( const customFilterValidOptions = engineConfig.get(
'customPluginFilterOptions', 'customPluginFilterOptions',
@ -136,7 +144,7 @@ export class LowCodePluginManager implements ILowCodePluginManager {
'plugin override, originalPlugin with name ', 'plugin override, originalPlugin with name ',
pluginName, pluginName,
' will be destroyed, config:', ' will be destroyed, config:',
originalPlugin?.config, originalPlugin?.instance,
); );
originalPlugin?.destroy(); originalPlugin?.destroy();
this.pluginsMap.delete(pluginName); this.pluginsMap.delete(pluginName);
@ -161,11 +169,11 @@ export class LowCodePluginManager implements ILowCodePluginManager {
logger.log(`plugin registered with pluginName: ${pluginName}, config: `, config, 'meta:', meta); logger.log(`plugin registered with pluginName: ${pluginName}, config: `, config, 'meta:', meta);
} }
get(pluginName: string): ILowCodePluginRuntime | undefined { get(pluginName: string): LowCodePluginRuntime<ContextExtra> | undefined {
return this.pluginsMap.get(pluginName); return this.pluginsMap.get(pluginName);
} }
getAll(): ILowCodePluginRuntime[] { getAll(): LowCodePluginRuntime<ContextExtra>[] {
return this.plugins; return this.plugins;
} }
@ -184,7 +192,7 @@ export class LowCodePluginManager implements ILowCodePluginManager {
async init(pluginPreference?: PluginPreference) { async init(pluginPreference?: PluginPreference) {
const pluginNames: string[] = []; const pluginNames: string[] = [];
const pluginObj: { [name: string]: ILowCodePluginRuntime } = {}; const pluginObj: { [name: string]: LowCodePluginRuntime<ContextExtra> } = {};
this.pluginPreference = pluginPreference; this.pluginPreference = pluginPreference;
this.plugins.forEach((plugin) => { this.plugins.forEach((plugin) => {
pluginNames.push(plugin.name); pluginNames.push(plugin.name);
@ -218,7 +226,7 @@ export class LowCodePluginManager implements ILowCodePluginManager {
getPluginPreference( getPluginPreference(
pluginName: string, pluginName: string,
): Record<string, IPublicTypePreferenceValueType> | null | undefined { ): Record<string, PluginPreferenceValue> | null | undefined {
if (!this.pluginPreference) { if (!this.pluginPreference) {
return null; return null;
} }
@ -240,7 +248,6 @@ export class LowCodePluginManager implements ILowCodePluginManager {
}); });
} }
/* istanbul ignore next */
setDisabled(pluginName: string, flag = true) { setDisabled(pluginName: string, flag = true) {
logger.warn(`plugin:${pluginName} has been set disable:${flag}`); logger.warn(`plugin:${pluginName} has been set disable:${flag}`);
this.pluginsMap.get(pluginName)?.setDisabled(flag); this.pluginsMap.get(pluginName)?.setDisabled(flag);

View File

@ -0,0 +1,76 @@
export interface PluginInstance {
init(): Promise<void> | void;
destroy?(): Promise<void> | void;
exports?(): any;
}
export interface PluginMeta {
/**
* define dependencies which the plugin depends on
*/
dependencies?: string[];
/**
* specify which engine version is compatible with the plugin
*/
engines?: {
/** e.g. '^1.0.0' */
lowcodeEngine?: string;
};
preferenceDeclaration?: PluginDeclaration;
/**
* use 'common' as event prefix when eventPrefix is not set.
* strongly recommend using pluginName as eventPrefix
*
* eg.
* case 1, when eventPrefix is not specified
* event.emit('someEventName') is actually sending event with name 'common:someEventName'
*
* case 2, when eventPrefix is 'myEvent'
* event.emit('someEventName') is actually sending event with name 'myEvent:someEventName'
*/
eventPrefix?: string;
/**
* 使 command meta commandScope
*/
commandScope?: string;
}
export interface PluginDeclaration {
// this will be displayed on configuration UI, can be plugin name
title: string;
properties: PluginDeclarationProperty[];
}
export interface PluginDeclarationProperty {
// shape like 'name' or 'group.name' or 'group.subGroup.name'
key: string;
// must have either one of description & markdownDescription
description: string;
// value in 'number', 'string', 'boolean'
type: string;
// default value
// NOTE! this is only used in configuration UI, won`t affect runtime
default?: PluginPreferenceValue;
// only works when type === 'string', default value false
useMultipleLineTextInput?: boolean;
// enum values, only works when type === 'string'
enum?: any[];
// descriptions for enum values
enumDescriptions?: string[];
// message that describing deprecation of this property
deprecationMessage?: string;
}
export type PluginPreferenceValue = string | number | boolean;
export type PluginPreference = Map<string, Record<string, PluginPreferenceValue>>;
export interface PluginCreater<Context> {
(ctx: Context, options: any): PluginInstance;
pluginName: string;
meta?: PluginMeta;
}

View File

@ -1,43 +1,43 @@
import { getLogger, Logger } from '@alilc/lowcode-utils'; import { type LowCodePluginManager } from './manager';
import { import { type PluginInstance, type PluginMeta } from './plugin';
ILowCodePluginRuntime, import { invariant, createLogger, type Logger } from '@alilc/lowcode-shared';
ILowCodePluginManager,
} from './plugin-types';
import {
IPublicTypePluginConfig,
IPublicTypePluginMeta,
} from '@alilc/lowcode-types';
import { invariant } from '../utils';
export class LowCodePluginRuntime implements ILowCodePluginRuntime {
config: IPublicTypePluginConfig;
export interface IPluginRuntimeCore {
name: string;
dep: string[];
disabled: boolean;
instance: PluginInstance;
logger: Logger; logger: Logger;
meta: PluginMeta;
private manager: ILowCodePluginManager; init(forceInit?: boolean): void;
isInited(): boolean;
destroy(): void;
toProxy(): any;
setDisabled(flag: boolean): void;
}
export interface IPluginRuntimeExportsAccessor {
[propName: string]: any;
}
export class LowCodePluginRuntime<ContextExtra extends Record<string, any>>
implements IPluginRuntimeCore,IPluginRuntimeExportsAccessor {
private _inited: boolean; private _inited: boolean;
private pluginName: string;
meta: IPublicTypePluginMeta;
/** /**
* disabled * disabled
*/ */
private _disabled: boolean; private _disabled: boolean;
logger: Logger;
constructor( constructor(
pluginName: string, private pluginName: string,
manager: ILowCodePluginManager, private manager: LowCodePluginManager<ContextExtra>,
config: IPublicTypePluginConfig, public instance: PluginInstance,
meta: IPublicTypePluginMeta, public meta: PluginMeta,
) { ) {
this.manager = manager; this.logger = createLogger({ level: 'warn', bizName: `plugin:${pluginName}` });
this.config = config;
this.pluginName = pluginName;
this.meta = meta;
this.logger = getLogger({ level: 'warn', bizName: `plugin:${pluginName}` });
} }
get name() { get name() {
@ -49,7 +49,7 @@ export class LowCodePluginRuntime implements ILowCodePluginRuntime {
return [this.meta.dependencies]; return [this.meta.dependencies];
} }
// compat legacy way to declare dependencies // compat legacy way to declare dependencies
const legacyDepValue = (this.config as any).dep; const legacyDepValue = (this.instance as any).dep;
if (typeof legacyDepValue === 'string') { if (typeof legacyDepValue === 'string') {
return [legacyDepValue]; return [legacyDepValue];
} }
@ -67,14 +67,14 @@ export class LowCodePluginRuntime implements ILowCodePluginRuntime {
async init(forceInit?: boolean) { async init(forceInit?: boolean) {
if (this._inited && !forceInit) return; if (this._inited && !forceInit) return;
this.logger.log('method init called'); this.logger.log('method init called');
await this.config.init?.call(undefined); await this.instance.init?.call(undefined);
this._inited = true; this._inited = true;
} }
async destroy() { async destroy() {
if (!this._inited) return; if (!this._inited) return;
this.logger.log('method destroy called'); this.logger.log('method destroy called');
await this.config?.destroy?.call(undefined); await this.instance?.destroy?.call(undefined);
this._inited = false; this._inited = false;
} }
@ -84,7 +84,8 @@ export class LowCodePluginRuntime implements ILowCodePluginRuntime {
toProxy() { toProxy() {
invariant(this._inited, 'Could not call toProxy before init'); invariant(this._inited, 'Could not call toProxy before init');
const exports = this.config.exports?.();
const exports = this.instance.exports?.();
return new Proxy(this, { return new Proxy(this, {
get(target, prop, receiver) { get(target, prop, receiver) {
if ({}.hasOwnProperty.call(exports, prop)) { if ({}.hasOwnProperty.call(exports, prop)) {

View File

@ -1,3 +1,37 @@
import { isPlainObject } from 'lodash-es';
import type { PluginDeclaration } from './plugin';
import type { PluginRegisterOptions } from './manager';
export function isValidPreferenceKey(
key: string,
preferenceDeclaration: PluginDeclaration,
): boolean {
if (!preferenceDeclaration || !Array.isArray(preferenceDeclaration.properties)) {
return false;
}
return preferenceDeclaration.properties.some((prop) => {
return prop.key === key;
});
}
export function isLowCodeRegisterOptions(opts: any): opts is PluginRegisterOptions {
return opts && ('autoInit' in opts || 'override' in opts);
}
export function filterValidOptions(opts: any, preferenceDeclaration: PluginDeclaration) {
if (!opts || !isPlainObject(opts)) return opts;
const filteredOpts = {} as any;
Object.keys(opts).forEach((key) => {
if (isValidPreferenceKey(key, preferenceDeclaration)) {
const v = opts[key];
if (v !== undefined && v !== null) {
filteredOpts[key] = v;
}
}
});
return filteredOpts;
}
interface ITaks { interface ITaks {
[key: string]: { [key: string]: {
name: string; name: string;
@ -5,6 +39,16 @@ interface ITaks {
}; };
} }
interface Options {
tasks: ITaks;
names: string[];
results: string[];
missing: string[];
recursive: string[][];
nest: string[];
parentName: string;
}
export function sequence({ export function sequence({
tasks, tasks,
names, names,
@ -13,15 +57,7 @@ export function sequence({
recursive, recursive,
nest, nest,
parentName, parentName,
}: { }: Options) {
tasks: ITaks;
names: string[];
results: string[];
missing: string[];
recursive: string[][];
nest: string[];
parentName: string;
}) {
names.forEach((name) => { names.forEach((name) => {
if (results.indexOf(name) !== -1) { if (results.indexOf(name) !== -1) {
return; // de-dup results return; // de-dup results
@ -52,7 +88,7 @@ export function sequence({
// tasks: object with keys as task names // tasks: object with keys as task names
// names: array of task names // names: array of task names
export default function (tasks: ITaks, names: string[]) { export function sequencify(tasks: ITaks, names: string[]) {
let results: string[] = []; // the final sequence let results: string[] = []; // the final sequence
const missing: string[] = []; // missing tasks const missing: string[] = []; // missing tasks
const recursive: string[][] = []; // recursive task dependencies const recursive: string[][] = []; // recursive task dependencies
@ -76,3 +112,4 @@ export default function (tasks: ITaks, names: string[]) {
recursiveDependencies: recursive, recursiveDependencies: recursive,
}; };
} }

View File

@ -1,20 +1,22 @@
import store from 'store'; import store from 'store';
import { getLogger } from '@alilc/lowcode-utils'; import { createLogger } from '@alilc/lowcode-utils';
import { IPublicModelPreference } from '@alilc/lowcode-types';
const logger = getLogger({ level: 'warn', bizName: 'Preference' }); const logger = createLogger({ level: 'warn', bizName: 'Preference' });
const STORAGE_KEY_PREFIX = 'ale'; const STORAGE_KEY_PREFIX = 'ale';
/** /**
* used to store user preferences, such as pinned status of a pannel. * used to store user preferences, such as pinned status of a pannel.
* save to local storage. * save to local storage.
*/ */
export default class Preference implements IPublicModelPreference { export default class Preference {
getStorageKey(key: string, module?: string): string { private getStorageKey(key: string, module?: string): string {
const moduleKey = module || '__inner__'; const moduleKey = module || '__inner__';
return `${STORAGE_KEY_PREFIX}_${moduleKey}.${key}`; return `${STORAGE_KEY_PREFIX}_${moduleKey}.${key}`;
} }
/**
* set value from local storage by module and key
*/
set(key: string, value: any, module?: string): void { set(key: string, value: any, module?: string): void {
if (!key || typeof key !== 'string' || key.length === 0) { if (!key || typeof key !== 'string' || key.length === 0) {
logger.error('Invalid key when setting preference', key); logger.error('Invalid key when setting preference', key);
@ -25,6 +27,9 @@ export default class Preference implements IPublicModelPreference {
store.set(storageKey, value); store.set(storageKey, value);
} }
/**
* get value from local storage by module and key
*/
get(key: string, module: string): any { get(key: string, module: string): any {
if (!key || typeof key !== 'string' || key.length === 0) { if (!key || typeof key !== 'string' || key.length === 0) {
logger.error('Invalid key when getting from preference', key); logger.error('Invalid key when getting from preference', key);

View File

@ -1,59 +1,39 @@
import { IPublicApiSetters, IPublicModelSettingField, IPublicTypeCustomView, IPublicTypeRegisteredSetter } from '@alilc/lowcode-types'; import { IPublicModelSettingField, IPublicTypeCustomView, IPublicTypeRegisteredSetter } from '@alilc/lowcode-types';
import { isCustomView } from '@alilc/lowcode-utils'; import { isCustomView } from '@alilc/lowcode-utils';
const settersMap = new Map<string, IPublicTypeRegisteredSetter & { export class Setters {
type: string;
}>();
export function registerSetter(
typeOrMaps: string | { [key: string]: IPublicTypeCustomView | IPublicTypeRegisteredSetter },
setter?: IPublicTypeCustomView | IPublicTypeRegisteredSetter,
) {
if (typeof typeOrMaps === 'object') {
Object.keys(typeOrMaps).forEach(type => {
registerSetter(type, typeOrMaps[type]);
});
return;
}
if (!setter) {
return;
}
if (isCustomView(setter)) {
setter = {
component: setter,
// todo: intl
title: (setter as any).displayName || (setter as any).name || 'CustomSetter',
};
}
if (!setter.initialValue) {
const initial = getInitialFromSetter(setter.component);
if (initial) {
setter.initialValue = (field: IPublicModelSettingField) => {
return initial.call(field, field.getValue());
};
}
}
settersMap.set(typeOrMaps, { type: typeOrMaps, ...setter });
}
function getInitialFromSetter(setter: any) {
return setter && (
setter.initial || setter.Initial
|| (setter.type && (setter.type.initial || setter.type.Initial))
) || null; // eslint-disable-line
}
export class Setters implements IPublicApiSetters {
settersMap = new Map<string, IPublicTypeRegisteredSetter & { settersMap = new Map<string, IPublicTypeRegisteredSetter & {
type: string; type: string;
}>(); }>();
constructor(readonly viewName: string = 'global') {} constructor(readonly viewName: string = 'global') {}
/**
* setter
* get setter by type
* @param type
* @returns
*/
getSetter = (type: string): IPublicTypeRegisteredSetter | null => { getSetter = (type: string): IPublicTypeRegisteredSetter | null => {
return this.settersMap.get(type) || null; return this.settersMap.get(type) || null;
}; };
/**
* settersMap
* get map of all registered setters
* @returns
*/
getSettersMap = () => {
return this.settersMap;
};
/**
* setter
* register a setter
* @param typeOrMaps
* @param setter
* @returns
*/
registerSetter = ( registerSetter = (
typeOrMaps: string | { [key: string]: IPublicTypeCustomView | IPublicTypeRegisteredSetter }, typeOrMaps: string | { [key: string]: IPublicTypeCustomView | IPublicTypeRegisteredSetter },
setter?: IPublicTypeCustomView | IPublicTypeRegisteredSetter, setter?: IPublicTypeCustomView | IPublicTypeRegisteredSetter,
@ -84,8 +64,11 @@ export class Setters implements IPublicApiSetters {
} }
this.settersMap.set(typeOrMaps, { type: typeOrMaps, ...setter }); this.settersMap.set(typeOrMaps, { type: typeOrMaps, ...setter });
}; };
}
getSettersMap = () => {
return this.settersMap; function getInitialFromSetter(setter: any) {
}; return setter && (
setter.initial || setter.Initial
|| (setter.type && (setter.type.initial || setter.type.Initial))
) || null;
} }

View File

@ -6,6 +6,7 @@ import {
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
// TODO: 该转换逻辑未来需要消化掉 // TODO: 该转换逻辑未来需要消化掉
// 低代码 schema 转换逻辑
export function assetsTransform(assets: IPublicTypeAssetsJson) { export function assetsTransform(assets: IPublicTypeAssetsJson) {
const { components, packages } = assets; const { components, packages } = assets;
const packageMaps = (packages || []).reduce( const packageMaps = (packages || []).reduce(

View File

@ -1,3 +1,5 @@
import { AnyFunction } from '@alilc/lowcode-shared';
let globalEventOn = true; let globalEventOn = true;
export function setGlobalEventFlag(flag: boolean) { export function setGlobalEventFlag(flag: boolean) {
@ -16,7 +18,7 @@ export function isGlobalEventOn() {
return globalEventOn; return globalEventOn;
} }
export function runWithGlobalEventOff(fn: Function) { export function runWithGlobalEventOff(fn: AnyFunction) {
switchGlobalEventOff(); switchGlobalEventOff();
fn(); fn();
switchGlobalEventOn(); switchGlobalEventOn();

View File

@ -3,6 +3,10 @@ export class FocusTracker {
private modals: Array<{ checkDown: (e: MouseEvent) => boolean; checkOpen: () => boolean }> = []; private modals: Array<{ checkDown: (e: MouseEvent) => boolean; checkOpen: () => boolean }> = [];
get first() {
return this.actives[0];
}
mount(win: Window) { mount(win: Window) {
const checkDown = (e: MouseEvent) => { const checkDown = (e: MouseEvent) => {
if (this.checkModalDown(e)) { if (this.checkModalDown(e)) {
@ -20,10 +24,6 @@ export class FocusTracker {
}; };
} }
get first() {
return this.actives[0];
}
addModal(checkDown: (e: MouseEvent) => boolean, checkOpen: () => boolean) { addModal(checkDown: (e: MouseEvent) => boolean, checkOpen: () => boolean) {
this.modals.push({ this.modals.push({
checkDown, checkDown,
@ -129,9 +129,7 @@ export class Focusable {
} }
internalTriggerBlur() { internalTriggerBlur() {
if (this.config.onBlur) { this.config.onBlur?.();
this.config.onBlur();
}
} }
internalTriggerSave() { internalTriggerSave() {
@ -143,14 +141,10 @@ export class Focusable {
} }
internalTriggerEsc() { internalTriggerEsc() {
if (this.config.onEsc) { this.config.onEsc?.();
this.config.onEsc();
}
} }
internalTriggerActive() { internalTriggerActive() {
if (this.config.onActive) { this.config.onActive?.();
this.config.onActive();
}
} }
} }

View File

@ -1,6 +1,5 @@
export * from './get-public-path'; export * from './get-public-path';
export * from './obx';
export * from './request'; export * from './request';
export * from './focus-tracker'; export * from './focus-tracker';
export * from './control'; export * from './control';
export * from './preference'; export * from '../preference';

View File

@ -39,6 +39,7 @@
"@alifd/next": "^1.27.8", "@alifd/next": "^1.27.8",
"@alilc/lowcode-designer": "workspace:*", "@alilc/lowcode-designer": "workspace:*",
"@alilc/lowcode-editor-core": "workspace:*", "@alilc/lowcode-editor-core": "workspace:*",
"@alilc/lowcode-shared": "workspace:*",
"@alilc/lowcode-types": "workspace:*", "@alilc/lowcode-types": "workspace:*",
"@alilc/lowcode-utils": "workspace:*", "@alilc/lowcode-utils": "workspace:*",
"classnames": "^2.2.6", "classnames": "^2.2.6",
@ -55,6 +56,7 @@
"@alifd/next": "^1.27.8", "@alifd/next": "^1.27.8",
"@alilc/lowcode-designer": "workspace:*", "@alilc/lowcode-designer": "workspace:*",
"@alilc/lowcode-editor-core": "workspace:*", "@alilc/lowcode-editor-core": "workspace:*",
"@alilc/lowcode-shared": "workspace:*",
"@alilc/lowcode-types": "workspace:*", "@alilc/lowcode-types": "workspace:*",
"@alilc/lowcode-utils": "workspace:*", "@alilc/lowcode-utils": "workspace:*",
"react": "^18.2.0", "react": "^18.2.0",

View File

@ -16,7 +16,8 @@ export interface IArea<C, T> {
show(): void; show(): void;
} }
export class Area<C extends IPublicTypeWidgetBaseConfig = any, T extends IWidget = IWidget> implements IArea<C, T> { export class Area<C extends IPublicTypeWidgetBaseConfig = any, T extends IWidget = IWidget>
implements IArea<C, T> {
@observable private _visible = true; @observable private _visible = true;
@computed get visible() { @computed get visible() {

View File

@ -1,8 +1,9 @@
import { ReactNode, createElement } from 'react'; import { ReactNode, createElement } from 'react';
import { IPublicTypeTitleContent } from '@alilc/lowcode-types'; import { IPublicTypeTitleContent } from '@alilc/lowcode-types';
import './index.less';
import { Field, PopupField, EntryField, PlainField } from './fields'; import { Field, PopupField, EntryField, PlainField } from './fields';
import './index.less';
export interface FieldProps { export interface FieldProps {
className?: string; className?: string;
title?: IPublicTypeTitleContent | null; title?: IPublicTypeTitleContent | null;

View File

@ -1,7 +1,6 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Tab, Breadcrumb } from '@alifd/next'; import { Tab, Breadcrumb } from '@alifd/next';
import { import {
Title,
observer, observer,
Editor, Editor,
observable, observable,
@ -9,7 +8,7 @@ import {
engineConfig, engineConfig,
makeObservable, makeObservable,
} from '@alilc/lowcode-editor-core'; } from '@alilc/lowcode-editor-core';
import { Node, SettingField, INode } from '@alilc/lowcode-designer'; import { Node, SettingField, INode, Title } from '@alilc/lowcode-designer';
import classNames from 'classnames'; import classNames from 'classnames';
import { SettingsMain } from './main'; import { SettingsMain } from './main';
import { SettingsPane } from './settings-pane'; import { SettingsPane } from './settings-pane';

View File

@ -1,6 +1,7 @@
import { Component, ReactElement } from 'react'; import { Component, ReactElement } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Title, observer, HelpTip } from '@alilc/lowcode-editor-core'; import { observer } from '@alilc/lowcode-editor-core';
import { Title, HelpTip } from '@alilc/lowcode-designer';
import { DockProps } from '../../types'; import { DockProps } from '../../types';
import { PanelDock } from '../../widget/panel-dock'; import { PanelDock } from '../../widget/panel-dock';
import { composeTitle } from '../../widget/utils'; import { composeTitle } from '../../widget/utils';

View File

@ -9,4 +9,3 @@ export * from './context';
export * from './register-defaults'; export * from './register-defaults';
export * from './widget'; export * from './widget';
export * from './layouts'; export * from './layouts';
export * from './event';

View File

@ -19,5 +19,4 @@ export const registerDefaults = (ctx: IPublicModelPluginContext) => {
}; };
}; };
registerDefaults.pluginName = '___register_defaults___'; registerDefaults.pluginName = '___register_defaults___';

View File

@ -1,9 +1,9 @@
import { IPublicTypeTransformedComponentMetadata } from '@alilc/lowcode-types'; import { IPublicTypeTransformedComponentMetadata } from '@alilc/lowcode-types';
import { isPlainObject, isJSFunction, getLogger } from '@alilc/lowcode-utils'; import { isPlainObject, isJSFunction, createLogger } from '@alilc/lowcode-utils';
const leadingFnRe = /^function/; const leadingFnRe = /^function/;
const leadingFnNameRe = /^\w+\s*\(/; const leadingFnNameRe = /^\w+\s*\(/;
const logger = getLogger({ level: 'warn', bizName: 'skeleton:transducers' }); const logger = createLogger({ level: 'warn', bizName: 'skeleton:transducers' });
/** /**
* *

View File

@ -1,7 +1,7 @@
import { ReactNode, createElement } from 'react'; import { ReactNode, createElement } from 'react';
import { makeObservable, observable } from '@alilc/lowcode-editor-core'; import { makeObservable, observable } from '@alilc/lowcode-editor-core';
import { uniqueId, createContent } from '@alilc/lowcode-utils'; import { uniqueId, createContent } from '@alilc/lowcode-utils';
import { getEvent } from '../event'; import { getEvent } from '../../../engine/src/shell/api/event';
import { DockConfig } from '../types'; import { DockConfig } from '../types';
import { ISkeleton } from '../skeleton'; import { ISkeleton } from '../skeleton';
import { DockView, WidgetView } from '../components/widget-views'; import { DockView, WidgetView } from '../components/widget-views';

View File

@ -13,7 +13,7 @@ import {
IPublicTypeTitleContent, IPublicTypeTitleContent,
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { WidgetContainer } from './widget-container'; import { WidgetContainer } from './widget-container';
import { getEvent } from '../event'; import { getEvent } from '../../../engine/src/shell/api/event';
import { TitledPanelView, TabsPanelView, PanelView } from '../components/widget-views'; import { TitledPanelView, TabsPanelView, PanelView } from '../components/widget-views';
import { ISkeleton } from '../skeleton'; import { ISkeleton } from '../skeleton';
import { composeTitle } from './utils'; import { composeTitle } from './utils';

View File

@ -1,4 +1,3 @@
// import { uniqueId } from '@alilc/lowcode-utils';
import { Widget } from './widget'; import { Widget } from './widget';
import { ISkeleton } from '../skeleton'; import { ISkeleton } from '../skeleton';
import { WidgetConfig } from '../types'; import { WidgetConfig } from '../types';

View File

@ -1,7 +1,7 @@
import { ReactNode, createElement } from 'react'; import { ReactNode, createElement } from 'react';
import { makeObservable, observable } from '@alilc/lowcode-editor-core'; import { makeObservable, observable } from '@alilc/lowcode-editor-core';
import { createContent, uniqueId } from '@alilc/lowcode-utils'; import { createContent, uniqueId } from '@alilc/lowcode-utils';
import { getEvent } from '../event'; import { getEvent } from '../../../engine/src/shell/api/event';
import { WidgetConfig } from '../types'; import { WidgetConfig } from '../types';
import { ISkeleton } from '../skeleton'; import { ISkeleton } from '../skeleton';
import { WidgetView } from '../components/widget-views'; import { WidgetView } from '../components/widget-views';

View File

@ -5,5 +5,5 @@
}, },
"include": [ "include": [
"./src/" "./src/"
] , "../engine/src/shell/api/event.ts" ]
} }

View File

@ -9,6 +9,7 @@ import {
Hotkey as InnerHotkey, Hotkey as InnerHotkey,
IEditor, IEditor,
Command as InnerCommand, Command as InnerCommand,
LowCodePluginManager
} from '@alilc/lowcode-editor-core'; } from '@alilc/lowcode-editor-core';
import { import {
IPublicTypeEngineOptions, IPublicTypeEngineOptions,
@ -22,10 +23,6 @@ import {
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { import {
Designer, Designer,
LowCodePluginManager,
ILowCodePluginContextPrivate,
ILowCodePluginContextApiAssembler,
PluginPreference,
IDesigner, IDesigner,
} from '@alilc/lowcode-designer'; } from '@alilc/lowcode-designer';
import { Skeleton as InnerSkeleton, registerDefaults, Workbench } from '@alilc/lowcode-editor-skeleton'; import { Skeleton as InnerSkeleton, registerDefaults, Workbench } from '@alilc/lowcode-editor-skeleton';

View File

@ -17,7 +17,6 @@ import {
import { editorSymbol, designerSymbol, nodeSymbol } from '../symbols'; import { editorSymbol, designerSymbol, nodeSymbol } from '../symbols';
import { import {
Dragon as ShellDragon, Dragon as ShellDragon,
DropLocation as ShellDropLocation,
ActiveTracker as ShellActiveTracker, ActiveTracker as ShellActiveTracker,
Clipboard as ShellClipboard, Clipboard as ShellClipboard,
DropLocation, DropLocation,

View File

@ -1,8 +1,8 @@
import { IEditor, IEventBus } from '@alilc/lowcode-editor-core'; import { IEditor, IEventBus } from '@alilc/lowcode-editor-core';
import { getLogger, isPluginEventName } from '@alilc/lowcode-utils'; import { createLogger, isPluginEventName } from '@alilc/lowcode-utils';
import { IPublicApiEvent, IPublicTypeDisposable } from '@alilc/lowcode-types'; import { IPublicApiEvent, IPublicTypeDisposable } from '@alilc/lowcode-types';
const logger = getLogger({ level: 'warn', bizName: 'shell-event' }); const logger = createLogger({ level: 'warn', bizName: 'shell-event' });
type EventOptions = { type EventOptions = {
prefix: string; prefix: string;

View File

@ -12,3 +12,4 @@ export * from './workspace';
export * from './config'; export * from './config';
export * from './commonUI'; export * from './commonUI';
export * from './command'; export * from './command';
export * from './event';

View File

@ -1,5 +1,5 @@
import { getLogger } from '@alilc/lowcode-utils'; import { createLogger } from '@alilc/lowcode-utils';
import { IPublicApiLogger, ILoggerOptions } from '@alilc/lowcode-types'; import { IPublicApiLogger, ILoggerOptions } from '@alilc/lowcode-types';
const innerLoggerSymbol = Symbol('logger'); const innerLoggerSymbol = Symbol('logger');
@ -8,7 +8,7 @@ export class Logger implements IPublicApiLogger {
private readonly [innerLoggerSymbol]: any; private readonly [innerLoggerSymbol]: any;
constructor(options: ILoggerOptions) { constructor(options: ILoggerOptions) {
this[innerLoggerSymbol] = getLogger(options as any); this[innerLoggerSymbol] = createLogger(options as any);
} }
/** /**

View File

@ -1,6 +1,6 @@
import { globalContext } from '@alilc/lowcode-editor-core'; import { globalContext } from '@alilc/lowcode-editor-core';
import { IDesigner, isComponentMeta } from '@alilc/lowcode-designer'; import { IDesigner, isComponentMeta } from '@alilc/lowcode-designer';
import { IPublicTypeAssetsJson, getLogger } from '@alilc/lowcode-utils'; import { IPublicTypeAssetsJson, createLogger } from '@alilc/lowcode-utils';
import { import {
IPublicTypeComponentAction, IPublicTypeComponentAction,
IPublicTypeComponentMetadata, IPublicTypeComponentMetadata,
@ -18,7 +18,7 @@ import { editorSymbol, designerSymbol } from '../symbols';
import { ComponentMeta as ShellComponentMeta } from '../model'; import { ComponentMeta as ShellComponentMeta } from '../model';
import { ComponentType } from 'react'; import { ComponentType } from 'react';
const logger = getLogger({ level: 'warn', bizName: 'shell-material' }); const logger = createLogger({ level: 'warn', bizName: 'shell-material' });
const innerEditorSymbol = Symbol('editor'); const innerEditorSymbol = Symbol('editor');
export class Material implements IPublicApiMaterial { export class Material implements IPublicApiMaterial {

View File

@ -7,7 +7,7 @@ import {
IPublicModelPluginInstance, IPublicModelPluginInstance,
IPublicTypePlugin, IPublicTypePlugin,
IPublicTypePluginRegisterOptions, IPublicTypePluginRegisterOptions,
IPublicTypePreferenceValueType, IPublicTypePluginPreferenceValueType,
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { PluginInstance as ShellPluginInstance } from '../model'; import { PluginInstance as ShellPluginInstance } from '../model';
import { pluginsSymbol } from '../symbols'; import { pluginsSymbol } from '../symbols';
@ -45,7 +45,7 @@ export class Plugins implements IPublicApiPlugins {
getPluginPreference( getPluginPreference(
pluginName: string, pluginName: string,
): Record<string, IPublicTypePreferenceValueType> | null | undefined { ): Record<string, IPublicTypePluginPreferenceValueType> | null | undefined {
return this[pluginsSymbol].getPluginPreference(pluginName); return this[pluginsSymbol].getPluginPreference(pluginName);
} }

View File

@ -18,9 +18,9 @@ import {
import { DocumentModel as ShellDocumentModel } from '../model'; import { DocumentModel as ShellDocumentModel } from '../model';
import { SimulatorHost } from './simulator-host'; import { SimulatorHost } from './simulator-host';
import { editorSymbol, projectSymbol, simulatorHostSymbol, documentSymbol } from '../symbols'; import { editorSymbol, projectSymbol, simulatorHostSymbol, documentSymbol } from '../symbols';
import { getLogger } from '@alilc/lowcode-utils'; import { createLogger } from '@alilc/lowcode-utils';
const logger = getLogger({ level: 'warn', bizName: 'shell-project' }); const logger = createLogger({ level: 'warn', bizName: 'shell-project' });
const innerProjectSymbol = Symbol('innerProject'); const innerProjectSymbol = Symbol('innerProject');
export class Project implements IPublicApiProject { export class Project implements IPublicApiProject {
@ -192,7 +192,7 @@ export class Project implements IPublicApiProject {
* project ready * project ready
*/ */
onSimulatorHostReady(fn: (host: IPublicApiSimulatorHost) => void): IPublicTypeDisposable { onSimulatorHostReady(fn: (host: IPublicApiSimulatorHost) => void): IPublicTypeDisposable {
// @ts-ignore // @ts-expect-error: a
const offFn = this[projectSymbol].onSimulatorReady((simulator: BuiltinSimulatorHost) => { const offFn = this[projectSymbol].onSimulatorReady((simulator: BuiltinSimulatorHost) => {
fn(SimulatorHost.create(simulator)!); fn(SimulatorHost.create(simulator)!);
}); });

View File

@ -1,12 +1,11 @@
import { IPublicTypeCustomView, IPublicApiSetters, IPublicTypeRegisteredSetter } from '@alilc/lowcode-types'; import { IPublicTypeCustomView, IPublicApiSetters, IPublicTypeRegisteredSetter } from '@alilc/lowcode-types';
import { ISetters, globalContext, untracked } from '@alilc/lowcode-editor-core'; import { ISetters, globalContext, untracked } from '@alilc/lowcode-editor-core';
import { ReactNode } from 'react'; import { createLogger } from '@alilc/lowcode-utils';
import { getLogger } from '@alilc/lowcode-utils';
const innerSettersSymbol = Symbol('setters'); const innerSettersSymbol = Symbol('setters');
const settersSymbol = Symbol('setters'); const settersSymbol = Symbol('setters');
const logger = getLogger({ level: 'warn', bizName: 'shell-setters' }); const logger = createLogger({ level: 'warn', bizName: 'shell-setters' });
export class Setters implements IPublicApiSetters { export class Setters implements IPublicApiSetters {
readonly [innerSettersSymbol]: ISetters; readonly [innerSettersSymbol]: ISetters;

View File

@ -5,12 +5,12 @@ import {
} from '@alilc/lowcode-editor-skeleton'; } from '@alilc/lowcode-editor-skeleton';
import { skeletonSymbol } from '../symbols'; import { skeletonSymbol } from '../symbols';
import { IPublicApiSkeleton, IPublicModelSkeletonItem, IPublicTypeConfigTransducer, IPublicTypeDisposable, IPublicTypeSkeletonConfig, IPublicTypeWidgetConfigArea } from '@alilc/lowcode-types'; import { IPublicApiSkeleton, IPublicModelSkeletonItem, IPublicTypeConfigTransducer, IPublicTypeDisposable, IPublicTypeSkeletonConfig, IPublicTypeWidgetConfigArea } from '@alilc/lowcode-types';
import { getLogger } from '@alilc/lowcode-utils'; import { createLogger } from '@alilc/lowcode-utils';
import { SkeletonItem } from '../model/skeleton-item'; import { SkeletonItem } from '../model/skeleton-item';
const innerSkeletonSymbol = Symbol('skeleton'); const innerSkeletonSymbol = Symbol('skeleton');
const logger = getLogger({ level: 'warn', bizName: 'shell-skeleton' }); const logger = createLogger({ level: 'warn', bizName: 'shell-skeleton' });
export class Skeleton implements IPublicApiSkeleton { export class Skeleton implements IPublicApiSkeleton {
private readonly [innerSkeletonSymbol]: ISkeleton; private readonly [innerSkeletonSymbol]: ISkeleton;

View File

@ -28,8 +28,9 @@ import {
Config, Config,
CommonUI, CommonUI,
Command, Command,
getEvent,
Event
} from './api'; } from './api';
import { getEvent, Event } from '@alilc/lowcode-editor-skeleton';
export * from './symbols'; export * from './symbols';

View File

@ -49,7 +49,7 @@ import {
IPublicModelPluginContext, IPublicModelPluginContext,
IPublicTypePluginMeta, IPublicTypePluginMeta,
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { getLogger, Logger as InnerLogger } from '@alilc/lowcode-utils'; import { createLogger, Logger as InnerLogger } from '@alilc/lowcode-utils';
import { IWorkspace } from '../workspace'; import { IWorkspace } from '../workspace';
import { IEditorWindow } from '../window'; import { IEditorWindow } from '../window';
@ -113,7 +113,7 @@ implements
const project = new Project(innerProject, true); const project = new Project(innerProject, true);
const config = engineConfig; const config = engineConfig;
const event = new Event(commonEvent, { prefix: 'common' }); const event = new Event(commonEvent, { prefix: 'common' });
const logger = getLogger({ level: 'warn', bizName: 'common' }); const logger = createLogger({ level: 'warn', bizName: 'common' });
const skeleton = new Skeleton(innerSkeleton, 'any', true); const skeleton = new Skeleton(innerSkeleton, 'any', true);
const canvas = new Canvas(editor, true); const canvas = new Canvas(editor, true);
const commonUI = new CommonUI(editor); const commonUI = new CommonUI(editor);

View File

@ -1,10 +1,10 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { Editor, engineConfig } from '@alilc/lowcode-editor-core'; import { Editor, engineConfig } from '@alilc/lowcode-editor-core';
import { DesignerView, Designer } from '@alilc/lowcode-designer'; import { DesignerView, Designer } from '@alilc/lowcode-designer';
import { Asset, getLogger } from '@alilc/lowcode-utils'; import { Asset, createLogger } from '@alilc/lowcode-utils';
import './index.scss'; import './index.scss';
const logger = getLogger({ level: 'warn', bizName: 'plugin:plugin-designer' }); const logger = createLogger({ level: 'warn', bizName: 'plugin:plugin-designer' });
export interface PluginProps { export interface PluginProps {
engineEditor: Editor; engineEditor: Editor;

View File

@ -1,6 +1,6 @@
import { KeyboardEvent, FocusEvent, Fragment, PureComponent } from 'react'; import { KeyboardEvent, FocusEvent, Fragment, PureComponent } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Title, Tip } from '@alilc/lowcode-editor-core'; import { Title, Tip } from '@alilc/lowcode-designer';
import { createIcon } from '@alilc/lowcode-utils'; import { createIcon } from '@alilc/lowcode-utils';
import { IPublicApiEvent } from '@alilc/lowcode-types'; import { IPublicApiEvent } from '@alilc/lowcode-types';
import TreeNode from '../controllers/tree-node'; import TreeNode from '../controllers/tree-node';

View File

@ -28,6 +28,7 @@
"test:watch": "vitest" "test:watch": "vitest"
}, },
"dependencies": { "dependencies": {
"@alilc/lowcode-shared": "workspace:*",
"lodash-es": "^4.17.21" "lodash-es": "^4.17.21"
}, },
"devDependencies": { "devDependencies": {

View File

@ -1,4 +1,4 @@
import type { Project, Package, PlainObject } from '../types'; import type { Project, Package, PlainObject } from '@alilc/lowcode-shared';
import { type PackageManager, createPackageManager } from '../package'; import { type PackageManager, createPackageManager } from '../package';
import { createPluginManager, type Plugin } from '../plugin'; import { createPluginManager, type Plugin } from '../plugin';
import { createScope, type CodeScope } from '../code-runtime'; import { createScope, type CodeScope } from '../code-runtime';

View File

@ -1,5 +1,5 @@
import type { PlainObject, InstanceStateApi } from '@alilc/lowcode-shared';
import { type CreateContainerOptions, createContainer, type Container } from '../container'; import { type CreateContainerOptions, createContainer, type Container } from '../container';
import type { PlainObject, InstanceStateApi } from '../types';
export type CreateComponentBaseOptions<T extends string> = Omit< export type CreateComponentBaseOptions<T extends string> = Omit<
CreateContainerOptions<T>, CreateContainerOptions<T>,

View File

@ -11,7 +11,6 @@ export * from './utils/value';
export * from './widget'; export * from './widget';
/* --------------- types ---------------- */ /* --------------- types ---------------- */
export * from './types';
export type { CodeRuntime, CodeScope } from './code-runtime'; export type { CodeRuntime, CodeScope } from './code-runtime';
export type { Plugin, PluginSetupContext } from './plugin'; export type { Plugin, PluginSetupContext } from './plugin';
export type { PackageManager, PackageLoader } from './package'; export type { PackageManager, PackageLoader } from './package';

View File

@ -0,0 +1,8 @@
{
"name": "@alilc/lowcode-shared",
"version": "2.0.0-beta.0",
"type": "module",
"main": "dist/low-code-shared.cjs",
"module": "dist/low-code-shared.js",
"types": "dist/index.d.ts"
}

View File

@ -0,0 +1,2 @@
export * from './invariant';
export * from './logger';

View File

@ -1,9 +1,8 @@
/* eslint-disable no-console */ import { isObject } from '../../../utils/src/is-object';
/* eslint-disable no-param-reassign */
import { isObject } from './is-object';
export type Level = 'debug' | 'log' | 'info' | 'warn' | 'error'; export type Level = 'debug' | 'log' | 'info' | 'warn' | 'error';
interface Options {
export interface LoggerOptions {
level: Level; level: Level;
bizName: string; bizName: string;
} }
@ -117,7 +116,8 @@ const getLogArgs = (args: any, bizName: string, logLevel: string) => {
processedArgs = processedArgs.concat(argsArray); processedArgs = processedArgs.concat(argsArray);
return processedArgs; return processedArgs;
}; };
const parseLogConf = (logConf: string, options: Options): { level: string; bizName: string} => {
const parseLogConf = (logConf: string, options: LoggerOptions) => {
if (!logConf) { if (!logConf) {
return { return {
level: options.level, level: options.level,
@ -137,16 +137,16 @@ const parseLogConf = (logConf: string, options: Options): { level: string; bizNa
}; };
}; };
const defaultOptions: Options = { const defaultOptions: LoggerOptions = {
level: 'warn', level: 'warn',
bizName: '*', bizName: '*',
}; };
class Logger { export class Logger {
bizName: string; bizName: string;
targetBizName: string; targetBizName: string;
targetLevel: string; targetLevel: string;
constructor(options: Options) { constructor(options: LoggerOptions) {
options = { ...defaultOptions, ...options }; options = { ...defaultOptions, ...options };
const _location = location || {} as any; const _location = location || {} as any;
// __logConf__ 格式为 logLevel[:bizName], bizName is used as: targetBizName like '%bizName%' // __logConf__ 格式为 logLevel[:bizName], bizName is used as: targetBizName like '%bizName%'
@ -191,8 +191,6 @@ class Logger {
} }
} }
export { Logger }; export function createLogger(config: { level: Level; bizName: string }): Logger {
export function getLogger(config: { level: Level; bizName: string }): Logger {
return new Logger(config); return new Logger(config);
} }

View File

@ -0,0 +1,2 @@
export * from './types';
export * from './helper';

View File

@ -1,3 +1,5 @@
export type VoidFunction = (...args: any[]) => void;
export type AnyFunction = (...args: any[]) => any; export type AnyFunction = (...args: any[]) => any;
export type PlainObject = Record<PropertyKey, any>; export type PlainObject = Record<PropertyKey, any>;

View File

@ -1,6 +1,6 @@
/** /**
* https://lowcode-engine.cn/site/docs/specs/assets-spec * https://lowcode-engine.cn/site/docs/specs/assets-spec
* for runtime *
*/ */
import { Project } from './lowcode-spec'; import { Project } from './lowcode-spec';

View File

@ -0,0 +1,9 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"emitDeclarationOnly": true,
"declaration": true,
"outDir": "temp",
"stripInternal": true
}
}

View File

@ -0,0 +1,7 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "dist"
},
"include": ["src"]
}

Some files were not shown because too many files have changed in this diff Show More