import { Doc, DocListCast } from "../../fields/Doc"; import { List } from "../../fields/List"; import { Docs } from "../documents/Documents"; import { Scripting, ScriptParam } from "./Scripting"; import { StrCast } from "../../fields/Types"; export class ScriptManager { private static _instance: ScriptManager; public static get Instance(): ScriptManager { return this._instance || (this._instance = new this()); } private constructor() { } public get ScriptManagerDoc(): Doc | undefined { return Docs.Prototypes.MainScriptDocument(); } public getAllScripts(): Doc[] { const sdoc = ScriptManager.Instance.ScriptManagerDoc; if (sdoc) { const docs = DocListCast(sdoc.data); return docs; } return []; } public addScript(scriptDoc: Doc): boolean { const scriptList = ScriptManager.Instance.getAllScripts(); scriptList.push(scriptDoc); if (ScriptManager.Instance.ScriptManagerDoc) { ScriptManager.Instance.ScriptManagerDoc.data = new List(scriptList); return true; } return false; } public deleteScript(scriptDoc: Doc): boolean { const scriptList = ScriptManager.Instance.getAllScripts(); const index = ScriptManager.Instance.getAllScripts().indexOf(scriptDoc); if (index > -1) { scriptList.splice(index, 1); if (ScriptManager.Instance.ScriptManagerDoc) { ScriptManager.Instance.ScriptManagerDoc.data = new List(scriptList); return true; } } return false; } } const scriptList = ScriptManager.Instance.getAllScripts(); scriptList.forEach((scriptDoc: Doc) => { const p = scriptDoc.compileParams?.reduce((o: ScriptParam, p: string) => { o[p] = "any"; return o; }, {} as ScriptParam); const f = new Function(...Array.from(Object.keys(p)), StrCast(scriptDoc.rawScript)); Scripting.addGlobal(f, StrCast(scriptDoc.description), StrCast(p), StrCast(scriptDoc.name)); });