@faicad/faijs 0.29.3 → 0.30.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (614) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/api-namespace.d.ts +1 -1
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +53 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/appearance.d.ts +136 -0
  7. package/dist/api/appearance.d.ts.map +1 -0
  8. package/dist/api/appearance.js +228 -0
  9. package/dist/api/appearance.js.map +1 -0
  10. package/dist/api/assembly/entities.d.ts +1 -1
  11. package/dist/api/assembly/entities.js +1 -1
  12. package/dist/api/assembly/entities.js.map +1 -1
  13. package/dist/api/assembly/index.d.ts +1 -1
  14. package/dist/api/assembly/index.js +1 -1
  15. package/dist/api/assembly/index.js.map +1 -1
  16. package/dist/api/assembly/joints.d.ts +33 -15
  17. package/dist/api/assembly/joints.d.ts.map +1 -1
  18. package/dist/api/assembly/joints.js +31 -13
  19. package/dist/api/assembly/joints.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.js +1 -1
  22. package/dist/api/assembly/preview.js.map +1 -1
  23. package/dist/api/assembly/solve.d.ts +1 -1
  24. package/dist/api/assembly/solve.js +1 -1
  25. package/dist/api/assembly/solve.js.map +1 -1
  26. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  28. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  29. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  30. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  31. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  32. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  33. package/dist/api/assembly/solvers/global-solver.js +3 -4
  34. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  36. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  37. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  38. package/dist/api/assembly/solvers/linalg.js +2 -2
  39. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  40. package/dist/api/assembly/solvers/types.d.ts +2 -5
  41. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  42. package/dist/api/assembly/solvers/types.js +1 -4
  43. package/dist/api/assembly/solvers/types.js.map +1 -1
  44. package/dist/api/boolean.d.ts.map +1 -1
  45. package/dist/api/boolean.js +7 -6
  46. package/dist/api/boolean.js.map +1 -1
  47. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  48. package/dist/api/brep-mirror/booleanFns.js +5 -5
  49. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  50. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  51. package/dist/api/brep-mirror/compoundFns.js +4 -4
  52. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  53. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  54. package/dist/api/brep-mirror/healingFns.js +4 -4
  55. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  56. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  57. package/dist/api/brep-mirror/hullFns.js +2 -2
  58. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  59. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  60. package/dist/api/brep-mirror/patternFns.js +10 -10
  61. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  62. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  63. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  64. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  65. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  66. package/dist/api/brep-mirror/roofFns.js +7 -7
  67. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  68. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  69. package/dist/api/brep-mirror/sweepFns.js +14 -14
  70. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  71. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  72. package/dist/api/brep-mirror/threadFns.js +1 -1
  73. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  74. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  75. package/dist/api/brep-mirror/topologyFns.js +8 -8
  76. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  77. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  78. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  79. package/dist/api/brep-operations/booleanFns.js +104 -0
  80. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  81. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  82. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  83. package/dist/api/brep-operations/brepHelpers.js +131 -0
  84. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  85. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  86. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/compoundFns.js +299 -0
  88. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  89. package/dist/api/brep-operations/healingFns.d.ts +78 -0
  90. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  91. package/dist/api/brep-operations/healingFns.js +294 -0
  92. package/dist/api/brep-operations/healingFns.js.map +1 -0
  93. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  94. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/hullFns.js +46 -0
  96. package/dist/api/brep-operations/hullFns.js.map +1 -0
  97. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  98. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  99. package/dist/api/brep-operations/joinery-brep.js +463 -0
  100. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  101. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  102. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/patternFns.js +178 -0
  104. package/dist/api/brep-operations/patternFns.js.map +1 -0
  105. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  106. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  107. package/dist/api/brep-operations/primitiveFns.js +104 -0
  108. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  109. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  110. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/roofFns.js +229 -0
  112. package/dist/api/brep-operations/roofFns.js.map +1 -0
  113. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  114. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  115. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  116. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  117. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  118. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/sweepFns.js +323 -0
  120. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  121. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  122. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  123. package/dist/api/brep-operations/threadFns.js +138 -0
  124. package/dist/api/brep-operations/threadFns.js.map +1 -0
  125. package/dist/api/brep-operations/topologyFns.d.ts +90 -0
  126. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/topologyFns.js +276 -0
  128. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  129. package/dist/api/brep-topology.d.ts +1 -1
  130. package/dist/api/brep-topology.d.ts.map +1 -1
  131. package/dist/api/brep-topology.js +1 -1
  132. package/dist/api/brep-topology.js.map +1 -1
  133. package/dist/api/brepjs-compat/index.d.ts +1 -1
  134. package/dist/api/brepjs-compat/index.js +3 -3
  135. package/dist/api/brepjs-compat/index.js.map +1 -1
  136. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  137. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  138. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  139. package/dist/api/curve-sketch/index.d.ts +235 -0
  140. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  141. package/dist/api/curve-sketch/index.js +487 -0
  142. package/dist/api/curve-sketch/index.js.map +1 -0
  143. package/dist/api/engrave.d.ts.map +1 -1
  144. package/dist/api/engrave.js +3 -2
  145. package/dist/api/engrave.js.map +1 -1
  146. package/dist/api/export-brep.d.ts +41 -0
  147. package/dist/api/export-brep.d.ts.map +1 -0
  148. package/dist/api/export-brep.js +58 -0
  149. package/dist/api/export-brep.js.map +1 -0
  150. package/dist/api/export-stl.d.ts +50 -0
  151. package/dist/api/export-stl.d.ts.map +1 -0
  152. package/dist/api/export-stl.js +99 -0
  153. package/dist/api/export-stl.js.map +1 -0
  154. package/dist/api/extrude.d.ts +8 -11
  155. package/dist/api/extrude.d.ts.map +1 -1
  156. package/dist/api/extrude.js +11 -14
  157. package/dist/api/extrude.js.map +1 -1
  158. package/dist/api/fillet-variable.d.ts +2 -2
  159. package/dist/api/fillet-variable.js +2 -2
  160. package/dist/api/fillet-variable.js.map +1 -1
  161. package/dist/api/fillet.d.ts +2 -4
  162. package/dist/api/fillet.d.ts.map +1 -1
  163. package/dist/api/fillet.js +2 -4
  164. package/dist/api/fillet.js.map +1 -1
  165. package/dist/api/generated/2d.d.ts +4 -0
  166. package/dist/api/generated/2d.d.ts.map +1 -1
  167. package/dist/api/generated/2d.js +4 -0
  168. package/dist/api/generated/2d.js.map +1 -1
  169. package/dist/api/generated/core.d.ts +4 -0
  170. package/dist/api/generated/core.d.ts.map +1 -1
  171. package/dist/api/generated/core.js +4 -0
  172. package/dist/api/generated/core.js.map +1 -1
  173. package/dist/api/generated/gear.d.ts +4 -0
  174. package/dist/api/generated/gear.d.ts.map +1 -1
  175. package/dist/api/generated/gear.js +4 -0
  176. package/dist/api/generated/gear.js.map +1 -1
  177. package/dist/api/generated/io.d.ts +4 -0
  178. package/dist/api/generated/io.d.ts.map +1 -1
  179. package/dist/api/generated/io.js +4 -0
  180. package/dist/api/generated/io.js.map +1 -1
  181. package/dist/api/generated/kernel.d.ts +4 -0
  182. package/dist/api/generated/kernel.d.ts.map +1 -1
  183. package/dist/api/generated/kernel.js +4 -0
  184. package/dist/api/generated/kernel.js.map +1 -1
  185. package/dist/api/generated/measurement.d.ts +21 -21
  186. package/dist/api/generated/measurement.d.ts.map +1 -1
  187. package/dist/api/generated/measurement.js +25 -21
  188. package/dist/api/generated/measurement.js.map +1 -1
  189. package/dist/api/generated/ns.d.ts +4 -0
  190. package/dist/api/generated/ns.d.ts.map +1 -1
  191. package/dist/api/generated/ns.js +4 -0
  192. package/dist/api/generated/ns.js.map +1 -1
  193. package/dist/api/generated/operations.d.ts +32 -32
  194. package/dist/api/generated/operations.d.ts.map +1 -1
  195. package/dist/api/generated/operations.js +52 -48
  196. package/dist/api/generated/operations.js.map +1 -1
  197. package/dist/api/generated/projection.d.ts +4 -0
  198. package/dist/api/generated/projection.d.ts.map +1 -1
  199. package/dist/api/generated/projection.js +4 -0
  200. package/dist/api/generated/projection.js.map +1 -1
  201. package/dist/api/generated/query.d.ts +4 -0
  202. package/dist/api/generated/query.d.ts.map +1 -1
  203. package/dist/api/generated/query.js +4 -0
  204. package/dist/api/generated/query.js.map +1 -1
  205. package/dist/api/generated/sketching.d.ts +2 -2
  206. package/dist/api/generated/sketching.d.ts.map +1 -1
  207. package/dist/api/generated/sketching.js +7 -3
  208. package/dist/api/generated/sketching.js.map +1 -1
  209. package/dist/api/generated/text.d.ts +4 -0
  210. package/dist/api/generated/text.d.ts.map +1 -1
  211. package/dist/api/generated/text.js +4 -0
  212. package/dist/api/generated/text.js.map +1 -1
  213. package/dist/api/generated/topology.d.ts +45 -45
  214. package/dist/api/generated/topology.d.ts.map +1 -1
  215. package/dist/api/generated/topology.js +67 -63
  216. package/dist/api/generated/topology.js.map +1 -1
  217. package/dist/api/generated/view.d.ts +4 -0
  218. package/dist/api/generated/view.d.ts.map +1 -1
  219. package/dist/api/generated/view.js +4 -0
  220. package/dist/api/generated/view.js.map +1 -1
  221. package/dist/api/geom-types/constants.d.ts +11 -0
  222. package/dist/api/geom-types/constants.d.ts.map +1 -0
  223. package/dist/api/geom-types/constants.js +11 -0
  224. package/dist/api/geom-types/constants.js.map +1 -0
  225. package/dist/api/geom-types/index.d.ts +21 -0
  226. package/dist/api/geom-types/index.d.ts.map +1 -0
  227. package/dist/api/geom-types/index.js +22 -0
  228. package/dist/api/geom-types/index.js.map +1 -0
  229. package/dist/api/geom-types/planeOps.d.ts +98 -0
  230. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  231. package/dist/api/geom-types/planeOps.js +170 -0
  232. package/dist/api/geom-types/planeOps.js.map +1 -0
  233. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  234. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  235. package/dist/api/geom-types/planeTypes.js +8 -0
  236. package/dist/api/geom-types/planeTypes.js.map +1 -0
  237. package/dist/api/geom-types/types.d.ts +64 -0
  238. package/dist/api/geom-types/types.d.ts.map +1 -0
  239. package/dist/api/geom-types/types.js +48 -0
  240. package/dist/api/geom-types/types.js.map +1 -0
  241. package/dist/api/geom-types/vecOps.d.ts +124 -0
  242. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  243. package/dist/api/geom-types/vecOps.js +202 -0
  244. package/dist/api/geom-types/vecOps.js.map +1 -0
  245. package/dist/api/geom.d.ts.map +1 -1
  246. package/dist/api/geom.js +6 -5
  247. package/dist/api/geom.js.map +1 -1
  248. package/dist/api/half-space.d.ts +56 -0
  249. package/dist/api/half-space.d.ts.map +1 -0
  250. package/dist/api/half-space.js +82 -0
  251. package/dist/api/half-space.js.map +1 -0
  252. package/dist/api/helix.d.ts +10 -1
  253. package/dist/api/helix.d.ts.map +1 -1
  254. package/dist/api/helix.js +19 -3
  255. package/dist/api/helix.js.map +1 -1
  256. package/dist/api/import-step.d.ts.map +1 -1
  257. package/dist/api/import-step.js +28 -0
  258. package/dist/api/import-step.js.map +1 -1
  259. package/dist/api/index.d.ts +19 -6
  260. package/dist/api/index.d.ts.map +1 -1
  261. package/dist/api/index.js +31 -8
  262. package/dist/api/index.js.map +1 -1
  263. package/dist/api/internal/compat-op.d.ts +4 -30
  264. package/dist/api/internal/compat-op.d.ts.map +1 -1
  265. package/dist/api/internal/compat-op.js +10 -42
  266. package/dist/api/internal/compat-op.js.map +1 -1
  267. package/dist/api/internal/compat-projection.d.ts +5 -5
  268. package/dist/api/internal/compat-projection.js +5 -5
  269. package/dist/api/internal/compat-projection.js.map +1 -1
  270. package/dist/api/internal/dual-form-args.d.ts +0 -2
  271. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  272. package/dist/api/internal/dual-form-args.js +1 -3
  273. package/dist/api/internal/dual-form-args.js.map +1 -1
  274. package/dist/api/internal/l3-bridge.d.ts +5 -37
  275. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  276. package/dist/api/internal/l3-bridge.js +7 -76
  277. package/dist/api/internal/l3-bridge.js.map +1 -1
  278. package/dist/api/internal/profile-wire.d.ts +1 -1
  279. package/dist/api/internal/profile-wire.js +1 -1
  280. package/dist/api/internal/profile-wire.js.map +1 -1
  281. package/dist/api/internal/result-unwrap.d.ts +4 -6
  282. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  283. package/dist/api/internal/result-unwrap.js +4 -6
  284. package/dist/api/internal/result-unwrap.js.map +1 -1
  285. package/dist/api/knurl.d.ts.map +1 -1
  286. package/dist/api/knurl.js +5 -3
  287. package/dist/api/knurl.js.map +1 -1
  288. package/dist/api/loft.d.ts +2 -2
  289. package/dist/api/loft.d.ts.map +1 -1
  290. package/dist/api/loft.js +2 -2
  291. package/dist/api/loft.js.map +1 -1
  292. package/dist/api/measurement/index.d.ts +3 -3
  293. package/dist/api/measurement/index.js +3 -3
  294. package/dist/api/measurement/index.js.map +1 -1
  295. package/dist/api/meta.d.ts +91 -0
  296. package/dist/api/meta.d.ts.map +1 -0
  297. package/dist/api/meta.js +97 -0
  298. package/dist/api/meta.js.map +1 -0
  299. package/dist/api/offset2d.d.ts +49 -0
  300. package/dist/api/offset2d.d.ts.map +1 -0
  301. package/dist/api/offset2d.js +86 -0
  302. package/dist/api/offset2d.js.map +1 -0
  303. package/dist/api/pattern.js +3 -3
  304. package/dist/api/pattern.js.map +1 -1
  305. package/dist/api/primitives.d.ts.map +1 -1
  306. package/dist/api/primitives.js +124 -8
  307. package/dist/api/primitives.js.map +1 -1
  308. package/dist/api/replicate.d.ts +2 -2
  309. package/dist/api/replicate.d.ts.map +1 -1
  310. package/dist/api/replicate.js +12 -12
  311. package/dist/api/replicate.js.map +1 -1
  312. package/dist/api/result.d.ts +1 -1
  313. package/dist/api/result.js +1 -1
  314. package/dist/api/result.js.map +1 -1
  315. package/dist/api/revolve.d.ts +2 -2
  316. package/dist/api/revolve.js +3 -3
  317. package/dist/api/revolve.js.map +1 -1
  318. package/dist/api/screw.d.ts +1 -1
  319. package/dist/api/screw.d.ts.map +1 -1
  320. package/dist/api/screw.js +5 -4
  321. package/dist/api/screw.js.map +1 -1
  322. package/dist/api/sdf.d.ts.map +1 -1
  323. package/dist/api/sdf.js +3 -2
  324. package/dist/api/sdf.js.map +1 -1
  325. package/dist/api/shape-type/index.d.ts +141 -0
  326. package/dist/api/shape-type/index.d.ts.map +1 -0
  327. package/dist/api/shape-type/index.js +182 -0
  328. package/dist/api/shape-type/index.js.map +1 -0
  329. package/dist/api/shell.d.ts +2 -2
  330. package/dist/api/shell.js +2 -2
  331. package/dist/api/shell.js.map +1 -1
  332. package/dist/api/solid-from-faces.d.ts +45 -0
  333. package/dist/api/solid-from-faces.d.ts.map +1 -0
  334. package/dist/api/solid-from-faces.js +72 -0
  335. package/dist/api/solid-from-faces.js.map +1 -0
  336. package/dist/api/solid-offset/index.d.ts +67 -0
  337. package/dist/api/solid-offset/index.d.ts.map +1 -0
  338. package/dist/api/solid-offset/index.js +132 -0
  339. package/dist/api/solid-offset/index.js.map +1 -0
  340. package/dist/api/surface/arg-spec.d.ts +35 -33
  341. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  342. package/dist/api/surface/arg-spec.js +222 -224
  343. package/dist/api/surface/arg-spec.js.map +1 -1
  344. package/dist/api/surface-face/index.d.ts +104 -0
  345. package/dist/api/surface-face/index.d.ts.map +1 -0
  346. package/dist/api/surface-face/index.js +217 -0
  347. package/dist/api/surface-face/index.js.map +1 -0
  348. package/dist/api/surface.d.ts +44 -0
  349. package/dist/api/surface.d.ts.map +1 -0
  350. package/dist/api/surface.js +66 -0
  351. package/dist/api/surface.js.map +1 -0
  352. package/dist/api/sweep.d.ts +59 -9
  353. package/dist/api/sweep.d.ts.map +1 -1
  354. package/dist/api/sweep.js +11 -6
  355. package/dist/api/sweep.js.map +1 -1
  356. package/dist/api/thicken.d.ts +1 -1
  357. package/dist/api/thicken.js +1 -1
  358. package/dist/api/thicken.js.map +1 -1
  359. package/dist/api/transform.d.ts +5 -5
  360. package/dist/api/transform.d.ts.map +1 -1
  361. package/dist/api/transform.js +11 -10
  362. package/dist/api/transform.js.map +1 -1
  363. package/dist/api/view/cameraFns.d.ts +1 -1
  364. package/dist/api/view/cameraFns.d.ts.map +1 -1
  365. package/dist/api/view/cameraFns.js +1 -1
  366. package/dist/api/view/cameraFns.js.map +1 -1
  367. package/dist/api/view/index.d.ts +0 -2
  368. package/dist/api/view/index.d.ts.map +1 -1
  369. package/dist/api/view/index.js +0 -2
  370. package/dist/api/view/index.js.map +1 -1
  371. package/dist/api/view/projectionPlanes.d.ts +1 -1
  372. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  373. package/dist/api/view/projectionPlanes.js.map +1 -1
  374. package/dist/api/view/view-camera.d.ts +7 -9
  375. package/dist/api/view/view-camera.d.ts.map +1 -1
  376. package/dist/api/view/view-camera.js +4 -6
  377. package/dist/api/view/view-camera.js.map +1 -1
  378. package/dist/api/view/view-projection.d.ts +0 -2
  379. package/dist/api/view/view-projection.d.ts.map +1 -1
  380. package/dist/api/view/view-projection.js +0 -2
  381. package/dist/api/view/view-projection.js.map +1 -1
  382. package/dist/api/view/view-sheet.d.ts +0 -2
  383. package/dist/api/view/view-sheet.d.ts.map +1 -1
  384. package/dist/api/view/view-sheet.js +0 -2
  385. package/dist/api/view/view-sheet.js.map +1 -1
  386. package/dist/api/view-export/index.d.ts +97 -0
  387. package/dist/api/view-export/index.d.ts.map +1 -0
  388. package/dist/api/view-export/index.js +118 -0
  389. package/dist/api/view-export/index.js.map +1 -0
  390. package/dist/brep/brep-ops.d.ts +89 -1
  391. package/dist/brep/brep-ops.d.ts.map +1 -1
  392. package/dist/brep/brep-ops.js +204 -13
  393. package/dist/brep/brep-ops.js.map +1 -1
  394. package/dist/brep/brep-topology.d.ts +20 -0
  395. package/dist/brep/brep-topology.d.ts.map +1 -1
  396. package/dist/brep/brep-topology.js +46 -0
  397. package/dist/brep/brep-topology.js.map +1 -1
  398. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  399. package/dist/brep/engine/adapters/occt.js +8 -8
  400. package/dist/brep/engine/adapters/occt.js.map +1 -1
  401. package/dist/brep/engine/primitives.d.ts +2 -3
  402. package/dist/brep/engine/primitives.d.ts.map +1 -1
  403. package/dist/brep/engine/primitives.js +1 -2
  404. package/dist/brep/engine/primitives.js.map +1 -1
  405. package/dist/brep/engine/registry.d.ts +1 -1
  406. package/dist/brep/engine/registry.js +1 -1
  407. package/dist/brep/engine/registry.js.map +1 -1
  408. package/dist/brep/engine/types.d.ts +2 -2
  409. package/dist/brep/engine/types.js.map +1 -1
  410. package/dist/brep/export/export-model.d.ts +40 -0
  411. package/dist/brep/export/export-model.d.ts.map +1 -1
  412. package/dist/brep/export/export-model.js +268 -25
  413. package/dist/brep/export/export-model.js.map +1 -1
  414. package/dist/brep/export/step-meta-header.d.ts +102 -0
  415. package/dist/brep/export/step-meta-header.d.ts.map +1 -0
  416. package/dist/brep/export/step-meta-header.js +225 -0
  417. package/dist/brep/export/step-meta-header.js.map +1 -0
  418. package/dist/brep/export/step.d.ts +5 -1
  419. package/dist/brep/export/step.d.ts.map +1 -1
  420. package/dist/brep/export/step.js +11 -2
  421. package/dist/brep/export/step.js.map +1 -1
  422. package/dist/brep/handle-bridge.d.ts +2 -2
  423. package/dist/brep/handle-bridge.js +2 -2
  424. package/dist/brep/handle-bridge.js.map +1 -1
  425. package/dist/brep/index.d.ts +6 -3
  426. package/dist/brep/index.d.ts.map +1 -1
  427. package/dist/brep/index.js +6 -3
  428. package/dist/brep/index.js.map +1 -1
  429. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  430. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  431. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  432. package/dist/browser.d.ts +2 -2
  433. package/dist/browser.d.ts.map +1 -1
  434. package/dist/browser.js +5 -4
  435. package/dist/browser.js.map +1 -1
  436. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  437. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  438. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  439. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  440. package/dist/cad-runtime/backend-dispatch.js +12 -3
  441. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  442. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  443. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  444. package/dist/cad-runtime/direct-executor.js +31 -9
  445. package/dist/cad-runtime/direct-executor.js.map +1 -1
  446. package/dist/cad-runtime/interp/env.d.ts +1 -1
  447. package/dist/cad-runtime/interp/env.js.map +1 -1
  448. package/dist/cad-runtime/lib-id.d.ts +0 -2
  449. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  450. package/dist/cad-runtime/lib-id.js +0 -2
  451. package/dist/cad-runtime/lib-id.js.map +1 -1
  452. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  453. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  454. package/dist/cad-runtime/live-shapes.js +8 -10
  455. package/dist/cad-runtime/live-shapes.js.map +1 -1
  456. package/dist/cad-runtime/ports.d.ts +3 -3
  457. package/dist/cad-runtime/ports.js.map +1 -1
  458. package/dist/cad-runtime/runtime.d.ts +21 -7
  459. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  460. package/dist/cad-runtime/runtime.js +45 -6
  461. package/dist/cad-runtime/runtime.js.map +1 -1
  462. package/dist/define-op.d.ts +4 -3
  463. package/dist/define-op.d.ts.map +1 -1
  464. package/dist/define-op.js +65 -3
  465. package/dist/define-op.js.map +1 -1
  466. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  467. package/dist/geometry2d/bridge/plane.js +1 -1
  468. package/dist/geometry2d/bridge/plane.js.map +1 -1
  469. package/dist/geometry2d/curve2d.d.ts +1 -1
  470. package/dist/geometry2d/curve2d.js +1 -1
  471. package/dist/geometry2d/curve2d.js.map +1 -1
  472. package/dist/index.d.ts +1 -1
  473. package/dist/index.d.ts.map +1 -1
  474. package/dist/index.js +10 -4
  475. package/dist/index.js.map +1 -1
  476. package/dist/io/fai-zip/container-read.d.ts +16 -0
  477. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  478. package/dist/io/fai-zip/container-read.js +22 -0
  479. package/dist/io/fai-zip/container-read.js.map +1 -1
  480. package/dist/io/fai-zip/index.d.ts +1 -1
  481. package/dist/io/fai-zip/index.d.ts.map +1 -1
  482. package/dist/io/fai-zip/index.js +1 -1
  483. package/dist/io/fai-zip/index.js.map +1 -1
  484. package/dist/lang/code-to-args.d.ts.map +1 -1
  485. package/dist/lang/code-to-args.js +10 -1
  486. package/dist/lang/code-to-args.js.map +1 -1
  487. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  488. package/dist/lang/determinism-scanner.js +22 -9
  489. package/dist/lang/determinism-scanner.js.map +1 -1
  490. package/dist/lang/metadata-extractor.d.ts +27 -6
  491. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  492. package/dist/lang/metadata-extractor.js +90 -29
  493. package/dist/lang/metadata-extractor.js.map +1 -1
  494. package/dist/lang/parse-error.d.ts +4 -0
  495. package/dist/lang/parse-error.d.ts.map +1 -1
  496. package/dist/lang/parse-error.js.map +1 -1
  497. package/dist/lang/security-scanner.d.ts +27 -2
  498. package/dist/lang/security-scanner.d.ts.map +1 -1
  499. package/dist/lang/security-scanner.js +29 -2
  500. package/dist/lang/security-scanner.js.map +1 -1
  501. package/dist/lang/source-edit.d.ts +2 -2
  502. package/dist/lang/source-edit.js.map +1 -1
  503. package/dist/lang/symbol-table.generated.d.ts +36 -0
  504. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  505. package/dist/lang/symbol-table.generated.js +36 -0
  506. package/dist/lang/symbol-table.generated.js.map +1 -1
  507. package/dist/lang/types.d.ts +5 -6
  508. package/dist/lang/types.d.ts.map +1 -1
  509. package/dist/lang/types.js.map +1 -1
  510. package/dist/mesh/import-model.d.ts +94 -0
  511. package/dist/mesh/import-model.d.ts.map +1 -0
  512. package/dist/mesh/import-model.js +15 -0
  513. package/dist/mesh/import-model.js.map +1 -0
  514. package/dist/mesh/index.d.ts +19 -58
  515. package/dist/mesh/index.d.ts.map +1 -1
  516. package/dist/mesh/index.js +19 -70
  517. package/dist/mesh/index.js.map +1 -1
  518. package/dist/mesh/io.d.ts +39 -16
  519. package/dist/mesh/io.d.ts.map +1 -1
  520. package/dist/mesh/io.js +151 -22
  521. package/dist/mesh/io.js.map +1 -1
  522. package/dist/mesh/primitives.d.ts.map +1 -1
  523. package/dist/mesh/primitives.js +42 -7
  524. package/dist/mesh/primitives.js.map +1 -1
  525. package/dist/mesh/threemf-bambu.d.ts +12 -1
  526. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  527. package/dist/mesh/threemf-bambu.js +68 -16
  528. package/dist/mesh/threemf-bambu.js.map +1 -1
  529. package/dist/mesh/threemf-loader.d.ts +37 -1
  530. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  531. package/dist/mesh/threemf-loader.js +205 -14
  532. package/dist/mesh/threemf-loader.js.map +1 -1
  533. package/dist/mesh/transform.d.ts +1 -1
  534. package/dist/mesh/transform.js +1 -1
  535. package/dist/mesh/transform.js.map +1 -1
  536. package/dist/mesh/types.d.ts +43 -5
  537. package/dist/mesh/types.d.ts.map +1 -1
  538. package/dist/mesh/types.js.map +1 -1
  539. package/dist/node-host/cli.d.ts +49 -1
  540. package/dist/node-host/cli.d.ts.map +1 -1
  541. package/dist/node-host/cli.js +125 -19
  542. package/dist/node-host/cli.js.map +1 -1
  543. package/dist/node-host/execute-script.d.ts +55 -0
  544. package/dist/node-host/execute-script.d.ts.map +1 -0
  545. package/dist/node-host/execute-script.js +46 -0
  546. package/dist/node-host/execute-script.js.map +1 -0
  547. package/dist/node.d.ts +2 -0
  548. package/dist/node.d.ts.map +1 -1
  549. package/dist/node.js +3 -0
  550. package/dist/node.js.map +1 -1
  551. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  552. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  553. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  554. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  555. package/dist/occt-kernel/highLevelApi.d.ts +4 -1
  556. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  557. package/dist/occt-kernel/highLevelApi.js +4 -2
  558. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  559. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  560. package/dist/occt-kernel/hullGeometry.js +2 -3
  561. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  562. package/dist/occt-kernel/hullOps.d.ts +3 -3
  563. package/dist/occt-kernel/hullOps.js +4 -4
  564. package/dist/occt-kernel/hullOps.js.map +1 -1
  565. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  566. package/dist/occt-kernel/occt-primitives.js +32 -5
  567. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  568. package/dist/occt-kernel/occtKernel.d.ts +1 -1
  569. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  570. package/dist/occt-kernel/occtKernel.js +19 -1
  571. package/dist/occt-kernel/occtKernel.js.map +1 -1
  572. package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
  573. package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
  574. package/dist/occt-kernel/stepMetaParser.js +166 -0
  575. package/dist/occt-kernel/stepMetaParser.js.map +1 -0
  576. package/dist/occt-scan/recognize.d.ts +58 -0
  577. package/dist/occt-scan/recognize.d.ts.map +1 -0
  578. package/dist/occt-scan/recognize.js +216 -0
  579. package/dist/occt-scan/recognize.js.map +1 -0
  580. package/dist/primitives/brep-primitives.js +7 -7
  581. package/dist/primitives/brep-primitives.js.map +1 -1
  582. package/dist/result/bug.d.ts +1 -1
  583. package/dist/result/bug.js +1 -1
  584. package/dist/result/bug.js.map +1 -1
  585. package/dist/result/errors.d.ts +2 -2
  586. package/dist/result/errors.d.ts.map +1 -1
  587. package/dist/result/errors.js +1 -1
  588. package/dist/result/errors.js.map +1 -1
  589. package/dist/result/vec3.d.ts +1 -1
  590. package/dist/result/vec3.js +1 -1
  591. package/dist/result/vec3.js.map +1 -1
  592. package/dist/runtime-state.d.ts +16 -0
  593. package/dist/runtime-state.d.ts.map +1 -1
  594. package/dist/runtime-state.js +27 -0
  595. package/dist/runtime-state.js.map +1 -1
  596. package/dist/script-globals.d.ts +24 -0
  597. package/dist/script-globals.d.ts.map +1 -0
  598. package/dist/script-globals.js +24 -0
  599. package/dist/script-globals.js.map +1 -0
  600. package/dist/shape.d.ts +35 -3
  601. package/dist/shape.d.ts.map +1 -1
  602. package/dist/shape.js +44 -2
  603. package/dist/shape.js.map +1 -1
  604. package/dist/step/stepMetaParser.d.ts +55 -0
  605. package/dist/step/stepMetaParser.d.ts.map +1 -0
  606. package/dist/step/stepMetaParser.js +177 -0
  607. package/dist/step/stepMetaParser.js.map +1 -0
  608. package/dist/topology/naming/lineage.d.ts +3 -2
  609. package/dist/topology/naming/lineage.d.ts.map +1 -1
  610. package/dist/topology/naming/lineage.js.map +1 -1
  611. package/dist/weapp.d.ts +1 -1
  612. package/dist/weapp.js +1 -1
  613. package/dist/weapp.js.map +1 -1
  614. package/package.json +9 -11
