@faicad/faijs 0.13.2 → 0.16.0

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 (485) hide show
  1. package/dist/api/api-namespace.d.ts +7 -0
  2. package/dist/api/api-namespace.d.ts.map +1 -1
  3. package/dist/api/api-namespace.js +44 -17
  4. package/dist/api/api-namespace.js.map +1 -1
  5. package/dist/api/boolean.d.ts +19 -0
  6. package/dist/api/boolean.d.ts.map +1 -1
  7. package/dist/api/boolean.js +71 -12
  8. package/dist/api/boolean.js.map +1 -1
  9. package/dist/api/chamfer.d.ts.map +1 -1
  10. package/dist/api/chamfer.js +12 -8
  11. package/dist/api/chamfer.js.map +1 -1
  12. package/dist/api/compound-geom.d.ts +45 -0
  13. package/dist/api/compound-geom.d.ts.map +1 -0
  14. package/dist/api/compound-geom.js +85 -0
  15. package/dist/api/compound-geom.js.map +1 -0
  16. package/dist/api/edge-ref.d.ts.map +1 -1
  17. package/dist/api/edge-ref.js +7 -4
  18. package/dist/api/edge-ref.js.map +1 -1
  19. package/dist/api/engrave.d.ts.map +1 -1
  20. package/dist/api/engrave.js +1 -0
  21. package/dist/api/engrave.js.map +1 -1
  22. package/dist/api/extrude.d.ts.map +1 -1
  23. package/dist/api/extrude.js +131 -3
  24. package/dist/api/extrude.js.map +1 -1
  25. package/dist/api/face-ref.d.ts.map +1 -1
  26. package/dist/api/face-ref.js +7 -4
  27. package/dist/api/face-ref.js.map +1 -1
  28. package/dist/api/fillet.d.ts.map +1 -1
  29. package/dist/api/fillet.js +6 -5
  30. package/dist/api/fillet.js.map +1 -1
  31. package/dist/api/generated/cad/script-face.d.ts +1 -1
  32. package/dist/api/generated/cad/script-face.d.ts.map +1 -1
  33. package/dist/api/generated/cad/script-face.js +1 -2
  34. package/dist/api/generated/cad/script-face.js.map +1 -1
  35. package/dist/api/generated/operations.js +16 -16
  36. package/dist/api/generated/operations.js.map +1 -1
  37. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  38. package/dist/api/generated/script-face-manifest.js +0 -2
  39. package/dist/api/generated/script-face-manifest.js.map +1 -1
  40. package/dist/api/generated/script-face.d.ts +1 -7
  41. package/dist/api/generated/script-face.d.ts.map +1 -1
  42. package/dist/api/generated/script-face.js +2 -4
  43. package/dist/api/generated/script-face.js.map +1 -1
  44. package/dist/api/generated/sketching.js +1 -1
  45. package/dist/api/generated/sketching.js.map +1 -1
  46. package/dist/api/generated/topology.d.ts +0 -56
  47. package/dist/api/generated/topology.d.ts.map +1 -1
  48. package/dist/api/generated/topology.js +19 -68
  49. package/dist/api/generated/topology.js.map +1 -1
  50. package/dist/api/import-brep.d.ts +36 -0
  51. package/dist/api/import-brep.d.ts.map +1 -0
  52. package/dist/api/import-brep.js +72 -0
  53. package/dist/api/import-brep.js.map +1 -0
  54. package/dist/api/import-step.d.ts +28 -0
  55. package/dist/api/import-step.d.ts.map +1 -0
  56. package/dist/api/import-step.js +57 -0
  57. package/dist/api/import-step.js.map +1 -0
  58. package/dist/api/index.d.ts +8 -12
  59. package/dist/api/index.d.ts.map +1 -1
  60. package/dist/api/index.js +22 -16
  61. package/dist/api/index.js.map +1 -1
  62. package/dist/api/internal/compat-op.d.ts.map +1 -1
  63. package/dist/api/internal/compat-op.js +2 -1
  64. package/dist/api/internal/compat-op.js.map +1 -1
  65. package/dist/api/internal/compat-projection.d.ts +3 -1
  66. package/dist/api/internal/compat-projection.d.ts.map +1 -1
  67. package/dist/api/internal/compat-projection.js +8 -5
  68. package/dist/api/internal/compat-projection.js.map +1 -1
  69. package/dist/api/internal/replica-role-table.d.ts +36 -0
  70. package/dist/api/internal/replica-role-table.d.ts.map +1 -0
  71. package/dist/api/internal/replica-role-table.js +73 -0
  72. package/dist/api/internal/replica-role-table.js.map +1 -0
  73. package/dist/api/internal/result-unwrap.d.ts +3 -1
  74. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  75. package/dist/api/internal/result-unwrap.js +2 -2
  76. package/dist/api/internal/result-unwrap.js.map +1 -1
  77. package/dist/api/knurl.d.ts.map +1 -1
  78. package/dist/api/knurl.js +1 -0
  79. package/dist/api/knurl.js.map +1 -1
  80. package/dist/api/occt-kernel-bridge.d.ts +105 -27
  81. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  82. package/dist/api/occt-kernel-bridge.js +255 -41
  83. package/dist/api/occt-kernel-bridge.js.map +1 -1
  84. package/dist/api/pattern.d.ts +32 -0
  85. package/dist/api/pattern.d.ts.map +1 -0
  86. package/dist/api/pattern.js +85 -0
  87. package/dist/api/pattern.js.map +1 -0
  88. package/dist/api/place.d.ts +35 -0
  89. package/dist/api/place.d.ts.map +1 -0
  90. package/dist/api/place.js +113 -0
  91. package/dist/api/place.js.map +1 -0
  92. package/dist/api/primitives.d.ts.map +1 -1
  93. package/dist/api/primitives.js +10 -3
  94. package/dist/api/primitives.js.map +1 -1
  95. package/dist/api/replicate.d.ts +145 -0
  96. package/dist/api/replicate.d.ts.map +1 -0
  97. package/dist/api/replicate.js +351 -0
  98. package/dist/api/replicate.js.map +1 -0
  99. package/dist/api/revolve.d.ts +36 -0
  100. package/dist/api/revolve.d.ts.map +1 -0
  101. package/dist/api/revolve.js +165 -0
  102. package/dist/api/revolve.js.map +1 -0
  103. package/dist/api/screw.d.ts.map +1 -1
  104. package/dist/api/screw.js +1 -0
  105. package/dist/api/screw.js.map +1 -1
  106. package/dist/api/sdf.d.ts.map +1 -1
  107. package/dist/api/sdf.js +1 -0
  108. package/dist/api/sdf.js.map +1 -1
  109. package/dist/api/sketch.d.ts.map +1 -1
  110. package/dist/api/sketch.js +1 -0
  111. package/dist/api/sketch.js.map +1 -1
  112. package/dist/api/split.d.ts +31 -0
  113. package/dist/api/split.d.ts.map +1 -0
  114. package/dist/api/split.js +96 -0
  115. package/dist/api/split.js.map +1 -0
  116. package/dist/api/surface/arg-spec.d.ts +17 -0
  117. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  118. package/dist/api/surface/arg-spec.js +86 -66
  119. package/dist/api/surface/arg-spec.js.map +1 -1
  120. package/dist/api/surface/projection-overrides.d.ts.map +1 -1
  121. package/dist/api/surface/projection-overrides.js +6 -0
  122. package/dist/api/surface/projection-overrides.js.map +1 -1
  123. package/dist/api/topo-resolve.d.ts.map +1 -1
  124. package/dist/api/topo-resolve.js +65 -3
  125. package/dist/api/topo-resolve.js.map +1 -1
  126. package/dist/api/transform.d.ts +4 -0
  127. package/dist/api/transform.d.ts.map +1 -1
  128. package/dist/api/transform.js +44 -12
  129. package/dist/api/transform.js.map +1 -1
  130. package/dist/boolean/deriveNormals.d.ts +5 -4
  131. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  132. package/dist/boolean/deriveNormals.js +24 -7
  133. package/dist/boolean/deriveNormals.js.map +1 -1
  134. package/dist/brep/brep-ops.d.ts +34 -1
  135. package/dist/brep/brep-ops.d.ts.map +1 -1
  136. package/dist/brep/brep-ops.js +62 -22
  137. package/dist/brep/brep-ops.js.map +1 -1
  138. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  139. package/dist/brep/engine/adapters/brep-mock.js +66 -0
  140. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  141. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  142. package/dist/brep/engine/adapters/brepkit.js +44 -1
  143. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  144. package/dist/brep/engine/adapters/occt.d.ts +1 -5
  145. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  146. package/dist/brep/engine/adapters/occt.js +246 -9
  147. package/dist/brep/engine/adapters/occt.js.map +1 -1
  148. package/dist/brep/engine/primitives.d.ts +96 -0
  149. package/dist/brep/engine/primitives.d.ts.map +1 -1
  150. package/dist/brep/engine/primitives.js.map +1 -1
  151. package/dist/brep/engine/types.d.ts +66 -6
  152. package/dist/brep/engine/types.d.ts.map +1 -1
  153. package/dist/brep/engine/types.js.map +1 -1
  154. package/dist/brep/export/step.d.ts.map +1 -1
  155. package/dist/brep/export/step.js +6 -1
  156. package/dist/brep/export/step.js.map +1 -1
  157. package/dist/brep/face-evolution.d.ts +78 -8
  158. package/dist/brep/face-evolution.d.ts.map +1 -1
  159. package/dist/brep/face-evolution.js +130 -17
  160. package/dist/brep/face-evolution.js.map +1 -1
  161. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  162. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  163. package/dist/brepkit-kernel/brepkitKernel.js +108 -12
  164. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  165. package/dist/browser.d.ts +6 -28
  166. package/dist/browser.d.ts.map +1 -1
  167. package/dist/browser.js +6 -17
  168. package/dist/browser.js.map +1 -1
  169. package/dist/cad-runtime/admit-compat-lib.d.ts +13 -0
  170. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  171. package/dist/cad-runtime/admit-compat-lib.js +27 -0
  172. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  173. package/dist/cad-runtime/backend-dispatch.d.ts +46 -3
  174. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  175. package/dist/cad-runtime/backend-dispatch.js +48 -3
  176. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  177. package/dist/cad-runtime/browser-lib-loader.d.ts +4 -4
  178. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  179. package/dist/cad-runtime/browser-lib-loader.js +7 -4
  180. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  181. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  182. package/dist/cad-runtime/direct-executor.js +14 -4
  183. package/dist/cad-runtime/direct-executor.js.map +1 -1
  184. package/dist/cad-runtime/module-registry.d.ts +3 -1
  185. package/dist/cad-runtime/module-registry.d.ts.map +1 -1
  186. package/dist/cad-runtime/module-registry.js +13 -1
  187. package/dist/cad-runtime/module-registry.js.map +1 -1
  188. package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
  189. package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
  190. package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
  191. package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
  192. package/dist/cad-runtime/runtime.d.ts +52 -2
  193. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  194. package/dist/cad-runtime/runtime.js +180 -9
  195. package/dist/cad-runtime/runtime.js.map +1 -1
  196. package/dist/define-op.d.ts +22 -0
  197. package/dist/define-op.d.ts.map +1 -1
  198. package/dist/define-op.js +82 -12
  199. package/dist/define-op.js.map +1 -1
  200. package/dist/env-agnostic.d.ts +38 -0
  201. package/dist/env-agnostic.d.ts.map +1 -0
  202. package/dist/env-agnostic.js +29 -0
  203. package/dist/env-agnostic.js.map +1 -0
  204. package/dist/fcstd/attachment.d.ts +8 -1
  205. package/dist/fcstd/attachment.d.ts.map +1 -1
  206. package/dist/fcstd/attachment.js +7 -1
  207. package/dist/fcstd/attachment.js.map +1 -1
  208. package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
  209. package/dist/fcstd/build-fai-zip.js +12 -7
  210. package/dist/fcstd/build-fai-zip.js.map +1 -1
  211. package/dist/fcstd/codegen.d.ts +10 -1
  212. package/dist/fcstd/codegen.d.ts.map +1 -1
  213. package/dist/fcstd/codegen.js +158 -49
  214. package/dist/fcstd/codegen.js.map +1 -1
  215. package/dist/fcstd/contour.d.ts.map +1 -1
  216. package/dist/fcstd/contour.js +23 -24
  217. package/dist/fcstd/contour.js.map +1 -1
  218. package/dist/fcstd/convert.d.ts +2 -18
  219. package/dist/fcstd/convert.d.ts.map +1 -1
  220. package/dist/fcstd/convert.js +35 -53
  221. package/dist/fcstd/convert.js.map +1 -1
  222. package/dist/fcstd/expressions.d.ts +24 -0
  223. package/dist/fcstd/expressions.d.ts.map +1 -1
  224. package/dist/fcstd/expressions.js +91 -0
  225. package/dist/fcstd/expressions.js.map +1 -1
  226. package/dist/fcstd/external-geo.d.ts +12 -1
  227. package/dist/fcstd/external-geo.d.ts.map +1 -1
  228. package/dist/fcstd/external-geo.js +15 -1
  229. package/dist/fcstd/external-geo.js.map +1 -1
  230. package/dist/fcstd/feature-translate.d.ts +21 -1
  231. package/dist/fcstd/feature-translate.d.ts.map +1 -1
  232. package/dist/fcstd/feature-translate.js +124 -8
  233. package/dist/fcstd/feature-translate.js.map +1 -1
  234. package/dist/fcstd/structural-types.d.ts +83 -0
  235. package/dist/fcstd/structural-types.d.ts.map +1 -0
  236. package/dist/fcstd/structural-types.js +121 -0
  237. package/dist/fcstd/structural-types.js.map +1 -0
  238. package/dist/index.d.ts +7 -23
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +10 -16
  241. package/dist/index.js.map +1 -1
  242. package/dist/lang/determinism-scanner.d.ts +71 -0
  243. package/dist/lang/determinism-scanner.d.ts.map +1 -0
  244. package/dist/lang/determinism-scanner.js +625 -0
  245. package/dist/lang/determinism-scanner.js.map +1 -0
  246. package/dist/lang/symbol-table.d.ts +31 -0
  247. package/dist/lang/symbol-table.d.ts.map +1 -1
  248. package/dist/lang/symbol-table.generated.d.ts +13 -19
  249. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  250. package/dist/lang/symbol-table.generated.js +13 -19
  251. package/dist/lang/symbol-table.generated.js.map +1 -1
  252. package/dist/lang/symbol-table.js +50 -1
  253. package/dist/lang/symbol-table.js.map +1 -1
  254. package/dist/mesh/creased-normals.d.ts +50 -0
  255. package/dist/mesh/creased-normals.d.ts.map +1 -0
  256. package/dist/mesh/creased-normals.js +114 -0
  257. package/dist/mesh/creased-normals.js.map +1 -0
  258. package/dist/mesh/decoration-provider.d.ts +53 -0
  259. package/dist/mesh/decoration-provider.d.ts.map +1 -0
  260. package/dist/mesh/decoration-provider.js +21 -0
  261. package/dist/mesh/decoration-provider.js.map +1 -0
  262. package/dist/mesh/engrave.d.ts +4 -0
  263. package/dist/mesh/engrave.d.ts.map +1 -1
  264. package/dist/mesh/engrave.js +22 -31
  265. package/dist/mesh/engrave.js.map +1 -1
  266. package/dist/mesh/index.d.ts +5 -14
  267. package/dist/mesh/index.d.ts.map +1 -1
  268. package/dist/mesh/index.js +7 -18
  269. package/dist/mesh/index.js.map +1 -1
  270. package/dist/mesh/io.d.ts +2 -1
  271. package/dist/mesh/io.d.ts.map +1 -1
  272. package/dist/mesh/io.js +5 -7
  273. package/dist/mesh/io.js.map +1 -1
  274. package/dist/mesh/primitives.d.ts +5 -18
  275. package/dist/mesh/primitives.d.ts.map +1 -1
  276. package/dist/mesh/primitives.js +4 -48
  277. package/dist/mesh/primitives.js.map +1 -1
  278. package/dist/mesh/stl-loader.d.ts +23 -0
  279. package/dist/mesh/stl-loader.d.ts.map +1 -0
  280. package/dist/mesh/stl-loader.js +139 -0
  281. package/dist/mesh/stl-loader.js.map +1 -0
  282. package/dist/module-resolver/parse-imports.d.ts +37 -0
  283. package/dist/module-resolver/parse-imports.d.ts.map +1 -0
  284. package/dist/module-resolver/parse-imports.js +39 -0
  285. package/dist/module-resolver/parse-imports.js.map +1 -0
  286. package/dist/module-resolver/resolver.d.ts +1 -1
  287. package/dist/module-resolver/resolver.js +2 -2
  288. package/dist/module-resolver/resolver.js.map +1 -1
  289. package/dist/node-host/cli.d.ts.map +1 -1
  290. package/dist/node-host/cli.js +37 -4
  291. package/dist/node-host/cli.js.map +1 -1
  292. package/dist/primitives/text/cjk-font.d.ts +42 -0
  293. package/dist/primitives/text/cjk-font.d.ts.map +1 -0
  294. package/dist/primitives/text/cjk-font.js +86 -0
  295. package/dist/primitives/text/cjk-font.js.map +1 -0
  296. package/dist/runtime-state.d.ts +18 -6
  297. package/dist/runtime-state.d.ts.map +1 -1
  298. package/dist/runtime-state.js +9 -1
  299. package/dist/runtime-state.js.map +1 -1
  300. package/dist/sdk.d.ts +2 -2
  301. package/dist/sdk.js +2 -2
  302. package/dist/sdk.js.map +1 -1
  303. package/dist/shape.d.ts +15 -0
  304. package/dist/shape.d.ts.map +1 -1
  305. package/dist/shape.js +26 -3
  306. package/dist/shape.js.map +1 -1
  307. package/dist/symbol-table.d.ts +15 -0
  308. package/dist/symbol-table.d.ts.map +1 -0
  309. package/dist/symbol-table.js +14 -0
  310. package/dist/symbol-table.js.map +1 -0
  311. package/dist/topology/naming/build-naming.d.ts +14 -30
  312. package/dist/topology/naming/build-naming.d.ts.map +1 -1
  313. package/dist/topology/naming/build-naming.js +21 -54
  314. package/dist/topology/naming/build-naming.js.map +1 -1
  315. package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
  316. package/dist/topology/naming/capture-topo-ref.js +5 -0
  317. package/dist/topology/naming/capture-topo-ref.js.map +1 -1
  318. package/dist/topology/naming/index.d.ts +3 -0
  319. package/dist/topology/naming/index.d.ts.map +1 -1
  320. package/dist/topology/naming/index.js +3 -0
  321. package/dist/topology/naming/index.js.map +1 -1
  322. package/dist/topology/naming/lineage-resolve.d.ts +80 -0
  323. package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
  324. package/dist/topology/naming/lineage-resolve.js +120 -0
  325. package/dist/topology/naming/lineage-resolve.js.map +1 -0
  326. package/dist/topology/naming/lineage.d.ts +349 -0
  327. package/dist/topology/naming/lineage.d.ts.map +1 -0
  328. package/dist/topology/naming/lineage.js +398 -0
  329. package/dist/topology/naming/lineage.js.map +1 -0
  330. package/dist/topology/naming/migrate.d.ts +41 -0
  331. package/dist/topology/naming/migrate.d.ts.map +1 -0
  332. package/dist/topology/naming/migrate.js +88 -0
  333. package/dist/topology/naming/migrate.js.map +1 -0
  334. package/dist/topology/naming/role-name.d.ts +176 -0
  335. package/dist/topology/naming/role-name.d.ts.map +1 -0
  336. package/dist/topology/naming/role-name.js +344 -0
  337. package/dist/topology/naming/role-name.js.map +1 -0
  338. package/dist/topology/naming/roles.d.ts +20 -22
  339. package/dist/topology/naming/roles.d.ts.map +1 -1
  340. package/dist/topology/naming/roles.js +51 -49
  341. package/dist/topology/naming/roles.js.map +1 -1
  342. package/dist/topology/naming/types.d.ts +65 -18
  343. package/dist/topology/naming/types.d.ts.map +1 -1
  344. package/dist/topology/naming/types.js.map +1 -1
  345. package/dist/vendored/brepjs/kernel/index.d.ts +5 -0
  346. package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
  347. package/dist/vendored/brepjs/kernel/index.js +11 -0
  348. package/dist/vendored/brepjs/kernel/index.js.map +1 -1
  349. package/dist/weapp.d.ts +4 -4
  350. package/dist/weapp.d.ts.map +1 -1
  351. package/dist/weapp.js +7 -4
  352. package/dist/weapp.js.map +1 -1
  353. package/package.json +16 -14
  354. package/dist/api/compat/index.d.ts +0 -173
  355. package/dist/api/compat/index.d.ts.map +0 -1
  356. package/dist/api/compat/index.js +0 -222
  357. package/dist/api/compat/index.js.map +0 -1
  358. package/dist/api/compound.d.ts +0 -108
  359. package/dist/api/compound.d.ts.map +0 -1
  360. package/dist/api/compound.js +0 -162
  361. package/dist/api/compound.js.map +0 -1
  362. package/dist/api/copy.d.ts +0 -39
  363. package/dist/api/copy.d.ts.map +0 -1
  364. package/dist/api/copy.js +0 -81
  365. package/dist/api/copy.js.map +0 -1
  366. package/dist/api/fai_drill.d.ts +0 -46
  367. package/dist/api/fai_drill.d.ts.map +0 -1
  368. package/dist/api/fai_drill.js +0 -230
  369. package/dist/api/fai_drill.js.map +0 -1
  370. package/dist/api/fai_extrude.d.ts +0 -36
  371. package/dist/api/fai_extrude.d.ts.map +0 -1
  372. package/dist/api/fai_extrude.js +0 -78
  373. package/dist/api/fai_extrude.js.map +0 -1
  374. package/dist/api/fai_split.d.ts +0 -46
  375. package/dist/api/fai_split.d.ts.map +0 -1
  376. package/dist/api/fai_split.js +0 -253
  377. package/dist/api/fai_split.js.map +0 -1
  378. package/dist/api/load.d.ts +0 -39
  379. package/dist/api/load.d.ts.map +0 -1
  380. package/dist/api/load.js +0 -82
  381. package/dist/api/load.js.map +0 -1
  382. package/dist/api/svgExtrude.d.ts +0 -32
  383. package/dist/api/svgExtrude.d.ts.map +0 -1
  384. package/dist/api/svgExtrude.js +0 -73
  385. package/dist/api/svgExtrude.js.map +0 -1
  386. package/dist/api/text.d.ts +0 -34
  387. package/dist/api/text.d.ts.map +0 -1
  388. package/dist/api/text.js +0 -100
  389. package/dist/api/text.js.map +0 -1
  390. package/dist/brep/text/fontTestHelper.d.ts +0 -30
  391. package/dist/brep/text/fontTestHelper.d.ts.map +0 -1
  392. package/dist/brep/text/fontTestHelper.js +0 -57
  393. package/dist/brep/text/fontTestHelper.js.map +0 -1
  394. package/dist/cad-runtime/module-executor.d.ts +0 -271
  395. package/dist/cad-runtime/module-executor.d.ts.map +0 -1
  396. package/dist/cad-runtime/module-executor.js +0 -630
  397. package/dist/cad-runtime/module-executor.js.map +0 -1
  398. package/dist/cad-runtime/terminal-dag.d.ts +0 -65
  399. package/dist/cad-runtime/terminal-dag.d.ts.map +0 -1
  400. package/dist/cad-runtime/terminal-dag.js +0 -167
  401. package/dist/cad-runtime/terminal-dag.js.map +0 -1
  402. package/dist/faqts/browser.d.ts +0 -16
  403. package/dist/faqts/browser.d.ts.map +0 -1
  404. package/dist/faqts/browser.js +0 -13
  405. package/dist/faqts/browser.js.map +0 -1
  406. package/dist/faqts/exec-blob.d.ts +0 -14
  407. package/dist/faqts/exec-blob.d.ts.map +0 -1
  408. package/dist/faqts/exec-blob.js +0 -22
  409. package/dist/faqts/exec-blob.js.map +0 -1
  410. package/dist/faqts/exec-node.d.ts +0 -15
  411. package/dist/faqts/exec-node.d.ts.map +0 -1
  412. package/dist/faqts/exec-node.js +0 -29
  413. package/dist/faqts/exec-node.js.map +0 -1
  414. package/dist/faqts/imports.d.ts +0 -74
  415. package/dist/faqts/imports.d.ts.map +0 -1
  416. package/dist/faqts/imports.js +0 -95
  417. package/dist/faqts/imports.js.map +0 -1
  418. package/dist/faqts/index.d.ts +0 -22
  419. package/dist/faqts/index.d.ts.map +0 -1
  420. package/dist/faqts/index.js +0 -21
  421. package/dist/faqts/index.js.map +0 -1
  422. package/dist/faqts/node.d.ts +0 -23
  423. package/dist/faqts/node.d.ts.map +0 -1
  424. package/dist/faqts/node.js +0 -23
  425. package/dist/faqts/node.js.map +0 -1
  426. package/dist/faqts/run.d.ts +0 -62
  427. package/dist/faqts/run.d.ts.map +0 -1
  428. package/dist/faqts/run.js +0 -62
  429. package/dist/faqts/run.js.map +0 -1
  430. package/dist/faqts/transform.d.ts +0 -43
  431. package/dist/faqts/transform.d.ts.map +0 -1
  432. package/dist/faqts/transform.js +0 -35
  433. package/dist/faqts/transform.js.map +0 -1
  434. package/dist/lang/compile.d.ts +0 -50
  435. package/dist/lang/compile.d.ts.map +0 -1
  436. package/dist/lang/compile.js +0 -368
  437. package/dist/lang/compile.js.map +0 -1
  438. package/dist/lang/keep.d.ts +0 -109
  439. package/dist/lang/keep.d.ts.map +0 -1
  440. package/dist/lang/keep.js +0 -226
  441. package/dist/lang/keep.js.map +0 -1
  442. package/dist/lang/parser.d.ts +0 -91
  443. package/dist/lang/parser.d.ts.map +0 -1
  444. package/dist/lang/parser.js +0 -1594
  445. package/dist/lang/parser.js.map +0 -1
  446. package/dist/mesh/drill-hole/DrillHoleCore.d.ts +0 -90
  447. package/dist/mesh/drill-hole/DrillHoleCore.d.ts.map +0 -1
  448. package/dist/mesh/drill-hole/DrillHoleCore.js +0 -287
  449. package/dist/mesh/drill-hole/DrillHoleCore.js.map +0 -1
  450. package/dist/mesh/drill-hole/drill-types.d.ts +0 -34
  451. package/dist/mesh/drill-hole/drill-types.d.ts.map +0 -1
  452. package/dist/mesh/drill-hole/drill-types.js +0 -7
  453. package/dist/mesh/drill-hole/drill-types.js.map +0 -1
  454. package/dist/mesh/fai_drill.d.ts +0 -21
  455. package/dist/mesh/fai_drill.d.ts.map +0 -1
  456. package/dist/mesh/fai_drill.js +0 -92
  457. package/dist/mesh/fai_drill.js.map +0 -1
  458. package/dist/mesh/fai_extrude.d.ts +0 -24
  459. package/dist/mesh/fai_extrude.d.ts.map +0 -1
  460. package/dist/mesh/fai_extrude.js +0 -42
  461. package/dist/mesh/fai_extrude.js.map +0 -1
  462. package/dist/mesh/fai_split.d.ts +0 -164
  463. package/dist/mesh/fai_split.d.ts.map +0 -1
  464. package/dist/mesh/fai_split.js +0 -269
  465. package/dist/mesh/fai_split.js.map +0 -1
  466. package/dist/primitives/svg-extrude.d.ts +0 -43
  467. package/dist/primitives/svg-extrude.d.ts.map +0 -1
  468. package/dist/primitives/svg-extrude.js +0 -78
  469. package/dist/primitives/svg-extrude.js.map +0 -1
  470. package/dist/primitives/text/cjk.d.ts +0 -61
  471. package/dist/primitives/text/cjk.d.ts.map +0 -1
  472. package/dist/primitives/text/cjk.js +0 -215
  473. package/dist/primitives/text/cjk.js.map +0 -1
  474. package/dist/primitives/text-geometry.d.ts +0 -47
  475. package/dist/primitives/text-geometry.d.ts.map +0 -1
  476. package/dist/primitives/text-geometry.js +0 -127
  477. package/dist/primitives/text-geometry.js.map +0 -1
  478. package/dist/test-helpers.d.ts +0 -31
  479. package/dist/test-helpers.d.ts.map +0 -1
  480. package/dist/test-helpers.js +0 -55
  481. package/dist/test-helpers.js.map +0 -1
  482. package/dist/vendored/brepjs/core/kernelReentrancy.d.ts +0 -41
  483. package/dist/vendored/brepjs/core/kernelReentrancy.d.ts.map +0 -1
  484. package/dist/vendored/brepjs/core/kernelReentrancy.js +0 -68
  485. package/dist/vendored/brepjs/core/kernelReentrancy.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/mesh/primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 基本体 API — 从现有纯函数提取的统一接口\n *\n * 提取来源(§5.7):\n * - box/sphere/cylinder/cone/wedge ← engine/primitives/mesh-primitives.ts (makePrimitiveGeo)\n * - text ← engine/components/engraving/EngravingCore.ts (createTextGeometry)\n * - screw ← engine/primitives/screw/screw.ts (makeScrew)\n * - svgExtrude ← engine/primitives/svg-extrude/ (svgToExtrudedGeometry)\n *\n * 所有函数返回 Shape (ManifoldMeshData):THREE.BufferGeometry → geoToManifoldMesh 转换。\n * 坐标系:Z-up、毫米。\n */\n\nimport * as THREE from 'three'\nimport { makePrimitiveGeo } from '../primitives/mesh-primitives'\nimport { geoToManifoldMesh } from '../boolean/csg-backend'\nimport { svgToExtrudedGeometry } from '../primitives/svg-extrude'\nimport type { Shape, BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams, TextParams, SvgExtrudeParams, SdfParams } from './types'\nimport { clampNRad } from './types'\n\n// ── 内部工具 ──\n\n/** THREE.BufferGeometry → Shape (ManifoldMeshData) */\nfunction geoToShape(geo: THREE.BufferGeometry): Shape {\n return geoToManifoldMesh(geo)\n}\n\n// ── 创建 API ──\n\n/**\n * Create a box solid (brepjs contract, §4.1 A 决策).\n *\n * `box(width, depth, height)` — X=width, Y=depth, Z=height — places the\n * min-corner at the origin by default (`centered:false`). `centered: true`\n * centers the box at the origin; `at` is CENTER semantics and takes precedence\n * over `centered`. The `segments` option is consumed by the tessellation\n * caller (this mesh builder keeps it via clampNRad when present).\n *\n * @param params - box parameters (width/depth/height, optional at/centered/segments).\n * @returns the box shape.\n */\nexport function box(params: BoxParams): Shape {\n const { width, depth, height } = params\n // THREE.BoxGeometry(a, b, c) is Y-up (X=a, Y=b, Z=c); after the +90° rotateX\n // the dims map to X=a, Y=c, Z=b. To reach X=width, Y=depth, Z=height the\n // pre-rotation sizes must be (width, height, depth) — 裁决 7 xyz contract.\n const geo = new THREE.BoxGeometry(width, height, depth)\n geo.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2))\n // brepjs box semantics: corner at origin by default; centered at origin when\n // `centered` (no `at`); `at` (CENTER semantics) takes precedence.\n const at = params.at\n let tx = 0\n let ty = 0\n let tz = 0\n if (at !== undefined) {\n ;[tx, ty, tz] = at\n } else if (!params.centered) {\n tx = width / 2\n ty = depth / 2\n tz = height / 2\n }\n if (tx !== 0 || ty !== 0 || tz !== 0) geo.translate(tx, ty, tz)\n return geoToShape(geo)\n}\n\n/**\n * Create a sphere centered at the origin (or the optional `center`).\n *\n * @param params - sphere parameters (radius, optional segments, optional center).\n * @returns the sphere shape.\n */\nexport function sphere(params: SphereParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = makePrimitiveGeo('sphere', params.radius * 2, segs)\n if (params.center) {\n geo.translate(params.center[0], params.center[1], params.center[2])\n }\n return geoToShape(geo)\n}\n\n/**\n * Create a cylinder along +Z (`cylinder(radius, height, { at?, centered?,\n * segments? })` brepjs 契约,§4.3 A 决策;与 brep 路径逐点对齐)。\n *\n * 锚点:`at` 是**底面轴心**(BASE)语义(默认 [0,0,0],底面在原点、+Z 延伸);\n * `centered:true` 指底面落到 −h/2(无 at 时居中到原点)——与 `at` 同给时以\n * `at` 为中心。`segments` 经 clampNRad 消费(P0 §5)。\n *\n * @param params - cylinder parameters (radius, height, optional at/centered/segments).\n * @returns the cylinder shape.\n */\nexport function cylinder(params: CylinderParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = new THREE.CylinderGeometry(params.radius, params.radius, params.height, segs)\n geo.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2))\n // geometry(rotateX 后)沿 z ∈ [-h/2, +h/2](three 默认 Y-up 居中):\n // 目标底面中心 in baseZ = (at?.[2] ?? 0) - (centered ? h/2 : 0) → 平移到 baseZ + h/2。\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n geo.translate(baseX, baseY, baseZ + params.height / 2)\n return geoToShape(geo)\n}\n\n/**\n * Create a cone, or a frustum when the top and bottom radii differ\n * (`cone(bottomRadius, topRadius, height, { at?, centered?, segments? })` brepjs\n * 契约,§4.1 P 决策;与 brep 路径逐点对齐)。\n *\n * 锚点:`at` 是**底面轴心**(BASE)语义(默认 [0,0,0],底面在原点、+Z 延伸);\n * `centered:true` 指底面落到 −h/2(无 at 时居中到原点)——与 `at` 同给时以\n * `at` 为中心。`segments` 经 clampNRad 消费(P0 §5)。\n *\n * @param params - cone parameters (radiusBottom, radiusTop, height, optional at/centered/segments).\n * @returns the cone shape.\n */\nexport function cone(params: ConeParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = new THREE.ConeGeometry(\n Math.max(params.radiusBottom, params.radiusTop),\n params.height,\n segs,\n )\n geo.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2))\n // radiusTop === 0 → 尖锥(ConeGeometry 顶点在顶);其余(含 radiusTop ===\n // radiusBottom 的等径圆柱/圆台)用 CylinderGeometry(radiusTop/bottom 各就各位)。\n let resultGeo: THREE.BufferGeometry\n if (params.radiusTop === 0) {\n resultGeo = geo\n } else {\n const geo2 = new THREE.CylinderGeometry(\n params.radiusTop,\n params.radiusBottom,\n params.height,\n segs,\n )\n geo2.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2))\n resultGeo = geo2\n }\n // geometry(rotateX 后)沿 z ∈ [-h/2, +h/2](three 默认 Y-up 居中):\n // 目标底面中心 in baseZ = (at?.[2] ?? 0) - (centered ? h/2 : 0) → 平坦平移 baseZ + h/2。\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n resultGeo.translate(baseX, baseY, baseZ + params.height / 2)\n return geoToShape(resultGeo)\n}\n\n/**\n * Create a wedge (ramp) solid, fully parameterized and Z-up.\n *\n * @param params - wedge parameters (width, height, angle, length, optional center).\n * @returns the wedge shape.\n */\nexport function wedge(params: WedgeParams): Shape {\n const width = params.width\n const height = params.height\n const angle = params.angle\n const length = params.length\n\n const angleRad = (angle * Math.PI) / 180\n const halfExtrude = length / 2\n const hw = width / 2\n const halfTopWidth = Math.max(0, hw - height / Math.tan(angleRad))\n // 顶边塌缩(斜坡已在宽度内到顶)→ 三角棱柱(与 brep wedge 的退化处理一致,\n // 保证 mesh/brep 同参数 bbox 一致;零面积三角形会破坏 manifold)。\n const degenerate = halfTopWidth <= 1e-12\n\n const positions = degenerate\n ? new Float32Array([\n -halfExtrude, -hw, 0,\n -halfExtrude, hw, 0,\n -halfExtrude, 0, height,\n halfExtrude, -hw, 0,\n halfExtrude, hw, 0,\n halfExtrude, 0, height,\n ])\n : new Float32Array([\n -halfExtrude, -hw, 0,\n -halfExtrude, hw, 0,\n -halfExtrude, halfTopWidth, height,\n -halfExtrude, -halfTopWidth, height,\n halfExtrude, -hw, 0,\n halfExtrude, hw, 0,\n halfExtrude, halfTopWidth, height,\n halfExtrude, -halfTopWidth, height,\n ])\n\n const indices = degenerate\n ? new Uint32Array([\n 0, 1, 2, 3, 5, 4,\n 0, 3, 4, 0, 4, 1,\n 0, 2, 5, 0, 5, 3,\n 1, 4, 5, 1, 5, 2,\n ])\n : new Uint32Array([\n 0, 1, 2, 0, 2, 3,\n 4, 6, 5, 4, 7, 6,\n 0, 4, 5, 0, 5, 1,\n 3, 2, 6, 3, 6, 7,\n 0, 3, 7, 0, 7, 4,\n 1, 5, 6, 1, 6, 2,\n ])\n\n const geo = new THREE.BufferGeometry()\n geo.setAttribute('position', new THREE.BufferAttribute(positions, 3))\n geo.setIndex(new THREE.BufferAttribute(indices, 1))\n\n if (params.center) {\n geo.translate(params.center[0], params.center[1], params.center[2])\n }\n return geoToShape(geo)\n}\n\n/**\n * Create text geometry. Font loading is asynchronous, so this function is\n * async; CJK text is rendered with the system font when one is available.\n *\n * @param params - text parameters (text, size, depth).\n * @returns the text shape.\n */\nexport async function text(params: TextParams): Promise<Shape> {\n const { getOpentypeFont, createTextGeometry } = await import(\n '../primitives/text-geometry'\n )\n const { containsCjk, loadSystemCjkFont, createMixedTextGeometry } = await import(\n '../primitives/text/cjk'\n )\n const font = await getOpentypeFont()\n let geo: THREE.BufferGeometry\n if (containsCjk(params.text)) {\n const cjkFont = await loadSystemCjkFont()\n if (cjkFont) {\n geo = await createMixedTextGeometry(params.text, params.size, params.depth, cjkFont.font, font)\n } else {\n // No CJK font available: replace CJK chars with '?' so geometry still\n // can be created (graceful degradation). Without this, createTextGeometry\n // would throw because CJK glyphs are .notdef in OpenSans Regular.\n const fallback = params.text.replace(/[\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u2F800-\\u2FA1F\\u3000-\\u303F\\uFF00-\\uFFEF]/g, '?')\n geo = await createTextGeometry(fallback, params.size, params.depth, font)\n }\n } else {\n geo = await createTextGeometry(params.text, params.size, params.depth, font)\n }\n return geoToShape(geo)\n}\n\n/**\n * Create a screw (threaded) geometry.\n *\n * @param params - screw parameters (system, specIdx, thread, length, head, optional pitchCustom and nRad).\n * @returns the screw shape.\n */\nexport async function screw(params: {\n system: 'metric' | 'imperial'\n specIdx: number\n thread: 'coarse' | 'fine' | 'custom' | 'none'\n pitchCustom?: number\n length: number\n head: 'hex' | 'chc' | 'none'\n nRad?: number\n}): Promise<Shape> {\n const { makeScrew } = await import('../primitives/screw/screw')\n const geo = makeScrew({\n system: params.system,\n specIdx: params.specIdx,\n thread: params.thread,\n pitchCustom: params.pitchCustom ?? 0,\n length: params.length,\n head: params.head,\n nRad: clampNRad(params.nRad),\n })\n return geoToShape(geo)\n}\n\n/**\n * Create an extruded geometry from an SVG source.\n *\n * @param params - SVG extrude parameters (svg, depth, target size, optional natural size).\n * @returns the extruded shape.\n */\nexport function svgExtrude(params: SvgExtrudeParams): Shape {\n const geo = svgToExtrudedGeometry(params.svg, {\n depth: params.depth,\n targetLongSide: params.targetLongSide ?? 20,\n naturalWidth: params.naturalWidth ?? 0,\n naturalHeight: params.naturalHeight ?? 0,\n })\n return geoToShape(geo)\n}\n\n/**\n * Create a mesh from SDF (signed distance field) code, sampling the field with\n * marching cubes.\n *\n * @param params - SDF parameters (code, optional bounds, params, resolution).\n * @returns the sampled shape.\n */\nexport async function sdf(params: SdfParams): Promise<Shape> {\n const { runSdf } = await import('../sdf/sdf-runner')\n const box = params.box ?? [[-10, -10, -10], [10, 10, 10]]\n const bounds: [number, number, number, number, number, number] = [\n box[0][0], box[0][1], box[0][2],\n box[1][0], box[1][1], box[1][2],\n ]\n const mesh = await runSdf(\n params.code,\n params.params ?? {},\n bounds,\n params.resolution ?? 1.0,\n )\n return { positions: mesh.positions, indices: mesh.indices }\n}\n"]}
