{"_id":"trimesh-boolean","_rev":"29-ba05baa55ca7016f62a997079956c25d","name":"trimesh-boolean","dist-tags":{"latest":"0.7.3"},"versions":{"0.1.0":{"name":"trimesh-boolean","version":"0.1.0","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.1.0","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"27cfcf9f8e7ad43f9ef0f799a4d2b66ffd19d718","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.1.0.tgz","fileCount":43,"integrity":"sha512-Gfc0ktdF+bxVBzai3FjvBpTTTXQVYFEX36N+Zan+gtHGt+wDLd2xFxxA/xvjPOlmSwykBk4CPWaX2UNQBgq0ng==","signatures":[{"sig":"MEUCIQCwXiE3QBMAEZZLtLHRKaPqgEk7gh7Gf5VDs7Z64xRFMwIgUkCLLeL6+jDJTNYZRDth1KWVmGTk3UoS1c23UAiecUc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3200641},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"44f99b878da4c67b718cdaccfde4ef9ec089a704","scripts":{"dev":"vite examples","test":"vitest run","build":"rollup -c","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.6.2","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.1.0_1771998962193_0.20490419999654264","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"trimesh-boolean","version":"0.1.1","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.1.1","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"433ad7739b5f2936a14215360e6bcfd420ba9db5","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.1.1.tgz","fileCount":43,"integrity":"sha512-99t0/KeX8FhOBVbHwEzL5CCaWTnAKa1OzhWHRdGfsfNW7PdORGP14c4LM0NqPFarBf5WlkecutDiZnm0Uhusxw==","signatures":[{"sig":"MEQCIFmjqNNtyJgv/7Q6MOQniiGNiug+ZO2K1CYNDxqcpBTqAiBeXR+/xvpR6d/W5xOag41TrC1cJGOAsBovxgfOWLCeCQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3201007},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"0722221472a26809680a61c965a4d43dd31236dc","scripts":{"dev":"vite examples","test":"vitest run","build":"rollup -c","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.6.2","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.1.1_1771999301279_0.6957685601812889","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"trimesh-boolean","version":"0.2.0","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.2.0","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"e0867a382a671dfa6d362f745130eca45c8a4b09","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.2.0.tgz","fileCount":43,"integrity":"sha512-iQr15yr0qVXIjt4xHryT7NWGxvbubNWgai81t3UIcJb1oSQVVx7F1S9gxRT76Mry5yNebboXJwXDnGk0nifeCA==","signatures":[{"sig":"MEUCIE6jl7hBIUrw7zzBvotO404uonklVVbBZb4hLTzWq3WPAiEA5iedhkO2HwSwcespJPKBgDEDYlLxumkV1R6z7hkQE1A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3381315},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"fadf3d5342091ed36797c4c4e04d8f7384d16630","scripts":{"dev":"vite examples","test":"vitest run","build":"rollup -c","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.6.2","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.2.0_1772064860531_0.7592318145632484","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"trimesh-boolean","version":"0.3.0","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.3.0","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"50cb049fa23864c974fa4aa74299d0f91a74b36c","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.3.0.tgz","fileCount":45,"integrity":"sha512-TyI7IwHyNhPqcRiQdwhsPq+QzW5GgsG0N/uCd9P9cM9H7hPHGlGqPiTsz3HSfvSha3eb04O49SbndtkeILzhtA==","signatures":[{"sig":"MEQCIFJ0GBHwVYGi1lY7xATSr1VUddAd37DfjHdrNJaNh4I4AiBVytgkGNpDzLo0TkazieBMNte8rWKjKCm+RRrO0Qjf1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4238667},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"d043be02224483b95c36d3166d13b869b61fd769","scripts":{"dev":"vite examples","test":"vitest run","build":"rollup -c","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.6.2","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.3.0_1772630419876_0.8315353586476326","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"trimesh-boolean","version":"0.4.0","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.4.0","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"6a87bb584d66e28b6e7d4da28edeaf42be8f5dae","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.4.0.tgz","fileCount":52,"integrity":"sha512-ekFj+PpCOvQQZPzdQ/6NvnE7RFQ5O1BP04N+FFv2dVA+Sm3yMqJwe1fHBRuaf0roSVT855nuw6HdF9mAjMw/Ow==","signatures":[{"sig":"MEUCIQD/bbFY1L5Dtug7/PgNnh15udpkj4AiOQjDPiD4k50LIAIgKPOZ3DmnFJZdt4SAQUfvp7AmIKnYFIq7C+u6YE/3Q9w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4727349},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"1f83f1a0dd9b8f28fda21ccc6b0e6071be1a3848","scripts":{"dev":"vite examples","test":"vitest run","build":"rollup -c","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.9.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"25.6.1","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.4.0_1774020287659_0.7373046219623995","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"trimesh-boolean","version":"0.4.1","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.4.1","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"c21fbb45058490a04532a69c325bcf03d4c7d2d9","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.4.1.tgz","fileCount":52,"integrity":"sha512-3QjWbm1qhYsJb5sM11ClkR4cpnOf503K6/21QMc77gVACVHR/M6oqA78/DbDTfp+PI8Q6zcpnE7QmXGRDx8zqw==","signatures":[{"sig":"MEUCIQC79hkgIfs3IIZBr2643eBkTYvm/X+lKmnLaEfnPC4bMAIgTJTiRWEZ80BSqZm43K756Uo+mEafHQnYd/bCRoh9hko=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4750107},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"0d130172a9129a1b35e9df3952e599eafab5dfc5","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.9.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"25.6.1","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.4.1_1774254324009_0.7284197854088343","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"trimesh-boolean","version":"0.5.0","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.0","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"3d439535bb9ab42fa10e780d1514d349229ba534","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.0.tgz","fileCount":52,"integrity":"sha512-cwJ1mJStwotXUFuEyplGwufG6iCsZBjTbe/yFR0cqIQxSt0YgrjZxLU2MM4oYXikqrfisID3+UJu+ePgOUFGrA==","signatures":[{"sig":"MEUCIQDDawushDv7upRBsZ8mEiKao1pHSAqr6M/w9nyruQnM+QIgEisibfQihmbjcWpV4O8eSjJJZmyZkUBRWlDcwEWdAJU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4757800},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"dccc918f6d0753e51a5f4ab0ed0339d5b3e48366","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.9.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"25.6.1","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.0_1774274154395_0.7323998429245286","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"trimesh-boolean","version":"0.5.1","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.1","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"6fe565a18e70b9fa17263985aa959a56198396f1","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.1.tgz","fileCount":52,"integrity":"sha512-giM9vC21fgdMmSxyqnChbBRlEkOaFQUOLaKmP0s9iQNZnQ66vr226PbCv1ALLx1VYKn9AU3OyhrmO7hzhuRQ3g==","signatures":[{"sig":"MEUCIGNlqbVnWWoZz+VjFoPoscSZUMfxa9YaIEjaRwW+wBdOAiEAkaQ9a5wcxx9+bq73M+qC3BZo7LCNXC1GNg/5KulElEk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4794198},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"aff422769521dcc808ef25803cf8a22272b739b1","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.9.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"25.6.1","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.1_1774329874045_0.3335616701256745","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"trimesh-boolean","version":"0.5.2","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.2","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"d470027d2dfa448e5c5d083bf9f40f31e2cca5da","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.2.tgz","fileCount":52,"integrity":"sha512-tbpODTnvmAWmLHjZWvS7/DJk8Pei1NKMEy0GF375McCl2UPwm9Y8RGXGHjeYOJ5yPEIri2UP48US/N7AjGbK8g==","signatures":[{"sig":"MEUCIC7l6BIZ6AavXo5PvkIWFUCT8MjfwylDo50YXh0QIuIAAiEA8ndR0e1Nenu8a9WX3kGj9pMdiKE4V6uL7DIxLkCqSRY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4794198},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"b45fe1f52264a73551cc1a8a06d47036528d641a","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.9.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"25.6.1","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.2_1774330808537_0.6288366773325431","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"trimesh-boolean","version":"0.5.3","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.3","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"bf99afe326b7dbb59086c97711788061fa07c042","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.3.tgz","fileCount":52,"integrity":"sha512-7YJmIe797NMv1Y+na6Sg+KKuJ9qv2Tc90Wh/zqIECCbdM4Bb8AEXkIpIf3My3OfhM+ckKo3hFzBqQKBde2pkow==","signatures":[{"sig":"MEQCIEr7Et2V95VVYDqiIpd3tockLwQjYzzP6QzCX64bcZcCAiBD7GmJt9p66cHibZIA0NUNEyQUxCS6tykldXH6XZ/TnQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4805395},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"830a68b485653aa9e4431378693d59fa42b8b732","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.9.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"25.6.1","dependencies":{"delaunator":"^5.0.1","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.3_1774332898329_0.17585031737790247","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"trimesh-boolean","version":"0.5.4","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.4","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"25adf2dc74e200491b7950a16dc2d6d326002c08","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.4.tgz","fileCount":52,"integrity":"sha512-QGv+y3gBG7Ep/u3UWXSyUWDZdhasv9fmFG50KLx40BC4JvZWH9E38s58gA7LCkB9AvY0+G3fbYrzxS561uMyEA==","signatures":[{"sig":"MEQCIBl2CcI2/9biHci9G4pPpej2mtoRFiXbes5Vh/vI65KDAiBGRLJLJeAmYuYlthFg8xYfNHAPu4hAAYJOj89Cr9Pq4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5472288},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"8a14e6dc242cb04fbb5a919fd15a1b54ac109584","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.9.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.4_1774432001646_0.26624192673263236","host":"s3://npm-registry-packages-npm-production"}},"0.5.6":{"name":"trimesh-boolean","version":"0.5.6","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.6","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"155001a9e3ae9789d24d5e037ce07448083c460f","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.6.tgz","fileCount":53,"integrity":"sha512-nsdQJW0NE0sJqZryMa6k/8jcgg6fV7a5q3CmBtQvc1CoUBC/OxcYwRl6Tt0xqpB9DBuE0uWN9kSJ5NHnRGjGAQ==","signatures":[{"sig":"MEUCIQDtOd+yseZke18KgyAbQD+ZwVntON/aH5r22GiFNL6GNgIgB7RFGX3vPLohEoeVdf9fyafnhufGnl/CNf3avTIQ1CI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5691586},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"234967a72781c89013409eb1e6bb5bf896361db8","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.9.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.6_1774463740036_0.5337082516981031","host":"s3://npm-registry-packages-npm-production"}},"0.5.7":{"name":"trimesh-boolean","version":"0.5.7","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.7","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"9d812b0a3b7f94ac15e497c1fcc7227a8b5d3720","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.7.tgz","fileCount":55,"integrity":"sha512-Q3u6NBgxkKS0la+9LcKQN8gQYRMUxd4a4zjAYSTfBjgsmczs5wbB9gIratUO5K9JAY9ccsMXpFWysR/JxapyIA==","signatures":[{"sig":"MEUCIGozm0fzu+kLE4EPF5TcPr75E0nIoxYsBH2fWqY2cFkpAiEA1TbbXceaDEj5fFHdibZetsWi9g9+/3NTWXU+hc9Zmr0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5877517},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"96d1948380463a1442a1008a69d7666da206b4a4","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.7_1781192876738_0.7323192227296447","host":"s3://npm-registry-packages-npm-production"}},"0.5.8":{"name":"trimesh-boolean","version":"0.5.8","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.8","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"ca7570123039e930815db64cd082ba07331f3063","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.8.tgz","fileCount":57,"integrity":"sha512-RU/XJOrkWVPKW1GtB1ErlQ0ZVFZ649vlFDACAcBDxfKGSWU66RGu6HDmO/IMwVBd6oYXteAbJjXjQ19ivK5V3w==","signatures":[{"sig":"MEQCIERTRojspAab2vdxxq4vcAwqD0aqK4ccA+sfEuBQgX1IAiBNlgUQTObZYOuIEdUvyE/WfCh2EFueEabvgmciaLjorQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6168796},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"53994e15c975d6c667d175e0927cc90e610afede","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.8_1781257383118_0.5981199647359381","host":"s3://npm-registry-packages-npm-production"}},"0.5.9":{"name":"trimesh-boolean","version":"0.5.9","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.9","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"78658b55b68434ff31d4a23aa437cba868310084","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.9.tgz","fileCount":57,"integrity":"sha512-uVix/qAd6yjhGHe48gfyXIuxnGpi69fnq0T+aDqPYqqzNqgF3Er7r6IuNKCIv24TNGzOqvxrupphJ7vs6PzKfQ==","signatures":[{"sig":"MEQCIGniF0Q1kyQYN5q9f6iOWHVZG65MZ9U5ozQk0+pAtXs6AiBtn/sM0KzVx7thKO/YXO5YpNLBb6lxjrsSyqFgTyuNyw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6243217},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"aa4e2921bf40dabaf580975b80e12bb52f825f02","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.9_1781864970663_0.31841082563451106","host":"s3://npm-registry-packages-npm-production"}},"0.5.10":{"name":"trimesh-boolean","version":"0.5.10","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.10","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"f99e585a08b1118b668c3c171caa590fa9e2cfd3","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.10.tgz","fileCount":58,"integrity":"sha512-B3ANSyyQNBzkuhw7gIklOCKjlPRB1JWsZ6kvQnOTmskZ5by2GEwKx1lx9Rrzc9JcubqKPYkGwtz/QiuFj/wrnQ==","signatures":[{"sig":"MEUCIAOEhuMQ7AKUQ4NBVC+S8RFfwCuXgozWA7GuqzsGJsv7AiEAuvipaH+CEvfXG7RiJU5kCyRxpJdzPKfAY0WG/0QlDjk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6279365},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"12ec40efdbf6f4d8a8d0bebb5c065bd31c178ffd","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.10_1783688317667_0.5246871422666965","host":"s3://npm-registry-packages-npm-production"}},"0.5.11":{"name":"trimesh-boolean","version":"0.5.11","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.11","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"2ee114079f671e1fa3304267699db8ae4022b977","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.11.tgz","fileCount":58,"integrity":"sha512-N4OzPyb6Fluu2ACQnZj1OIV1ES1iZrdfN1tEsbsIuZzinlHx6vgSTOoJa21tjDR4133FPaLqPWG3Tdkpd9Jq4Q==","signatures":[{"sig":"MEUCIDqxSXwiCyavm2QXkDv7sKGDUgITNqmxELTSakua5ysDAiEAjBnoY/0taVAl0VC6wsWMTGOScDdR+k1E6rxP0E+plao=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6282463},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"55696ebe2f7b58be193a2056f10123be32736eb4","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.11_1783698878266_0.6984830794282353","host":"s3://npm-registry-packages-npm-production"}},"0.5.12":{"name":"trimesh-boolean","version":"0.5.12","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.5.12","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"0bd1a4021fd5c467e5e83c58e1565b95b1866256","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.5.12.tgz","fileCount":59,"integrity":"sha512-AMfNNJcGt3jrv/8wqH2fF6tHTzeq2TrWrx1hfD77oQgVVZsay+lbuD0UIla64i0MTBYnQ+RDgu0Om2J/32aJKg==","signatures":[{"sig":"MEYCIQDVtTliwqAd5++8o15gPSfeJ1JwNMwlgISH0adT9upd6AIhAK/Z9aPtTLihL6fSuExHGTMeeFjR0D9pNCmMxe4v+113","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6371972},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"0ac1cf61fab2ff8f703facfe757ab5adf6f82cce","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.5.12_1783743584292_0.3365480793790614","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"trimesh-boolean","version":"0.6.0","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.6.0","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"8de0827d4637055f44c893c7efa57b69326291ad","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.6.0.tgz","fileCount":65,"integrity":"sha512-tqAJFg8PHTjEY9pP01c87N5XWtXgJjhKwH+3Ag60yPzWA1fe84dWVsFJjQ5L5Sg7TKZx3is1YwSpF+2g6T8RFg==","signatures":[{"sig":"MEQCIGNZyguwDx0NAZL9Zmjdt/apm5kxyl59bhkJMxWecfg0AiAKaswZhbFB3+WFDve9WMYMq9kmZ0LU5EcAD84ejJXjJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7270023},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"0ac1cf61fab2ff8f703facfe757ab5adf6f82cce","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.6.0_1784434512613_0.37640412151579006","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"trimesh-boolean","version":"0.6.1","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.6.1","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"55067bc11458b35ab15628415e66203833f5e25a","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.6.1.tgz","fileCount":65,"integrity":"sha512-MA+gMpSwltDEdGCj0wB6C1ndYfmlsh7CMgVagvNyfKtco55MM7evWM5fjoRVHVaHqW5pPq266PmyAB3pdWLaxQ==","signatures":[{"sig":"MEUCIQCHgMk1PYrRrfJOCUkH2v0m9xdzLJRWH2RKKIYpTwK5CAIgY+N33Xrt9gnX1vyTI9B9Q/+gkMsKlm/CtRHIsq66Vrg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7329829},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"0ac1cf61fab2ff8f703facfe757ab5adf6f82cce","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.6.1_1784460463578_0.9707210017369328","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"trimesh-boolean","version":"0.6.2","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.6.2","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"53de8755cb8d6091f3267550e8a0ce9572b05282","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.6.2.tgz","fileCount":68,"integrity":"sha512-V3SOpOxR+s6M+BW7CVlxap3N2PsQvZ0bjQ8520pTaUY6vs8ZX0v9hRBu0nFKk2mYNIe+BKWENbZN0Q8x5/Oxwg==","signatures":[{"sig":"MEQCIE6/dtVVGpmph7zVqIhQYQ7BPTiCUaiFivojOs/jhpnUAiBsUs9CUlE23J0Cqge7iTCXSeRXKdhMvx33Nue9AYY7wg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7487131},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"aabc4f15654dc5d40b315c5336153e69834a57e1","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.6.2_1784722735161_0.5349978942798781","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"trimesh-boolean","version":"0.6.3","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.6.3","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"bf5a87b009e1fea7498a5aa15e3af6d4da614630","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.6.3.tgz","fileCount":68,"integrity":"sha512-w5WxZf7VMLsjPQDHRkn2dBNnFichTz77NR5XYmMqQHyKDNQhybw49wzUY9QHOIYeXj07iXqp3BJU8C6dk6aPFg==","signatures":[{"sig":"MEQCIDgio77LFC2aFg8GPH2wQl1KPChICQkTnoJNRY0wMEMTAiBseodHdwvpC5f+0HkX1RNf4wXq2HEGfgkumVk8e965XQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7490012},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"34761496e87d5d65ecc944b976bf4e4fb9e1c903","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.6.3_1784724720058_0.2976899724979205","host":"s3://npm-registry-packages-npm-production"}},"0.6.4":{"name":"trimesh-boolean","version":"0.6.4","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.6.4","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"4692246fc1ef8a07a9a5b07e68b890159b61a612","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.6.4.tgz","fileCount":68,"integrity":"sha512-2EoZchwzGJJLieY2phMyzU9NjzCmGuh2YYdBg6EMvXuc82Z9O/VBnXoGhKOKKlI4hUCjYGe+kOL5Yn5kc7FH1w==","signatures":[{"sig":"MEUCIQCwY3TGDxTBSIPsTjtJPNSH3rbW7idbJ3WgCtATFxxLKQIgFRm/XLPRnF5pbhLZW5oU15LfPxJ/FWL2Vm+eOYJIk6I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7497188},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"a6155bf9fc523e2c72669ee9b56706152c61cd9c","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.6.4_1784729092347_0.9875887356811148","host":"s3://npm-registry-packages-npm-production"}},"0.6.5":{"name":"trimesh-boolean","version":"0.6.5","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.6.5","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"1514ab6cb931f146e66d062d38dd4e467d3727b5","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.6.5.tgz","fileCount":68,"integrity":"sha512-Rs2/4/lFjbKxmCMw9i0bZVdQo84ZzElpEsb7zm45BBNpl4asLtPAH2l5HcmMS6ZvQskCuqEELjFT6kDKfJVXXg==","signatures":[{"sig":"MEQCIBrvWtc2zzZepEdu2XcU++SwSGgPmefinmCuzDB919bRAiBGFBOaIYsMycSaK4V88Y8/+9/sQ/+fcSBkw//Yq8FH7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7505214},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"6c78cf5e346f67394c669dffc58ecb263af738c3","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.6.5_1784811666086_0.5532395279696014","host":"s3://npm-registry-packages-npm-production"}},"0.6.6":{"name":"trimesh-boolean","version":"0.6.6","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.6.6","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"2580303fa1c09c28ea2bb7587d9d2b3c7672730e","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.6.6.tgz","fileCount":68,"integrity":"sha512-37CynmJp7uIVycQf8SslyJjaKDDe/p6+oJi3/7g/0ejP8XjAPbil9L/JSVgPkufA2UQXsaBwAuXHGX4fYhXmsA==","signatures":[{"sig":"MEUCIAewFQYpcTgyXJOoCNODNMLRA11QafmlNsc++0tK92cxAiEAxFhJ7Z7K/aZQXL4pRmPwoU/qSrXOqWyiE6RImwjgigE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7555594},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"0ce1bd265505594d325407e6780f1306f17b6b38","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.6.6_1789339276854_0.29279564790636226","host":"s3://npm-registry-packages-npm-production"}},"0.6.7":{"name":"trimesh-boolean","version":"0.6.7","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.6.7","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"fb7e116be83a5566cc282dc402efc2a53728e675","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.6.7.tgz","fileCount":69,"integrity":"sha512-cfToh5v5zyaUfMLvFI5hmNRAzF7/i36ww57u13mkyTsnyfyKY2TjEPzMLyBakK+Ukzl8cUPOPrs4SCTzYJUXow==","signatures":[{"sig":"MEUCIAxiijex22k3DKMv7KtHW/uz2uev40KXskqCKyNOiIKYAiEA5LgCAKkOF8KiDbsjg+Uwh77/Q2v3VlTN5yUM+b0CEuU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7778488},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"af72721ab9984b6896ff56f92f1ec8ad2d073414","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.6.7_1789386461362_0.31373158384876887","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"trimesh-boolean","version":"0.7.0","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.7.0","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"4c19022e31c7fccd867f71d9611caa446f10b418","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.7.0.tgz","fileCount":71,"integrity":"sha512-I7gIjOQLupTsxlzvvvSpeKpL3KTIbK2mfuD5yOgcPWMPh9gTkeX8/z4B8QjtIa9tO5lfJ/HQ2RJPZXULz30fyQ==","signatures":[{"sig":"MEUCIBSby/j5bXIxup49Z7Cl42tCs5yFFVMkvyjzdiEKuezSAiEAgeR8135mU6WtFVEYDU1TflDrmU00DEhxuk1Pna6e7qc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7912689},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"938c993b92deee0f23ddc392178dd6f2fc40781d","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.7.0_1789389946144_0.8362314627107004","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"trimesh-boolean","version":"0.7.1","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"author":{"name":"Brent Buffham"},"license":"MIT","_id":"trimesh-boolean@0.7.1","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"28409003b90a11fbe215f96b0cf0b40367d251d8","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.7.1.tgz","fileCount":72,"integrity":"sha512-pio+JV1DFqLQBvB/Wi3a/dCbmRmSBzQMqDD2If0tPev6YmDNhFsIElu1dvjJBPYdxaT9i8YJfBPybBUMsZg/GQ==","signatures":[{"sig":"MEQCIHaQcyxGgIL6uz4rEEZsddCyk6ui5H4whDrTHfCPabV+AiA13+KgtG0mhn6ByPwj3eVrC3Wi4MtFeGPET9q1N7LHmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGyuEHJh6vAHYfZ0DzkoXloMzC27GPLRtu5a8l5lMVq9AiEAhroglC8s726PHJ6K5JRXAkm0f2Vnh/IhWCdrhNNdFV4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9484028},"main":"build/trimesh-boolean.umd.cjs","type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"a58179ad8e63d3662f303c8605dcbd71001c03f2","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/trimesh-boolean_0.7.1_1789422768696_0.7304841065486829","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"_id":"trimesh-boolean@0.7.3","bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"dist":{"shasum":"d63fcfc7d948f3da0baded3dede47a4fd3605955","tarball":"https://registry.npmjs.org/trimesh-boolean/-/trimesh-boolean-0.7.3.tgz","fileCount":72,"integrity":"sha512-AsDH5OWTCqH6ezf2/wzrGFXLAGunRTaKHvfK4LJd7oBWewc+fxTEsYU5bNnJmM9HRShyqaBTKUuOYBCpQ4hHFw==","signatures":[{"sig":"MEUCIQDtQPkoQ0KljutZRF4GjE2IbKHmvYSS/ryeipP4tlVREQIgFleh83jriEKuPeOoiZ3PzTtonpxtlYBfWDzqNrVmZEg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDIkS5L2Fz89JCDRkJuDyNwLrHSk+6MJhKiYvvOcNn1QAIhAKACqgeLcC6rhfeyOIe2MmoHAJk2l2c4hGPuy+YfVCC/"}],"unpackedSize":9535361},"main":"build/trimesh-boolean.umd.cjs","name":"trimesh-boolean","type":"module","types":"src/index.d.ts","author":{"name":"Brent Buffham"},"module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./build/trimesh-boolean.umd.cjs"},"./three":{"types":"./src/three.d.ts","import":"./src/three.js","require":"./build/trimesh-boolean-three.umd.cjs"}},"gitHead":"f60cf9c4ec5b0d6f2949482e9a779b4b375daf2a","license":"MIT","scripts":{"dev":"vite","test":"vitest run","build":"rollup -c","build:docs":"npm run build && vite build && node scripts/copy-docs-libs.mjs","prepublishOnly":"npm run build && npm run test"},"version":"0.7.3","_npmUser":{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"},"homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"_npmVersion":"11.13.0","description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","directories":{},"maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"delaunator":"^5.0.1","tiny-exact-math":"^0.0.1","robust-predicates":"^3.0.3","@kninnug/constrainautor":"^4.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jszip":"^3.10.1","three":"^0.183.0","rollup":"^4.0.0","vitest":"^3.0.0","@rollup/plugin-terser":"^1.0.0","@rollup/plugin-node-resolve":"^16.0.0"},"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/trimesh-boolean_0.7.3_1789476483056_0.44831683409284206"}}},"time":{"created":"2026-02-25T05:56:02.193Z","modified":"2026-09-15T12:48:03.331Z","0.1.0":"2026-02-25T05:56:02.412Z","0.1.1":"2026-02-25T06:01:41.544Z","0.2.0":"2026-02-26T00:14:20.780Z","0.3.0":"2026-03-04T13:20:20.052Z","0.4.0":"2026-03-20T15:24:47.968Z","0.4.1":"2026-03-23T08:25:24.176Z","0.5.0":"2026-03-23T13:55:54.639Z","0.5.1":"2026-03-24T05:24:34.314Z","0.5.2":"2026-03-24T05:40:08.808Z","0.5.3":"2026-03-24T06:14:58.581Z","0.5.4":"2026-03-25T09:46:41.838Z","0.5.6":"2026-03-25T18:35:40.253Z","0.5.7":"2026-06-11T15:47:56.915Z","0.5.8":"2026-06-12T09:43:03.326Z","0.5.9":"2026-06-19T10:29:30.870Z","0.5.10":"2026-07-10T12:58:37.912Z","0.5.11":"2026-07-10T15:54:38.455Z","0.5.12":"2026-07-11T04:19:44.498Z","0.6.0":"2026-07-19T04:15:12.787Z","0.6.1":"2026-07-19T11:27:43.812Z","0.6.2":"2026-07-22T12:18:55.378Z","0.6.3":"2026-07-22T12:52:00.247Z","0.6.4":"2026-07-22T14:04:52.596Z","0.6.5":"2026-07-23T13:01:06.273Z","0.6.6":"2026-09-13T22:41:17.089Z","0.6.7":"2026-09-14T11:47:41.577Z","0.7.0":"2026-09-14T12:45:46.309Z","0.7.1":"2026-09-14T21:52:48.807Z","0.7.3":"2026-09-15T12:48:03.182Z"},"bugs":{"url":"https://github.com/brentbuffham/trimesh-boolean/issues"},"author":{"name":"Brent Buffham"},"license":"MIT","homepage":"https://github.com/brentbuffham/trimesh-boolean#readme","keywords":["mesh","boolean","csg","triangle","surface","terrain","intersection","repair","weld","stitch","threejs","3d","open-surface","dtm","triangulation"],"repository":{"url":"git+https://github.com/brentbuffham/trimesh-boolean.git","type":"git"},"description":"Triangle mesh boolean operations — supports open surfaces, terrain intersection, and mesh repair","maintainers":[{"name":"brentbuffham","email":"blastingapps.xyz@gmail.com"}],"readme":"# trimesh-boolean\n\nTriangle mesh boolean operations for JavaScript — **supports open surfaces**.\n\nUnlike every other mesh boolean package in the npm ecosystem, `trimesh-boolean` works on open (non-watertight) meshes like terrain surfaces, DTMs, and partial shells. It also works on closed solids.\n\n## Why trimesh-boolean?\n\n| Package | Open surfaces? | Approach |\n|---------|----------------|----------|\n| three-bvh-csg | No | BVH-accelerated BSP |\n| three-csg-ts | No | BSP tree (TS) |\n| manifold-3d | No | WASM C++ |\n| **trimesh-boolean** | **Yes** | Moller intersection + fan triangulation + shared Steiner points + hybrid boundary/barrier-normal classification + heffalump per-triangle classifier |\n\nEvery existing package requires **closed, manifold** input. If you're working with terrain surfaces, geological models, or any open mesh — they won't work. `trimesh-boolean` will.\n\n## Install\n\n```bash\nnpm install trimesh-boolean\n```\n\nOr use the CDN for browser scripts:\n\n```html\n<script src=\"https://unpkg.com/trimesh-boolean/build/trimesh-boolean.min.js\"></script>\n<!-- Exposes window.TrimeshBoolean -->\n```\n\n**Links:** [npm](https://www.npmjs.com/package/trimesh-boolean) · [GitHub](https://github.com/brentbuffham/trimesh-boolean) · [Live Demo](https://brentbuffham.github.io/trimesh-boolean/)\n\n### Live demo (GitHub Pages)\n\n\nTwo pages:\n\n- **[Workflows](https://brentbuffham.github.io/trimesh-boolean/workflows.html)** — every pipeline as a runnable walkthrough. Each one shows the code it actually runs (the listing is generated from the function itself, so it cannot drift), the geometry before and after, and the measured effect. Includes the T-junction repair comparison: the legacy resolver leaves 66.7% of triangles correctly wound, the hole-free one leaves 100%.\n- **[Boolean playground](https://brentbuffham.github.io/trimesh-boolean/)** — load surfaces, run operations, inspect and re-classify the splits by hand.\n\nThe [live demo](https://brentbuffham.github.io/trimesh-boolean/) is **built and deployed automatically** on every push to `main` or `master` by [`.github/workflows/pages.yml`](.github/workflows/pages.yml) (`npm run build:docs` in CI). You do **not** need to commit the `docs/` folder for the site to update.\n\n**One-time repo setting:** GitHub → **Settings** → **Pages** → **Build and deployment** → **Source:** **GitHub Actions** (not “Deploy from a branch”). After that, each push runs the workflow and refreshes the demo.\n\nTo preview the same build locally:\n\n```bash\nnpm run build:docs\n```\n\nEdit demos only under `examples/` (Vite root). Local dev: `npm run dev`.\n\n## Quick Start\n\n**Start here.** `booleanAuto` runs the BMS pipeline and finishes the result, so\nyou get valid geometry from one call:\n\n```javascript\nimport { booleanAuto } from 'trimesh-boolean';\n\nvar result = booleanAuto(terrainSoup, cutterSoup, 'subtract');\n// result.soup   -> the finished triangles\n// result.ok     -> true when every output invariant holds\n// result.report -> what was repaired, and what was refused (and why)\n```\n\nOutput quality is an **invariant, not an option** — there is no flag to disable\ncorrect winding. What you can choose is how hard to work: `quality: \"strict\"`\n(default) finishes the result, `quality: \"raw\"` hands back the merged boolean\nuntouched.\n\nTwo engines live in this package and they do different jobs:\n\n| | use it for | notes |\n|---|---|---|\n| **`booleanAuto`** / `bmsBooleanOp` | open, non-watertight, non-manifold surfaces — terrain, DTMs, mining shells | the engine this library exists for |\n| `boolean` | simple closed solids | classic flood-fill + half-space; kept for compatibility |\n\nThey do not call each other. If your inputs are survey surfaces, use\n`booleanAuto`.\n\n### Lower-level API\n\n```javascript\nimport { boolean, splitMeshPair, mergeSplitGroups,\n         splitToComponents, mergeSmallComponents, mergeComponents,\n         selectSplits, repairMesh, intersectMeshPair,\n         heffalumpClassify, shouldUseHeffalump,\n         reclassifyTriangles, reclassifyAtPoint, reclassifyRegion } from 'trimesh-boolean';\n\n// Triangle soup: simple {v0, v1, v2} objects\nvar meshA = [\n  { v0: {x:0,y:0,z:0}, v1: {x:2,y:0,z:0}, v2: {x:1,y:2,z:0} },\n  // ... more triangles\n];\nvar meshB = [/* ... */];\n\n// One-shot boolean operation\nvar result = boolean(meshA, meshB, 'subtract');\n// result = { soup: Triangle[], points: Vertex[], triangles: WeldedTri[] }\n\n// Split-and-pick workflow (inspect groups before merging)\nvar split = splitMeshPair(meshA, meshB);\n// split.groups = { aInside, aOutside, bInside, bOutside }\n// split.segments = TaggedSegment[]\nvar merged = mergeSplitGroups(split.groups, 'union');\n\n// Custom surface workflow — user picks individual components\nvar comps = splitToComponents(split.groups);\n// comps = [{ mesh:\"A\", side:\"inside\", index:0, soup:[...], triCount:599 }, ...]\ncomps = mergeSmallComponents(comps, 50);  // collapse tiny fragments\nvar picked = mergeComponents([\n  { soup: comps[0].soup },              // keep A-inside #0\n  { soup: comps[2].soup, flip: true }   // keep B-outside #0, flip normals\n]);\n\n// ── BMS Pipeline (v0.5.0) — hybrid classification + per-component walks ──\nimport { bmsBooleanOp } from 'trimesh-boolean';\n\nvar bms = bmsBooleanOp(meshA, meshB, null, { preRepair: true });\n// bms.groups = { aInside, aOutside, bInside, bOutside }\n// bms.segments = pool-vertex intersection segments\n// bms.polylines = chained intersection polylines\n// bms.meshEdgePolys = { A: {...}, B: {...} } — per-mesh boundary polygons\n// bms.componentWalks = per-component boundary walk segments\n// bms.pool = shared vertex pool\n\n// BMS + splitToComponents for per-region analysis\nvar comps = splitToComponents(bms.groups);\n// 9 components for double-crossing terrain + convoluted block\n\n// ── Heffalump Classifier (v0.5.5) — per-triangle classification for defective meshes ──\nimport { heffalumpClassify, shouldUseHeffalump } from 'trimesh-boolean';\n\n// Auto-detect if meshes have non-manifold edges\nif (shouldUseHeffalump(meshA, meshB)) {\n  // heffalumpClassify classifies each triangle individually\n  // Works on meshes with fragmented boundaries, cracks, and holes\n  var hResult = heffalumpClassify(megaSoup, segments, meshA, meshB);\n  // hResult.aInside, hResult.aOutside, hResult.bInside, hResult.bOutside\n  // hResult.componentWalks — boundary walk segments for visualization\n}\n\n// Manual reclassification — fix misclassified triangles interactively\nimport { reclassifyAtPoint } from 'trimesh-boolean';\nvar fix = reclassifyAtPoint(groups, clickX, clickY, clickZ, 0.01);\n// fix = { moved: true, mesh: \"A\", from: \"inside\", to: \"outside\" }\n\n// Just intersection segments (no boolean)\nvar segments = intersectMeshPair(meshA, meshB);\n// segments = [{ p0: {x,y,z}, p1: {x,y,z} }, ...]\n\n// Mesh repair\nvar repaired = await repairMesh(meshA, {\n  closeMode: 'stitch',\n  snapTolerance: 0.01\n});\n```\n\n## Three.js Adapter\n\n```javascript\nimport { booleanFromMeshes, meshToSoup, soupToMesh } from 'trimesh-boolean/three';\n\n// Boolean on Three.js meshes directly — runs BMS + finishing (v0.7.1+)\nvar resultMesh = booleanFromMeshes(threeGroupA, threeGroupB, 'subtract');\nscene.add(resultMesh);\n\n// Or convert manually\nvar soup = meshToSoup(threeMesh);\nvar mesh = soupToMesh(soup, { color: 0xff0000 });\n```\n\n**Since v0.7.1** `booleanFromMeshes` runs the BMS pipeline via `booleanAuto`.\nBefore that it ran the classic engine, so Three.js consumers silently missed the\nopen-surface path. Pass `{ engine: 'classic' }` for the old behaviour.\n\n**UTM precision.** `soupToMesh` builds geometry in a **local frame**, putting the\ncentroid on `mesh.position`. Three stores positions as `Float32`, whose spacing\nat a UTM northing of 7.4e6 is **0.5 m** — writing absolute survey coordinates\nstraight in silently collapses nearby vertices. Measured: `6771845.678` stores\nas `6771845.5`, an error of 0.178 m. In the local frame the same value carries\nabout 1e-6 m. Pass `{ recenter: false }` for the old behaviour; only safe near\nthe origin.\n\nNote this is a *storage* limit, independent of the exact predicates used\ninternally: `orient3d` gives exact **signs**, not exact coordinates.\n\n## API Reference\n\n### `boolean(soupA, soupB, operation)`\n\nPerform a boolean operation on two triangle soups.\n\n- **soupA** / **soupB**: `Triangle[]` — arrays of `{ v0, v1, v2 }` where each vertex is `{ x, y, z }`\n- **operation**: `\"subtract\"` | `\"union\"` | `\"intersect\"`\n- **Returns**: `{ soup, points, triangles }` or `null`\n\n### `splitMeshPair(soupA, soupB)`\n\nSplit two meshes into 4 inside/outside groups without combining them. This is the \"split-and-pick\" workflow: compute groups, then the caller decides which to keep.\n\n- **soupA** / **soupB**: `Triangle[]`\n- **Returns**: `{ groups: { aInside, aOutside, bInside, bOutside }, segments }` or `null`\n\n### `mergeSplitGroups(groups, operation)`\n\nMerge split groups into a single result based on the operation type.\n\n- **groups**: `{ aInside, aOutside, bInside, bOutside }` from `splitMeshPair`\n- **operation**: `\"subtract\"` | `\"union\"` | `\"intersect\"`\n- **Returns**: `{ soup, points, triangles }` or `null`\n\n### `splitToComponents(groups, options?)`\n\nDecompose each of the 4 split groups into connected components (disconnected mesh regions). Useful for multi-crossing surfaces where a single group contains multiple spatially separated zones.\n\n- **groups**: `{ aInside, aOutside, bInside, bOutside }` from `splitMeshPair`\n- **options.pooled**: `boolean` — route each group through the integer-id `findConnectedComponentsPooled` fast path (identical result, far less string hashing at scale). Default off.\n- **options.tolerance**: `number` — vertex-weld quantization for the pooled path (default `1e-6`)\n- **Returns**: `[{ mesh: \"A\"|\"B\", side: \"inside\"|\"outside\", index: number, soup: Triangle[], triCount: number }, ...]` — sorted largest-first within each group\n\n### Scaling at millions of triangles\n\n`findConnectedComponents` and the default `splitToComponents` key their edge map on `toFixed(6)` **strings**; at millions of triangles that string hashing dominates time and heap. Three opt-in, back-compatible integer-id paths avoid it (the default string paths are unchanged):\n\n- **`findConnectedComponentsPooled(soup, options?)`** — same shared-edge adjacency and largest-first ordering as `findConnectedComponents`, but vertices are hashed to integer ids so the edge map uses integer keys. Identical result on clean input. `options.tolerance` defaults to `1e-6`.\n- **`splitToComponents(groups, { pooled: true })`** — the same, applied to all four groups.\n- **`connectedComponentsIndexed(tris)` / `decomposeIndexedGroups(indexed, smallThreshold?)`** — decompose an *already-indexed* result (`indexGroups(...)` or `bmsBooleanOp(..., { indexed: true }).indexed`) with no soup and no re-hashing. Connectivity here is shared-**vertex** (union-find over pool ids), which is *coarser* than the soup path's shared-**edge** relation — on a clean seam-welded result they agree; on meshes with genuine vertex-only touches the indexed decompose yields fewer, larger components. `decomposeIndexedGroups` returns `[{ mesh, side, group, index, points, triangles, triCount }, ...]` where `triangles` are `[i,j,k]` triples into the shared `points`.\n\n```javascript\nimport { bmsBooleanOp, splitToComponents, decomposeIndexedGroups } from 'trimesh-boolean';\n\n// Soup, pooled edge-based components (drop-in accelerator):\nvar bms = bmsBooleanOp(meshA, meshB, null, { indexed: true });\nvar comps = splitToComponents(bms.groups, { pooled: true });\n\n// Or decompose the indexed twin directly — no soup:\nvar indexedComps = decomposeIndexedGroups(bms.indexed);\n// indexedComps[0] = { mesh, side, group, index, points, triangles: [[i,j,k], ...], triCount }\n```\n\n### `mergeSmallComponents(comps, threshold?)`\n\nMerge small fragment components into their nearest same-group (mesh + side) larger component by centroid proximity. Cleans up tiny classification artifacts.\n\n- **comps**: Component array from `splitToComponents`\n- **threshold**: Triangle count below which a component is merged (default: `50`)\n- **Returns**: Reduced component array with fragments absorbed\n\n### `mergeComponents(picks)`\n\nMerge an arbitrary selection of component soups into a single welded result. Works with the output of `splitToComponents` — pass in the components the user has selected.\n\n- **picks**: `[{ soup: Triangle[], flip?: boolean }, ...]`\n- **Returns**: `{ soup, points, triangles }` or `null`\n\n### `selectSplits(groups, selections)`\n\nSelect specific split groups by name, with optional normal flipping.\n\n- **groups**: `{ aInside, aOutside, bInside, bOutside }` from `splitMeshPair`\n- **selections**: `{ aInside?: boolean|\"flip\", aOutside?: boolean|\"flip\", bInside?: boolean|\"flip\", bOutside?: boolean|\"flip\" }`\n- **Returns**: `{ soup, points, triangles }` or `null`\n\n### Output Verification & Finishing (v0.7.0+)\n\nA boolean result is not automatically valid geometry, and a *repair* is not\nautomatically an improvement. These three APIs measure instead of assuming.\n\n#### `booleanAuto(soupA, soupB, operation, options?)`\n\nBoolean + merge + gated finishing, in one call. The recommended entry point.\n\n```javascript\nvar r = booleanAuto(terrain, cutter, 'subtract');\nif (!r.ok) console.warn(r.report.after.checks.filter(c => !c.ok));\n```\n\n| option | default | meaning |\n|---|---|---|\n| `quality` | `\"strict\"` | `\"strict\"` finishes the result; `\"raw\"` returns the merged boolean |\n| `classifier` | `\"auto\"` | passed to `bmsBooleanOp` |\n| `tolerance` | derived | shared by the boolean **and** the finisher so they agree |\n| `expectClosed` | `false` | require a closed solid in the report |\n\n#### `verifyOutput(soup, options?)`\n\nRead-only invariant check. Mutates nothing, repairs nothing, reports.\n\n```javascript\nvar v = verifyOutput(soup);\n// v.ok, v.checks[], v.stats { triangles, vertices, openEdges,\n//                             nonManifoldEdges, area, components, volume }\n```\n\nChecks: `noDegenerateTriangles`, `noDuplicateTriangles`, `consistentWinding`\n(a shared edge must be traversed in opposite directions by its two triangles),\n`manifoldEdges`, `noTJunctions`, and `closed` under `{ expectClosed: true }`.\nOpen surfaces pass by default — the normal case for terrain and DTM work.\n\nIdentity is a neighbourhood weld, not `toFixed` string keys. `volume` is\ncomputed **after translating to the centroid**: at UTM scale the raw sum is\ncatastrophic cancellation (measured: 89,000,000 m³ reported for a 55,000 m³\nsolid).\n\nUse it to check *output*, not to guess from input. The internal `censusMessy`\ngate inspects inputs and can report clean on meshes that demonstrably contain\nT-junctions.\n\n#### `assessRepair(before, after, options?)`\n\nRun a repair on a copy, diff the two reports, and decide.\n\n```javascript\nvar candidate = resolveTJunctionsHoleFree(soup, tol, 4);\nvar a = assessRepair(soup, candidate);\nif (a.recommend === 'keep') soup = candidate;\nelse console.log(describeAssessment(a));   // says exactly what it would damage\n```\n\nReturns `recommend: \"keep\" | \"discard\"`, `harmful`, and itemised `benefits` /\n`damage`. Volume is only judged when the baseline is sound (0 open, 0\nnon-manifold) — against a broken baseline the figure means nothing.\n\n#### `finishMesh(soup, options?)`\n\nApplies `dedupCoincident`, `resolveTJunctionsHoleFree` and `orientWinding`, each\ngated by `assessRepair`, keeping a stage only when it **strictly reduces**\nviolations. It never returns geometry worse than its input.\n\n```javascript\nvar f = finishMesh(soup);\n// f.soup, f.ok, f.applied[], f.skipped[] (stage + reason), f.before, f.after\n```\n\nThe gate is load-bearing, not defensive. Measured on real survey data:\n\n| pair | before | `finishMesh` | ungated |\n|---|---|---|---|\n| terrain × cylinder | `consistentWinding:40` | **clean** | clean |\n| terrain × cup | `consistentWinding:46` | **clean** | clean |\n| terrain × convoluted | 108 violations | 2 | `manifoldEdges:2` |\n| shell × presplit-a | 4 | **4, untouched** | **6 — worse** |\n\nOn that last row hole-free T-junction resolution trades 4 T-junctions for 2\ndegenerates, 3 non-manifold edges and 1 remaining T-junction. Ungated, that\nships as \"repaired\".\n\nNo deleting stage is included. Deleting geometry stitched into a mesh tears it\nopen — measured elsewhere as 1827 slivers removed producing 3567 open edges and\n90 components — while welding dissolves the same junk for free.\n\n> ⚠️ `repairMesh` still defaults to `sliverRatio: 0.01`, which is that ruinous\n> setting. Assess before trusting it as a blind default.\n\n---\n\n### BMS Pipeline (v0.4.0+)\n\nThe BMS (Brent's Mega Soup) pipeline is a boolean pipeline designed for open surfaces. It solves the core problems of the original pipeline: shared Steiner points, identity-based segment chaining, fan triangulation with guaranteed constraint edges, hybrid classification (v0.5.0), and per-triangle heffalump classification for defective meshes (v0.5.5).\n\n### `bmsBooleanOp(soupA, soupB, operation?, options?)`\n\nRun the full BMS pipeline. Both meshes are split into a unified mega soup where intersection points are shared by object reference (not string matching).\n\n- **operation**: `\"subtract\"` | `\"union\"` | `\"intersect\"` — omit to get groups only\n- **options.classifier** (v0.5.8): `\"auto\"` (default) | `\"hybrid\"` | `\"heffalump\"`. Auto censuses the inputs (non-manifold → heffalump + pre-repair), runs the hybrid classifier, verifies partition / chain-closure / barrier post-conditions, and on any failure re-runs only the classification stage with the heffalump on the existing mega soup. No caller needs to know what a heffalump is anymore.\n- **options.preRepair**: `boolean` — resolve T-junctions + weld before splitting. Default: auto-enabled when the census finds non-manifold edges.\n- **options.tolerance**: `number` — vertex pool merge tolerance\n- **options.indexed**: `boolean` — also attach `result.indexed`, a compact indexed twin of the groups (one shared points pool + per-group `[i,j,k]` index triples). Back-compatible: the soup `groups` are unchanged. See [Indexed Group Output](#indexed-group-output) below.\n- **Returns**: `{ groups, segments, polylines, meshEdgePolys, componentWalks, megaSoup, pool, classifier, verification }` — `classifier` reports the path per mesh (e.g. `{ A: \"hybrid\", B: \"heffalump (partition)\" }`); `verification` carries the post-condition check results. With `{ indexed: true }`, also carries `indexed` (see below).\n\n### `verifyBmsClassification(megaSoup, triSides, segments, polylines, trisA, trisB)` (v0.5.8)\n\nThe auto-classifier's post-condition checks, exported standalone: partition (both meshes must have non-empty inside AND outside groups when intersection segments exist), chain closure (every intersection polyline closes or ends on a mesh boundary), and barrier constraint (same-mesh triangles sharing a barrier edge classify to opposite sides). Returns `{ ok, failures, counts }`.\n\n### Indexed Group Output\n\nThe pipeline's native output is **triangle soup** — every triangle carries its own three `{x,y,z}` vertex objects. That form is simple to consume, but it stores each shared vertex many times over (~5–10× heavier than an indexed mesh). For a multi-million-triangle boolean result you'll want the **indexed twin**: one shared vertex pool plus per-group `[i,j,k]` index triples. The pool is shared **across all four groups**, so the seam between `aInside`/`aOutside` (and `bInside`/`bOutside`) welds automatically — no re-dedupe needed.\n\nThis is purely additive: the soup `groups` are never modified. Opt in on `bmsBooleanOp` with `{ indexed: true }`, or call `indexGroups` directly on any soup groups.\n\n#### `indexGroups(groups, tolerance?)`\n\nConvert soup split groups into a compact indexed representation.\n\n- **groups**: `{ aInside?, aOutside?, bInside?, bOutside? }` — soup groups (`{ v0, v1, v2 }` triangles), as returned by `splitMeshPair`, `bmsBooleanOp`, etc.\n- **tolerance**: `number` — vertex-weld quantization in world units (default: `1e-4`)\n- **Returns**: `{ points, groups }` where `points` is a shared `Vertex[]` pool and `groups` is `{ aInside, aOutside, bInside, bOutside }`, each an array of `[i, j, k]` index triples into `points`\n\n```javascript\nimport { bmsBooleanOp, indexGroups, splitMeshPair } from 'trimesh-boolean';\n\n// Opt in on the pipeline result...\nvar bms = bmsBooleanOp(meshA, meshB, 'subtract', { indexed: true });\n// bms.indexed = { points: Vertex[], groups: { aInside: [i,j,k][], ... } }\n\n// ...or index any soup groups after the fact:\nvar split = splitMeshPair(meshA, meshB);\nvar indexed = indexGroups(split.groups, 1e-4);\n```\n\n#### `indexGroupsToTypedArrays(indexed)`\n\nFlatten indexed groups into typed arrays for transfer or GPU upload. Positions are the **same shared pool** across all groups (indices are global), so a `BufferGeometry` can point every group's index buffer at one position buffer.\n\n- **indexed**: the return value of `indexGroups`\n- **Returns**: `{ positions, index }` where `positions` is a `Float64Array` of `[x,y,z,...]` and `index` is `{ aInside, aOutside, bInside, bOutside }`, each a `Uint32Array` of flattened triangle indices\n\n```javascript\nimport { indexGroupsToTypedArrays } from 'trimesh-boolean';\n\nvar flat = indexGroupsToTypedArrays(bms.indexed);\n// flat.positions -> Float64Array, flat.index.aInside -> Uint32Array, ...\n```\n\n### `bmsIntersect(trisA, trisB, options?)`\n\nCompute intersections with a shared vertex pool. Every segment endpoint goes through the pool — both meshes get the exact same object reference at each intersection location.\n\n### `bmsSplit(trisA, trisB, intersectResult)`\n\nRe-triangulate crossed triangles using fan triangulation with pool vertex references. Produces a tagged mega soup: `[{v0, v1, v2, mesh: \"A\"|\"B\", origIdx}]`.\n\nSince v0.5.8 a **fan-sliver guard** detects extreme triangle/chain size mismatches (a giant face crossed by a dense intersection chain) and switches that face from corner fans to a chain-constrained CDT seeded with graded interior Steiner points — bounded aspect ratio, no needle \"spurs\", and no T-junctions (the added points are strictly interior).\n\n### `bmsChain(segments)`\n\nChain intersection segments using pool vertex identity (integer ID lookup, not distance threshold). Two segments sharing a pool vertex connect by definition.\n\n### `chainedOpenEdge(tris, megaSoup?, segments?)`\n\nWalk the complete open boundary of a mesh as a closed polygon. Uses a half-edge structure to correctly navigate bowtie (non-manifold) vertices. Returns the largest loop as an ordered array of `{key, vertex}`, with the first vertex repeated at the end.\n\n### `bmsClosePolylines(polylines, trisA, trisB, megaSoup?, segments?)`\n\nBuild mesh edge polygons connecting intersection polylines via graph-walks and boundary edge-walks. Graph-walks avoid crossing intersection lines (barrier-aware BFS).\n\n### `bmsClassify(megaSoup, closedPolylines, segments, trisA, trisB)`\n\nHybrid classification (v0.5.0). Barrier flood-fill produces connected components per mesh. Classification method depends on mesh type:\n- **Open meshes**: boundary topology — component touching mesh open boundary = outside, enclosed by barriers = inside.\n- **Closed meshes**: barrier-normal — dot product of component direction vs other mesh's face normal at barrier edges.\n\nAlso extracts per-component boundary walk segments (`componentWalks`) for visualization.\n\n### Self-Intersection Fold Resolver (v0.6.0)\n\nResolves a self-intersecting, coincident-folded, or **non-orientable** closed mesh into a clean solid — the case `orientSolid` alone cannot fix, because a folded component has no consistent winding to orient toward. It re-cuts the coincident and self-crossing triangles into a conforming mesh arrangement, then classifies the resulting cells by generalized winding number (Zhou et al. 2016 + Jacobson et al. 2013).\n\nThis is a purely **additive** feature: every function below is a new export, and no existing API, default, or output changed. The A-vs-B `bmsBooleanOp` / `boolean` paths are byte-for-byte unchanged (the new edge-Steiner split path only activates when a self-arrangement populates `intersectResult.edgePointsA/B`, and the new `orientSolid` branch only runs under `options.coherenceOnly`).\n\n#### `bmsSelfResolveIndexed(indexed, options?)`\n\nMain entry. Takes and returns **indexed** geometry — the efficient form for large meshes.\n\n```javascript\nimport { bmsSelfResolveIndexed } from 'trimesh-boolean';\n\nvar result = bmsSelfResolveIndexed(\n  { positions: Float64Array, index: Uint32Array },   // xyz-per-vertex + triangle indices\n  { weldTolerance: /* default avgEdge · 0.012 */ }   // all options opt-in\n);\n// result = { positions: Float64Array, index: Uint32Array, diagnostics }\n```\n\n`diagnostics` reports what happened, honestly:\n- `classifier` — `\"cell-complex\"` when the mesh resolved watertight, `\"patch\"` when it fell back (see below).\n- `arrangementOpenEdges`, `preOrientSeamViolations` — residual non-orientable seams, if any.\n- `cellComplex.leakedFaceFraction`, `seamOpenBefore` / `seamOpenAfter` — per-mesh, where inside and outside could not be separated.\n\n**Genuinely-degenerate input** — coincident folds whose seam glues inside to outside as a single topological cell — cannot be made watertight by any winding method. On those, the resolver **falls back to a volume-accurate result** (typical volume error < 0.01%) rather than tearing or collapsing the mesh, and reports `classifier: \"patch\"`. It never ships a proximity-stitch collapse.\n\n**Coincident-sheet vs. pinch (v0.6.1).** Some degenerate leaks come from *near*-coincident coplanar sheets — vertices within tolerance but not exactly equal — which the radial fan then glues ambiguously. `exactSeamSnap: true` (default off) collapses those pairs to *exact* coincidence with robust predicates, so the facet-merge cancels them and the cell complex can separate inside from outside; only coincident-pair vertices move (≤ tolerance, and a zero-thickness pair encloses no volume, so volume is preserved). Enable it and read `diagnostics.exactSeamSnap.coincidentPairs` and `diagnostics.cellComplexConditioned.leakedFaceFraction`: if the leak drops below `leakTolerance` the mesh closes via the cell complex; if it **holds**, the leak is a genuine topological **pinch** (the surface passes through itself — inside and outside are one cell), which no winding method can separate, so it stays on the volume-safe patch. Default-off keeps the 0.6.0 path byte-for-byte unchanged.\n\n#### `bmsSelfResolve(soup, options?)`\n\nSoup-form entry (`{v0,v1,v2}[]` in, `{ soup, diagnostics }` out) for when you are not already indexed.\n\n#### Pipeline internals (advanced)\n\nExposed for composition and testing; you normally only need the two entries above.\n\n- `coplanarOverlap`, `emitCoplanarSegments` — coincident (coplanar) overlap detection and segment emission. This is the fold case the classic Möller test near-parallel-rejects, so ordinary intersection never sees it.\n- `bmsSelfIntersect`, `bmsSelfArrange` — self-intersection detection and the conforming self-arrangement (shared-pool edge-Steiner splits → no T-junctions).\n- `conditionArrangement` — opt-in seam snap-round + hole-fill; runs only when the cell complex detects a leak, and is a no-op on watertight input.\n- `snapCoincidentSheets` (v0.6.1) — the `exactSeamSnap` primitive: union-finds near-coincident coplanar face-pair vertices onto a shared representative (exact coincidence) so facet-merge cancels them; a no-op on non-coincident geometry.\n- `solidAngle`, `windingNumber`, `windingNumberIndexed`, `extractByWinding`, `extractByWindingPatches` — the generalized winding-number field and surface extraction.\n- `extractByCellComplex` — the volumetric cell-complex classifier (radial edge fans → cells → winding propagation → manifold-by-construction extraction).\n- `dedupCoincidentTriangles` — exact coincident-face deduplication.\n\n### Heffalump Classifier (v0.5.5)\n\nThe heffalump classifier is a barrier-only classification strategy for meshes with defective topology (non-manifold edges, fragmented boundaries, cracks, holes). Instead of relying on boundary walks (which break when the boundary is fragmented), it classifies each triangle individually:\n\n- **Closed other mesh**: ray-cast each triangle's centroid through the other mesh (odd crossings = inside)\n- **Open other mesh**: find nearest surface triangle and check which side the centroid is on (normal direction = outside)\n\n### `heffalumpClassify(megaSoup, segments, trisA, trisB, opts?)`\n\nBarrier-only classification for meshes with defective topology. Classifies each triangle individually rather than by flood-filled components.\n\n- **megaSoup**: Split triangles with `mesh` tags from `bmsSplit`\n- **segments**: Intersection segments with pool vertex endpoints\n- **trisA** / **trisB**: Original mesh triangles\n- **opts.snapThreshold** (v0.5.8, default `0.9`): per-component majority-snap ratio. After the per-triangle vote, if ≥ this fraction of a component agrees, the stragglers snap to the majority — this erases lone flipped \"spur\" triangles whose centroids hug the other surface. Genuinely mixed components (the barrier-gap case) are nowhere near unanimous and stay per-triangle.\n- **opts.maxSnapStragglers** (v0.5.9, default `8`): absolute-count gate on the snap. The snap only collapses a *tiny* minority — it never bulldozes a large, legitimate region that happens to read as a low ratio (e.g. a terrain area inside a prism that is flood-fill-connected to the outside).\n- **Returns**: `{ aInside, aOutside, bInside, bOutside, componentWalks }`\n\n### `shouldUseHeffalump(trisA, trisB)`\n\nDetect whether a mesh pair needs the heffalump classifier. Returns `true` if either mesh has non-manifold (over-shared) edges.\n\n- **Returns**: `boolean`\n\n### `reclassifyTriangles(groups, mesh, fromSide, triIndices)`\n\nMove triangles between inside/outside groups by index. Useful for fixing misclassified triangles programmatically.\n\n- **groups**: `{ aInside, aOutside, bInside, bOutside }`\n- **mesh**: `\"A\"` | `\"B\"`\n- **fromSide**: `\"inside\"` | `\"outside\"` — triangles are moved to the opposite side\n- **triIndices**: `number[]` — indices within the source array to move\n- **Returns**: Updated groups (mutated in place)\n\n### `reclassifyAtPoint(groups, cx, cy, cz, tolerance?)`\n\nReclassify a single triangle identified by its centroid coordinates. Useful for click-to-toggle in a 3D viewer.\n\n- **cx**, **cy**, **cz**: Centroid coordinates to match\n- **tolerance**: Match tolerance (default: `0.01`)\n- **Returns**: `{ moved: boolean, mesh?: string, from?: string, to?: string }`\n\n### `reclassifyRegion(groups, mesh, fromSide, seedIdx)`\n\nReclassify a connected region — flood fill from a seed triangle to move all connected same-side triangles together.\n\n- **mesh**: `\"A\"` | `\"B\"`\n- **fromSide**: `\"inside\"` | `\"outside\"`\n- **seedIdx**: Index of the seed triangle in the source array\n- **Returns**: `number` — count of triangles moved\n\n### `createVertexPool(tolerance)`\n\nCreate a shared vertex pool with spatial hash deduplication. Points within tolerance get merged to the same object reference.\n\n### `intersectMeshPair(trisA, trisB)`\n\nFind all intersection segments between two meshes.\n\n- **Returns**: `Segment[]` — `[{ p0, p1 }, ...]`\n\n### `intersectMeshPairTagged(trisA, trisB)`\n\nLike `intersectMeshPair` but each segment carries source triangle indices.\n\n- **Returns**: `[{ p0, p1, idxA, idxB }, ...]`\n\n### `repairMesh(soup, config?, onProgress?)`\n\nHigh-level async mesh repair pipeline.\n\n- **config.closeMode**: `\"none\"` | `\"weld\"` | `\"stitch\"` (default: `\"none\"`)\n- **config.snapTolerance**: Weld tolerance in metres (default: `0`)\n- **config.stitchTolerance**: Stitch tolerance (default: `1.0`)\n- **config.removeDegenerate**: Remove degenerate/sliver triangles (default: `true`)\n- **config.sliverRatio**: Sliver aspect ratio threshold (default: `0.01`)\n- **config.cleanCrossings**: Remove over-shared edge duplicates (default: `true`)\n- **config.removeOverlapping**: Remove anti-parallel internal wall triangles (default: `false`)\n- **config.overlapTolerance**: Overlap detection tolerance (default: `1e-4`)\n- **Returns**: `Promise<{ soup, points, triangles }>`\n\n### Repair Functions\n\nIndividual repair steps, usable standalone:\n\n| Function | Description |\n|----------|-------------|\n| `deduplicateSeamVertices(tris, tol?)` | Merge coincident seam vertices |\n| `resolveTJunctions(soup, tol?, maxPasses?)` | Split edges at T-junction vertices |\n| `resolveTJunctionsHoleFree(soup, tol?, maxPasses?)` | Hole-free T-junction resolution (shared welded identity, no cracks) |\n| `cancelCoincidentFaces(soup, tol?)` | Cancel opposite-winding coincident pairs (zero-thickness membranes) |\n| `weldVertices(tris, tolerance)` | Merge vertices within tolerance → indexed mesh |\n| `weldedToSoup(weldedTris)` | Convert indexed mesh back to soup |\n| `removeDegenerateTriangles(tris, minArea?, sliverRatio?)` | Remove zero-area and sliver triangles |\n| `extractBoundaryLoops(tris)` | Find open boundary loops |\n| `triangulateLoop(loop)` | Triangulate a 3D polygon loop |\n| `capBoundaryLoops(tris)` | Cap all boundary loops (parallel) |\n| `capBoundaryLoopsSequential(tris)` | Cap all boundary loops (sequential) |\n| `stitchByProximity(tris, tolerance?)` | Connect nearby boundary edges |\n| `cleanCrossingTriangles(tris)` | Remove over-shared edge duplicates |\n| `removeOverlappingTriangles(tris, tol?)` | Remove anti-parallel internal walls |\n| `forceCloseIndexedMesh(points, triangles)` | Force-close an indexed mesh |\n| `fillOpenEdgeLoops(soup)` | Fill closed loops of open edges with fan triangles |\n| `weldBoundaryVertices(tris, tolerance)` | Weld boundary-only vertices |\n| `soupToIndexed(tris, tolerance)` | Alias for `weldVertices` — convert soup to indexed mesh |\n| `indexedToSoup(weldedTris)` | Alias for `weldedToSoup` — convert indexed mesh back to soup |\n\n#### Hole-free repair (v0.6.2)\n\nPolygon/prism cuts on **battered** (near- but not-quite-vertical) walls can leave two artifacts\nwhere the cut grazes a triangle near an edge: sub-tolerance slivers weld back onto the surface with\nthe **reverse winding** (zero-thickness \"membrane\" pairs), and the off-edge crossing vertex becomes a\n**T-junction**. These preserve volume but z-fight on render and break downstream tooling.\n\nThe existing `resolveTJunctions` keys vertices with `toFixed()` strings, so two triangles sharing an\nedge can disagree on that edge's split points and the mesh **tears open**. The two functions below fix\nboth artifacts **without opening the mesh**:\n\n```js\nimport { cancelCoincidentFaces, resolveTJunctionsHoleFree } from \"trimesh-boolean\";\n\n// 1) remove the zero-thickness membranes (opposite-winding coincident pairs only —\n//    same-winding duplicates and degenerates are left for the dedup/degenerate passes)\nvar soup = cancelCoincidentFaces(piece, weldEps);\n\n// 2) resolve remaining T-junctions hole-free\nsoup = resolveTJunctionsHoleFree(soup, weldEps);\n```\n\n- **Identity** is a **neighbourhood-weld integer pool** (`round(x/eps)` with a 27-cell search), not\n  `toFixed()` and not exact rationals — welding is a tolerance operation, so two triangles across a\n  shared edge resolve to the *same* vertex ids and split that edge identically. Exact predicates stay\n  reserved for orientation *signs*, not fuzzy identity.\n- `cancelCoincidentFaces` is **stricter and safer** than `removeOverlappingTriangles`: it cancels only\n  *exact* opposite-winding coincident pairs, so it never deletes near-coincident but genuinely-distinct\n  wall triangles (which would tear holes).\n- `resolveTJunctionsHoleFree` re-triangulates each affected triangle with a **local-frame Delaunay**\n  pass (never a corner fan, which emits collinear zero-area slivers) and re-orients each sub-triangle\n  to the source normal, converging in a couple of passes.\n- **v0.6.5 — near-edge snap.** A seam T-junction usually places the hanging vertex *within tolerance*\n  of the host edge but not exactly **on** it. Inserting that raw off-edge vertex left near-collinear\n  points → Delaunay slivers, some dropped as \"outside parent\" → holes, and the vertex stayed a\n  T-junction on the new sub-edges. Each on-edge hit is now **snapped to its perpendicular projection**\n  (the point exactly on the host edge), so the fan tiles the parent exactly. The snap moves the point\n  ≤ `eps`, so the next pass's weld pool re-merges it with the neighbour's vertex — still hole-free.\n  (Before v0.6.5, on a flat 10 m triangle with 0.5 mm-off hits: `tj 8 → 7`, min sub-area `2.5e-4`;\n  after: `tj 8 → 0`, min sub-area `0.25`, no new open edges, at local **and** UTM scale.)\n\n### Component Functions\n\n| Function | Description |\n|----------|-------------|\n| `findConnectedComponents(soup)` | Split a soup into connected components via shared edges |\n| `findConnectedComponentsPooled(soup, options?)` | Integer-id twin of the above — same result, no `toFixed` string keys (see [Scaling](#scaling-at-millions-of-triangles)) |\n| `splitToComponents(groups, options?)` | Decompose 4 split groups into per-component list (`{ pooled: true }` for the fast path) |\n| `connectedComponentsIndexed(tris)` | Components of an already-indexed mesh via shared-vertex union-find |\n| `decomposeIndexedGroups(indexed, smallThreshold?)` | Decompose indexed groups (shared pool + `[i,j,k]`) — soup-free |\n| `mergeSmallComponents(comps, threshold?)` | Merge small fragments into nearest same-group neighbor |\n| `mergeSmallIndexedComponents(comps, threshold)` | Fold small indexed components into the largest |\n| `mergeComponents(picks)` | Merge user-selected component soups into welded result |\n| `selectSplits(groups, selections)` | Select specific groups with optional flip |\n\n### Normal Functions\n\n| Function | Description |\n|----------|-------------|\n| `triNormal(tri)` | Unit face normal of a triangle |\n| `ensureZUpNormals(tris)` | Flip downward-facing triangles to Z-up |\n| `flipAllNormals(tris)` | Reverse all triangle winding |\n| `classifyNormalDirection(tris, isClosed, volume)` | Classify dominant normal direction |\n| `computeSignedVolume(tris)` | Signed volume via divergence theorem |\n| `computeProjectedArea(tris, plane)` | Projected footprint area |\n| `compute3DSurfaceArea(tris)` | True 3D surface area |\n\n### Intersection Functions\n\n| Function | Description |\n|----------|-------------|\n| `triTriIntersection(triA, triB)` | Moller tri-tri intersection → segment |\n| `triTriIntersectionDetailed(triA, triB)` | With signed distances |\n| `chainSegments(segments, threshold)` | Chain segments into polylines |\n| `simplifyPolyline(points, spacing)` | Distance-based simplification |\n| `buildSpatialGrid(tris, cellSize)` | Build XY spatial hash (for Z-ray) |\n| `buildSpatialGridOnAxes(tris, cellSize, getA, getB)` | Build spatial hash on arbitrary axes |\n| `queryGrid(grid, bb, cellSize)` | Query XY spatial hash |\n| `queryGridOnAxes(grid, a, b, cellSize)` | Query arbitrary-axis spatial hash |\n| `computeBBox(tris)` | Compute axis-aligned bounding box of a triangle array |\n| `triBBox(tri)` | Compute bounding box of a single triangle |\n| `bboxOverlap(a, b)` | Test if two bounding boxes overlap |\n| `estimateAvgEdge(tris)` | Estimate average edge length of a triangle array |\n\n### Boolean Internals (Advanced)\n\n| Function | Description |\n|----------|-------------|\n| `classifyPointMultiAxis(point, otherTris, grids)` | Classify inside/outside via 3-axis majority vote |\n| `classifyByFloodFill(tris, crossedMap, otherTris, otherGrids)` | BFS flood-fill classification with multi-axis seeds |\n| `fanTriangulate(tri, segments)` | Fan triangulation of crossed triangle (primary method) |\n| `retriangulateWithSteinerPoints(tri, segments)` | CDT split of crossed triangle with Steiner points (fallback) |\n| `buildCurtainAndCap(tris, floorOffset)` | Extrude boundary to floor + cap |\n| `generateClosingTriangles(tris, maxDist)` | Iteratively close boundary gaps |\n\n**Internal (non-exported) functions used by the boolean pipeline:**\n\n| Function | Description |\n|----------|-------------|\n| `splitStraddlingAndClassify(tris, classifications, crossedMap, otherTris, otherGrids, otherIdxKey)` | Split crossed tris via fan triangulation, classify via border-segment priority + half-space fallback, enforce constraints across segment edges |\n| `halfSpaceTest(point)` | Classify a point against the nearest intersection segment using the other mesh's triangle normal |\n| `segHalfSpace(point, seg)` | Classify a point against a specific segment's other-mesh triangle plane |\n\n### Utility Functions\n\n| Function | Description |\n|----------|-------------|\n| `dist3(a, b)` | 3D Euclidean distance |\n| `distSq3(a, b)` | Squared 3D distance |\n| `triangleArea3D(tri)` | Triangle area via cross product |\n| `computeBounds(points)` | Axis-aligned bounding box |\n| `cross(a, b)` | 3D cross product |\n| `lerpVert(a, b, t)` | Linear vertex interpolation |\n| `countOpenEdges(tris)` | Count boundary and non-manifold edges |\n| `vKey(v)` | Vertex to string key for spatial hashing |\n| `edgeKey(k1, k2)` | Canonical edge key from two vertex keys |\n| `indexGroups(groups, tolerance?)` | Soup groups → shared points pool + per-group `[i,j,k]` index triples (see [Indexed Group Output](#indexed-group-output)) |\n| `indexGroupsToTypedArrays(indexed)` | Flatten indexed groups → `Float64Array` positions + per-group `Uint32Array` indices |\n\n## Working with Kirra Surface Data\n\nThe library includes real-world mining surface data from the [Kirra](https://github.com/brentbuffham/Kirra) application. Kirra surfaces use the format `{ vertices: [{x,y,z}, ...] }` per triangle. To convert to trimesh-boolean soup:\n\n```javascript\n// Convert Kirra triangles to trimesh-boolean soup\nfunction kirraToSoup(surface) {\n  var soup = [];\n  for (var i = 0; i < surface.triangles.length; i++) {\n    var verts = surface.triangles[i].vertices;\n    if (verts && verts.length >= 3) {\n      soup.push({ v0: verts[0], v1: verts[1], v2: verts[2] });\n    }\n  }\n  return soup;\n}\n```\n\nPre-extracted Kirra surfaces (terrain, cylinder, cup, convoluted block) are included in `examples/public/kirra-surfaces.json` with UTM coordinates centroid-subtracted for demo use. The convoluted block is a 32-triangle open surface that crosses the terrain twice — the hardest test case for multi-crossing classification.\n\nThe Three.js demo (`examples/index.html`) also has **Import KAP** / **Export KAP**: import reads `surfaces.json` from a Kirra `.kap` ZIP into the Mesh A/B dropdowns; export writes a minimal Kirra-compatible archive (manifest + two surfaces for the current Mesh A and B) for round-tripping or testing in Kirra.\n\n## Data Model\n\nThe library uses plain JavaScript objects — no classes, no Three.js types:\n\n```javascript\n// Vertex\n{ x: number, y: number, z: number }\n\n// Triangle (soup format)\n{ v0: Vertex, v1: Vertex, v2: Vertex }\n\n// Welded triangle (indexed format)\n{ vertices: [Vertex, Vertex, Vertex] }\n\n// Segment\n{ p0: Vertex, p1: Vertex }\n```\n\n## How It Works\n\n### Boolean Algorithm — Step by Step\n\n#### Step 1: Intersection Detection\nFind all triangle-triangle intersection segments between mesh A and mesh B using the Moller algorithm.\n- Each segment records its source triangle indices (`idxA`, `idxB`)\n- Builds a `crossedMap` — which triangles are \"crossed\" by the other mesh\n- **Issue:** Moller can miss near-coplanar or edge-on intersections. Deterministic jitter offsets mitigate this.\n\n#### Step 2: Spatial Grid Construction\nBuild 3 spatial hash grids per mesh (XY, YZ, XZ) for accelerated ray casting along Z, X, and Y axes.\n- Cell size is `2x` the average edge length of each mesh\n- Three grids enable multi-axis ray casting (no single-axis blind spots)\n- **Issue:** Very small or very large meshes (sub-mm edges, or UTM 600000+) can cause hash collisions. The library centroid-shifts large coordinates internally.\n\n#### Step 3: Flood-Fill Classification\nBFS from non-crossed seed triangles to classify connected regions as inside/outside via **multi-axis majority vote**.\n- Seed triangles ray-cast along +Z, +X, +Y; 2+ inside votes = inside\n- Classification propagates to all connected non-crossed triangles in the same component\n- **Issue (open surfaces):** Ray-casting against an open mesh is unreliable — rays can escape through open edges and give wrong inside/outside results. For open surfaces, Step 5 corrects these errors using the half-space test.\n\n#### Step 4: Fan Triangulation\nSplit every crossed triangle at its intersection segment endpoints using **fan triangulation** (CDT fallback for edge cases).\n- Chain intersection segments into ordered polylines\n- Identify boundary entry/exit points via barycentric coordinates\n- Fan from each original vertex to sequential chain points — every sub-triangle has at least 1 original vertex and 1 edge on the intersection boundary\n- Eliminates \"pocket triangles\" (all-Steiner sub-triangles) that plagued CDT — reduced from 93 to 5 across test meshes\n- **CDT fallback** for: multiple disconnected polylines, entry/exit on same edge, chain endpoint at original vertex\n\n#### Step 5: Half-Space Classification\nClassify every triangle (non-crossed and crossed sub-triangles) using a multi-stage approach:\n\n**Step D0 — Border-segment priority:** If a crossed sub-triangle shares an edge with an intersection segment, classify its centroid directly against that specific segment's other-mesh triangle plane. This prevents \"nearest segment\" from picking a wrong crossing in multi-crossing scenarios.\n\n**Steps D1-D4 — Fallback chain:** half-space test against nearest segment, vertex adjacency inheritance, sub-triangle centroid half-space, ray-cast centroid (last resort).\n\n**Step E3 — Constraint enforcement:** After initial classification and adjacency propagation, iterate through all segment edges. Sub-triangles sharing a segment edge MUST have opposite classifications (one inside, one outside). Any violations are corrected using the specific segment's plane.\n\n- **Calibration:** The normal convention (outward vs inward) is auto-detected by sampling points near the intersection, offsetting along the triangle normal, and ray-casting.\n- **Why this works for open surfaces:** Unlike ray-casting (which counts boundary crossings and fails for non-watertight meshes), the half-space test only needs local geometry at the intersection.\n- **Confidence propagation:** Confident classifications propagate to adjacent non-confident triangles via edge adjacency.\n- **Known limitation:** Multi-crossing open surfaces can still have spill where the fallback path picks the wrong nearest segment. See KNOWN_ISSUES.md for details.\n\n#### Step 6: Seam Deduplication\nMerge coincident vertices along the intersection boundary to produce a clean seam.\n- Tolerance-based deduplication at `1e-4`\n- Applied independently to each of the 4 groups (aInside, aOutside, bInside, bOutside)\n\n#### Step 7: Normal Propagation\nEnsure consistent winding order across the result mesh.\n- BFS-based winding propagation from a seed triangle\n- Falls back to Z-up normal enforcement if BFS doesn't reach all triangles\n\n#### Step 8: Group Combination\nCombine inside/outside groups based on the requested operation.\n\n| Operation   | Formula                            | Groups kept                          |\n|-------------|------------------------------------|--------------------------------------|\n| `subtract`  | A \\ B                              | A-outside-B + B-inside-A (flipped)   |\n| `union`     | A ∪ B                              | A-outside-B + B-outside-A            |\n| `intersect` | A ∩ B                              | A-inside-B + B-inside-A              |\n\n#### Step 9: Weld & Return\nWeld the combined triangle soup into an indexed mesh and return `{ soup, points, triangles }`.\n\n### Mesh Repair Algorithm\n\n1. **Vertex deduplication** — spatial-grid merge of coincident vertices\n2. **T-junction resolution** — detect and split edges at mid-edge vertices\n3. **Welding** — merge vertices within tolerance\n4. **Degenerate removal** — filter zero-area and sliver triangles\n5. **Stitching** — connect nearby boundary edges\n6. **Capping** — triangulate boundary loops\n7. **Force-close** — fill remaining gaps iteratively\n\n## Dependencies\n\n- **[delaunator](https://github.com/mapbox/delaunator)** — Fast Delaunay triangulation\n- **[@kninnug/constrainautor](https://github.com/kninnug/Constrainautor)** — Constrained Delaunay\n- **[robust-predicates](https://github.com/mourner/robust-predicates)** — Exact arithmetic orientation and incircle tests\n- **[tiny-exact-math](https://www.npmjs.com/package/tiny-exact-math)** — Exact cross product and dot product for degenerate-case handling\n\nOptional peer dependency:\n- **[three](https://threejs.org/)** `>=0.150.0` — Only needed for `trimesh-boolean/three` adapter\n\n## License\n\nMIT\n","readmeFilename":"README.md"}