@webwriter/code
Version:
Write and run code as a code cell. Supports several languages (HTML, JavaScript/TypeScript, Python, Java, WebAssembly).
46 lines (40 loc) • 1.74 kB
text/typescript
import { javascript } from "@codemirror/lang-javascript";
import { localized } from "@lit/localize";
import { customElement } from "lit/decorators.js";
import { DiagnosticCategory, getLineAndCharacterOfPosition, ModuleKind, transpileModule } from "typescript";
import { style } from "../shared/ww-code-css-single";
import { jsTemplateStyle } from "./shared/ww-code-js-css";
import CodeJsTemplate from "./shared/ww-code-js-template";
/** Code widget for TypeScript with compilation and execution capabilities. */
("webwriter-code-typescript")
()
export default class CodeTypeScript extends CodeJsTemplate {
static styles = [style, jsTemplateStyle] as any;
constructor() {
super("TypeScript", javascript());
}
build(code: string): string {
this.diagnostics = [];
const out = transpileModule(code, {
compilerOptions: {
module: ModuleKind.CommonJS,
strict: true,
},
reportDiagnostics: true,
});
if (out.diagnostics?.find((d) => d.category === DiagnosticCategory.Error)) {
this.diagnostics = out.diagnostics
.filter((d) => d.category === DiagnosticCategory.Error)
.filter((d) => d.file && d.start && d.messageText)
.map((d) => ({
message: d.messageText.toString(),
start: d.start!,
line: getLineAndCharacterOfPosition(d.file!, d.start!).line + 1,
character: getLineAndCharacterOfPosition(d.file!, d.start!).character + 1,
}));
throw "Compilation failed";
} else {
return out.outputText;
}
}
}