1
+ {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/mesh/primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 基本体 API — 从现有纯函数提取的统一接口\n *\n * 提取来源(§5.7):\n * - box/sphere/cylinder/cone/wedge ← engine/primitives/mesh-primitives.ts (makePrimitiveGeo)\n * - screw ← engine/primitives/screw/screw.ts (makeScrew)\n *\n * `text` / `svgExtrude`(three 的 Shape / ExtrudeGeometry / SVGLoader 链)已随\n * B 组迁到 `@faicad/faijs-extra` 的 `mesh/primitives.ts`,core 的 mesh 面不再\n * 承载 three 的非基础几何生成链。\n *\n * 所有函数返回 Shape (ManifoldMeshData):THREE.BufferGeometry → geoToManifoldMesh 转换。\n * 坐标系:Z-up、毫米。\n */\n\nimport * as THREE from 'three'\nimport { makePrimitiveGeo } from '../primitives/mesh-primitives'\nimport { geoToManifoldMesh } from '../boolean/csg-backend'\nimport type { Shape, BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams, SdfParams } from './types'\nimport { clampNRad } from './types'\n\n// ── 内部工具 ──\n\n/** THREE.BufferGeometry → Shape (ManifoldMeshData) */\nfunction geoToShape(geo: THREE.BufferGeometry): Shape {\n return geoToManifoldMesh(geo)\n}\n\n// ── 创建 API ──\n\n/**\n * Create a box solid (brepjs contract, §4.1 A 决策).\n *\n * `box(width, depth, height)` — X=width, Y=depth, Z=height — places the\n * min-corner at the origin by default (`centered:false`). `centered: true`\n * centers the box at the origin; `at` is CENTER semantics and takes precedence\n * over `centered`. The `segments` option is consumed by the tessellation\n * caller (this mesh builder keeps it via clampNRad when present).\n *\n * @param params - box parameters (width/depth/height, optional at/centered/segments).\n * @returns the box shape.\n */\nexport function box(params: BoxParams): Shape {\n const { width, depth, height } = params\n // THREE.BoxGeometry(a, b, c) is Y-up (X=a, Y=b, Z=c); after the +90° rotateX\n // the dims map to X=a, Y=c, Z=b. To reach X=width, Y=depth, Z=height the\n // pre-rotation sizes must be (width, height, depth) — 裁决 7 xyz contract.\n const geo = new THREE.BoxGeometry(width, height, depth)\n geo.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2))\n // brepjs box semantics: corner at origin by default; centered at origin when\n // `centered` (no `at`); `at` (CENTER semantics) takes precedence.\n const at = params.at\n let tx = 0\n let ty = 0\n let tz = 0\n if (at !== undefined) {\n ;[tx, ty, tz] = at\n } else if (!params.centered) {\n tx = width / 2\n ty = depth / 2\n tz = height / 2\n }\n if (tx !== 0 || ty !== 0 || tz !== 0) geo.translate(tx, ty, tz)\n return geoToShape(geo)\n}\n\n/**\n * Create a sphere centered at the origin (or the optional `center`).\n *\n * @param params - sphere parameters (radius, optional segments, optional center).\n * @returns the sphere shape.\n */\nexport function sphere(params: SphereParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = makePrimitiveGeo('sphere', params.radius * 2, segs)\n if (params.center) {\n geo.translate(params.center[0], params.center[1], params.center[2])\n }\n return geoToShape(geo)\n}\n\n/**\n * Create a cylinder along +Z (`cylinder(radius, height, { at?, centered?,\n * segments? })` brepjs 契约,§4.3 A 决策;与 brep 路径逐点对齐)。\n *\n * 锚点:`at` 是**底面轴心**(BASE)语义(默认 [0,0,0],底面在原点、+Z 延伸);\n * `centered:true` 指底面落到 −h/2(无 at 时居中到原点)——与 `at` 同给时以\n * `at` 为中心。`segments` 经 clampNRad 消费(P0 §5)。\n *\n * @param params - cylinder parameters (radius, height, optional at/centered/segments).\n * @returns the cylinder shape.\n */\nexport function cylinder(params: CylinderParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = new THREE.CylinderGeometry(params.radius, params.radius, params.height, segs)\n geo.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2))\n // geometry(rotateX 后)沿 z ∈ [-h/2, +h/2](three 默认 Y-up 居中):\n // 目标底面中心 in baseZ = (at?.[2] ?? 0) - (centered ? h/2 : 0) → 平移到 baseZ + h/2。\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n geo.translate(baseX, baseY, baseZ + params.height / 2)\n return geoToShape(geo)\n}\n\n/**\n * Create a cone, or a frustum when the top and bottom radii differ\n * (`cone(bottomRadius, topRadius, height, { at?, centered?, segments? })` brepjs\n * 契约,§4.1 P 决策;与 brep 路径逐点对齐)。\n *\n * 锚点:`at` 是**底面轴心**(BASE)语义(默认 [0,0,0],底面在原点、+Z 延伸);\n * `centered:true` 指底面落到 −h/2(无 at 时居中到原点)——与 `at` 同给时以\n * `at` 为中心。`segments` 经 clampNRad 消费(P0 §5)。\n *\n * @param params - cone parameters (radiusBottom, radiusTop, height, optional at/centered/segments).\n * @returns the cone shape.\n */\nexport function cone(params: ConeParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = new THREE.ConeGeometry(\n Math.max(params.radiusBottom, params.radiusTop),\n params.height,\n segs,\n )\n geo.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2))\n // radiusTop === 0 → 尖锥(ConeGeometry 顶点在顶);其余(含 radiusTop ===\n // radiusBottom 的等径圆柱/圆台)用 CylinderGeometry(radiusTop/bottom 各就各位)。\n let resultGeo: THREE.BufferGeometry\n if (params.radiusTop === 0) {\n resultGeo = geo\n } else {\n const geo2 = new THREE.CylinderGeometry(\n params.radiusTop,\n params.radiusBottom,\n params.height,\n segs,\n )\n geo2.applyMatrix4(new THREE.Matrix4().makeRotationX(Math.PI / 2))\n resultGeo = geo2\n }\n // geometry(rotateX 后)沿 z ∈ [-h/2, +h/2](three 默认 Y-up 居中):\n // 目标底面中心 in baseZ = (at?.[2] ?? 0) - (centered ? h/2 : 0) → 平坦平移 baseZ + h/2。\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n resultGeo.translate(baseX, baseY, baseZ + params.height / 2)\n return geoToShape(resultGeo)\n}\n\n/**\n * Create a wedge (ramp) solid, fully parameterized and Z-up.\n *\n * @param params - wedge parameters (width, height, angle, length, optional center).\n * @returns the wedge shape.\n */\nexport function wedge(params: WedgeParams): Shape {\n const width = params.width\n const height = params.height\n const angle = params.angle\n const length = params.length\n\n const angleRad = (angle * Math.PI) / 180\n const halfExtrude = length / 2\n const hw = width / 2\n const halfTopWidth = Math.max(0, hw - height / Math.tan(angleRad))\n // 顶边塌缩(斜坡已在宽度内到顶)→ 三角棱柱(与 brep wedge 的退化处理一致,\n // 保证 mesh/brep 同参数 bbox 一致;零面积三角形会破坏 manifold)。\n const degenerate = halfTopWidth <= 1e-12\n\n const positions = degenerate\n ? new Float32Array([\n -halfExtrude, -hw, 0,\n -halfExtrude, hw, 0,\n -halfExtrude, 0, height,\n halfExtrude, -hw, 0,\n halfExtrude, hw, 0,\n halfExtrude, 0, height,\n ])\n : new Float32Array([\n -halfExtrude, -hw, 0,\n -halfExtrude, hw, 0,\n -halfExtrude, halfTopWidth, height,\n -halfExtrude, -halfTopWidth, height,\n halfExtrude, -hw, 0,\n halfExtrude, hw, 0,\n halfExtrude, halfTopWidth, height,\n halfExtrude, -halfTopWidth, height,\n ])\n\n const indices = degenerate\n ? new Uint32Array([\n 0, 1, 2, 3, 5, 4,\n 0, 3, 4, 0, 4, 1,\n 0, 2, 5, 0, 5, 3,\n 1, 4, 5, 1, 5, 2,\n ])\n : new Uint32Array([\n 0, 1, 2, 0, 2, 3,\n 4, 6, 5, 4, 7, 6,\n 0, 4, 5, 0, 5, 1,\n 3, 2, 6, 3, 6, 7,\n 0, 3, 7, 0, 7, 4,\n 1, 5, 6, 1, 6, 2,\n ])\n\n const geo = new THREE.BufferGeometry()\n geo.setAttribute('position', new THREE.BufferAttribute(positions, 3))\n geo.setIndex(new THREE.BufferAttribute(indices, 1))\n\n if (params.center) {\n geo.translate(params.center[0], params.center[1], params.center[2])\n }\n return geoToShape(geo)\n}\n\n/**\n * Create a screw (threaded) geometry.\n *\n * @param params - screw parameters (system, specIdx, thread, length, head, optional pitchCustom and nRad).\n * @returns the screw shape.\n */\nexport async function screw(params: {\n system: 'metric' | 'imperial'\n specIdx: number\n thread: 'coarse' | 'fine' | 'custom' | 'none'\n pitchCustom?: number\n length: number\n head: 'hex' | 'chc' | 'none'\n nRad?: number\n}): Promise<Shape> {\n const { makeScrew } = await import('../primitives/screw/screw')\n const geo = makeScrew({\n system: params.system,\n specIdx: params.specIdx,\n thread: params.thread,\n pitchCustom: params.pitchCustom ?? 0,\n length: params.length,\n head: params.head,\n nRad: clampNRad(params.nRad),\n })\n return geoToShape(geo)\n}\n\n/**\n * Create a mesh from SDF (signed distance field) code, sampling the field with\n * marching cubes.\n *\n * @param params - SDF parameters (code, optional bounds, params, resolution).\n * @returns the sampled shape.\n */\nexport async function sdf(params: SdfParams): Promise<Shape> {\n const { runSdf } = await import('../sdf/sdf-runner')\n const box = params.box ?? [[-10, -10, -10], [10, 10, 10]]\n const bounds: [number, number, number, number, number, number] = [\n box[0][0], box[0][1], box[0][2],\n box[1][0], box[1][1], box[1][2],\n ]\n const mesh = await runSdf(\n params.code,\n params.params ?? {},\n bounds,\n params.resolution ?? 1.0,\n )\n return { positions: mesh.positions, indices: mesh.indices }\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * stl-loader — minimal STL parser (binary + ASCII), zero addons.
3
+ *
4
+ * Why hand-written: three's `STLLoader` lives in `three/examples/jsm/`, which is
5
+ * outside three's version-compatibility promise and would pull a second,
6
+ * unpinnable module into every faijs consumer — including the weapp worker,
7
+ * whose bundle must stay free of the addons. Precedent: `mesh/creased-normals.ts`
8
+ * ports three's `toCreasedNormals` for exactly this reason.
9
+ *
10
+ * Output matches `STLLoader.parse()`: a non-indexed `BufferGeometry` carrying
11
+ * `position` (one vertex triple per triangle, duplicates preserved) and `normal`
12
+ * attributes, so callers can keep using `geoToManifoldMesh` for welding.
13
+ */
14
+ import * as THREE from 'three';
15
+ /**
16
+ * Parse STL bytes into a non-indexed BufferGeometry.
17
+ *
18
+ * @param buffer - the raw STL file bytes (binary or ASCII).
19
+ * @returns the parsed geometry (empty when the file holds no triangle).
20
+ * @throws when the buffer is neither a well-formed binary nor ASCII STL.
21
+ */
22
+ export declare function parseStl(buffer: ArrayBuffer): THREE.BufferGeometry;
23
+ //# sourceMappingURL=stl-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stl-loader.d.ts","sourceRoot":"","sources":["../../src/mesh/stl-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA4H9B;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC,cAAc,CAKlE"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * stl-loader — minimal STL parser (binary + ASCII), zero addons.
3
+ *
4
+ * Why hand-written: three's `STLLoader` lives in `three/examples/jsm/`, which is
5
+ * outside three's version-compatibility promise and would pull a second,
6
+ * unpinnable module into every faijs consumer — including the weapp worker,
7
+ * whose bundle must stay free of the addons. Precedent: `mesh/creased-normals.ts`
8
+ * ports three's `toCreasedNormals` for exactly this reason.
9
+ *
10
+ * Output matches `STLLoader.parse()`: a non-indexed `BufferGeometry` carrying
11
+ * `position` (one vertex triple per triangle, duplicates preserved) and `normal`
12
+ * attributes, so callers can keep using `geoToManifoldMesh` for welding.
13
+ */
14
+ import * as THREE from 'three';
15
+ /** Binary STL layout: 80-byte header + uint32 count + 50 bytes per triangle. */
16
+ const BINARY_HEADER_BYTES = 80;
17
+ const BINARY_TRIANGLE_BYTES = 50;
18
+ /**
19
+ * Decide whether `buffer` is a binary STL by checking the declared triangle
20
+ * count against the file size (the same test `STLLoader` uses).
21
+ *
22
+ * @param buffer - the raw file bytes.
23
+ * @returns true when the buffer is binary STL.
24
+ */
25
+ function isBinaryStl(buffer) {
26
+ if (buffer.byteLength < BINARY_HEADER_BYTES + 4)
27
+ return false;
28
+ const view = new DataView(buffer);
29
+ const triangles = view.getUint32(BINARY_HEADER_BYTES, true);
30
+ if (triangles === 0)
31
+ return false;
32
+ return BINARY_HEADER_BYTES + 4 + triangles * BINARY_TRIANGLE_BYTES === buffer.byteLength;
33
+ }
34
+ /** Normalize a triangle normal, falling back to the geometric one. */
35
+ function normalOf(ax, ay, az, bx, by, bz, cx, cy, cz) {
36
+ const ux = bx - ax, uy = by - ay, uz = bz - az;
37
+ const vx = cx - ax, vy = cy - ay, vz = cz - az;
38
+ const nx = uy * vz - uz * vy;
39
+ const ny = uz * vx - ux * vz;
40
+ const nz = ux * vy - uy * vx;
41
+ const len = Math.hypot(nx, ny, nz);
42
+ if (len < 1e-20)
43
+ return [0, 0, 0];
44
+ return [nx / len, ny / len, nz / len];
45
+ }
46
+ function parseBinary(buffer) {
47
+ const view = new DataView(buffer);
48
+ const triangles = view.getUint32(BINARY_HEADER_BYTES, true);
49
+ const positions = new Float32Array(triangles * 9);
50
+ const normals = new Float32Array(triangles * 9);
51
+ let offset = BINARY_HEADER_BYTES + 4;
52
+ for (let t = 0; t < triangles; t++) {
53
+ // Stored facet normal — used when it is a usable unit vector.
54
+ let nx = view.getFloat32(offset, true);
55
+ let ny = view.getFloat32(offset + 4, true);
56
+ let nz = view.getFloat32(offset + 8, true);
57
+ const stored = Math.hypot(nx, ny, nz);
58
+ offset += 12;
59
+ const base = t * 9;
60
+ for (let v = 0; v < 3; v++) {
61
+ positions[base + v * 3] = view.getFloat32(offset, true);
62
+ positions[base + v * 3 + 1] = view.getFloat32(offset + 4, true);
63
+ positions[base + v * 3 + 2] = view.getFloat32(offset + 8, true);
64
+ offset += 12;
65
+ }
66
+ if (stored < 1e-20) {
67
+ ;
68
+ [nx, ny, nz] = normalOf(positions[base], positions[base + 1], positions[base + 2], positions[base + 3], positions[base + 4], positions[base + 5], positions[base + 6], positions[base + 7], positions[base + 8]);
69
+ }
70
+ else {
71
+ nx /= stored;
72
+ ny /= stored;
73
+ nz /= stored;
74
+ }
75
+ for (let v = 0; v < 3; v++) {
76
+ normals[base + v * 3] = nx;
77
+ normals[base + v * 3 + 1] = ny;
78
+ normals[base + v * 3 + 2] = nz;
79
+ }
80
+ offset += 2; // attribute byte count
81
+ }
82
+ const geo = new THREE.BufferGeometry();
83
+ geo.setAttribute('position', new THREE.BufferAttribute(positions, 3));
84
+ geo.setAttribute('normal', new THREE.BufferAttribute(normals, 3));
85
+ return geo;
86
+ }
87
+ function parseAscii(buffer) {
88
+ const text = new TextDecoder().decode(new Uint8Array(buffer));
89
+ const vertices = [];
90
+ const normals = [];
91
+ let facetNormal = null;
92
+ const pending = [];
93
+ const flush = () => {
94
+ if (pending.length !== 9)
95
+ return;
96
+ vertices.push(...pending);
97
+ const n = facetNormal ?? normalOf(pending[0], pending[1], pending[2], pending[3], pending[4], pending[5], pending[6], pending[7], pending[8]);
98
+ for (let v = 0; v < 3; v++)
99
+ normals.push(n[0], n[1], n[2]);
100
+ pending.length = 0;
101
+ };
102
+ for (const rawLine of text.split('\n')) {
103
+ const line = rawLine.trim();
104
+ if (line.startsWith('facet normal')) {
105
+ flush();
106
+ const parts = line.split(/\s+/);
107
+ facetNormal = [Number(parts[2]), Number(parts[3]), Number(parts[4])];
108
+ continue;
109
+ }
110
+ if (line.startsWith('vertex')) {
111
+ const parts = line.split(/\s+/);
112
+ pending.push(Number(parts[1]), Number(parts[2]), Number(parts[3]));
113
+ continue;
114
+ }
115
+ if (line.startsWith('endfacet')) {
116
+ flush();
117
+ facetNormal = null;
118
+ }
119
+ }
120
+ flush();
121
+ const geo = new THREE.BufferGeometry();
122
+ geo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));
123
+ geo.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3));
124
+ return geo;
125
+ }
126
+ /**
127
+ * Parse STL bytes into a non-indexed BufferGeometry.
128
+ *
129
+ * @param buffer - the raw STL file bytes (binary or ASCII).
130
+ * @returns the parsed geometry (empty when the file holds no triangle).
131
+ * @throws when the buffer is neither a well-formed binary nor ASCII STL.
132
+ */
133
+ export function parseStl(buffer) {
134
+ if (buffer.byteLength === 0) {
135
+ throw new Error('[mesh/stl-loader] empty STL buffer');
136
+ }
137
+ return isBinaryStl(buffer) ? parseBinary(buffer) : parseAscii(buffer);
138
+ }
139
+ //# sourceMappingURL=stl-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stl-loader.js","sourceRoot":"","sources":["../../src/mesh/stl-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stl-loader — minimal STL parser (binary + ASCII), zero addons.\n *\n * Why hand-written: three's `STLLoader` lives in `three/examples/jsm/`, which is\n * outside three's version-compatibility promise and would pull a second,\n * unpinnable module into every faijs consumer — including the weapp worker,\n * whose bundle must stay free of the addons. Precedent: `mesh/creased-normals.ts`\n * ports three's `toCreasedNormals` for exactly this reason.\n *\n * Output matches `STLLoader.parse()`: a non-indexed `BufferGeometry` carrying\n * `position` (one vertex triple per triangle, duplicates preserved) and `normal`\n * attributes, so callers can keep using `geoToManifoldMesh` for welding.\n */\nimport * as THREE from 'three'\n\n/** Binary STL layout: 80-byte header + uint32 count + 50 bytes per triangle. */\nconst BINARY_HEADER_BYTES = 80\nconst BINARY_TRIANGLE_BYTES = 50\n\n/**\n * Decide whether `buffer` is a binary STL by checking the declared triangle\n * count against the file size (the same test `STLLoader` uses).\n *\n * @param buffer - the raw file bytes.\n * @returns true when the buffer is binary STL.\n */\nfunction isBinaryStl(buffer: ArrayBuffer): boolean {\n if (buffer.byteLength < BINARY_HEADER_BYTES + 4) return false\n const view = new DataView(buffer)\n const triangles = view.getUint32(BINARY_HEADER_BYTES, true)\n if (triangles === 0) return false\n return BINARY_HEADER_BYTES + 4 + triangles * BINARY_TRIANGLE_BYTES === buffer.byteLength\n}\n\n/** Normalize a triangle normal, falling back to the geometric one. */\nfunction normalOf(\n ax: number, ay: number, az: number,\n bx: number, by: number, bz: number,\n cx: number, cy: number, cz: number,\n): [number, number, number] {\n const ux = bx - ax, uy = by - ay, uz = bz - az\n const vx = cx - ax, vy = cy - ay, vz = cz - az\n const nx = uy * vz - uz * vy\n const ny = uz * vx - ux * vz\n const nz = ux * vy - uy * vx\n const len = Math.hypot(nx, ny, nz)\n if (len < 1e-20) return [0, 0, 0]\n return [nx / len, ny / len, nz / len]\n}\n\nfunction parseBinary(buffer: ArrayBuffer): THREE.BufferGeometry {\n const view = new DataView(buffer)\n const triangles = view.getUint32(BINARY_HEADER_BYTES, true)\n const positions = new Float32Array(triangles * 9)\n const normals = new Float32Array(triangles * 9)\n let offset = BINARY_HEADER_BYTES + 4\n for (let t = 0; t < triangles; t++) {\n // Stored facet normal — used when it is a usable unit vector.\n let nx = view.getFloat32(offset, true)\n let ny = view.getFloat32(offset + 4, true)\n let nz = view.getFloat32(offset + 8, true)\n const stored = Math.hypot(nx, ny, nz)\n offset += 12\n const base = t * 9\n for (let v = 0; v < 3; v++) {\n positions[base + v * 3] = view.getFloat32(offset, true)\n positions[base + v * 3 + 1] = view.getFloat32(offset + 4, true)\n positions[base + v * 3 + 2] = view.getFloat32(offset + 8, true)\n offset += 12\n }\n if (stored < 1e-20) {\n ;[nx, ny, nz] = normalOf(\n positions[base], positions[base + 1], positions[base + 2],\n positions[base + 3], positions[base + 4], positions[base + 5],\n positions[base + 6], positions[base + 7], positions[base + 8],\n )\n } else {\n nx /= stored; ny /= stored; nz /= stored\n }\n for (let v = 0; v < 3; v++) {\n normals[base + v * 3] = nx\n normals[base + v * 3 + 1] = ny\n normals[base + v * 3 + 2] = nz\n }\n offset += 2 // attribute byte count\n }\n const geo = new THREE.BufferGeometry()\n geo.setAttribute('position', new THREE.BufferAttribute(positions, 3))\n geo.setAttribute('normal', new THREE.BufferAttribute(normals, 3))\n return geo\n}\n\nfunction parseAscii(buffer: ArrayBuffer): THREE.BufferGeometry {\n const text = new TextDecoder().decode(new Uint8Array(buffer))\n const vertices: number[] = []\n const normals: number[] = []\n let facetNormal: [number, number, number] | null = null\n const pending: number[] = []\n\n const flush = (): void => {\n if (pending.length !== 9) return\n vertices.push(...pending)\n const n = facetNormal ?? normalOf(\n pending[0], pending[1], pending[2],\n pending[3], pending[4], pending[5],\n pending[6], pending[7], pending[8],\n )\n for (let v = 0; v < 3; v++) normals.push(n[0], n[1], n[2])\n pending.length = 0\n }\n\n for (const rawLine of text.split('\\n')) {\n const line = rawLine.trim()\n if (line.startsWith('facet normal')) {\n flush()\n const parts = line.split(/\\s+/)\n facetNormal = [Number(parts[2]), Number(parts[3]), Number(parts[4])]\n continue\n }\n if (line.startsWith('vertex')) {\n const parts = line.split(/\\s+/)\n pending.push(Number(parts[1]), Number(parts[2]), Number(parts[3]))\n continue\n }\n if (line.startsWith('endfacet')) {\n flush()\n facetNormal = null\n }\n }\n flush()\n\n const geo = new THREE.BufferGeometry()\n geo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3))\n geo.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3))\n return geo\n}\n\n/**\n * Parse STL bytes into a non-indexed BufferGeometry.\n *\n * @param buffer - the raw STL file bytes (binary or ASCII).\n * @returns the parsed geometry (empty when the file holds no triangle).\n * @throws when the buffer is neither a well-formed binary nor ASCII STL.\n */\nexport function parseStl(buffer: ArrayBuffer): THREE.BufferGeometry {\n if (buffer.byteLength === 0) {\n throw new Error('[mesh/stl-loader] empty STL buffer')\n }\n return isBinaryStl(buffer) ? parseBinary(buffer) : parseAscii(buffer)\n}\n"]}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * parse-imports — 顶层 import 声明定位(span 提取)
3
+ *
4
+ * 通用模块解析能力:acorn 解析模块源码,返回每个静态顶层 import 声明在
5
+ * 源码中的精确 span(specifier 的 start/end 偏移),供调用方做字符串级
6
+ * 重写(不重建 AST,保持行号/注释/格式)。由 `module-resolver/resolver.ts`
7
+ * 与其它需要 import 定位的通道复用。
8
+ *
9
+ * 只处理顶层静态 import 声明(ESM);动态 `import()` 是运行时行为,不在
10
+ * span 提取范围内。
11
+ */
12
+ /**
13
+ * The exact location of one static import declaration within module source,
14
+ * used to rewrite its specifier without rebuilding the AST.
15
+ */
16
+ export interface ImportSpan {
17
+ /** import 声明的原始说明符,如 `./partner`、`@faicad/faijs/sdk` */
18
+ specifier: string;
19
+ /** 说明符字符串在源码中的起始偏移(不含引号) */
20
+ start: number;
21
+ /** 说明符字符串在源码中的结束偏移(不含引号) */
22
+ end: number;
23
+ /** 是否裸说明符(既非相对路径也非绝对 URL) */
24
+ bare: boolean;
25
+ }
26
+ /**
27
+ * Parse module source (plain JS) and return the specifier and location of
28
+ * every static top-level import declaration. Dynamic import() is runtime
29
+ * behavior and is not part of the rewrite scope.
30
+ *
31
+ * The input is expected to be plain JS — the caller is responsible for
32
+ * ensuring the source is de-typed (libraries ship compiled JS at runtime).
33
+ * @param code - the module JavaScript source text.
34
+ * @returns an array of import spans covering each static import declaration.
35
+ */
36
+ export declare function findImports(code: string): ImportSpan[];
37
+ //# sourceMappingURL=parse-imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-imports.d.ts","sourceRoot":"","sources":["../../src/module-resolver/parse-imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAA;IACjB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAA;CACd;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAatD"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * parse-imports — 顶层 import 声明定位(span 提取)
3
+ *
4
+ * 通用模块解析能力:acorn 解析模块源码,返回每个静态顶层 import 声明在
5
+ * 源码中的精确 span(specifier 的 start/end 偏移),供调用方做字符串级
6
+ * 重写(不重建 AST,保持行号/注释/格式)。由 `module-resolver/resolver.ts`
7
+ * 与其它需要 import 定位的通道复用。
8
+ *
9
+ * 只处理顶层静态 import 声明(ESM);动态 `import()` 是运行时行为,不在
10
+ * span 提取范围内。
11
+ */
12
+ import { parse } from 'acorn';
13
+ /**
14
+ * Parse module source (plain JS) and return the specifier and location of
15
+ * every static top-level import declaration. Dynamic import() is runtime
16
+ * behavior and is not part of the rewrite scope.
17
+ *
18
+ * The input is expected to be plain JS — the caller is responsible for
19
+ * ensuring the source is de-typed (libraries ship compiled JS at runtime).
20
+ * @param code - the module JavaScript source text.
21
+ * @returns an array of import spans covering each static import declaration.
22
+ */
23
+ export function findImports(code) {
24
+ const ast = parse(code, { ecmaVersion: 'latest', sourceType: 'module' });
25
+ const spans = [];
26
+ for (const node of ast.body) {
27
+ if (node.type !== 'ImportDeclaration')
28
+ continue;
29
+ const src = node.source;
30
+ if (!src || src.start === undefined || src.end === undefined)
31
+ continue;
32
+ const spec = src.value;
33
+ const bare = !spec.startsWith('.') && !/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(spec);
34
+ // acorn 的 source.start/end 覆盖含引号的字符串字面量 → 收缩到不含引号的内容
35
+ spans.push({ specifier: spec, start: src.start + 1, end: src.end - 1, bare });
36
+ }
37
+ return spans;
38
+ }
39
+ //# sourceMappingURL=parse-imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-imports.js","sourceRoot":"","sources":["../../src/module-resolver/parse-imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAiB7B;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;IACxE,MAAM,KAAK,GAAiB,EAAE,CAAA;IAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB;YAAE,SAAQ;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAyD,CAAA;QAC1E,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;YAAE,SAAQ;QACtE,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAA;QACtB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7E,qDAAqD;QACrD,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC","sourcesContent":["/**\n * parse-imports — 顶层 import 声明定位(span 提取)\n *\n * 通用模块解析能力:acorn 解析模块源码,返回每个静态顶层 import 声明在\n * 源码中的精确 span(specifier 的 start/end 偏移),供调用方做字符串级\n * 重写(不重建 AST,保持行号/注释/格式)。由 `module-resolver/resolver.ts`\n * 与其它需要 import 定位的通道复用。\n *\n * 只处理顶层静态 import 声明(ESM);动态 `import()` 是运行时行为,不在\n * span 提取范围内。\n */\n\nimport { parse } from 'acorn'\n\n/**\n * The exact location of one static import declaration within module source,\n * used to rewrite its specifier without rebuilding the AST.\n */\nexport interface ImportSpan {\n /** import 声明的原始说明符,如 `./partner`、`@faicad/faijs/sdk` */\n specifier: string\n /** 说明符字符串在源码中的起始偏移(不含引号) */\n start: number\n /** 说明符字符串在源码中的结束偏移(不含引号) */\n end: number\n /** 是否裸说明符(既非相对路径也非绝对 URL) */\n bare: boolean\n}\n\n/**\n * Parse module source (plain JS) and return the specifier and location of\n * every static top-level import declaration. Dynamic import() is runtime\n * behavior and is not part of the rewrite scope.\n *\n * The input is expected to be plain JS — the caller is responsible for\n * ensuring the source is de-typed (libraries ship compiled JS at runtime).\n * @param code - the module JavaScript source text.\n * @returns an array of import spans covering each static import declaration.\n */\nexport function findImports(code: string): ImportSpan[] {\n const ast = parse(code, { ecmaVersion: 'latest', sourceType: 'module' })\n const spans: ImportSpan[] = []\n for (const node of ast.body) {\n if (node.type !== 'ImportDeclaration') continue\n const src = node.source as { value: string; start?: number; end?: number }\n if (!src || src.start === undefined || src.end === undefined) continue\n const spec = src.value\n const bare = !spec.startsWith('.') && !/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(spec)\n // acorn 的 source.start/end 覆盖含引号的字符串字面量 → 收缩到不含引号的内容\n spans.push({ specifier: spec, start: src.start + 1, end: src.end - 1, bare })\n }\n return spans\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * module-resolver — 运行时模块解析(channel ③,V5.2 / V5.4)
3
3
  *
