diff --git a/.mise/tasks/build.ts b/.mise/tasks/build.ts index 3cbd09de9..e52ab01f0 100755 --- a/.mise/tasks/build.ts +++ b/.mise/tasks/build.ts @@ -1,7 +1,31 @@ #!/usr/bin/env bun -//MISE description="Run all build tasks" -//MISE depends=["build:check-elm-docs", "build:cli", "build:cli2", "build:treeview", "build:morphir-ts", "build:dev-server", "build:components", "build:try-morphir"] +//MISE description="Run all build tasks (orchestrates elm work serially to avoid Windows races)" -import { log } from "./_lib.ts"; +import { exec, log, ROOT_DIR } from "./_lib.ts"; + +// elm make is not concurrent-write-safe on Windows: multiple processes race on +// ~/.elm//artifacts.dat and per-project elm-stuff/, producing +// "PROBLEM BUILDING DEPENDENCIES" failures. Most build tasks here invoke elm +// directly (build:cli, build:cli2, build:dev-server, build:try-morphir, +// build:check-elm-docs) or indirectly via node-elm-compiler in cli/morphir-elm.js +// (build:morphir-ts), so we run everything serially. +// +// mise reads `//MISE depends=` headers but its scheduler parallelizes any tasks +// whose deps are satisfied rather than enforcing strict ordering, so we orchestrate +// explicitly here. `--skip-deps` prevents the subtasks from re-running their own +// declared deps (which would otherwise repeatedly trigger build:cli, etc.). The +// `sources` and `outputs` declarations on each subtask let mise skip re-running +// a task whose inputs haven't changed. +const run = (task: string) => + exec("mise", ["run", "--skip-deps", task], { cwd: ROOT_DIR }); + +await run("build:check-elm-docs"); +await run("build:cli"); +await run("build:cli2"); +await run("build:dev-server"); +await run("build:try-morphir"); +await run("build:components"); // concat: depends on dev-server output +await run("build:morphir-ts"); // invokes elm via cli/morphir-elm.js +await run("build:treeview"); // webpack only, no elm log("build", "All build tasks completed"); diff --git a/.mise/tasks/build/check-elm-docs.ts b/.mise/tasks/build/check-elm-docs.ts index cfefcb95d..8db82d423 100755 --- a/.mise/tasks/build/check-elm-docs.ts +++ b/.mise/tasks/build/check-elm-docs.ts @@ -1,5 +1,7 @@ #!/usr/bin/env bun //MISE description="Check Elm documentation compiles" +//MISE sources=["src/**/*.elm", "elm.json"] +//MISE outputs=["docs.json"] import { elmMake, log } from "../_lib.ts"; diff --git a/.mise/tasks/build/cli.ts b/.mise/tasks/build/cli.ts index 0598d296d..303b12a82 100755 --- a/.mise/tasks/build/cli.ts +++ b/.mise/tasks/build/cli.ts @@ -1,6 +1,8 @@ #!/usr/bin/env bun //MISE description="Build CLI (Elm compilation)" //MISE depends=["build:check-elm-docs"] +//MISE sources=["src/**/*.elm", "cli/src/**/*.elm", "cli/elm.json"] +//MISE outputs=["cli/Morphir.Elm.CLI.js", "cli/Morphir.Elm.DevCLI.js"] import { elmMake, log, PATHS } from "../_lib.ts"; diff --git a/.mise/tasks/build/cli2.ts b/.mise/tasks/build/cli2.ts index dbb6bc6fc..d3bdfec44 100755 --- a/.mise/tasks/build/cli2.ts +++ b/.mise/tasks/build/cli2.ts @@ -1,6 +1,8 @@ #!/usr/bin/env bun //MISE description="Build CLI2 (TypeScript + Elm in parallel)" //MISE depends=["build:cli"] +//MISE sources=["src/**/*.elm", "cli2/src/**/*.elm", "cli2/elm.json", "cli2/*.ts"] +//MISE outputs=["cli2/Morphir.Elm.CLI.cjs", "cli2/lib/**/*.js"] import { elmMake, log, PATHS, join } from "../_lib.ts"; import { mkdir, rm } from "fs/promises"; diff --git a/.mise/tasks/build/dev-server.ts b/.mise/tasks/build/dev-server.ts index 9f07fcc41..01a177755 100755 --- a/.mise/tasks/build/dev-server.ts +++ b/.mise/tasks/build/dev-server.ts @@ -1,28 +1,27 @@ #!/usr/bin/env bun //MISE description="Build development server Elm components" //MISE depends=["build:cli"] +//MISE sources=["src/**/*.elm", "cli/src/**/*.elm", "cli/elm.json"] +//MISE outputs=["cli/web/index.js", "cli/web/insight.js", "cli/web/insightapp.js"] import { elmMake, log, PATHS } from "../_lib.ts"; log("build:dev-server", "Building dev server Elm components..."); -// Build all dev server components in parallel -await Promise.all([ - // Main dev server app - elmMake(["src/Morphir/Web/DevelopApp.elm"], { - cwd: PATHS.cli, - output: "web/index.js", - }), - // Insight API - elmMake(["src/Morphir/Web/Insight.elm"], { - cwd: PATHS.cli, - output: "web/insight.js", - }), - // Dev server API variant - elmMake(["src/Morphir/Web/DevelopApp.elm"], { - cwd: PATHS.cli, - output: "web/insightapp.js", - }), -]); +// Sequential: concurrent elm make calls against the same elm.json race on +// cli/elm-stuff and ~/.elm//artifacts.dat, producing +// "PROBLEM BUILDING DEPENDENCIES" failures on Windows. +await elmMake(["src/Morphir/Web/DevelopApp.elm"], { + cwd: PATHS.cli, + output: "web/index.js", +}); +await elmMake(["src/Morphir/Web/Insight.elm"], { + cwd: PATHS.cli, + output: "web/insight.js", +}); +await elmMake(["src/Morphir/Web/DevelopApp.elm"], { + cwd: PATHS.cli, + output: "web/insightapp.js", +}); log("build:dev-server", "Done"); diff --git a/.mise/tasks/build/morphir-ts.ts b/.mise/tasks/build/morphir-ts.ts index a7380c5be..41413432a 100755 --- a/.mise/tasks/build/morphir-ts.ts +++ b/.mise/tasks/build/morphir-ts.ts @@ -1,6 +1,8 @@ #!/usr/bin/env bun //MISE description="Build Morphir TypeScript library" //MISE depends=["build:cli", "build:cli2"] +//MISE sources=["src/**/*.elm", "morphir.json", "morphir-ts/tsconfig.json", "morphir-ts/src/sdk/**/*", "cli/Morphir.Elm.CLI.js", "cli/Morphir.Elm.DevCLI.js", "cli2/Morphir.Elm.CLI.cjs"] +//MISE outputs=["morphir-ir.json", "morphir-ts/dist/**/*.js", "morphir-ts/src/generated/**/*.ts"] import { del, morphirMake, morphirGen, exec, log, PATHS, ROOT_DIR, copyGlob, join } from "../_lib.ts"; diff --git a/.mise/tasks/build/treeview.ts b/.mise/tasks/build/treeview.ts index b14070dff..9e8bb53a5 100755 --- a/.mise/tasks/build/treeview.ts +++ b/.mise/tasks/build/treeview.ts @@ -1,6 +1,8 @@ #!/usr/bin/env bun //MISE description="Build treeview webpack bundle" //MISE depends=["build:check-elm-docs"] +//MISE sources=["cli/treeview/src/*", "cli/treeview/webpack.config.js", "cli/treeview/tsconfig.json"] +//MISE outputs=["cli/treeview/dist/bundle.js", "cli/treeview/dist/index.html"] import { exec, log, PATHS, ROOT_DIR } from "../_lib.ts"; diff --git a/.mise/tasks/build/try-morphir.ts b/.mise/tasks/build/try-morphir.ts index cd873f1c7..7337adaea 100755 --- a/.mise/tasks/build/try-morphir.ts +++ b/.mise/tasks/build/try-morphir.ts @@ -1,6 +1,8 @@ #!/usr/bin/env bun //MISE description="Build Try Morphir web app" //MISE depends=["build:cli"] +//MISE sources=["src/**/*.elm", "cli/src/**/*.elm", "cli/elm.json"] +//MISE outputs=["cli/web/try-morphir.html"] import { elmMake, log, PATHS } from "../_lib.ts";