diff --git a/electron/main/index.ts b/electron/main/index.ts index 926f312..f56199e 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -59,7 +59,7 @@ if (buildOutput || buildProject || buildHelp) { b3util.initWorkdir(workdir, (msg) => { console.error(`${msg}`); }); - const hasError = b3util.buildProject(project, buildDir); + const hasError = await b3util.buildProject(project, buildDir); if (hasError) { console.error("build failed***"); app.quit(); @@ -142,7 +142,6 @@ async function createWindow(projectPath?: string) { // Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation nodeIntegration: true, contextIsolation: false, - webSecurity: false, }, }); diff --git a/index.html b/index.html index 5fca809..33d5999 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - + Behavior3 Editor diff --git a/sample/scripts/build.js b/sample/scripts/build.js index ab2cf44..0152bf8 100644 --- a/sample/scripts/build.js +++ b/sample/scripts/build.js @@ -36,23 +36,24 @@ onComplete?(status: "success" | "failure"): void; } */ -({ - onSetup: (env) => { - console.log("onSetup", env); - console.log(env.workdir); - console.log(env.nodeDefs.get("Wait")); - console.log(env.path.dirname("sample/scripts/build.js")); - console.log(env.fs.readFileSync("sample/scripts/build.js", "utf8")); - }, - processTree: (tree) => { - console.log(`processTree ${tree.name}`); - return tree; - }, - processNode: (node, tree) => { - console.log(`processNode ${tree.name} ${node.name}#${node.id}`); - return node; - }, - onComplete: (status) => { - console.log(`onComplete ${status}`); - }, -}); +export const onSetup = (env) => { + console.log("onSetup", env); + console.log(env.workdir); + console.log(env.nodeDefs.get("Wait")); + console.log(env.path.dirname("sample/scripts/build.js")); + console.log(env.fs.readFileSync("sample/scripts/build.js", "utf8")); +}; + +export const processTree = (tree) => { + console.log(`processTree ${tree.name}`); + return tree; +}; + +export const processNode = (node, tree) => { + console.log(`processNode ${tree.name} ${node.name}#${node.id}`); + return node; +}; + +export const onComplete = (status) => { + console.log(`onComplete ${status}`); +}; diff --git a/sample/scripts/test.js b/sample/scripts/test.js index ea156dc..01c8696 100644 --- a/sample/scripts/test.js +++ b/sample/scripts/test.js @@ -36,18 +36,17 @@ onComplete?(status: "success" | "failure"): void; } */ -({ - processTree: (tree) => { - console.log(`processTree ${tree.name}`); - if (tree.name == "hero") { - return tree; - } - }, - processNode: (node, tree) => { - console.log(`processNode ${tree.name}.${node.id}`); - if (node.name == "GetPos") { - return null; - } - return node; - }, -}); + +export const onSetup = (env) => { + console.log(env); +}; + +export const processTree = (tree) => { + console.log(`processTree ${tree.name}`); + return tree; +}; + +export const processNode = (node, tree) => { + console.log(`processNode ${tree.name}.${node.id}`); + return node; +}; diff --git a/src/contexts/workspace-context.ts b/src/contexts/workspace-context.ts index 874ab07..a1093fc 100644 --- a/src/contexts/workspace-context.ts +++ b/src/contexts/workspace-context.ts @@ -377,7 +377,7 @@ export const useWorkspace = create((set, get) => ({ } }, - buildProject: () => { + buildProject: async () => { const workspace = get(); if (workspace.path) { if (!buildDir) { @@ -394,7 +394,7 @@ export const useWorkspace = create((set, get) => ({ const debug = console.debug; console.debug = () => {}; try { - const hasError = b3util.buildProject(workspace.path, buildDir); + const hasError = await b3util.buildProject(workspace.path, buildDir); if (hasError) { message.error(i18n.t("buildFailed")); } else { @@ -409,7 +409,7 @@ export const useWorkspace = create((set, get) => ({ } }, - batchProject: () => { + batchProject: async () => { const workspace = get(); const scriptPath = dialog.showOpenDialogSync({ properties: ["openFile"], @@ -420,8 +420,7 @@ export const useWorkspace = create((set, get) => ({ let hasError = false; try { console.log("run script", scriptPath); - const str = fs.readFileSync(scriptPath, "utf8"); - const batch = eval(str) as b3util.BatchScript; + const batch = await b3util.loadModule(scriptPath); batch.onSetup?.({ fs, path: Path, diff --git a/src/misc/b3util.ts b/src/misc/b3util.ts index b27624e..3668ca2 100644 --- a/src/misc/b3util.ts +++ b/src/misc/b3util.ts @@ -1,6 +1,5 @@ import * as fs from "fs"; import { ExpressionEvaluator, NodeDef } from "../behavior3/src/behavior3"; -import { type WorkspaceModel } from "../contexts/workspace-context"; import { FileVarDecl, ImportDef, @@ -19,7 +18,7 @@ import { VERSION, } from "./b3type"; import Path from "./path"; -import { readJson, readTree } from "./util"; +import { readJson, readTree, readWorkspace } from "./util"; export class NodeDefs extends Map { get(key: string): NodeDef { @@ -813,9 +812,9 @@ export const processBatch = (tree: TreeModel | null, path: string, batch: BatchS return tree; }; -export const buildProject = (project: string, buildDir: string) => { +export const buildProject = async (project: string, buildDir: string) => { let hasError = false; - const settings = readJson(project).settings; + const settings = readWorkspace(project).settings; let buildScript: BatchScript | undefined; if (settings.checkExpr) { setCheckExpr(true); @@ -823,7 +822,7 @@ export const buildProject = (project: string, buildDir: string) => { if (settings.buildScript) { const scriptPath = workdir + "/" + settings.buildScript; try { - buildScript = eval(fs.readFileSync(scriptPath, "utf8")); + buildScript = await loadModule(scriptPath); } catch (e) { console.error(`'${scriptPath}' is not a valid build script`); } @@ -870,6 +869,16 @@ export const buildProject = (project: string, buildDir: string) => { return hasError; }; +export const loadModule = async (path: string) => { + try { + const module = await import(path); + return module; + } catch (e) { + console.error(`load module error: ${path}`, e); + } + return null; +}; + export const createFileData = (data: TreeGraphData, includeSubtree?: boolean) => { const nodeData: NodeModel = { id: Number(data.id), diff --git a/vite.config.ts b/vite.config.ts index bbcd111..5eab7b8 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -9,7 +9,6 @@ import pkg from "./package.json"; export default defineConfig(({ command }) => { rmSync("dist-electron", { recursive: true, force: true }); - const isServe = command === "serve"; const isBuild = false; //command === "build"; const sourcemap = true; //isServe || !!process.env.VSCODE_DEBUG; @@ -38,6 +37,7 @@ export default defineConfig(({ command }) => { vite: { build: { sourcemap, + target: ["chrome89", "edge89", "firefox89", "safari15"], minify: isBuild, outDir: "dist-electron/main", rollupOptions: {