@faicad/faijs 0.29.5 → 0.31.1

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 (722) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/align/index.d.ts +64 -0
  3. package/dist/api/align/index.d.ts.map +1 -0
  4. package/dist/api/align/index.js +101 -0
  5. package/dist/api/align/index.js.map +1 -0
  6. package/dist/api/api-namespace.d.ts +6 -5
  7. package/dist/api/api-namespace.d.ts.map +1 -1
  8. package/dist/api/api-namespace.js +89 -5
  9. package/dist/api/api-namespace.js.map +1 -1
  10. package/dist/api/appearance.d.ts +0 -2
  11. package/dist/api/appearance.d.ts.map +1 -1
  12. package/dist/api/appearance.js +0 -2
  13. package/dist/api/appearance.js.map +1 -1
  14. package/dist/api/assembly/entities.d.ts +1 -1
  15. package/dist/api/assembly/entities.js +1 -1
  16. package/dist/api/assembly/entities.js.map +1 -1
  17. package/dist/api/assembly/index.d.ts +1 -1
  18. package/dist/api/assembly/index.js +1 -1
  19. package/dist/api/assembly/index.js.map +1 -1
  20. package/dist/api/assembly/joints.d.ts +33 -15
  21. package/dist/api/assembly/joints.d.ts.map +1 -1
  22. package/dist/api/assembly/joints.js +31 -13
  23. package/dist/api/assembly/joints.js.map +1 -1
  24. package/dist/api/assembly/preview.d.ts +1 -1
  25. package/dist/api/assembly/preview.js +1 -1
  26. package/dist/api/assembly/preview.js.map +1 -1
  27. package/dist/api/assembly/solve.d.ts +1 -1
  28. package/dist/api/assembly/solve.js +1 -1
  29. package/dist/api/assembly/solve.js.map +1 -1
  30. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  31. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  32. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  33. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  34. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  36. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  37. package/dist/api/assembly/solvers/global-solver.js +3 -4
  38. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  39. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  40. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  41. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  42. package/dist/api/assembly/solvers/linalg.js +2 -2
  43. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  44. package/dist/api/assembly/solvers/types.d.ts +2 -5
  45. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  46. package/dist/api/assembly/solvers/types.js +1 -4
  47. package/dist/api/assembly/solvers/types.js.map +1 -1
  48. package/dist/api/boolean-op/index.d.ts +65 -0
  49. package/dist/api/boolean-op/index.d.ts.map +1 -0
  50. package/dist/api/boolean-op/index.js +113 -0
  51. package/dist/api/boolean-op/index.js.map +1 -0
  52. package/dist/api/boolean.d.ts.map +1 -1
  53. package/dist/api/boolean.js +22 -33
  54. package/dist/api/boolean.js.map +1 -1
  55. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  56. package/dist/api/brep-mirror/booleanFns.js +5 -5
  57. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  58. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  59. package/dist/api/brep-mirror/compoundFns.js +4 -4
  60. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  61. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  62. package/dist/api/brep-mirror/healingFns.js +4 -4
  63. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  64. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  65. package/dist/api/brep-mirror/hullFns.js +2 -2
  66. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  67. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  68. package/dist/api/brep-mirror/patternFns.js +10 -10
  69. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  70. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  71. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  72. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  73. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  74. package/dist/api/brep-mirror/roofFns.js +7 -7
  75. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  76. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  77. package/dist/api/brep-mirror/sweepFns.js +14 -14
  78. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  79. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  80. package/dist/api/brep-mirror/threadFns.js +1 -1
  81. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  82. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  83. package/dist/api/brep-mirror/topologyFns.js +8 -8
  84. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  85. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  86. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/booleanFns.js +104 -0
  88. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  89. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  90. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  91. package/dist/api/brep-operations/brepHelpers.js +131 -0
  92. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  93. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  94. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/compoundFns.js +299 -0
  96. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  97. package/dist/api/brep-operations/healingFns.d.ts +91 -0
  98. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  99. package/dist/api/brep-operations/healingFns.js +321 -0
  100. package/dist/api/brep-operations/healingFns.js.map +1 -0
  101. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  102. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/hullFns.js +46 -0
  104. package/dist/api/brep-operations/hullFns.js.map +1 -0
  105. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  106. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  107. package/dist/api/brep-operations/joinery-brep.js +463 -0
  108. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  109. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  110. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/patternFns.js +178 -0
  112. package/dist/api/brep-operations/patternFns.js.map +1 -0
  113. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  114. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  115. package/dist/api/brep-operations/primitiveFns.js +104 -0
  116. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  117. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  118. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/roofFns.js +229 -0
  120. package/dist/api/brep-operations/roofFns.js.map +1 -0
  121. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  122. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  123. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  124. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  125. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  126. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/sweepFns.js +323 -0
  128. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  129. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  130. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  131. package/dist/api/brep-operations/threadFns.js +138 -0
  132. package/dist/api/brep-operations/threadFns.js.map +1 -0
  133. package/dist/api/brep-operations/topologyFns.d.ts +111 -0
  134. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  135. package/dist/api/brep-operations/topologyFns.js +300 -0
  136. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  137. package/dist/api/brep-topology.d.ts +1 -1
  138. package/dist/api/brep-topology.d.ts.map +1 -1
  139. package/dist/api/brep-topology.js +1 -1
  140. package/dist/api/brep-topology.js.map +1 -1
  141. package/dist/api/brepjs-compat/index.d.ts +1 -1
  142. package/dist/api/brepjs-compat/index.js +3 -3
  143. package/dist/api/brepjs-compat/index.js.map +1 -1
  144. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  145. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  146. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  147. package/dist/api/chamfer.d.ts +5 -4
  148. package/dist/api/chamfer.d.ts.map +1 -1
  149. package/dist/api/chamfer.js +12 -11
  150. package/dist/api/chamfer.js.map +1 -1
  151. package/dist/api/curve-sketch/index.d.ts +235 -0
  152. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  153. package/dist/api/curve-sketch/index.js +493 -0
  154. package/dist/api/curve-sketch/index.js.map +1 -0
  155. package/dist/api/draft.d.ts.map +1 -1
  156. package/dist/api/draft.js +1 -3
  157. package/dist/api/draft.js.map +1 -1
  158. package/dist/api/engrave.d.ts.map +1 -1
  159. package/dist/api/engrave.js +6 -15
  160. package/dist/api/engrave.js.map +1 -1
  161. package/dist/api/export-3mf.d.ts +73 -0
  162. package/dist/api/export-3mf.d.ts.map +1 -0
  163. package/dist/api/export-3mf.js +121 -0
  164. package/dist/api/export-3mf.js.map +1 -0
  165. package/dist/api/export-brep.d.ts +47 -0
  166. package/dist/api/export-brep.d.ts.map +1 -0
  167. package/dist/api/export-brep.js +67 -0
  168. package/dist/api/export-brep.js.map +1 -0
  169. package/dist/api/export-step.d.ts +67 -0
  170. package/dist/api/export-step.d.ts.map +1 -0
  171. package/dist/api/export-step.js +98 -0
  172. package/dist/api/export-step.js.map +1 -0
  173. package/dist/api/export-stl.d.ts +58 -0
  174. package/dist/api/export-stl.d.ts.map +1 -0
  175. package/dist/api/export-stl.js +114 -0
  176. package/dist/api/export-stl.js.map +1 -0
  177. package/dist/api/extrude.d.ts +8 -11
  178. package/dist/api/extrude.d.ts.map +1 -1
  179. package/dist/api/extrude.js +11 -14
  180. package/dist/api/extrude.js.map +1 -1
  181. package/dist/api/feature-repair.d.ts +1 -1
  182. package/dist/api/feature-repair.d.ts.map +1 -1
  183. package/dist/api/feature-repair.js +1 -7
  184. package/dist/api/feature-repair.js.map +1 -1
  185. package/dist/api/fillet-variable.d.ts +2 -2
  186. package/dist/api/fillet-variable.d.ts.map +1 -1
  187. package/dist/api/fillet-variable.js +2 -3
  188. package/dist/api/fillet-variable.js.map +1 -1
  189. package/dist/api/fillet.d.ts +5 -7
  190. package/dist/api/fillet.d.ts.map +1 -1
  191. package/dist/api/fillet.js +5 -8
  192. package/dist/api/fillet.js.map +1 -1
  193. package/dist/api/generated/2d.d.ts +4 -0
  194. package/dist/api/generated/2d.d.ts.map +1 -1
  195. package/dist/api/generated/2d.js +4 -0
  196. package/dist/api/generated/2d.js.map +1 -1
  197. package/dist/api/generated/core.d.ts +4 -0
  198. package/dist/api/generated/core.d.ts.map +1 -1
  199. package/dist/api/generated/core.js +4 -0
  200. package/dist/api/generated/core.js.map +1 -1
  201. package/dist/api/generated/gear.d.ts +4 -0
  202. package/dist/api/generated/gear.d.ts.map +1 -1
  203. package/dist/api/generated/gear.js +4 -0
  204. package/dist/api/generated/gear.js.map +1 -1
  205. package/dist/api/generated/io.d.ts +4 -0
  206. package/dist/api/generated/io.d.ts.map +1 -1
  207. package/dist/api/generated/io.js +4 -0
  208. package/dist/api/generated/io.js.map +1 -1
  209. package/dist/api/generated/kernel.d.ts +4 -0
  210. package/dist/api/generated/kernel.d.ts.map +1 -1
  211. package/dist/api/generated/kernel.js +4 -0
  212. package/dist/api/generated/kernel.js.map +1 -1
  213. package/dist/api/generated/measurement.d.ts +21 -21
  214. package/dist/api/generated/measurement.d.ts.map +1 -1
  215. package/dist/api/generated/measurement.js +25 -21
  216. package/dist/api/generated/measurement.js.map +1 -1
  217. package/dist/api/generated/ns.d.ts +4 -0
  218. package/dist/api/generated/ns.d.ts.map +1 -1
  219. package/dist/api/generated/ns.js +4 -0
  220. package/dist/api/generated/ns.js.map +1 -1
  221. package/dist/api/generated/operations.d.ts +32 -32
  222. package/dist/api/generated/operations.d.ts.map +1 -1
  223. package/dist/api/generated/operations.js +58 -54
  224. package/dist/api/generated/operations.js.map +1 -1
  225. package/dist/api/generated/projection.d.ts +4 -0
  226. package/dist/api/generated/projection.d.ts.map +1 -1
  227. package/dist/api/generated/projection.js +4 -0
  228. package/dist/api/generated/projection.js.map +1 -1
  229. package/dist/api/generated/query.d.ts +4 -0
  230. package/dist/api/generated/query.d.ts.map +1 -1
  231. package/dist/api/generated/query.js +4 -0
  232. package/dist/api/generated/query.js.map +1 -1
  233. package/dist/api/generated/script-face-manifest.d.ts +1 -1
  234. package/dist/api/generated/script-face-manifest.js +3 -3
  235. package/dist/api/generated/script-face-manifest.js.map +1 -1
  236. package/dist/api/generated/script-face.d.ts +1 -1
  237. package/dist/api/generated/script-face.js +1 -1
  238. package/dist/api/generated/script-face.js.map +1 -1
  239. package/dist/api/generated/sketching.d.ts +2 -2
  240. package/dist/api/generated/sketching.d.ts.map +1 -1
  241. package/dist/api/generated/sketching.js +8 -4
  242. package/dist/api/generated/sketching.js.map +1 -1
  243. package/dist/api/generated/text.d.ts +4 -0
  244. package/dist/api/generated/text.d.ts.map +1 -1
  245. package/dist/api/generated/text.js +4 -0
  246. package/dist/api/generated/text.js.map +1 -1
  247. package/dist/api/generated/topology.d.ts +45 -45
  248. package/dist/api/generated/topology.d.ts.map +1 -1
  249. package/dist/api/generated/topology.js +77 -73
  250. package/dist/api/generated/topology.js.map +1 -1
  251. package/dist/api/generated/view.d.ts +4 -0
  252. package/dist/api/generated/view.d.ts.map +1 -1
  253. package/dist/api/generated/view.js +4 -0
  254. package/dist/api/generated/view.js.map +1 -1
  255. package/dist/api/geom-types/constants.d.ts +11 -0
  256. package/dist/api/geom-types/constants.d.ts.map +1 -0
  257. package/dist/api/geom-types/constants.js +11 -0
  258. package/dist/api/geom-types/constants.js.map +1 -0
  259. package/dist/api/geom-types/index.d.ts +21 -0
  260. package/dist/api/geom-types/index.d.ts.map +1 -0
  261. package/dist/api/geom-types/index.js +22 -0
  262. package/dist/api/geom-types/index.js.map +1 -0
  263. package/dist/api/geom-types/planeOps.d.ts +98 -0
  264. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  265. package/dist/api/geom-types/planeOps.js +170 -0
  266. package/dist/api/geom-types/planeOps.js.map +1 -0
  267. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  268. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  269. package/dist/api/geom-types/planeTypes.js +8 -0
  270. package/dist/api/geom-types/planeTypes.js.map +1 -0
  271. package/dist/api/geom-types/types.d.ts +64 -0
  272. package/dist/api/geom-types/types.d.ts.map +1 -0
  273. package/dist/api/geom-types/types.js +48 -0
  274. package/dist/api/geom-types/types.js.map +1 -0
  275. package/dist/api/geom-types/vecOps.d.ts +124 -0
  276. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  277. package/dist/api/geom-types/vecOps.js +202 -0
  278. package/dist/api/geom-types/vecOps.js.map +1 -0
  279. package/dist/api/geom.d.ts.map +1 -1
  280. package/dist/api/geom.js +6 -5
  281. package/dist/api/geom.js.map +1 -1
  282. package/dist/api/half-space.d.ts +56 -0
  283. package/dist/api/half-space.d.ts.map +1 -0
  284. package/dist/api/half-space.js +82 -0
  285. package/dist/api/half-space.js.map +1 -0
  286. package/dist/api/helix.d.ts +11 -2
  287. package/dist/api/helix.d.ts.map +1 -1
  288. package/dist/api/helix.js +20 -4
  289. package/dist/api/helix.js.map +1 -1
  290. package/dist/api/index.d.ts +19 -7
  291. package/dist/api/index.d.ts.map +1 -1
  292. package/dist/api/index.js +44 -11
  293. package/dist/api/index.js.map +1 -1
  294. package/dist/api/internal/compat-op.d.ts +10 -36
  295. package/dist/api/internal/compat-op.d.ts.map +1 -1
  296. package/dist/api/internal/compat-op.js +17 -51
  297. package/dist/api/internal/compat-op.js.map +1 -1
  298. package/dist/api/internal/compat-projection.d.ts +5 -5
  299. package/dist/api/internal/compat-projection.js +5 -5
  300. package/dist/api/internal/compat-projection.js.map +1 -1
  301. package/dist/api/internal/dual-form-args.d.ts +0 -2
  302. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  303. package/dist/api/internal/dual-form-args.js +1 -3
  304. package/dist/api/internal/dual-form-args.js.map +1 -1
  305. package/dist/api/internal/export-members.d.ts +80 -0
  306. package/dist/api/internal/export-members.d.ts.map +1 -0
  307. package/dist/api/internal/export-members.js +104 -0
  308. package/dist/api/internal/export-members.js.map +1 -0
  309. package/dist/api/internal/l3-bridge.d.ts +22 -37
  310. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  311. package/dist/api/internal/l3-bridge.js +30 -77
  312. package/dist/api/internal/l3-bridge.js.map +1 -1
  313. package/dist/api/internal/profile-wire.d.ts +1 -1
  314. package/dist/api/internal/profile-wire.js +1 -1
  315. package/dist/api/internal/profile-wire.js.map +1 -1
  316. package/dist/api/internal/result-unwrap.d.ts +4 -6
  317. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  318. package/dist/api/internal/result-unwrap.js +4 -6
  319. package/dist/api/internal/result-unwrap.js.map +1 -1
  320. package/dist/api/knurl.d.ts.map +1 -1
  321. package/dist/api/knurl.js +5 -3
  322. package/dist/api/knurl.js.map +1 -1
  323. package/dist/api/loft.d.ts +2 -2
  324. package/dist/api/loft.d.ts.map +1 -1
  325. package/dist/api/loft.js +2 -2
  326. package/dist/api/loft.js.map +1 -1
  327. package/dist/api/measure-query/index.d.ts +262 -0
  328. package/dist/api/measure-query/index.d.ts.map +1 -0
  329. package/dist/api/measure-query/index.js +390 -0
  330. package/dist/api/measure-query/index.js.map +1 -0
  331. package/dist/api/measurement/index.d.ts +3 -3
  332. package/dist/api/measurement/index.js +3 -3
  333. package/dist/api/measurement/index.js.map +1 -1
  334. package/dist/api/meta.d.ts +0 -2
  335. package/dist/api/meta.d.ts.map +1 -1
  336. package/dist/api/meta.js +0 -2
  337. package/dist/api/meta.js.map +1 -1
  338. package/dist/api/offset2d.d.ts +49 -0
  339. package/dist/api/offset2d.d.ts.map +1 -0
  340. package/dist/api/offset2d.js +86 -0
  341. package/dist/api/offset2d.js.map +1 -0
  342. package/dist/api/pattern.d.ts.map +1 -1
  343. package/dist/api/pattern.js +3 -6
  344. package/dist/api/pattern.js.map +1 -1
  345. package/dist/api/primitives.d.ts +6 -6
  346. package/dist/api/primitives.d.ts.map +1 -1
  347. package/dist/api/primitives.js +19 -17
  348. package/dist/api/primitives.js.map +1 -1
  349. package/dist/api/profile.d.ts.map +1 -1
  350. package/dist/api/profile.js +0 -1
  351. package/dist/api/profile.js.map +1 -1
  352. package/dist/api/punch-hole.d.ts.map +1 -1
  353. package/dist/api/punch-hole.js +0 -1
  354. package/dist/api/punch-hole.js.map +1 -1
  355. package/dist/api/replicate.d.ts +6 -8
  356. package/dist/api/replicate.d.ts.map +1 -1
  357. package/dist/api/replicate.js +27 -65
  358. package/dist/api/replicate.js.map +1 -1
  359. package/dist/api/result.d.ts +1 -1
  360. package/dist/api/result.js +1 -1
  361. package/dist/api/result.js.map +1 -1
  362. package/dist/api/revolve.d.ts +2 -2
  363. package/dist/api/revolve.js +3 -3
  364. package/dist/api/revolve.js.map +1 -1
  365. package/dist/api/screw.d.ts +1 -1
  366. package/dist/api/screw.d.ts.map +1 -1
  367. package/dist/api/screw.js +5 -4
  368. package/dist/api/screw.js.map +1 -1
  369. package/dist/api/sdf.d.ts.map +1 -1
  370. package/dist/api/sdf.js +3 -2
  371. package/dist/api/sdf.js.map +1 -1
  372. package/dist/api/section-by-plane.d.ts.map +1 -1
  373. package/dist/api/section-by-plane.js +0 -1
  374. package/dist/api/section-by-plane.js.map +1 -1
  375. package/dist/api/shape-type/index.d.ts +141 -0
  376. package/dist/api/shape-type/index.d.ts.map +1 -0
  377. package/dist/api/shape-type/index.js +182 -0
  378. package/dist/api/shape-type/index.js.map +1 -0
  379. package/dist/api/shell.d.ts +2 -2
  380. package/dist/api/shell.d.ts.map +1 -1
  381. package/dist/api/shell.js +12 -3
  382. package/dist/api/shell.js.map +1 -1
  383. package/dist/api/sketch-on-face.d.ts +3 -3
  384. package/dist/api/sketch-on-face.d.ts.map +1 -1
  385. package/dist/api/sketch-on-face.js +6 -4
  386. package/dist/api/sketch-on-face.js.map +1 -1
  387. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  388. package/dist/api/sketch-on-plane.js +0 -1
  389. package/dist/api/sketch-on-plane.js.map +1 -1
  390. package/dist/api/solid-from-faces.d.ts +45 -0
  391. package/dist/api/solid-from-faces.d.ts.map +1 -0
  392. package/dist/api/solid-from-faces.js +72 -0
  393. package/dist/api/solid-from-faces.js.map +1 -0
  394. package/dist/api/solid-offset/index.d.ts +67 -0
  395. package/dist/api/solid-offset/index.d.ts.map +1 -0
  396. package/dist/api/solid-offset/index.js +132 -0
  397. package/dist/api/solid-offset/index.js.map +1 -0
  398. package/dist/api/split-by-plane.d.ts.map +1 -1
  399. package/dist/api/split-by-plane.js +0 -1
  400. package/dist/api/split-by-plane.js.map +1 -1
  401. package/dist/api/split.d.ts +1 -1
  402. package/dist/api/split.js +1 -1
  403. package/dist/api/split.js.map +1 -1
  404. package/dist/api/surface/arg-spec.d.ts +37 -44
  405. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  406. package/dist/api/surface/arg-spec.js +224 -233
  407. package/dist/api/surface/arg-spec.js.map +1 -1
  408. package/dist/api/surface-face/index.d.ts +104 -0
  409. package/dist/api/surface-face/index.d.ts.map +1 -0
  410. package/dist/api/surface-face/index.js +217 -0
  411. package/dist/api/surface-face/index.js.map +1 -0
  412. package/dist/api/surface.d.ts +44 -0
  413. package/dist/api/surface.d.ts.map +1 -0
  414. package/dist/api/surface.js +66 -0
  415. package/dist/api/surface.js.map +1 -0
  416. package/dist/api/sweep.d.ts +71 -9
  417. package/dist/api/sweep.d.ts.map +1 -1
  418. package/dist/api/sweep.js +13 -6
  419. package/dist/api/sweep.js.map +1 -1
  420. package/dist/api/thicken.d.ts +1 -1
  421. package/dist/api/thicken.d.ts.map +1 -1
  422. package/dist/api/thicken.js +12 -3
  423. package/dist/api/thicken.js.map +1 -1
  424. package/dist/api/transform.d.ts +8 -8
  425. package/dist/api/transform.d.ts.map +1 -1
  426. package/dist/api/transform.js +58 -27
  427. package/dist/api/transform.js.map +1 -1
  428. package/dist/api/view/cameraFns.d.ts +1 -1
  429. package/dist/api/view/cameraFns.d.ts.map +1 -1
  430. package/dist/api/view/cameraFns.js +1 -1
  431. package/dist/api/view/cameraFns.js.map +1 -1
  432. package/dist/api/view/index.d.ts +0 -2
  433. package/dist/api/view/index.d.ts.map +1 -1
  434. package/dist/api/view/index.js +0 -2
  435. package/dist/api/view/index.js.map +1 -1
  436. package/dist/api/view/projectionPlanes.d.ts +1 -1
  437. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  438. package/dist/api/view/projectionPlanes.js.map +1 -1
  439. package/dist/api/view/view-camera.d.ts +7 -9
  440. package/dist/api/view/view-camera.d.ts.map +1 -1
  441. package/dist/api/view/view-camera.js +4 -6
  442. package/dist/api/view/view-camera.js.map +1 -1
  443. package/dist/api/view/view-projection.d.ts +0 -2
  444. package/dist/api/view/view-projection.d.ts.map +1 -1
  445. package/dist/api/view/view-projection.js +0 -2
  446. package/dist/api/view/view-projection.js.map +1 -1
  447. package/dist/api/view/view-sheet.d.ts +0 -2
  448. package/dist/api/view/view-sheet.d.ts.map +1 -1
  449. package/dist/api/view/view-sheet.js +0 -2
  450. package/dist/api/view/view-sheet.js.map +1 -1
  451. package/dist/api/view-export/index.d.ts +97 -0
  452. package/dist/api/view-export/index.d.ts.map +1 -0
  453. package/dist/api/view-export/index.js +118 -0
  454. package/dist/api/view-export/index.js.map +1 -0
  455. package/dist/boolean/index.d.ts +23 -0
  456. package/dist/boolean/index.d.ts.map +1 -0
  457. package/dist/boolean/index.js +27 -0
  458. package/dist/boolean/index.js.map +1 -0
  459. package/dist/brep/brep-chain.d.ts +1 -19
  460. package/dist/brep/brep-chain.d.ts.map +1 -1
  461. package/dist/brep/brep-chain.js +0 -1
  462. package/dist/brep/brep-chain.js.map +1 -1
  463. package/dist/brep/brep-ops.d.ts +93 -2
  464. package/dist/brep/brep-ops.d.ts.map +1 -1
  465. package/dist/brep/brep-ops.js +185 -15
  466. package/dist/brep/brep-ops.js.map +1 -1
  467. package/dist/brep/brep-topology.d.ts +20 -0
  468. package/dist/brep/brep-topology.d.ts.map +1 -1
  469. package/dist/brep/brep-topology.js +46 -0
  470. package/dist/brep/brep-topology.js.map +1 -1
  471. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  472. package/dist/brep/engine/adapters/brep-mock.js +0 -3
  473. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  474. package/dist/brep/engine/adapters/brepkit.d.ts +4 -3
  475. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  476. package/dist/brep/engine/adapters/brepkit.js +4 -98
  477. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  478. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  479. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  480. package/dist/brep/engine/adapters/occt.js +4 -148
  481. package/dist/brep/engine/adapters/occt.js.map +1 -1
  482. package/dist/brep/engine/native-history.d.ts +27 -0
  483. package/dist/brep/engine/native-history.d.ts.map +1 -0
  484. package/dist/brep/engine/native-history.js +54 -0
  485. package/dist/brep/engine/native-history.js.map +1 -0
  486. package/dist/brep/engine/primitives.d.ts +2 -3
  487. package/dist/brep/engine/primitives.d.ts.map +1 -1
  488. package/dist/brep/engine/primitives.js +1 -2
  489. package/dist/brep/engine/primitives.js.map +1 -1
  490. package/dist/brep/engine/registry.d.ts +3 -5
  491. package/dist/brep/engine/registry.d.ts.map +1 -1
  492. package/dist/brep/engine/registry.js +2 -2
  493. package/dist/brep/engine/registry.js.map +1 -1
  494. package/dist/brep/engine/types.d.ts +35 -77
  495. package/dist/brep/engine/types.d.ts.map +1 -1
  496. package/dist/brep/engine/types.js.map +1 -1
  497. package/dist/brep/export/export-model.d.ts +21 -0
  498. package/dist/brep/export/export-model.d.ts.map +1 -1
  499. package/dist/brep/export/export-model.js +171 -73
  500. package/dist/brep/export/export-model.js.map +1 -1
  501. package/dist/brep/export/step.d.ts +17 -1
  502. package/dist/brep/export/step.d.ts.map +1 -1
  503. package/dist/brep/export/step.js +133 -0
  504. package/dist/brep/export/step.js.map +1 -1
  505. package/dist/brep/export/stl.d.ts +22 -1
  506. package/dist/brep/export/stl.d.ts.map +1 -1
  507. package/dist/brep/export/stl.js +58 -10
  508. package/dist/brep/export/stl.js.map +1 -1
  509. package/dist/brep/export/transform12.d.ts +47 -0
  510. package/dist/brep/export/transform12.d.ts.map +1 -0
  511. package/dist/brep/export/transform12.js +87 -0
  512. package/dist/brep/export/transform12.js.map +1 -0
  513. package/dist/brep/face-evolution.d.ts +53 -0
  514. package/dist/brep/face-evolution.d.ts.map +1 -1
  515. package/dist/brep/face-evolution.js +65 -0
  516. package/dist/brep/face-evolution.js.map +1 -1
  517. package/dist/brep/handle-bridge.d.ts +2 -2
  518. package/dist/brep/handle-bridge.js +2 -2
  519. package/dist/brep/handle-bridge.js.map +1 -1
  520. package/dist/brep/index.d.ts +6 -3
  521. package/dist/brep/index.d.ts.map +1 -1
  522. package/dist/brep/index.js +6 -3
  523. package/dist/brep/index.js.map +1 -1
  524. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  525. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  526. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  527. package/dist/browser-host/index.d.ts +4 -1
  528. package/dist/browser-host/index.d.ts.map +1 -1
  529. package/dist/browser-host/index.js +7 -1
  530. package/dist/browser-host/index.js.map +1 -1
  531. package/dist/browser.d.ts +5 -9
  532. package/dist/browser.d.ts.map +1 -1
  533. package/dist/browser.js +5 -26
  534. package/dist/browser.js.map +1 -1
  535. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  536. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  537. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  538. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  539. package/dist/cad-runtime/backend-dispatch.d.ts +13 -58
  540. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  541. package/dist/cad-runtime/backend-dispatch.js +34 -83
  542. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  543. package/dist/cad-runtime/content-key.d.ts +3 -3
  544. package/dist/cad-runtime/content-key.js +3 -3
  545. package/dist/cad-runtime/content-key.js.map +1 -1
  546. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  547. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  548. package/dist/cad-runtime/direct-executor.js +31 -9
  549. package/dist/cad-runtime/direct-executor.js.map +1 -1
  550. package/dist/cad-runtime/interp/env.d.ts +1 -1
  551. package/dist/cad-runtime/interp/env.js.map +1 -1
  552. package/dist/cad-runtime/lib-id.d.ts +0 -2
  553. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  554. package/dist/cad-runtime/lib-id.js +0 -2
  555. package/dist/cad-runtime/lib-id.js.map +1 -1
  556. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  557. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  558. package/dist/cad-runtime/live-shapes.js +8 -10
  559. package/dist/cad-runtime/live-shapes.js.map +1 -1
  560. package/dist/cad-runtime/ports.d.ts +31 -3
  561. package/dist/cad-runtime/ports.d.ts.map +1 -1
  562. package/dist/cad-runtime/ports.js.map +1 -1
  563. package/dist/cad-runtime/runtime.d.ts +54 -19
  564. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  565. package/dist/cad-runtime/runtime.js +89 -54
  566. package/dist/cad-runtime/runtime.js.map +1 -1
  567. package/dist/define-op.d.ts +10 -14
  568. package/dist/define-op.d.ts.map +1 -1
  569. package/dist/define-op.js +5 -22
  570. package/dist/define-op.js.map +1 -1
  571. package/dist/env-agnostic.d.ts +2 -2
  572. package/dist/env-agnostic.d.ts.map +1 -1
  573. package/dist/env-agnostic.js +1 -1
  574. package/dist/env-agnostic.js.map +1 -1
  575. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  576. package/dist/geometry2d/bridge/plane.js +1 -1
  577. package/dist/geometry2d/bridge/plane.js.map +1 -1
  578. package/dist/geometry2d/curve2d.d.ts +1 -1
  579. package/dist/geometry2d/curve2d.js +1 -1
  580. package/dist/geometry2d/curve2d.js.map +1 -1
  581. package/dist/index.d.ts +14 -65
  582. package/dist/index.d.ts.map +1 -1
  583. package/dist/index.js +18 -70
  584. package/dist/index.js.map +1 -1
  585. package/dist/io/fai-zip/container-read.d.ts +16 -0
  586. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  587. package/dist/io/fai-zip/container-read.js +22 -0
  588. package/dist/io/fai-zip/container-read.js.map +1 -1
  589. package/dist/io/fai-zip/index.d.ts +1 -1
  590. package/dist/io/fai-zip/index.d.ts.map +1 -1
  591. package/dist/io/fai-zip/index.js +1 -1
  592. package/dist/io/fai-zip/index.js.map +1 -1
  593. package/dist/lang/code-to-args.d.ts.map +1 -1
  594. package/dist/lang/code-to-args.js +10 -1
  595. package/dist/lang/code-to-args.js.map +1 -1
  596. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  597. package/dist/lang/determinism-scanner.js +22 -9
  598. package/dist/lang/determinism-scanner.js.map +1 -1
  599. package/dist/lang/metadata-extractor.d.ts +27 -6
  600. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  601. package/dist/lang/metadata-extractor.js +88 -8
  602. package/dist/lang/metadata-extractor.js.map +1 -1
  603. package/dist/lang/parse-error.d.ts +4 -0
  604. package/dist/lang/parse-error.d.ts.map +1 -1
  605. package/dist/lang/parse-error.js.map +1 -1
  606. package/dist/lang/security-scanner.d.ts +27 -2
  607. package/dist/lang/security-scanner.d.ts.map +1 -1
  608. package/dist/lang/security-scanner.js +29 -2
  609. package/dist/lang/security-scanner.js.map +1 -1
  610. package/dist/lang/source-edit.d.ts +2 -2
  611. package/dist/lang/source-edit.js.map +1 -1
  612. package/dist/lang/symbol-table.generated.d.ts +53 -0
  613. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  614. package/dist/lang/symbol-table.generated.js +53 -0
  615. package/dist/lang/symbol-table.generated.js.map +1 -1
  616. package/dist/mesh/import-model.d.ts +94 -0
  617. package/dist/mesh/import-model.d.ts.map +1 -0
  618. package/dist/mesh/import-model.js +15 -0
  619. package/dist/mesh/import-model.js.map +1 -0
  620. package/dist/mesh/index.d.ts +19 -63
  621. package/dist/mesh/index.d.ts.map +1 -1
  622. package/dist/mesh/index.js +19 -72
  623. package/dist/mesh/index.js.map +1 -1
  624. package/dist/mesh/io.d.ts +62 -17
  625. package/dist/mesh/io.d.ts.map +1 -1
  626. package/dist/mesh/io.js +210 -41
  627. package/dist/mesh/io.js.map +1 -1
  628. package/dist/mesh/primitives.js +1 -1
  629. package/dist/mesh/primitives.js.map +1 -1
  630. package/dist/mesh/threemf-bambu.d.ts +12 -1
  631. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  632. package/dist/mesh/threemf-bambu.js +68 -16
  633. package/dist/mesh/threemf-bambu.js.map +1 -1
  634. package/dist/mesh/threemf-loader.d.ts +52 -5
  635. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  636. package/dist/mesh/threemf-loader.js +139 -41
  637. package/dist/mesh/threemf-loader.js.map +1 -1
  638. package/dist/mesh/transform.d.ts +1 -1
  639. package/dist/mesh/transform.js +1 -1
  640. package/dist/mesh/transform.js.map +1 -1
  641. package/dist/mesh/types.d.ts +35 -5
  642. package/dist/mesh/types.d.ts.map +1 -1
  643. package/dist/mesh/types.js.map +1 -1
  644. package/dist/node-host/cli.d.ts +49 -1
  645. package/dist/node-host/cli.d.ts.map +1 -1
  646. package/dist/node-host/cli.js +125 -19
  647. package/dist/node-host/cli.js.map +1 -1
  648. package/dist/node-host/execute-script.d.ts +56 -0
  649. package/dist/node-host/execute-script.d.ts.map +1 -0
  650. package/dist/node-host/execute-script.js +47 -0
  651. package/dist/node-host/execute-script.js.map +1 -0
  652. package/dist/node-host/index.d.ts +1 -0
  653. package/dist/node-host/index.d.ts.map +1 -1
  654. package/dist/node-host/index.js +4 -0
  655. package/dist/node-host/index.js.map +1 -1
  656. package/dist/node.d.ts +2 -0
  657. package/dist/node.d.ts.map +1 -1
  658. package/dist/node.js +3 -0
  659. package/dist/node.js.map +1 -1
  660. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  661. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  662. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  663. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  664. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  665. package/dist/occt-kernel/hullGeometry.js +2 -3
  666. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  667. package/dist/occt-kernel/hullOps.d.ts +3 -3
  668. package/dist/occt-kernel/hullOps.js +4 -4
  669. package/dist/occt-kernel/hullOps.js.map +1 -1
  670. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  671. package/dist/occt-kernel/occt-primitives.js +31 -4
  672. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  673. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  674. package/dist/occt-kernel/occtKernel.js +18 -0
  675. package/dist/occt-kernel/occtKernel.js.map +1 -1
  676. package/dist/occt-scan/recognize.d.ts +58 -0
  677. package/dist/occt-scan/recognize.d.ts.map +1 -0
  678. package/dist/occt-scan/recognize.js +216 -0
  679. package/dist/occt-scan/recognize.js.map +1 -0
  680. package/dist/primitives/brep-primitives.js +7 -7
  681. package/dist/primitives/brep-primitives.js.map +1 -1
  682. package/dist/primitives/index.d.ts +19 -0
  683. package/dist/primitives/index.d.ts.map +1 -0
  684. package/dist/primitives/index.js +21 -0
  685. package/dist/primitives/index.js.map +1 -0
  686. package/dist/result/bug.d.ts +1 -1
  687. package/dist/result/bug.js +1 -1
  688. package/dist/result/bug.js.map +1 -1
  689. package/dist/result/errors.d.ts +2 -2
  690. package/dist/result/errors.d.ts.map +1 -1
  691. package/dist/result/errors.js +1 -1
  692. package/dist/result/errors.js.map +1 -1
  693. package/dist/result/vec3.d.ts +1 -1
  694. package/dist/result/vec3.js +1 -1
  695. package/dist/result/vec3.js.map +1 -1
  696. package/dist/runtime-state.d.ts +79 -29
  697. package/dist/runtime-state.d.ts.map +1 -1
  698. package/dist/runtime-state.js +84 -0
  699. package/dist/runtime-state.js.map +1 -1
  700. package/dist/script-globals.d.ts +24 -0
  701. package/dist/script-globals.d.ts.map +1 -0
  702. package/dist/script-globals.js +24 -0
  703. package/dist/script-globals.js.map +1 -0
  704. package/dist/sdf/index.d.ts +12 -0
  705. package/dist/sdf/index.d.ts.map +1 -0
  706. package/dist/sdf/index.js +13 -0
  707. package/dist/sdf/index.js.map +1 -0
  708. package/dist/sdk.d.ts +0 -1
  709. package/dist/sdk.d.ts.map +1 -1
  710. package/dist/sdk.js.map +1 -1
  711. package/dist/shape.d.ts +24 -0
  712. package/dist/shape.d.ts.map +1 -1
  713. package/dist/shape.js +40 -0
  714. package/dist/shape.js.map +1 -1
  715. package/dist/topology/naming/lineage.d.ts +3 -2
  716. package/dist/topology/naming/lineage.d.ts.map +1 -1
  717. package/dist/topology/naming/lineage.js.map +1 -1
  718. package/dist/weapp.d.ts +3 -3
  719. package/dist/weapp.d.ts.map +1 -1
  720. package/dist/weapp.js +2 -2
  721. package/dist/weapp.js.map +1 -1
  722. package/package.json +283 -44
