#!/usr/bin/env node /* build.cjs — emit the STLs. Geometry lives in models.cjs; validation in test-fit.cjs. Nothing is written unless the mesh check passes, so a bad model cannot reach the printer. */ 'use strict'; const fs = require('fs'); const path = require('path'); const { benchPlate, fitGauge } = require('./models.cjs'); const OUT = process.argv[2] || __dirname; fs.mkdirSync(OUT, { recursive: true }); let bad = 0; for (const [name, built, note] of [ ['esp32-bench-plate', benchPlate(), 'dankbuild bench plate - ESP32-S3-DevKitC-1 + BB400 breadboard'], ['esp32-fit-gauge', fitGauge(), 'dankbuild fit gauge - measures DevKitC-1 board width'], ]) { const v = built.m.check(); const b = built.m.bounds(); if (!v.ok) { bad++; console.error(`${name}: MESH INVALID - ${v.problems.join('; ')} (not written)`); continue; } const file = path.join(OUT, name + '.stl'); fs.writeFileSync(file, built.m.stl(note)); console.log(`${name}.stl - ${v.triangles} triangles / ${v.solids} solids, no interpenetration`); console.log(` ${b.size.map((n) => n.toFixed(1)).join(' x ')} mm, ${(fs.statSync(file).size / 1024).toFixed(1)} KB`); if (built.meta.widths) console.log(` channels ${built.meta.widths.join(' / ')} mm - 1 rib = narrowest`); else console.log(` breadboard bay ${built.meta.bbBayW.toFixed(1)} x ${built.meta.bbBayD.toFixed(1)} mm` + `, devkit bay ${built.meta.dkBayW.toFixed(1)} mm wide, open-ended (board overhangs ${built.meta.overhang.toFixed(1)} mm total)`); } process.exit(bad ? 1 : 0);