fix: project.exportSchema should export componentsMap of all documents

This commit is contained in:
LeoYuan 袁力皓 2022-07-11 10:51:31 +08:00 committed by 林熠
parent 6e96adf217
commit 969a130b37
3 changed files with 101 additions and 45 deletions

View File

@ -1,5 +1,5 @@
import { computed, makeObservable, obx, action, runWithGlobalEventOff, wrapWithEventSwitch } from '@alilc/lowcode-editor-core';
import { NodeData, isJSExpression, isDOMText, NodeSchema, isNodeSchema, RootSchema, PageSchema } from '@alilc/lowcode-types';
import { NodeData, isJSExpression, isDOMText, NodeSchema, isNodeSchema, RootSchema, PageSchema, ComponentsMap } from '@alilc/lowcode-types';
import { EventEmitter } from 'events';
import { Project } from '../project';
import { ISimulatorHost } from '../simulator';
@ -19,16 +19,6 @@ export type GetDataType<T, NodeType> = T extends undefined
: any
: T;
export interface ComponentMap {
componentName: string;
package?: string;
version?: string;
destructuring?: boolean;
exportName?: string;
subName?: string;
devMode?: 'lowCode' | 'proCode';
}
export class DocumentModel {
/**
* Page/Component/Block
@ -652,7 +642,7 @@ export class DocumentModel {
}
getComponentsMap(extraComps?: string[]) {
const componentsMap: ComponentMap[] = [];
const componentsMap: ComponentsMap = [];
// 组件去重
const exsitingMap: { [componentName: string]: boolean } = {};
for (const node of this._nodesMap.values()) {

View File

@ -2,7 +2,14 @@ import { EventEmitter } from 'events';
import { obx, computed, makeObservable, action } from '@alilc/lowcode-editor-core';
import { Designer } from '../designer';
import { DocumentModel, isDocumentModel, isPageSchema } from '../document';
import { ProjectSchema, RootSchema, TransformStage } from '@alilc/lowcode-types';
import {
ProjectSchema,
RootSchema,
ComponentsMap,
TransformStage,
isLowCodeComponentType,
isProCodeComponentType,
} from '@alilc/lowcode-types';
import { ISimulatorHost } from '../simulator';
export class Project {
@ -10,7 +17,12 @@ export class Project {
@obx.shallow readonly documents: DocumentModel[] = [];
private data: ProjectSchema = { version: '1.0.0', componentsMap: [], componentsTree: [], i18n: {} };
private data: ProjectSchema = {
version: '1.0.0',
componentsMap: [],
componentsTree: [],
i18n: {},
};
private _simulator?: ISimulatorHost;
@ -49,15 +61,45 @@ export class Project {
this._i18n = value || {};
}
private getComponentsMap(): ComponentsMap {
return this.documents.reduce((compomentsMap: ComponentsMap, curDoc: DocumentModel) => {
const curComponentsMap = curDoc.getComponentsMap();
if (Array.isArray(curComponentsMap)) {
curComponentsMap.forEach((item) => {
const found = compomentsMap.find((eItem) => {
if (
isProCodeComponentType(eItem) &&
isProCodeComponentType(item) &&
eItem.package === item.package &&
eItem.componentName === item.componentName
) {
return true;
} else if (
isLowCodeComponentType(eItem) &&
eItem.componentName === item.componentName
) {
return true;
}
return false;
});
if (found) return;
compomentsMap.push(item);
});
}
return compomentsMap;
}, [] as ComponentsMap);
}
/**
* schema
*/
getSchema(stage: TransformStage = TransformStage.Save): ProjectSchema {
return {
...this.data,
// TODO: future change this filter
componentsMap: this.currentDocument?.getComponentsMap(),
componentsTree: this.documents.filter((doc) => !doc.isBlank()).map((doc) => doc.export(stage)),
componentsMap: this.getComponentsMap(),
componentsTree: this.documents
.filter((doc) => !doc.isBlank())
.map((doc) => doc.export(stage)),
i18n: this.i18n,
};
}
@ -100,7 +142,9 @@ export class Project {
// TODO: 暂时先读 config tabBar 里的值,后面看整个 layout 结构是否能作为引擎规范
if (this.config?.layout?.props?.tabBar?.items?.length > 0) {
// slice(1)这个贼不雅默认任务fileName 是类'/fileName'的形式
documentInstances.find((i) => i.fileName === this.config.layout.props.tabBar.items[0].path?.slice(1))?.open();
documentInstances
.find((i) => i.fileName === this.config.layout.props.tabBar.items[0].path?.slice(1))
?.open();
} else {
documentInstances[0].open();
}
@ -189,11 +233,11 @@ export class Project {
getDocument(id: string): DocumentModel | null {
// 此处不能使用 this.documentsMap.get(id),因为在乐高 rollback 场景document.id 会被改成其他值
return this.documents.find(doc => doc.id === id) || null;
return this.documents.find((doc) => doc.id === id) || null;
}
getDocumentByFileName(fileName: string): DocumentModel | null {
return this.documents.find(doc => doc.fileName === fileName) || null;
return this.documents.find((doc) => doc.fileName === fileName) || null;
}
@action

View File

@ -32,4 +32,26 @@ export interface NpmInfo {
main?: string;
}
export type ComponentsMap = NpmInfo[];
export interface LowCodeComponentType {
/**
*
*/
devMode: 'lowCode';
/**
*
*/
componentName: string;
}
export type ProCodeComponentType = NpmInfo;
export type ComponentMap = ProCodeComponentType | LowCodeComponentType;
export function isProCodeComponentType(desc: ComponentMap): desc is ProCodeComponentType {
return 'package' in desc;
}
export function isLowCodeComponentType(desc: ComponentMap): desc is LowCodeComponentType {
return !isProCodeComponentType(desc);
}
export type ComponentsMap = ComponentMap[];