lowcode-engine/modules/code-generator/src/standalone-worker.ts
2022-02-16 11:20:17 +08:00

78 lines
1.8 KiB
TypeScript

/* eslint-disable no-console */
import type { ProjectSchema } from '@alilc/lowcode-types';
import CodeGen from './standalone';
declare const self: any;
self.onmessage = (event: any) => {
const msg = event.data || {};
if (msg.type === 'run') {
run(msg);
}
};
self.postMessage({ type: 'ready' });
async function run(msg: { solution: string; schema: ProjectSchema; flattenResult?: boolean }) {
try {
print('begin run...');
self.postMessage({ type: 'run:begin' });
const { solution } = msg;
if (!solution) {
throw new Error('solution is required');
}
const createAppBuilder = CodeGen.solutions[solution as 'icejs' | 'rax'];
if (typeof createAppBuilder !== 'function') {
throw new Error(`solution '${solution}' is invalid`);
}
const appBuilder = createAppBuilder();
print('generating from schema: %o', msg.schema);
const result = await appBuilder.generateProject(msg.schema);
print('generated result: %o', result);
const finalResult = msg.flattenResult
? CodeGen.utils.resultHelper.flattenResult(result)
: result;
if (msg.flattenResult) {
print('flatten result: %o', finalResult);
}
self.postMessage({
type: 'run:end',
result: finalResult,
});
} catch (e) {
printErr(`${e}`);
self.postMessage({
type: 'run:error',
errorMsg: `${(e as Error | null)?.message || e}`,
errorDetail: `${e}`,
});
}
}
function print(text: string, ...args: any[]) {
console.debug(`[code-generator/worker]: ${text}`, ...args);
self.postMessage({
type: 'stdout',
data: text,
args,
});
}
function printErr(text: string, ...args: any[]) {
console.debug(`[code-generator/worker]: %c${text}`, 'color:red', ...args);
self.postMessage({
type: 'stderr',
data: text,
args,
});
}