@@ -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"]}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * export-members — 导出命令的「入参 Shape → 成员表」(方案 §2.6 定式 3 的共用件)
3
+ *
4
+ * `cad.exportStep`(`api/export-step.ts`)与 `cad.export3mf`(`api/export-3mf.ts`)
5
+ * 是同一个库面序列化器(`brep/export/export-model.ts#exportModelSync`)的两个脚本面
6
+ * 薄壳。两者的差别只有「一个成员交给写出器的载荷是 `solid` 还是 `mesh`」;把入参拆
7
+ * 成成员表这一步完全一致,故收在本文件——两份拷贝各自漂移会让脚本面与库面同源
8
+ * (矩阵 B12 / B14)失去保障。
9
+ *
10
+ * 拆解口径对齐现成先例 `node-host/cli.ts#writeAssemblyStep`:
11
+ * - 成员 = `CompoundShape.children`(同序;嵌套 compound 不递归展开,与先例一致);
12
+ * - 成员名 = `behavior.memberNames[i]`(装配 op 写入的短名,`memberColors` 亦以它为
13
+ * 键),无装配 behavior 时回落 `nameOf(child)`;
14
+ * - 成员色 = `behavior.memberColors[成员名]`(sRGB 0–1,STEP 写 XCAF COLOUR_RGB、
15
+ * 3MF 写 basematerials);
16
+ * - 非 compound 入参 = 单成员、不带名与色,与 `cli.ts#writeOutput`(`:744-758`)同
17
+ * 口径——单件导出不写名。
18
+ *
19
+ * 判定用**结构**判定 `isCompoundLike` 而非 SDK 的 `isShape`/`isCompound`:本 op 吃
20
+ * 的是脚本文本传进来的值,可能是跨库产物,不能对它提「必须由本库构造器创建」的要求
21
+ * (同 `keep-syntax §5.3 D5` 的既有取舍)。
22
+ *
23
+ * 成员几何一律由调用方**现场**读(`brepOf(child)`),不取创建期快照:装配变换在语句
24
+ * 之后才烘进 `slot.solid`,快照对已变换成员是陈旧的(`cli.ts#writeAssemblyStep` 的
25
+ * 同款注释)。
26
+ */
27
+ import type { Shape, Vec3 } from '../../mesh/types.js';
28
+ import type { CompoundShape } from '../../shape.js';
29
+ /** 导出成员:一个待导出的几何 + 其身份(名 / 色)。 */
30
+ export interface ExportMember {
31
+ /** 成员几何:compound 的成员,或单件入参本身。 */
32
+ shape: Shape;
33
+ /** 成员名(写 STEP PRODUCT 名 / 3MF `<object name>`);无名时缺省。 */
34
+ name?: string;
35
+ /** sRGB 0–1 成员色(来自装配 behavior 的 `memberColors`)。 */
36
+ color?: readonly [number, number, number];
37
+ }
38
+ /**
39
+ * 把导出命令的入参拆成成员表。
40
+ *
41
+ * @param input - 单件 Shape 或装配 compound(结构判定)。
42
+ * @returns 成员表;空 compound 返回空数组——调用方必须显式报错,不得落空文件。
43
+ */
44
+ export declare function exportMembersOf(input: Shape | CompoundShape): ExportMember[];
45
+ /** 装配节点位姿(与 `Shape.transform` 同形态,见 mesh/types.ts)。 */
46
+ export interface ExportTransform {
47
+ translate?: Vec3;
48
+ rotate?: {
49
+ angle: number;
50
+ axis?: Vec3;
51
+ };
52
+ matrix?: number[];
53
+ }
54
+ /** 导出成员树节点:结构(名 / 色 / 位姿 / 子节点)与几何(shape)分离。 */
55
+ export interface ExportMemberNode {
56
+ /** 成员几何:compound 的成员,或单件入参本身。 */
57
+ shape: Shape;
58
+ /** 成员名(写 3MF `<object name>` / STEP PRODUCT 名);无名时缺省。 */
59
+ name?: string;
60
+ /** sRGB 0–1 成员色(来自装配 behavior 的 `memberColors`)。 */
61
+ color?: readonly [number, number, number];
62
+ /** 本节点相对父的位姿(来自 `shape.transform`)。 */
63
+ transform?: ExportTransform;
64
+ /** 子节点(嵌套装配);非 compound 叶节点缺省。 */
65
+ children?: ExportMemberNode[];
66
+ }
67
+ /**
68
+ * 导出命令入参 → 成员树(方案 §2.1「装配模型 = 节点属性,单一真源」的脚本面投影)。
69
+ * 与 `exportMembersOf`(平铺)不同,本函数**保留嵌套**:compound 的成员若自身是
70
+ * compound 则递归展开为子树(同序),叶节点携带其 `shape.transform` 作为相对父位姿。
71
+ *
72
+ * 名称 / 颜色取自各层 compound 的 behavior(`memberNames` / `memberColors`,装配 op
73
+ * 写入;core 只读不写,不 import extra)。本层只管结构,几何载荷由调用方(各 op)
74
+ * 现场读取——避免创建期快照陈旧(同 `exportMembersOf` 注释)。
75
+ *
76
+ * @param input - 脚本面导出命令的入参形状(叶或 compound 装配)。
77
+ * @returns 保留嵌套结构的成员树;叶节点携带 `shape.transform` 作为相对父位姿。
78
+ */
79
+ export declare function exportTreeOf(input: Shape | CompoundShape): ExportMemberNode[];
80
+ //# sourceMappingURL=export-members.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-members.d.ts","sourceRoot":"","sources":["../../../src/api/internal/export-members.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAIhD,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,KAAK,EAAE,KAAK,CAAA;IACZ,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oDAAoD;IACpD,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAC1C;AAWD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,GAAG,YAAY,EAAE,CAiB5E;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,CAAA;IACvC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,KAAK,EAAE,KAAK,CAAA;IACZ,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oDAAoD;IACpD,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,uCAAuC;IACvC,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,kCAAkC;IAClC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,GAAG,gBAAgB,EAAE,CAgC7E"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * export-members — 导出命令的「入参 Shape → 成员表」(方案 §2.6 定式 3 的共用件)
3
+ *
4
+ * `cad.exportStep`(`api/export-step.ts`)与 `cad.export3mf`(`api/export-3mf.ts`)
5
+ * 是同一个库面序列化器(`brep/export/export-model.ts#exportModelSync`)的两个脚本面
6
+ * 薄壳。两者的差别只有「一个成员交给写出器的载荷是 `solid` 还是 `mesh`」;把入参拆
7
+ * 成成员表这一步完全一致,故收在本文件——两份拷贝各自漂移会让脚本面与库面同源
8
+ * (矩阵 B12 / B14)失去保障。
9
+ *
10
+ * 拆解口径对齐现成先例 `node-host/cli.ts#writeAssemblyStep`:
11
+ * - 成员 = `CompoundShape.children`(同序;嵌套 compound 不递归展开,与先例一致);
12
+ * - 成员名 = `behavior.memberNames[i]`(装配 op 写入的短名,`memberColors` 亦以它为
13
+ * 键),无装配 behavior 时回落 `nameOf(child)`;
14
+ * - 成员色 = `behavior.memberColors[成员名]`(sRGB 0–1,STEP 写 XCAF COLOUR_RGB、
15
+ * 3MF 写 basematerials);
16
+ * - 非 compound 入参 = 单成员、不带名与色,与 `cli.ts#writeOutput`(`:744-758`)同
17
+ * 口径——单件导出不写名。
18
+ *
19
+ * 判定用**结构**判定 `isCompoundLike` 而非 SDK 的 `isShape`/`isCompound`:本 op 吃
20
+ * 的是脚本文本传进来的值,可能是跨库产物,不能对它提「必须由本库构造器创建」的要求
21
+ * (同 `keep-syntax §5.3 D5` 的既有取舍)。
22
+ *
23
+ * 成员几何一律由调用方**现场**读(`brepOf(child)`),不取创建期快照:装配变换在语句
24
+ * 之后才烘进 `slot.solid`,快照对已变换成员是陈旧的(`cli.ts#writeAssemblyStep` 的
25
+ * 同款注释)。
26
+ */
27
+ import { getSlot, isCompoundLike } from '../../shape.js';
28
+ import { nameOf } from '../../runtime-state.js';
29
+ /**
30
+ * 把导出命令的入参拆成成员表。
31
+ *
32
+ * @param input - 单件 Shape 或装配 compound(结构判定)。
33
+ * @returns 成员表;空 compound 返回空数组——调用方必须显式报错,不得落空文件。
34
+ */
35
+ export function exportMembersOf(input) {
36
+ if (!isCompoundLike(input))
37
+ return [{ shape: input }];
38
+ const behavior = getSlot(input)?.behavior;
39
+ const names = behavior?.memberNames;
40
+ const members = [];
41
+ for (let i = 0; i < input.children.length; i++) {
42
+ const child = input.children[i];
43
+ const raw = names?.[i] ?? nameOf(child);
44
+ const name = raw === undefined || raw === '' ? undefined : String(raw);
45
+ const color = name === undefined ? undefined : behavior?.memberColors?.[name];
46
+ members.push({
47
+ shape: child,
48
+ ...(name === undefined ? {} : { name }),
49
+ ...(color === undefined ? {} : { color }),
50
+ });
51
+ }
52
+ return members;
53
+ }
54
+ /**
55
+ * 导出命令入参 → 成员树(方案 §2.1「装配模型 = 节点属性,单一真源」的脚本面投影)。
56
+ * 与 `exportMembersOf`(平铺)不同,本函数**保留嵌套**:compound 的成员若自身是
57
+ * compound 则递归展开为子树(同序),叶节点携带其 `shape.transform` 作为相对父位姿。
58
+ *
59
+ * 名称 / 颜色取自各层 compound 的 behavior(`memberNames` / `memberColors`,装配 op
60
+ * 写入;core 只读不写,不 import extra)。本层只管结构,几何载荷由调用方(各 op)
61
+ * 现场读取——避免创建期快照陈旧(同 `exportMembersOf` 注释)。
62
+ *
63
+ * @param input - 脚本面导出命令的入参形状(叶或 compound 装配)。
64
+ * @returns 保留嵌套结构的成员树;叶节点携带 `shape.transform` 作为相对父位姿。
65
+ */
66
+ export function exportTreeOf(input) {
67
+ const leaf = (s, name, color) => {
68
+ const node = { shape: s };
69
+ const t = s.transform;
70
+ if (t)
71
+ node.transform = t;
72
+ if (name !== undefined)
73
+ node.name = name;
74
+ if (color !== undefined)
75
+ node.color = color;
76
+ return node;
77
+ };
78
+ const build = (s) => {
79
+ if (!isCompoundLike(s))
80
+ return leaf(s);
81
+ const behavior = getSlot(s)?.behavior;
82
+ const names = behavior?.memberNames;
83
+ const children = [];
84
+ for (let i = 0; i < s.children.length; i++) {
85
+ const child = s.children[i];
86
+ if (isCompoundLike(child)) {
87
+ children.push(build(child));
88
+ }
89
+ else {
90
+ const raw = names?.[i] ?? nameOf(child);
91
+ const name = raw === undefined || raw === '' ? undefined : String(raw);
92
+ const color = name === undefined ? undefined : behavior?.memberColors?.[name];
93
+ children.push(leaf(child, name, color));
94
+ }
95
+ }
96
+ // compound 也是 Shape 的鸭子形态(有 children 槽),但类型面与叶 Shape 不重叠——
97
+ // 结构判定后这里的 cast 只对类型系统成立,运行时直接透传。
98
+ const node = leaf(s);
99
+ node.children = children;
100
+ return node;
101
+ };
102
+ return isCompoundLike(input) ? [build(input)] : [leaf(input)];
103
+ }
104
+ //# sourceMappingURL=export-members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-members.js","sourceRoot":"","sources":["../../../src/api/internal/export-members.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * export-members — 导出命令的「入参 Shape → 成员表」(方案 §2.6 定式 3 的共用件)\n *\n * `cad.exportStep`(`api/export-step.ts`)与 `cad.export3mf`(`api/export-3mf.ts`)\n * 是同一个库面序列化器(`brep/export/export-model.ts#exportModelSync`)的两个脚本面\n * 薄壳。两者的差别只有「一个成员交给写出器的载荷是 `solid` 还是 `mesh`」;把入参拆\n * 成成员表这一步完全一致,故收在本文件——两份拷贝各自漂移会让脚本面与库面同源\n * (矩阵 B12 / B14)失去保障。\n *\n * 拆解口径对齐现成先例 `node-host/cli.ts#writeAssemblyStep`:\n * - 成员 = `CompoundShape.children`(同序;嵌套 compound 不递归展开,与先例一致);\n * - 成员名 = `behavior.memberNames[i]`(装配 op 写入的短名,`memberColors` 亦以它为\n * 键),无装配 behavior 时回落 `nameOf(child)`;\n * - 成员色 = `behavior.memberColors[成员名]`(sRGB 0–1,STEP 写 XCAF COLOUR_RGB、\n * 3MF 写 basematerials);\n * - 非 compound 入参 = 单成员、不带名与色,与 `cli.ts#writeOutput`(`:744-758`)同\n * 口径——单件导出不写名。\n *\n * 判定用**结构**判定 `isCompoundLike` 而非 SDK 的 `isShape`/`isCompound`:本 op 吃\n * 的是脚本文本传进来的值,可能是跨库产物,不能对它提「必须由本库构造器创建」的要求\n * (同 `keep-syntax §5.3 D5` 的既有取舍)。\n *\n * 成员几何一律由调用方**现场**读(`brepOf(child)`),不取创建期快照:装配变换在语句\n * 之后才烘进 `slot.solid`,快照对已变换成员是陈旧的(`cli.ts#writeAssemblyStep` 的\n * 同款注释)。\n */\n\nimport type { Shape, Vec3 } from '../../mesh/types'\nimport type { CompoundShape } from '../../shape'\nimport { getSlot, isCompoundLike } from '../../shape'\nimport { nameOf } from '../../runtime-state'\n\n/** 导出成员:一个待导出的几何 + 其身份(名 / 色)。 */\nexport interface ExportMember {\n /** 成员几何:compound 的成员,或单件入参本身。 */\n shape: Shape\n /** 成员名(写 STEP PRODUCT 名 / 3MF `<object name>`);无名时缺省。 */\n name?: string\n /** sRGB 0–1 成员色(来自装配 behavior 的 `memberColors`)。 */\n color?: readonly [number, number, number]\n}\n\n/**\n * 装配 behavior 里与导出相关的两个字段(`@faicad/faijs-extra` 的 `assembly` op 写入;\n * 本文件只读不写,也不 import 扩展库——core 不得依赖 extra)。\n */\ninterface ExportBehavior {\n memberNames?: string[]\n memberColors?: Record<string, [number, number, number]>\n}\n\n/**\n * 把导出命令的入参拆成成员表。\n *\n * @param input - 单件 Shape 或装配 compound(结构判定)。\n * @returns 成员表;空 compound 返回空数组——调用方必须显式报错,不得落空文件。\n */\nexport function exportMembersOf(input: Shape | CompoundShape): ExportMember[] {\n if (!isCompoundLike(input)) return [{ shape: input }]\n const behavior = getSlot(input)?.behavior as ExportBehavior | undefined\n const names = behavior?.memberNames\n const members: ExportMember[] = []\n for (let i = 0; i < input.children.length; i++) {\n const child = input.children[i]!\n const raw = names?.[i] ?? nameOf(child)\n const name = raw === undefined || raw === '' ? undefined : String(raw)\n const color = name === undefined ? undefined : behavior?.memberColors?.[name]\n members.push({\n shape: child,\n ...(name === undefined ? {} : { name }),\n ...(color === undefined ? {} : { color }),\n })\n }\n return members\n}\n\n/** 装配节点位姿(与 `Shape.transform` 同形态,见 mesh/types.ts)。 */\nexport interface ExportTransform {\n translate?: Vec3\n rotate?: { angle: number; axis?: Vec3 }\n matrix?: number[]\n}\n\n/** 导出成员树节点:结构(名 / 色 / 位姿 / 子节点)与几何(shape)分离。 */\nexport interface ExportMemberNode {\n /** 成员几何:compound 的成员,或单件入参本身。 */\n shape: Shape\n /** 成员名(写 3MF `<object name>` / STEP PRODUCT 名);无名时缺省。 */\n name?: string\n /** sRGB 0–1 成员色(来自装配 behavior 的 `memberColors`)。 */\n color?: readonly [number, number, number]\n /** 本节点相对父的位姿(来自 `shape.transform`)。 */\n transform?: ExportTransform\n /** 子节点(嵌套装配);非 compound 叶节点缺省。 */\n children?: ExportMemberNode[]\n}\n\n/**\n * 导出命令入参 → 成员树(方案 §2.1「装配模型 = 节点属性,单一真源」的脚本面投影)。\n * 与 `exportMembersOf`(平铺)不同,本函数**保留嵌套**:compound 的成员若自身是\n * compound 则递归展开为子树(同序),叶节点携带其 `shape.transform` 作为相对父位姿。\n *\n * 名称 / 颜色取自各层 compound 的 behavior(`memberNames` / `memberColors`,装配 op\n * 写入;core 只读不写,不 import extra)。本层只管结构,几何载荷由调用方(各 op)\n * 现场读取——避免创建期快照陈旧(同 `exportMembersOf` 注释)。\n *\n * @param input - 脚本面导出命令的入参形状(叶或 compound 装配)。\n * @returns 保留嵌套结构的成员树;叶节点携带 `shape.transform` 作为相对父位姿。\n */\nexport function exportTreeOf(input: Shape | CompoundShape): ExportMemberNode[] {\n const leaf = (s: Shape, name?: string, color?: readonly [number, number, number]): ExportMemberNode => {\n const node: ExportMemberNode = { shape: s }\n const t = s.transform as ExportTransform | undefined\n if (t) node.transform = t\n if (name !== undefined) node.name = name\n if (color !== undefined) node.color = color\n return node\n }\n const build = (s: Shape | CompoundShape): ExportMemberNode => {\n if (!isCompoundLike(s)) return leaf(s as Shape)\n const behavior = getSlot(s)?.behavior as ExportBehavior | undefined\n const names = behavior?.memberNames\n const children: ExportMemberNode[] = []\n for (let i = 0; i < s.children.length; i++) {\n const child = s.children[i]!\n if (isCompoundLike(child)) {\n children.push(build(child))\n } else {\n const raw = names?.[i] ?? nameOf(child)\n const name = raw === undefined || raw === '' ? undefined : String(raw)\n const color = name === undefined ? undefined : behavior?.memberColors?.[name]\n children.push(leaf(child, name, color))\n }\n }\n // compound 也是 Shape 的鸭子形态(有 children 槽),但类型面与叶 Shape 不重叠——\n // 结构判定后这里的 cast 只对类型系统成立,运行时直接透传。\n const node = leaf(s as unknown as Shape)\n node.children = children\n return node\n }\n return isCompoundLike(input) ? [build(input)] : [leaf(input as Shape)]\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>;
@@ -106,6 +74,23 @@ export declare function callBrepjs<F extends (...a: never[]) => unknown>(fn: F,
106
74
  * @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。
107
75
  */
108
76
  export declare function assertEngineFor(opName: string, engines: readonly string[]): void;
77
+ /**
78
+ * 导出命令的宿主环境断言(与 {@link assertEngineFor} 并列同构,正交轴)。
79
+ *
80
+ * 脚本可由 AI 生成任意代码、属不受信输入,而出把「往哪写、写几份、写什么」的
81
+ * 决定权交给脚本文本;因此脚本面导出命令只在 `'node'` 宿主开放,browser / weapp
82
+ * 一律在执行前拒绝(`HostPorts.hostEnv` 未声明 = 非 node,不兜底放行)。
83
+ *
84
+ * 断言只在 API 函数体第一行执行(普通函数不走 dispatchPath),所以既覆盖脚本面
85
+ * `cad.*`,也覆盖 TS 直连同一函数的旁路——不存在「脚本被拒、库面直连却放行」。
86
+ * 判据只读 `config.hostEnv`,与安全扫描档位(`securityPolicy`)解耦:放宽档位
87
+ * (含 `off`)不解除本门禁。
88
+ *
89
+ * @param opName - op 名(报错文案)。
90
+ * @param hosts - 允许执行的宿主值集合。
91
+ * @throws HostUnsupportedError 当当前宿主不在 `hosts` 内(含未声明)。
92
+ */
93
+ export declare function assertHostFor(opName: string, hosts: readonly string[]): void;
109
94
  /**
110
95
  * Adopt a library handle as a faijs Shape (compatOp step 5's only adoption
111
96
  * entry point).
@@ -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;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAO5E;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';
27
- import { getBackends } from '../../runtime-state.js';
23
+ import { fromHandle } from '../../brep/handle-bridge.js';
24
+ import { getBackends, HostUnsupportedError } 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) {
@@ -157,6 +88,28 @@ export function assertEngineFor(opName, engines) {
157
88
  throw e;
158
89
  }
159
90
  }
91
+ /**
92
+ * 导出命令的宿主环境断言(与 {@link assertEngineFor} 并列同构,正交轴)。
93
+ *
94
+ * 脚本可由 AI 生成任意代码、属不受信输入,而出把「往哪写、写几份、写什么」的
95
+ * 决定权交给脚本文本;因此脚本面导出命令只在 `'node'` 宿主开放,browser / weapp
96
+ * 一律在执行前拒绝(`HostPorts.hostEnv` 未声明 = 非 node,不兜底放行)。
97
+ *
98
+ * 断言只在 API 函数体第一行执行(普通函数不走 dispatchPath),所以既覆盖脚本面
99
+ * `cad.*`,也覆盖 TS 直连同一函数的旁路——不存在「脚本被拒、库面直连却放行」。
100
+ * 判据只读 `config.hostEnv`,与安全扫描档位(`securityPolicy`)解耦:放宽档位
101
+ * (含 `off`)不解除本门禁。
102
+ *
103
+ * @param opName - op 名(报错文案)。
104
+ * @param hosts - 允许执行的宿主值集合。
105
+ * @throws HostUnsupportedError 当当前宿主不在 `hosts` 内(含未声明)。
106
+ */
107
+ export function assertHostFor(opName, hosts) {
108
+ const current = getBackends().config.hostEnv;
109
+ if (current === null || current === undefined || !hosts.some((h) => h === current)) {
110
+ throw new HostUnsupportedError(`E_HOST_UNSUPPORTED: op '${opName}' requires host ${hosts.join(' or ')} (current=${current ?? '<none>'})`);
111
+ }
112
+ }
160
113
  // ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────
161
114
  /** Already-adopted handle dedup table: the same library handle adopted twice →
162
115
  * the same faijs Shape (prevents double ownership / double dispose, R6). */
@@ -187,7 +140,7 @@ export function adoptEntity(product, opName, segments) {
187
140
  return prev;
188
141
  const type = h.wrapped.type;
189
142
  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}') ` +
143
+ throw new OpError(opName, 'E_SUBSHAPE_BOUNDARY', `[faijs/op] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +
191
144
  'must not cross the library boundary; return entity solids or plain data');
192
145
  }
193
146
  unregisterFromCleanup(h); // ★ R1: no-op(brepjs registry 已删除)