@@ -1 +1 @@
1
- {"version":3,"file":"compat-op.js","sourceRoot":"","sources":["../../../src/api/internal/compat-op.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * compat-op — lift an arbitrary brepjs-shaped function into a faijs statement\n * op, built **on top of** defineOp (single implementation entry, v1).\n *\n * Design: docs/plans/2026-09-06-compatop-on-defineop.md §3\n *\n * compatOp is NOT a second implementation path parallel to defineOp: every\n * shared mechanism is owned by defineOp — dispatch (dispatchPath + capability\n * routing), the Result boundary (runImpl + unwrapResult), product wrapping\n * (wrapBrepOne / wrapByKeys), `DUAL_OP_META` mounting and\n * `assertLibConforms` validation. compatOp only does two things:\n * - spec pass-through: `CompatSpec` is a combinatorial inheritance of\n * `DualOpOptions` (single source of truth, fields auto-sync — §3.1);\n * - adapter construction: a brepjs-shaped bridge feeding the brep impl — the\n * three bridging steps that cannot be shared (all reuse shared\n * infrastructure, §3.2):\n * 1. borrowDeep — inward borrow: deep walk, any faijs Shape →\n * borrowBrepjsShape view (zero-copy; library-private handles pass\n * through untouched);\n * 2. call + unwrap — callBrepjs through the shared unwrapResult\n * (`err` throws an OpError carrying the op name + BrepError code);\n * async library fns are awaited first, so `Promise<Result<…>>` —\n * the shape every kernel-awaiting library returns — unwraps too;\n * 3. adoptOut — outward adoption: top-level handle / `outputs`-declared\n * fields (single handle or handle array) → adoptEntity\n * (unregister finalizer + fromHandle).\n *\n * The keep / keepHidden contract is untouched: compatOp neither blocks nor\n * rewrites it — any function running inside a DirectExecutor context can use\n * function-body declarations (C1), and call-site declarations override them\n * (`lang/keep.ts` resolveKeep). The decorated product therefore behaves like\n * any defineOp product: `keep`-safe, capability-aware, multi-output\n * (`DUAL_OP_META.outputs` visible).\n *\n * No self-invented fields: `CompatSpec` extends `Omit<DualOpOptions, 'mesh' |\n * 'brep'>` and declares nothing else; the only tweak is `name` tightened\n * (inherited field, not a new one).\n *\n * @module\n */\n\nimport {\n defineOp,\n DUAL_OP_META,\n type DualOpMeta,\n type DualOpOptions,\n type BrepImpl,\n type BrepProduct,\n} from '../../define-op'\nimport { isShape } from '../../shape'\nimport { borrowBrepjsShape, adoptEntity, callBrepjs } from './l3-bridge'\nimport { unwrapResult } from './result-unwrap'\nimport type { Shape } from '../../mesh/types'\n\n/** compatOp's static spec: combinatorial inheritance (single source of truth). */\nexport interface CompatSpec extends Omit<DualOpOptions, 'mesh' | 'brep'> {\n /** Op name (error messages + metadata; required, unlike defineOp's optional name). */\n name: string\n /**\n * 是否按 brepjs 句柄形态借入输入(默认 true)。\n *\n * faijs 化库(内部直接消费 core Shape 与 core op,如 sheetmetal)必须传\n * `borrow: false`:borrowDeep 会把嵌套的 faijs Shape 替换成 brepjs 形态的\n * `BorrowedShapeHandle`,而 core op 只认带 BREP 槽的 Shape,替换后库内部\n * 布尔/拓扑调用会报「input is not on the BREP chain」。真 brepjs 形态的库\n * (消费 ShapeHandle 对象)保持默认 true。\n */\n borrow?: boolean\n}\n\nconst MAX_WALK_DEPTH = 4\n\n/**\n * Inward bridging step: deep walk with faijs Shapes replaced by borrowed\n * brepjs views (zero-copy); everything else passes through.\n * Class instances are not traversed (defensive); library-private handles\n * pass through (§4.3.4 of the design).\n *\n * @param v - the value to borrow from (plain object, array, or primitive).\n * @param depth - current traversal depth (guard against deep recursion).\n * @returns the value with faijs Shapes replaced by borrowed views.\n */\nexport function borrowDeep(v: unknown, depth: number): unknown {\n if (depth > MAX_WALK_DEPTH || v === null || typeof v !== 'object') return v\n if (isShape(v)) return borrowBrepjsShape(v)\n if (Array.isArray(v)) return v.map((x) => borrowDeep(x, depth + 1))\n if (Object.getPrototypeOf(v) !== Object.prototype) return v\n const out: Record<string, unknown> = {}\n for (const [k, x] of Object.entries(v)) out[k] = borrowDeep(x, depth + 1)\n return out\n}\n\n/**\n * Statement-boundary unwrap — `err` becomes an execution error carrying the op\n * name and the `BrepError` code. Delegates to the shared\n * {@link unwrapResult} so the compat boundary and defineOp's Result boundary\n * share one leaf implementation (no drift).\n *\n * @param r - the Result-like value to unwrap.\n * @param name - the op name used in error messages.\n * @returns the unwrapped ok value.\n */\nexport function unwrapOrThrow(r: unknown, name: string): unknown {\n return unwrapResult(r, name)\n}\n\n/**\n * Bridging step: outward adoption — top-level handle or `outputs`-declared\n * fields → adoptEntity (unregister finalizer + fromHandle). `outputs` may also\n * name an array field of handles; every element is adopted individually.\n * Deduplication of already-adopted handles lives inside adoptEntity. A field\n * already being a faijs Shape passes through untouched (no double adoption).\n *\n * @param v - the library product.\n * @param spec - the compat spec (name + optional `outputs`).\n * @param segments - caller-provided `segments` (裁决 1,§5.2), forwarded so the\n * adopted handles' tessellation honors it.\n * @returns the adopted record / Shape, or the plain data untouched.\n */\nfunction adoptOut(v: unknown, spec: CompatSpec, segments?: number): unknown {\n if (isShape(v)) return v\n if (spec.outputs && typeof v === 'object' && v !== null && !Array.isArray(v)) {\n const rec = v as Record<string, unknown>\n for (const f of spec.outputs) {\n const field = rec[f]\n rec[f] = Array.isArray(field)\n ? field.map((x) => adoptEntity(x, spec.name, segments))\n : adoptEntity(field, spec.name, segments)\n }\n return v\n }\n return adoptEntity(v, spec.name, segments)\n}\n\n/**\n * Read the caller-supplied tessellation density from a compat op's args.\n *\n * 裁决 1:faijs 的 `segments` 显式超集在 brepjs 投影侧也必须可选;这里从调用点\n * 的尾参 options(或任一 plain-object 实参)抓取 `segments`,在产出句柄被收编为\n * faijs Shape 时透传给 `fromHandle` 的三角化(§5.2 机制)。默认不传 = 由\n * handle-bridge 的 64 兜底。\n */\nfunction readSegmentsFromArgs(args: unknown[]): number | undefined {\n for (let i = args.length - 1; i >= 0; i--) {\n const a = args[i]\n if (\n a !== null &&\n typeof a === 'object' &&\n !Array.isArray(a) &&\n Object.getPrototypeOf(a) === Object.prototype\n ) {\n const seg = (a as Record<string, unknown>).segments\n if (typeof seg === 'number' && Number.isFinite(seg)) return seg\n }\n }\n return undefined\n}\n\n/**\n * Build the brep-only adapter: borrow inputs → call the vendor function through\n * the shared unwrap → adopt the product (with the caller's `segments`,\n * 裁决 1/§5.2). The adapter never dispatches and never mounts metadata —\n * those are defineOp's.\n *\n * @param fn the brepjs-shaped function (dual-form normalization inside, D11).\n * @param spec the static op spec (name + options pass-through).\n * @returns a `BrepImpl` compatible with defineOp's brep-only decl.\n */\nfunction buildAdapter(fn: (...args: unknown[]) => unknown, spec: CompatSpec): BrepImpl<unknown[]> {\n return async (...args: unknown[]): Promise<BrepProduct> => {\n // borrow: false(faijs 化库)时输入原样直传——嵌套的 core Shape 保留其\n // BREP 槽,库内部调 core op 才能取到 OCCT 句柄(否则报 input not on the\n // BREP chain)。默认 true 保持 brepjs 形态库的借入语义。\n const effective = spec.borrow === false ? args : args.map((a) => borrowDeep(a, 0))\n // Async library fns are supported: a library that awaits its kernel (every\n // `@faicad/faijs-gears` factory does — `await getGearKernel()`) returns\n // `Promise<Result<…>>`, and the shared unwrap is a sync leaf that only\n // recognizes settled Result records. Awaiting a non-promise product is a\n // no-op, so sync libraries are unaffected.\n const value = unwrapOrThrow(await callBrepjs(fn as never, effective), spec.name)\n return adoptOut(value, spec, readSegmentsFromArgs(args)) as BrepProduct\n }\n}\n\n/** Carrier of the DualOpMeta mounted by defineOp (same shape as defineOp's). */\ntype MetaCarrier = { [DUAL_OP_META]?: DualOpMeta }\n\n/**\n * Lift a brepjs-shaped function into a defineOp-decorated op facade (brep-only).\n *\n * The decorated product is identical to a defineOp product: same `DUAL_OP_META`\n * field set (kind 'dual-op', brep impl, name, capabilities, outputs, schema,\n * slotMap), same dispatch semantics, same Result boundary. The adapter carries\n * only the brepjs bridging (borrow / call / adopt); every other mechanism\n * belongs to defineOp.\n *\n * @param fn the brepjs-shaped function.\n * @param spec the static spec (name required; capabilities/outputs/slotMap/\n * schema pass through and take effect).\n * @returns the compat op facade, carrying dual-op metadata.\n */\nexport function compatOp(\n fn: (...args: unknown[]) => unknown,\n spec: CompatSpec,\n): ((...args: unknown[]) => Promise<Shape>) & MetaCarrier {\n const { outputs, capabilities, engines, schema, slotMap, naming } = spec\n // `outputs` flows through defineOp's own wrapping path: the adapter adopts\n // per declared field, then defineOp wraps — isShape passthrough, so no\n // double wrapping (§3.2).\n return defineOp({\n brep: buildAdapter(fn, spec),\n name: spec.name,\n capabilities,\n // D11 透传:平台 op(vendored 实现调 occt-only 方法)在生成物里声明 engines。\n // engines 与 capabilities 可并存(2026-09-24 撤销 D11-7 互斥),此处两条独立透传。\n engines,\n outputs,\n schema,\n slotMap,\n naming,\n }) as unknown as ((...args: unknown[]) => Promise<Shape>) & MetaCarrier\n}"]}
1
+ {"version":3,"file":"compat-op.js","sourceRoot":"","sources":["../../../src/api/internal/compat-op.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * compat-op — lift an arbitrary brepjs-shaped function into a faijs statement\n * op, built **on top of** defineOp (single implementation entry, v1).\n *\n * compatOp is NOT a second implementation path parallel to defineOp: every\n * shared mechanism is owned by defineOp — dispatch (dispatchPath + capability\n * routing), the Result boundary (runImpl + unwrapResult), product wrapping\n * (wrapBrepOne / wrapByKeys), `DUAL_OP_META` mounting and\n * `assertLibConforms` validation. compatOp only does two things:\n * - spec pass-through: `CompatSpec` is a combinatorial inheritance of\n * `DualOpOptions` (single source of truth, fields auto-sync — §3.1);\n * - adapter construction: a brepjs-shaped bridge feeding the brep impl — the\n * two bridging steps that cannot be shared (all reuse shared\n * infrastructure, §3.2):\n * 1. call + unwrap — callBrepjs through the shared unwrapResult\n * (`err` throws an OpError carrying the op name + BrepError code);\n * async library fns are awaited first, so `Promise<Result<…>>` —\n * the shape every kernel-awaiting library returns — unwraps too;\n * 2. adoptOut — outward adoption: top-level handle / `outputs`-declared\n * fields (single handle or handle array) → adoptEntity\n * (unregister finalizer + fromHandle).\n *\n * The keep / keepHidden contract is untouched: compatOp neither blocks nor\n * rewrites it — any function running inside a DirectExecutor context can use\n * function-body declarations (C1), and call-site declarations override them\n * (`lang/keep.ts` resolveKeep). The decorated product therefore behaves like\n * any defineOp product: `keep`-safe, capability-aware, multi-output\n * (`DUAL_OP_META.outputs` visible).\n *\n * No self-invented fields: `CompatSpec` extends `Omit<DualOpOptions, 'mesh' |\n * 'brep'>` and declares nothing else; the only tweak is `name` tightened\n * (inherited field, not a new one).\n *\n * @module\n */\n\nimport {\n defineOp,\n DUAL_OP_META,\n type DualOpMeta,\n type DualOpOptions,\n type BrepImpl,\n type BrepProduct,\n} from '../../define-op'\nimport { isShape } from '../../shape'\nimport { adoptEntity, callBrepjs } from './l3-bridge'\nimport { unwrapResult } from './result-unwrap'\nimport type { Shape } from '../../mesh/types'\n\n/** compatOp's static spec: combinatorial inheritance (single source of truth). */\nexport interface CompatSpec extends Omit<DualOpOptions, 'mesh' | 'brep'> {\n /** Op name (error messages + metadata; required, unlike defineOp's optional name). */\n name: string\n\n}\n\n/**\n * Statement-boundary unwrap — `err` becomes an execution error carrying the op\n * name and the `BrepError` code. Delegates to the shared\n * {@link unwrapResult} so the compat boundary and defineOp's Result boundary\n * share one leaf implementation (no drift).\n *\n * @param r - the Result-like value to unwrap.\n * @param name - the op name used in error messages.\n * @returns the unwrapped ok value.\n */\nexport function unwrapOrThrow(r: unknown, name: string): unknown {\n return unwrapResult(r, name)\n}\n\n/**\n * Bridging step: outward adoption — top-level handle or `outputs`-declared\n * fields → adoptEntity (unregister finalizer + fromHandle). `outputs` may also\n * name an array field of handles; every element is adopted individually.\n * Deduplication of already-adopted handles lives inside adoptEntity. A field\n * already being a faijs Shape passes through untouched (no double adoption).\n *\n * @param v - the library product.\n * @param spec - the compat spec (name + optional `outputs`).\n * @param segments - caller-provided `segments` (裁决 1,§5.2), forwarded so the\n * adopted handles' tessellation honors it.\n * @returns the adopted record / Shape, or the plain data untouched.\n */\nfunction adoptOut(v: unknown, spec: CompatSpec, segments?: number): unknown {\n if (isShape(v)) return v\n if (spec.outputs && typeof v === 'object' && v !== null && !Array.isArray(v)) {\n const rec = v as Record<string, unknown>\n for (const f of spec.outputs) {\n const field = rec[f]\n rec[f] = Array.isArray(field)\n ? field.map((x) => adoptEntity(x, spec.name, segments))\n : adoptEntity(field, spec.name, segments)\n }\n return v\n }\n return adoptEntity(v, spec.name, segments)\n}\n\n/**\n * Read the caller-supplied tessellation density from a compat op's args.\n *\n * 裁决 1:faijs 的 `segments` 显式超集在 brepjs 投影侧也必须可选;这里从调用点\n * 的尾参 options(或任一 plain-object 实参)抓取 `segments`,在产出句柄被收编为\n * faijs Shape 时透传给 `fromHandle` 的三角化(§5.2 机制)。默认不传 = 由\n * handle-bridge 的 64 兜底。\n */\nfunction readSegmentsFromArgs(args: unknown[]): number | undefined {\n for (let i = args.length - 1; i >= 0; i--) {\n const a = args[i]\n if (\n a !== null &&\n typeof a === 'object' &&\n !Array.isArray(a) &&\n Object.getPrototypeOf(a) === Object.prototype\n ) {\n const seg = (a as Record<string, unknown>).segments\n if (typeof seg === 'number' && Number.isFinite(seg)) return seg\n }\n }\n return undefined\n}\n\n/**\n * Build the brep-only adapter: pass inputs through → call the vendor function\n * through the shared unwrap → adopt the product (with the caller's `segments`,\n * 裁决 1/§5.2). The adapter never dispatches and never mounts metadata —\n * those are defineOp's.\n *\n * @param fn the brepjs-shaped function (dual-form normalization inside, D11).\n * @param spec the static op spec (name + options pass-through).\n * @returns a `BrepImpl` compatible with defineOp's brep-only decl.\n */\nfunction buildAdapter(fn: (...args: unknown[]) => unknown, spec: CompatSpec): BrepImpl<unknown[]> {\n return async (...args: unknown[]): Promise<BrepProduct> => {\n // faijs-native 库消费 core Shape:输入原样直传,保留 BREP 槽。\n const effective = args\n // Async library fns are supported: a library that awaits its kernel (every\n // `@faicad/faijs-gears` factory does — `await getGearKernel()`) returns\n // `Promise<Result<…>>`, and the shared unwrap is a sync leaf that only\n // recognizes settled Result records. Awaiting a non-promise product is a\n // no-op, so sync libraries are unaffected.\n const value = unwrapOrThrow(await callBrepjs(fn as never, effective), spec.name)\n return adoptOut(value, spec, readSegmentsFromArgs(args)) as BrepProduct\n }\n}\n\n/** Carrier of the DualOpMeta mounted by defineOp (same shape as defineOp's). */\ntype MetaCarrier = { [DUAL_OP_META]?: DualOpMeta }\n\n/**\n * Lift a brepjs-shaped function into a defineOp-decorated op facade (brep-only).\n *\n * The decorated product is identical to a defineOp product: same `DUAL_OP_META`\n * field set (kind 'dual-op', brep impl, name, capabilities, outputs, schema,\n * slotMap), same dispatch semantics, same Result boundary. The adapter carries\n * only the brepjs bridging (input pass-through / call / adopt); every other mechanism\n * belongs to defineOp.\n *\n * @param fn the brepjs-shaped function.\n * @param spec the static spec (name required; capabilities/outputs/slotMap/\n * schema pass through and take effect).\n * @returns the compat op facade, carrying dual-op metadata.\n */\nexport function compatOp(\n fn: (...args: unknown[]) => unknown,\n spec: CompatSpec,\n): ((...args: unknown[]) => Promise<Shape>) & MetaCarrier {\n const { outputs, capabilities, engines, schema, slotMap, naming } = spec\n // `outputs` flows through defineOp's own wrapping path: the adapter adopts\n // per declared field, then defineOp wraps — isShape passthrough, so no\n // double wrapping (§3.2).\n return defineOp({\n brep: buildAdapter(fn, spec),\n name: spec.name,\n capabilities,\n // D11 透传:平台 op(compat 实现调 occt-only 方法)在生成物里声明 engines。\n // engines 与 capabilities 可并存(2026-09-24 撤销 D11-7 互斥),此处两条独立透传。\n engines,\n outputs,\n schema,\n slotMap,\n naming,\n }) as unknown as ((...args: unknown[]) => Promise<Shape>) & MetaCarrier\n}"]}
@@ -10,7 +10,7 @@
10
10
  * 1. single-kernel assert (D10) — library code never installs a kernel;
