@faicad/faijs 0.32.3 → 0.33.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 (195) hide show
  1. package/dist/api/api-namespace.js +3 -3
  2. package/dist/api/api-namespace.js.map +1 -1
  3. package/dist/api/assembly/index.d.ts +1 -0
  4. package/dist/api/assembly/index.d.ts.map +1 -1
  5. package/dist/api/assembly/index.js +1 -0
  6. package/dist/api/assembly/index.js.map +1 -1
  7. package/dist/api/assembly/lower.d.ts.map +1 -1
  8. package/dist/api/assembly/lower.js +7 -0
  9. package/dist/api/assembly/lower.js.map +1 -1
  10. package/dist/api/assembly/normalize.d.ts.map +1 -1
  11. package/dist/api/assembly/normalize.js +2 -1
  12. package/dist/api/assembly/normalize.js.map +1 -1
  13. package/dist/api/assembly/solve-tree.d.ts +46 -0
  14. package/dist/api/assembly/solve-tree.d.ts.map +1 -0
  15. package/dist/api/assembly/solve-tree.js +135 -0
  16. package/dist/api/assembly/solve-tree.js.map +1 -0
  17. package/dist/api/assembly/solve.d.ts +7 -0
  18. package/dist/api/assembly/solve.d.ts.map +1 -1
  19. package/dist/api/assembly/solve.js.map +1 -1
  20. package/dist/api/assembly/solvers/assembly-tree.d.ts +4 -0
  21. package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -1
  22. package/dist/api/assembly/solvers/assembly-tree.js +1 -0
  23. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  24. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  25. package/dist/api/assembly/solvers/global-solver.js +210 -3
  26. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  27. package/dist/api/assembly/solvers/types.d.ts +8 -0
  28. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  29. package/dist/api/assembly/solvers/types.js.map +1 -1
  30. package/dist/api/assembly/types.d.ts +32 -1
  31. package/dist/api/assembly/types.d.ts.map +1 -1
  32. package/dist/api/assembly/types.js.map +1 -1
  33. package/dist/api/assembly/validate.d.ts +2 -2
  34. package/dist/api/assembly/validate.d.ts.map +1 -1
  35. package/dist/api/assembly/validate.js +24 -2
  36. package/dist/api/assembly/validate.js.map +1 -1
  37. package/dist/api/cadquery-selectors/edge.js +1 -1
  38. package/dist/api/cadquery-selectors/edge.js.map +1 -1
  39. package/dist/api/cadquery-selectors/entity.d.ts +29 -20
  40. package/dist/api/cadquery-selectors/entity.d.ts.map +1 -1
  41. package/dist/api/cadquery-selectors/entity.js +26 -20
  42. package/dist/api/cadquery-selectors/entity.js.map +1 -1
  43. package/dist/api/cadquery-selectors/face.d.ts +4 -2
  44. package/dist/api/cadquery-selectors/face.d.ts.map +1 -1
  45. package/dist/api/cadquery-selectors/face.js +8 -7
  46. package/dist/api/cadquery-selectors/face.js.map +1 -1
  47. package/dist/api/cadquery-selectors/resolve.d.ts +7 -6
  48. package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -1
  49. package/dist/api/cadquery-selectors/resolve.js +13 -11
  50. package/dist/api/cadquery-selectors/resolve.js.map +1 -1
  51. package/dist/api/chamfer.js +1 -1
  52. package/dist/api/chamfer.js.map +1 -1
  53. package/dist/api/draft.js +1 -1
  54. package/dist/api/draft.js.map +1 -1
  55. package/dist/api/edge-ref.js +2 -2
  56. package/dist/api/edge-ref.js.map +1 -1
  57. package/dist/api/engrave.js +1 -1
  58. package/dist/api/engrave.js.map +1 -1
  59. package/dist/api/export-3mf.js +1 -1
  60. package/dist/api/export-3mf.js.map +1 -1
  61. package/dist/api/export-brep.js +1 -1
  62. package/dist/api/export-brep.js.map +1 -1
  63. package/dist/api/export-step.d.ts +12 -13
  64. package/dist/api/export-step.d.ts.map +1 -1
  65. package/dist/api/export-step.js +19 -17
  66. package/dist/api/export-step.js.map +1 -1
  67. package/dist/api/extrude.js +3 -3
  68. package/dist/api/extrude.js.map +1 -1
  69. package/dist/api/face-ref.js +2 -2
  70. package/dist/api/face-ref.js.map +1 -1
  71. package/dist/api/feature-repair.js +2 -2
  72. package/dist/api/feature-repair.js.map +1 -1
  73. package/dist/api/fillet-variable.js +1 -1
  74. package/dist/api/fillet-variable.js.map +1 -1
  75. package/dist/api/fillet.js +1 -1
  76. package/dist/api/fillet.js.map +1 -1
  77. package/dist/api/geom.js +1 -1
  78. package/dist/api/geom.js.map +1 -1
  79. package/dist/api/import-step.d.ts.map +1 -1
  80. package/dist/api/import-step.js +4 -2
  81. package/dist/api/import-step.js.map +1 -1
  82. package/dist/api/pattern.js +1 -1
  83. package/dist/api/pattern.js.map +1 -1
  84. package/dist/api/place.js +1 -1
  85. package/dist/api/place.js.map +1 -1
  86. package/dist/api/punch-hole.js +1 -1
  87. package/dist/api/punch-hole.js.map +1 -1
  88. package/dist/api/replicate.js +1 -1
  89. package/dist/api/replicate.js.map +1 -1
  90. package/dist/api/revolve.js +1 -1
  91. package/dist/api/revolve.js.map +1 -1
  92. package/dist/api/section-by-plane.js +1 -1
  93. package/dist/api/section-by-plane.js.map +1 -1
  94. package/dist/api/shell.js +1 -1
  95. package/dist/api/shell.js.map +1 -1
  96. package/dist/api/sketch-on-face.js +1 -1
  97. package/dist/api/sketch-on-face.js.map +1 -1
  98. package/dist/api/split-by-plane.js +1 -1
  99. package/dist/api/split-by-plane.js.map +1 -1
  100. package/dist/api/split.js +1 -1
  101. package/dist/api/split.js.map +1 -1
  102. package/dist/api/thicken.js +1 -1
  103. package/dist/api/thicken.js.map +1 -1
  104. package/dist/api/topo-resolve.js +4 -4
  105. package/dist/api/topo-resolve.js.map +1 -1
  106. package/dist/api/transform.js +1 -1
  107. package/dist/api/transform.js.map +1 -1
  108. package/dist/api/view/view-projection.d.ts +8 -0
  109. package/dist/api/view/view-projection.d.ts.map +1 -1
  110. package/dist/api/view/view-projection.js +73 -2
  111. package/dist/api/view/view-projection.js.map +1 -1
  112. package/dist/boolean/cross-section.d.ts.map +1 -1
  113. package/dist/boolean/cross-section.js +3 -1
  114. package/dist/boolean/cross-section.js.map +1 -1
  115. package/dist/brep/brep-ops.d.ts +26 -0
  116. package/dist/brep/brep-ops.d.ts.map +1 -1
  117. package/dist/brep/brep-ops.js +45 -0
  118. package/dist/brep/brep-ops.js.map +1 -1
  119. package/dist/brep/brep-topology.js +1 -1
  120. package/dist/brep/brep-topology.js.map +1 -1
  121. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  122. package/dist/brep/engine/adapters/brep-mock.js +2 -0
  123. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  124. package/dist/brep/engine/primitives.d.ts +17 -0
  125. package/dist/brep/engine/primitives.d.ts.map +1 -1
  126. package/dist/brep/engine/primitives.js.map +1 -1
  127. package/dist/brep/export/export-model.d.ts.map +1 -1
  128. package/dist/brep/export/export-model.js +36 -11
  129. package/dist/brep/export/export-model.js.map +1 -1
  130. package/dist/brep/export/step-flat.d.ts +35 -0
  131. package/dist/brep/export/step-flat.d.ts.map +1 -0
  132. package/dist/brep/export/step-flat.js +94 -0
  133. package/dist/brep/export/step-flat.js.map +1 -0
  134. package/dist/brep/export/step.d.ts.map +1 -1
  135. package/dist/brep/export/step.js +42 -21
  136. package/dist/brep/export/step.js.map +1 -1
  137. package/dist/brep/handle-bridge.d.ts +4 -4
  138. package/dist/brep/handle-bridge.js +4 -4
  139. package/dist/brep/handle-bridge.js.map +1 -1
  140. package/dist/brep/svg/svg-to-solid.d.ts +3 -17
  141. package/dist/brep/svg/svg-to-solid.d.ts.map +1 -1
  142. package/dist/brep/svg/svg-to-solid.js +16 -317
  143. package/dist/brep/svg/svg-to-solid.js.map +1 -1
  144. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  145. package/dist/brepkit-kernel/brepkitKernel.js +10 -0
  146. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  147. package/dist/brepkit-kernel/brepkitWasm.d.ts +1 -1
  148. package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
  149. package/dist/brepkit-kernel/brepkitWasm.js +7 -6
  150. package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
  151. package/dist/brepkit-kernel/multi-version-test.d.ts +7 -7
  152. package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
  153. package/dist/brepkit-kernel/multi-version-test.js +10 -10
  154. package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
  155. package/dist/cad-runtime/direct-executor.js +2 -2
  156. package/dist/cad-runtime/direct-executor.js.map +1 -1
  157. package/dist/cad-runtime/runtime.js +5 -5
  158. package/dist/cad-runtime/runtime.js.map +1 -1
  159. package/dist/geometry2d/curve2d.js +42 -1
  160. package/dist/geometry2d/curve2d.js.map +1 -1
  161. package/dist/math3d/Box3.js.map +1 -1
  162. package/dist/math3d/Euler.js.map +1 -1
  163. package/dist/math3d/Mat4.js.map +1 -1
  164. package/dist/math3d/Plane.js.map +1 -1
  165. package/dist/math3d/Quat.js.map +1 -1
  166. package/dist/math3d/Vec2.js.map +1 -1
  167. package/dist/math3d/Vec3.js.map +1 -1
  168. package/dist/math3d/index.js.map +1 -1
  169. package/dist/mesh/meshdata/contour.d.ts +34 -0
  170. package/dist/mesh/meshdata/contour.d.ts.map +1 -0
  171. package/dist/mesh/meshdata/contour.js +39 -0
  172. package/dist/mesh/meshdata/contour.js.map +1 -0
  173. package/dist/mesh/meshdata/extrude.d.ts +25 -0
  174. package/dist/mesh/meshdata/extrude.d.ts.map +1 -0
  175. package/dist/mesh/meshdata/extrude.js +198 -0
  176. package/dist/mesh/meshdata/extrude.js.map +1 -0
  177. package/dist/mesh/meshdata/index.js.map +1 -1
  178. package/dist/mesh/meshdata/ops.js.map +1 -1
  179. package/dist/mesh/meshdata/parametric.js.map +1 -1
  180. package/dist/mesh/meshdata/weld.js.map +1 -1
  181. package/dist/node-host/cli.d.ts.map +1 -1
  182. package/dist/node-host/cli.js +3 -2
  183. package/dist/node-host/cli.js.map +1 -1
  184. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  185. package/dist/occt-kernel/occt-primitives.js +2 -0
  186. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  187. package/dist/primitives/svg/svg-path.d.ts +192 -0
  188. package/dist/primitives/svg/svg-path.d.ts.map +1 -0
  189. package/dist/primitives/svg/svg-path.js +776 -0
  190. package/dist/primitives/svg/svg-path.js.map +1 -0
  191. package/dist/third-party/earcut.d.ts +19 -0
  192. package/dist/third-party/earcut.d.ts.map +1 -0
  193. package/dist/third-party/earcut.js +575 -0
  194. package/dist/third-party/earcut.js.map +1 -0
  195. package/package.json +10 -3
