mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-14 13:03:07 +00:00
feat: update props ts defined
This commit is contained in:
parent
80fc9766b1
commit
8c073c3c95
@ -3,7 +3,8 @@ import { GlobalEvent, IPublicEnumTransformStage } from '@alilc/lowcode-types';
|
|||||||
import type { IPublicTypeCompositeValue, IPublicTypeJSSlot, IPublicTypeSlotSchema, IPublicModelProp } from '@alilc/lowcode-types';
|
import type { IPublicTypeCompositeValue, IPublicTypeJSSlot, IPublicTypeSlotSchema, IPublicModelProp } from '@alilc/lowcode-types';
|
||||||
import { uniqueId, isPlainObject, hasOwnProperty, compatStage, isJSExpression, isJSSlot, isNodeSchema } from '@alilc/lowcode-utils';
|
import { uniqueId, isPlainObject, hasOwnProperty, compatStage, isJSExpression, isJSSlot, isNodeSchema } from '@alilc/lowcode-utils';
|
||||||
import { valueToSource } from './value-to-source';
|
import { valueToSource } from './value-to-source';
|
||||||
import { IProps, IPropParent } from './props';
|
import { IPropParent } from './props';
|
||||||
|
import type { IProps } from './props';
|
||||||
import { ISlotNode, INode } from '../node';
|
import { ISlotNode, INode } from '../node';
|
||||||
// import { TransformStage } from '../transform-stage';
|
// import { TransformStage } from '../transform-stage';
|
||||||
|
|
||||||
@ -14,13 +15,14 @@ export type UNSET = typeof UNSET;
|
|||||||
|
|
||||||
export interface IProp extends Omit<IPublicModelProp<
|
export interface IProp extends Omit<IPublicModelProp<
|
||||||
INode
|
INode
|
||||||
>, 'exportSchema' | 'node'> {
|
>, 'exportSchema' | 'node'>, IPropParent {
|
||||||
|
key: string | number | undefined;
|
||||||
|
|
||||||
readonly props: IProps;
|
readonly props: IProps;
|
||||||
|
|
||||||
readonly owner: INode;
|
readonly owner: INode;
|
||||||
|
|
||||||
delete(prop: Prop): void;
|
delete(prop: IProp): void;
|
||||||
|
|
||||||
export(stage: IPublicEnumTransformStage): IPublicTypeCompositeValue;
|
export(stage: IPublicEnumTransformStage): IPublicTypeCompositeValue;
|
||||||
|
|
||||||
@ -36,7 +38,15 @@ export interface IProp extends Omit<IPublicModelProp<
|
|||||||
|
|
||||||
isUnset(): boolean;
|
isUnset(): boolean;
|
||||||
|
|
||||||
key: string | number | undefined;
|
purge(): void;
|
||||||
|
|
||||||
|
setupItems(): IProp[] | null;
|
||||||
|
|
||||||
|
get type(): ValueTypes;
|
||||||
|
|
||||||
|
get size(): number;
|
||||||
|
|
||||||
|
get code(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ValueTypes = 'unset' | 'literal' | 'map' | 'list' | 'expression' | 'slot';
|
export type ValueTypes = 'unset' | 'literal' | 'map' | 'list' | 'expression' | 'slot';
|
||||||
@ -126,15 +136,15 @@ export class Prop implements IProp, IPropParent {
|
|||||||
this._code = code;
|
this._code = code;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _slotNode?: INode;
|
private _slotNode?: INode | null;
|
||||||
|
|
||||||
get slotNode(): INode | null {
|
get slotNode(): INode | null {
|
||||||
return this._slotNode || null;
|
return this._slotNode || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@obx.shallow private _items: Prop[] | null = null;
|
@obx.shallow private _items: IProp[] | null = null;
|
||||||
|
|
||||||
@obx.shallow private _maps: Map<string | number, Prop> | null = null;
|
@obx.shallow private _maps: Map<string | number, IProp> | null = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 作为 _maps 的一层缓存机制,主要是复用部分已存在的 Prop,保持响应式关系,比如:
|
* 作为 _maps 的一层缓存机制,主要是复用部分已存在的 Prop,保持响应式关系,比如:
|
||||||
@ -142,15 +152,15 @@ export class Prop implements IProp, IPropParent {
|
|||||||
* 导致假如外部有 mobx reaction(常见于 observer),此时响应式链路会被打断,
|
* 导致假如外部有 mobx reaction(常见于 observer),此时响应式链路会被打断,
|
||||||
* 因为 reaction 监听的是原 Prop(a) 的 _value,而不是新 Prop(a) 的 _value。
|
* 因为 reaction 监听的是原 Prop(a) 的 _value,而不是新 Prop(a) 的 _value。
|
||||||
*/
|
*/
|
||||||
private _prevMaps: Map<string | number, Prop> | null = null;
|
private _prevMaps: Map<string | number, IProp> | null = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造 items 属性,同时构造 maps 属性
|
* 构造 items 属性,同时构造 maps 属性
|
||||||
*/
|
*/
|
||||||
private get items(): Prop[] | null {
|
private get items(): IProp[] | null {
|
||||||
if (this._items) return this._items;
|
if (this._items) return this._items;
|
||||||
return runInAction(() => {
|
return runInAction(() => {
|
||||||
let items: Prop[] | null = null;
|
let items: IProp[] | null = null;
|
||||||
if (this._type === 'list') {
|
if (this._type === 'list') {
|
||||||
const data = this._value;
|
const data = this._value;
|
||||||
data.forEach((item: any, idx: number) => {
|
data.forEach((item: any, idx: number) => {
|
||||||
@ -160,10 +170,10 @@ export class Prop implements IProp, IPropParent {
|
|||||||
this._maps = null;
|
this._maps = null;
|
||||||
} else if (this._type === 'map') {
|
} else if (this._type === 'map') {
|
||||||
const data = this._value;
|
const data = this._value;
|
||||||
const maps = new Map<string, Prop>();
|
const maps = new Map<string, IProp>();
|
||||||
const keys = Object.keys(data);
|
const keys = Object.keys(data);
|
||||||
for (const key of keys) {
|
for (const key of keys) {
|
||||||
let prop: Prop;
|
let prop: IProp;
|
||||||
if (this._prevMaps?.has(key)) {
|
if (this._prevMaps?.has(key)) {
|
||||||
prop = this._prevMaps.get(key)!;
|
prop = this._prevMaps.get(key)!;
|
||||||
prop.setValue(data[key]);
|
prop.setValue(data[key]);
|
||||||
@ -184,7 +194,7 @@ export class Prop implements IProp, IPropParent {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@computed private get maps(): Map<string | number, Prop> | null {
|
@computed private get maps(): Map<string | number, IProp> | null {
|
||||||
if (!this.items) {
|
if (!this.items) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -434,7 +444,7 @@ export class Prop implements IProp, IPropParent {
|
|||||||
this._slotNode.import(slotSchema);
|
this._slotNode.import(slotSchema);
|
||||||
} else {
|
} else {
|
||||||
const { owner } = this.props;
|
const { owner } = this.props;
|
||||||
this._slotNode = owner.document.createNode<ISlotNode>(slotSchema);
|
this._slotNode = owner.document?.createNode<ISlotNode>(slotSchema);
|
||||||
if (this._slotNode) {
|
if (this._slotNode) {
|
||||||
owner.addSlot(this._slotNode);
|
owner.addSlot(this._slotNode);
|
||||||
this._slotNode.internalSetSlotFor(this);
|
this._slotNode.internalSetSlotFor(this);
|
||||||
@ -465,7 +475,7 @@ export class Prop implements IProp, IPropParent {
|
|||||||
/**
|
/**
|
||||||
* @returns 0: the same 1: maybe & like 2: not the same
|
* @returns 0: the same 1: maybe & like 2: not the same
|
||||||
*/
|
*/
|
||||||
compare(other: Prop | null): number {
|
compare(other: IProp | null): number {
|
||||||
if (!other || other.isUnset()) {
|
if (!other || other.isUnset()) {
|
||||||
return this.isUnset() ? 0 : 2;
|
return this.isUnset() ? 0 : 2;
|
||||||
}
|
}
|
||||||
@ -489,7 +499,7 @@ export class Prop implements IProp, IPropParent {
|
|||||||
* @param createIfNone 当没有的时候,是否创建一个
|
* @param createIfNone 当没有的时候,是否创建一个
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
get(path: string | number, createIfNone = true): Prop | null {
|
get(path: string | number, createIfNone = true): IProp | null {
|
||||||
const type = this._type;
|
const type = this._type;
|
||||||
if (type !== 'map' && type !== 'list' && type !== 'unset' && !createIfNone) {
|
if (type !== 'map' && type !== 'list' && type !== 'unset' && !createIfNone) {
|
||||||
return null;
|
return null;
|
||||||
@ -548,7 +558,7 @@ export class Prop implements IProp, IPropParent {
|
|||||||
* 删除项
|
* 删除项
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
delete(prop: Prop): void {
|
delete(prop: IProp): void {
|
||||||
/* istanbul ignore else */
|
/* istanbul ignore else */
|
||||||
if (this._items) {
|
if (this._items) {
|
||||||
const i = this._items.indexOf(prop);
|
const i = this._items.indexOf(prop);
|
||||||
@ -582,7 +592,7 @@ export class Prop implements IProp, IPropParent {
|
|||||||
* @param force 强制
|
* @param force 强制
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
add(value: IPublicTypeCompositeValue, force = false): Prop | null {
|
add(value: IPublicTypeCompositeValue, force = false): IProp | null {
|
||||||
const type = this._type;
|
const type = this._type;
|
||||||
if (type !== 'list' && type !== 'unset' && !force) {
|
if (type !== 'list' && type !== 'unset' && !force) {
|
||||||
return null;
|
return null;
|
||||||
@ -688,7 +698,7 @@ export class Prop implements IProp, IPropParent {
|
|||||||
/**
|
/**
|
||||||
* 迭代器
|
* 迭代器
|
||||||
*/
|
*/
|
||||||
[Symbol.iterator](): { next(): { value: Prop } } {
|
[Symbol.iterator](): { next(): { value: IProp } } {
|
||||||
let index = 0;
|
let index = 0;
|
||||||
const { items } = this;
|
const { items } = this;
|
||||||
const length = items?.length || 0;
|
const length = items?.length || 0;
|
||||||
@ -712,7 +722,7 @@ export class Prop implements IProp, IPropParent {
|
|||||||
* 遍历
|
* 遍历
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
forEach(fn: (item: Prop, key: number | string | undefined) => void): void {
|
forEach(fn: (item: IProp, key: number | string | undefined) => void): void {
|
||||||
const { items } = this;
|
const { items } = this;
|
||||||
if (!items) {
|
if (!items) {
|
||||||
return;
|
return;
|
||||||
@ -727,7 +737,7 @@ export class Prop implements IProp, IPropParent {
|
|||||||
* 遍历
|
* 遍历
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
map<T>(fn: (item: Prop, key: number | string | undefined) => T): T[] | null {
|
map<T>(fn: (item: IProp, key: number | string | undefined) => T): T[] | null {
|
||||||
const { items } = this;
|
const { items } = this;
|
||||||
if (!items) {
|
if (!items) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@ -2,7 +2,8 @@ import { computed, makeObservable, obx, action } from '@alilc/lowcode-editor-cor
|
|||||||
import { IPublicTypePropsList, IPublicTypeCompositeValue, IPublicEnumTransformStage, IBaseModelProps } from '@alilc/lowcode-types';
|
import { IPublicTypePropsList, IPublicTypeCompositeValue, IPublicEnumTransformStage, IBaseModelProps } from '@alilc/lowcode-types';
|
||||||
import type { IPublicTypePropsMap } from '@alilc/lowcode-types';
|
import type { IPublicTypePropsMap } from '@alilc/lowcode-types';
|
||||||
import { uniqueId, compatStage } from '@alilc/lowcode-utils';
|
import { uniqueId, compatStage } from '@alilc/lowcode-utils';
|
||||||
import { Prop, IProp, UNSET } from './prop';
|
import { Prop, UNSET } from './prop';
|
||||||
|
import type { IProp } from './prop';
|
||||||
import { INode } from '../node';
|
import { INode } from '../node';
|
||||||
// import { TransformStage } from '../transform-stage';
|
// import { TransformStage } from '../transform-stage';
|
||||||
|
|
||||||
@ -27,23 +28,23 @@ export function getOriginalExtraKey(key: string): string {
|
|||||||
|
|
||||||
export interface IPropParent {
|
export interface IPropParent {
|
||||||
|
|
||||||
readonly props: Props;
|
readonly props: IProps;
|
||||||
|
|
||||||
readonly owner: INode;
|
readonly owner: INode;
|
||||||
|
|
||||||
get path(): string[];
|
get path(): string[];
|
||||||
|
|
||||||
delete(prop: Prop): void;
|
delete(prop: IProp): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IProps extends Omit<IBaseModelProps<IProp>, | 'getExtraProp' | 'getExtraPropValue' | 'setExtraPropValue' | 'node'> {
|
export interface IProps extends Omit<IBaseModelProps<IProp>, | 'getExtraProp' | 'getExtraPropValue' | 'setExtraPropValue' | 'node'>, IPropParent {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取 props 对应的 node
|
* 获取 props 对应的 node
|
||||||
*/
|
*/
|
||||||
getNode(): INode;
|
getNode(): INode;
|
||||||
|
|
||||||
get(path: string, createIfNone?: boolean): Prop | null;
|
get(path: string, createIfNone?: boolean): IProp | null;
|
||||||
|
|
||||||
export(stage?: IPublicEnumTransformStage): {
|
export(stage?: IPublicEnumTransformStage): {
|
||||||
props?: IPublicTypePropsMap | IPublicTypePropsList;
|
props?: IPublicTypePropsMap | IPublicTypePropsList;
|
||||||
@ -54,7 +55,7 @@ export interface IProps extends Omit<IBaseModelProps<IProp>, | 'getExtraProp' |
|
|||||||
|
|
||||||
purge(): void;
|
purge(): void;
|
||||||
|
|
||||||
query(path: string, createIfNone: boolean): Prop | null;
|
query(path: string, createIfNone: boolean): IProp | null;
|
||||||
|
|
||||||
import(value?: IPublicTypePropsMap | IPublicTypePropsList | null, extras?: ExtrasObject): void;
|
import(value?: IPublicTypePropsMap | IPublicTypePropsList | null, extras?: ExtrasObject): void;
|
||||||
}
|
}
|
||||||
@ -62,7 +63,7 @@ export interface IProps extends Omit<IBaseModelProps<IProp>, | 'getExtraProp' |
|
|||||||
export class Props implements IProps, IPropParent {
|
export class Props implements IProps, IPropParent {
|
||||||
readonly id = uniqueId('props');
|
readonly id = uniqueId('props');
|
||||||
|
|
||||||
@obx.shallow private items: Prop[] = [];
|
@obx.shallow private items: IProp[] = [];
|
||||||
|
|
||||||
@computed private get maps(): Map<string, Prop> {
|
@computed private get maps(): Map<string, Prop> {
|
||||||
const maps = new Map();
|
const maps = new Map();
|
||||||
@ -78,7 +79,7 @@ export class Props implements IProps, IPropParent {
|
|||||||
|
|
||||||
readonly path = [];
|
readonly path = [];
|
||||||
|
|
||||||
get props(): Props {
|
get props(): IProps {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,7 +230,7 @@ export class Props implements IProps, IPropParent {
|
|||||||
* @param createIfNone 当没有的时候,是否创建一个
|
* @param createIfNone 当没有的时候,是否创建一个
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
query(path: string, createIfNone = true): Prop | null {
|
query(path: string, createIfNone = true): IProp | null {
|
||||||
return this.get(path, createIfNone);
|
return this.get(path, createIfNone);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,7 +239,7 @@ export class Props implements IProps, IPropParent {
|
|||||||
* @param createIfNone 当没有的时候,是否创建一个
|
* @param createIfNone 当没有的时候,是否创建一个
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
get(path: string, createIfNone = false): Prop | null {
|
get(path: string, createIfNone = false): IProp | null {
|
||||||
let entry = path;
|
let entry = path;
|
||||||
let nest = '';
|
let nest = '';
|
||||||
const i = path.indexOf('.');
|
const i = path.indexOf('.');
|
||||||
@ -266,7 +267,7 @@ export class Props implements IProps, IPropParent {
|
|||||||
* 删除项
|
* 删除项
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
delete(prop: Prop): void {
|
delete(prop: IProp): void {
|
||||||
const i = this.items.indexOf(prop);
|
const i = this.items.indexOf(prop);
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
this.items.splice(i, 1);
|
this.items.splice(i, 1);
|
||||||
@ -298,7 +299,7 @@ export class Props implements IProps, IPropParent {
|
|||||||
key?: string | number,
|
key?: string | number,
|
||||||
spread = false,
|
spread = false,
|
||||||
options: any = {},
|
options: any = {},
|
||||||
): Prop {
|
): IProp {
|
||||||
const prop = new Prop(this, value, key, spread, options);
|
const prop = new Prop(this, value, key, spread, options);
|
||||||
this.items.push(prop);
|
this.items.push(prop);
|
||||||
return prop;
|
return prop;
|
||||||
@ -314,7 +315,7 @@ export class Props implements IProps, IPropParent {
|
|||||||
/**
|
/**
|
||||||
* 迭代器
|
* 迭代器
|
||||||
*/
|
*/
|
||||||
[Symbol.iterator](): { next(): { value: Prop } } {
|
[Symbol.iterator](): { next(): { value: IProp } } {
|
||||||
let index = 0;
|
let index = 0;
|
||||||
const { items } = this;
|
const { items } = this;
|
||||||
const length = items.length || 0;
|
const length = items.length || 0;
|
||||||
@ -338,7 +339,7 @@ export class Props implements IProps, IPropParent {
|
|||||||
* 遍历
|
* 遍历
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
forEach(fn: (item: Prop, key: number | string | undefined) => void): void {
|
forEach(fn: (item: IProp, key: number | string | undefined) => void): void {
|
||||||
this.items.forEach((item) => {
|
this.items.forEach((item) => {
|
||||||
return fn(item, item.key);
|
return fn(item, item.key);
|
||||||
});
|
});
|
||||||
@ -348,14 +349,14 @@ export class Props implements IProps, IPropParent {
|
|||||||
* 遍历
|
* 遍历
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
map<T>(fn: (item: Prop, key: number | string | undefined) => T): T[] | null {
|
map<T>(fn: (item: IProp, key: number | string | undefined) => T): T[] | null {
|
||||||
return this.items.map((item) => {
|
return this.items.map((item) => {
|
||||||
return fn(item, item.key);
|
return fn(item, item.key);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
filter(fn: (item: Prop, key: number | string | undefined) => boolean) {
|
filter(fn: (item: IProp, key: number | string | undefined) => boolean) {
|
||||||
return this.items.filter((item) => {
|
return this.items.filter((item) => {
|
||||||
return fn(item, item.key);
|
return fn(item, item.key);
|
||||||
});
|
});
|
||||||
@ -378,7 +379,7 @@ export class Props implements IProps, IPropParent {
|
|||||||
* @param createIfNone 当没有的时候,是否创建一个
|
* @param createIfNone 当没有的时候,是否创建一个
|
||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
getProp(path: string, createIfNone = true): Prop | null {
|
getProp(path: string, createIfNone = true): IProp | null {
|
||||||
return this.query(path, createIfNone) || null;
|
return this.query(path, createIfNone) || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -108,7 +108,7 @@ export interface IPublicModelDocumentModel<
|
|||||||
* @param data
|
* @param data
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
createNode(data: IPublicTypeNodeSchema): Node | null;
|
createNode<T = Node>(data: IPublicTypeNodeSchema): T | null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 移除指定节点/节点id
|
* 移除指定节点/节点id
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import { IPublicTypeNodeData } from './node-data';
|
||||||
import { IPublicTypeNodeSchema } from './node-schema';
|
import { IPublicTypeNodeSchema } from './node-schema';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -13,5 +14,5 @@ export interface IPublicTypeSlotSchema extends IPublicTypeNodeSchema {
|
|||||||
slotName?: string;
|
slotName?: string;
|
||||||
slotParams?: string[];
|
slotParams?: string[];
|
||||||
};
|
};
|
||||||
children?: IPublicTypeNodeSchema[];
|
children?: IPublicTypeNodeData[] | IPublicTypeNodeData;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user