@lcap/asl
Version:
NetEase Application Specific Language
207 lines (184 loc) • 5.86 kB
text/typescript
import {
App, MicroService, Interface, Enum,
dataTypesMap, vertexsMap, Process,
} from '..';
import webFileService from '../../service/webFile';
import { saveLastModified } from './hotReload';
export function dataTypesToJson() {
return dataTypesMap;
}
export function enumsToJson(app: App) {
const enums = app.firstMicroService.data.enums;
const enumsJson: {
[prop: string]: { [prop: string]: string };
} = {};
enums.forEach((enumTemp: Enum) => {
enumsJson[enumTemp.name] = enumsJson[enumTemp.name] || {};
const enumItemList = enumTemp.enumItemList;
enumItemList.forEach((enumItem) => {
enumsJson[enumTemp.name][`${enumItem.value}`] = enumItem.label;
});
});
return enumsJson;
}
export function apisToJson(app: App) {
const apiJson: {
[prop: string]: any;
} = {};
app.services.forEach((service) => {
service.interfaces.forEach((itface: Interface) => {
const path = itface.path || '';
apiJson[itface.name] = {
url: {
path,
method: itface.method,
},
};
});
if ((service as MicroService).processes) {
(service as MicroService).processes.forEach((process: Process) => {
const { launchProcessInterface, childShapes } = process;
const path = launchProcessInterface.path || '';
apiJson[launchProcessInterface.name] = {
url: {
path,
method: launchProcessInterface.method,
},
};
childShapes.forEach((processComp) => {
const { type, completeTaskInterface } = processComp;
if (type === 'UserTask') {
const path = completeTaskInterface.path || '';
apiJson[completeTaskInterface.name] = {
url: {
path,
method: completeTaskInterface.method,
},
};
}
});
});
}
});
return apiJson;
}
export async function generateDataJson(app: App) {
const services = await app.loadServices();
const service = app.firstMicroService;
await service.loadStructures();
await service.loadInterfaces();
await service.loadEntities();
return {
dataTypes: dataTypesToJson(),
enums: enumsToJson(app),
apis: apisToJson(app),
};
}
export function saveDataTypesCache(app: App) {
const serviceId = app.firstMicroService.id;
const path = `dataTypes.json`;
const promise = webFileService.saveFile({
body: {
serviceId,
type: 'cache',
path,
content: JSON.stringify(dataTypesToJson()),
},
});
saveLastModified(serviceId, path);
return promise;
}
export async function loadDataTypesCache(serviceId: string) {
const result = await webFileService.loadFile({
query: {
serviceId,
path: `dataTypes.json`,
},
});
return result && JSON.parse(result.content);
}
export function saveEnumsCache(app: App) {
const serviceId = app.firstMicroService.id;
const path = `enums.json`;
const promise = webFileService.saveFile({
body: {
serviceId,
type: 'cache',
path,
content: JSON.stringify(enumsToJson(app)),
},
});
saveLastModified(serviceId, path);
return promise;
}
export async function loadEnumsCache(serviceId: string) {
const result = await webFileService.loadFile({
query: {
serviceId,
path: `enums.json`,
},
});
return result && JSON.parse(result.content);
}
export function saveApisCache(app: App) {
const serviceId = app.firstMicroService.id;
const path = `apis.json`;
const promise = webFileService.saveFile({
body: {
serviceId,
type: 'cache',
path,
content: JSON.stringify(apisToJson(app)),
},
});
saveLastModified(serviceId, path);
return promise;
}
export async function loadApisCache(serviceId: string) {
const result = await webFileService.loadFile({
query: {
serviceId,
path: `apis.json`,
},
});
return result && JSON.parse(result.content);
}
export function getVertexIdToName() {
const res: { [prop: string]: string } = {};
for (const [id, vertex] of vertexsMap) {
res[id] = vertex.name || (vertex as any).value;
}
return res;
}
export async function saveVertexIdToName(app: App) {
const serviceId = app.firstMicroService.id;
const path = `vertexIdToName.json`;
// 合并原来的json。原因:如果有页面没有打开,vertexsMap里会没有那些页面的element点
let nameJson = await webFileService.loadFile({
query: {
serviceId,
path,
},
});
nameJson = nameJson && JSON.parse(nameJson.content) || {};
const promise = webFileService.saveFile({
body: {
serviceId,
type: 'cache',
path,
content: JSON.stringify(Object.assign(nameJson, getVertexIdToName())),
},
});
saveLastModified(serviceId, path);
return promise;
}
export async function loadVertexIdToName(app: App) {
const serviceId = app.firstMicroService.id;
const result = await webFileService.loadFile({
query: {
serviceId,
path: `vertexIdToName.json`,
},
});
return result && JSON.parse(result.content);
}