4
4
  * 提供纯函数 `resolveImports(code, options)`:
5
- * - acorn 解析每个顶层 import 声明(复用 faqts imports 的 span 定位)
5
+ * - acorn 解析每个顶层 import 声明(复用 parse-imports 的 span 定位)
6
6
  * - 裸说明符 → 查找解析表(slices / imports / scopes)→ 重写为宿主可加载的绝对 URL
7
7
  * - V5.4 大库切片(`pkg/sub`):仅导出清单中的切片可被引用,未声明 → 抛错
8
8
  * - 相对说明符 → 按 importer/baseURL 绝对化
@@ -2,7 +2,7 @@
2
2
  * module-resolver — 运行时模块解析(channel ③,V5.2 / V5.4)
3
3
  *
4
4
  * 提供纯函数 `resolveImports(code, options)`:
5
- * - acorn 解析每个顶层 import 声明(复用 faqts imports 的 span 定位)
5
+ * - acorn 解析每个顶层 import 声明(复用 parse-imports 的 span 定位)
6
6
  * - 裸说明符 → 查找解析表(slices / imports / scopes)→ 重写为宿主可加载的绝对 URL
7
7
  * - V5.4 大库切片(`pkg/sub`):仅导出清单中的切片可被引用,未声明 → 抛错
