import { cp, mkdir, readdir, rm, readFile } from "node:fs/promises"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; const appRoot = dirname(dirname(fileURLToPath(import.meta.url))); const repoRoot = dirname(dirname(appRoot)); const distDir = join(appRoot, "dist"); await rm(distDir, { recursive: true, force: true }); await mkdir(distDir, { recursive: true }); await cp(join(appRoot, "index.html"), join(distDir, "index.html")); await cp(join(appRoot, "src"), join(distDir, "src"), { recursive: true }); await copyLinuxCncManifest(); await copyLinuxCncConfigAssets(); await copyLinuxCncReferenceAssets(); await copyBundledTestLinuxCncSourceAssets(); await copyKinematicsRuntimeAssets(); await copyInterpreterRuntimeAssets(); await copyTpRuntimeAssets(); await copyTaskHalRuntimeAssets(); const packageJson = JSON.parse(await readFile(join(appRoot, "package.json"), "utf8")); const forbiddenDependencies = ["react", "vue", "@angular/core", "svelte"]; const dependencyNames = [ ...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.devDependencies || {}), ]; const forbidden = dependencyNames.filter((name) => forbiddenDependencies.includes(name)); if (forbidden.length > 0) { throw new Error(`forbidden frontend framework dependency detected: ${forbidden.join(", ")}`); } async function copyInterpreterRuntimeAssets() { const coreSrcDir = join(repoRoot, "wasm-port/build/wasm/core"); const coreDistDir = join(distDir, "wasm-port/build/wasm/core"); await mkdir(coreDistDir, { recursive: true }); for (const entry of ["linuxcnc_interp.js", "linuxcnc_interp.wasm"]) { await cp(join(coreSrcDir, entry), join(coreDistDir, entry)); } } async function copyTpRuntimeAssets() { const tpSrcDir = join(repoRoot, "wasm-port/build/wasm/tp"); const tpDistDir = join(distDir, "wasm-port/build/wasm/tp"); await mkdir(tpDistDir, { recursive: true }); for (const entry of ["linuxcnc_tp.js", "linuxcnc_tp.wasm"]) { await cp(join(tpSrcDir, entry), join(tpDistDir, entry)); } } async function copyTaskHalRuntimeAssets() { const taskHalSrcDir = join(repoRoot, "wasm-port/build/wasm/task-hal"); const taskHalDistDir = join(distDir, "wasm-port/build/wasm/task-hal"); await mkdir(taskHalDistDir, { recursive: true }); for (const entry of ["linuxcnc_task_hal.js", "linuxcnc_task_hal.wasm"]) { await cp(join(taskHalSrcDir, entry), join(taskHalDistDir, entry)); } } console.log("gmoccapy_static_build=ok"); async function copyLinuxCncConfigAssets() { const configSrcDir = join(repoRoot, "wasm-port/vendor/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting"); const configDistDir = join(distDir, "configs/sim/axis/vismach/5axis/table-rotary-tilting"); const vendorConfigDistDir = join(distDir, "wasm-port/vendor/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting"); const gmoccapyConfigSrcDir = join(repoRoot, "wasm-port/vendor/linuxcnc/configs/sim/gmoccapy"); const gmoccapyConfigDistDir = join(distDir, "configs/sim/gmoccapy"); const gmoccapyVendorConfigDistDir = join(distDir, "wasm-port/vendor/linuxcnc/configs/sim/gmoccapy"); await mkdir(configDistDir, { recursive: true }); await mkdir(vendorConfigDistDir, { recursive: true }); await mkdir(gmoccapyConfigDistDir, { recursive: true }); await mkdir(gmoccapyVendorConfigDistDir, { recursive: true }); await cp(configSrcDir, configDistDir, { recursive: true }); await cp(configSrcDir, vendorConfigDistDir, { recursive: true }); await cp(gmoccapyConfigSrcDir, gmoccapyConfigDistDir, { recursive: true }); await cp(gmoccapyConfigSrcDir, gmoccapyVendorConfigDistDir, { recursive: true }); } async function copyLinuxCncReferenceAssets() { const linuxCncSrcDir = join(repoRoot, "linuxcnc"); const linuxCncDistDir = join(distDir, "linuxcnc"); await mkdir(linuxCncDistDir, { recursive: true }); for (const entry of [ "configs/sim/gmoccapy", "nc_files", ]) { await cp(join(linuxCncSrcDir, entry), join(linuxCncDistDir, entry), { recursive: true }); } } async function copyBundledTestLinuxCncSourceAssets() { const testSourceDir = join(repoRoot, "web-rtcp-5axis-sim-plan/working_run/test_linuxcnc_source"); const testSourceDistDir = join(distDir, "working_run/test_linuxcnc_source"); await mkdir(testSourceDistDir, { recursive: true }); await cp(testSourceDir, testSourceDistDir, { recursive: true }); } async function copyLinuxCncManifest() { const manifestDistDir = join(distDir, "wasm-port/tools"); await mkdir(manifestDistDir, { recursive: true }); await cp( join(repoRoot, "wasm-port/tools/source-manifest.txt"), join(manifestDistDir, "source-manifest.txt"), ); } async function copyKinematicsRuntimeAssets() { const sdkSrcDir = join(repoRoot, "wasm-port/runtime/sdk/src"); const sdkDistDir = join(distDir, "wasm-port/runtime/sdk/src"); await mkdir(sdkDistDir, { recursive: true }); await cp( join(sdkSrcDir, "linuxcnc-kinematics.js"), join(sdkDistDir, "linuxcnc-kinematics.js"), ); for (const entry of [ "linuxcnc-interp.js", "linuxcnc-hal.js", "linuxcnc-tp.js", "linuxcnc-task-hal.js", "sim-config-staging.js", ]) { await cp(join(sdkSrcDir, entry), join(sdkDistDir, entry)); } const kinematicsSrcDir = join(repoRoot, "wasm-port/build/wasm/kinematics"); const kinematicsDistDir = join(distDir, "wasm-port/build/wasm/kinematics"); await mkdir(kinematicsDistDir, { recursive: true }); for (const entry of await readdir(kinematicsSrcDir)) { if (!/^linuxcnc_.*_kinematics\.(js|wasm)$/.test(entry)) continue; await cp(join(kinematicsSrcDir, entry), join(kinematicsDistDir, entry)); } }