11
11
  * 2. D11 dual-form normalization — object form → positional form, in the
12
12
  * exported function (§4.2 「归一化位置」), not in a script-side adapter;
13
- * 3. the vendored call itself, through `callBrepjs` (Result shape preserved).
13
+ * 3. the brepjs call itself, through `callBrepjs` (Result shape preserved).
14
14
  *
15
15
  * P21's `api/brepjs-compat` used a private copy of steps 1–3 (`wrapDual`); P23 lifts it
16
16
  * here so `gen-l3-surface.ts` can emit one `compatOp(projectBrepOp(…), …)` line
@@ -25,7 +25,7 @@ import { type FormClass } from './dual-form-args.js';
25
25
  * Reads the configured backend's kernel slot, guarding against the throw that
26
26
  * `getBackends()` performs before host configuration. Falls back to the core
27
27
  * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs
28
- * registry 随子包删除——此处只问「core registry 是否已有激活 brep 引擎」)
28
+ * registry 已内化到 core——此处只问「core registry 是否已有激活 brep 引擎」)
29
29
  * when nothing is configured.
30
30
  *
31
31
  * @param name - op name, used in the guiding error message.
@@ -36,10 +36,10 @@ export declare function assertKernelBound(name: string): void;
36
36
  /** Signature of a projected compat op (inputs normalized before the call). */
