@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.
- package/dist/api/api-namespace.d.ts +7 -0
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +44 -17
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/boolean.d.ts +19 -0
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +71 -12
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +12 -8
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/compound-geom.d.ts +45 -0
- package/dist/api/compound-geom.d.ts.map +1 -0
- package/dist/api/compound-geom.js +85 -0
- package/dist/api/compound-geom.js.map +1 -0
- package/dist/api/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +7 -4
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +1 -0
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +131 -3
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts.map +1 -1
- package/dist/api/face-ref.js +7 -4
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +6 -5
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/cad/script-face.d.ts +1 -1
- package/dist/api/generated/cad/script-face.d.ts.map +1 -1
- package/dist/api/generated/cad/script-face.js +1 -2
- package/dist/api/generated/cad/script-face.js.map +1 -1
- package/dist/api/generated/operations.js +16 -16
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
- package/dist/api/generated/script-face-manifest.js +0 -2
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -7
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +2 -4
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.js +1 -1
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/topology.d.ts +0 -56
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +19 -68
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/import-brep.d.ts +36 -0
- package/dist/api/import-brep.d.ts.map +1 -0
- package/dist/api/import-brep.js +72 -0
- package/dist/api/import-brep.js.map +1 -0
- package/dist/api/import-step.d.ts +28 -0
- package/dist/api/import-step.d.ts.map +1 -0
- package/dist/api/import-step.js +57 -0
- package/dist/api/import-step.js.map +1 -0
- package/dist/api/index.d.ts +8 -12
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +22 -16
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +2 -1
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +3 -1
- package/dist/api/internal/compat-projection.d.ts.map +1 -1
- package/dist/api/internal/compat-projection.js +8 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/replica-role-table.d.ts +36 -0
- package/dist/api/internal/replica-role-table.d.ts.map +1 -0
- package/dist/api/internal/replica-role-table.js +73 -0
- package/dist/api/internal/replica-role-table.js.map +1 -0
- package/dist/api/internal/result-unwrap.d.ts +3 -1
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +2 -2
- package/dist/api/internal/result-unwrap.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +1 -0
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/occt-kernel-bridge.d.ts +105 -27
- package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
- package/dist/api/occt-kernel-bridge.js +255 -41
- package/dist/api/occt-kernel-bridge.js.map +1 -1
- package/dist/api/pattern.d.ts +32 -0
- package/dist/api/pattern.d.ts.map +1 -0
- package/dist/api/pattern.js +85 -0
- package/dist/api/pattern.js.map +1 -0
- package/dist/api/place.d.ts +35 -0
- package/dist/api/place.d.ts.map +1 -0
- package/dist/api/place.js +113 -0
- package/dist/api/place.js.map +1 -0
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +10 -3
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +145 -0
- package/dist/api/replicate.d.ts.map +1 -0
- package/dist/api/replicate.js +351 -0
- package/dist/api/replicate.js.map +1 -0
- package/dist/api/revolve.d.ts +36 -0
- package/dist/api/revolve.d.ts.map +1 -0
- package/dist/api/revolve.js +165 -0
- package/dist/api/revolve.js.map +1 -0
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +1 -0
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +1 -0
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/sketch.d.ts.map +1 -1
- package/dist/api/sketch.js +1 -0
- package/dist/api/sketch.js.map +1 -1
- package/dist/api/split.d.ts +31 -0
- package/dist/api/split.d.ts.map +1 -0
- package/dist/api/split.js +96 -0
- package/dist/api/split.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +17 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +86 -66
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface/projection-overrides.d.ts.map +1 -1
- package/dist/api/surface/projection-overrides.js +6 -0
- package/dist/api/surface/projection-overrides.js.map +1 -1
- package/dist/api/topo-resolve.d.ts.map +1 -1
- package/dist/api/topo-resolve.js +65 -3
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/transform.d.ts +4 -0
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +44 -12
- package/dist/api/transform.js.map +1 -1
- package/dist/boolean/deriveNormals.d.ts +5 -4
- package/dist/boolean/deriveNormals.d.ts.map +1 -1
- package/dist/boolean/deriveNormals.js +24 -7
- package/dist/boolean/deriveNormals.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +34 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +62 -22
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +66 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +44 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -5
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +246 -9
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +96 -0
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/types.d.ts +66 -6
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +6 -1
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/face-evolution.d.ts +78 -8
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +130 -17
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +108 -12
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +6 -28
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +6 -17
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +13 -0
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +27 -0
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +46 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +48 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +4 -4
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +7 -4
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +14 -4
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/module-registry.d.ts +3 -1
- package/dist/cad-runtime/module-registry.d.ts.map +1 -1
- package/dist/cad-runtime/module-registry.js +13 -1
- package/dist/cad-runtime/module-registry.js.map +1 -1
- package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
- package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
- package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
- package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
- package/dist/cad-runtime/runtime.d.ts +52 -2
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +180 -9
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +22 -0
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +82 -12
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +38 -0
- package/dist/env-agnostic.d.ts.map +1 -0
- package/dist/env-agnostic.js +29 -0
- package/dist/env-agnostic.js.map +1 -0
- package/dist/fcstd/attachment.d.ts +8 -1
- package/dist/fcstd/attachment.d.ts.map +1 -1
- package/dist/fcstd/attachment.js +7 -1
- package/dist/fcstd/attachment.js.map +1 -1
- package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
- package/dist/fcstd/build-fai-zip.js +12 -7
- package/dist/fcstd/build-fai-zip.js.map +1 -1
- package/dist/fcstd/codegen.d.ts +10 -1
- package/dist/fcstd/codegen.d.ts.map +1 -1
- package/dist/fcstd/codegen.js +158 -49
- package/dist/fcstd/codegen.js.map +1 -1
- package/dist/fcstd/contour.d.ts.map +1 -1
- package/dist/fcstd/contour.js +23 -24
- package/dist/fcstd/contour.js.map +1 -1
- package/dist/fcstd/convert.d.ts +2 -18
- package/dist/fcstd/convert.d.ts.map +1 -1
- package/dist/fcstd/convert.js +35 -53
- package/dist/fcstd/convert.js.map +1 -1
- package/dist/fcstd/expressions.d.ts +24 -0
- package/dist/fcstd/expressions.d.ts.map +1 -1
- package/dist/fcstd/expressions.js +91 -0
- package/dist/fcstd/expressions.js.map +1 -1
- package/dist/fcstd/external-geo.d.ts +12 -1
- package/dist/fcstd/external-geo.d.ts.map +1 -1
- package/dist/fcstd/external-geo.js +15 -1
- package/dist/fcstd/external-geo.js.map +1 -1
- package/dist/fcstd/feature-translate.d.ts +21 -1
- package/dist/fcstd/feature-translate.d.ts.map +1 -1
- package/dist/fcstd/feature-translate.js +124 -8
- package/dist/fcstd/feature-translate.js.map +1 -1
- package/dist/fcstd/structural-types.d.ts +83 -0
- package/dist/fcstd/structural-types.d.ts.map +1 -0
- package/dist/fcstd/structural-types.js +121 -0
- package/dist/fcstd/structural-types.js.map +1 -0
- package/dist/index.d.ts +7 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -16
- package/dist/index.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts +71 -0
- package/dist/lang/determinism-scanner.d.ts.map +1 -0
- package/dist/lang/determinism-scanner.js +625 -0
- package/dist/lang/determinism-scanner.js.map +1 -0
- package/dist/lang/symbol-table.d.ts +31 -0
- package/dist/lang/symbol-table.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +13 -19
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +13 -19
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/symbol-table.js +50 -1
- package/dist/lang/symbol-table.js.map +1 -1
- package/dist/mesh/creased-normals.d.ts +50 -0
- package/dist/mesh/creased-normals.d.ts.map +1 -0
- package/dist/mesh/creased-normals.js +114 -0
- package/dist/mesh/creased-normals.js.map +1 -0
- package/dist/mesh/decoration-provider.d.ts +53 -0
- package/dist/mesh/decoration-provider.d.ts.map +1 -0
- package/dist/mesh/decoration-provider.js +21 -0
- package/dist/mesh/decoration-provider.js.map +1 -0
- package/dist/mesh/engrave.d.ts +4 -0
- package/dist/mesh/engrave.d.ts.map +1 -1
- package/dist/mesh/engrave.js +22 -31
- package/dist/mesh/engrave.js.map +1 -1
- package/dist/mesh/index.d.ts +5 -14
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +7 -18
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +2 -1
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +5 -7
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts +5 -18
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +4 -48
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/stl-loader.d.ts +23 -0
- package/dist/mesh/stl-loader.d.ts.map +1 -0
- package/dist/mesh/stl-loader.js +139 -0
- package/dist/mesh/stl-loader.js.map +1 -0
- package/dist/module-resolver/parse-imports.d.ts +37 -0
- package/dist/module-resolver/parse-imports.d.ts.map +1 -0
- package/dist/module-resolver/parse-imports.js +39 -0
- package/dist/module-resolver/parse-imports.js.map +1 -0
- package/dist/module-resolver/resolver.d.ts +1 -1
- package/dist/module-resolver/resolver.js +2 -2
- package/dist/module-resolver/resolver.js.map +1 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +37 -4
- package/dist/node-host/cli.js.map +1 -1
- package/dist/primitives/text/cjk-font.d.ts +42 -0
- package/dist/primitives/text/cjk-font.d.ts.map +1 -0
- package/dist/primitives/text/cjk-font.js +86 -0
- package/dist/primitives/text/cjk-font.js.map +1 -0
- package/dist/runtime-state.d.ts +18 -6
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +9 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +2 -2
- package/dist/sdk.js +2 -2
- package/dist/sdk.js.map +1 -1
- package/dist/shape.d.ts +15 -0
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +26 -3
- package/dist/shape.js.map +1 -1
- package/dist/symbol-table.d.ts +15 -0
- package/dist/symbol-table.d.ts.map +1 -0
- package/dist/symbol-table.js +14 -0
- package/dist/symbol-table.js.map +1 -0
- package/dist/topology/naming/build-naming.d.ts +14 -30
- package/dist/topology/naming/build-naming.d.ts.map +1 -1
- package/dist/topology/naming/build-naming.js +21 -54
- package/dist/topology/naming/build-naming.js.map +1 -1
- package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
- package/dist/topology/naming/capture-topo-ref.js +5 -0
- package/dist/topology/naming/capture-topo-ref.js.map +1 -1
- package/dist/topology/naming/index.d.ts +3 -0
- package/dist/topology/naming/index.d.ts.map +1 -1
- package/dist/topology/naming/index.js +3 -0
- package/dist/topology/naming/index.js.map +1 -1
- package/dist/topology/naming/lineage-resolve.d.ts +80 -0
- package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
- package/dist/topology/naming/lineage-resolve.js +120 -0
- package/dist/topology/naming/lineage-resolve.js.map +1 -0
- package/dist/topology/naming/lineage.d.ts +349 -0
- package/dist/topology/naming/lineage.d.ts.map +1 -0
- package/dist/topology/naming/lineage.js +398 -0
- package/dist/topology/naming/lineage.js.map +1 -0
- package/dist/topology/naming/migrate.d.ts +41 -0
- package/dist/topology/naming/migrate.d.ts.map +1 -0
- package/dist/topology/naming/migrate.js +88 -0
- package/dist/topology/naming/migrate.js.map +1 -0
- package/dist/topology/naming/role-name.d.ts +176 -0
- package/dist/topology/naming/role-name.d.ts.map +1 -0
- package/dist/topology/naming/role-name.js +344 -0
- package/dist/topology/naming/role-name.js.map +1 -0
- package/dist/topology/naming/roles.d.ts +20 -22
- package/dist/topology/naming/roles.d.ts.map +1 -1
- package/dist/topology/naming/roles.js +51 -49
- package/dist/topology/naming/roles.js.map +1 -1
- package/dist/topology/naming/types.d.ts +65 -18
- package/dist/topology/naming/types.d.ts.map +1 -1
- package/dist/topology/naming/types.js.map +1 -1
- package/dist/vendored/brepjs/kernel/index.d.ts +5 -0
- package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
- package/dist/vendored/brepjs/kernel/index.js +11 -0
- package/dist/vendored/brepjs/kernel/index.js.map +1 -1
- package/dist/weapp.d.ts +4 -4
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +7 -4
- package/dist/weapp.js.map +1 -1
- package/package.json +16 -14
- package/dist/api/compat/index.d.ts +0 -173
- package/dist/api/compat/index.d.ts.map +0 -1
- package/dist/api/compat/index.js +0 -222
- package/dist/api/compat/index.js.map +0 -1
- package/dist/api/compound.d.ts +0 -108
- package/dist/api/compound.d.ts.map +0 -1
- package/dist/api/compound.js +0 -162
- package/dist/api/compound.js.map +0 -1
- package/dist/api/copy.d.ts +0 -39
- package/dist/api/copy.d.ts.map +0 -1
- package/dist/api/copy.js +0 -81
- package/dist/api/copy.js.map +0 -1
- package/dist/api/fai_drill.d.ts +0 -46
- package/dist/api/fai_drill.d.ts.map +0 -1
- package/dist/api/fai_drill.js +0 -230
- package/dist/api/fai_drill.js.map +0 -1
- package/dist/api/fai_extrude.d.ts +0 -36
- package/dist/api/fai_extrude.d.ts.map +0 -1
- package/dist/api/fai_extrude.js +0 -78
- package/dist/api/fai_extrude.js.map +0 -1
- package/dist/api/fai_split.d.ts +0 -46
- package/dist/api/fai_split.d.ts.map +0 -1
- package/dist/api/fai_split.js +0 -253
- package/dist/api/fai_split.js.map +0 -1
- package/dist/api/load.d.ts +0 -39
- package/dist/api/load.d.ts.map +0 -1
- package/dist/api/load.js +0 -82
- package/dist/api/load.js.map +0 -1
- package/dist/api/svgExtrude.d.ts +0 -32
- package/dist/api/svgExtrude.d.ts.map +0 -1
- package/dist/api/svgExtrude.js +0 -73
- package/dist/api/svgExtrude.js.map +0 -1
- package/dist/api/text.d.ts +0 -34
- package/dist/api/text.d.ts.map +0 -1
- package/dist/api/text.js +0 -100
- package/dist/api/text.js.map +0 -1
- package/dist/brep/text/fontTestHelper.d.ts +0 -30
- package/dist/brep/text/fontTestHelper.d.ts.map +0 -1
- package/dist/brep/text/fontTestHelper.js +0 -57
- package/dist/brep/text/fontTestHelper.js.map +0 -1
- package/dist/cad-runtime/module-executor.d.ts +0 -271
- package/dist/cad-runtime/module-executor.d.ts.map +0 -1
- package/dist/cad-runtime/module-executor.js +0 -630
- package/dist/cad-runtime/module-executor.js.map +0 -1
- package/dist/cad-runtime/terminal-dag.d.ts +0 -65
- package/dist/cad-runtime/terminal-dag.d.ts.map +0 -1
- package/dist/cad-runtime/terminal-dag.js +0 -167
- package/dist/cad-runtime/terminal-dag.js.map +0 -1
- package/dist/faqts/browser.d.ts +0 -16
- package/dist/faqts/browser.d.ts.map +0 -1
- package/dist/faqts/browser.js +0 -13
- package/dist/faqts/browser.js.map +0 -1
- package/dist/faqts/exec-blob.d.ts +0 -14
- package/dist/faqts/exec-blob.d.ts.map +0 -1
- package/dist/faqts/exec-blob.js +0 -22
- package/dist/faqts/exec-blob.js.map +0 -1
- package/dist/faqts/exec-node.d.ts +0 -15
- package/dist/faqts/exec-node.d.ts.map +0 -1
- package/dist/faqts/exec-node.js +0 -29
- package/dist/faqts/exec-node.js.map +0 -1
- package/dist/faqts/imports.d.ts +0 -74
- package/dist/faqts/imports.d.ts.map +0 -1
- package/dist/faqts/imports.js +0 -95
- package/dist/faqts/imports.js.map +0 -1
- package/dist/faqts/index.d.ts +0 -22
- package/dist/faqts/index.d.ts.map +0 -1
- package/dist/faqts/index.js +0 -21
- package/dist/faqts/index.js.map +0 -1
- package/dist/faqts/node.d.ts +0 -23
- package/dist/faqts/node.d.ts.map +0 -1
- package/dist/faqts/node.js +0 -23
- package/dist/faqts/node.js.map +0 -1
- package/dist/faqts/run.d.ts +0 -62
- package/dist/faqts/run.d.ts.map +0 -1
- package/dist/faqts/run.js +0 -62
- package/dist/faqts/run.js.map +0 -1
- package/dist/faqts/transform.d.ts +0 -43
- package/dist/faqts/transform.d.ts.map +0 -1
- package/dist/faqts/transform.js +0 -35
- package/dist/faqts/transform.js.map +0 -1
- package/dist/lang/compile.d.ts +0 -50
- package/dist/lang/compile.d.ts.map +0 -1
- package/dist/lang/compile.js +0 -368
- package/dist/lang/compile.js.map +0 -1
- package/dist/lang/keep.d.ts +0 -109
- package/dist/lang/keep.d.ts.map +0 -1
- package/dist/lang/keep.js +0 -226
- package/dist/lang/keep.js.map +0 -1
- package/dist/lang/parser.d.ts +0 -91
- package/dist/lang/parser.d.ts.map +0 -1
- package/dist/lang/parser.js +0 -1594
- package/dist/lang/parser.js.map +0 -1
- package/dist/mesh/drill-hole/DrillHoleCore.d.ts +0 -90
- package/dist/mesh/drill-hole/DrillHoleCore.d.ts.map +0 -1
- package/dist/mesh/drill-hole/DrillHoleCore.js +0 -287
- package/dist/mesh/drill-hole/DrillHoleCore.js.map +0 -1
- package/dist/mesh/drill-hole/drill-types.d.ts +0 -34
- package/dist/mesh/drill-hole/drill-types.d.ts.map +0 -1
- package/dist/mesh/drill-hole/drill-types.js +0 -7
- package/dist/mesh/drill-hole/drill-types.js.map +0 -1
- package/dist/mesh/fai_drill.d.ts +0 -21
- package/dist/mesh/fai_drill.d.ts.map +0 -1
- package/dist/mesh/fai_drill.js +0 -92
- package/dist/mesh/fai_drill.js.map +0 -1
- package/dist/mesh/fai_extrude.d.ts +0 -24
- package/dist/mesh/fai_extrude.d.ts.map +0 -1
- package/dist/mesh/fai_extrude.js +0 -42
- package/dist/mesh/fai_extrude.js.map +0 -1
- package/dist/mesh/fai_split.d.ts +0 -164
- package/dist/mesh/fai_split.d.ts.map +0 -1
- package/dist/mesh/fai_split.js +0 -269
- package/dist/mesh/fai_split.js.map +0 -1
- package/dist/primitives/svg-extrude.d.ts +0 -43
- package/dist/primitives/svg-extrude.d.ts.map +0 -1
- package/dist/primitives/svg-extrude.js +0 -78
- package/dist/primitives/svg-extrude.js.map +0 -1
- package/dist/primitives/text/cjk.d.ts +0 -61
- package/dist/primitives/text/cjk.d.ts.map +0 -1
- package/dist/primitives/text/cjk.js +0 -215
- package/dist/primitives/text/cjk.js.map +0 -1
- package/dist/primitives/text-geometry.d.ts +0 -47
- package/dist/primitives/text-geometry.d.ts.map +0 -1
- package/dist/primitives/text-geometry.js +0 -127
- package/dist/primitives/text-geometry.js.map +0 -1
- package/dist/test-helpers.d.ts +0 -31
- package/dist/test-helpers.d.ts.map +0 -1
- package/dist/test-helpers.js +0 -55
- package/dist/test-helpers.js.map +0 -1
- package/dist/vendored/brepjs/core/kernelReentrancy.d.ts +0 -41
- package/dist/vendored/brepjs/core/kernelReentrancy.d.ts.map +0 -1
- package/dist/vendored/brepjs/core/kernelReentrancy.js +0 -68
- package/dist/vendored/brepjs/core/kernelReentrancy.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"determinism-scanner.js","sourceRoot":"","sources":["../../src/lang/determinism-scanner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * determinism-scanner — .fai.js determinism gate (B-tier, conservative taint)\n *\n * Decides statically whether any non-deterministic value (`Math.random`,\n * `Date.now` / `new Date`, `crypto.*`, `performance.now`) flows into geometry\n * generation. Conservative policy: anything the analysis cannot prove safe is a\n * violation — \"when in doubt, reject\".\n *\n * Model:\n * - **sources** produce tainted values.\n * - **propagation** moves taint through arithmetic, member access, assignment,\n * arrays/objects, calls, and implicit control flow.\n * - **sinks** are geometry-generating call sites: members of the `cad`\n * namespace (and any library namespace), named library callees, and unknown\n * function calls (conservative). `console.*` and the pure built-ins are safe\n * containers — taint may pass through them but does not, by itself, violate.\n *\n * This gate is entry prevention; exit equivalence is checked separately by\n * cross-kernel parity tests (docs/reproducibility-contract.md §5).\n */\n\nimport { parse as acornParse } from 'acorn'\n\n// ── types ──\n\n/** Determinism gate policy for execution-time scanning. */\nexport type DeterminismPolicy = 'off' | 'warn' | 'error'\n\n/** Why a value is non-deterministic (a source). */\nexport type DeterminismSource =\n | 'Math.random'\n | 'Date'\n | 'crypto'\n | 'performance.now'\n | 'getRandomValues'\n\n/** A single conservatively-flagged violation. */\nexport interface DeterminismViolation {\n /** 1-based line of the offending sink / flow. */\n lineNo: number\n /** The non-deterministic source kind that reached geometry. */\n source: DeterminismSource\n /** Human-readable message (for tooling / self-correction). */\n message: string\n}\n\n/** Scan options. */\nexport interface DeterminismScanOptions {\n /** Default geometry namespace name (default `'cad'`). */\n defaultNs?: string\n /**\n * Extra geometry namespace binding names (`import * as sheet from ...` →\n * `'sheet'`). Member calls on these are geometry sinks.\n */\n extraNamespaces?: string[]\n /**\n * Extra named callees treated as geometry functions (`import { gear } from\n * ...` → `'gear'`). Direct calls to these are geometry sinks.\n */\n extraCallees?: string[]\n /**\n * Strict parse: when true, a source that cannot be parsed as plain JS\n * (e.g. TypeScript syntax) throws a SyntaxError instead of silently\n * returning ok. Used for library-source scanning where the input is\n * contractually compiled JS — type stripping is not supported and a\n * parse failure must surface loudly (never fall back, never stay silent).\n * Default false: the main .fai.js parse path owns syntax diagnostics.\n */\n strict?: boolean\n}\n\n/** Scan result. */\nexport interface DeterminismScanResult {\n /** True iff `violations` is empty. */\n ok: boolean\n violations: DeterminismViolation[]\n}\n\n// ── rule tables ──\n\n/** Containers (identifier → member) whose member access is a non-deterministic source. */\nconst SOURCE_MEMBERS: Record<string, Set<string>> = {\n Math: new Set(['random']),\n Date: new Set(['now', 'parse', 'UTC']),\n performance: new Set(['now']),\n crypto: new Set(['getRandomValues', 'randomUUID']),\n}\n\n/**\n * Identifiers that are themselves non-deterministic values (a bare `Date` or\n * `crypto` reference is a source — `new Date()` / `crypto.subtle` alias paths).\n */\nconst SOURCE_IDENTS = new Set<string>(['Date', 'crypto', 'getRandomValues', 'performance'])\n\n/**\n * Safe containers: member calls on these neither violate nor introduce taint;\n * taint only propagates through their arguments (pure/observable-only globals).\n */\nconst SAFE_CONTAINERS = new Set<string>([\n 'console', 'Math', 'JSON', 'Number', 'String', 'Boolean', 'Object', 'Array',\n 'Map', 'Set', 'Symbol', 'RegExp', 'Promise', 'Error', 'Intl', 'Reflect',\n])\n\n/** Safe top-level functions (pure/known, not geometry). */\nconst SAFE_FUNCTIONS = new Set<string>([\n 'parseInt', 'parseFloat', 'isNaN', 'isFinite', 'String', 'Number', 'Boolean',\n 'encodeURI', 'encodeURIComponent', 'decodeURI', 'decodeURIComponent',\n])\n\n// ── scope ──\n\ninterface Scope {\n parent: Scope | null\n tainted: Map<string, boolean>\n}\n\nfunction childScope(parent: Scope): Scope {\n return { parent, tainted: new Map() }\n}\n\nfunction lookupTaint(scope: Scope, name: string): boolean {\n let s: Scope | null = scope\n while (s) {\n const v = s.tainted.get(name)\n if (v !== undefined) return v\n s = s.parent\n }\n return false\n}\n\nfunction markTaint(scope: Scope, name: string): void {\n // Write through to the nearest scope that declares `name`, else current scope.\n let s: Scope | null = scope\n while (s) {\n if (s.tainted.has(name)) {\n s.tainted.set(name, true)\n return\n }\n s = s.parent\n }\n scope.tainted.set(name, true)\n}\n\n// ── scanner ──\n\n/** acorn node (structural access only; see security-scanner for the same pattern). */\ntype Node = any\n\n/**\n * Static non-determinism scanner (B-tier, conservative).\n * @param code - the `.fai.js` / library source text.\n * @param opts - scan options (geometry namespace/callee hints).\n * @returns scan result with all violations.\n */\nexport function scanDeterminism(code: string, opts: DeterminismScanOptions = {}): DeterminismScanResult {\n const defaultNs = opts.defaultNs ?? 'cad'\n const geometryNamespaces = new Set<string>([defaultNs, ...(opts.extraNamespaces ?? [])])\n const geometryCallees = new Set<string>(opts.extraCallees ?? [])\n\n const violations: DeterminismViolation[] = []\n\n let ast: Node\n try {\n ast = acornParse(code, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n locations: true,\n })\n } catch (e) {\n if (opts.strict) {\n const loc = (e as { loc?: { line?: number; column?: number } }).loc\n const at = loc ? ` at line ${loc.line}:${loc.column}` : ''\n throw new SyntaxError(\n `[determinism] library source is not valid plain JavaScript${at} ` +\n `(type stripping is not supported; libraries must ship compiled JS): ${(e as Error).message}`,\n { cause: e },\n )\n }\n // A syntax error is not a determinism violation; the main parse path owns\n // syntax diagnostics. Return ok (empty).\n return { ok: true, violations: [] }\n }\n\n const rootScope: Scope = { parent: null, tainted: new Map() }\n\n function lineOf(node: Node): number {\n return node?.loc?.start?.line ?? 1\n }\n\n function report(node: Node, source: DeterminismSource, detail: string): void {\n violations.push({\n lineNo: lineOf(node),\n source,\n message: `[determinism] ${detail} (non-deterministic value reaches geometry)`,\n })\n }\n\n /** Return the source kind of a call/construct callee, else null. */\n function sourceKindOfCallee(callee: Node): DeterminismSource | null {\n if (\n callee?.type === 'MemberExpression' &&\n callee.object?.type === 'Identifier' &&\n !callee.computed &&\n callee.property?.type === 'Identifier'\n ) {\n const members = SOURCE_MEMBERS[callee.object.name]\n if (members?.has(callee.property.name)) {\n const o = callee.object.name\n if (o === 'Math') return 'Math.random'\n if (o === 'Date') return 'Date'\n if (o === 'crypto') return callee.property.name === 'randomUUID' ? 'crypto' : 'getRandomValues'\n return 'performance.now'\n }\n }\n if (callee?.type === 'Identifier' && SOURCE_IDENTS.has(callee.name)) {\n if (callee.name === 'performance') return 'performance.now'\n if (callee.name === 'getRandomValues') return 'getRandomValues'\n return callee.name as DeterminismSource\n }\n return null\n }\n\n /**\n * Whether a call/construct site is a geometry sink, and if so, check its\n * arguments for taint. Returns the tainted-ness of the call result.\n */\n function handleCall(node: Node, scope: Scope): boolean {\n const callee = node.callee\n let resultTainted = false\n\n // A source call (Date.now / Math.random / crypto.* / performance.now)\n // produces a tainted result regardless of its arguments.\n const srcKind = sourceKindOfCallee(callee)\n if (srcKind) {\n lastSource = srcKind\n // Still walk arguments: nested calls inside may themselves violate.\n for (const a of node.arguments ?? []) {\n evalTaint(a?.type === 'SpreadElement' ? a.argument : a, scope)\n }\n return true\n }\n\n // Evaluate argument taint (propagation, eager evaluation).\n const argTaints: boolean[] = []\n for (const a of node.arguments ?? []) {\n if (a?.type === 'SpreadElement') {\n argTaints.push(evalTaint(a.argument, scope))\n } else {\n argTaints.push(evalTaint(a, scope))\n }\n if (argTaints[argTaints.length - 1]) resultTainted = true\n }\n\n // Determine the call target kind.\n // 1) Geometry namespace member call: `cad.box(...)` / `sheet.fn(...)`.\n if (callee?.type === 'MemberExpression') {\n const obj = callee.object\n const prop = callee.computed ? null : callee.property?.name\n const objName = obj?.type === 'Identifier' ? obj.name : null\n\n if (objName !== null && geometryNamespaces.has(objName)) {\n // Geometry op: any tainted argument violates.\n const taintedArg = argTaints.findIndex((t) => t)\n if (taintedArg >= 0) {\n report(callee, inferSourceForArgs(), `${objName}.${prop ?? '(computed)'} receives a non-deterministic argument`)\n }\n return resultTainted\n }\n\n if (objName !== null && SAFE_CONTAINERS.has(objName)) {\n // Safe container (console/math/json/...): propagate only.\n return resultTainted\n }\n\n // Object itself tainted (e.g. `d.getSeconds()` where `d = new Date()`)\n // → result conservatively tainted (method may return a dependent value).\n if (objName !== null && evalTaint(obj, scope)) resultTainted = true\n }\n\n // 2) Direct named geometry callee: `gear(...)` from `import { gear }`.\n if (callee?.type === 'Identifier' && geometryCallees.has(callee.name)) {\n const taintedArg = argTaints.findIndex((t) => t)\n if (taintedArg >= 0) {\n report(callee, inferSourceForArgs(), `${callee.name}(...) receives a non-deterministic argument`)\n }\n return resultTainted\n }\n\n // 3) Known safe top-level function: propagate only.\n if (callee?.type === 'Identifier' && SAFE_FUNCTIONS.has(callee.name)) {\n return resultTainted\n }\n\n // 4) Unknown function call: conservative — a tainted argument may feed\n // geometry, and we cannot prove otherwise.\n const taintedArg = argTaints.findIndex((t) => t)\n if (taintedArg >= 0) {\n report(callee, inferSourceForArgs(), `${calleeName(callee)}(...) receives a non-deterministic argument through an unknown callee`)\n }\n return resultTainted\n }\n\n function inferSourceForArgs(): DeterminismSource {\n // Best-effort attribution; the precise source is tracked per-node via lastSource.\n return lastSource ?? 'Date'\n }\n\n function calleeName(node: Node): string {\n if (!node) return '(unknown)'\n if (node.type === 'Identifier') return node.name\n if (node.type === 'MemberExpression') {\n const o = node.object?.type === 'Identifier' ? node.object.name : '?'\n const p = node.computed ? '[...]' : node.property?.name ?? '?'\n return `${o}.${p}`\n }\n return node.type\n }\n\n // Track the most recent source kind seen (for coarse attribution in reports).\n let lastSource: DeterminismSource | undefined\n\n /**\n * Evaluate whether an expression is tainted, recording sources as side\n * effects. Memo-free (exponential-free because the AST is a tree).\n */\n function evalTaint(node: Node, scope: Scope): boolean {\n if (!node) return false\n switch (node.type) {\n case 'Literal':\n return false\n\n case 'Identifier': {\n if (node.name === 'undefined' || node.name === 'NaN' || node.name === 'Infinity') return false\n // Source: bare `Date` / `crypto` / `performance` reference.\n if (SOURCE_IDENTS.has(node.name)) {\n lastSource = node.name !== 'performance' ? (node.name as DeterminismSource) : 'performance.now'\n return true\n }\n return lookupTaint(scope, node.name)\n }\n\n case 'MemberExpression': {\n // Source: `Math.random`, `Date.now`, `crypto.getRandomValues`, ...\n if (node.object?.type === 'Identifier') {\n const members = SOURCE_MEMBERS[node.object.name]\n if (members && !node.computed && node.property?.type === 'Identifier' && members.has(node.property.name)) {\n const kind =\n node.object.name === 'Math' ? 'Math.random'\n : node.object.name === 'Date' ? 'Date'\n : node.object.name === 'crypto' ? (node.property.name === 'randomUUID' ? 'crypto' : 'getRandomValues')\n : 'performance.now'\n lastSource = kind\n return true\n }\n }\n // Otherwise: taint flows through the object (and, conservatively, the key).\n const objTaint = evalTaint(node.object, scope)\n const keyTaint = node.computed ? evalTaint(node.property, scope) : false\n return objTaint || keyTaint\n }\n\n case 'NewExpression':\n // `new Date(...)` is a source regardless of arguments (timezone/sytem\n // clock dependence). `new crypto.X` likewise.\n if (node.callee?.type === 'Identifier' && SOURCE_IDENTS.has(node.callee.name)) {\n lastSource = node.callee.name === 'Date' ? 'Date' : 'crypto'\n return true\n }\n return handleCall(node, scope)\n\n case 'CallExpression':\n return handleCall(node, scope)\n\n case 'ArrayExpression': {\n let t = false\n for (const el of node.elements ?? []) {\n if (el && evalTaint(el, scope)) t = true\n }\n return t\n }\n\n case 'ObjectExpression': {\n let t = false\n for (const prop of node.properties ?? []) {\n if (prop.type === 'SpreadElement') {\n if (evalTaint(prop.argument, scope)) t = true\n } else if (prop.value && evalTaint(prop.value, scope)) {\n t = true\n }\n }\n return t\n }\n\n case 'UnaryExpression':\n return evalTaint(node.argument, scope)\n\n case 'UpdateExpression':\n return evalTaint(node.argument, scope)\n\n case 'BinaryExpression':\n case 'LogicalExpression':\n return evalTaint(node.left, scope) || evalTaint(node.right, scope)\n\n case 'ConditionalExpression': {\n const testT = evalTaint(node.test, scope)\n const consT = evalTaint(node.consequent, scope)\n const altT = evalTaint(node.alternate, scope)\n return testT || consT || altT\n }\n\n case 'AssignmentExpression': {\n const rhsT = evalTaint(node.right, scope)\n if (rhsT) {\n markAssignTarget(node.left, scope)\n }\n return rhsT\n }\n\n case 'SequenceExpression': {\n let t = false\n for (const e of node.expressions ?? []) {\n if (evalTaint(e, scope)) t = true\n }\n return t\n }\n\n case 'TemplateLiteral': {\n let t = false\n for (const expr of node.expressions ?? []) {\n if (evalTaint(expr, scope)) t = true\n }\n return t\n }\n\n case 'ChainExpression':\n return evalTaint(node.expression, scope)\n\n case 'AwaitExpression':\n return evalTaint(node.argument, scope)\n\n case 'SpreadElement':\n return evalTaint(node.argument, scope)\n\n case 'ArrowFunctionExpression':\n case 'FunctionExpression': {\n const fnScope = childScope(scope)\n for (const p of node.params ?? []) {\n collectPatternTaintDefault(p, fnScope)\n }\n walkFunctionBody(node, fnScope)\n return false\n }\n\n default:\n return false\n }\n }\n\n /** Mark an assignment/declaration target tainted. */\n function markAssignTarget(left: Node, scope: Scope): void {\n if (left.type === 'Identifier') {\n markTaint(scope, left.name)\n return\n }\n if (left.type === 'MemberExpression') {\n // Conservatively taint the base object; the precise key is unknown.\n if (left.object?.type === 'Identifier') markTaint(scope, left.object.name)\n return\n }\n if (left.type === 'ArrayPattern' || left.type === 'ObjectPattern') {\n collectPattern(left, (name) => markTaint(scope, name))\n return\n }\n }\n\n /** Collect binding names from a destructuring pattern. */\n function collectPattern(pattern: Node, cb: (name: string) => void): void {\n if (!pattern) return\n if (pattern.type === 'Identifier') {\n cb(pattern.name)\n return\n }\n if (pattern.type === 'RestElement') {\n collectPattern(pattern.argument, cb)\n return\n }\n if (pattern.type === 'ArrayPattern') {\n for (const el of pattern.elements ?? []) if (el) collectPattern(el, cb)\n return\n }\n if (pattern.type === 'ObjectPattern') {\n for (const prop of pattern.properties ?? []) {\n if (prop.type === 'RestElement') collectPattern(prop.argument, cb)\n else if (prop.value) collectPattern(prop.value, cb)\n }\n return\n }\n if (pattern.type === 'AssignmentPattern') {\n collectPattern(pattern.left, cb)\n return\n }\n }\n\n /** Register a parameter, evaluating its default for taint. */\n function collectPatternTaintDefault(pattern: Node, scope: Scope): void {\n if (pattern?.type === 'AssignmentPattern') {\n collectPattern(pattern.left, (name) => {\n scope.tainted.set(name, evalTaint(pattern.right, scope))\n })\n return\n }\n collectPattern(pattern, (name) => {\n if (!scope.tainted.has(name)) scope.tainted.set(name, false)\n })\n }\n\n /** Walk a function body (its own scope; statements inside analyzed eagerly). */\n function walkFunctionBody(node: Node, fnScope: Scope): void {\n if (node.body?.type === 'BlockStatement') walkBody(node.body.body ?? [], fnScope)\n else if (node.body) {\n // Expression body: `x => expr`.\n evalTaint(node.body, fnScope)\n }\n }\n\n /** Walk a statement list, carrying implicit-flow taint. */\n function walkBody(body: Node[], scope: Scope, implicitTaint = false): void {\n // Hoist declarations first so assignments resolve in this scope.\n for (const stmt of body) {\n if (stmt?.type === 'VariableDeclaration') {\n for (const decl of stmt.declarations ?? []) {\n collectPattern(decl.id, (name) => {\n if (!scope.tainted.has(name)) scope.tainted.set(name, false)\n })\n }\n }\n if (stmt?.type === 'FunctionDeclaration' && stmt.id?.name) {\n if (!scope.tainted.has(stmt.id.name)) scope.tainted.set(stmt.id.name, false)\n }\n }\n if (implicitTaint) {\n // Any assignment target inside a tainted control flow becomes tainted.\n for (const stmt of body) markStmtTargets(stmt, scope)\n }\n for (const stmt of body) walkStmt(stmt, scope)\n }\n\n /** Conservatively mark every LHS a block writes through as tainted. */\n function markStmtTargets(node: Node, scope: Scope): void {\n if (!node) return\n switch (node.type) {\n case 'VariableDeclaration':\n for (const d of node.declarations ?? []) collectPattern(d.id, (n) => markTaint(scope, n))\n return\n case 'ExpressionStatement':\n if (node.expression?.type === 'AssignmentExpression') markAssignTarget(node.expression.left, scope)\n if (node.expression?.type === 'UpdateExpression') markAssignTarget(node.expression.argument, scope)\n if (node.expression?.type === 'CallExpression') {\n // In-place mutation ergonomics: taint the first argument receiver.\n const first = node.expression.arguments?.[0]\n if (first?.type === 'Identifier') markTaint(scope, first.name)\n }\n return\n case 'FunctionDeclaration':\n if (node.id?.name) markTaint(scope, node.id.name)\n return\n default:\n return\n }\n }\n\n function walkStmt(node: Node, scope: Scope): void {\n if (!node) return\n switch (node.type) {\n case 'ExpressionStatement':\n evalTaint(node.expression, scope)\n return\n\n case 'VariableDeclaration':\n for (const decl of node.declarations ?? []) {\n if (decl.init && evalTaint(decl.init, scope)) {\n collectPattern(decl.id, (name) => markTaint(scope, name))\n }\n }\n return\n\n case 'BlockStatement':\n walkBody(node.body ?? [], childScope(scope))\n return\n\n case 'IfStatement': {\n const testT = evalTaint(node.test, scope)\n walkBody(toList(node.consequent), childScope(scope), testT)\n if (node.alternate) walkBody(toList(node.alternate), childScope(scope), testT)\n return\n }\n\n case 'ForStatement': {\n const forScope = childScope(scope)\n if (node.init?.type === 'VariableDeclaration') {\n for (const d of node.init.declarations ?? []) {\n collectPattern(d.id, (n) => { if (!forScope.tainted.has(n)) forScope.tainted.set(n, false) })\n if (d.init && evalTaint(d.init, forScope)) collectPattern(d.id, (n) => markTaint(forScope, n))\n }\n } else if (node.init) {\n evalTaint(node.init, forScope)\n }\n const testT = node.test ? evalTaint(node.test, forScope) : false\n if (node.update) evalTaint(node.update, forScope)\n walkBody(toList(node.body), forScope, testT)\n return\n }\n\n case 'ForInStatement':\n case 'ForOfStatement': {\n const forScope = childScope(scope)\n const rightT = evalTaint(node.right, forScope)\n if (node.left?.type === 'VariableDeclaration') {\n for (const d of node.left.declarations ?? []) {\n collectPattern(d.id, (n) => { if (!forScope.tainted.has(n)) forScope.tainted.set(n, false) })\n }\n }\n walkBody(toList(node.body), forScope, rightT)\n return\n }\n\n case 'WhileStatement':\n case 'DoWhileStatement': {\n const loopScope = childScope(scope)\n const testT = evalTaint(node.test, loopScope)\n walkBody(toList(node.body), loopScope, testT)\n return\n }\n\n case 'SwitchStatement': {\n const swScope = childScope(scope)\n const discT = evalTaint(node.discriminant, swScope)\n for (const c of node.cases ?? []) {\n if (c.test) evalTaint(c.test, swScope)\n walkBody(c.consequent ?? [], childScope(swScope), discT)\n }\n return\n }\n\n case 'ReturnStatement':\n if (node.argument) evalTaint(node.argument, scope)\n return\n\n case 'ThrowStatement':\n if (node.argument) evalTaint(node.argument, scope)\n return\n\n case 'TryStatement': {\n walkBody(toList(node.block?.body ?? []), scope)\n if (node.handler) {\n const catchScope = childScope(scope)\n if (node.handler.param) collectPattern(node.handler.param, (n) => { catchScope.tainted.set(n, false) })\n walkBody(node.handler.body?.body ?? [], catchScope)\n }\n if (node.finalizer) walkBody(node.finalizer.body ?? [], scope)\n return\n }\n\n case 'FunctionDeclaration': {\n const fnScope = childScope(scope)\n for (const p of node.params ?? []) collectPatternTaintDefault(p, fnScope)\n walkFunctionBody(node, fnScope)\n return\n }\n\n case 'LabeledStatement':\n if (node.body) walkStmt(node.body, scope)\n return\n\n case 'ImportDeclaration':\n case 'ExportNamedDeclaration':\n case 'ExportDefaultDeclaration':\n // Imports are handled by the caller (namespace/callee hints). A default\n // export with a declaration still needs its body walked.\n if (node.type === 'ExportDefaultDeclaration' && node.declaration && node.declaration.type !== 'Identifier') {\n walkStmt(node.declaration, scope)\n }\n if (node.type === 'ExportNamedDeclaration' && node.declaration) {\n walkStmt(node.declaration, scope)\n }\n return\n\n case 'ClassDeclaration': {\n const clsScope = childScope(scope)\n for (const m of node.body?.body ?? []) {\n if (m.value) walkFunctionBody(m.value, childScope(clsScope))\n }\n return\n }\n\n case 'EmptyStatement':\n case 'BreakStatement':\n case 'ContinueStatement':\n case 'DebuggerStatement':\n return\n\n default: {\n // Unknown statement node: conservatively walk children via evalTaint on\n // expression-shaped child properties is error-prone; skip structurally.\n return\n }\n }\n }\n\n function toList(node: Node): Node[] {\n if (!node) return []\n return node.type === 'BlockStatement' ? (node.body ?? []) : [node]\n }\n\n walkBody(ast.body ?? [], rootScope)\n\n return { ok: violations.length === 0, violations }\n}"]}
|
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
* 未知第三方函数不在表中时,check() 报"函数不存在",其它机制不受影响。
|
|
11
11
|
*
|
|
12
12
|
* 生成文件:src/lang/symbol-table.generated.ts(由 scripts/gen-symbol-table.ts 生成,禁手改)。
|
|
13
|
+
*
|
|
14
|
+
* P5(2026-09-23 扩展库拆分):符号表额外接受**宿主注册的扩展条目**
|
|
15
|
+
* (`registerSymbolTableEntries`)。扩展库(如 `@faicad/faijs-extra`)的 op 不在
|
|
16
|
+
* 生成表里——生成表的唯一来源是 core 的 `createApiNamespace()` 平台面;扩展库由
|
|
17
|
+
* 宿主在装配时注入名字清单,使静态分析同样能查到 `cad.fai_drill`。
|
|
18
|
+
* 扩展条目**不得**覆盖平台函数(真重名即抛错,不静默覆盖)。
|
|
13
19
|
*/
|
|
14
20
|
/** 符号表条目(keep-syntax P1 后为空对象占位,仅承载键存在性)。 */
|
|
15
21
|
export type FunctionSymbol = Record<string, never>;
|
|
@@ -17,6 +23,31 @@ export type FunctionSymbol = Record<string, never>;
|
|
|
17
23
|
export type SymbolTable = Record<string, FunctionSymbol>;
|
|
18
24
|
/** 生成的符号表(禁手改,由 scripts/gen-symbol-table.ts 生成) */
|
|
19
25
|
export declare const SYMBOL_TABLE: SymbolTable;
|
|
26
|
+
/**
|
|
27
|
+
* Register library function names in the symbol table (P5).
|
|
28
|
+
*
|
|
29
|
+
* Idempotent for names already registered as extensions; throws when a name
|
|
30
|
+
* collides with a platform function, because a silent override would let a
|
|
31
|
+
* library shadow the platform surface in static analysis.
|
|
32
|
+
*
|
|
33
|
+
* @param names - the library's function names (`cad.<name>`).
|
|
34
|
+
* @throws when a name is already a platform function of the generated table.
|
|
35
|
+
*/
|
|
36
|
+
export declare function registerSymbolTableEntries(names: readonly string[]): void;
|
|
37
|
+
/**
|
|
38
|
+
* Remove previously registered extension entries (host unloads a library).
|
|
39
|
+
* Unknown names are ignored.
|
|
40
|
+
*
|
|
41
|
+
* @param names - the function names to unregister.
|
|
42
|
+
*/
|
|
43
|
+
export declare function unregisterSymbolTableEntries(names: readonly string[]): void;
|
|
44
|
+
/**
|
|
45
|
+
* All callee names known to the symbol table: the generated platform table plus
|
|
46
|
+
* the registered extension entries.
|
|
47
|
+
*
|
|
48
|
+
* @returns the union of platform and extension names, platform first.
|
|
49
|
+
*/
|
|
50
|
+
export declare function symbolTableNames(): string[];
|
|
20
51
|
/**
|
|
21
52
|
* Look up a callee in the standard-library symbol table. Unknown functions
|
|
22
53
|
* (absent from the table) return undefined, which check() reports as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-table.d.ts","sourceRoot":"","sources":["../../src/lang/symbol-table.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"symbol-table.d.ts","sourceRoot":"","sources":["../../src/lang/symbol-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,6CAA6C;AAC7C,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAElD,0CAA0C;AAC1C,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAExD,mDAAmD;AACnD,eAAO,MAAM,YAAY,EAAE,WAAwC,CAAA;AASnE;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAOzE;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAE3E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE5E"}
|
|
@@ -10,18 +10,13 @@ declare const _default: {
|
|
|
10
10
|
cylinder: {};
|
|
11
11
|
cone: {};
|
|
12
12
|
wedge: {};
|
|
13
|
-
text: {};
|
|
14
13
|
screw: {};
|
|
15
|
-
svgExtrude: {};
|
|
16
14
|
sketch: {};
|
|
17
15
|
sdf: {};
|
|
18
|
-
load: {};
|
|
19
16
|
translate: {};
|
|
20
17
|
rotate_euler: {};
|
|
21
18
|
scale: {};
|
|
22
19
|
scale3d: {};
|
|
23
|
-
fai_drill: {};
|
|
24
|
-
fai_extrude: {};
|
|
25
20
|
engrave: {};
|
|
26
21
|
chamfer: {};
|
|
27
22
|
fillet: {};
|
|
@@ -31,10 +26,6 @@ declare const _default: {
|
|
|
31
26
|
intersect: {};
|
|
32
27
|
extrude: {};
|
|
33
28
|
revolve: {};
|
|
34
|
-
fai_split: {};
|
|
35
|
-
group: {};
|
|
36
|
-
assembly: {};
|
|
37
|
-
copy: {};
|
|
38
29
|
faceNormal: {};
|
|
39
30
|
bboxCenter: {};
|
|
40
31
|
bboxMin: {};
|
|
@@ -45,30 +36,33 @@ declare const _default: {
|
|
|
45
36
|
inverseKinematics: {};
|
|
46
37
|
mechanismDOF: {};
|
|
47
38
|
asset: {};
|
|
39
|
+
import_brep: {};
|
|
40
|
+
import_step: {};
|
|
41
|
+
compound: {};
|
|
42
|
+
place: {};
|
|
43
|
+
cut: {};
|
|
44
|
+
split: {};
|
|
45
|
+
linearPattern: {};
|
|
46
|
+
circularPattern: {};
|
|
47
|
+
gridPattern: {};
|
|
48
|
+
rectangularPattern: {};
|
|
49
|
+
mirrorJoin: {};
|
|
50
|
+
mirror: {};
|
|
51
|
+
clone: {};
|
|
48
52
|
torus: {};
|
|
49
53
|
fuse: {};
|
|
50
54
|
viewCamera: {};
|
|
51
55
|
projectView: {};
|
|
52
56
|
projectSheet: {};
|
|
53
|
-
linearPattern: {};
|
|
54
|
-
circularPattern: {};
|
|
55
|
-
gridPattern: {};
|
|
56
57
|
drill: {};
|
|
57
58
|
pocket: {};
|
|
58
59
|
boss: {};
|
|
59
|
-
mirrorJoin: {};
|
|
60
|
-
rectangularPattern: {};
|
|
61
60
|
convexHull: {};
|
|
62
61
|
makeBaseBox: {};
|
|
63
62
|
ellipsoid: {};
|
|
64
63
|
rotate: {};
|
|
65
|
-
mirror: {};
|
|
66
|
-
clone: {};
|
|
67
64
|
applyMatrix: {};
|
|
68
|
-
transformCopy: {};
|
|
69
65
|
locate: {};
|
|
70
|
-
cut: {};
|
|
71
|
-
split: {};
|
|
72
66
|
offset: {};
|
|
73
67
|
heal: {};
|
|
74
68
|
simplify: {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-table.generated.d.ts","sourceRoot":"","sources":["../../src/lang/symbol-table.generated.ts"],"names":[],"mappings":"AAAA;;;;;GAKG
|
|
1
|
+
{"version":3,"file":"symbol-table.generated.d.ts","sourceRoot":"","sources":["../../src/lang/symbol-table.generated.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACH,wBAiEC"}
|
|
@@ -10,18 +10,13 @@ export default {
|
|
|
10
10
|
"cylinder": {},
|
|
11
11
|
"cone": {},
|
|
12
12
|
"wedge": {},
|
|
13
|
-
"text": {},
|
|
14
13
|
"screw": {},
|
|
15
|
-
"svgExtrude": {},
|
|
16
14
|
"sketch": {},
|
|
17
15
|
"sdf": {},
|
|
18
|
-
"load": {},
|
|
19
16
|
"translate": {},
|
|
20
17
|
"rotate_euler": {},
|
|
21
18
|
"scale": {},
|
|
22
19
|
"scale3d": {},
|
|
23
|
-
"fai_drill": {},
|
|
24
|
-
"fai_extrude": {},
|
|
25
20
|
"engrave": {},
|
|
26
21
|
"chamfer": {},
|
|
27
22
|
"fillet": {},
|
|
@@ -31,10 +26,6 @@ export default {
|
|
|
31
26
|
"intersect": {},
|
|
32
27
|
"extrude": {},
|
|
33
28
|
"revolve": {},
|
|
34
|
-
"fai_split": {},
|
|
35
|
-
"group": {},
|
|
36
|
-
"assembly": {},
|
|
37
|
-
"copy": {},
|
|
38
29
|
"faceNormal": {},
|
|
39
30
|
"bboxCenter": {},
|
|
40
31
|
"bboxMin": {},
|
|
@@ -45,30 +36,33 @@ export default {
|
|
|
45
36
|
"inverseKinematics": {},
|
|
46
37
|
"mechanismDOF": {},
|
|
47
38
|
"asset": {},
|
|
39
|
+
"import_brep": {},
|
|
40
|
+
"import_step": {},
|
|
41
|
+
"compound": {},
|
|
42
|
+
"place": {},
|
|
43
|
+
"cut": {},
|
|
44
|
+
"split": {},
|
|
45
|
+
"linearPattern": {},
|
|
46
|
+
"circularPattern": {},
|
|
47
|
+
"gridPattern": {},
|
|
48
|
+
"rectangularPattern": {},
|
|
49
|
+
"mirrorJoin": {},
|
|
50
|
+
"mirror": {},
|
|
51
|
+
"clone": {},
|
|
48
52
|
"torus": {},
|
|
49
53
|
"fuse": {},
|
|
50
54
|
"viewCamera": {},
|
|
51
55
|
"projectView": {},
|
|
52
56
|
"projectSheet": {},
|
|
53
|
-
"linearPattern": {},
|
|
54
|
-
"circularPattern": {},
|
|
55
|
-
"gridPattern": {},
|
|
56
57
|
"drill": {},
|
|
57
58
|
"pocket": {},
|
|
58
59
|
"boss": {},
|
|
59
|
-
"mirrorJoin": {},
|
|
60
|
-
"rectangularPattern": {},
|
|
61
60
|
"convexHull": {},
|
|
62
61
|
"makeBaseBox": {},
|
|
63
62
|
"ellipsoid": {},
|
|
64
63
|
"rotate": {},
|
|
65
|
-
"mirror": {},
|
|
66
|
-
"clone": {},
|
|
67
64
|
"applyMatrix": {},
|
|
68
|
-
"transformCopy": {},
|
|
69
65
|
"locate": {},
|
|
70
|
-
"cut": {},
|
|
71
|
-
"split": {},
|
|
72
66
|
"offset": {},
|
|
73
67
|
"heal": {},
|
|
74
68
|
"simplify": {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-table.generated.js","sourceRoot":"","sources":["../../src/lang/symbol-table.generated.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAe;IACb,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,
|
|
1
|
+
{"version":3,"file":"symbol-table.generated.js","sourceRoot":"","sources":["../../src/lang/symbol-table.generated.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAe;IACb,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,EAAE;IACf,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE,EAAE;IAChB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,iBAAiB,EAAE,EAAE;IACrB,mBAAmB,EAAE,EAAE;IACvB,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,EAAE;IACd,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,EAAE;IACX,eAAe,EAAE,EAAE;IACnB,iBAAiB,EAAE,EAAE;IACrB,aAAa,EAAE,EAAE;IACjB,oBAAoB,EAAE,EAAE;IACxB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,EAAE;IACZ,aAAa,EAAE,EAAE;IACjB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;CAChB,CAAA","sourcesContent":["/**\n * symbol-table 生成文件 — 禁手改。\n * 由 scripts/gen-symbol-table.ts 从 api-namespace 的 cad 命名空间生成(键存在性)。\n * keep-syntax P1 后符号表只承载 check() 符号检查(\"函数不存在\"判定);\n * 保留语义由 keep 声明表达,不再有 readonly 标注。\n */\nexport default {\n \"box\": {},\n \"sphere\": {},\n \"cylinder\": {},\n \"cone\": {},\n \"wedge\": {},\n \"screw\": {},\n \"sketch\": {},\n \"sdf\": {},\n \"translate\": {},\n \"rotate_euler\": {},\n \"scale\": {},\n \"scale3d\": {},\n \"engrave\": {},\n \"chamfer\": {},\n \"fillet\": {},\n \"knurl\": {},\n \"union\": {},\n \"subtract\": {},\n \"intersect\": {},\n \"extrude\": {},\n \"revolve\": {},\n \"faceNormal\": {},\n \"bboxCenter\": {},\n \"bboxMin\": {},\n \"bboxMax\": {},\n \"edgeRef\": {},\n \"faceRef\": {},\n \"jointTrajectory\": {},\n \"inverseKinematics\": {},\n \"mechanismDOF\": {},\n \"asset\": {},\n \"import_brep\": {},\n \"import_step\": {},\n \"compound\": {},\n \"place\": {},\n \"cut\": {},\n \"split\": {},\n \"linearPattern\": {},\n \"circularPattern\": {},\n \"gridPattern\": {},\n \"rectangularPattern\": {},\n \"mirrorJoin\": {},\n \"mirror\": {},\n \"clone\": {},\n \"torus\": {},\n \"fuse\": {},\n \"viewCamera\": {},\n \"projectView\": {},\n \"projectSheet\": {},\n \"drill\": {},\n \"pocket\": {},\n \"boss\": {},\n \"convexHull\": {},\n \"makeBaseBox\": {},\n \"ellipsoid\": {},\n \"rotate\": {},\n \"applyMatrix\": {},\n \"locate\": {},\n \"offset\": {},\n \"heal\": {},\n \"simplify\": {},\n \"autoHeal\": {},\n \"fixShape\": {},\n \"healSolid\": {}\n}\n"]}
|
|
@@ -10,10 +10,59 @@
|
|
|
10
10
|
* 未知第三方函数不在表中时,check() 报"函数不存在",其它机制不受影响。
|
|
11
11
|
*
|
|
12
12
|
* 生成文件:src/lang/symbol-table.generated.ts(由 scripts/gen-symbol-table.ts 生成,禁手改)。
|
|
13
|
+
*
|
|
14
|
+
* P5(2026-09-23 扩展库拆分):符号表额外接受**宿主注册的扩展条目**
|
|
15
|
+
* (`registerSymbolTableEntries`)。扩展库(如 `@faicad/faijs-extra`)的 op 不在
|
|
16
|
+
* 生成表里——生成表的唯一来源是 core 的 `createApiNamespace()` 平台面;扩展库由
|
|
17
|
+
* 宿主在装配时注入名字清单,使静态分析同样能查到 `cad.fai_drill`。
|
|
18
|
+
* 扩展条目**不得**覆盖平台函数(真重名即抛错,不静默覆盖)。
|
|
13
19
|
*/
|
|
14
20
|
import symbolTable from './symbol-table.generated.js';
|
|
15
21
|
/** 生成的符号表(禁手改,由 scripts/gen-symbol-table.ts 生成) */
|
|
16
22
|
export const SYMBOL_TABLE = symbolTable;
|
|
23
|
+
/**
|
|
24
|
+
* Host-registered extension entries (library namespaces outside core's platform
|
|
25
|
+
* surface). Kept apart from `SYMBOL_TABLE` so "platform surface" stays
|
|
26
|
+
* machine-derivable from the generated table alone.
|
|
27
|
+
*/
|
|
28
|
+
const extensionEntries = new Map();
|
|
29
|
+
/**
|
|
30
|
+
* Register library function names in the symbol table (P5).
|
|
31
|
+
*
|
|
32
|
+
* Idempotent for names already registered as extensions; throws when a name
|
|
33
|
+
* collides with a platform function, because a silent override would let a
|
|
34
|
+
* library shadow the platform surface in static analysis.
|
|
35
|
+
*
|
|
36
|
+
* @param names - the library's function names (`cad.<name>`).
|
|
37
|
+
* @throws when a name is already a platform function of the generated table.
|
|
38
|
+
*/
|
|
39
|
+
export function registerSymbolTableEntries(names) {
|
|
40
|
+
for (const name of names) {
|
|
41
|
+
if (Object.prototype.hasOwnProperty.call(SYMBOL_TABLE, name)) {
|
|
42
|
+
throw new Error(`[faijs] symbol-table extension redefines platform function "${name}"`);
|
|
43
|
+
}
|
|
44
|
+
extensionEntries.set(name, {});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Remove previously registered extension entries (host unloads a library).
|
|
49
|
+
* Unknown names are ignored.
|
|
50
|
+
*
|
|
51
|
+
* @param names - the function names to unregister.
|
|
52
|
+
*/
|
|
53
|
+
export function unregisterSymbolTableEntries(names) {
|
|
54
|
+
for (const name of names)
|
|
55
|
+
extensionEntries.delete(name);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* All callee names known to the symbol table: the generated platform table plus
|
|
59
|
+
* the registered extension entries.
|
|
60
|
+
*
|
|
61
|
+
* @returns the union of platform and extension names, platform first.
|
|
62
|
+
*/
|
|
63
|
+
export function symbolTableNames() {
|
|
64
|
+
return [...new Set([...Object.keys(SYMBOL_TABLE), ...extensionEntries.keys()])];
|
|
65
|
+
}
|
|
17
66
|
/**
|
|
18
67
|
* Look up a callee in the standard-library symbol table. Unknown functions
|
|
19
68
|
* (absent from the table) return undefined, which check() reports as
|
|
@@ -22,6 +71,6 @@ export const SYMBOL_TABLE = symbolTable;
|
|
|
22
71
|
* @returns the matching symbol-table entry, or undefined when unknown.
|
|
23
72
|
*/
|
|
24
73
|
export function getFunctionSymbol(callee) {
|
|
25
|
-
return SYMBOL_TABLE[callee];
|
|
74
|
+
return SYMBOL_TABLE[callee] ?? extensionEntries.get(callee);
|
|
26
75
|
}
|
|
27
76
|
//# sourceMappingURL=symbol-table.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-table.js","sourceRoot":"","sources":["../../src/lang/symbol-table.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"symbol-table.js","sourceRoot":"","sources":["../../src/lang/symbol-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,WAAW,MAAM,0BAA0B,CAAA;AAQlD,mDAAmD;AACnD,MAAM,CAAC,MAAM,YAAY,GAAgB,WAA0B,CAAA;AAEnE;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAA;AAE1D;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAAwB;IACjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,+DAA+D,IAAI,GAAG,CAAC,CAAA;QACzF,CAAC;QACD,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAChC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAwB;IACnE,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AACjF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC7D,CAAC","sourcesContent":["/**\n * symbol-table — 标准库符号表类型与消费入口(L0 零依赖)\n *\n *\n * 符号表是\"标准库符号表\"(正常语言编译器认识 prelude 的同款机制),\n * 机器生成、均匀查询。keep-syntax P1 之后它只承载一个职责:\n * check() 符号检查判定 callee 是否存在(\"函数不存在\"诊断)。\n * 保留语义(readonlyPositions/readonlyPaths)已删除——保留由 keep 声明\n * (调用点 keep / 函数体 exec.keep)显式表达,不再靠类型标注提取(R7)。\n * 未知第三方函数不在表中时,check() 报\"函数不存在\",其它机制不受影响。\n *\n * 生成文件:src/lang/symbol-table.generated.ts(由 scripts/gen-symbol-table.ts 生成,禁手改)。\n *\n * P5(2026-09-23 扩展库拆分):符号表额外接受**宿主注册的扩展条目**\n * (`registerSymbolTableEntries`)。扩展库(如 `@faicad/faijs-extra`)的 op 不在\n * 生成表里——生成表的唯一来源是 core 的 `createApiNamespace()` 平台面;扩展库由\n * 宿主在装配时注入名字清单,使静态分析同样能查到 `cad.fai_drill`。\n * 扩展条目**不得**覆盖平台函数(真重名即抛错,不静默覆盖)。\n */\n\nimport symbolTable from './symbol-table.generated'\n\n/** 符号表条目(keep-syntax P1 后为空对象占位,仅承载键存在性)。 */\nexport type FunctionSymbol = Record<string, never>\n\n/** 标准库符号表:callee → 条目。均匀数据,无 per-函数代码。 */\nexport type SymbolTable = Record<string, FunctionSymbol>\n\n/** 生成的符号表(禁手改,由 scripts/gen-symbol-table.ts 生成) */\nexport const SYMBOL_TABLE: SymbolTable = symbolTable as SymbolTable\n\n/**\n * Host-registered extension entries (library namespaces outside core's platform\n * surface). Kept apart from `SYMBOL_TABLE` so \"platform surface\" stays\n * machine-derivable from the generated table alone.\n */\nconst extensionEntries = new Map<string, FunctionSymbol>()\n\n/**\n * Register library function names in the symbol table (P5).\n *\n * Idempotent for names already registered as extensions; throws when a name\n * collides with a platform function, because a silent override would let a\n * library shadow the platform surface in static analysis.\n *\n * @param names - the library's function names (`cad.<name>`).\n * @throws when a name is already a platform function of the generated table.\n */\nexport function registerSymbolTableEntries(names: readonly string[]): void {\n for (const name of names) {\n if (Object.prototype.hasOwnProperty.call(SYMBOL_TABLE, name)) {\n throw new Error(`[faijs] symbol-table extension redefines platform function \"${name}\"`)\n }\n extensionEntries.set(name, {})\n }\n}\n\n/**\n * Remove previously registered extension entries (host unloads a library).\n * Unknown names are ignored.\n *\n * @param names - the function names to unregister.\n */\nexport function unregisterSymbolTableEntries(names: readonly string[]): void {\n for (const name of names) extensionEntries.delete(name)\n}\n\n/**\n * All callee names known to the symbol table: the generated platform table plus\n * the registered extension entries.\n *\n * @returns the union of platform and extension names, platform first.\n */\nexport function symbolTableNames(): string[] {\n return [...new Set([...Object.keys(SYMBOL_TABLE), ...extensionEntries.keys()])]\n}\n\n/**\n * Look up a callee in the standard-library symbol table. Unknown functions\n * (absent from the table) return undefined, which check() reports as\n * \"function does not exist\".\n * @param callee - the callee name to look up.\n * @returns the matching symbol-table entry, or undefined when unknown.\n */\nexport function getFunctionSymbol(callee: string): FunctionSymbol | undefined {\n return SYMBOL_TABLE[callee] ?? extensionEntries.get(callee)\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* creased-normals.ts — dependency-free creased (folded) normal computation.
|
|
3
|
+
*
|
|
4
|
+
* The engine's own port of three's `toCreasedNormals`
|
|
5
|
+
* (three/examples/jsm/utils/BufferGeometryUtils.js). Why a port instead of an
|
|
6
|
+
* import: the three helper drags the whole `three` package into any consumer
|
|
7
|
+
* (weapp main thread cannot hold two three copies — see 3d_editor weapp plan
|
|
8
|
+
* §1.1.1 "no three via dependency packages"), while the algorithm itself is
|
|
9
|
+
* pure array math.
|
|
10
|
+
*
|
|
11
|
+
* Semantics are aligned with three r162..r184 `toCreasedNormals` line by line:
|
|
12
|
+
* - input is expanded to non-indexed triangles (indexed geometry is unwound);
|
|
13
|
+
* output is always non-indexed (positions count = triangleCount * 3, indices = null);
|
|
14
|
+
* - a face normal is computed per triangle and pushed onto hash buckets of its
|
|
15
|
+
* 3 vertices (hash = trunc(x * 100 * (1 + 1e-10)) per component, same
|
|
16
|
+
* quantization as three's `hashVertex`);
|
|
17
|
+
* - each vertex normal = normalize(sum of bucket normals whose dot with the
|
|
18
|
+
* face normal exceeds cos(creaseAngleDeg)) — sharp edges split, smooth
|
|
19
|
+
* surfaces (drill walls) stay averaged;
|
|
20
|
+
* - degenerate (zero-area) faces yield NaN normals exactly like three's
|
|
21
|
+
* divide-by-zero; callers treat that as invalid geometry upstream.
|
|
22
|
+
*/
|
|
23
|
+
export interface CreasedNormalsInput {
|
|
24
|
+
/** Triangle positions, xyz interleaved, length = n * 3. */
|
|
25
|
+
positions: Float32Array;
|
|
26
|
+
/** Triangle vertex indices, length = n * 3 (n = triangle count). `null` = sequential. */
|
|
27
|
+
indices: Uint32Array | null;
|
|
28
|
+
/** Dihedral-angle threshold in degrees above which normals split (default 60). */
|
|
29
|
+
creaseAngleDeg?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Creased-normals computation input/output (dependency-free surface).
|
|
33
|
+
*/
|
|
34
|
+
export interface CreasedNormalsResult {
|
|
35
|
+
/** Non-indexed positions (indexed input is expanded). */
|
|
36
|
+
positions: Float32Array;
|
|
37
|
+
/** Per-vertex creased normals, xyz interleaved. */
|
|
38
|
+
normals: Float32Array;
|
|
39
|
+
/** Always null — creased normals cannot be expressed on shared vertices. */
|
|
40
|
+
indices: null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Derive creased (folded) normals from raw triangle data — the dependency-free
|
|
44
|
+
* equivalent of three's `toCreasedNormals`. See the module header for the
|
|
45
|
+
* aligned semantics.
|
|
46
|
+
* @param input - positions (+ optional indices) and the crease angle threshold.
|
|
47
|
+
* @returns non-indexed positions plus per-vertex creased normals.
|
|
48
|
+
*/
|
|
49
|
+
export declare function deriveCreasedNormalsData(input: CreasedNormalsInput): CreasedNormalsResult;
|
|
50
|
+
//# sourceMappingURL=creased-normals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creased-normals.d.ts","sourceRoot":"","sources":["../../src/mesh/creased-normals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,SAAS,EAAE,YAAY,CAAA;IACvB,yFAAyF;IACzF,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;IAC3B,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,SAAS,EAAE,YAAY,CAAA;IACvB,mDAAmD;IACnD,OAAO,EAAE,YAAY,CAAA;IACrB,4EAA4E;IAC5E,OAAO,EAAE,IAAI,CAAA;CACd;AAYD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CA8EzF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* creased-normals.ts — dependency-free creased (folded) normal computation.
|
|
3
|
+
*
|
|
4
|
+
* The engine's own port of three's `toCreasedNormals`
|
|
5
|
+
* (three/examples/jsm/utils/BufferGeometryUtils.js). Why a port instead of an
|
|
6
|
+
* import: the three helper drags the whole `three` package into any consumer
|
|
7
|
+
* (weapp main thread cannot hold two three copies — see 3d_editor weapp plan
|
|
8
|
+
* §1.1.1 "no three via dependency packages"), while the algorithm itself is
|
|
9
|
+
* pure array math.
|
|
10
|
+
*
|
|
11
|
+
* Semantics are aligned with three r162..r184 `toCreasedNormals` line by line:
|
|
12
|
+
* - input is expanded to non-indexed triangles (indexed geometry is unwound);
|
|
13
|
+
* output is always non-indexed (positions count = triangleCount * 3, indices = null);
|
|
14
|
+
* - a face normal is computed per triangle and pushed onto hash buckets of its
|
|
15
|
+
* 3 vertices (hash = trunc(x * 100 * (1 + 1e-10)) per component, same
|
|
16
|
+
* quantization as three's `hashVertex`);
|
|
17
|
+
* - each vertex normal = normalize(sum of bucket normals whose dot with the
|
|
18
|
+
* face normal exceeds cos(creaseAngleDeg)) — sharp edges split, smooth
|
|
19
|
+
* surfaces (drill walls) stay averaged;
|
|
20
|
+
* - degenerate (zero-area) faces yield NaN normals exactly like three's
|
|
21
|
+
* divide-by-zero; callers treat that as invalid geometry upstream.
|
|
22
|
+
*/
|
|
23
|
+
const HASH_MULTIPLIER = (1 + 1e-10) * 1e2;
|
|
24
|
+
function hashVertex(x, y, z) {
|
|
25
|
+
// Same truncation semantics as three: `~~` (32-bit trunc) on scaled coords.
|
|
26
|
+
const hx = ~~(x * HASH_MULTIPLIER);
|
|
27
|
+
const hy = ~~(y * HASH_MULTIPLIER);
|
|
28
|
+
const hz = ~~(z * HASH_MULTIPLIER);
|
|
29
|
+
return `${hx},${hy},${hz}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Derive creased (folded) normals from raw triangle data — the dependency-free
|
|
33
|
+
* equivalent of three's `toCreasedNormals`. See the module header for the
|
|
34
|
+
* aligned semantics.
|
|
35
|
+
* @param input - positions (+ optional indices) and the crease angle threshold.
|
|
36
|
+
* @returns non-indexed positions plus per-vertex creased normals.
|
|
37
|
+
*/
|
|
38
|
+
export function deriveCreasedNormalsData(input) {
|
|
39
|
+
const { indices, creaseAngleDeg = 60 } = input;
|
|
40
|
+
const srcPos = input.positions;
|
|
41
|
+
const triCount = indices ? indices.length / 3 : srcPos.length / 9;
|
|
42
|
+
// Expand to non-indexed triangles (three: geometry.toNonIndexed()).
|
|
43
|
+
const pos = new Float32Array(triCount * 9);
|
|
44
|
+
for (let t = 0; t < triCount; t++) {
|
|
45
|
+
for (let v = 0; v < 3; v++) {
|
|
46
|
+
const srcIdx = indices ? indices[t * 3 + v] : t * 3 + v;
|
|
47
|
+
pos[t * 9 + v * 3 + 0] = srcPos[srcIdx * 3 + 0];
|
|
48
|
+
pos[t * 9 + v * 3 + 1] = srcPos[srcIdx * 3 + 1];
|
|
49
|
+
pos[t * 9 + v * 3 + 2] = srcPos[srcIdx * 3 + 2];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const creaseDot = Math.cos((creaseAngleDeg * Math.PI) / 180);
|
|
53
|
+
// Pass 1: face normals into per-vertex hash buckets.
|
|
54
|
+
const vertexMap = new Map();
|
|
55
|
+
const fnx = new Float32Array(triCount);
|
|
56
|
+
const fny = new Float32Array(triCount);
|
|
57
|
+
const fnz = new Float32Array(triCount);
|
|
58
|
+
for (let t = 0; t < triCount; t++) {
|
|
59
|
+
const ax = pos[t * 9 + 0], ay = pos[t * 9 + 1], az = pos[t * 9 + 2];
|
|
60
|
+
const bx = pos[t * 9 + 3], by = pos[t * 9 + 4], bz = pos[t * 9 + 5];
|
|
61
|
+
const cx = pos[t * 9 + 6], cy = pos[t * 9 + 7], cz = pos[t * 9 + 8];
|
|
62
|
+
// cb = c - b, ab = a - b; normal = cb × ab (same edge order as three).
|
|
63
|
+
const e1x = cx - bx, e1y = cy - by, e1z = cz - bz;
|
|
64
|
+
const e2x = ax - bx, e2y = ay - by, e2z = az - bz;
|
|
65
|
+
let nx = e1y * e2z - e1z * e2y;
|
|
66
|
+
let ny = e1z * e2x - e1x * e2z;
|
|
67
|
+
let nz = e1x * e2y - e1y * e2x;
|
|
68
|
+
const len = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
69
|
+
if (len > 0) {
|
|
70
|
+
nx /= len;
|
|
71
|
+
ny /= len;
|
|
72
|
+
nz /= len;
|
|
73
|
+
}
|
|
74
|
+
fnx[t] = nx;
|
|
75
|
+
fny[t] = ny;
|
|
76
|
+
fnz[t] = nz;
|
|
77
|
+
for (let v = 0; v < 3; v++) {
|
|
78
|
+
const h = hashVertex(pos[t * 9 + v * 3], pos[t * 9 + v * 3 + 1], pos[t * 9 + v * 3 + 2]);
|
|
79
|
+
let bucket = vertexMap.get(h);
|
|
80
|
+
if (!bucket) {
|
|
81
|
+
bucket = [];
|
|
82
|
+
vertexMap.set(h, bucket);
|
|
83
|
+
}
|
|
84
|
+
bucket.push([nx, ny, nz]);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Pass 2: average bucket normals within the crease threshold.
|
|
88
|
+
const normals = new Float32Array(triCount * 9);
|
|
89
|
+
for (let t = 0; t < triCount; t++) {
|
|
90
|
+
for (let v = 0; v < 3; v++) {
|
|
91
|
+
const h = hashVertex(pos[t * 9 + v * 3], pos[t * 9 + v * 3 + 1], pos[t * 9 + v * 3 + 2]);
|
|
92
|
+
const bucket = vertexMap.get(h);
|
|
93
|
+
let sx = 0, sy = 0, sz = 0;
|
|
94
|
+
for (let k = 0; k < bucket.length; k++) {
|
|
95
|
+
const on = bucket[k];
|
|
96
|
+
// Three uses `>` (strictly greater) — coplanar neighbours merge,
|
|
97
|
+
// faces at exactly the crease angle do not.
|
|
98
|
+
if (fnx[t] * on[0] + fny[t] * on[1] + fnz[t] * on[2] > creaseDot) {
|
|
99
|
+
sx += on[0];
|
|
100
|
+
sy += on[1];
|
|
101
|
+
sz += on[2];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const sl = Math.sqrt(sx * sx + sy * sy + sz * sz);
|
|
105
|
+
// Divide unconditionally: a zero-length sum yields NaN, matching three's
|
|
106
|
+
// divide-by-zero behavior on degenerate geometry.
|
|
107
|
+
normals[t * 9 + v * 3 + 0] = sx / sl;
|
|
108
|
+
normals[t * 9 + v * 3 + 1] = sy / sl;
|
|
109
|
+
normals[t * 9 + v * 3 + 2] = sz / sl;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { positions: pos, normals, indices: null };
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=creased-normals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creased-normals.js","sourceRoot":"","sources":["../../src/mesh/creased-normals.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * creased-normals.ts — dependency-free creased (folded) normal computation.\n *\n * The engine's own port of three's `toCreasedNormals`\n * (three/examples/jsm/utils/BufferGeometryUtils.js). Why a port instead of an\n * import: the three helper drags the whole `three` package into any consumer\n * (weapp main thread cannot hold two three copies — see 3d_editor weapp plan\n * §1.1.1 \"no three via dependency packages\"), while the algorithm itself is\n * pure array math.\n *\n * Semantics are aligned with three r162..r184 `toCreasedNormals` line by line:\n * - input is expanded to non-indexed triangles (indexed geometry is unwound);\n * output is always non-indexed (positions count = triangleCount * 3, indices = null);\n * - a face normal is computed per triangle and pushed onto hash buckets of its\n * 3 vertices (hash = trunc(x * 100 * (1 + 1e-10)) per component, same\n * quantization as three's `hashVertex`);\n * - each vertex normal = normalize(sum of bucket normals whose dot with the\n * face normal exceeds cos(creaseAngleDeg)) — sharp edges split, smooth\n * surfaces (drill walls) stay averaged;\n * - degenerate (zero-area) faces yield NaN normals exactly like three's\n * divide-by-zero; callers treat that as invalid geometry upstream.\n */\n\nexport interface CreasedNormalsInput {\n /** Triangle positions, xyz interleaved, length = n * 3. */\n positions: Float32Array\n /** Triangle vertex indices, length = n * 3 (n = triangle count). `null` = sequential. */\n indices: Uint32Array | null\n /** Dihedral-angle threshold in degrees above which normals split (default 60). */\n creaseAngleDeg?: number\n}\n\n/**\n * Creased-normals computation input/output (dependency-free surface).\n */\nexport interface CreasedNormalsResult {\n /** Non-indexed positions (indexed input is expanded). */\n positions: Float32Array\n /** Per-vertex creased normals, xyz interleaved. */\n normals: Float32Array\n /** Always null — creased normals cannot be expressed on shared vertices. */\n indices: null\n}\n\nconst HASH_MULTIPLIER = (1 + 1e-10) * 1e2\n\nfunction hashVertex(x: number, y: number, z: number): string {\n // Same truncation semantics as three: `~~` (32-bit trunc) on scaled coords.\n const hx = ~~(x * HASH_MULTIPLIER)\n const hy = ~~(y * HASH_MULTIPLIER)\n const hz = ~~(z * HASH_MULTIPLIER)\n return `${hx},${hy},${hz}`\n}\n\n/**\n * Derive creased (folded) normals from raw triangle data — the dependency-free\n * equivalent of three's `toCreasedNormals`. See the module header for the\n * aligned semantics.\n * @param input - positions (+ optional indices) and the crease angle threshold.\n * @returns non-indexed positions plus per-vertex creased normals.\n */\nexport function deriveCreasedNormalsData(input: CreasedNormalsInput): CreasedNormalsResult {\n const { indices, creaseAngleDeg = 60 } = input\n const srcPos = input.positions\n\n const triCount = indices ? indices.length / 3 : srcPos.length / 9\n\n // Expand to non-indexed triangles (three: geometry.toNonIndexed()).\n const pos = new Float32Array(triCount * 9)\n for (let t = 0; t < triCount; t++) {\n for (let v = 0; v < 3; v++) {\n const srcIdx = indices ? indices[t * 3 + v] : t * 3 + v\n pos[t * 9 + v * 3 + 0] = srcPos[srcIdx * 3 + 0]\n pos[t * 9 + v * 3 + 1] = srcPos[srcIdx * 3 + 1]\n pos[t * 9 + v * 3 + 2] = srcPos[srcIdx * 3 + 2]\n }\n }\n\n const creaseDot = Math.cos((creaseAngleDeg * Math.PI) / 180)\n\n // Pass 1: face normals into per-vertex hash buckets.\n const vertexMap = new Map<string, number[][]>()\n const fnx = new Float32Array(triCount)\n const fny = new Float32Array(triCount)\n const fnz = new Float32Array(triCount)\n\n for (let t = 0; t < triCount; t++) {\n const ax = pos[t * 9 + 0], ay = pos[t * 9 + 1], az = pos[t * 9 + 2]\n const bx = pos[t * 9 + 3], by = pos[t * 9 + 4], bz = pos[t * 9 + 5]\n const cx = pos[t * 9 + 6], cy = pos[t * 9 + 7], cz = pos[t * 9 + 8]\n\n // cb = c - b, ab = a - b; normal = cb × ab (same edge order as three).\n const e1x = cx - bx, e1y = cy - by, e1z = cz - bz\n const e2x = ax - bx, e2y = ay - by, e2z = az - bz\n let nx = e1y * e2z - e1z * e2y\n let ny = e1z * e2x - e1x * e2z\n let nz = e1x * e2y - e1y * e2x\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz)\n if (len > 0) {\n nx /= len; ny /= len; nz /= len\n }\n fnx[t] = nx; fny[t] = ny; fnz[t] = nz\n\n for (let v = 0; v < 3; v++) {\n const h = hashVertex(pos[t * 9 + v * 3], pos[t * 9 + v * 3 + 1], pos[t * 9 + v * 3 + 2])\n let bucket = vertexMap.get(h)\n if (!bucket) {\n bucket = []\n vertexMap.set(h, bucket)\n }\n bucket.push([nx, ny, nz])\n }\n }\n\n // Pass 2: average bucket normals within the crease threshold.\n const normals = new Float32Array(triCount * 9)\n for (let t = 0; t < triCount; t++) {\n for (let v = 0; v < 3; v++) {\n const h = hashVertex(pos[t * 9 + v * 3], pos[t * 9 + v * 3 + 1], pos[t * 9 + v * 3 + 2])\n const bucket = vertexMap.get(h)!\n let sx = 0, sy = 0, sz = 0\n for (let k = 0; k < bucket.length; k++) {\n const on = bucket[k]\n // Three uses `>` (strictly greater) — coplanar neighbours merge,\n // faces at exactly the crease angle do not.\n if (fnx[t] * on[0] + fny[t] * on[1] + fnz[t] * on[2] > creaseDot) {\n sx += on[0]; sy += on[1]; sz += on[2]\n }\n }\n const sl = Math.sqrt(sx * sx + sy * sy + sz * sz)\n // Divide unconditionally: a zero-length sum yields NaN, matching three's\n // divide-by-zero behavior on degenerate geometry.\n normals[t * 9 + v * 3 + 0] = sx / sl\n normals[t * 9 + v * 3 + 1] = sy / sl\n normals[t * 9 + v * 3 + 2] = sz / sl\n }\n }\n\n return { positions: pos, normals, indices: null }\n}\n"]}
|