8
8
  * - 相对说明符 → 按 importer/baseURL 绝对化
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * 本模块不发起网络、不做递归依赖装配(宿主负责拓扑与 fetch/build)。
14
14
  */
15
- import { findImports } from '../faqts/imports.js';
15
+ import { findImports } from './parse-imports.js';
16
16
  import { assertSatisfies } from './version.js';
17
17
  /**
18
18
  * Base error for module-resolution failures.
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/module-resolver/resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * module-resolver — 运行时模块解析(channel ③,V5.2 / V5.4)\n *\n * 提供纯函数 `resolveImports(code, options)`:\n * - acorn 解析每个顶层 import 声明(复用 faqts imports 的 span 定位)\n * - 裸说明符 → 查找解析表(slices / imports / scopes)→ 重写为宿主可加载的绝对 URL\n * - V5.4 大库切片(`pkg/sub`):仅导出清单中的切片可被引用,未声明 → 抛错\n * - 相对说明符 → 按 importer/baseURL 绝对化\n * - `@faicad/faijs` 家族 → 零替换(宿主 importmap 解析,保证单例)\n * - 未登记的裸说明符 → 抛错(roadmap §11 验收:不回退、不静默)\n * - 版本范围 → 校验(roadmap §11 验收:版本不匹配必须抛错)\n *\n * 本模块不发起网络、不做递归依赖装配(宿主负责拓扑与 fetch/build)。\n */\n\nimport { findImports } from '../faqts/imports'\nimport { assertSatisfies } from './version'\n\n/** Resolution value: a direct URL, or an object with URL plus an optional version for range validation. */\nexport type ResolverValue = string | { url: string; version?: string }\n\n/**\n * Options for resolveImports: the resolution table, scopes, slices, and the\n * importer/base context used to absolutize relative specifiers.\n */\nexport interface ResolveImportsOptions {\n /** 顶层解析表:裸说明符 → URL / {url, version} */\n imports: Record<string, ResolverValue>\n /**\n * V5.2 多版本 scopes:键为导入方模块的 URL 前缀,值为局部解析表。\n * 解析当前模块时按 importer 前缀匹配**最长** scope,优先于顶层 imports。\n */\n scopes?: Record<string, Record<string, ResolverValue>>\n /**\n * V5.4 按需加载:大库存量切片声明。\n *\n * 键为\"包名\",值为该库的切片表:只开放被列出的子路径(`pkg/sliceName`)\n * 给模块图引用;每个切片解析为独立 URL(宿主只 fetch 被引用的切片)。\n * 引用未声明的 `pkg/x` → 抛 UnresolvedImportError(不回退、不静默,\n * 与 V5.2 未登记裸说明符的语义一致)。\n *\n * `base` 是切片文件所在目录的绝对 URL;`version` 用于切片范围校验。\n */\n slices?: Record<string, { base: string; version?: string; exports: Record<string, string> }>\n /** 当前模块 URL(可选):用于 relative 绝对化与 scope 匹配 */\n importer?: string | URL\n /** base URL(可选);缺省时相对 `importer` 的目录 */\n baseURL?: string | URL\n /** 保留前缀,默认 `@faicad/faijs` 家族零替换 */\n reservedPrefixes?: string[]\n}\n\n/**\n * Result of resolveImports: the rewritten module source plus the mapping of\n * every rewritten import specifier to its absolute URL.\n */\nexport interface ResolveResult {\n /** 重写后的模块源码 */\n code: string\n /** 每个被重写的 import 的映射:原 specifier → 绝对 URL */\n resolved: Record<string, string>\n}\n\n/**\n * Base error for module-resolution failures.\n */\nexport class ModuleResolverError extends Error {}\n\n/**\n * Thrown for a bare specifier that is not registered in the resolution table\n * (roadmap acceptance: never fall back, never stay silent).\n */\nexport class UnresolvedImportError extends ModuleResolverError {\n /** The unresolvable bare module specifier. */\n readonly specifier: string\n constructor(specifier: string, importerHint?: string) {\n super(\n `[module-resolver] unresolvable bare module specifier \"${specifier}\"` +\n (importerHint ? ` (imported by ${importerHint})` : '') +\n ' — not registered in the resolution table',\n )\n this.name = 'UnresolvedImportError'\n this.specifier = specifier\n }\n}\n\n/**\n * Thrown when an import's version range is not satisfied (roadmap\n * acceptance: a version mismatch must throw).\n */\nexport class ImportVersionError extends ModuleResolverError {\n /** The specifier whose version range was not satisfied. */\n readonly specifier: string\n constructor(specifier: string, version: string, range: string) {\n super(\n `[module-resolver] import \"${specifier}\" requires range \"${range}\" ` +\n `but registry entry resolves to version \"${version}\"`,\n )\n this.name = 'ImportVersionError'\n this.specifier = specifier\n }\n}\n\nconst DEFAULT_RESERVED = ['@faicad/faijs', '@faicad/faq', '@faicad/faq/sdk', '@fc/fq/']\n\nfunction isReserved(spec: string, prefixes: string[]): boolean {\n return prefixes.some((p) => spec === p || spec.startsWith(p + '/'))\n}\n\nfunction asString(u: string | URL): string {\n return typeof u === 'string' ? u : u.href\n}\n\nfunction resolverBase(opts: ResolveImportsOptions): string | undefined {\n if (opts.baseURL) return asString(opts.baseURL)\n if (opts.importer) {\n const imp = asString(opts.importer)\n try {\n return new URL('.', imp).href\n } catch {\n return imp\n }\n }\n return undefined\n}\n\n/**\n * Split a bare specifier that may embed a version range:\n * `mech@^1.2` / `@scope/gear@~2.0`.\n * @param spec - the bare module specifier, possibly with an embedded range.\n * @returns the package name and the optional version range.\n */\nexport function splitVersionRange(spec: string): { name: string; range?: string } {\n const at = spec.startsWith('@') ? spec.indexOf('@', 1) : spec.indexOf('@')\n if (at === -1 || at === spec.length - 1) return { name: spec }\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\n}\n\n/** 选最长匹配的 scope 表(V5.2 多版本)。 */\nfunction pickScope(opts: ResolveImportsOptions): Record<string, ResolverValue> | undefined {\n if (!opts.scopes || !opts.importer) return undefined\n const imp = asString(opts.importer)\n let best: Record<string, ResolverValue> | undefined\n let bestLen = -1\n for (const [prefix, table] of Object.entries(opts.scopes)) {\n if (imp.startsWith(prefix) && prefix.length > bestLen) {\n best = table\n bestLen = prefix.length\n }\n }\n return best\n}\n\n/**\n * V5.4 按需加载:大库切片声明解析。\n *\n * 大库(如标准件库)的公开导入面只有 `pkg` 前缀;子路径必须显式声明为切片。\n * 只 fetch 被引用的切片(宿主按需加载),未声明的 `pkg/x` → 抛错(不静默)。\n * 与内置 op 的静态判定一致——不做运行时回退,只做解析期静态判定。\n */\nfunction resolveSlice(\n name: string,\n range: string | undefined,\n options: ResolveImportsOptions,\n): string | undefined {\n const slices = options.slices\n if (!slices) return undefined\n // 子路径形如 `pkg/sub`;选最长匹配的库前缀(与 scopes 同法)\n let bestPkg: string | undefined\n let bestLen = -1\n for (const pkg of Object.keys(slices)) {\n const prefix = pkg + '/'\n if (name.startsWith(prefix) && prefix.length > bestLen) {\n bestPkg = pkg\n bestLen = prefix.length\n }\n }\n if (bestPkg === undefined) return undefined\n\n const entry = slices[bestPkg]\n const sub = name.slice(bestLen)\n const file = entry.exports[sub]\n if (file === undefined) {\n throw new ModuleResolverError(\n `[module-resolver] slice \"${name}\" is not an exported slice of library \"${bestPkg}\" ` +\n '(V5.4 按需加载:仅导出清单中的切片可被引用,不回退、不静默)',\n )\n }\n if (range !== undefined) {\n // 与顶层 imports 同语义:范围校验失败抛 ImportVersionError\n try {\n assertSatisfies(entry.version ?? '(unknown)', range, name)\n } catch {\n throw new ImportVersionError(name, entry.version ?? '(unknown)', range)\n }\n }\n return new URL(file, entry.base).href\n}\n\n/** 表内精确查找,或子路径键(`gear/` → `gear/sub`)。 */\nfunction lookupValue(\n pkgName: string,\n table: Record<string, ResolverValue> | undefined,\n): ResolverValue | undefined {\n if (!table) return undefined\n if (Object.prototype.hasOwnProperty.call(table, pkgName)) return table[pkgName]\n for (const k of Object.keys(table)) {\n if (k.endsWith('/') && pkgName.startsWith(k)) return table[k]\n }\n return undefined\n}\n\nfunction resolveEntry(\n value: ResolverValue,\n specifier: string,\n range: string | undefined,\n): string {\n const url = typeof value === 'string' ? value : value.url\n if (range !== undefined) {\n const version = typeof value === 'string' ? undefined : value.version\n if (version !== undefined) {\n try {\n assertSatisfies(version, range, specifier)\n } catch {\n throw new ImportVersionError(specifier, version, range)\n }\n } else {\n throw new ImportVersionError(specifier, '(unknown)', range)\n }\n }\n return url\n}\n\n/**\n * Pure function: resolve and rewrite the import specifiers in module code.\n *\n * Priority order:\n * 1. Reserved prefixes (@faicad/faijs family) → untouched (host importmap)\n * 2. Library slices (`pkg/sub` in `slices`) → slice URL (V5.4 on-demand)\n * 3. Scope tables (longest-prefix match) override top-level imports\n * 4. Relative specifiers with a base → absolutized; otherwise kept as-is\n * 5. Top-level table entry → absolute URL (with version-range validation)\n * 6. Unregistered bare specifiers → UnresolvedImportError\n * @param code - the module source code to rewrite.\n * @param options - resolution tables, scopes, slices and importer/base context.\n * @returns the rewritten code and the specifier→URL mapping.\n */\nexport function resolveImports(code: string, options: ResolveImportsOptions): ResolveResult {\n const spans = findImports(code)\n const reserved = options.reservedPrefixes === undefined ? DEFAULT_RESERVED : options.reservedPrefixes\n const scopeTable = pickScope(options)\n const base = resolverBase(options)\n let out = code\n const resolved: Record<string, string> = {}\n\n // 从后往前,保证 span 位置在之前替换后不漂移\n for (let i = spans.length - 1; i >= 0; i--) {\n const span = spans[i]\n const spec = span.specifier\n\n // 保留前缀:零替换\n if (span.bare && isReserved(spec, reserved)) continue\n\n if (span.bare) {\n const { name, range } = splitVersionRange(spec)\n // V5.4 按需加载:大库切片(`pkg/sub`)优先于顶层 imports 命中\n const sliceUrl = resolveSlice(name, range, options)\n if (sliceUrl !== undefined) {\n out = out.slice(0, span.start) + sliceUrl + out.slice(span.end)\n resolved[spec] = sliceUrl\n continue\n }\n const value = lookupValue(name, scopeTable) ?? lookupValue(name, options.imports)\n if (value === undefined) {\n throw new UnresolvedImportError(spec, options.importer !== undefined ? asString(options.importer) : undefined)\n }\n const url = resolveEntry(value, spec, range)\n out = out.slice(0, span.start) + url + out.slice(span.end)\n resolved[spec] = url\n } else if (spec.startsWith('.') && base !== undefined) {\n const url = new URL(spec, base).href\n if (url !== spec) {\n out = out.slice(0, span.start) + url + out.slice(span.end)\n resolved[spec] = url\n }\n }\n // 其余(绝对 URL)原样保留\n }\n\n return { code: out, resolved }\n}"]}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/module-resolver/resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * module-resolver — 运行时模块解析(channel ③,V5.2 / V5.4)\n *\n * 提供纯函数 `resolveImports(code, options)`:\n * - acorn 解析每个顶层 import 声明(复用 parse-imports 的 span 定位)\n * - 裸说明符 → 查找解析表(slices / imports / scopes)→ 重写为宿主可加载的绝对 URL\n * - V5.4 大库切片(`pkg/sub`):仅导出清单中的切片可被引用,未声明 → 抛错\n * - 相对说明符 → 按 importer/baseURL 绝对化\n * - `@faicad/faijs` 家族 → 零替换(宿主 importmap 解析,保证单例)\n * - 未登记的裸说明符 → 抛错(roadmap §11 验收:不回退、不静默)\n * - 版本范围 → 校验(roadmap §11 验收:版本不匹配必须抛错)\n *\n * 本模块不发起网络、不做递归依赖装配(宿主负责拓扑与 fetch/build)。\n */\n\nimport { findImports } from './parse-imports'\nimport { assertSatisfies } from './version'\n\n/** Resolution value: a direct URL, or an object with URL plus an optional version for range validation. */\nexport type ResolverValue = string | { url: string; version?: string }\n\n/**\n * Options for resolveImports: the resolution table, scopes, slices, and the\n * importer/base context used to absolutize relative specifiers.\n */\nexport interface ResolveImportsOptions {\n /** 顶层解析表:裸说明符 → URL / {url, version} */\n imports: Record<string, ResolverValue>\n /**\n * V5.2 多版本 scopes:键为导入方模块的 URL 前缀,值为局部解析表。\n * 解析当前模块时按 importer 前缀匹配**最长** scope,优先于顶层 imports。\n */\n scopes?: Record<string, Record<string, ResolverValue>>\n /**\n * V5.4 按需加载:大库存量切片声明。\n *\n * 键为\"包名\",值为该库的切片表:只开放被列出的子路径(`pkg/sliceName`)\n * 给模块图引用;每个切片解析为独立 URL(宿主只 fetch 被引用的切片)。\n * 引用未声明的 `pkg/x` → 抛 UnresolvedImportError(不回退、不静默,\n * 与 V5.2 未登记裸说明符的语义一致)。\n *\n * `base` 是切片文件所在目录的绝对 URL;`version` 用于切片范围校验。\n */\n slices?: Record<string, { base: string; version?: string; exports: Record<string, string> }>\n /** 当前模块 URL(可选):用于 relative 绝对化与 scope 匹配 */\n importer?: string | URL\n /** base URL(可选);缺省时相对 `importer` 的目录 */\n baseURL?: string | URL\n /** 保留前缀,默认 `@faicad/faijs` 家族零替换 */\n reservedPrefixes?: string[]\n}\n\n/**\n * Result of resolveImports: the rewritten module source plus the mapping of\n * every rewritten import specifier to its absolute URL.\n */\nexport interface ResolveResult {\n /** 重写后的模块源码 */\n code: string\n /** 每个被重写的 import 的映射:原 specifier → 绝对 URL */\n resolved: Record<string, string>\n}\n\n/**\n * Base error for module-resolution failures.\n */\nexport class ModuleResolverError extends Error {}\n\n/**\n * Thrown for a bare specifier that is not registered in the resolution table\n * (roadmap acceptance: never fall back, never stay silent).\n */\nexport class UnresolvedImportError extends ModuleResolverError {\n /** The unresolvable bare module specifier. */\n readonly specifier: string\n constructor(specifier: string, importerHint?: string) {\n super(\n `[module-resolver] unresolvable bare module specifier \"${specifier}\"` +\n (importerHint ? ` (imported by ${importerHint})` : '') +\n ' — not registered in the resolution table',\n )\n this.name = 'UnresolvedImportError'\n this.specifier = specifier\n }\n}\n\n/**\n * Thrown when an import's version range is not satisfied (roadmap\n * acceptance: a version mismatch must throw).\n */\nexport class ImportVersionError extends ModuleResolverError {\n /** The specifier whose version range was not satisfied. */\n readonly specifier: string\n constructor(specifier: string, version: string, range: string) {\n super(\n `[module-resolver] import \"${specifier}\" requires range \"${range}\" ` +\n `but registry entry resolves to version \"${version}\"`,\n )\n this.name = 'ImportVersionError'\n this.specifier = specifier\n }\n}\n\nconst DEFAULT_RESERVED = ['@faicad/faijs', '@faicad/faq', '@faicad/faq/sdk', '@fc/fq/']\n\nfunction isReserved(spec: string, prefixes: string[]): boolean {\n return prefixes.some((p) => spec === p || spec.startsWith(p + '/'))\n}\n\nfunction asString(u: string | URL): string {\n return typeof u === 'string' ? u : u.href\n}\n\nfunction resolverBase(opts: ResolveImportsOptions): string | undefined {\n if (opts.baseURL) return asString(opts.baseURL)\n if (opts.importer) {\n const imp = asString(opts.importer)\n try {\n return new URL('.', imp).href\n } catch {\n return imp\n }\n }\n return undefined\n}\n\n/**\n * Split a bare specifier that may embed a version range:\n * `mech@^1.2` / `@scope/gear@~2.0`.\n * @param spec - the bare module specifier, possibly with an embedded range.\n * @returns the package name and the optional version range.\n */\nexport function splitVersionRange(spec: string): { name: string; range?: string } {\n const at = spec.startsWith('@') ? spec.indexOf('@', 1) : spec.indexOf('@')\n if (at === -1 || at === spec.length - 1) return { name: spec }\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\n}\n\n/** 选最长匹配的 scope 表(V5.2 多版本)。 */\nfunction pickScope(opts: ResolveImportsOptions): Record<string, ResolverValue> | undefined {\n if (!opts.scopes || !opts.importer) return undefined\n const imp = asString(opts.importer)\n let best: Record<string, ResolverValue> | undefined\n let bestLen = -1\n for (const [prefix, table] of Object.entries(opts.scopes)) {\n if (imp.startsWith(prefix) && prefix.length > bestLen) {\n best = table\n bestLen = prefix.length\n }\n }\n return best\n}\n\n/**\n * V5.4 按需加载:大库切片声明解析。\n *\n * 大库(如标准件库)的公开导入面只有 `pkg` 前缀;子路径必须显式声明为切片。\n * 只 fetch 被引用的切片(宿主按需加载),未声明的 `pkg/x` → 抛错(不静默)。\n * 与内置 op 的静态判定一致——不做运行时回退,只做解析期静态判定。\n */\nfunction resolveSlice(\n name: string,\n range: string | undefined,\n options: ResolveImportsOptions,\n): string | undefined {\n const slices = options.slices\n if (!slices) return undefined\n // 子路径形如 `pkg/sub`;选最长匹配的库前缀(与 scopes 同法)\n let bestPkg: string | undefined\n let bestLen = -1\n for (const pkg of Object.keys(slices)) {\n const prefix = pkg + '/'\n if (name.startsWith(prefix) && prefix.length > bestLen) {\n bestPkg = pkg\n bestLen = prefix.length\n }\n }\n if (bestPkg === undefined) return undefined\n\n const entry = slices[bestPkg]\n const sub = name.slice(bestLen)\n const file = entry.exports[sub]\n if (file === undefined) {\n throw new ModuleResolverError(\n `[module-resolver] slice \"${name}\" is not an exported slice of library \"${bestPkg}\" ` +\n '(V5.4 按需加载:仅导出清单中的切片可被引用,不回退、不静默)',\n )\n }\n if (range !== undefined) {\n // 与顶层 imports 同语义:范围校验失败抛 ImportVersionError\n try {\n assertSatisfies(entry.version ?? '(unknown)', range, name)\n } catch {\n throw new ImportVersionError(name, entry.version ?? '(unknown)', range)\n }\n }\n return new URL(file, entry.base).href\n}\n\n/** 表内精确查找,或子路径键(`gear/` → `gear/sub`)。 */\nfunction lookupValue(\n pkgName: string,\n table: Record<string, ResolverValue> | undefined,\n): ResolverValue | undefined {\n if (!table) return undefined\n if (Object.prototype.hasOwnProperty.call(table, pkgName)) return table[pkgName]\n for (const k of Object.keys(table)) {\n if (k.endsWith('/') && pkgName.startsWith(k)) return table[k]\n }\n return undefined\n}\n\nfunction resolveEntry(\n value: ResolverValue,\n specifier: string,\n range: string | undefined,\n): string {\n const url = typeof value === 'string' ? value : value.url\n if (range !== undefined) {\n const version = typeof value === 'string' ? undefined : value.version\n if (version !== undefined) {\n try {\n assertSatisfies(version, range, specifier)\n } catch {\n throw new ImportVersionError(specifier, version, range)\n }\n } else {\n throw new ImportVersionError(specifier, '(unknown)', range)\n }\n }\n return url\n}\n\n/**\n * Pure function: resolve and rewrite the import specifiers in module code.\n *\n * Priority order:\n * 1. Reserved prefixes (@faicad/faijs family) → untouched (host importmap)\n * 2. Library slices (`pkg/sub` in `slices`) → slice URL (V5.4 on-demand)\n * 3. Scope tables (longest-prefix match) override top-level imports\n * 4. Relative specifiers with a base → absolutized; otherwise kept as-is\n * 5. Top-level table entry → absolute URL (with version-range validation)\n * 6. Unregistered bare specifiers → UnresolvedImportError\n * @param code - the module source code to rewrite.\n * @param options - resolution tables, scopes, slices and importer/base context.\n * @returns the rewritten code and the specifier→URL mapping.\n */\nexport function resolveImports(code: string, options: ResolveImportsOptions): ResolveResult {\n const spans = findImports(code)\n const reserved = options.reservedPrefixes === undefined ? DEFAULT_RESERVED : options.reservedPrefixes\n const scopeTable = pickScope(options)\n const base = resolverBase(options)\n let out = code\n const resolved: Record<string, string> = {}\n\n // 从后往前,保证 span 位置在之前替换后不漂移\n for (let i = spans.length - 1; i >= 0; i--) {\n const span = spans[i]\n const spec = span.specifier\n\n // 保留前缀:零替换\n if (span.bare && isReserved(spec, reserved)) continue\n\n if (span.bare) {\n const { name, range } = splitVersionRange(spec)\n // V5.4 按需加载:大库切片(`pkg/sub`)优先于顶层 imports 命中\n const sliceUrl = resolveSlice(name, range, options)\n if (sliceUrl !== undefined) {\n out = out.slice(0, span.start) + sliceUrl + out.slice(span.end)\n resolved[spec] = sliceUrl\n continue\n }\n const value = lookupValue(name, scopeTable) ?? lookupValue(name, options.imports)\n if (value === undefined) {\n throw new UnresolvedImportError(spec, options.importer !== undefined ? asString(options.importer) : undefined)\n }\n const url = resolveEntry(value, spec, range)\n out = out.slice(0, span.start) + url + out.slice(span.end)\n resolved[spec] = url\n } else if (spec.startsWith('.') && base !== undefined) {\n const url = new URL(spec, base).href\n if (url !== spec) {\n out = out.slice(0, span.start) + url + out.slice(span.end)\n resolved[spec] = url\n }\n }\n // 其余(绝对 URL)原样保留\n }\n\n return { code: out, resolved }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"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"}
@@ -17,9 +17,9 @@
17
17
  * — (view) 单视图方向(默认 front)
18
18
  * --sheet <front,top,right,iso> — (view) 多视图图纸(projectSheet;与 --view 互斥)
19
19
  */
20
- import { readFileSync, writeFileSync } from 'node:fs';
20
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
21
21
  import { createRequire } from 'node:module';
22
- import { resolve, extname } from 'node:path';
22
+ import { resolve, extname, dirname, join } from 'node:path';
23
23
  import { createRuntime } from '../cad-runtime/runtime.js';
24
24
  import { createNodePorts } from './index.js';
25
25
  import { createFsProjectLoader, findProjectRoot, projectKeyOf } from './fs-project-loader.js';
@@ -34,13 +34,12 @@ import { projectView, projectSheet } from '../api/view/index.js';
34
34
  // ── P 四(4.4):Node CLI 自动装载(D3-Node,§9.4)──
35
35
  // 脚本 import 的第三方库按 specifier 动态解析,host 不再写死任何包清单:
36
36
  // - scoped 包名(`@faicad/...`)直接动态 import;
37
- // - 短名(如 `gear-lib-demo`)先归一为 scoped 全名再装载(避免误装同名陌生人包)。
37
+ // - 短名(如 `sheetmetal`)先归一为 scoped 全名再装载(避免误装同名陌生人包)。
38
38
  // 包未安装 → 动态 import 抛 ERR_MODULE_NOT_FOUND,由 runtime 报明确装载失败信息。
39
39
  /** scoped 包名前缀:CLI 允许动态装载的库范围。 */
40
40
  const CLI_SCOPED_PREFIX = '@faicad/';
41
41
  /** 已登记短名 → scoped 全名归一表(仅收录 `@faicad/` 范围内的库,防同名陌生人包)。 */
42
42
  const CLI_SHORT_NAMES = {
43
- 'gear-lib-demo': '@faicad/gear-lib-demo',
44
43
  'sheetmetal': '@faicad/sheetmetal',
45
44
  'cq-compat': '@faicad/cq-compat',
46
45
  'fai-cq-gears': '@faicad/fai-cq-gears',
@@ -78,6 +77,24 @@ const cliPortsLibLoader = {
78
77
  return (await import(pkg));
79
78
  },
80
79
  listLibs: () => [...Object.keys(CLI_SHORT_NAMES), '@faicad/'],
80
+ loadSource: async (name) => {
81
+ const pkg = normalizeCliSpecifier(name);
82
+ if (!pkg.startsWith(CLI_SCOPED_PREFIX))
83
+ return undefined;
84
+ try {
85
+ const req = createRequire(import.meta.url);
86
+ const pkgJsonPath = req.resolve(`${pkg}/package.json`);
87
+ const pkgDir = dirname(pkgJsonPath);
88
+ for (const p of [join(pkgDir, 'src', 'index.ts'), join(pkgDir, 'dist', 'index.js'), join(pkgDir, 'src', 'index.js')]) {
89
+ if (existsSync(p))
90
+ return readFileSync(p, 'utf-8');
91
+ }
92
+ return undefined;
93
+ }
94
+ catch {
95
+ return undefined;
96
+ }
97
+ },
81
98
  // 默认不提升(与历史 CLI 行为一致);各库用 package.json "faijs.autoLift" 逐库覆盖。
82
99
  options: {
83
100
  autoLift: false,
@@ -174,6 +191,22 @@ export async function cliRun(filePath, outPath, opts) {
174
191
  // Determine output format from extension
175
192
  const ext = extname(outPath).toLowerCase().slice(1);
176
193
  const terminals = execResult.terminals ?? [];
194
+ // E1 (H12): export-side failures must surface as a structured result, not an
195
+ // exception — the census and batch driver treat a throw as a process crash,
196
+ // while `{ ok: false, error }` keeps it a per-file, classifiable failure.
197
+ try {
198
+ return await exportExecutionResult(outPath, ext, execResult, terminals);
199
+ }
200
+ catch (e) {
201
+ return {
202
+ ok: false,
203
+ error: `Export failed: ${String(e?.message ?? e)}`,
204
+ infos: execResult.infos,
205
+ };
206
+ }
207
+ }
208
+ /** Export an executed result to `outPath` (shared body of cliRun's export path). */
209
+ async function exportExecutionResult(outPath, ext, execResult, terminals) {
177
210
  if (terminals.length === 0) {
178
211
  // No terminals — use last output
179
212
  const outputNames = [...execResult.outputs.keys()];