diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Main.tsx | 3 | ||||
-rw-r--r-- | src/util/Scripting.ts | 47 |
2 files changed, 50 insertions, 0 deletions
diff --git a/src/Main.tsx b/src/Main.tsx index 247733d3a..1fc0ffe7f 100644 --- a/src/Main.tsx +++ b/src/Main.tsx @@ -12,6 +12,8 @@ import { TextField } from './fields/TextField'; import "./Main.scss"; import { ContextMenu } from './views/ContextMenu'; import { DocumentView } from './views/nodes/DocumentView'; +import { CompileScript } from './util/Scripting'; + configure({ enforceActions: "observed" @@ -76,6 +78,7 @@ document.addEventListener("pointerdown", action(function (e: PointerEvent) { mainNodes.Data.push(doc6); mainContainer.SetField(KeyStore.Data, mainNodes); } +//} //); ReactDOM.render(( diff --git a/src/util/Scripting.ts b/src/util/Scripting.ts new file mode 100644 index 000000000..94339e7fe --- /dev/null +++ b/src/util/Scripting.ts @@ -0,0 +1,47 @@ +// import * as ts from "typescript" +let ts = (window as any).ts; +import { Opt, Field } from "../fields/Field"; +import { Document as DocumentImport } from "../fields/Document"; +import { NumberField as NumberFieldImport } from "../fields/NumberField"; +import { TextField as TextFieldImport } from "../fields/TextField"; +import { RichTextField as RichTextFieldImport } from "../fields/RichTextField"; +import { KeyStore as KeyStoreImport } from "../fields/Key"; + +export interface ExecutableScript { + (): any; + + compiled: boolean; +} + +function ExecScript(script: string, diagnostics: Opt<any[]>): ExecutableScript { + const compiled = !(diagnostics && diagnostics.some(diag => diag.category == ts.DiagnosticCategory.Error)); + + let func: () => Opt<Field>; + if (compiled) { + func = function (): Opt<Field> { + let KeyStore = KeyStoreImport; + let Document = DocumentImport; + let NumberField = NumberFieldImport; + let TextField = TextFieldImport; + let RichTextField = RichTextFieldImport; + let window = undefined; + let document = undefined; + let retVal = eval(script); + + return retVal; + }; + } else { + func = () => undefined; + } + + return Object.assign(func, + { + compiled + }); +} + +export function CompileScript(script: string): ExecutableScript { + let result = (window as any).ts.transpileModule(script, {}) + + return ExecScript(result.outputText, result.diagnostics); +}
\ No newline at end of file |