antosdk-apps/libantosdk/core/ts.worker.js
2021-11-28 14:10:21 +01:00

143 lines
5.1 KiB
JavaScript

importScripts('typescript.min.js');
const tslib = {};
class TSJob extends AntOSDKBaseJob {
constructor(data)
{
super(data);
}
execute(){
if(!ts)
{
const e_msg = "typescript module is not loaded";
this.log_error(e_msg);
return this.error(e_msg);
}
switch (this.job.cmd) {
case 'ts-import':
this.importlib();
break;
case 'ts-compile':
this.compile();
break;
default:
const err_msg = `Unkown job ${this.job.cmd}`;
this.log_error(err_msg);
return this.error(err_msg);
}
}
importlib()
{
if(!ts)
{
const e_msg = "typescript module is not loaded";
this.log_error(e_msg);
return this.error(e_msg);
}
this.read_files(this.job.data)
.then((results) => {
for(let i in this.job.data)
{
const lib = this.job.data[i];
if(!tslib[lib])
{
tslib[lib] = ts.createSourceFile(lib, results[i], ts.ScriptTarget.Latest);
this.log_info(`Typescript library ${lib} loaded`);
}
}
this.result("Typescript libraries loaded");
})
.catch((e) => {
this.log_error("Fail to load Typescript module");
this.error(e);
});
}
compile()
{
let files = [];
const src_files = {};
for(let i in tslib)
{
files.push(i);
src_files[i] = tslib[i];
}
files = files.concat(this.job.data.src);
this.read_files(this.job.data.src)
.then((contents) => {
for(let i in contents)
{
const m = this.job.data.src[i];
src_files[m] = ts.createSourceFile(m, contents[i], ts.ScriptTarget.Latest);
}
let js_code = "";
const host = {
fileExists: (path) => {
return src_files[path] !== undefined;
},
directoryExists: (path) => {
return true;
},
getCurrentDirectory: () => "/",
getDirectories: () => [],
getCanonicalFileName: (path) => path,
getNewLine: () => "\n",
getDefaultLibFileName: () => "",
getSourceFile: (path) => src_files[path],
readFile: (path) => undefined,
useCaseSensitiveFileNames: () => true,
writeFile: (path, data) => js_code = `${js_code}\n${data}`
};
const compile_options = {
"target": "es6",
"skipLibCheck": true,
"downlevelIteration": true
};
// Allow user override compile options
if(this.job.data.options)
{
for(let k in this.job.data.options)
{
compile_options[k] = this.job.data.options[k];
}
}
console.log("TS compile options", compile_options);
const program = ts.createProgram(files,compile_options , host);
const result = program.emit();
const diagnostics = result.diagnostics.concat((ts.getPreEmitDiagnostics(program)));
const errors = [];
if (diagnostics.length > 0) {
diagnostics.forEach(diagnostic => {
let err_msg = "";
if (diagnostic.file) {
let { line, character } = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
let message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
err_msg = `${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`;
} else {
err_msg = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
}
errors.push(err_msg);
this.log_error(err_msg);
});
return this.error(errors);
}
// write to file
this.save_file(this.job.data.dest,js_code)
.then(r => {
if(r.error)
{
this.log_error(error);
return this.error(r.error);
}
this.result(this.job.data.dest);
})
.catch(e1 => this.error(e1));
})
.catch(e => this.error(e));
}
}
API.jobhandle["ts-import"] = TSJob;
API.jobhandle["ts-compile"] = TSJob;