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: {