@@ -4,7 +4,7 @@
4
4
  * 装载策略(与 occt-kernel 一致):
5
5
  * - 宿主可调用 setBrepkitWasmInitFn(fn) 注入自定义初始化函数
6
6
  * (小程序 Worker 传 WXWebAssembly 实例化路径;node 测试走 npm 包默认 init);
7
- * - 未注入时,node 环境直接 require('brepkit-wasm')(该包胶水零 eval,可直接装载);
7
+ * - 未注入时,node 环境直接 require('@faicad/brepkit2-wasm')(该包胶水零 eval,可直接装载);
8
8
  * - 两边都没有 → 抛带上下文的错误(报错好于掩盖,禁止静默回退)。
9
9
  */
10
10
  /** brepkit 内核实例形态(BrepKernel 类,228 个方法;类型面见 npm 包 brepkit_wasm.d.ts)。 */
@@ -1 +1 @@
1
- {"version":3,"file":"brepkitWasm.d.ts","sourceRoot":"","sources":["../../src/brepkit-kernel/brepkitWasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,GAAG,CAAA;AAkD/B;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAKpF;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAuBxD;AAED;mCACmC;AACnC,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
1
+ {"version":3,"file":"brepkitWasm.d.ts","sourceRoot":"","sources":["../../src/brepkit-kernel/brepkitWasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,GAAG,CAAA;AAkD/B;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAKpF;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAwBxD;AAED;mCACmC;AACnC,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -4,7 +4,7 @@
4
4
  * 装载策略(与 occt-kernel 一致):
5
5
  * - 宿主可调用 setBrepkitWasmInitFn(fn) 注入自定义初始化函数
6
6
  * (小程序 Worker 传 WXWebAssembly 实例化路径;node 测试走 npm 包默认 init);
7
- * - 未注入时,node 环境直接 require('brepkit-wasm')(该包胶水零 eval,可直接装载);
7
+ * - 未注入时,node 环境直接 require('@faicad/brepkit2-wasm')(该包胶水零 eval,可直接装载);
8
8
  * - 两边都没有 → 抛带上下文的错误(报错好于掩盖,禁止静默回退)。
9
9
  */
10
10
  // 2026-09-26 跨实例共享(随 0.18.2 发布):customInitFn / initPromise 从模块级
@@ -65,13 +65,14 @@ export function initBrepkitWasm() {
65
65
  return await s.customInitFn();
66
66
  // node 环境(单测 / CLI):npm 包默认装载路径
67
67
  if (typeof process !== 'undefined' && process.versions?.node) {
68
- // Non-literal specifier: brepkit-wasm is an optional runtime injection, not
69
- // a declared dependency — a literal would make tsc fail with TS2307 when
70
- // the package is absent. A missing package surfaces at runtime (below).
71
- const specifier = 'brepkit-wasm';
68
+ // Non-literal specifier: @faicad/brepkit2-wasm is an optional runtime
69
+ // injection (a devDependency for tests; hosts inject their own loader) —
70
+ // a literal would make tsc fail with TS2307 when the package is absent.
71
+ // A missing package surfaces at runtime (below).
72
+ const specifier = '@faicad/brepkit2-wasm';
72
73
  const mod = (await import(/* @vite-ignore */ specifier));
73
74
  if (!mod?.BrepKernel) {
74
- throw new Error('initBrepkitWasm: brepkit-wasm is not installed; install it or call setBrepkitWasmInitFn() first.');
75
+ throw new Error('initBrepkitWasm: @faicad/brepkit2-wasm is not installed; install it or call setBrepkitWasmInitFn() first.');
75
76
  }
76
77
  return new mod.BrepKernel();
77
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"brepkitWasm.js","sourceRoot":"","sources":["../../src/brepkit-kernel/brepkitWasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,gEAAgE;AAChE,+DAA+D;AAC/D,8CAA8C;AAC9C,0DAA0D;AAC1D,yCAAyC;AACzC,uCAAuC;AAEvC,MAAM,kBAAkB,GAAG,iCAAiC,CAAA;AAC5D,MAAM,4BAA4B,GAAG,CAAC,CAAA;AAStC;;;;;;;;GAQG;AACH,SAAS,2BAA2B;IAClC,MAAM,CAAC,GAAG,UAAgD,CAAA;IAC1D,MAAM,QAAQ,GAAG,CAAC,CAAC,kBAAkB,CAAyC,CAAA;IAC9E,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,YAAY,KAAK,4BAA4B,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,yDAAyD,QAAQ,CAAC,YAAY,cAAc,4BAA4B,EAAE,CAC3H,CAAA;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,OAAO,GAA6B;QACxC,YAAY,EAAE,4BAA4B;QAC1C,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;KAClB,CAAA;IACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAA;IAC/B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAyC;IAC5E,MAAM,CAAC,GAAG,2BAA2B,EAAE,CAAA;IACvC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAA;IACnB,mCAAmC;IACnC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAA;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,GAAG,2BAA2B,EAAE,CAAA;IACvC,IAAI,CAAC,CAAC,WAAW;QAAE,OAAO,CAAC,CAAC,WAAW,CAAA;IACvC,CAAC,CAAC,WAAW,GAAG,CAAC,KAAK,IAA4B,EAAE;QAClD,IAAI,CAAC,CAAC,YAAY;YAAE,OAAO,MAAM,CAAC,CAAC,YAAY,EAAE,CAAA;QACjD,gCAAgC;QAEhC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC7D,4EAA4E;YAC5E,yEAAyE;YACzE,wEAAwE;YACxE,MAAM,SAAS,GAAG,cAAc,CAAA;YAChC,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAEtD,CAAA;YACD,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,kGAAkG,CAAC,CAAA;YACrH,CAAC;YACD,OAAO,IAAI,GAAG,CAAC,UAAU,EAAmB,CAAA;QAC9C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uGAAuG,CAAC,CAAA;IAC1H,CAAC,CAAC,EAAE,CAAA;IACJ,OAAO,CAAC,CAAC,WAAW,CAAA;AACtB,CAAC;AAED;mCACmC;AACnC,MAAM,UAAU,oBAAoB;IAClC,OAAO,2BAA2B,EAAE,CAAC,WAAW,KAAK,IAAI,CAAA;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,2BAA2B,EAAE,CAAC,WAAW,GAAG,IAAI,CAAA;AAClD,CAAC","sourcesContent":["/**\n * brepkit-kernel/brepkitWasm — brepkit-wasm 装载(setOcctWasmInitFn 同构的注入点)\n *\n * 装载策略(与 occt-kernel 一致):\n * - 宿主可调用 setBrepkitWasmInitFn(fn) 注入自定义初始化函数\n * (小程序 Worker 传 WXWebAssembly 实例化路径;node 测试走 npm 包默认 init);\n * - 未注入时,node 环境直接 require('brepkit-wasm')(该包胶水零 eval,可直接装载);\n * - 两边都没有 → 抛带上下文的错误(报错好于掩盖,禁止静默回退)。\n */\n\n/** brepkit 内核实例形态(BrepKernel 类,228 个方法;类型面见 npm 包 brepkit_wasm.d.ts)。 */\nexport type BrepKitKernel = any\n\ntype BrepKitInitFn = () => Promise<BrepKitKernel>\n\n// 2026-09-26 跨实例共享(随 0.18.2 发布):customInitFn / initPromise 从模块级\n// 单例提升为挂在 globalThis 上的共享状态(与 occtKernel.ts / runtime-state.ts\n// 同款设计)。原因:CDN 外部化的 faijs 多实例各自持有独立内核 → 句柄不互通\n// (occtKernel.ts 顶部注释详述);小程序 Worker 场景同理。挂到 globalThis 后,\n// 任一实例 initBrepkitWasm() 产出的内核全局可见,句柄互通。\n// 构建期去重(external / dedupe)仍是主手段,这里是兜底。\n\nconst BREPKIT_KERNEL_KEY = '__FAICAD_FAIJS_BREPKIT_KERNEL__'\nconst BREPKIT_KERNEL_STATE_VERSION = 1\n\n/** brepkit 内核共享状态(跨 faijs 模块实例,浏览器/Node/小程序 Worker 多环境)。 */\ninterface BrepkitKernelSharedState {\n stateVersion: number\n customInitFn: BrepKitInitFn | null\n initPromise: Promise<BrepKitKernel> | null\n}\n\n/**\n * 获取 brepkit 内核共享状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 外部化一份)共享同一份内核状态——否则两份 initPromise 导致内核各自初始化、\n * 句柄不互通(几何孤岛)。\n *\n * @returns the shared brepkit kernel state singleton.\n */\nfunction getBrepkitKernelSharedState(): BrepkitKernelSharedState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[BREPKIT_KERNEL_KEY] as BrepkitKernelSharedState | undefined\n if (existing) {\n if (existing.stateVersion !== BREPKIT_KERNEL_STATE_VERSION) {\n throw new Error(\n `[faijs] brepkit kernel state version mismatch: loaded=${existing.stateVersion}, expected=${BREPKIT_KERNEL_STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: BrepkitKernelSharedState = {\n stateVersion: BREPKIT_KERNEL_STATE_VERSION,\n customInitFn: null,\n initPromise: null,\n }\n g[BREPKIT_KERNEL_KEY] = created\n return created\n}\n\n/**\n * 注入自定义 brepkit wasm 初始化函数(宿主装配期调用一次)。写入共享挂点——\n * 任意 faijs 实例(含 CDN 外部化实例 / 小程序 Worker 副实例)都优先使用。\n * @param fn - the initialization function to use, or null to clear\n */\nexport function setBrepkitWasmInitFn(fn: (() => Promise<BrepKitKernel>) | null): void {\n const s = getBrepkitKernelSharedState()\n s.customInitFn = fn\n // 挂点变化后丢弃进行中的初始化(下一次 init 用新挂点重来)。\n s.initPromise = null\n}\n\n/**\n * 初始化并返回 BrepKernel 单例(幂等:多次调用共享同一次初始化)。\n * @returns Promise 解析为 BrepKernel 实例。\n */\nexport function initBrepkitWasm(): Promise<BrepKitKernel> {\n const s = getBrepkitKernelSharedState()\n if (s.initPromise) return s.initPromise\n s.initPromise = (async (): Promise<BrepKitKernel> => {\n if (s.customInitFn) return await s.customInitFn()\n // node 环境(单测 / CLI):npm 包默认装载路径\n\n if (typeof process !== 'undefined' && process.versions?.node) {\n // Non-literal specifier: brepkit-wasm is an optional runtime injection, not\n // a declared dependency — a literal would make tsc fail with TS2307 when\n // the package is absent. A missing package surfaces at runtime (below).\n const specifier = 'brepkit-wasm'\n const mod = (await import(/* @vite-ignore */ specifier)) as {\n BrepKernel: new () => BrepKitKernel\n }\n if (!mod?.BrepKernel) {\n throw new Error('initBrepkitWasm: brepkit-wasm is not installed; install it or call setBrepkitWasmInitFn() first.')\n }\n return new mod.BrepKernel() as BrepKitKernel\n }\n throw new Error('initBrepkitWasm: no init function set and not in Node environment. Call setBrepkitWasmInitFn() first.')\n })()\n return s.initPromise\n}\n\n/** 是否已初始化完成(测试诊断用)。\n * @returns true 表示 init 已启动/完成。 */\nexport function isBrepkitInitialized(): boolean {\n return getBrepkitKernelSharedState().initPromise !== null\n}\n\n/**\n * 丢弃当前初始化结果(测试收尾 / 内核释放后调用)。\n *\n * `disposeBrepkit()` 必须调它——否则已释放的内核仍被缓存的 `initPromise` 引用,\n * 下一次 `initBrepkitWasm()` 会返回**已释放**的内核(实测报 `null pointer passed\n * to rust`)。`customInitFn` 不受影响(宿主注入的装载路径仍在)。\n */\nexport function resetBrepkitWasm(): void {\n getBrepkitKernelSharedState().initPromise = null\n}\n"]}
1
+ {"version":3,"file":"brepkitWasm.js","sourceRoot":"","sources":["../../src/brepkit-kernel/brepkitWasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,gEAAgE;AAChE,+DAA+D;AAC/D,8CAA8C;AAC9C,0DAA0D;AAC1D,yCAAyC;AACzC,uCAAuC;AAEvC,MAAM,kBAAkB,GAAG,iCAAiC,CAAA;AAC5D,MAAM,4BAA4B,GAAG,CAAC,CAAA;AAStC;;;;;;;;GAQG;AACH,SAAS,2BAA2B;IAClC,MAAM,CAAC,GAAG,UAAgD,CAAA;IAC1D,MAAM,QAAQ,GAAG,CAAC,CAAC,kBAAkB,CAAyC,CAAA;IAC9E,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,YAAY,KAAK,4BAA4B,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,yDAAyD,QAAQ,CAAC,YAAY,cAAc,4BAA4B,EAAE,CAC3H,CAAA;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,OAAO,GAA6B;QACxC,YAAY,EAAE,4BAA4B;QAC1C,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;KAClB,CAAA;IACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAA;IAC/B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAyC;IAC5E,MAAM,CAAC,GAAG,2BAA2B,EAAE,CAAA;IACvC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAA;IACnB,mCAAmC;IACnC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAA;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,GAAG,2BAA2B,EAAE,CAAA;IACvC,IAAI,CAAC,CAAC,WAAW;QAAE,OAAO,CAAC,CAAC,WAAW,CAAA;IACvC,CAAC,CAAC,WAAW,GAAG,CAAC,KAAK,IAA4B,EAAE;QAClD,IAAI,CAAC,CAAC,YAAY;YAAE,OAAO,MAAM,CAAC,CAAC,YAAY,EAAE,CAAA;QACjD,gCAAgC;QAEhC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC7D,sEAAsE;YACtE,yEAAyE;YACzE,wEAAwE;YACxE,iDAAiD;YACjD,MAAM,SAAS,GAAG,uBAAuB,CAAA;YACzC,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAEtD,CAAA;YACD,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,2GAA2G,CAAC,CAAA;YAC9H,CAAC;YACD,OAAO,IAAI,GAAG,CAAC,UAAU,EAAmB,CAAA;QAC9C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uGAAuG,CAAC,CAAA;IAC1H,CAAC,CAAC,EAAE,CAAA;IACJ,OAAO,CAAC,CAAC,WAAW,CAAA;AACtB,CAAC;AAED;mCACmC;AACnC,MAAM,UAAU,oBAAoB;IAClC,OAAO,2BAA2B,EAAE,CAAC,WAAW,KAAK,IAAI,CAAA;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,2BAA2B,EAAE,CAAC,WAAW,GAAG,IAAI,CAAA;AAClD,CAAC","sourcesContent":["/**\n * brepkit-kernel/brepkitWasm — brepkit-wasm 装载(setOcctWasmInitFn 同构的注入点)\n *\n * 装载策略(与 occt-kernel 一致):\n * - 宿主可调用 setBrepkitWasmInitFn(fn) 注入自定义初始化函数\n * (小程序 Worker 传 WXWebAssembly 实例化路径;node 测试走 npm 包默认 init);\n * - 未注入时,node 环境直接 require('@faicad/brepkit2-wasm')(该包胶水零 eval,可直接装载);\n * - 两边都没有 → 抛带上下文的错误(报错好于掩盖,禁止静默回退)。\n */\n\n/** brepkit 内核实例形态(BrepKernel 类,228 个方法;类型面见 npm 包 brepkit_wasm.d.ts)。 */\nexport type BrepKitKernel = any\n\ntype BrepKitInitFn = () => Promise<BrepKitKernel>\n\n// 2026-09-26 跨实例共享(随 0.18.2 发布):customInitFn / initPromise 从模块级\n// 单例提升为挂在 globalThis 上的共享状态(与 occtKernel.ts / runtime-state.ts\n// 同款设计)。原因:CDN 外部化的 faijs 多实例各自持有独立内核 → 句柄不互通\n// (occtKernel.ts 顶部注释详述);小程序 Worker 场景同理。挂到 globalThis 后,\n// 任一实例 initBrepkitWasm() 产出的内核全局可见,句柄互通。\n// 构建期去重(external / dedupe)仍是主手段,这里是兜底。\n\nconst BREPKIT_KERNEL_KEY = '__FAICAD_FAIJS_BREPKIT_KERNEL__'\nconst BREPKIT_KERNEL_STATE_VERSION = 1\n\n/** brepkit 内核共享状态(跨 faijs 模块实例,浏览器/Node/小程序 Worker 多环境)。 */\ninterface BrepkitKernelSharedState {\n stateVersion: number\n customInitFn: BrepKitInitFn | null\n initPromise: Promise<BrepKitKernel> | null\n}\n\n/**\n * 获取 brepkit 内核共享状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 外部化一份)共享同一份内核状态——否则两份 initPromise 导致内核各自初始化、\n * 句柄不互通(几何孤岛)。\n *\n * @returns the shared brepkit kernel state singleton.\n */\nfunction getBrepkitKernelSharedState(): BrepkitKernelSharedState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[BREPKIT_KERNEL_KEY] as BrepkitKernelSharedState | undefined\n if (existing) {\n if (existing.stateVersion !== BREPKIT_KERNEL_STATE_VERSION) {\n throw new Error(\n `[faijs] brepkit kernel state version mismatch: loaded=${existing.stateVersion}, expected=${BREPKIT_KERNEL_STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: BrepkitKernelSharedState = {\n stateVersion: BREPKIT_KERNEL_STATE_VERSION,\n customInitFn: null,\n initPromise: null,\n }\n g[BREPKIT_KERNEL_KEY] = created\n return created\n}\n\n/**\n * 注入自定义 brepkit wasm 初始化函数(宿主装配期调用一次)。写入共享挂点——\n * 任意 faijs 实例(含 CDN 外部化实例 / 小程序 Worker 副实例)都优先使用。\n * @param fn - the initialization function to use, or null to clear\n */\nexport function setBrepkitWasmInitFn(fn: (() => Promise<BrepKitKernel>) | null): void {\n const s = getBrepkitKernelSharedState()\n s.customInitFn = fn\n // 挂点变化后丢弃进行中的初始化(下一次 init 用新挂点重来)。\n s.initPromise = null\n}\n\n/**\n * 初始化并返回 BrepKernel 单例(幂等:多次调用共享同一次初始化)。\n * @returns Promise 解析为 BrepKernel 实例。\n */\nexport function initBrepkitWasm(): Promise<BrepKitKernel> {\n const s = getBrepkitKernelSharedState()\n if (s.initPromise) return s.initPromise\n s.initPromise = (async (): Promise<BrepKitKernel> => {\n if (s.customInitFn) return await s.customInitFn()\n // node 环境(单测 / CLI):npm 包默认装载路径\n\n if (typeof process !== 'undefined' && process.versions?.node) {\n // Non-literal specifier: @faicad/brepkit2-wasm is an optional runtime\n // injection (a devDependency for tests; hosts inject their own loader) —\n // a literal would make tsc fail with TS2307 when the package is absent.\n // A missing package surfaces at runtime (below).\n const specifier = '@faicad/brepkit2-wasm'\n const mod = (await import(/* @vite-ignore */ specifier)) as {\n BrepKernel: new () => BrepKitKernel\n }\n if (!mod?.BrepKernel) {\n throw new Error('initBrepkitWasm: @faicad/brepkit2-wasm is not installed; install it or call setBrepkitWasmInitFn() first.')\n }\n return new mod.BrepKernel() as BrepKitKernel\n }\n throw new Error('initBrepkitWasm: no init function set and not in Node environment. Call setBrepkitWasmInitFn() first.')\n })()\n return s.initPromise\n}\n\n/** 是否已初始化完成(测试诊断用)。\n * @returns true 表示 init 已启动/完成。 */\nexport function isBrepkitInitialized(): boolean {\n return getBrepkitKernelSharedState().initPromise !== null\n}\n\n/**\n * 丢弃当前初始化结果(测试收尾 / 内核释放后调用)。\n *\n * `disposeBrepkit()` 必须调它——否则已释放的内核仍被缓存的 `initPromise` 引用,\n * 下一次 `initBrepkitWasm()` 会返回**已释放**的内核(实测报 `null pointer passed\n * to rust`)。`customInitFn` 不受影响(宿主注入的装载路径仍在)。\n */\nexport function resetBrepkitWasm(): void {\n getBrepkitKernelSharedState().initPromise = null\n}\n"]}
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * brepkit-kernel/multi-version-test — 同进程多版本 brepkit-wasm 装载辅助(仅测试用)
3
3
  *
4
- * 让 faijs 测试在同一 Node 进程内切换三个 brepkit-wasm 版本:
5
- * - 2.129.15(MIT OR Apache-2.0,用户目标版本线末代)
6
- * - 3.4.18(仓库当前 devDependency,node_modules 默认路径)
7
- * - 4.0.32(npm dist-tag latest)
4
+ * 让 faijs 测试在同一 Node 进程内切换三个 brepkit 内核版本:
5
+ * - 2.129.15(上游 `brepkit-wasm` 基线,MIT OR Apache-2.0)
6
+ * - 2.130.0(Faicad fork `@faicad/brepkit2-wasm`,仓库当前 devDependency)
7
+ * - 4.0.32(上游 `brepkit-wasm` 的 npm dist-tag latest)
8
8
  *
9
9
  * 解包产物位于 `_test-kernels/brepkit-<version>/package/`(由 `npm pack` 拉取并解包,
10
- * 已 gitignore,不进入 dist / 不提交)。3.4.18 直接走 node_modules。
10
+ * 已 gitignore,不进入 dist / 不提交)。2.130.0 直接走 node_modules。
11
11
  *
12
12
  * 切换序列(与 brep/engine/measurement-parity.test.ts 的 reset+重注册范式一致,
13
13
  * 全程只经公开导出 API 操作,不改动内核源码):
@@ -20,8 +20,8 @@
20
20
  * 入口(brepkit_wasm_node.cjs)在加载时同步 readFileSync 自身同目录的 wasm 并
21
21
  * 实例化,故按绝对路径 import 即天然隔离,不会与 node_modules 的包名缓存冲突。
22
22
  */
23
- /** 可在同进程切换的 brepkit-wasm 版本。 */
24
- export type BrepkitTestVersion = '2.129.15' | '3.4.18' | '4.0.32';
23
+ /** 可在同进程切换的 brepkit 内核版本。 */
24
+ export type BrepkitTestVersion = '2.129.15' | '2.130.0' | '4.0.32';
25
25
  /**
26
26
  * 切换到指定 brepkit-wasm 版本并重新注册为 BREP 引擎。
27
27
  *
@@ -1 +1 @@
1
- {"version":3,"file":"multi-version-test.d.ts","sourceRoot":"","sources":["../../src/brepkit-kernel/multi-version-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,gCAAgC;AAChC,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAA;AA+CjE;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3D;AAED,wBAAwB;AACxB,eAAO,MAAM,iBAAiB,2BAAmB,CAAA"}
1
+ {"version":3,"file":"multi-version-test.d.ts","sourceRoot":"","sources":["../../src/brepkit-kernel/multi-version-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,6BAA6B;AAC7B,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAA;AA+ClE;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3D;AAED,wBAAwB;AACxB,eAAO,MAAM,iBAAiB,2BAAmB,CAAA"}
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * brepkit-kernel/multi-version-test — 同进程多版本 brepkit-wasm 装载辅助(仅测试用)
3
3
  *
4
- * 让 faijs 测试在同一 Node 进程内切换三个 brepkit-wasm 版本:
5
- * - 2.129.15(MIT OR Apache-2.0,用户目标版本线末代)
6
- * - 3.4.18(仓库当前 devDependency,node_modules 默认路径)
7
- * - 4.0.32(npm dist-tag latest)
4
+ * 让 faijs 测试在同一 Node 进程内切换三个 brepkit 内核版本:
5
+ * - 2.129.15(上游 `brepkit-wasm` 基线,MIT OR Apache-2.0)
6
+ * - 2.130.0(Faicad fork `@faicad/brepkit2-wasm`,仓库当前 devDependency)
7
+ * - 4.0.32(上游 `brepkit-wasm` 的 npm dist-tag latest)
8
8
  *
9
9
  * 解包产物位于 `_test-kernels/brepkit-<version>/package/`(由 `npm pack` 拉取并解包,
10
- * 已 gitignore,不进入 dist / 不提交)。3.4.18 直接走 node_modules。
10
+ * 已 gitignore,不进入 dist / 不提交)。2.130.0 直接走 node_modules。
11
11
  *
12
12
  * 切换序列(与 brep/engine/measurement-parity.test.ts 的 reset+重注册范式一致,
13
13
  * 全程只经公开导出 API 操作,不改动内核源码):
@@ -26,24 +26,24 @@ import { setBrepkitWasmInitFn } from './brepkitWasm.js';
26
26
  import { disposeBrepkit } from './brepkitKernel.js';
27
27
  import { __resetEngineRegistriesForTests } from '../brep/engine/registry.js';
28
28
  import { registerBrepkitBrepEngine } from '../brep/engine/adapters/brepkit.js';
29
- /** 解包版本(2.x/4.x)相对本辅助文件的目录名;3.4.18 走 node_modules。 */
29
+ /** 解包版本(2.129.15 / 4.0.32)相对本辅助文件的目录名;2.130.0 走 node_modules。 */
30
30
  const UNPACKED_PKG_DIR = ['2.129.15', '4.0.32'];
31
31
  /** 本辅助文件所在目录(vite-node / 原生 ESM 在 node 环境下均暴露 file:// 源文件 URL)。 */
32
32
  const hereDir = dirname(fileURLToPath(import.meta.url));
33
33
  /**
34
34
  * 从指定版本装载 BrepKernel 类。
35
35
  *
36
- * - 3.4.18:复用 node_modules 默认包路径(与 brepkitWasm.ts 生产路径一致)。
36
+ * - 2.130.0:复用 node_modules 默认包路径(与 brepkitWasm.ts 生产路径一致)。
37
37
  * - 2.129.15 / 4.0.32:按绝对路径动态 import 解包后的 node cjs 入口;
38
38
  * vite 注释标记让 vite-node 不拦截、交回原生 Node ESM 装载,
39
39
  * cjs 入口内部用 __dirname 相对定位 wasm,因此与 cwd 无关。
40
40
  */
41
41
  async function loadBrepKernelClass(version) {
42
- if (version === '3.4.18') {
42
+ if (version === '2.130.0') {
43
43
  // node_modules 默认路径(与 brepkitWasm.ts 生产装载同 specifier)。
44
- const mod = (await import(/* @vite-ignore */ 'brepkit-wasm'));
44
+ const mod = (await import(/* @vite-ignore */ '@faicad/brepkit2-wasm'));
45
45
  if (!mod?.BrepKernel) {
46
- throw new Error(`[multi-version] 3.4.18: node_modules brepkit-wasm 未导出 BrepKernel`);
46
+ throw new Error(`[multi-version] 2.130.0: node_modules @faicad/brepkit2-wasm 未导出 BrepKernel`);
47
47
  }
48
48
  return mod.BrepKernel;
49
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"multi-version-test.js","sourceRoot":"","sources":["../../src/brepkit-kernel/multi-version-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAsB,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAA;AAK3E,sDAAsD;AACtD,MAAM,gBAAgB,GAA4C,CAAC,UAAU,EAAE,QAAQ,CAAU,CAAA;AAEjG,mEAAmE;AACnE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAIvD;;;;;;;GAOG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAA2B;IAC5D,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,uDAAuD;QACvD,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAE3D,CAAA;QACD,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;QACrF,CAAC;QACD,OAAO,GAAG,CAAC,UAAU,CAAA;IACvB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAClB,OAAO,EACP,eAAe,EACf,WAAW,OAAO,EAAE,EACpB,SAAS,EACT,uBAAuB,CACxB,CAAA;IACD,iEAAiE;IACjE,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAExE,CAAA;IACD,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,KAAK,OAAO,iBAAiB,CAAC,CAAA;IAC1E,CAAC;IACD,OAAO,GAAG,CAAC,UAAU,CAAA;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA2B;IAClE,2DAA2D;IAC3D,cAAc,EAAE,CAAA;IAChB,yDAAyD;IACzD,oBAAoB,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAC/C,OAAO,IAAI,IAAI,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IACF,8CAA8C;IAC9C,+BAA+B,EAAE,CAAA;IACjC,yEAAyE;IACzE,MAAM,yBAAyB,EAAE,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,cAAc,EAAE,CAAA;IAChB,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC1B,+BAA+B,EAAE,CAAA;AACnC,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAA","sourcesContent":["/**\n * brepkit-kernel/multi-version-test — 同进程多版本 brepkit-wasm 装载辅助(仅测试用)\n *\n * 让 faijs 测试在同一 Node 进程内切换三个 brepkit-wasm 版本:\n * - 2.129.15(MIT OR Apache-2.0,用户目标版本线末代)\n * - 3.4.18(仓库当前 devDependency,node_modules 默认路径)\n * - 4.0.32(npm dist-tag latest)\n *\n * 解包产物位于 `_test-kernels/brepkit-<version>/package/`(由 `npm pack` 拉取并解包,\n * 已 gitignore,不进入 dist / 不提交)。3.4.18 直接走 node_modules。\n *\n * 切换序列(与 brep/engine/measurement-parity.test.ts 的 reset+重注册范式一致,\n * 全程只经公开导出 API 操作,不改动内核源码):\n * 1. disposeBrepkit() —— 释放 liveKernel 单例\n * 2. setBrepkitWasmInitFn(customFn) —— 重置 initPromise 并注入新版本装载函数\n * 3. __resetEngineRegistriesForTests() —— 清空引擎注册表(provider/cache/默认)\n * 4. registerBrepkitBrepEngine() —— 用新版本重新注册(内部触发 wasm 装载)\n *\n * customFn 内从对应版本的绝对路径取 BrepKernel 类并 `new` 之——三个版本的 cjs\n * 入口(brepkit_wasm_node.cjs)在加载时同步 readFileSync 自身同目录的 wasm 并\n * 实例化,故按绝对路径 import 即天然隔离,不会与 node_modules 的包名缓存冲突。\n */\n\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { dirname, join } from 'node:path'\nimport { setBrepkitWasmInitFn, type BrepKitKernel } from './brepkitWasm'\nimport { disposeBrepkit } from './brepkitKernel'\nimport { __resetEngineRegistriesForTests } from '../brep/engine/registry'\nimport { registerBrepkitBrepEngine } from '../brep/engine/adapters/brepkit'\n\n/** 可在同进程切换的 brepkit-wasm 版本。 */\nexport type BrepkitTestVersion = '2.129.15' | '3.4.18' | '4.0.32'\n\n/** 解包版本(2.x/4.x)相对本辅助文件的目录名;3.4.18 走 node_modules。 */\nconst UNPACKED_PKG_DIR: Exclude<BrepkitTestVersion, '3.4.18'>[] = ['2.129.15', '4.0.32'] as const\n\n/** 本辅助文件所在目录(vite-node / 原生 ESM 在 node 环境下均暴露 file:// 源文件 URL)。 */\nconst hereDir = dirname(fileURLToPath(import.meta.url))\n\ntype BrepKernelCtor = new () => BrepKitKernel\n\n/**\n * 从指定版本装载 BrepKernel 类。\n *\n * - 3.4.18:复用 node_modules 默认包路径(与 brepkitWasm.ts 生产路径一致)。\n * - 2.129.15 / 4.0.32:按绝对路径动态 import 解包后的 node cjs 入口;\n * vite 注释标记让 vite-node 不拦截、交回原生 Node ESM 装载,\n * cjs 入口内部用 __dirname 相对定位 wasm,因此与 cwd 无关。\n */\nasync function loadBrepKernelClass(version: BrepkitTestVersion): Promise<BrepKernelCtor> {\n if (version === '3.4.18') {\n // node_modules 默认路径(与 brepkitWasm.ts 生产装载同 specifier)。\n const mod = (await import(/* @vite-ignore */ 'brepkit-wasm')) as {\n BrepKernel?: BrepKernelCtor\n }\n if (!mod?.BrepKernel) {\n throw new Error(`[multi-version] 3.4.18: node_modules brepkit-wasm 未导出 BrepKernel`)\n }\n return mod.BrepKernel\n }\n\n const cjsPath = join(\n hereDir,\n '_test-kernels',\n `brepkit-${version}`,\n 'package',\n 'brepkit_wasm_node.cjs',\n )\n // 原生 Node ESM import CJS:返回 namespace,命名导出经 cjs-module-lexer 暴露。\n const mod = (await import(/* @vite-ignore */ pathToFileURL(cjsPath).href)) as {\n BrepKernel?: BrepKernelCtor\n }\n if (!mod?.BrepKernel) {\n throw new Error(`[multi-version] ${version}: ${cjsPath} 未导出 BrepKernel`)\n }\n return mod.BrepKernel\n}\n\n/**\n * 切换到指定 brepkit-wasm 版本并重新注册为 BREP 引擎。\n *\n * 抛出的错误(wasm 装载失败 / BrepKernel 缺失 / 构造抛错)一律原样上抛,\n * 不在此 try-catch 掩盖——测试需要看到真实失败原因。\n * @param version - 目标 brepkit-wasm 版本标识(BrepkitTestVersion 联合类型之一)。\n */\nexport async function loadBrepkitVersion(version: BrepkitTestVersion): Promise<void> {\n // 1. 释放旧 liveKernel(wasm 模块级实例仍驻留,但 JS 句柄与 liveKernel 解绑)。\n disposeBrepkit()\n // 2. 注入新版本装载函数(setBrepkitWasmInitFn 内部同时清空 initPromise)。\n setBrepkitWasmInitFn(async () => {\n const Ctor = await loadBrepKernelClass(version)\n return new Ctor()\n })\n // 3. 清空引擎注册表(provider/cache/默认 id/frozen 标志)。\n __resetEngineRegistriesForTests()\n // 4. 重新注册:内部 createBrepkitPrimitives → initBrepkitWasm → 上面注入的 customFn。\n await registerBrepkitBrepEngine()\n}\n\n/**\n * 测试收尾:dispose + 清掉自定义 initFn(恢复默认 node_modules 装载路径)+ 清注册表。\n * 不重新注册任何引擎——收尾后本进程不再假定默认 BREP 引擎。\n */\nexport async function resetToDefaultBrepkit(): Promise<void> {\n disposeBrepkit()\n setBrepkitWasmInitFn(null)\n __resetEngineRegistriesForTests()\n}\n\n/** 解包版本目录清单(诊断/校验用)。 */\nexport const UNPACKED_VERSIONS = UNPACKED_PKG_DIR\n"]}
1
+ {"version":3,"file":"multi-version-test.js","sourceRoot":"","sources":["../../src/brepkit-kernel/multi-version-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAsB,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAA;AAK3E,iEAAiE;AACjE,MAAM,gBAAgB,GAA6C,CAAC,UAAU,EAAE,QAAQ,CAAU,CAAA;AAElG,mEAAmE;AACnE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAIvD;;;;;;;GAOG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAA2B;IAC5D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,uDAAuD;QACvD,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAEpE,CAAA;QACD,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAA;QAC/F,CAAC;QACD,OAAO,GAAG,CAAC,UAAU,CAAA;IACvB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAClB,OAAO,EACP,eAAe,EACf,WAAW,OAAO,EAAE,EACpB,SAAS,EACT,uBAAuB,CACxB,CAAA;IACD,iEAAiE;IACjE,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAExE,CAAA;IACD,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,KAAK,OAAO,iBAAiB,CAAC,CAAA;IAC1E,CAAC;IACD,OAAO,GAAG,CAAC,UAAU,CAAA;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA2B;IAClE,2DAA2D;IAC3D,cAAc,EAAE,CAAA;IAChB,yDAAyD;IACzD,oBAAoB,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAA;QAC/C,OAAO,IAAI,IAAI,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IACF,8CAA8C;IAC9C,+BAA+B,EAAE,CAAA;IACjC,yEAAyE;IACzE,MAAM,yBAAyB,EAAE,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,cAAc,EAAE,CAAA;IAChB,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC1B,+BAA+B,EAAE,CAAA;AACnC,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAA","sourcesContent":["/**\n * brepkit-kernel/multi-version-test — 同进程多版本 brepkit-wasm 装载辅助(仅测试用)\n *\n * 让 faijs 测试在同一 Node 进程内切换三个 brepkit 内核版本:\n * - 2.129.15(上游 `brepkit-wasm` 基线,MIT OR Apache-2.0)\n * - 2.130.0(Faicad fork `@faicad/brepkit2-wasm`,仓库当前 devDependency)\n * - 4.0.32(上游 `brepkit-wasm` 的 npm dist-tag latest)\n *\n * 解包产物位于 `_test-kernels/brepkit-<version>/package/`(由 `npm pack` 拉取并解包,\n * 已 gitignore,不进入 dist / 不提交)。2.130.0 直接走 node_modules。\n *\n * 切换序列(与 brep/engine/measurement-parity.test.ts 的 reset+重注册范式一致,\n * 全程只经公开导出 API 操作,不改动内核源码):\n * 1. disposeBrepkit() —— 释放 liveKernel 单例\n * 2. setBrepkitWasmInitFn(customFn) —— 重置 initPromise 并注入新版本装载函数\n * 3. __resetEngineRegistriesForTests() —— 清空引擎注册表(provider/cache/默认)\n * 4. registerBrepkitBrepEngine() —— 用新版本重新注册(内部触发 wasm 装载)\n *\n * customFn 内从对应版本的绝对路径取 BrepKernel 类并 `new` 之——三个版本的 cjs\n * 入口(brepkit_wasm_node.cjs)在加载时同步 readFileSync 自身同目录的 wasm 并\n * 实例化,故按绝对路径 import 即天然隔离,不会与 node_modules 的包名缓存冲突。\n */\n\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { dirname, join } from 'node:path'\nimport { setBrepkitWasmInitFn, type BrepKitKernel } from './brepkitWasm'\nimport { disposeBrepkit } from './brepkitKernel'\nimport { __resetEngineRegistriesForTests } from '../brep/engine/registry'\nimport { registerBrepkitBrepEngine } from '../brep/engine/adapters/brepkit'\n\n/** 可在同进程切换的 brepkit 内核版本。 */\nexport type BrepkitTestVersion = '2.129.15' | '2.130.0' | '4.0.32'\n\n/** 解包版本(2.129.15 / 4.0.32)相对本辅助文件的目录名;2.130.0 走 node_modules。 */\nconst UNPACKED_PKG_DIR: Exclude<BrepkitTestVersion, '2.130.0'>[] = ['2.129.15', '4.0.32'] as const\n\n/** 本辅助文件所在目录(vite-node / 原生 ESM 在 node 环境下均暴露 file:// 源文件 URL)。 */\nconst hereDir = dirname(fileURLToPath(import.meta.url))\n\ntype BrepKernelCtor = new () => BrepKitKernel\n\n/**\n * 从指定版本装载 BrepKernel 类。\n *\n * - 2.130.0:复用 node_modules 默认包路径(与 brepkitWasm.ts 生产路径一致)。\n * - 2.129.15 / 4.0.32:按绝对路径动态 import 解包后的 node cjs 入口;\n * vite 注释标记让 vite-node 不拦截、交回原生 Node ESM 装载,\n * cjs 入口内部用 __dirname 相对定位 wasm,因此与 cwd 无关。\n */\nasync function loadBrepKernelClass(version: BrepkitTestVersion): Promise<BrepKernelCtor> {\n if (version === '2.130.0') {\n // node_modules 默认路径(与 brepkitWasm.ts 生产装载同 specifier)。\n const mod = (await import(/* @vite-ignore */ '@faicad/brepkit2-wasm')) as {\n BrepKernel?: BrepKernelCtor\n }\n if (!mod?.BrepKernel) {\n throw new Error(`[multi-version] 2.130.0: node_modules @faicad/brepkit2-wasm 未导出 BrepKernel`)\n }\n return mod.BrepKernel\n }\n\n const cjsPath = join(\n hereDir,\n '_test-kernels',\n `brepkit-${version}`,\n 'package',\n 'brepkit_wasm_node.cjs',\n )\n // 原生 Node ESM import CJS:返回 namespace,命名导出经 cjs-module-lexer 暴露。\n const mod = (await import(/* @vite-ignore */ pathToFileURL(cjsPath).href)) as {\n BrepKernel?: BrepKernelCtor\n }\n if (!mod?.BrepKernel) {\n throw new Error(`[multi-version] ${version}: ${cjsPath} 未导出 BrepKernel`)\n }\n return mod.BrepKernel\n}\n\n/**\n * 切换到指定 brepkit-wasm 版本并重新注册为 BREP 引擎。\n *\n * 抛出的错误(wasm 装载失败 / BrepKernel 缺失 / 构造抛错)一律原样上抛,\n * 不在此 try-catch 掩盖——测试需要看到真实失败原因。\n * @param version - 目标 brepkit-wasm 版本标识(BrepkitTestVersion 联合类型之一)。\n */\nexport async function loadBrepkitVersion(version: BrepkitTestVersion): Promise<void> {\n // 1. 释放旧 liveKernel(wasm 模块级实例仍驻留,但 JS 句柄与 liveKernel 解绑)。\n disposeBrepkit()\n // 2. 注入新版本装载函数(setBrepkitWasmInitFn 内部同时清空 initPromise)。\n setBrepkitWasmInitFn(async () => {\n const Ctor = await loadBrepKernelClass(version)\n return new Ctor()\n })\n // 3. 清空引擎注册表(provider/cache/默认 id/frozen 标志)。\n __resetEngineRegistriesForTests()\n // 4. 重新注册:内部 createBrepkitPrimitives → initBrepkitWasm → 上面注入的 customFn。\n await registerBrepkitBrepEngine()\n}\n\n/**\n * 测试收尾:dispose + 清掉自定义 initFn(恢复默认 node_modules 装载路径)+ 清注册表。\n * 不重新注册任何引擎——收尾后本进程不再假定默认 BREP 引擎。\n */\nexport async function resetToDefaultBrepkit(): Promise<void> {\n disposeBrepkit()\n setBrepkitWasmInitFn(null)\n __resetEngineRegistriesForTests()\n}\n\n/** 解包版本目录清单(诊断/校验用)。 */\nexport const UNPACKED_VERSIONS = UNPACKED_PKG_DIR\n"]}
@@ -404,7 +404,7 @@ export class DirectExecutor {
404
404
  if (bv !== null && typeof bv === 'object') {
405
405
  setName(bv, asPartName(key));
406
406
  const bslot = getSlot(bv);
407
- if (bslot?.solid)
407
+ if (bslot?.solid !== undefined)
408
408
  this.setSolidHook?.(asPartName(key), bslot.solid);
409
409
  if (bslot?.faceEvolution)
410
410
  this.setFaceEvolutionHook?.(asPartName(key), bslot.faceEvolution);
@@ -426,7 +426,7 @@ export class DirectExecutor {
426
426
  // 的 slot→solidCache/faceEvolutionCache/roleTableCache 同步同语义)。
427
427
  // buildBrepTopology/directBrepSolids/buildNamingInput 依赖此缓存命中。
428
428
  const slot = getSlot(v);
429
- if (slot?.solid)
429
+ if (slot?.solid !== undefined)
430
430
  this.setSolidHook?.(asPartName(w), slot.solid);
431
431
  if (slot?.faceEvolution)
432
432
  this.setFaceEvolutionHook?.(asPartName(w), slot.faceEvolution);