37
37
  export type CompatProjection = (...args: unknown[]) => unknown;
38
38
  /**
39
- * Project a vendored brepjs function onto the faijs TS compat face.
39
+ * Project a brepjs function onto the faijs TS compat face.
40
40
  *
41
41
  * The returned function is brepjs-shaped: positional arguments in, `Result`
42
- * (or whatever the vendored function returns) out — no faijs `Shape`, no
42
+ * (or whatever the brepjs function returns) out — no faijs `Shape`, no
43
43
  * adoption. Adoption and the statement-boundary unwrap are `compatOp`'s job
44
44
  * (§4.3.2 steps 4/5), which is why the script face can wrap the very same
45
45
  * projection the TS face exports.
@@ -48,7 +48,7 @@ export type CompatProjection = (...args: unknown[]) => unknown;
48
48
  * @param params - machine parameter-name table (object form → positional).
49
49
  * @param formClass - D11 form class (A single-name dual-form / B1 options-only /
50
50
  * B2 two names).
51
- * @param impl - the vendored function.
51
+ * @param impl - the brepjs function.
52
52
  * @returns the projected compat op.
53
53
  */
54
54
  export declare function projectBrepOp(name: string, params: string[], formClass: FormClass, impl: (...args: never[]) => unknown): CompatProjection;
@@ -10,7 +10,7 @@
10
10
  * 1. single-kernel assert (D10) — library code never installs a kernel;
11
11
  * 2. D11 dual-form normalization — object form → positional form, in the
12
12
  * exported function (§4.2 「归一化位置」), not in a script-side adapter;
13
- * 3. the vendored call itself, through `callBrepjs` (Result shape preserved).
13
+ * 3. the brepjs call itself, through `callBrepjs` (Result shape preserved).
14
14
  *
15
15
  * P21's `api/brepjs-compat` used a private copy of steps 1–3 (`wrapDual`); P23 lifts it
16
16
  * here so `gen-l3-surface.ts` can emit one `compatOp(projectBrepOp(…), …)` line
@@ -28,7 +28,7 @@ import { getBackends } from '../../runtime-state.js';
28
28
  * Reads the configured backend's kernel slot, guarding against the throw that
29
29
  * `getBackends()` performs before host configuration. Falls back to the core
30
30
  * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs
31
- * registry 随子包删除——此处只问「core registry 是否已有激活 brep 引擎」)
31
+ * registry 已内化到 core——此处只问「core registry 是否已有激活 brep 引擎」)
32
32
  * when nothing is configured.
33
33
  *
34
34
  * @param name - op name, used in the guiding error message.
@@ -50,10 +50,10 @@ export function assertKernelBound(name) {
50
50
  }
51
51
  }
52
52
  /**
53
- * Project a vendored brepjs function onto the faijs TS compat face.
53
+ * Project a brepjs function onto the faijs TS compat face.
54
54
  *
55
55
  * The returned function is brepjs-shaped: positional arguments in, `Result`
56
- * (or whatever the vendored function returns) out — no faijs `Shape`, no
56
+ * (or whatever the brepjs function returns) out — no faijs `Shape`, no
57
57
  * adoption. Adoption and the statement-boundary unwrap are `compatOp`'s job
58
58
  * (§4.3.2 steps 4/5), which is why the script face can wrap the very same
59
59
  * projection the TS face exports.
@@ -62,7 +62,7 @@ export function assertKernelBound(name) {
62
62
  * @param params - machine parameter-name table (object form → positional).
63
63
  * @param formClass - D11 form class (A single-name dual-form / B1 options-only /
64
64
  * B2 two names).
65
- * @param impl - the vendored function.
65
+ * @param impl - the brepjs function.
66
66
  * @returns the projected compat op.
67
67
  */
