@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 +0,0 @@
1
- {"version":3,"file":"module-executor.js","sourceRoot":"","sources":["../../src/cad-runtime/module-executor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * module-executor — JS VM 模块加载与增量调度(VM 执行方案 Phase 1)\n *\n *\n * ModuleExecutor 是 VM 执行的核心:\n * - `ctx` 持久变量容器(跨 execute/append/update 存活)\n * - `load(code)` 用 data:/Blob URL 动态 import 编译产物(零 import,两平台同构)\n * - `executeAll/executeIds/executeFrom` 按 deps 拓扑序调度\n * - `reconcileCtx` 回收\"定义语句已不在脚本中\"的变量并释放其内核资源\n * - `cache` 记录每语句 statementKey + outputContentKey(plan 增量判定)\n */\n\nimport type { CompiledStatementMeta } from '../lang/compile'\nimport type { StatementIR, ScriptIR, ArgIR } from '../lang/types'\nimport { isVarRef, isExprRef, statementInputs } from '../lang/types'\nimport { withoutKeepDirectives, withoutKeepDirectivesFromPositional, type InternalKeepRecord } from '../lang/keep'\nimport { OpError } from '../api/internal/result-unwrap'\nimport type { Shape } from '../mesh/types'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { PartName, StmtId } from '../identity'\nimport { asPartName } from '../identity'\nimport { computeContentKey } from './content-key'\nimport { getSlot, hasBrep, brepOf, ensureSlot, isCompoundLike } from '../shape'\nimport { setCurrentStmt, setName, getBackends, takePendingAssemblyTransforms, enterFunctionBrep, exitFunctionBrep, takeFunctionBrepDomain, type StdlibNamespace } from '../runtime-state'\nimport { applyTransform } from '../mesh/rigid-transform'\nimport { applyTransformBrep } from '../brep/brep-ops'\nimport type { EventSink } from './ports'\n\n// ── 编译产物语句(从模块文本 import 得到) ──\n\n/**\n * 已装配的命名空间集合(标准库 `cad` + 宿主注册的库)。\n * 编译产物 `fn(ctx, ns)` 经 ns.<binding>.<callee>() 调用——引擎不区分函数来自哪个库。\n */\nexport interface Namespaces {\n readonly cad: StdlibNamespace\n readonly [binding: string]: StdlibNamespace\n}\n\n/**\n * 执行记账(P5:exec 上下文删除后,ModuleExecutor 只需 beforeStatement + outputCache)。\n * beforeStatement:undo 逐语句快照钩子;outputCache:语句产物缓存(collectResult 消费)。\n */\nexport interface ExecBookkeeping {\n beforeStatement?: (stmtId: string, index: number) => void\n outputCache: Map<PartName, Shape>\n /** 变更声明(P6:引擎比对推导 + 装配应用记录),collectResult 消费。 */\n changed: Set<PartName>\n}\n\n/** 编译产物中的单条语句(模块文本 `{ id, deps, fn }`)。 */\nexport interface CompiledStatement {\n id: StmtId\n deps: StmtId[]\n fn: (ctx: Record<string, unknown>, ns: Namespaces) => Promise<void>\n}\n\n/** 动态 import 编译产物(Node: data: URL;浏览器: Blob URL)。 */\nasync function importModule(code: string): Promise<{ statements: CompiledStatement[] }> {\n const isNode = typeof process !== 'undefined' && !!process.versions?.node\n if (isNode) {\n const url = `data:text/javascript;base64,${Buffer.from(code).toString('base64')}`\n return import(/* @vite-ignore */ url)\n }\n const blob = new Blob([code], { type: 'text/javascript' })\n const url = URL.createObjectURL(blob)\n try {\n return await import(/* @vite-ignore */ url)\n } finally {\n URL.revokeObjectURL(url)\n }\n}\n\n/**\n * 收集一个值可到达的全部 BREP 句柄(函数返回值 keep 集,§5.6):\n * shape → 身份槽 solid;compound → children 递归;数组 / 普通对象 → 递归。\n */\nfunction collectBrepHandles(v: unknown, out: Set<unknown>): void {\n if (v === null || v === undefined) return\n if (typeof v !== 'object') return\n if (v instanceof Set || v instanceof Map) return\n // shape:身份槽持 OCCT 句柄\n const slot = getSlot(v as object)\n if (slot?.solid) out.add(slot.solid)\n // compound children / 数组 / 对象递归\n if (Array.isArray(v)) {\n for (const item of v) collectBrepHandles(item, out)\n return\n }\n if (isCompoundLike(v)) {\n for (const child of (v as { children: unknown[] }).children) collectBrepHandles(child, out)\n return\n }\n for (const k of Object.keys(v)) {\n // 跳过内部元数据字段(positions/indices/kind 等 mesh 数据不含句柄,无需遍历)\n if (k === 'positions' || k === 'indices' || k === 'kind') continue\n collectBrepHandles((v as Record<string, unknown>)[k], out)\n }\n}\n\n// ── ModuleExecutor ──\n\n/**\n * Options for constructing a ModuleExecutor, providing the OCCT handle\n * callbacks the executor needs to integrate with the runtime's persistent\n * solid caches.\n */\nexport interface ModuleExecutorOptions {\n /** Release the OCCT handle for a PartName (called when reconcileCtx deletes a variable; no-op without a handle). */\n releaseSolid?: (partName: PartName) => void\n /** Read the OCCT handle currently held for a PartName (used for replacement-release pre-capture). */\n getSolid?: (partName: PartName) => BrepHandle | undefined\n /** Release a previously captured OCCT handle (replacement release: free the old handle after a same-id recompute succeeds). */\n releaseHandle?: (handle: BrepHandle) => void\n /** Sync an identity-slot solid into the PartName-keyed solidCache (relied on by existing runtime logic). */\n setSolid?: (partName: PartName, solid: BrepHandle) => void\n /** Sync an identity-slot faceEvolution into the PartName-keyed faceEvolutionCache. */\n setFaceEvolution?: (partName: PartName, evo: Map<number, number[]>) => void\n /** Sync an identity-slot roleTable into the PartName-keyed roleTableCache (§2.3 naming). */\n setRoleTable?: (partName: PartName, roleTable: unknown) => void\n}\n\n/**\n * ModuleExecutor loads JS VM modules and schedules incremental execution.\n *\n * It is the heart of the VM execution approach: it keeps the persistent `ctx`\n * variable container alive across execute/append/update calls, dynamically\n * imports compiled modules from data:/Blob URLs (zero imports, isomorphic on\n * both platforms), schedules all/selected/from statements in dependency\n * topological order, reclaims variables whose defining statements have left the\n * script, and caches each statement's key + output content key for incremental\n * planning.\n */\nexport class ModuleExecutor {\n /** Persistent variable container across incremental executions. */\n readonly ctx: Record<string, unknown> = {}\n\n private stmts = new Map<StmtId, CompiledStatement>()\n /** statementKey 缓存(增量判定;key = op|JSON(args)|deps 的 outputContentKey) */\n private cache = new Map<StmtId, { key: string; outputContentKey: string }>()\n /**\n * 函数体 keep 登记(keep-syntax 设计 §2.2):\n * stmtId → { kept, hidden }。语句执行前清空本条记录,执行中累加;\n * 本轮未执行(缓存命中)→ 保留上一轮记录(keep 零重算的前提)。\n */\n readonly internalKeep = new Map<StmtId, InternalKeepRecord>()\n private sourceById = new Map<StmtId, StatementIR>()\n private metaById = new Map<StmtId, CompiledStatementMeta>()\n private script: ScriptIR = { params: [], statements: [] }\n private lastCode = ''\n /**\n * 默认命名空间绑定名(U10/R2):与 runtime 的 registerLib(…, {default: true}) 声明同步;\n * statementKey/computeKey 中 namespace 缺省(undefined)的语句按该绑定名计 key。\n */\n private defaultNsName = 'cad'\n\n /**\n * Sync the default namespace binding name (called by runtime.registerLib with {default:true}).\n * @param name - the namespace binding name to use as default.\n */\n setDefaultNsName(name: string): void {\n this.defaultNsName = name\n }\n private namespaces: Namespaces\n /** 库内容身份表(binding → content hash;增量 key 版控,B2 §7.3) */\n private libIds: ReadonlyMap<string, string> = new Map()\n /** 本机函数调用嵌套深度(§5.5):> 0 表示当前在函数体内执行——keep 登记被抑制。 */\n private userFunctionDepth = 0\n private readonly releaseSolid?: (partName: PartName) => void\n private readonly getSolid?: (partName: PartName) => BrepHandle | undefined\n private readonly releaseHandle?: (handle: BrepHandle) => void\n private readonly setSolid?: (partName: PartName, solid: BrepHandle) => void\n private readonly setFaceEvolution?: (partName: PartName, evo: Map<number, number[]>) => void\n private readonly setRoleTable?: (partName: PartName, roleTable: unknown) => void\n\n constructor(namespaces: Namespaces, options?: ModuleExecutorOptions) {\n this.namespaces = namespaces\n this.releaseSolid = options?.releaseSolid\n this.getSolid = options?.getSolid\n this.releaseHandle = options?.releaseHandle\n this.setSolid = options?.setSolid\n this.setFaceEvolution = options?.setFaceEvolution\n this.setRoleTable = options?.setRoleTable\n }\n\n /**\n * Hot-update the assembled namespace set (after registerLib mounts a new\n * library).\n * @param namespaces - the new assembled namespaces.\n * @param libIds - the library content-identity table (binding → libId), used\n * to version library-branch statement keys (B2, §7.3).\n */\n setNamespaces(namespaces: Namespaces, libIds: ReadonlyMap<string, string> = new Map()): void {\n this.namespaces = namespaces\n this.libIds = libIds\n }\n\n /**\n * Update the script and its compiled metadata (ctx stays alive).\n * @param script - the parsed ScriptIR.\n * @param compiled - the compiled statement metadata.\n */\n setCompiled(script: ScriptIR, compiled: CompiledStatementMeta[]): void {\n this.script = script\n this.metaById = new Map(compiled.map((m) => [m.id, m]))\n this.sourceById = new Map()\n for (const meta of compiled) {\n if (meta.sourceIndex !== undefined) {\n this.sourceById.set(meta.id, script.statements[meta.sourceIndex])\n }\n }\n }\n\n /**\n * Load the compiled module, skipping a reload when the code is unchanged\n * (compiled-product cache).\n * @param code - the compiled module source.\n */\n async load(code: string): Promise<void> {\n if (code === this.lastCode) return\n const mod = await importModule(code)\n this.stmts = new Map(mod.statements.map((s) => [s.id, s]))\n this.lastCode = code\n }\n\n /**\n * Execute every statement in dependency topological order (i.e. statement\n * table order).\n * @param exec - the execution bookkeeping.\n */\n async executeAll(exec: ExecBookkeeping): Promise<void> {\n await this.executeIds([...this.stmts.keys()], exec)\n }\n\n /**\n * Execute only the given statements (append: the prefix is already in the\n * persistent ctx). As in the old interpreter, beforeStatement fires only for\n * new_shape statements; void/same_shape statements (do_assemble/add_constraint)\n * do not trigger it (do_assemble's fn delegates internally).\n * @param ids - the compiled statement ids to execute.\n * @param exec - the execution bookkeeping.\n */\n async executeIds(ids: StmtId[], exec: ExecBookkeeping): Promise<void> {\n for (const id of ids) {\n const compiled = this.stmts.get(id)\n if (!compiled) throw new Error(`[ModuleExecutor] unknown statement \"${id}\"`)\n const source = this.sourceById.get(id)\n const meta = this.metaById.get(id)\n // 顶替释放预捕获:fn 前捕获本语句写键({id} ∪ outputs)的旧 handle;\n // 必须在 fn 之前捕获——op 执行时已用 solidCache.set 覆盖条目,事后拿不到旧引用。\n const oldHandles = (meta?.writes ?? [])\n .map((w) => this.getSolid?.(asPartName(w)))\n .filter((h): h is BrepHandle => !!h)\n // P6:changed 由引擎比对推导(替代旧的 touch 声明机制)\n const oldWrites = new Map<string, unknown>()\n for (const w of meta?.writes ?? []) oldWrites.set(w, this.ctx[w])\n setCurrentStmt(source) // P5:新 keep() 归属当前语句\n // keep 登记先清空本条记录:重执行的语句重新登记(执行中累加,设计 §2.2)\n this.internalKeep.delete(id)\n if (source && source.hasAssignment) {\n exec.beforeStatement?.(String(source.id), this.script.statements.indexOf(source))\n }\n // 本机函数调用(local):进入函数 BREP 域(§5.6),提升 userFunctionDepth(keep 隔离,§5.5)。\n // 函数体执行期间:内部 keep 登记被抑制(registerKeep no-op);体内瞬态句柄登记到域,\n // 结束后释放除返回值可到达句柄外的全部(finally 保证异常路径同样释放)。\n const isLocal = source?.local === true\n if (isLocal) {\n this.userFunctionDepth++\n enterFunctionBrep()\n }\n try {\n await compiled.fn(this.ctx, this.namespaces)\n } catch (err) {\n // D4(true-JS-subset §4.3.2):表达式求值失败(编译产物内标记的\n // __FaiExprEvalError)包装为 OpError(E_EXPR) 重抛,由 runWithFailureHandling\n // 归并为 ExecutionResult.failedAt(语句归属经 setCurrentStmt 已定位)。\n // 其余异常原样抛穿:Brep/MeshUnsupported → failedAt;op 实现的普通异常\n //(= bug,Result 体系契约)不在此处改变语义。\n if (err instanceof Error && (err as { isExprEvalError?: boolean }).isExprEvalError === true) {\n throw new OpError(\n source?.callee ?? String(id),\n 'E_EXPR',\n err.message,\n )\n }\n throw err\n } finally {\n if (isLocal) {\n this.releaseFunctionBrepDomain(compiled, meta)\n exitFunctionBrep()\n this.userFunctionDepth--\n }\n }\n await this.afterStatement(compiled, exec)\n for (const [w, old] of oldWrites) {\n if (old !== this.ctx[w]) exec.changed.add(asPartName(w))\n }\n // 顶替释放:执行成功后才释放旧 handle(失败时缓存保持执行前状态,天然回滚)\n for (const old of oldHandles) {\n this.releaseHandle?.(old)\n }\n }\n }\n\n /**\n * Re-execute from the change points on (update: plan derives the stale set).\n * The stale set is closed over deps (a statement depending on a stale one is\n * itself stale) and runs in topological order.\n * @param staleIds - the set of stale statement ids to recompute.\n * @param exec - the execution bookkeeping.\n */\n async executeFrom(staleIds: Set<StmtId>, exec: ExecBookkeeping): Promise<void> {\n const ordered: StmtId[] = []\n const visited = new Set<StmtId>()\n const visit = (id: StmtId): void => {\n if (visited.has(id)) return\n visited.add(id)\n const meta = this.metaById.get(id)\n if (meta) {\n for (const dep of meta.deps) {\n if (staleIds.has(dep)) visit(dep)\n }\n }\n ordered.push(id)\n }\n for (const id of staleIds) visit(id)\n await this.executeIds(ordered, exec)\n }\n\n /**\n * Reclaim ctx variables whose defining statement is no longer in the script\n * and release their kernel resources (a required action after undoing a\n * statement deletion). Variables in `referencedVars` are kept even when not\n * written by an active statement (cross-file references to other files'\n * parts).\n * @param activeStmtIds - the ids of statements still considered active.\n * @param writeSets - mapping of statement id to the variable names it writes.\n * @param referencedVars - variable names still referenced by the active\n * script; these survive reclaim.\n */\n reconcileCtx(\n activeStmtIds: Set<StmtId>,\n writeSets: Map<StmtId, PartName[]>,\n referencedVars?: Set<string>,\n ): void {\n const activeWrites = new Set<string>()\n for (const [id, writes] of writeSets) {\n if (activeStmtIds.has(id)) {\n for (const w of writes) activeWrites.add(w)\n }\n }\n for (const key of Object.keys(this.ctx)) {\n if (!activeWrites.has(key) && !(referencedVars?.has(key) ?? false)) {\n this.releaseSolid?.(asPartName(key))\n delete this.ctx[key]\n }\n }\n // keep 登记同步修剪:语句已不在脚本中(undo 删除)→ 其 keep 声明失效\n for (const id of [...this.internalKeep.keys()]) {\n if (!activeStmtIds.has(id)) this.internalKeep.delete(id)\n }\n }\n\n // ── 缓存访问(plan / collectResult 用) ──\n\n /** 清除所有缓存(key 缓存 + ctx 变量)。测试用:CadRuntime.clearStatementCache 调用。 */\n clearCache(): void {\n for (const key of Object.keys(this.ctx)) {\n this.releaseSolid?.(asPartName(key))\n delete this.ctx[key]\n }\n this.cache.clear()\n this.script = { params: [], statements: [] }\n this.metaById.clear()\n this.stmts.clear()\n this.sourceById.clear()\n this.internalKeep.clear()\n this.lastCode = ''\n }\n\n /**\n * Read a statement's statementKey cache entry.\n * @param id - the compiled statement id.\n * @returns the cached key and output content key, or undefined.\n */\n getCachedKey(id: StmtId): { key: string; outputContentKey: string } | undefined {\n return this.cache.get(id)\n }\n\n /**\n * Read a statement's function-body keep registration (used by the terminal-dag\n * C1 check); undefined when none exists.\n * @param id - the compiled statement id.\n * @returns the internal keep record, or undefined.\n */\n getInternalKeep(id: StmtId): InternalKeepRecord | undefined {\n return this.internalKeep.get(id)\n }\n\n /**\n * Register a function-body keep entry into ModuleExecutor.internalKeep,\n * accumulating during execution.\n * @param id - the compiled statement id.\n * @param names - the kept variable names.\n * @param hidden - whether the kept variables are hidden.\n */\n registerKeep(id: StmtId, names: PartName[], hidden: boolean): void {\n // 函数 BREP 域 / keep 隔离(§5.5 / D5):本机函数体内嵌套 cad.* 的库内部\n // keep 登记一律抑制——保留语义由调用点 keep 表达,函数体不向顶层传播保留。\n if (this.userFunctionDepth > 0) return\n let rec = this.internalKeep.get(id)\n if (!rec) {\n rec = { kept: new Set(), hidden: new Map() }\n this.internalKeep.set(id, rec)\n }\n for (const n of names) {\n rec.kept.add(n)\n rec.hidden.set(n, hidden)\n }\n }\n\n /**\n * 函数 BREP 域释放(§5.6 / D13):取走当前域的句柄登记表,收集本语句输出\n * (返回值)可到达的全部句柄为 keep 集,释放登记域内除 keep 集外的全部句柄。\n * 函数体内中间体的瞬态句柄在此一次性释放——单次调用内存有界,不逐轮释放。\n */\n private releaseFunctionBrepDomain(compiled: CompiledStatement, meta: CompiledStatementMeta | undefined): void {\n const domain = takeFunctionBrepDomain()\n if (domain.length === 0) return\n // keep 集:返回值(语句 writes 的 ctx 值,可能是 shape / compound / 数组 / 对象)可到达的句柄\n const kept = new Set<unknown>()\n for (const w of meta?.writes ?? []) {\n const v = this.ctx[w]\n collectBrepHandles(v, kept)\n }\n for (const h of domain) {\n if (kept.has(h)) continue\n try {\n this.releaseHandle?.(h as BrepHandle)\n } catch { /* 已释放 */ }\n }\n }\n\n /**\n * Read a ctx variable.\n * @param name - the variable name.\n * @returns the variable value.\n */\n getCtxVar(name: string): unknown {\n return this.ctx[name]\n }\n\n /**\n * Write a ctx variable (used to sync assembly transforms from outputCache\n * back into ctx).\n * @param name - the variable name.\n * @param value - the value to store.\n */\n setCtxVar(name: string, value: unknown): void {\n this.ctx[name] = value\n }\n\n /**\n * All variable names currently held in the persistent ctx (covers parts\n * executed by previous execute/append/update calls).\n * @returns the ctx variable names.\n */\n listCtxKeys(): string[] {\n return Object.keys(this.ctx)\n }\n\n /**\n * Returns the compiled metadata in params + statements order.\n * @returns the compiled statement metadata array.\n */\n getMetas(): CompiledStatementMeta[] {\n return [...this.metaById.values()]\n }\n\n /** 清空 ctx 与 statementKey 缓存(CadRuntime.dispose 用)。 */\n clear(): void {\n for (const key of Object.keys(this.ctx)) delete this.ctx[key]\n this.cache.clear()\n this.internalKeep.clear()\n this.stmts.clear()\n this.lastCode = ''\n }\n\n // ── 内部 ──\n\n /** 语句执行后:ctx → outputCache 同步 + 身份槽 → solidCache/faceEvolutionCache 同步 + statementKey 缓存 + 装配传播。 */\n private async afterStatement(compiled: CompiledStatement, exec: ExecBookkeeping): Promise<void> {\n const source = this.sourceById.get(compiled.id)\n const meta = this.metaById.get(compiled.id)\n const writes = meta?.writes ?? []\n for (const w of writes) {\n const v = this.ctx[w]\n if (v !== undefined) {\n if (typeof v === 'object' && v !== null) {\n setName(v, asPartName(w)) // P3:新 keep() 反查走 runtime-state 映射(P5 删 exec 侧)\n // 身份槽 → PartName 键控缓存同步(runtime 的 brepSolids/顶替释放/buildBrepTopology 依赖)\n const slot = getSlot(v)\n if (slot?.solid) this.setSolid?.(asPartName(w), slot.solid as BrepHandle)\n if (slot?.faceEvolution) this.setFaceEvolution?.(asPartName(w), slot.faceEvolution)\n if (slot?.roleTable) this.setRoleTable?.(asPartName(w), slot.roleTable)\n }\n exec.outputCache.set(asPartName(w), v as Shape)\n }\n }\n const key = meta ? this.computeKey(meta, source) : ''\n const outputContentKey = this.computeOutputContentKey(compiled)\n this.cache.set(compiled.id, { key, outputContentKey })\n\n // P4:引擎统一发 part-brep-lost(F1:库不再读 currentStmt / 不再 emit)\n // 语义:上游在 BREP 链上,但本语句产物不在链上 → BREP 链在此断开\n this.emitBrepLost(compiled.id, source)\n\n // P6:装配传播(求解在库,应用与失效在引擎)\n await this.applyPendingAssemblyTransforms(exec)\n }\n\n /**\n * P6:装配传播——取走全部待应用变换,引擎应用到成员(mesh 原地 + BREP 槽 + solidCache),\n * 记录 changed,并让依赖成员的下游语句失效重算(DAG 重放,替代 exec.dependentsOf 图遍历)。\n */\n private async applyPendingAssemblyTransforms(exec: ExecBookkeeping): Promise<void> {\n const pending = takePendingAssemblyTransforms()\n if (pending.length === 0) return\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n for (const { compound, transforms } of pending) {\n const behavior = getSlot(compound)?.behavior as { memberNames?: string[] } | undefined\n if (!behavior?.memberNames) continue\n const children = (compound as { children?: Shape[] }).children ?? []\n const memberNames = behavior.memberNames\n for (const t of transforms) {\n const member = children[t.index]\n const name = memberNames[t.index]\n if (!member || typeof member !== 'object') continue\n // mesh 原地变换(保留同一对象引用,ctx 与 compound.children 同步看到变更)\n Object.assign(member, applyTransform(member, t.quaternion, t.pivot, t.translation, t.rotationMatrix))\n // BREP 刚体变换(可选):新 solid 写身份槽 + solidCache(替代旧 T6.5 反同步循环)\n const solid = brepOf(member) as BrepHandle | undefined\n if (kernel && solid) {\n const transformed = applyTransformBrep(kernel, solid, t.quaternion, t.pivot, t.translation)\n try { kernel.release(solid) } catch { /* 已释放 */ }\n ensureSlot(member).solid = transformed\n if (name) this.setSolid?.(asPartName(name), transformed)\n }\n if (name) exec.changed.add(asPartName(name))\n }\n // 下游失效重算:依赖成员名的语句(拓扑序由 executeFrom 按 deps 保证)\n const stale = this.computeDownstream(memberNames)\n if (stale.size > 0) await this.executeFrom(stale, exec)\n }\n }\n\n /** 找出依赖给定变量名的语句(装配成员 → 消费它的下游)。 */\n private computeDownstream(memberNames: string[]): Set<StmtId> {\n const names = new Set(memberNames)\n const stale = new Set<StmtId>()\n for (const [id, source] of this.sourceById) {\n if (statementInputs(source).some((n) => names.has(String(n)))) stale.add(id)\n }\n return stale\n }\n\n /**\n * 判定并发 part-brep-lost 事件。\n *\n * 判据:语句有几何输入且**全部**输入都在 BREP 链上,但输出**不在**链上\n * → BREP 链在此断开(mesh-only 函数或 fallthrough)。\n *\n * true-JS-subset §4.4.2:几何输入 = positional 中的 VarRefIR + ExprIR.refs\n * (表达式实参引用的 Shape 变量同样喂进本语句;CallRef 嵌套调用是只读查询不计)。\n */\n private emitBrepLost(id: StmtId, source: StatementIR | undefined): void {\n if (!source) return\n const inputNames = new Set<string>()\n const scanPositional = (arg: ArgIR): void => {\n if (arg === null || typeof arg !== 'object') return\n if (isVarRef(arg)) {\n inputNames.add(String(arg.$ref))\n return\n }\n if (isExprRef(arg)) {\n for (const r of arg.$expr.refs) inputNames.add(r)\n return\n }\n }\n for (const arg of source.positional ?? []) scanPositional(arg)\n if (inputNames.size === 0) return\n const sink = getBackends().events as EventSink | undefined\n if (!sink) return\n\n const inputsOnChain = [...inputNames]\n .map((n) => this.ctx[n])\n .filter((v): v is Shape => !!v && typeof v === 'object')\n if (inputsOnChain.length === 0) return\n if (!inputsOnChain.every(hasBrep)) return // 上游本就不在链上 → 非断开\n\n const out = this.ctx[this.metaById.get(id)?.writes[0] ?? '']\n if (out && typeof out === 'object' && hasBrep(out as Shape)) return // 输出仍在链上\n\n sink.emit('part-brep-lost', {\n partName: asPartName(String(source.outputs[0] ?? '')),\n callee: source.callee,\n reason: `${source.callee} has no BREP implementation`,\n })\n }\n\n /**\n * Compute a statementKey = op | JSON(positional + args without keep) | each\n * dependency's output content key (parameter statements use the parameter\n * value). The keep/keepHidden keys are excluded so toggling retain/hide state\n * triggers no geometric recompute. plan() uses this with the current cache to\n * compute the expected key for incremental decisions.\n *\n * true-JS-subset §4.4.1:位置实参槽入 key——ExprIR 可 JSON 化\n * (text + refs + params),表达式文本变化即触发重算;表达式引用的上游变量\n * 变化经 deps 的 outputContentKey 传递。\n *\n * 本机函数调用(local):key 前缀 `local.<callee>#<bodyHash>`(§6.2 / P4 内容寻址)——\n * 编辑函数体文本 → 所有调用该函数的语句 key 变化 → 下游失效重算;不改函数体零重算。\n * @param meta - the compiled statement metadata.\n * @param source - the source statement, or undefined for parameter statements.\n * @returns the computed statement key string.\n */\n computeKey(meta: CompiledStatementMeta, source: StatementIR | undefined): string {\n const primary = meta.writes[0]\n if (!source) {\n const p = this.script.params.find((pp) => pp.name === primary)\n return `param|${JSON.stringify(p?.value)}`\n }\n const parts = [\n source.local\n ? `local.${source.callee}#${this.bodyHashOf(source.callee)}`\n : `${source.namespace ?? this.defaultNsName}.${source.callee}#${this.libIdOf(source.namespace ?? this.defaultNsName)}`,\n ]\n parts.push(JSON.stringify({\n positional: withoutKeepDirectivesFromPositional(source.positional ?? []),\n args: withoutKeepDirectives(source.args),\n }))\n for (const dep of meta.deps) {\n const ck = this.cache.get(dep)?.outputContentKey\n parts.push(ck ?? 'missing')\n }\n return parts.join('|')\n }\n\n /**\n * 按函数名查 bodyHash(setCompiled 已存 script;查不到 → 'missing',增量会失效重算)。\n * @internal runtime.planUpdateStale 的 ownKey/oldKey 对比(§6.2 / P4)复用。\n * @param name 本机函数名。\n * @returns 函数体的内容哈希;`'missing'` 表示未知函数。\n */\n bodyHashOf(name: string): string {\n return this.script.functions?.find((f) => f.name === name)?.bodyHash ?? 'missing'\n }\n\n /**\n * 按绑定名查 libId(setNamespaces 已存表;本机函数不含——只适用于库分支 key)。\n * 库未登记或表缺失 → 'missing',增量会自动失效重算。\n * @param binding 命名空间绑定名。\n * @returns 库的内容身份;`'missing'` 表示该绑定无登记身份。\n */\n libIdOf(binding: string): string {\n return this.libIds.get(binding) ?? 'missing'\n }\n\n /** outputContentKey:shape 语句 = mesh 内容哈希;参数语句 = 参数值。 */\n private computeOutputContentKey(compiled: CompiledStatement): string {\n const primary = this.metaById.get(compiled.id)?.writes[0]\n if (primary !== undefined) {\n const v = this.ctx[primary]\n if (v && typeof v === 'object' && 'positions' in v && 'indices' in v) {\n const shape = v as Shape\n return computeContentKey(shape.positions, shape.indices)\n }\n }\n const source = this.sourceById.get(compiled.id)\n if (!source) {\n const p = this.script.params.find((pp) => pp.name === primary)\n return `param:${JSON.stringify(p?.value)}`\n }\n return ''\n }\n}\n"]}
@@ -1,65 +0,0 @@
1
- /**
2
- * terminal-dag — DAG 叶子终端判定(keep 驱动,C0/C1/C3/C5)
3
- *
4
- *
5
- * 核心语义(keep 统一机制):
6
- * - 一个变量是否进终端 = 它「是否被消费」。被消费 → 不进终端。
7
- * - "被消费" = 存在一条语句 T(位于该变量最后一条赋值语句 P 之后)判定 T 消费了该变量。
8
- *
9
- * 单条语句 T 对变量 v 的消费判定(短路):
10
- * - C0/C1:v ∈ resolveKeep(T).kept(调用点 keep 或函数体 exec.keep 声明)→ 不消费。
11
- * 声明层是「有人表态」:用户/库作者显式声明保留。
12
- * - C3:T 有赋值且所有输出都是非几何(outputs 均不在 shapeVarNames)→ 不消费任何输入。
13
- * 推断层客观默认:faijs 执行模型是纯函数链,「返回非几何的函数不可能把几何吞进结果」
14
- * ——零签名知识,第三方测量/查询函数的输入不被误吃(R9)。
15
- * - C5:默认消费(drill/transform/未声明保留的第三方几何函数)。
16
- * - 嵌套调用(CallRefIR)中的引用 = 只读查询,不消费(既有规则,与 C3 同精神)。
17
- * - receiver(成员方法调用,add_constraint/do_assemble)不消费 receiver 变量。
18
- *
19
- * hidden(D1/D2):「最后一次保留声明胜出」——按语句顺序遍历,
20
- * 后声明的保留条目压过先前的(union 的 keepHidden 被 group 的 keep 覆盖为可见)。
21
- *
22
- * 判定单位是 PartName(不涉及 StmtId),与 partN 命名天然兼容。
23
- */
24
- import type { ScriptIR, TerminalShape, StatementIR } from '../lang/types.js';
25
- import type { PartName } from '../identity.js';
26
- import { type InternalKeepRecord } from '../lang/keep.js';
27
- /**
28
- * DAG 运行时视图(设计契约 §6):terminal-dag 从运行时读取函数体 keep 登记。
29
- * 省略 view → 纯静态判定(C0 + C3 + C5,无 C1 函数体声明信息)。
30
- */
31
- export interface DagRuntimeView {
32
- /** 变量当前值(运行时;纯静态场景无值) */
33
- value(name: PartName): unknown;
34
- /** 函数体 exec.keep 登记(ModuleExecutor.internalKeep,缓存命中时保留上一轮记录) */
35
- internalKeep(stmt: StatementIR): InternalKeepRecord | undefined;
36
- }
37
- /**
38
- * Determine whether statement stmt "consumes" variable v (keep driven, using
39
- * the C0 → C3 → C5 short-circuit flow).
40
- * @param stmt - the statement under test.
41
- * @param v - the variable name (PartName).
42
- * @param view - the runtime view; when omitted a purely static pass with no
43
- * function-body declaration info is used.
44
- * @param shapeVarNames - the set of all shape-typed top-level variable names,
45
- * the basis for the C3 decision.
46
- * @returns true when the statement consumes the variable.
47
- */
48
- export declare function consumes(stmt: StatementIR, v: PartName, view?: DagRuntimeView, shapeVarNames?: Set<PartName>): boolean;
49
- /**
50
- * 计算 DAG 叶子终端集合(keep 驱动)。
51
- *
52
- * 遍历每个 shape 变量名(含 compound 变量):
53
- * - 「最后写者 P + 其后无语句消费该变量」→ 终端;
54
- * - 被 keep 声明保留的变量不被声明语句消费(C0/C1 在 consumes 内短路)。
55
- *
56
- * hidden(D2):按语句顺序应用「最后一次保留声明胜出」;未声明保留的终端可见
57
- * (hidden 为 undefined)。
58
- *
59
- * @param script 已解析的 ScriptIR(statements 含 outputs/refs)
60
- * @param shapeVarNames 所有 shape-typed 顶层变量名集合(含 compound 变量名)
61
- * @param view 运行时视图(省略 → 纯静态判定,供纯静态单测/工具)
62
- * @returns 终端列表(TerminalShape[]),去重
63
- */
64
- export declare function computeLeafTerminals(script: ScriptIR, shapeVarNames: Set<PartName>, view?: DagRuntimeView): TerminalShape[];
65
- //# sourceMappingURL=terminal-dag.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal-dag.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/terminal-dag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAS,MAAM,eAAe,CAAA;AAChF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEnE;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;IAC9B,iEAAiE;IACjE,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,kBAAkB,GAAG,SAAS,CAAA;CAChE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,WAAW,EACjB,CAAC,EAAE,QAAQ,EACX,IAAI,CAAC,EAAE,cAAc,EACrB,aAAa,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,GAC5B,OAAO,CAiDT;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAChB,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,EAC5B,IAAI,CAAC,EAAE,cAAc,GACpB,aAAa,EAAE,CAoDjB"}
@@ -1,167 +0,0 @@
1
- /**
2
- * terminal-dag — DAG 叶子终端判定(keep 驱动,C0/C1/C3/C5)
3
- *
4
- *
5
- * 核心语义(keep 统一机制):
6
- * - 一个变量是否进终端 = 它「是否被消费」。被消费 → 不进终端。
7
- * - "被消费" = 存在一条语句 T(位于该变量最后一条赋值语句 P 之后)判定 T 消费了该变量。
8
- *
9
- * 单条语句 T 对变量 v 的消费判定(短路):
10
- * - C0/C1:v ∈ resolveKeep(T).kept(调用点 keep 或函数体 exec.keep 声明)→ 不消费。
11
- * 声明层是「有人表态」:用户/库作者显式声明保留。
12
- * - C3:T 有赋值且所有输出都是非几何(outputs 均不在 shapeVarNames)→ 不消费任何输入。
13
- * 推断层客观默认:faijs 执行模型是纯函数链,「返回非几何的函数不可能把几何吞进结果」
14
- * ——零签名知识,第三方测量/查询函数的输入不被误吃(R9)。
15
- * - C5:默认消费(drill/transform/未声明保留的第三方几何函数)。
16
- * - 嵌套调用(CallRefIR)中的引用 = 只读查询,不消费(既有规则,与 C3 同精神)。
17
- * - receiver(成员方法调用,add_constraint/do_assemble)不消费 receiver 变量。
18
- *
19
- * hidden(D1/D2):「最后一次保留声明胜出」——按语句顺序遍历,
20
- * 后声明的保留条目压过先前的(union 的 keepHidden 被 group 的 keep 覆盖为可见)。
21
- *
22
- * 判定单位是 PartName(不涉及 StmtId),与 partN 命名天然兼容。
23
- */
24
- import { isVarRef, isCallRef, isExprRef, statementInputs } from '../lang/types.js';
25
- import { resolveKeep } from '../lang/keep.js';
26
- /**
27
- * Determine whether statement stmt "consumes" variable v (keep driven, using
28
- * the C0 → C3 → C5 short-circuit flow).
29
- * @param stmt - the statement under test.
30
- * @param v - the variable name (PartName).
31
- * @param view - the runtime view; when omitted a purely static pass with no
32
- * function-body declaration info is used.
33
- * @param shapeVarNames - the set of all shape-typed top-level variable names,
34
- * the basis for the C3 decision.
35
- * @returns true when the statement consumes the variable.
36
- */
37
- export function consumes(stmt, v, view, shapeVarNames) {
38
- // C0: keep declarations win — a kept variable is not consumed by this statement
39
- const resolved = resolveKeep(stmt, view?.internalKeep(stmt));
40
- if (resolved.kept.has(v))
41
- return false;
42
- // C3:本语句有赋值且所有输出都是非几何 → 纯数据/测量/查询语句,不消费任何输入
43
- if (stmt.hasAssignment &&
44
- stmt.outputs.length > 0 &&
45
- shapeVarNames !== undefined &&
46
- stmt.outputs.every((o) => !shapeVarNames.has(o))) {
47
- return false;
48
- }
49
- // C5:默认消费。positional 中的 VarRefIR(原 inputs 语义,§4.5.1)
50
- if (statementInputs(stmt).includes(v))
51
- return true;
52
- // positional 非变量元素 + args:递归扫描(ExprIR refs 按 C5 消费;CallRefIR 内
53
- // 不消费 = 只读查询)。args 是尾随对象投影(真源 positional),重复扫描幂等;
54
- // 手工构造 IR 可能只填 args。
55
- let consumed = false;
56
- const scan = (value, inCallRef) => {
57
- if (consumed)
58
- return;
59
- if (value === null || typeof value !== 'object')
60
- return;
61
- if (isVarRef(value)) {
62
- if (value.$ref !== v)
63
- return;
64
- if (inCallRef)
65
- return; // 嵌套调用内 = 只读查询
66
- consumed = true;
67
- return;
68
- }
69
- if (isExprRef(value)) {
70
- if (inCallRef)
71
- return; // 嵌套调用内 = 只读查询
72
- if (value.$expr.refs.includes(String(v)))
73
- consumed = true;
74
- return;
75
- }
76
- if (isCallRef(value)) {
77
- for (const a of value.$call.args)
78
- scan(a, true);
79
- return;
80
- }
81
- if (Array.isArray(value)) {
82
- for (const item of value)
83
- scan(item, inCallRef);
84
- return;
85
- }
86
- for (const vv of Object.values(value))
87
- scan(vv, inCallRef);
88
- };
89
- for (const parg of stmt.positional ?? [])
90
- scan(parg, false);
91
- for (const vv of Object.values(stmt.args ?? {}))
92
- scan(vv, false);
93
- return consumed;
94
- }
95
- /**
96
- * 计算 DAG 叶子终端集合(keep 驱动)。
97
- *
98
- * 遍历每个 shape 变量名(含 compound 变量):
99
- * - 「最后写者 P + 其后无语句消费该变量」→ 终端;
100
- * - 被 keep 声明保留的变量不被声明语句消费(C0/C1 在 consumes 内短路)。
101
- *
102
- * hidden(D2):按语句顺序应用「最后一次保留声明胜出」;未声明保留的终端可见
103
- * (hidden 为 undefined)。
104
- *
105
- * @param script 已解析的 ScriptIR(statements 含 outputs/refs)
106
- * @param shapeVarNames 所有 shape-typed 顶层变量名集合(含 compound 变量名)
107
- * @param view 运行时视图(省略 → 纯静态判定,供纯静态单测/工具)
108
- * @returns 终端列表(TerminalShape[]),去重
109
- */
110
- export function computeLeafTerminals(script, shapeVarNames, view) {
111
- const statements = script.statements;
112
- const terminals = [];
113
- const seen = new Set();
114
- // 0. hidden 计算(D2:最后一次保留声明胜出)——按语句顺序遍历,
115
- // 每个 kept 变量的 hidden 被后续声明覆盖。
116
- const hiddenOf = new Map();
117
- for (const stmt of statements) {
118
- const resolved = resolveKeep(stmt, view?.internalKeep(stmt));
119
- for (const v of resolved.kept) {
120
- hiddenOf.set(v, resolved.hidden.get(v) ?? false);
121
- }
122
- }
123
- // 1. 预计算每个变量名 → 最后一条 outputs 含该名的语句下标
124
- const lastProducer = new Map();
125
- for (let i = 0; i < statements.length; i++) {
126
- const stmt = statements[i];
127
- if (!stmt.hasAssignment)
128
- continue; // void op 无 outputs
129
- for (const out of stmt.outputs) {
130
- lastProducer.set(out, i);
131
- }
132
- }
133
- // 2. 遍历每个 shape 变量名(含 compound 变量)
134
- for (const partName of shapeVarNames) {
135
- if (seen.has(partName))
136
- continue;
137
- seen.add(partName);
138
- const producerIdx = lastProducer.get(partName);
139
- // 无生产者(如手工注入的变量)→ 视为终端
140
- if (producerIdx === undefined) {
141
- terminals.push(makeTerminal(partName, hiddenOf));
142
- continue;
143
- }
144
- // 检查 producer 之后是否有语句消费该变量(keep 驱动 consumes)
145
- let consumed = false;
146
- for (let i = producerIdx + 1; i < statements.length; i++) {
147
- if (consumes(statements[i], partName, view, shapeVarNames)) {
148
- consumed = true;
149
- break;
150
- }
151
- }
152
- if (!consumed) {
153
- terminals.push(makeTerminal(partName, hiddenOf));
154
- }
155
- }
156
- return terminals;
157
- }
158
- /**
159
- * 组装终端条目(设计 §6:hidden 缺省 undefined → 可见)。
160
- * 只有显式 hidden=true 才带 hidden 字段;可见(false/未声明)归一为 undefined,
161
- * 与宿主 `setNodeVisible(scopedId, !terminal.hidden)` 的消费语义一致。
162
- */
163
- function makeTerminal(id, hiddenOf) {
164
- const hidden = hiddenOf.get(id);
165
- return hidden ? { id, hidden: true } : { id };
166
- }
167
- //# sourceMappingURL=terminal-dag.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal-dag.js","sourceRoot":"","sources":["../../src/cad-runtime/terminal-dag.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * terminal-dag — DAG 叶子终端判定(keep 驱动,C0/C1/C3/C5)\n *\n *\n * 核心语义(keep 统一机制):\n * - 一个变量是否进终端 = 它「是否被消费」。被消费 → 不进终端。\n * - \"被消费\" = 存在一条语句 T(位于该变量最后一条赋值语句 P 之后)判定 T 消费了该变量。\n *\n * 单条语句 T 对变量 v 的消费判定(短路):\n * - C0/C1:v ∈ resolveKeep(T).kept(调用点 keep 或函数体 exec.keep 声明)→ 不消费。\n * 声明层是「有人表态」:用户/库作者显式声明保留。\n * - C3:T 有赋值且所有输出都是非几何(outputs 均不在 shapeVarNames)→ 不消费任何输入。\n * 推断层客观默认:faijs 执行模型是纯函数链,「返回非几何的函数不可能把几何吞进结果」\n * ——零签名知识,第三方测量/查询函数的输入不被误吃(R9)。\n * - C5:默认消费(drill/transform/未声明保留的第三方几何函数)。\n * - 嵌套调用(CallRefIR)中的引用 = 只读查询,不消费(既有规则,与 C3 同精神)。\n * - receiver(成员方法调用,add_constraint/do_assemble)不消费 receiver 变量。\n *\n * hidden(D1/D2):「最后一次保留声明胜出」——按语句顺序遍历,\n * 后声明的保留条目压过先前的(union 的 keepHidden 被 group 的 keep 覆盖为可见)。\n *\n * 判定单位是 PartName(不涉及 StmtId),与 partN 命名天然兼容。\n */\n\nimport type { ScriptIR, TerminalShape, StatementIR, ArgIR } from '../lang/types'\nimport type { PartName } from '../identity'\nimport { isVarRef, isCallRef, isExprRef, statementInputs } from '../lang/types'\nimport { resolveKeep, type InternalKeepRecord } from '../lang/keep'\n\n/**\n * DAG 运行时视图(设计契约 §6):terminal-dag 从运行时读取函数体 keep 登记。\n * 省略 view → 纯静态判定(C0 + C3 + C5,无 C1 函数体声明信息)。\n */\nexport interface DagRuntimeView {\n /** 变量当前值(运行时;纯静态场景无值) */\n value(name: PartName): unknown\n /** 函数体 exec.keep 登记(ModuleExecutor.internalKeep,缓存命中时保留上一轮记录) */\n internalKeep(stmt: StatementIR): InternalKeepRecord | undefined\n}\n\n/**\n * Determine whether statement stmt \"consumes\" variable v (keep driven, using\n * the C0 → C3 → C5 short-circuit flow).\n * @param stmt - the statement under test.\n * @param v - the variable name (PartName).\n * @param view - the runtime view; when omitted a purely static pass with no\n * function-body declaration info is used.\n * @param shapeVarNames - the set of all shape-typed top-level variable names,\n * the basis for the C3 decision.\n * @returns true when the statement consumes the variable.\n */\nexport function consumes(\n stmt: StatementIR,\n v: PartName,\n view?: DagRuntimeView,\n shapeVarNames?: Set<PartName>,\n): boolean {\n // C0: keep declarations win — a kept variable is not consumed by this statement\n const resolved = resolveKeep(stmt, view?.internalKeep(stmt))\n if (resolved.kept.has(v)) return false\n\n // C3:本语句有赋值且所有输出都是非几何 → 纯数据/测量/查询语句,不消费任何输入\n if (\n stmt.hasAssignment &&\n stmt.outputs.length > 0 &&\n shapeVarNames !== undefined &&\n stmt.outputs.every((o) => !shapeVarNames.has(o))\n ) {\n return false\n }\n\n // C5:默认消费。positional 中的 VarRefIR(原 inputs 语义,§4.5.1)\n if (statementInputs(stmt).includes(v)) return true\n\n // positional 非变量元素 + args:递归扫描(ExprIR refs 按 C5 消费;CallRefIR 内\n // 不消费 = 只读查询)。args 是尾随对象投影(真源 positional),重复扫描幂等;\n // 手工构造 IR 可能只填 args。\n let consumed = false\n const scan = (value: ArgIR, inCallRef: boolean): void => {\n if (consumed) return\n if (value === null || typeof value !== 'object') return\n if (isVarRef(value)) {\n if (value.$ref !== v) return\n if (inCallRef) return // 嵌套调用内 = 只读查询\n consumed = true\n return\n }\n if (isExprRef(value)) {\n if (inCallRef) return // 嵌套调用内 = 只读查询\n if (value.$expr.refs.includes(String(v))) consumed = true\n return\n }\n if (isCallRef(value)) {\n for (const a of value.$call.args) scan(a, true)\n return\n }\n if (Array.isArray(value)) {\n for (const item of value) scan(item as ArgIR, inCallRef)\n return\n }\n for (const vv of Object.values(value)) scan(vv as ArgIR, inCallRef)\n }\n for (const parg of stmt.positional ?? []) scan(parg, false)\n for (const vv of Object.values(stmt.args ?? {})) scan(vv, false)\n return consumed\n}\n\n/**\n * 计算 DAG 叶子终端集合(keep 驱动)。\n *\n * 遍历每个 shape 变量名(含 compound 变量):\n * - 「最后写者 P + 其后无语句消费该变量」→ 终端;\n * - 被 keep 声明保留的变量不被声明语句消费(C0/C1 在 consumes 内短路)。\n *\n * hidden(D2):按语句顺序应用「最后一次保留声明胜出」;未声明保留的终端可见\n * (hidden 为 undefined)。\n *\n * @param script 已解析的 ScriptIR(statements 含 outputs/refs)\n * @param shapeVarNames 所有 shape-typed 顶层变量名集合(含 compound 变量名)\n * @param view 运行时视图(省略 → 纯静态判定,供纯静态单测/工具)\n * @returns 终端列表(TerminalShape[]),去重\n */\nexport function computeLeafTerminals(\n script: ScriptIR,\n shapeVarNames: Set<PartName>,\n view?: DagRuntimeView,\n): TerminalShape[] {\n const statements = script.statements\n const terminals: TerminalShape[] = []\n const seen = new Set<string>()\n\n // 0. hidden 计算(D2:最后一次保留声明胜出)——按语句顺序遍历,\n // 每个 kept 变量的 hidden 被后续声明覆盖。\n const hiddenOf = new Map<PartName, boolean>()\n for (const stmt of statements) {\n const resolved = resolveKeep(stmt, view?.internalKeep(stmt))\n for (const v of resolved.kept) {\n hiddenOf.set(v, resolved.hidden.get(v) ?? false)\n }\n }\n\n // 1. 预计算每个变量名 → 最后一条 outputs 含该名的语句下标\n const lastProducer = new Map<string, number>()\n for (let i = 0; i < statements.length; i++) {\n const stmt = statements[i]\n if (!stmt.hasAssignment) continue // void op 无 outputs\n for (const out of stmt.outputs) {\n lastProducer.set(out, i)\n }\n }\n\n // 2. 遍历每个 shape 变量名(含 compound 变量)\n for (const partName of shapeVarNames) {\n if (seen.has(partName)) continue\n seen.add(partName)\n\n const producerIdx = lastProducer.get(partName)\n // 无生产者(如手工注入的变量)→ 视为终端\n if (producerIdx === undefined) {\n terminals.push(makeTerminal(partName, hiddenOf))\n continue\n }\n\n // 检查 producer 之后是否有语句消费该变量(keep 驱动 consumes)\n let consumed = false\n for (let i = producerIdx + 1; i < statements.length; i++) {\n if (consumes(statements[i], partName, view, shapeVarNames)) {\n consumed = true\n break\n }\n }\n\n if (!consumed) {\n terminals.push(makeTerminal(partName, hiddenOf))\n }\n }\n\n return terminals\n}\n\n/**\n * 组装终端条目(设计 §6:hidden 缺省 undefined → 可见)。\n * 只有显式 hidden=true 才带 hidden 字段;可见(false/未声明)归一为 undefined,\n * 与宿主 `setNodeVisible(scopedId, !terminal.hidden)` 的消费语义一致。\n */\nfunction makeTerminal(id: PartName, hiddenOf: Map<PartName, boolean>): TerminalShape {\n const hidden = hiddenOf.get(id)\n return hidden ? { id, hidden: true } : { id }\n}\n"]}
@@ -1,16 +0,0 @@
1
- /**
2
- * faits — 浏览器入口:@faicad/faijs/faqts/browser
3
- *
4
- * 绑定 Blob 执行器(Blob URL → import)。不含任何 Node 专属依赖。
5
- */
6
- export { transformFaqts } from './transform.js';
7
- export type { FaqtsTransformOptions, FaqtsTransformResult } from './transform.js';
8
- export { findImports, rewriteImports } from './imports.js';
9
- export type { FaqtsImportSpan, FaqtsRewriteFn } from './imports.js';
10
- export { runFaqts } from './run.js';
11
- export type { FaqtsRunOptions, FaqtsRunResult } from './run.js';
12
- export { executeFaqtsModuleInBrowser } from './exec-blob.js';
13
- import type { FaqtsModuleExecutor } from './run.js';
14
- /** The browser-bound module executor: executes compiled module code via a Blob URL import. */
15
- export declare const faqtsBrowserExecutor: FaqtsModuleExecutor;
16
- //# sourceMappingURL=browser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/faqts/browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACvD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAEzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAEhD,8FAA8F;AAC9F,eAAO,MAAM,oBAAoB,EAAE,mBAAiD,CAAA"}
@@ -1,13 +0,0 @@
1
- /**
2
- * faits — 浏览器入口:@faicad/faijs/faqts/browser
3
- *
4
- * 绑定 Blob 执行器(Blob URL → import)。不含任何 Node 专属依赖。
5
- */
6
- export { transformFaqts } from './transform.js';
7
- export { findImports, rewriteImports } from './imports.js';
8
- export { runFaqts } from './run.js';
9
- export { executeFaqtsModuleInBrowser } from './exec-blob.js';
10
- import { executeFaqtsModuleInBrowser } from './exec-blob.js';
11
- /** The browser-bound module executor: executes compiled module code via a Blob URL import. */
12
- export const faqtsBrowserExecutor = executeFaqtsModuleInBrowser;
13
- //# sourceMappingURL=browser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/faqts/browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAGzD,8FAA8F;AAC9F,MAAM,CAAC,MAAM,oBAAoB,GAAwB,2BAA2B,CAAA","sourcesContent":["/**\n * faits — 浏览器入口:@faicad/faijs/faqts/browser\n *\n * 绑定 Blob 执行器(Blob URL → import)。不含任何 Node 专属依赖。\n */\n\nexport { transformFaqts } from './transform'\nexport type { FaqtsTransformOptions, FaqtsTransformResult } from './transform'\nexport { findImports, rewriteImports } from './imports'\nexport type { FaqtsImportSpan, FaqtsRewriteFn } from './imports'\nexport { runFaqts } from './run'\nexport type { FaqtsRunOptions, FaqtsRunResult } from './run'\nexport { executeFaqtsModuleInBrowser } from './exec-blob'\nimport { executeFaqtsModuleInBrowser } from './exec-blob'\nimport type { FaqtsModuleExecutor } from './run'\n\n/** The browser-bound module executor: executes compiled module code via a Blob URL import. */\nexport const faqtsBrowserExecutor: FaqtsModuleExecutor = executeFaqtsModuleInBrowser"]}
@@ -1,14 +0,0 @@
1
- /**
2
- * faits — 浏览器执行器:Blob URL → import() 整段一次执行
3
- *
4
- * 浏览器侧被执行的模块若有裸说明符(`@faicad/faq/sdk` 等),由宿主页面的
5
- * importmap 解析(B 通道 ① 语义);重写钩子负责把它改到宿主资源。
6
- */
7
- /**
8
- * Execute module code once by importing it through a Blob URL, returning the
9
- * ES module namespace snapshot.
10
- * @param jsCode - the compiled, de-typed JavaScript module source to execute.
11
- * @returns the ES module namespace snapshot of the imported module.
12
- */
13
- export declare function executeFaqtsModuleInBrowser(jsCode: string): Promise<Record<string, unknown>>;
14
- //# sourceMappingURL=exec-blob.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec-blob.d.ts","sourceRoot":"","sources":["../../src/faqts/exec-blob.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOlG"}
@@ -1,22 +0,0 @@
1
- /**
2
- * faits — 浏览器执行器:Blob URL → import() 整段一次执行
3
- *
4
- * 浏览器侧被执行的模块若有裸说明符(`@faicad/faq/sdk` 等),由宿主页面的
5
- * importmap 解析(B 通道 ① 语义);重写钩子负责把它改到宿主资源。
6
- */
7
- /**
8
- * Execute module code once by importing it through a Blob URL, returning the
9
- * ES module namespace snapshot.
10
- * @param jsCode - the compiled, de-typed JavaScript module source to execute.
11
- * @returns the ES module namespace snapshot of the imported module.
12
- */
13
- export async function executeFaqtsModuleInBrowser(jsCode) {
14
- const url = URL.createObjectURL(new Blob([jsCode], { type: 'text/javascript' }));
15
- try {
16
- return (await import(/* @vite-ignore */ url));
17
- }
18
- finally {
19
- URL.revokeObjectURL(url);
20
- }
21
- }
22
- //# sourceMappingURL=exec-blob.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec-blob.js","sourceRoot":"","sources":["../../src/faqts/exec-blob.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,MAAc;IAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAA;IAChF,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAA4B,CAAA;IAC1E,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC","sourcesContent":["/**\n * faits — 浏览器执行器:Blob URL → import() 整段一次执行\n *\n * 浏览器侧被执行的模块若有裸说明符(`@faicad/faq/sdk` 等),由宿主页面的\n * importmap 解析(B 通道 ① 语义);重写钩子负责把它改到宿主资源。\n */\n\n/**\n * Execute module code once by importing it through a Blob URL, returning the\n * ES module namespace snapshot.\n * @param jsCode - the compiled, de-typed JavaScript module source to execute.\n * @returns the ES module namespace snapshot of the imported module.\n */\nexport async function executeFaqtsModuleInBrowser(jsCode: string): Promise<Record<string, unknown>> {\n const url = URL.createObjectURL(new Blob([jsCode], { type: 'text/javascript' }))\n try {\n return (await import(/* @vite-ignore */ url)) as Record<string, unknown>\n } finally {\n URL.revokeObjectURL(url)\n }\n}"]}
@@ -1,15 +0,0 @@
1
- /**
2
- * faits — Node 执行器(整段 import() 一次执行)
3
- *
4
- * Node 侧 import() 从 data:/blob: URL 开始无法解析其中的相对说明符
5
- * (vitest/实验已验证),因此落到唯一临时 `.mjs` 文件,经 file: URL
6
- * import 一次。文件位于系统 tmp,执行后立即清理。
7
- */
8
- /**
9
- * Write module code to a unique temporary .mjs file and import it once,
10
- * returning the ES module namespace snapshot.
11
- * @param jsCode - the compiled, de-typed JavaScript module source to execute.
12
- * @returns the ES module namespace snapshot of the imported module.
13
- */
14
- export declare function executeFaqtsModuleInNode(jsCode: string): Promise<Record<string, unknown>>;
15
- //# sourceMappingURL=exec-node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec-node.d.ts","sourceRoot":"","sources":["../../src/faqts/exec-node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAS/F"}
@@ -1,29 +0,0 @@
1
- /**
2
- * faits — Node 执行器(整段 import() 一次执行)
3
- *
4
- * Node 侧 import() 从 data:/blob: URL 开始无法解析其中的相对说明符
5
- * (vitest/实验已验证),因此落到唯一临时 `.mjs` 文件,经 file: URL
6
- * import 一次。文件位于系统 tmp,执行后立即清理。
7
- */
8
- import { writeFileSync, mkdtempSync, rmSync } from 'node:fs';
9
- import { join } from 'node:path';
10
- import { tmpdir } from 'node:os';
11
- import { pathToFileURL } from 'node:url';
12
- /**
13
- * Write module code to a unique temporary .mjs file and import it once,
14
- * returning the ES module namespace snapshot.
15
- * @param jsCode - the compiled, de-typed JavaScript module source to execute.
16
- * @returns the ES module namespace snapshot of the imported module.
17
- */
18
- export async function executeFaqtsModuleInNode(jsCode) {
19
- const dir = mkdtempSync(join(tmpdir(), 'faqts-'));
20
- const file = join(dir, 'mod.mjs');
21
- writeFileSync(file, jsCode, 'utf-8');
22
- try {
23
- return (await import(/* @vite-ignore */ pathToFileURL(file).href));
24
- }
25
- finally {
26
- rmSync(dir, { recursive: true, force: true });
27
- }
28
- }
29
- //# sourceMappingURL=exec-node.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec-node.js","sourceRoot":"","sources":["../../src/faqts/exec-node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAc;IAC3D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IACjC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAA4B,CAAA;IAC/F,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC","sourcesContent":["/**\n * faits — Node 执行器(整段 import() 一次执行)\n *\n * Node 侧 import() 从 data:/blob: URL 开始无法解析其中的相对说明符\n * (vitest/实验已验证),因此落到唯一临时 `.mjs` 文件,经 file: URL\n * import 一次。文件位于系统 tmp,执行后立即清理。\n */\n\nimport { writeFileSync, mkdtempSync, rmSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { tmpdir } from 'node:os'\nimport { pathToFileURL } from 'node:url'\n\n/**\n * Write module code to a unique temporary .mjs file and import it once,\n * returning the ES module namespace snapshot.\n * @param jsCode - the compiled, de-typed JavaScript module source to execute.\n * @returns the ES module namespace snapshot of the imported module.\n */\nexport async function executeFaqtsModuleInNode(jsCode: string): Promise<Record<string, unknown>> {\n const dir = mkdtempSync(join(tmpdir(), 'faqts-'))\n const file = join(dir, 'mod.mjs')\n writeFileSync(file, jsCode, 'utf-8')\n try {\n return (await import(/* @vite-ignore */ pathToFileURL(file).href)) as Record<string, unknown>\n } finally {\n rmSync(dir, { recursive: true, force: true })\n }\n}"]}
@@ -1,74 +0,0 @@
1
- /**
2
- * faits — import 声明解析与说明符重写(Phase D, pipeline 第 2–3 步)
3
- *
4
- * 说明:faits 复用 Phase B 的导入通道 ①② —— 即"只负责把它所依赖的
5
- * 裸说明符改写到宿主能解析的绝对 URL(file:/blob:/http(s):),其余
6
- * 保持原样"。与 faijs 的 ModuleResolver(Phase E V5.2, plan §4.1)不
7
- * 同,此处 **不实现** 模块仓库解析,只做确定性的语法级重写:
8
- *
9
- * - 相对说明符(`./x`、`../x`)→ 可选按 base URL 绝对化,否则保留
10
- * - `@faicad/faijs` 及其子路径(含 `/sdk`)→ **零替换**,由宿主 importmap 解析
11
- * - 其它裸说明符 → 走宿主提供的 rewrite 表(复用 B 通道 ①② 的产物)
12
- *
13
- * acorn 仅用于定位每个 import 声明在源码中的精确 span;替换用字符串
14
- * 手术完成,不重建整份 AST,避免丢注释/格式(保持行号定位)。
15
- */
16
- /**
17
- * The exact location of one static import declaration within module source,
18
- * used to rewrite its specifier without rebuilding the AST.
19
- */
20
- export interface FaqtsImportSpan {
21
- /** import 声明的原始说明符,如 `./partner`、`@faqad/faqjs/sdk` */
22
- specifier: string;
23
- /** 说明符字符串在源码中的起始偏移(不含引号) */
24
- start: number;
25
- /** 说明符字符串在源码中的结束偏移(不含引号) */
26
- end: number;
27
- /** 是否裸说明符(既非相对路径也非绝对 URL) */
28
- bare: boolean;
29
- }
30
- /**
31
- * A host-provided rewrite hook that maps an import specifier to the URL the
32
- * host can resolve. Returning `undefined` leaves the specifier unchanged.
33
- */
34
- export type FaqtsRewriteFn = (specifier: string, ctx: {
35
- bare: boolean;
36
- }) => string | undefined;
37
- /**
38
- * 解析模块源码(必须是已去类型的 JS),返回全部静态 import 的说明符/位置。
39
- *
40
- * 只处理顶层 import 声明(ESM 静态导入);动态 import() 属于运行时行为,
41
- * 不在重写范围内——若 faits 需要动态导入,宿主 importmap 自行兜底。
42
- */
43
- /**
44
- * Parse module source (de-typed JS) and return the specifier and location of
45
- * every static top-level import declaration. Dynamic import() is runtime
46
- * behavior and is not part of the rewrite scope.
47
- * @param code - the module JavaScript source text.
48
- * @returns an array of import spans covering each static import declaration.
49
- */
50
- export declare function findImports(code: string): FaqtsImportSpan[];
51
- /**
52
- * 重写模块代码中的 import 说明符:按 span(start/end)对源码做替换。
53
- *
54
- * 规则(按优先级):
55
- * 1. 保留前缀(`@faicad/faij` 家族)→ 不改(宿主 importmap 解析)
56
- * 2. rewrite 钩子返回非 `undefined` → 用之
57
- * 3. 相对说明符且给了 baseURL → 绝对化
58
- * 4. 其余 → 原样保留
59
- *
60
- * 用一次 `code` 全串替换(从后往前保证 span 位置不漂移)。
61
- */
62
- /**
63
- * Rewrite import specifiers in module code by splicing the source at each
64
- * span's start/end offsets. Priority: reserved prefixes stay unchanged, then
65
- * the rewrite hook's result, then relative absolute-ization, else preserved.
66
- * @param code - the module JavaScript source text to rewrite.
67
- * @param options - rewrite hook and optional base URL for relative specifiers.
68
- * @returns the rewritten module source text.
69
- */
70
- export declare function rewriteImports(code: string, options?: {
71
- rewrite?: FaqtsRewriteFn;
72
- baseURL?: string | URL;
73
- }): string;
74
- //# sourceMappingURL=imports.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../../src/faqts/imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,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;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,KAAK,MAAM,GAAG,SAAS,CAAA;AAK9F;;;;;GAKG;AACH;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAa3D;AAMD;;;;;;;;;;GAUG;AACH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;CAClB,GACL,MAAM,CAuBR"}