Files
FreeCADWasmDev/tools/run_p6_mesh_boundary_probe.mjs
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

49 lines
4.7 KiB
JavaScript

#!/usr/bin/env node
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
const sourceRoot = path.join(root, "freecad-source");
const docs = path.join(root, "docs/p6");
const read = (relative) => fs.readFileSync(path.join(sourceRoot, relative), "utf8");
const lineNumbers = (text, pattern) => text.split(/\r?\n/).flatMap((line, index) => pattern.test(line) ? [index + 1] : []);
const sourceFiles = ["src/Mod/Mesh/CMakeLists.txt", "src/Mod/Mesh/App/CMakeLists.txt", "src/Mod/Mesh/Gui/CMakeLists.txt", "src/Mod/Mesh/App/AppMesh.cpp", "src/Mod/Mesh/App/AppMeshPy.cpp", "src/Mod/Mesh/Gui/AppMeshGui.cpp"];
const contents = Object.fromEntries(sourceFiles.map((file) => [file, read(file)]));
const app = contents["src/Mod/Mesh/App/AppMesh.cpp"];
const python = contents["src/Mod/Mesh/App/AppMeshPy.cpp"];
const gui = contents["src/Mod/Mesh/Gui/AppMeshGui.cpp"];
const report = {
schema: "freecad-web-p6-mesh-source-boundary/v1",
taskId: "FW-P6-MSH-A",
module: "Mesh",
result: "pass_boundary",
sourceRevision: execFileSync("git", ["-C", sourceRoot, "rev-parse", "HEAD"], { encoding: "utf8" }).trim(),
commands: ["rg -n \"BUILD_|Init|addObject|registerType|PyInit\" src/Mod/Mesh"],
cmake: {
module: { file: "src/Mod/Mesh/CMakeLists.txt", guiGuardLines: lineNumbers(contents["src/Mod/Mesh/CMakeLists.txt"], /BUILD_GUI/), appSubdirectoryLine: lineNumbers(contents["src/Mod/Mesh/CMakeLists.txt"], /add_subdirectory\(App\)/)[0], guiSubdirectoryLine: lineNumbers(contents["src/Mod/Mesh/CMakeLists.txt"], /add_subdirectory\(Gui\)/)[0] },
app: { file: "src/Mod/Mesh/App/CMakeLists.txt", target: "Mesh", dependencies: ["FreeCADBase", "FreeCADApp", "QtConcurrent"], linkLine: lineNumbers(contents["src/Mod/Mesh/App/CMakeLists.txt"], /target_link_libraries\(Mesh/)[0] },
gui: { file: "src/Mod/Mesh/Gui/CMakeLists.txt", target: "MeshGui", dependencies: ["Mesh", "FreeCADGui", "OpenGL/GLU", "Boost"], linkLine: lineNumbers(contents["src/Mod/Mesh/Gui/CMakeLists.txt"], /target_link_libraries\(MeshGui/)[0] },
},
appBoundary: {
moduleEntry: { file: "src/Mod/Mesh/App/AppMesh.cpp", lines: lineNumbers(app, /PyMOD_INIT_FUNC\(Mesh\)/), symbol: "PyMOD_INIT_FUNC(Mesh)" },
pythonBindings: { file: "src/Mod/Mesh/App/AppMesh.cpp", lines: lineNumbers(app, /addType\(&Mesh::/), names: ["MeshPoint", "Edge", "Facet", "Mesh", "Feature"] },
nativeRegistration: { file: "src/Mod/Mesh/App/AppMesh.cpp", lines: lineNumbers(app, /Mesh::[A-Za-z0-9_]+\s*::init\(\)/), count: lineNumbers(app, /Mesh::[A-Za-z0-9_]+\s*::init\(\)/).length },
pythonEntry: { file: "src/Mod/Mesh/App/AppMeshPy.cpp", lines: lineNumbers(python, /PyInit|initModule/), symbol: "Mesh Python generated bindings" },
},
guiBoundary: { moduleEntry: { file: "src/Mod/Mesh/Gui/AppMeshGui.cpp", lines: lineNumbers(gui, /PyMOD_INIT_FUNC\(MeshGui\)/), symbol: "PyMOD_INIT_FUNC(MeshGui)" }, guiOnly: true, excludedDependencies: ["FreeCADGui", "OpenGL", "Qt Widgets", "pivy.coin"] },
actionEntrypoints: [
{ file: "src/Mod/Mesh/App/Importer.cpp", kind: "mesh import into Mesh::Feature" },
{ file: "src/Mod/Mesh/App/Exporter.cpp", kind: "mesh export from Mesh::Feature" },
{ file: "src/Mod/Mesh/App/FeatureMeshTransform.cpp", kind: "native mesh transform" },
{ file: "src/Mod/Mesh/App/FeatureMeshSetOperations.cpp", kind: "mesh set operations" },
{ file: "src/Mod/Mesh/App/FeatureMeshDefects.cpp", kind: "mesh defect repair" },
],
sourceSha256: Object.fromEntries(sourceFiles.map((file) => [file, crypto.createHash("sha256").update(contents[file]).digest("hex")])),
conditions: { gui: "BUILD_GUI gates MeshGui and InitGui.py", app: "Mesh App target has no GUI dependency", missingDependencies: ["QtConcurrent for App target", "OpenGL/FreeCADGui for MeshGui"] },
boundaries: ["Mesh App and MeshGui are separate targets; GUI commands and view providers remain excluded from the Web App boundary.", "This card records source existence and dependency boundaries only; no WASM runtime, Facade, Chrome, or persistence result is inferred."]
};
fs.writeFileSync(path.join(docs, "mesh-source-boundary.json"), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(path.join(root, "docs/freecad-p6-mesh-a-boundary.log"), `${JSON.stringify({ result: report.result, sourceRevision: report.sourceRevision, appNativeRegistrationCount: report.appBoundary.nativeRegistration.count, guiGuardLines: report.cmake.module.guiGuardLines })}\n`);
console.log(JSON.stringify({ result: report.result, appNativeRegistrationCount: report.appBoundary.nativeRegistration.count, appEntry: report.appBoundary.moduleEntry.lines[0], guiEntry: report.guiBoundary.moduleEntry.lines[0] }));