68
68
  export function projectBrepOp(name, params, formClass, impl) {
@@ -1 +1 @@
1
- {"version":3,"file":"compat-projection.js","sourceRoot":"","sources":["../../../src/api/internal/compat-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,IAAI,CAAC;QACH,WAAW,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,gEAAgE;YAC7E,0DAA0D,IAAI,SAAS;YACvE,+CAA+C,CAClD,CAAA;IACH,CAAC;AACH,CAAC;AAKD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAAgB,EAChB,SAAoB,EACpB,IAAmC;IAEnC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;QAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QACjE,OAAO,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACrC,CAAC,CAAA;AACH,CAAC","sourcesContent":["/**\n * compat-projection — the single BREP-TS projection wrapper factory (P23, §4.2).\n *\n * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2\n *\n * Every symbol on the TS compat face and every generated `compatOp` op funnels\n * through {@link projectBrepOp}. That is what makes the generated face and the\n * hand-curated `api/brepjs-compat` face one mechanism rather than two:\n *\n * 1. single-kernel assert (D10) — library code never installs a kernel;\n * 2. D11 dual-form normalization — object form → positional form, in the\n * exported function (§4.2 「归一化位置」), not in a script-side adapter;\n * 3. the vendored call itself, through `callBrepjs` (Result shape preserved).\n *\n * P21's `api/brepjs-compat` used a private copy of steps 1–3 (`wrapDual`); P23 lifts it\n * here so `gen-l3-surface.ts` can emit one `compatOp(projectBrepOp(…), …)` line\n * per symbol instead of re-expanding the template for each op.\n *\n * @module\n */\n\nimport { resolveArgs, type FormClass } from './dual-form-args'\nimport { callBrepjs } from './l3-bridge'\nimport { getActiveBrepEngineId } from '../../brep/engine/registry'\nimport { getBackends } from '../../runtime-state'\n\n/**\n * Assert that a BREP kernel is bound before invoking a compat op.\n *\n * Reads the configured backend's kernel slot, guarding against the throw that\n * `getBackends()` performs before host configuration. Falls back to the core\n * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs\n * registry 随子包删除——此处只问「core registry 是否已有激活 brep 引擎」)\n * when nothing is configured.\n *\n * @param name - op name, used in the guiding error message.\n * @throws when no BREP kernel is bound (the message tells the host what to do,\n * because library code must never install a kernel itself — §4.2 rule 1).\n */\nexport function assertKernelBound(name: string): void {\n let kernelBound = false\n try {\n kernelBound = getBackends().kernel.brep != null\n } catch {\n // backends not configured yet — that is not an error, just no kernel\n }\n if (!kernelBound && getActiveBrepEngineId() === null) {\n throw new Error(\n `[compat:${name}] no BREP kernel bound; run host init/inject (e.g. initOcct + ` +\n `register the occt brep engine) before the first compat.${name} call. ` +\n `Library code must not install kernels itself.`\n )\n }\n}\n\n/** Signature of a projected compat op (inputs normalized before the call). */\nexport type CompatProjection = (...args: unknown[]) => unknown\n\n/**\n * Project a vendored brepjs function onto the faijs TS compat face.\n *\n * The returned function is brepjs-shaped: positional arguments in, `Result`\n * (or whatever the vendored function returns) out — no faijs `Shape`, no\n * adoption. Adoption and the statement-boundary unwrap are `compatOp`'s job\n * (§4.3.2 steps 4/5), which is why the script face can wrap the very same\n * projection the TS face exports.\n *\n * @param name - op name (error messages + D11 discriminant context).\n * @param params - machine parameter-name table (object form → positional).\n * @param formClass - D11 form class (A single-name dual-form / B1 options-only /\n * B2 two names).\n * @param impl - the vendored function.\n * @returns the projected compat op.\n */\nexport function projectBrepOp(\n name: string,\n params: string[],\n formClass: FormClass,\n impl: (...args: never[]) => unknown,\n): CompatProjection {\n return (...args: unknown[]) => {\n assertKernelBound(name)\n const positional = resolveArgs(args, { name, params, formClass })\n return callBrepjs(impl, positional)\n }\n}\n"]}
1
+ {"version":3,"file":"compat-projection.js","sourceRoot":"","sources":["../../../src/api/internal/compat-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,IAAI,CAAC;QACH,WAAW,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,gEAAgE;YAC7E,0DAA0D,IAAI,SAAS;YACvE,+CAA+C,CAClD,CAAA;IACH,CAAC;AACH,CAAC;AAKD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAAgB,EAChB,SAAoB,EACpB,IAAmC;IAEnC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;QAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QACjE,OAAO,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACrC,CAAC,CAAA;AACH,CAAC","sourcesContent":["/**\n * compat-projection — the single BREP-TS projection wrapper factory (P23, §4.2).\n *\n * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2\n *\n * Every symbol on the TS compat face and every generated `compatOp` op funnels\n * through {@link projectBrepOp}. That is what makes the generated face and the\n * hand-curated `api/brepjs-compat` face one mechanism rather than two:\n *\n * 1. single-kernel assert (D10) — library code never installs a kernel;\n * 2. D11 dual-form normalization — object form → positional form, in the\n * exported function (§4.2 「归一化位置」), not in a script-side adapter;\n * 3. the brepjs call itself, through `callBrepjs` (Result shape preserved).\n *\n * P21's `api/brepjs-compat` used a private copy of steps 1–3 (`wrapDual`); P23 lifts it\n * here so `gen-l3-surface.ts` can emit one `compatOp(projectBrepOp(…), …)` line\n * per symbol instead of re-expanding the template for each op.\n *\n * @module\n */\n\nimport { resolveArgs, type FormClass } from './dual-form-args'\nimport { callBrepjs } from './l3-bridge'\nimport { getActiveBrepEngineId } from '../../brep/engine/registry'\nimport { getBackends } from '../../runtime-state'\n\n/**\n * Assert that a BREP kernel is bound before invoking a compat op.\n *\n * Reads the configured backend's kernel slot, guarding against the throw that\n * `getBackends()` performs before host configuration. Falls back to the core\n * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs\n * registry 已内化到 core——此处只问「core registry 是否已有激活 brep 引擎」)\n * when nothing is configured.\n *\n * @param name - op name, used in the guiding error message.\n * @throws when no BREP kernel is bound (the message tells the host what to do,\n * because library code must never install a kernel itself — §4.2 rule 1).\n */\nexport function assertKernelBound(name: string): void {\n let kernelBound = false\n try {\n kernelBound = getBackends().kernel.brep != null\n } catch {\n // backends not configured yet — that is not an error, just no kernel\n }\n if (!kernelBound && getActiveBrepEngineId() === null) {\n throw new Error(\n `[compat:${name}] no BREP kernel bound; run host init/inject (e.g. initOcct + ` +\n `register the occt brep engine) before the first compat.${name} call. ` +\n `Library code must not install kernels itself.`\n )\n }\n}\n\n/** Signature of a projected compat op (inputs normalized before the call). */\nexport type CompatProjection = (...args: unknown[]) => unknown\n\n/**\n * Project a brepjs function onto the faijs TS compat face.\n *\n * The returned function is brepjs-shaped: positional arguments in, `Result`\n * (or whatever the brepjs function returns) out — no faijs `Shape`, no\n * adoption. Adoption and the statement-boundary unwrap are `compatOp`'s job\n * (§4.3.2 steps 4/5), which is why the script face can wrap the very same\n * projection the TS face exports.\n *\n * @param name - op name (error messages + D11 discriminant context).\n * @param params - machine parameter-name table (object form → positional).\n * @param formClass - D11 form class (A single-name dual-form / B1 options-only /\n * B2 two names).\n * @param impl - the brepjs function.\n * @returns the projected compat op.\n */\nexport function projectBrepOp(\n name: string,\n params: string[],\n formClass: FormClass,\n impl: (...args: never[]) => unknown,\n): CompatProjection {\n return (...args: unknown[]) => {\n assertKernelBound(name)\n const positional = resolveArgs(args, { name, params, formClass })\n return callBrepjs(impl, positional)\n }\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * dual-form-args — D11 参数双形态归一化判别器
3
3
  *
4
- * 设计文档:docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2
5
- *
6
4
  * 本文件实现参数双形态归一化(D11):
7
5
  * - A 类(明显可区分):单名双形态,函数内部按参数形态切换实现
8
6
  * - B1 类(人类看来不明显):单名单形态,brepjs options 对象即唯一对象形态
@@ -1 +1 @@
1
- {"version":3,"file":"dual-form-args.d.ts","sourceRoot":"","sources":["../../../src/api/internal/dual-form-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,YAAY;AACZ,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAA;AAEzC,YAAY;AACZ,MAAM,WAAW,OAAO;IACtB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,YAAY;IACZ,SAAS,EAAE,SAAS,CAAA;CACrB;AAOD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAQrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,EAAE,CAUX;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAgCrE;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,eAAe;IACf,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,YAAY,CA0BhF;AAMD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,IAAI,EAAE,MAAM,EAAE,CAAA;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAWD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAoD1F"}
1
+ {"version":3,"file":"dual-form-args.d.ts","sourceRoot":"","sources":["../../../src/api/internal/dual-form-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,YAAY;AACZ,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAA;AAEzC,YAAY;AACZ,MAAM,WAAW,OAAO;IACtB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,YAAY;IACZ,SAAS,EAAE,SAAS,CAAA;CACrB;AAOD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAQrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,EAAE,CAUX;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAgCrE;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,eAAe;IACf,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,YAAY,CA0BhF;AAMD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,IAAI,EAAE,MAAM,EAAE,CAAA;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAWD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAoD1F"}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * dual-form-args — D11 参数双形态归一化判别器
3
3
  *
4
- * 设计文档:docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2
5
- *
6
4
  * 本文件实现参数双形态归一化(D11):
7
5
  * - A 类(明显可区分):单名双形态,函数内部按参数形态切换实现
8
6
  * - B1 类(人类看来不明显):单名单形态,brepjs options 对象即唯一对象形态
@@ -21,7 +19,7 @@
21
19
  * B2 条目不走判别器(两个名字各自固定形态)。
22
20
  */
23
21
  import { isShape } from '../../shape.js';
24
- /** 句柄类型守卫(vendored 句柄有 .wrapped 属性)。 */
22
+ /** 句柄类型守卫(compat 句柄有 .wrapped 属性)。 */
25
23
  function isHandleLike(v) {
26
24
  return typeof v === 'object' && v !== null && 'wrapped' in v;
27
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dual-form-args.js","sourceRoot":"","sources":["../../../src/api/internal/dual-form-args.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dual-form-args — D11 参数双形态归一化判别器\n *\n * 设计文档:docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2\n *\n * 本文件实现参数双形态归一化(D11):\n * - A 类(明显可区分):单名双形态,函数内部按参数形态切换实现\n * - B1 类(人类看来不明显):单名单形态,brepjs options 对象即唯一对象形态\n * - B2 类(人类看来不明显):双名,brepjs 形态占正名,faijs 对象形态加描述性后缀\n *\n * 判别规则:\n * 1. 首参是 plain object(Object.getPrototypeOf(a) === Object.prototype)\n * 且非 Shape、非句柄、非数组 → 对象形态\n * 2. 否则 → 位置形态\n *\n * 对象形态映射:\n * - 按 params 表(机器参数名)将对象键映射为位置数组\n * - 缺省键 → undefined\n * - 对象形态含 params 外未知键 → 抛 E_ARGS_FORM\n *\n * B2 条目不走判别器(两个名字各自固定形态)。\n */\n\nimport { isShape } from '../../shape'\n\n/** 形态分类。 */\nexport type FormClass = 'A' | 'B1' | 'B2'\n\n/** 参数规格。 */\nexport interface ArgSpec {\n /** op 名(错误信息用)。 */\n name: string\n /** 机器参数名表(按位置顺序),用于对象形态→位置数组映射。 */\n params?: string[]\n /** 形态分类。 */\n formClass: FormClass\n}\n\n/** 句柄类型守卫(vendored 句柄有 .wrapped 属性)。 */\nfunction isHandleLike(v: unknown): boolean {\n return typeof v === 'object' && v !== null && 'wrapped' in v\n}\n\n/**\n * 判定参数是否为对象形态。\n *\n * 判别式(全仓统一):\n * - 首参是 plain object(Object.getPrototypeOf(a) === Object.prototype)\n * - 且非 Shape、非句柄、非数组\n *\n * @param args - 调用参数数组\n * @returns 是否为对象形态\n */\nexport function isObjectForm(args: unknown[]): boolean {\n if (args.length === 0) return false\n const first = args[0]\n if (first === null || typeof first !== 'object') return false\n if (Array.isArray(first)) return false\n if (isShape(first)) return false\n if (isHandleLike(first)) return false\n return Object.getPrototypeOf(first) === Object.prototype\n}\n\n/**\n * 将对象形态参数归一化为位置数组。\n *\n * @param obj - 对象形态参数\n * @param params - 机器参数名表\n * @param opName - op 名(错误信息用)\n * @returns 位置数组(缺省键 → undefined)\n * @throws E_ARGS_FORM 对象含 params 外未知键时\n */\nexport function normalizeObjectForm(\n obj: Record<string, unknown>,\n params: string[],\n opName: string,\n): unknown[] {\n const keys = Object.keys(obj)\n const unknownKeys = keys.filter(k => !params.includes(k))\n if (unknownKeys.length > 0) {\n throw new Error(\n `[faijs/args] ${opName}: E_ARGS_FORM: unexpected parameter(s): ${unknownKeys.join(', ')}. ` +\n `Expected: ${params.join(', ')}`\n )\n }\n return params.map(k => obj[k])\n}\n\n/**\n * 参数双形态归一化判别器。\n *\n * 根据 args 和 spec 归一化参数:\n * - B2 条目:直接返回原样(两个名字各自固定形态)\n * - B1 条目:直接返回原样(brepjs options 对象即唯一对象形态,§4.2「无需判别」)\n * - 对象形态:按 params 表映射为位置数组\n * - 位置形态:直接返回原样\n *\n * B1 为何原样返回:B1 的 brepjs 位置形态首参本身就是配置对象(如\n * `thread(options: ThreadOptions)`),对象形态与它在首参上撞型,判别式失效;\n * 方案 §4.2 B1 的定义即「faijs 侧无独立对象 schema 时,直接以 brepjs options\n * 对象为唯一对象形态(单名单形态,无需判别)」。若在此处按 params 表归一,\n * 任何 options 键都会因不在 params 表里而误抛 E_ARGS_FORM。\n *\n * @param args - 调用参数数组\n * @param spec - 参数规格\n * @returns 归一化后的参数数组\n * @throws E_ARGS_FORM 形态无法匹配或对象含未知键时\n */\nexport function resolveArgs(args: unknown[], spec: ArgSpec): unknown[] {\n // B2 条目不走判别器(两个名字各自固定形态)\n if (spec.formClass === 'B2') {\n return args\n }\n // B1 条目:brepjs options 对象即唯一对象形态,无需判别(§4.2)\n if (spec.formClass === 'B1') {\n return args\n }\n\n // 无 params 表时无法归一化对象形态,只能接受位置形态\n if (!spec.params) {\n if (isObjectForm(args)) {\n throw new Error(\n `[faijs/args] ${spec.name}: E_ARGS_FORM: object form requires params specification`\n )\n }\n return args\n }\n\n // 判定形态\n if (isObjectForm(args)) {\n // 对象形态 → 位置数组\n return normalizeObjectForm(\n args[0] as Record<string, unknown>,\n spec.params,\n spec.name,\n )\n }\n\n // 位置形态 → 原样返回\n return args\n}\n\n/**\n * 双形态归一化结果。\n *\n * 包含归一化后的参数和是否为对象形态的标记。\n */\nexport interface ResolvedArgs {\n /** 归一化后的参数数组。 */\n args: unknown[]\n /** 是否为对象形态。 */\n isObjectForm: boolean\n}\n\n/**\n * 参数双形态归一化判别器(带形态信息)。\n *\n * 与 resolveArgs 相同,但返回形态信息。\n *\n * @param args - 调用参数数组\n * @param spec - 参数规格\n * @returns 归一化结果\n */\nexport function resolveArgsWithInfo(args: unknown[], spec: ArgSpec): ResolvedArgs {\n if (spec.formClass === 'B2' || spec.formClass === 'B1') {\n return { args, isObjectForm: false }\n }\n\n if (!spec.params) {\n if (isObjectForm(args)) {\n throw new Error(\n `[faijs/args] ${spec.name}: E_ARGS_FORM: object form requires params specification`\n )\n }\n return { args, isObjectForm: false }\n }\n\n if (isObjectForm(args)) {\n return {\n args: normalizeObjectForm(\n args[0] as Record<string, unknown>,\n spec.params,\n spec.name,\n ),\n isObjectForm: true,\n }\n }\n\n return { args, isObjectForm: false }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 反方向:位置形态 → 对象形态(faijs 特有 dual op,impl 原生对象形态)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 位置形态声明(D11 反方向,§4.2「归一方向 = 位置→对象」)。\n *\n * faijs 特有 dual op 的 impl 是对象形态原生(`box(width, depth, height)` 经\n * 装箱为 `{ width, depth, height, ... }`,`translate(shape, { offset })`),brepjs 生态\n * 的位置形态(`box(10, 20, 30, { centered: true })` / `translate(shape, 1, 0, 0)`)\n * 需先归一成对象形态。\n * 声明式而非 if 分支:op 作者只列「哪个键吃几个位置参数」,判别与装箱由\n * {@link positionalToObject} 统一完成。\n *\n * 与语句层的 `StatementSummary.positional`(位置实参**值**)以及投影侧的\n * `ArgSpec.params`(对象→位置**参数名表**)是三个不同概念:`SlotMap` 是\n * 位置槽→对象键的**装箱声明**(位置→对象,D11 反方向;§9 命名区分)。\n */\nexport interface SlotMap {\n /**\n * 对象形态键名,按位置顺序(只描述 Shape 之后的**非几何**形参)。\n * 例:`box(10, 20, 30)` → `keys: ['size']`;`cylinder(5, 40)` →\n * `keys: ['radius', 'height']`。\n */\n keys: string[]\n /**\n * 哪些键是 vec3 槽位(吃掉最多 3 个连续位置参数)。\n * 1 个 → 标量(number 或数组原样);2~3 个 → `[x, y(, z)]` 数组。\n * 例:`box(10)` → `{ size: 10 }`;`box(10, 20, 30)` → `{ size: [10, 20, 30] }`。\n */\n vec3Keys?: string[]\n /**\n * 前置 Shape 形参个数(原样透传,不参与装箱),缺省 0。\n * 例:`translate(shape, 1, 0, 0)` → `shapeArity: 1`。\n */\n shapeArity?: number\n}\n\n/** 判定值是否是可作为对象形态形参的 plain object(与 {@link isObjectForm} 同判别式)。 */\nfunction isPlainObjectValue(v: unknown): boolean {\n if (v === null || typeof v !== 'object') return false\n if (Array.isArray(v)) return false\n if (isShape(v)) return false\n if (isHandleLike(v)) return false\n return Object.getPrototypeOf(v) === Object.prototype\n}\n\n/**\n * 位置形态 → 对象形态归一(faijs 特有 dual op 的 D11 反方向)。\n *\n * 触发条件:声明了 slotMap 且对象槽位(第 `shapeArity` 个实参)不是\n * plain object。已是对象形态或实参不足时原样返回(交由 op 自身的断言报错)。\n *\n * @param args - 调用参数数组\n * @param form - slotMap 声明(位置槽→对象键装箱表)\n * @param name - op 名(错误信息用)\n * @returns 归一后的参数数组(前置 Shape 原样 + 末尾一个对象形态参数)\n * @throws E_ARGS_FORM 位置参数个数与声明的槽位不匹配时\n */\nexport function positionalToObject(args: unknown[], form: SlotMap, name: string): unknown[] {\n const shapeArity = form.shapeArity ?? 0\n if (args.length <= shapeArity) return args // 无位置形参可装箱 → 原样(op 断言报错)\n if (isPlainObjectValue(args[shapeArity])) return args // 已是对象形态\n\n const rest = args.slice(shapeArity)\n const obj: Record<string, unknown> = {}\n let i = 0\n for (const key of form.keys) {\n if (i >= rest.length) break\n // §6.2 尾参 options:当前实参是 plain object(候选尾参 options)→ 停止装箱\n // 交给下方 options 合并,不让任何槽位把它吞进拓扑参数\n // (`box(20,{centered:true})` / `cylinder(5,40,{centered:true})`)。\n if (isPlainObjectValue(rest[i])) break\n if (form.vec3Keys?.includes(key)) {\n // vec3 槽位:吃掉最多 3 个连续实参(1 个 → 标量,2~3 个 → 数组)。\n // 若剩余序列最末是 plain object(候选尾参 options),先为它留位,不让\n // 跨槽 vec3 把 options 吞进拓扑参数(`box(10,20,30,{centered:true})`)。\n const avail = rest.length - i\n const reserveOptions = avail > 1 && isPlainObjectValue(rest[rest.length - 1]) ? 1 : 0\n const take = Math.min(3, avail - reserveOptions)\n const chunk = rest.slice(i, i + take)\n obj[key] = take === 1 ? chunk[0] : chunk\n i += take\n continue\n }\n obj[key] = rest[i]\n i += 1\n }\n // D11 尾参 options 合并(§6.2):位置槽装箱后,若剩余实参恰好 1 个且为\n // plain object → 作为 options 并入 args。让 `box(10,20,30,{centered:true})`、\n // `sphere(5,{at,segments})`、`cylinder(5,40,{centered:true})` 在脚本面可用。\n if (i < rest.length) {\n if (rest.length - i === 1 && isPlainObjectValue(rest[i])) {\n const opts = rest[i] as Record<string, unknown>\n const dup = Object.keys(opts).filter((k) => form.keys.includes(k) || k in obj)\n if (dup.length > 0) {\n throw new Error(\n `[faijs/args] ${name}: E_ARGS_FORM: option key(s) ${dup.join(', ')} ` +\n `conflict with positional slot(s) (${form.keys.join(', ')})`\n )\n }\n Object.assign(obj, opts)\n return [...args.slice(0, shapeArity), obj]\n }\n throw new Error(\n `[faijs/args] ${name}: E_ARGS_FORM: expected ${form.keys.join(', ')} ` +\n `(${form.keys.length} positional slot(s)); got ${rest.length} value(s): ` +\n rest.map((a) => (typeof a === 'object' ? '[object]' : String(a))).join(', ')\n )\n }\n return [...args.slice(0, shapeArity), obj]\n}\n"]}
1
+ {"version":3,"file":"dual-form-args.js","sourceRoot":"","sources":["../../../src/api/internal/dual-form-args.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dual-form-args — D11 参数双形态归一化判别器\n *\n * 本文件实现参数双形态归一化(D11):\n * - A 类(明显可区分):单名双形态,函数内部按参数形态切换实现\n * - B1 类(人类看来不明显):单名单形态,brepjs options 对象即唯一对象形态\n * - B2 类(人类看来不明显):双名,brepjs 形态占正名,faijs 对象形态加描述性后缀\n *\n * 判别规则:\n * 1. 首参是 plain object(Object.getPrototypeOf(a) === Object.prototype)\n * 且非 Shape、非句柄、非数组 → 对象形态\n * 2. 否则 → 位置形态\n *\n * 对象形态映射:\n * - 按 params 表(机器参数名)将对象键映射为位置数组\n * - 缺省键 → undefined\n * - 对象形态含 params 外未知键 → 抛 E_ARGS_FORM\n *\n * B2 条目不走判别器(两个名字各自固定形态)。\n */\n\nimport { isShape } from '../../shape'\n\n/** 形态分类。 */\nexport type FormClass = 'A' | 'B1' | 'B2'\n\n/** 参数规格。 */\nexport interface ArgSpec {\n /** op 名(错误信息用)。 */\n name: string\n /** 机器参数名表(按位置顺序),用于对象形态→位置数组映射。 */\n params?: string[]\n /** 形态分类。 */\n formClass: FormClass\n}\n\n/** 句柄类型守卫(compat 句柄有 .wrapped 属性)。 */\nfunction isHandleLike(v: unknown): boolean {\n return typeof v === 'object' && v !== null && 'wrapped' in v\n}\n\n/**\n * 判定参数是否为对象形态。\n *\n * 判别式(全仓统一):\n * - 首参是 plain object(Object.getPrototypeOf(a) === Object.prototype)\n * - 且非 Shape、非句柄、非数组\n *\n * @param args - 调用参数数组\n * @returns 是否为对象形态\n */\nexport function isObjectForm(args: unknown[]): boolean {\n if (args.length === 0) return false\n const first = args[0]\n if (first === null || typeof first !== 'object') return false\n if (Array.isArray(first)) return false\n if (isShape(first)) return false\n if (isHandleLike(first)) return false\n return Object.getPrototypeOf(first) === Object.prototype\n}\n\n/**\n * 将对象形态参数归一化为位置数组。\n *\n * @param obj - 对象形态参数\n * @param params - 机器参数名表\n * @param opName - op 名(错误信息用)\n * @returns 位置数组(缺省键 → undefined)\n * @throws E_ARGS_FORM 对象含 params 外未知键时\n */\nexport function normalizeObjectForm(\n obj: Record<string, unknown>,\n params: string[],\n opName: string,\n): unknown[] {\n const keys = Object.keys(obj)\n const unknownKeys = keys.filter(k => !params.includes(k))\n if (unknownKeys.length > 0) {\n throw new Error(\n `[faijs/args] ${opName}: E_ARGS_FORM: unexpected parameter(s): ${unknownKeys.join(', ')}. ` +\n `Expected: ${params.join(', ')}`\n )\n }\n return params.map(k => obj[k])\n}\n\n/**\n * 参数双形态归一化判别器。\n *\n * 根据 args 和 spec 归一化参数:\n * - B2 条目:直接返回原样(两个名字各自固定形态)\n * - B1 条目:直接返回原样(brepjs options 对象即唯一对象形态,§4.2「无需判别」)\n * - 对象形态:按 params 表映射为位置数组\n * - 位置形态:直接返回原样\n *\n * B1 为何原样返回:B1 的 brepjs 位置形态首参本身就是配置对象(如\n * `thread(options: ThreadOptions)`),对象形态与它在首参上撞型,判别式失效;\n * 方案 §4.2 B1 的定义即「faijs 侧无独立对象 schema 时,直接以 brepjs options\n * 对象为唯一对象形态(单名单形态,无需判别)」。若在此处按 params 表归一,\n * 任何 options 键都会因不在 params 表里而误抛 E_ARGS_FORM。\n *\n * @param args - 调用参数数组\n * @param spec - 参数规格\n * @returns 归一化后的参数数组\n * @throws E_ARGS_FORM 形态无法匹配或对象含未知键时\n */\nexport function resolveArgs(args: unknown[], spec: ArgSpec): unknown[] {\n // B2 条目不走判别器(两个名字各自固定形态)\n if (spec.formClass === 'B2') {\n return args\n }\n // B1 条目:brepjs options 对象即唯一对象形态,无需判别(§4.2)\n if (spec.formClass === 'B1') {\n return args\n }\n\n // 无 params 表时无法归一化对象形态,只能接受位置形态\n if (!spec.params) {\n if (isObjectForm(args)) {\n throw new Error(\n `[faijs/args] ${spec.name}: E_ARGS_FORM: object form requires params specification`\n )\n }\n return args\n }\n\n // 判定形态\n if (isObjectForm(args)) {\n // 对象形态 → 位置数组\n return normalizeObjectForm(\n args[0] as Record<string, unknown>,\n spec.params,\n spec.name,\n )\n }\n\n // 位置形态 → 原样返回\n return args\n}\n\n/**\n * 双形态归一化结果。\n *\n * 包含归一化后的参数和是否为对象形态的标记。\n */\nexport interface ResolvedArgs {\n /** 归一化后的参数数组。 */\n args: unknown[]\n /** 是否为对象形态。 */\n isObjectForm: boolean\n}\n\n/**\n * 参数双形态归一化判别器(带形态信息)。\n *\n * 与 resolveArgs 相同,但返回形态信息。\n *\n * @param args - 调用参数数组\n * @param spec - 参数规格\n * @returns 归一化结果\n */\nexport function resolveArgsWithInfo(args: unknown[], spec: ArgSpec): ResolvedArgs {\n if (spec.formClass === 'B2' || spec.formClass === 'B1') {\n return { args, isObjectForm: false }\n }\n\n if (!spec.params) {\n if (isObjectForm(args)) {\n throw new Error(\n `[faijs/args] ${spec.name}: E_ARGS_FORM: object form requires params specification`\n )\n }\n return { args, isObjectForm: false }\n }\n\n if (isObjectForm(args)) {\n return {\n args: normalizeObjectForm(\n args[0] as Record<string, unknown>,\n spec.params,\n spec.name,\n ),\n isObjectForm: true,\n }\n }\n\n return { args, isObjectForm: false }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 反方向:位置形态 → 对象形态(faijs 特有 dual op,impl 原生对象形态)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 位置形态声明(D11 反方向,§4.2「归一方向 = 位置→对象」)。\n *\n * faijs 特有 dual op 的 impl 是对象形态原生(`box(width, depth, height)` 经\n * 装箱为 `{ width, depth, height, ... }`,`translate(shape, { offset })`),brepjs 生态\n * 的位置形态(`box(10, 20, 30, { centered: true })` / `translate(shape, 1, 0, 0)`)\n * 需先归一成对象形态。\n * 声明式而非 if 分支:op 作者只列「哪个键吃几个位置参数」,判别与装箱由\n * {@link positionalToObject} 统一完成。\n *\n * 与语句层的 `StatementSummary.positional`(位置实参**值**)以及投影侧的\n * `ArgSpec.params`(对象→位置**参数名表**)是三个不同概念:`SlotMap` 是\n * 位置槽→对象键的**装箱声明**(位置→对象,D11 反方向;§9 命名区分)。\n */\nexport interface SlotMap {\n /**\n * 对象形态键名,按位置顺序(只描述 Shape 之后的**非几何**形参)。\n * 例:`box(10, 20, 30)` → `keys: ['size']`;`cylinder(5, 40)` →\n * `keys: ['radius', 'height']`。\n */\n keys: string[]\n /**\n * 哪些键是 vec3 槽位(吃掉最多 3 个连续位置参数)。\n * 1 个 → 标量(number 或数组原样);2~3 个 → `[x, y(, z)]` 数组。\n * 例:`box(10)` → `{ size: 10 }`;`box(10, 20, 30)` → `{ size: [10, 20, 30] }`。\n */\n vec3Keys?: string[]\n /**\n * 前置 Shape 形参个数(原样透传,不参与装箱),缺省 0。\n * 例:`translate(shape, 1, 0, 0)` → `shapeArity: 1`。\n */\n shapeArity?: number\n}\n\n/** 判定值是否是可作为对象形态形参的 plain object(与 {@link isObjectForm} 同判别式)。 */\nfunction isPlainObjectValue(v: unknown): boolean {\n if (v === null || typeof v !== 'object') return false\n if (Array.isArray(v)) return false\n if (isShape(v)) return false\n if (isHandleLike(v)) return false\n return Object.getPrototypeOf(v) === Object.prototype\n}\n\n/**\n * 位置形态 → 对象形态归一(faijs 特有 dual op 的 D11 反方向)。\n *\n * 触发条件:声明了 slotMap 且对象槽位(第 `shapeArity` 个实参)不是\n * plain object。已是对象形态或实参不足时原样返回(交由 op 自身的断言报错)。\n *\n * @param args - 调用参数数组\n * @param form - slotMap 声明(位置槽→对象键装箱表)\n * @param name - op 名(错误信息用)\n * @returns 归一后的参数数组(前置 Shape 原样 + 末尾一个对象形态参数)\n * @throws E_ARGS_FORM 位置参数个数与声明的槽位不匹配时\n */\nexport function positionalToObject(args: unknown[], form: SlotMap, name: string): unknown[] {\n const shapeArity = form.shapeArity ?? 0\n if (args.length <= shapeArity) return args // 无位置形参可装箱 → 原样(op 断言报错)\n if (isPlainObjectValue(args[shapeArity])) return args // 已是对象形态\n\n const rest = args.slice(shapeArity)\n const obj: Record<string, unknown> = {}\n let i = 0\n for (const key of form.keys) {\n if (i >= rest.length) break\n // §6.2 尾参 options:当前实参是 plain object(候选尾参 options)→ 停止装箱\n // 交给下方 options 合并,不让任何槽位把它吞进拓扑参数\n // (`box(20,{centered:true})` / `cylinder(5,40,{centered:true})`)。\n if (isPlainObjectValue(rest[i])) break\n if (form.vec3Keys?.includes(key)) {\n // vec3 槽位:吃掉最多 3 个连续实参(1 个 → 标量,2~3 个 → 数组)。\n // 若剩余序列最末是 plain object(候选尾参 options),先为它留位,不让\n // 跨槽 vec3 把 options 吞进拓扑参数(`box(10,20,30,{centered:true})`)。\n const avail = rest.length - i\n const reserveOptions = avail > 1 && isPlainObjectValue(rest[rest.length - 1]) ? 1 : 0\n const take = Math.min(3, avail - reserveOptions)\n const chunk = rest.slice(i, i + take)\n obj[key] = take === 1 ? chunk[0] : chunk\n i += take\n continue\n }\n obj[key] = rest[i]\n i += 1\n }\n // D11 尾参 options 合并(§6.2):位置槽装箱后,若剩余实参恰好 1 个且为\n // plain object → 作为 options 并入 args。让 `box(10,20,30,{centered:true})`、\n // `sphere(5,{at,segments})`、`cylinder(5,40,{centered:true})` 在脚本面可用。\n if (i < rest.length) {\n if (rest.length - i === 1 && isPlainObjectValue(rest[i])) {\n const opts = rest[i] as Record<string, unknown>\n const dup = Object.keys(opts).filter((k) => form.keys.includes(k) || k in obj)\n if (dup.length > 0) {\n throw new Error(\n `[faijs/args] ${name}: E_ARGS_FORM: option key(s) ${dup.join(', ')} ` +\n `conflict with positional slot(s) (${form.keys.join(', ')})`\n )\n }\n Object.assign(obj, opts)\n return [...args.slice(0, shapeArity), obj]\n }\n throw new Error(\n `[faijs/args] ${name}: E_ARGS_FORM: expected ${form.keys.join(', ')} ` +\n `(${form.keys.length} positional slot(s)); got ${rest.length} value(s): ` +\n rest.map((a) => (typeof a === 'object' ? '[object]' : String(a))).join(', ')\n )\n }\n return [...args.slice(0, shapeArity), obj]\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5
5
- *
6
4
  * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):
7
5
  * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的
8
6
  * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);
@@ -10,10 +8,10 @@
10
8
  * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是
11
9
  * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,
12
10
  * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件
13
- * 自带最小实现:borrow 视图 / 句柄类型视图 / disposal 解除(no-op)。
11
+ * 自带最小实现:句柄类型视图 / disposal 解除(no-op)。
14
12
  *
15
13
  * 因此投影一个库函数只需三件事:
16
- * 1. faijs Shape → 库输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);
14
+ * 1. faijs Shape → 库输入:原样直传(faijs-native 库消费 core Shape);
17
15
  * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);
18
16
  * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`
19
17
  * (meshHandle + 身份槽登记,所有权转入 faijs)。
@@ -36,36 +34,6 @@ export interface BorrowedShapeHandle {
36
34
  /** Borrowed views never dispose, so callbacks never fire(no-op)。 */
37
35
  onDispose(callback: () => void): void;
38
36
  }
39
- /** occt-wasm 句柄对象视图(type + id,delete no-op)。 */
40
- export interface OcctWasmHandleView {
41
- __occtWasm: true;
42
- type: string;
43
- id: number;
44
- delete(): void;
45
- HashCode(upperBound: number): number;
46
- IsNull(): boolean;
47
- }
48
- /**
49
- * Borrow a faijs Shape's OCCT handle as a library-side shape handle.
50
- *
51
- * No ownership transfer: the borrowed view is a no-op-dispose wrapper of the
52
- * same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to
53
- * compatOp-projected functions that take `Shapeable<T>` / `AnyShape`.
54
- *
55
- * `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a
56
- * branded number), but library code consumes shapes as *objects* (the
57
- * shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct
58
- * `shape.type` reads) — a raw number crashes there ("Invalid value used as weak
59
- * map key"). The id is therefore wrapped into a structurally valid
60
- * `OcctWasmHandleView`: the type is queried from the bound occt kernel through
61
- * `getOcctKernel().getShapeType`, and the `delete` is a no-op (non-owning view —
62
- * the arena slot and its ownership are untouched).
63
- *
64
- * @param s - the faijs Shape whose brep slot is borrowed.
65
- * @returns a library-side ShapeHandle view of the same occt shape.
66
- * @throws when the Shape has no live BREP slot (mesh-only input on a brep op).
67
- */
68
- export declare function borrowBrepjsShape(s: Shape): BorrowedShapeHandle;
69
37
  /**
70
38
  * Adopt a library-side product into a faijs Shape.
71
39
  *
@@ -82,14 +50,14 @@ export declare function adoptBrepjsProduct(product: unknown, segments?: number):
82
50
  /**
83
51
  * Call a library function with a rebuilt positional argument list.
84
52
  *
85
- * Generated wrappers build `__args` positionally (borrowing geometry inputs,
86
- * passing value params through); a plain `fn(...args: unknown[])` spread fails
53
+ * Generated wrappers build `__args` positionally (geometry inputs pass through
54
+ * untouched, value params pass through as-is); a plain `fn(...args: unknown[])` spread fails
87
55
  * TS2556 against fixed-arity signatures, so the call goes through this
88
56
  * rest-typed bridge that preserves the function's own `ReturnType` (so a
89
57
  * `Result` return keeps `.ok`/`.value` for the generated unwrap code).
90
58
  *
91
59
  * @param fn the library function.
92
- * @param args the rebuilt positional argument list (borrowed handles + value params).
60
+ * @param args the rebuilt positional argument list (geometry inputs + value params).
93
61
  * @returns whatever the function returns (typed via ReturnType).
94
62
  */
95
63
  export declare function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F>;
@@ -1 +1 @@
1
- {"version":3,"file":"l3-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAY7C,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,yCAAyC;IACzC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;IACxB,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAA;IACd,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CACtC;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,IAAI,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,IAAI,IAAI,CAAA;IACd,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;IACpC,MAAM,IAAI,OAAO,CAAA;CAClB;AA8CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,GAAG,mBAAmB,CAY/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAa7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAEtG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAShF;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAkBxF"}
1
+ {"version":3,"file":"l3-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAU7C,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,yCAAyC;IACzC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;IACxB,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAA;IACd,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CACtC;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAa7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAEtG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAShF;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAkBxF"}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5
5
- *
6
4
  * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):
7
5
  * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的
8
6
  * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);
@@ -10,10 +8,10 @@
10
8
  * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是
11
9
  * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,
12
10
  * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件
13
- * 自带最小实现:borrow 视图 / 句柄类型视图 / disposal 解除(no-op)。
11
+ * 自带最小实现:句柄类型视图 / disposal 解除(no-op)。
14
12
  *
15
13
  * 因此投影一个库函数只需三件事:
16
- * 1. faijs Shape → 库输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);
14
+ * 1. faijs Shape → 库输入:原样直传(faijs-native 库消费 core Shape);
17
15
  * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);
18
16
  * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`
19
17
  * (meshHandle + 身份槽登记,所有权转入 faijs)。
@@ -22,80 +20,13 @@
22
20
  * handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖
23
21
  * (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。
24
22
  */
25
- import { brepOf } from '../../shape.js';
26
- import { fromHandle, getBrepApi } from '../../brep/handle-bridge.js';
23
+ import { fromHandle } from '../../brep/handle-bridge.js';
27
24
  import { getBackends } from '../../runtime-state.js';
28
25
  import { OpError } from './result-unwrap.js';
29
- const noopFn = () => { };
30
- /** Build an opaque kernel handle for an arena-allocated WASM shape. */
31
- function occtWasmHandleView(type, id) {
32
- return {
33
- __occtWasm: true,
34
- type,
35
- id,
36
- delete: noopFn,
37
- HashCode(upperBound) {
38
- return id % upperBound;
39
- },
40
- IsNull() {
41
- return false;
42
- },
43
- };
44
- }
45
- function isOcctWasmHandle(shape) {
46
- return typeof shape === 'object' && shape !== null && shape.__occtWasm === true;
47
- }
48
- /** Borrow view:不转移所有权、dispose 为 no-op(与 brepjs createBorrowedHandle 同语义)。 */
49
- function createBorrowedHandle(ocShape) {
50
- return {
51
- get wrapped() {
52
- return ocShape;
53
- },
54
- get disposed() {
55
- return false;
56
- },
57
- [Symbol.dispose]: noopFn,
58
- delete: noopFn,
59
- // Intentionally a no-op: a borrowed view never disposes, so a callback would
60
- // never fire. Tie dependent lifetimes to the owning parent's handle instead.
61
- onDispose: noopFn,
62
- };
63
- }
64
26
  /** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */
65
27
  function unregisterFromCleanup(_deletable) {
66
28
  // no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)
67
29
  }
68
- /**
69
- * Borrow a faijs Shape's OCCT handle as a library-side shape handle.
70
- *
71
- * No ownership transfer: the borrowed view is a no-op-dispose wrapper of the
72
- * same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to
73
- * compatOp-projected functions that take `Shapeable<T>` / `AnyShape`.
74
- *
75
- * `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a
76
- * branded number), but library code consumes shapes as *objects* (the
77
- * shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct
78
- * `shape.type` reads) — a raw number crashes there ("Invalid value used as weak
79
- * map key"). The id is therefore wrapped into a structurally valid
80
- * `OcctWasmHandleView`: the type is queried from the bound occt kernel through
81
- * `getOcctKernel().getShapeType`, and the `delete` is a no-op (non-owning view —
82
- * the arena slot and its ownership are untouched).
83
- *
84
- * @param s - the faijs Shape whose brep slot is borrowed.
85
- * @returns a library-side ShapeHandle view of the same occt shape.
86
- * @throws when the Shape has no live BREP slot (mesh-only input on a brep op).
87
- */
88
- export function borrowBrepjsShape(s) {
89
- const solid = brepOf(s);
90
- if (solid === undefined) {
91
- throw new Error('[faijs/l3-bridge] E_BREP_ONLY_INPUT: operation requires a BREP-backed shape ' +
92
- '(mesh-only input cannot run on the brep path)');
93
- }
94
- const kernelShape = isOcctWasmHandle(solid)
95
- ? solid
96
- : occtWasmHandleView(getBrepApi().shapeType(solid), solid);
97
- return createBorrowedHandle(kernelShape);
98
- }
99
30
  /**
100
31
  * Adopt a library-side product into a faijs Shape.
101
32
  *
@@ -124,14 +55,14 @@ export function adoptBrepjsProduct(product, segments) {
124
55
  /**
125
56
  * Call a library function with a rebuilt positional argument list.
126
57
  *
127
- * Generated wrappers build `__args` positionally (borrowing geometry inputs,
128
- * passing value params through); a plain `fn(...args: unknown[])` spread fails
58
+ * Generated wrappers build `__args` positionally (geometry inputs pass through
59
+ * untouched, value params pass through as-is); a plain `fn(...args: unknown[])` spread fails
129
60
  * TS2556 against fixed-arity signatures, so the call goes through this
130
61
  * rest-typed bridge that preserves the function's own `ReturnType` (so a
131
62
  * `Result` return keeps `.ok`/`.value` for the generated unwrap code).
132
63
  *
133
64
  * @param fn the library function.
134
- * @param args the rebuilt positional argument list (borrowed handles + value params).
65
+ * @param args the rebuilt positional argument list (geometry inputs + value params).
135
66
  * @returns whatever the function returns (typed via ReturnType).
136
67
  */
137
68
  export function callBrepjs(fn, args) {
@@ -187,7 +118,7 @@ export function adoptEntity(product, opName, segments) {
187
118
  return prev;
188
119
  const type = h.wrapped.type;
189
120
  if (type !== undefined && type !== 'solid' && type !== 'compound') {
190
- throw new OpError(opName, 'E_SUBSHAPE_BOUNDARY', `[faijs/brepjs-compat] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +
121
+ throw new OpError(opName, 'E_SUBSHAPE_BOUNDARY', `[faijs/op] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +
191
122
  'must not cross the library boundary; return entity solids or plain data');
192
123
  }
193
124
  unregisterFromCleanup(h); // ★ R1: no-op(brepjs registry 已删除)
@@ -1 +1 @@
1
- {"version":3,"file":"l3-bridge.js","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AA+BzC,MAAM,MAAM,GAAG,GAAS,EAAE,GAAE,CAAC,CAAA;AAE7B,uEAAuE;AACvE,SAAS,kBAAkB,CAAC,IAAY,EAAE,EAAU;IAClD,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,IAAI;QACJ,EAAE;QACF,MAAM,EAAE,MAAM;QACd,QAAQ,CAAC,UAAkB;YACzB,OAAO,EAAE,GAAG,UAAU,CAAA;QACxB,CAAC;QACD,MAAM;YACJ,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA4B,CAAC,UAAU,KAAK,IAAI,CAAA;AACzG,CAAC;AAED,6EAA6E;AAC7E,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,OAAO;QACL,IAAI,OAAO;YACT,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,KAAK,CAAA;QACd,CAAC;QACD,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM;QACxB,MAAM,EAAE,MAAM;QACd,6EAA6E;QAC7E,6EAA6E;QAC7E,SAAS,EAAE,MAAM;KAClB,CAAA;AACH,CAAC;AAED,uDAAuD;AACvD,SAAS,qBAAqB,CAAC,UAAkB;IAC/C,uEAAuE;AACzE,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAQ;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAA2B,CAAA;IACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,8EAA8E;YAC5E,+CAA+C,CAClD,CAAA;IACH,CAAC;IACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC;QACzC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,KAAc,CAAC,EAAE,KAAe,CAAC,CAAA;IAC/E,OAAO,oBAAoB,CAAC,WAAW,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB,EAAE,QAAiB;IACpE,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAA;IACrG,CAAC;IACD,uEAAuE;IACvE,qEAAqE;IACrE,MAAM,UAAU,GAAI,OAAgC,CAAC,OAAO,CAAA;IAC5D,MAAM,KAAK,GACT,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,IAAI,IAAI,UAAU;QACzE,CAAC,CAAE,UAA6B,CAAC,EAAE;QACnC,CAAC,CAAE,UAAqB,CAAA;IAC5B,MAAM,OAAO,GAAG,KAAmB,CAAA;IACnC,OAAO,UAAU,CAAC,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAuC,EAAK,EAAE,IAAe;IACrF,OAAO,EAAE,CAAC,GAAI,IAAgB,CAAkB,CAAA;AAClD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,OAA0B;IACxE,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAA;IACjD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,EAAE,CAAC;QACrF,MAAM,CAAC,GAAG,IAAI,KAAK,CACjB,2BAA2B,MAAM,qBAAqB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,OAAO,IAAI,QAAQ,GAAG,CAC9G,CAAA;QACD,CAAC,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAC/B,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF;6EAC6E;AAC7E,MAAM,UAAU,GAAG,IAAI,OAAO,EAAiB,CAAA;AAE/C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,MAAc,EAAE,QAAiB;IAC7E,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IAC9F,MAAM,CAAC,GAAG,OAA8B,CAAA;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAW,CAAC,CAAA;IACxC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,IAAI,GAAI,CAAC,CAAC,OAA6B,CAAC,IAAI,CAAA;IAClD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAClE,MAAM,IAAI,OAAO,CACf,MAAM,EACN,qBAAqB,EACrB,yBAAyB,MAAM,6CAA6C,IAAI,KAAK;YACnF,yEAAyE,CAC5E,CAAA;IACH,CAAC;IACD,qBAAqB,CAAC,CAAW,CAAC,CAAA,CAAC,mCAAmC;IACtE,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA,CAAC,mDAAmD;IAC7F,UAAU,CAAC,GAAG,CAAC,CAAW,EAAE,CAAC,CAAC,CAAA;IAC9B,OAAO,CAAC,CAAA;AACV,CAAC","sourcesContent":["/**\n * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)\n *\n * 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5\n *\n * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):\n * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的\n * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);\n * - 库侧(compatOp 投影的 brepjs-shaped 函数)消费的 ShapeHandle 是对象视图\n * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是\n * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,\n * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件\n * 自带最小实现:borrow 视图 / 句柄类型视图 / disposal 解除(no-op)。\n *\n * 因此投影一个库函数只需三件事:\n * 1. faijs Shape → 库输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);\n * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);\n * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`\n * (meshHandle + 身份槽登记,所有权转入 faijs)。\n *\n * 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /\n * handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖\n * (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf } from '../../shape'\nimport { fromHandle, getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBackends } from '../../runtime-state'\nimport { OpError } from './result-unwrap'\n\n// ── brepjs 借用面最小自有化(core-decouple wrapup §4.3)──────────────────────\n// 原实现:@faicad/faijs-brepjs/core/disposal.js(createBorrowedHandle /\n// unregisterFromCleanup / ShapeHandle)与 kernel/occtWasm/helpers.js\n// (handle / isOcctWasmHandle)。brepjs 子包删除后按同语义内联。\n\n/** 库侧消费的 shape 句柄视图(borrowed:不拥有、不释放)。 */\nexport interface BorrowedShapeHandle {\n /** The raw kernel shape handle */\n readonly wrapped: unknown\n /** Manual dispose(borrowed 视图为 no-op) */\n [Symbol.dispose](): void\n /** Alias for Symbol.dispose */\n delete(): void\n /** Always false for a borrowed view */\n readonly disposed: boolean\n /** Borrowed views never dispose, so callbacks never fire(no-op)。 */\n onDispose(callback: () => void): void\n}\n\n/** occt-wasm 句柄对象视图(type + id,delete no-op)。 */\nexport interface OcctWasmHandleView {\n __occtWasm: true\n type: string\n id: number\n delete(): void\n HashCode(upperBound: number): number\n IsNull(): boolean\n}\n\nconst noopFn = (): void => {}\n\n/** Build an opaque kernel handle for an arena-allocated WASM shape. */\nfunction occtWasmHandleView(type: string, id: number): OcctWasmHandleView {\n return {\n __occtWasm: true,\n type,\n id,\n delete: noopFn,\n HashCode(upperBound: number) {\n return id % upperBound\n },\n IsNull() {\n return false\n },\n }\n}\n\nfunction isOcctWasmHandle(shape: unknown): shape is OcctWasmHandleView {\n return typeof shape === 'object' && shape !== null && (shape as OcctWasmHandleView).__occtWasm === true\n}\n\n/** Borrow view:不转移所有权、dispose 为 no-op(与 brepjs createBorrowedHandle 同语义)。 */\nfunction createBorrowedHandle(ocShape: unknown): BorrowedShapeHandle {\n return {\n get wrapped() {\n return ocShape\n },\n get disposed() {\n return false\n },\n [Symbol.dispose]: noopFn,\n delete: noopFn,\n // Intentionally a no-op: a borrowed view never disposes, so a callback would\n // never fire. Tie dependent lifetimes to the owning parent's handle instead.\n onDispose: noopFn,\n }\n}\n\n/** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */\nfunction unregisterFromCleanup(_deletable: object): void {\n // no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)\n}\n\n/**\n * Borrow a faijs Shape's OCCT handle as a library-side shape handle.\n *\n * No ownership transfer: the borrowed view is a no-op-dispose wrapper of the\n * same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to\n * compatOp-projected functions that take `Shapeable<T>` / `AnyShape`.\n *\n * `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a\n * branded number), but library code consumes shapes as *objects* (the\n * shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct\n * `shape.type` reads) — a raw number crashes there (\"Invalid value used as weak\n * map key\"). The id is therefore wrapped into a structurally valid\n * `OcctWasmHandleView`: the type is queried from the bound occt kernel through\n * `getOcctKernel().getShapeType`, and the `delete` is a no-op (non-owning view —\n * the arena slot and its ownership are untouched).\n *\n * @param s - the faijs Shape whose brep slot is borrowed.\n * @returns a library-side ShapeHandle view of the same occt shape.\n * @throws when the Shape has no live BREP slot (mesh-only input on a brep op).\n */\nexport function borrowBrepjsShape(s: Shape): BorrowedShapeHandle {\n const solid = brepOf(s) as BrepHandle | undefined\n if (solid === undefined) {\n throw new Error(\n '[faijs/l3-bridge] E_BREP_ONLY_INPUT: operation requires a BREP-backed shape ' +\n '(mesh-only input cannot run on the brep path)',\n )\n }\n const kernelShape = isOcctWasmHandle(solid)\n ? solid\n : occtWasmHandleView(getBrepApi().shapeType(solid as never), solid as number)\n return createBorrowedHandle(kernelShape)\n}\n\n/**\n * Adopt a library-side product into a faijs Shape.\n *\n * Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'\n * identity slot via `fromHandle` — ownership transfers to faijs, and the library\n * wrapper must not dispose it afterwards (projected ops return it directly).\n *\n * @param product - a library-side shape (ShapeHandle / AnyShape family).\n * @param segments - optional tessellation segments(投影侧 `segments?`,裁决 1;\n * 透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).\n * @returns the faijs Shape wrapping the same occt solid.\n */\nexport function adoptBrepjsProduct(product: unknown, segments?: number): Shape {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) {\n throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the library engine')\n }\n // library `wrapped` may be an OcctHandle (`{id}`) or a raw numeric id;\n // faijs' kernel meshShape expects the numeric shape id (fromHandle).\n const wrappedAny = (product as { wrapped: unknown }).wrapped\n const rawId =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : (wrappedAny as number)\n const wrapped = rawId as BrepHandle\n return fromHandle(wrapped, segments === undefined ? undefined : { segments })\n}\n\n/**\n * Call a library function with a rebuilt positional argument list.\n *\n * Generated wrappers build `__args` positionally (borrowing geometry inputs,\n * passing value params through); a plain `fn(...args: unknown[])` spread fails\n * TS2556 against fixed-arity signatures, so the call goes through this\n * rest-typed bridge that preserves the function's own `ReturnType` (so a\n * `Result` return keeps `.ok`/`.value` for the generated unwrap code).\n *\n * @param fn the library function.\n * @param args the rebuilt positional argument list (borrowed handles + value params).\n * @returns whatever the function returns (typed via ReturnType).\n */\nexport function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F> {\n return fn(...(args as never[])) as ReturnType<F>\n}\n\n/**\n * Phase 6(narrowing plan D7):brep 测量 op 的执行前引擎身份断言。\n *\n * 库面 query op 是普通函数(不走 dispatchPath),但部分依赖 occt-only 内核方法\n * (shapeType / linearCenterOfMass / distance / curvature / interference,L2 平台面,\n * D6 表)——在这些 op 的实现上声明 `engines: ['occt']`,函数体第一行即断言当前\n * 引擎身份,在触碰内核之前报出可定位错误(文案与 D11-4 同构),不补桩、不回退。\n *\n * @param opName - op 名(报错文案)。\n * @param engines - 允许执行的引擎 id 集合(arg-spec 条目的 `engines` 字段)。\n * @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。\n */\nexport function assertEngineFor(opName: string, engines: readonly string[]): void {\n const current = getBackends().config.brepEngineId\n if (current === null || current === undefined || !engines.some((e) => e === current)) {\n const e = new Error(\n `E_BREP_UNSUPPORTED: op '${opName}' requires engine ${engines.join(' or ')} (current=${current ?? '<none>'})`,\n )\n e.name = 'BrepUnsupportedError'\n throw e\n }\n}\n\n// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────\n\n/** Already-adopted handle dedup table: the same library handle adopted twice →\n * the same faijs Shape (prevents double ownership / double dispose, R6). */\nconst adoptedMap = new WeakMap<object, Shape>()\n\n/**\n * Adopt a library handle as a faijs Shape (compatOp step 5's only adoption\n * entry point).\n *\n * ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);\n * ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY\n * (v1 boundary rejection, R4; the brand is a compile-time phantom type —\n * the runtime kind is read from the occt-wasm handle's own `type` field,\n * same as the kernel getShapeType helpers);\n * ③ entities (solid/compound) → no-op unregisterFromCleanup(★ R1:brepjs\n * finalizer registry 已随子包删除,无孤儿释放风险)→ adoptBrepjsProduct.\n *\n * @param product - the library result (handle or plain data record).\n * @param opName - the op name (error messages).\n * @param segments - optional tessellation segments (compat `segments?`).\n * @returns the adopted faijs Shape, or the plain data untouched.\n */\nexport function adoptEntity(product: unknown, opName: string, segments?: number): unknown {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) return product\n const h = product as BorrowedShapeHandle\n const prev = adoptedMap.get(h as object)\n if (prev) return prev\n const type = (h.wrapped as { type?: string }).type\n if (type !== undefined && type !== 'solid' && type !== 'compound') {\n throw new OpError(\n opName,\n 'E_SUBSHAPE_BOUNDARY',\n `[faijs/brepjs-compat] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +\n 'must not cross the library boundary; return entity solids or plain data',\n )\n }\n unregisterFromCleanup(h as object) // ★ R1: no-op(brepjs registry 已删除)\n const s = adoptBrepjsProduct(h, segments) // fromHandle: tessellation + identity + BREP slots\n adoptedMap.set(h as object, s)\n return s\n}\n"]}
1
+ {"version":3,"file":"l3-bridge.js","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)\n *\n * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):\n * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的\n * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);\n * - 库侧(compatOp 投影的 brepjs-shaped 函数)消费的 ShapeHandle 是对象视图\n * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是\n * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,\n * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件\n * 自带最小实现:句柄类型视图 / disposal 解除(no-op)。\n *\n * 因此投影一个库函数只需三件事:\n * 1. faijs Shape → 库输入:原样直传(faijs-native 库消费 core Shape);\n * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);\n * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`\n * (meshHandle + 身份槽登记,所有权转入 faijs)。\n *\n * 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /\n * handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖\n * (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { fromHandle } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBackends } from '../../runtime-state'\nimport { OpError } from './result-unwrap'\n\n// ── brepjs 借用面最小自有化(core-decouple wrapup §4.3)──────────────────────\n// 原实现:@faicad/faijs-brepjs/core/disposal.js(unregisterFromCleanup /\n// ShapeHandle)。brepjs 子包删除后按同语义内联。\n\n/** 库侧消费的 shape 句柄视图(borrowed:不拥有、不释放)。 */\nexport interface BorrowedShapeHandle {\n /** The raw kernel shape handle */\n readonly wrapped: unknown\n /** Manual dispose(borrowed 视图为 no-op) */\n [Symbol.dispose](): void\n /** Alias for Symbol.dispose */\n delete(): void\n /** Always false for a borrowed view */\n readonly disposed: boolean\n /** Borrowed views never dispose, so callbacks never fire(no-op)。 */\n onDispose(callback: () => void): void\n}\n\n/** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */\nfunction unregisterFromCleanup(_deletable: object): void {\n // no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)\n}\n\n/**\n * Adopt a library-side product into a faijs Shape.\n *\n * Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'\n * identity slot via `fromHandle` — ownership transfers to faijs, and the library\n * wrapper must not dispose it afterwards (projected ops return it directly).\n *\n * @param product - a library-side shape (ShapeHandle / AnyShape family).\n * @param segments - optional tessellation segments(投影侧 `segments?`,裁决 1;\n * 透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).\n * @returns the faijs Shape wrapping the same occt solid.\n */\nexport function adoptBrepjsProduct(product: unknown, segments?: number): Shape {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) {\n throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the library engine')\n }\n // library `wrapped` may be an OcctHandle (`{id}`) or a raw numeric id;\n // faijs' kernel meshShape expects the numeric shape id (fromHandle).\n const wrappedAny = (product as { wrapped: unknown }).wrapped\n const rawId =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : (wrappedAny as number)\n const wrapped = rawId as BrepHandle\n return fromHandle(wrapped, segments === undefined ? undefined : { segments })\n}\n\n/**\n * Call a library function with a rebuilt positional argument list.\n *\n * Generated wrappers build `__args` positionally (geometry inputs pass through\n * untouched, value params pass through as-is); a plain `fn(...args: unknown[])` spread fails\n * TS2556 against fixed-arity signatures, so the call goes through this\n * rest-typed bridge that preserves the function's own `ReturnType` (so a\n * `Result` return keeps `.ok`/`.value` for the generated unwrap code).\n *\n * @param fn the library function.\n * @param args the rebuilt positional argument list (geometry inputs + value params).\n * @returns whatever the function returns (typed via ReturnType).\n */\nexport function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F> {\n return fn(...(args as never[])) as ReturnType<F>\n}\n\n/**\n * Phase 6(narrowing plan D7):brep 测量 op 的执行前引擎身份断言。\n *\n * 库面 query op 是普通函数(不走 dispatchPath),但部分依赖 occt-only 内核方法\n * (shapeType / linearCenterOfMass / distance / curvature / interference,L2 平台面,\n * D6 表)——在这些 op 的实现上声明 `engines: ['occt']`,函数体第一行即断言当前\n * 引擎身份,在触碰内核之前报出可定位错误(文案与 D11-4 同构),不补桩、不回退。\n *\n * @param opName - op 名(报错文案)。\n * @param engines - 允许执行的引擎 id 集合(arg-spec 条目的 `engines` 字段)。\n * @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。\n */\nexport function assertEngineFor(opName: string, engines: readonly string[]): void {\n const current = getBackends().config.brepEngineId\n if (current === null || current === undefined || !engines.some((e) => e === current)) {\n const e = new Error(\n `E_BREP_UNSUPPORTED: op '${opName}' requires engine ${engines.join(' or ')} (current=${current ?? '<none>'})`,\n )\n e.name = 'BrepUnsupportedError'\n throw e\n }\n}\n\n// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────\n\n/** Already-adopted handle dedup table: the same library handle adopted twice →\n * the same faijs Shape (prevents double ownership / double dispose, R6). */\nconst adoptedMap = new WeakMap<object, Shape>()\n\n/**\n * Adopt a library handle as a faijs Shape (compatOp step 5's only adoption\n * entry point).\n *\n * ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);\n * ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY\n * (v1 boundary rejection, R4; the brand is a compile-time phantom type —\n * the runtime kind is read from the occt-wasm handle's own `type` field,\n * same as the kernel getShapeType helpers);\n * ③ entities (solid/compound) → no-op unregisterFromCleanup(★ R1:brepjs\n * finalizer registry 已随子包删除,无孤儿释放风险)→ adoptBrepjsProduct.\n *\n * @param product - the library result (handle or plain data record).\n * @param opName - the op name (error messages).\n * @param segments - optional tessellation segments (compat `segments?`).\n * @returns the adopted faijs Shape, or the plain data untouched.\n */\nexport function adoptEntity(product: unknown, opName: string, segments?: number): unknown {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) return product\n const h = product as BorrowedShapeHandle\n const prev = adoptedMap.get(h as object)\n if (prev) return prev\n const type = (h.wrapped as { type?: string }).type\n if (type !== undefined && type !== 'solid' && type !== 'compound') {\n throw new OpError(\n opName,\n 'E_SUBSHAPE_BOUNDARY',\n `[faijs/op] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +\n 'must not cross the library boundary; return entity solids or plain data',\n )\n }\n unregisterFromCleanup(h as object) // ★ R1: no-op(brepjs registry 已删除)\n const s = adoptBrepjsProduct(h, segments) // fromHandle: tessellation + identity + BREP slots\n adoptedMap.set(h as object, s)\n return s\n}\n"]}
@@ -10,7 +10,7 @@
10
10
  * - 2D 截面(`cad.profile` 的面)→ 取**外环**(孔环不参与扫掠/放样)。
11
11
  *
12
12
  * core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`
13
- * (brepjs 形态保留,供 brep-mirror 实现直读)。所有权:面→外环的 wire 是
13
+ * (brepjs 形态保留,供 brep-operations 实现直读)。所有权:面→外环的 wire 是
14
14
  * arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;
15
15
  * 曲线借用(borrowed=true)不 release。
16
16
  */
@@ -10,7 +10,7 @@
10
10
  * - 2D 截面(`cad.profile` 的面)→ 取**外环**(孔环不参与扫掠/放样)。
11
11
  *
12
12
  * core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`
13
- * (brepjs 形态保留,供 brep-mirror 实现直读)。所有权:面→外环的 wire 是
13
+ * (brepjs 形态保留,供 brep-operations 实现直读)。所有权:面→外环的 wire 是
14
14
  * arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;
15
15
  * 曲线借用(borrowed=true)不 release。
16
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"profile-wire.js","sourceRoot":"","sources":["../../../src/api/internal/profile-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAUrD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAc;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAe,CAAA;IAC5C,IAAI,YAAY,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACrE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["/**\n * profile-wire — 「截面 Shape → 扫掠/放样所需的 wire 视图」的唯一步径(Phase 4→G5)\n *\n * `sweep` / `loft` 共用:脚本面最常见的截面来源是 `cad.profile(...)`(产出 **face**),\n * 而内核的 `sweep` / `loft` 只吃 wire ⇒ 需要「面 → 外环 wire」输入适配。\n * 两处口径必须逐字一致,故收在此叶子模块(一份实现,不允许第二个判定点)。\n *\n * 判定用 faijs 侧判别位(Phase 3 落地的 `kind:'curve'`),不查内核拓扑类型:\n * - 1D 截面(`cad.wire` / `cad.helix` / `cad.profile({as:'wire'})`)→ 借用原句柄;\n * - 2D 截面(`cad.profile` 的面)→ 取**外环**(孔环不参与扫掠/放样)。\n *\n * core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`\n * (brepjs 形态保留,供 brep-mirror 实现直读)。所有权:面→外环的 wire 是\n * arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;\n * 曲线借用(borrowed=true)不 release。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf, isCurveShape } from '../../shape'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\n\n/** Wire view for sweep/loft sections: the BREP handle plus its ownership flag. */\nexport interface WireView {\n wrapped: BrepHandle\n /** true = 借用原 shape 句柄(勿 release);false = 新建外环 wire(调用方 release)。 */\n borrowed: boolean\n}\n\n/** 截面 Shape → wire 视图(面取其外环)。\n *\n * @param section - Section shape (curve or face) to adapt.\n * @returns The wire view wrapping the handle and its ownership flag.\n */\nexport function toProfileWireView(section: Shape): WireView {\n const handle = brepOf(section) as BrepHandle\n if (isCurveShape(section)) return { wrapped: handle, borrowed: true }\n const kernel = getBrepApi()\n const faces = kernel.getSubShapes(handle, 'face')\n if (faces.length === 0) return { wrapped: handle, borrowed: true }\n const wires = kernel.getSubShapes(faces[0], 'wire')\n if (wires.length === 0) return { wrapped: handle, borrowed: true }\n return { wrapped: wires[0], borrowed: false }\n}\n"]}
1
+ {"version":3,"file":"profile-wire.js","sourceRoot":"","sources":["../../../src/api/internal/profile-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAUrD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAc;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAe,CAAA;IAC5C,IAAI,YAAY,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACrE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["/**\n * profile-wire — 「截面 Shape → 扫掠/放样所需的 wire 视图」的唯一步径(Phase 4→G5)\n *\n * `sweep` / `loft` 共用:脚本面最常见的截面来源是 `cad.profile(...)`(产出 **face**),\n * 而内核的 `sweep` / `loft` 只吃 wire ⇒ 需要「面 → 外环 wire」输入适配。\n * 两处口径必须逐字一致,故收在此叶子模块(一份实现,不允许第二个判定点)。\n *\n * 判定用 faijs 侧判别位(Phase 3 落地的 `kind:'curve'`),不查内核拓扑类型:\n * - 1D 截面(`cad.wire` / `cad.helix` / `cad.profile({as:'wire'})`)→ 借用原句柄;\n * - 2D 截面(`cad.profile` 的面)→ 取**外环**(孔环不参与扫掠/放样)。\n *\n * core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`\n * (brepjs 形态保留,供 brep-operations 实现直读)。所有权:面→外环的 wire 是\n * arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;\n * 曲线借用(borrowed=true)不 release。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf, isCurveShape } from '../../shape'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\n\n/** Wire view for sweep/loft sections: the BREP handle plus its ownership flag. */\nexport interface WireView {\n wrapped: BrepHandle\n /** true = 借用原 shape 句柄(勿 release);false = 新建外环 wire(调用方 release)。 */\n borrowed: boolean\n}\n\n/** 截面 Shape → wire 视图(面取其外环)。\n *\n * @param section - Section shape (curve or face) to adapt.\n * @returns The wire view wrapping the handle and its ownership flag.\n */\nexport function toProfileWireView(section: Shape): WireView {\n const handle = brepOf(section) as BrepHandle\n if (isCurveShape(section)) return { wrapped: handle, borrowed: true }\n const kernel = getBrepApi()\n const faces = kernel.getSubShapes(handle, 'face')\n if (faces.length === 0) return { wrapped: handle, borrowed: true }\n const wires = kernel.getSubShapes(faces[0], 'wire')\n if (wires.length === 0) return { wrapped: handle, borrowed: true }\n return { wrapped: wires[0], borrowed: false }\n}\n"]}