@faicad/faijs 0.29.3 → 0.30.9
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/NOTICE +6 -5
- package/dist/api/api-namespace.d.ts +1 -1
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +53 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +136 -0
- package/dist/api/appearance.d.ts.map +1 -0
- package/dist/api/appearance.js +228 -0
- package/dist/api/appearance.js.map +1 -0
- package/dist/api/assembly/entities.d.ts +1 -1
- package/dist/api/assembly/entities.js +1 -1
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/index.d.ts +1 -1
- package/dist/api/assembly/index.js +1 -1
- package/dist/api/assembly/index.js.map +1 -1
- package/dist/api/assembly/joints.d.ts +33 -15
- package/dist/api/assembly/joints.d.ts.map +1 -1
- package/dist/api/assembly/joints.js +31 -13
- package/dist/api/assembly/joints.js.map +1 -1
- package/dist/api/assembly/preview.d.ts +1 -1
- package/dist/api/assembly/preview.js +1 -1
- package/dist/api/assembly/preview.js.map +1 -1
- package/dist/api/assembly/solve.d.ts +1 -1
- package/dist/api/assembly/solve.js +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
- package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
- package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +3 -4
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
- package/dist/api/assembly/solvers/linalg.d.ts +2 -2
- package/dist/api/assembly/solvers/linalg.js +2 -2
- package/dist/api/assembly/solvers/linalg.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +2 -5
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js +1 -4
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +7 -6
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
- package/dist/api/brep-mirror/booleanFns.js +5 -5
- package/dist/api/brep-mirror/booleanFns.js.map +1 -1
- package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
- package/dist/api/brep-mirror/compoundFns.js +4 -4
- package/dist/api/brep-mirror/compoundFns.js.map +1 -1
- package/dist/api/brep-mirror/healingFns.d.ts +4 -4
- package/dist/api/brep-mirror/healingFns.js +4 -4
- package/dist/api/brep-mirror/healingFns.js.map +1 -1
- package/dist/api/brep-mirror/hullFns.d.ts +2 -2
- package/dist/api/brep-mirror/hullFns.js +2 -2
- package/dist/api/brep-mirror/hullFns.js.map +1 -1
- package/dist/api/brep-mirror/patternFns.d.ts +5 -5
- package/dist/api/brep-mirror/patternFns.js +10 -10
- package/dist/api/brep-mirror/patternFns.js.map +1 -1
- package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
- package/dist/api/brep-mirror/primitiveFns.js +4 -4
- package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
- package/dist/api/brep-mirror/roofFns.d.ts +3 -3
- package/dist/api/brep-mirror/roofFns.js +7 -7
- package/dist/api/brep-mirror/roofFns.js.map +1 -1
- package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
- package/dist/api/brep-mirror/sweepFns.js +14 -14
- package/dist/api/brep-mirror/sweepFns.js.map +1 -1
- package/dist/api/brep-mirror/threadFns.d.ts +1 -1
- package/dist/api/brep-mirror/threadFns.js +1 -1
- package/dist/api/brep-mirror/threadFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
- package/dist/api/brep-mirror/topologyFns.js +8 -8
- package/dist/api/brep-mirror/topologyFns.js.map +1 -1
- package/dist/api/brep-operations/booleanFns.d.ts +40 -0
- package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
- package/dist/api/brep-operations/booleanFns.js +104 -0
- package/dist/api/brep-operations/booleanFns.js.map +1 -0
- package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
- package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
- package/dist/api/brep-operations/brepHelpers.js +131 -0
- package/dist/api/brep-operations/brepHelpers.js.map +1 -0
- package/dist/api/brep-operations/compoundFns.d.ts +46 -0
- package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
- package/dist/api/brep-operations/compoundFns.js +299 -0
- package/dist/api/brep-operations/compoundFns.js.map +1 -0
- package/dist/api/brep-operations/healingFns.d.ts +78 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
- package/dist/api/brep-operations/healingFns.js +294 -0
- package/dist/api/brep-operations/healingFns.js.map +1 -0
- package/dist/api/brep-operations/hullFns.d.ts +20 -0
- package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
- package/dist/api/brep-operations/hullFns.js +46 -0
- package/dist/api/brep-operations/hullFns.js.map +1 -0
- package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
- package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
- package/dist/api/brep-operations/joinery-brep.js +463 -0
- package/dist/api/brep-operations/joinery-brep.js.map +1 -0
- package/dist/api/brep-operations/patternFns.d.ts +43 -0
- package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
- package/dist/api/brep-operations/patternFns.js +178 -0
- package/dist/api/brep-operations/patternFns.js.map +1 -0
- package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
- package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
- package/dist/api/brep-operations/primitiveFns.js +104 -0
- package/dist/api/brep-operations/primitiveFns.js.map +1 -0
- package/dist/api/brep-operations/roofFns.d.ts +24 -0
- package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
- package/dist/api/brep-operations/roofFns.js +229 -0
- package/dist/api/brep-operations/roofFns.js.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.js +431 -0
- package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
- package/dist/api/brep-operations/sweepFns.d.ts +60 -0
- package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
- package/dist/api/brep-operations/sweepFns.js +323 -0
- package/dist/api/brep-operations/sweepFns.js.map +1 -0
- package/dist/api/brep-operations/threadFns.d.ts +83 -0
- package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
- package/dist/api/brep-operations/threadFns.js +138 -0
- package/dist/api/brep-operations/threadFns.js.map +1 -0
- package/dist/api/brep-operations/topologyFns.d.ts +90 -0
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-operations/topologyFns.js +276 -0
- package/dist/api/brep-operations/topologyFns.js.map +1 -0
- package/dist/api/brep-topology.d.ts +1 -1
- package/dist/api/brep-topology.d.ts.map +1 -1
- package/dist/api/brep-topology.js +1 -1
- package/dist/api/brep-topology.js.map +1 -1
- package/dist/api/brepjs-compat/index.d.ts +1 -1
- package/dist/api/brepjs-compat/index.js +3 -3
- package/dist/api/brepjs-compat/index.js.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
- package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
- package/dist/api/curve-sketch/index.d.ts +235 -0
- package/dist/api/curve-sketch/index.d.ts.map +1 -0
- package/dist/api/curve-sketch/index.js +487 -0
- package/dist/api/curve-sketch/index.js.map +1 -0
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +3 -2
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-brep.d.ts +41 -0
- package/dist/api/export-brep.d.ts.map +1 -0
- package/dist/api/export-brep.js +58 -0
- package/dist/api/export-brep.js.map +1 -0
- package/dist/api/export-stl.d.ts +50 -0
- package/dist/api/export-stl.d.ts.map +1 -0
- package/dist/api/export-stl.js +99 -0
- package/dist/api/export-stl.js.map +1 -0
- package/dist/api/extrude.d.ts +8 -11
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +11 -14
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +2 -2
- package/dist/api/fillet-variable.js +2 -2
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +2 -4
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +2 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/2d.d.ts +4 -0
- package/dist/api/generated/2d.d.ts.map +1 -1
- package/dist/api/generated/2d.js +4 -0
- package/dist/api/generated/2d.js.map +1 -1
- package/dist/api/generated/core.d.ts +4 -0
- package/dist/api/generated/core.d.ts.map +1 -1
- package/dist/api/generated/core.js +4 -0
- package/dist/api/generated/core.js.map +1 -1
- package/dist/api/generated/gear.d.ts +4 -0
- package/dist/api/generated/gear.d.ts.map +1 -1
- package/dist/api/generated/gear.js +4 -0
- package/dist/api/generated/gear.js.map +1 -1
- package/dist/api/generated/io.d.ts +4 -0
- package/dist/api/generated/io.d.ts.map +1 -1
- package/dist/api/generated/io.js +4 -0
- package/dist/api/generated/io.js.map +1 -1
- package/dist/api/generated/kernel.d.ts +4 -0
- package/dist/api/generated/kernel.d.ts.map +1 -1
- package/dist/api/generated/kernel.js +4 -0
- package/dist/api/generated/kernel.js.map +1 -1
- package/dist/api/generated/measurement.d.ts +21 -21
- package/dist/api/generated/measurement.d.ts.map +1 -1
- package/dist/api/generated/measurement.js +25 -21
- package/dist/api/generated/measurement.js.map +1 -1
- package/dist/api/generated/ns.d.ts +4 -0
- package/dist/api/generated/ns.d.ts.map +1 -1
- package/dist/api/generated/ns.js +4 -0
- package/dist/api/generated/ns.js.map +1 -1
- package/dist/api/generated/operations.d.ts +32 -32
- package/dist/api/generated/operations.d.ts.map +1 -1
- package/dist/api/generated/operations.js +52 -48
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/projection.d.ts +4 -0
- package/dist/api/generated/projection.d.ts.map +1 -1
- package/dist/api/generated/projection.js +4 -0
- package/dist/api/generated/projection.js.map +1 -1
- package/dist/api/generated/query.d.ts +4 -0
- package/dist/api/generated/query.d.ts.map +1 -1
- package/dist/api/generated/query.js +4 -0
- package/dist/api/generated/query.js.map +1 -1
- package/dist/api/generated/sketching.d.ts +2 -2
- package/dist/api/generated/sketching.d.ts.map +1 -1
- package/dist/api/generated/sketching.js +7 -3
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/text.d.ts +4 -0
- package/dist/api/generated/text.d.ts.map +1 -1
- package/dist/api/generated/text.js +4 -0
- package/dist/api/generated/text.js.map +1 -1
- package/dist/api/generated/topology.d.ts +45 -45
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +67 -63
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/generated/view.d.ts +4 -0
- package/dist/api/generated/view.d.ts.map +1 -1
- package/dist/api/generated/view.js +4 -0
- package/dist/api/generated/view.js.map +1 -1
- package/dist/api/geom-types/constants.d.ts +11 -0
- package/dist/api/geom-types/constants.d.ts.map +1 -0
- package/dist/api/geom-types/constants.js +11 -0
- package/dist/api/geom-types/constants.js.map +1 -0
- package/dist/api/geom-types/index.d.ts +21 -0
- package/dist/api/geom-types/index.d.ts.map +1 -0
- package/dist/api/geom-types/index.js +22 -0
- package/dist/api/geom-types/index.js.map +1 -0
- package/dist/api/geom-types/planeOps.d.ts +98 -0
- package/dist/api/geom-types/planeOps.d.ts.map +1 -0
- package/dist/api/geom-types/planeOps.js +170 -0
- package/dist/api/geom-types/planeOps.js.map +1 -0
- package/dist/api/geom-types/planeTypes.d.ts +24 -0
- package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
- package/dist/api/geom-types/planeTypes.js +8 -0
- package/dist/api/geom-types/planeTypes.js.map +1 -0
- package/dist/api/geom-types/types.d.ts +64 -0
- package/dist/api/geom-types/types.d.ts.map +1 -0
- package/dist/api/geom-types/types.js +48 -0
- package/dist/api/geom-types/types.js.map +1 -0
- package/dist/api/geom-types/vecOps.d.ts +124 -0
- package/dist/api/geom-types/vecOps.d.ts.map +1 -0
- package/dist/api/geom-types/vecOps.js +202 -0
- package/dist/api/geom-types/vecOps.js.map +1 -0
- package/dist/api/geom.d.ts.map +1 -1
- package/dist/api/geom.js +6 -5
- package/dist/api/geom.js.map +1 -1
- package/dist/api/half-space.d.ts +56 -0
- package/dist/api/half-space.d.ts.map +1 -0
- package/dist/api/half-space.js +82 -0
- package/dist/api/half-space.js.map +1 -0
- package/dist/api/helix.d.ts +10 -1
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +19 -3
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +28 -0
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +19 -6
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +31 -8
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +4 -30
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +10 -42
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +5 -5
- package/dist/api/internal/compat-projection.js +5 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/dual-form-args.d.ts +0 -2
- package/dist/api/internal/dual-form-args.d.ts.map +1 -1
- package/dist/api/internal/dual-form-args.js +1 -3
- package/dist/api/internal/dual-form-args.js.map +1 -1
- package/dist/api/internal/l3-bridge.d.ts +5 -37
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +7 -76
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +1 -1
- package/dist/api/internal/profile-wire.js +1 -1
- package/dist/api/internal/profile-wire.js.map +1 -1
- package/dist/api/internal/result-unwrap.d.ts +4 -6
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +4 -6
- package/dist/api/internal/result-unwrap.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +5 -3
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/loft.d.ts +2 -2
- package/dist/api/loft.d.ts.map +1 -1
- package/dist/api/loft.js +2 -2
- package/dist/api/loft.js.map +1 -1
- package/dist/api/measurement/index.d.ts +3 -3
- package/dist/api/measurement/index.js +3 -3
- package/dist/api/measurement/index.js.map +1 -1
- package/dist/api/meta.d.ts +91 -0
- package/dist/api/meta.d.ts.map +1 -0
- package/dist/api/meta.js +97 -0
- package/dist/api/meta.js.map +1 -0
- package/dist/api/offset2d.d.ts +49 -0
- package/dist/api/offset2d.d.ts.map +1 -0
- package/dist/api/offset2d.js +86 -0
- package/dist/api/offset2d.js.map +1 -0
- package/dist/api/pattern.js +3 -3
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +124 -8
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +2 -2
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +12 -12
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/result.d.ts +1 -1
- package/dist/api/result.js +1 -1
- package/dist/api/result.js.map +1 -1
- package/dist/api/revolve.d.ts +2 -2
- package/dist/api/revolve.js +3 -3
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/screw.d.ts +1 -1
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +5 -4
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +3 -2
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/shape-type/index.d.ts +141 -0
- package/dist/api/shape-type/index.d.ts.map +1 -0
- package/dist/api/shape-type/index.js +182 -0
- package/dist/api/shape-type/index.js.map +1 -0
- package/dist/api/shell.d.ts +2 -2
- package/dist/api/shell.js +2 -2
- package/dist/api/shell.js.map +1 -1
- package/dist/api/solid-from-faces.d.ts +45 -0
- package/dist/api/solid-from-faces.d.ts.map +1 -0
- package/dist/api/solid-from-faces.js +72 -0
- package/dist/api/solid-from-faces.js.map +1 -0
- package/dist/api/solid-offset/index.d.ts +67 -0
- package/dist/api/solid-offset/index.d.ts.map +1 -0
- package/dist/api/solid-offset/index.js +132 -0
- package/dist/api/solid-offset/index.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +35 -33
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +222 -224
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface-face/index.d.ts +104 -0
- package/dist/api/surface-face/index.d.ts.map +1 -0
- package/dist/api/surface-face/index.js +217 -0
- package/dist/api/surface-face/index.js.map +1 -0
- package/dist/api/surface.d.ts +44 -0
- package/dist/api/surface.d.ts.map +1 -0
- package/dist/api/surface.js +66 -0
- package/dist/api/surface.js.map +1 -0
- package/dist/api/sweep.d.ts +59 -9
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +11 -6
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +1 -1
- package/dist/api/thicken.js +1 -1
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +5 -5
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +11 -10
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/cameraFns.d.ts +1 -1
- package/dist/api/view/cameraFns.d.ts.map +1 -1
- package/dist/api/view/cameraFns.js +1 -1
- package/dist/api/view/cameraFns.js.map +1 -1
- package/dist/api/view/index.d.ts +0 -2
- package/dist/api/view/index.d.ts.map +1 -1
- package/dist/api/view/index.js +0 -2
- package/dist/api/view/index.js.map +1 -1
- package/dist/api/view/projectionPlanes.d.ts +1 -1
- package/dist/api/view/projectionPlanes.d.ts.map +1 -1
- package/dist/api/view/projectionPlanes.js.map +1 -1
- package/dist/api/view/view-camera.d.ts +7 -9
- package/dist/api/view/view-camera.d.ts.map +1 -1
- package/dist/api/view/view-camera.js +4 -6
- package/dist/api/view/view-camera.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +0 -2
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +0 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/api/view/view-sheet.d.ts +0 -2
- package/dist/api/view/view-sheet.d.ts.map +1 -1
- package/dist/api/view/view-sheet.js +0 -2
- package/dist/api/view/view-sheet.js.map +1 -1
- package/dist/api/view-export/index.d.ts +97 -0
- package/dist/api/view-export/index.d.ts.map +1 -0
- package/dist/api/view-export/index.js +118 -0
- package/dist/api/view-export/index.js.map +1 -0
- package/dist/brep/brep-ops.d.ts +89 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +204 -13
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +20 -0
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +46 -0
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -1
- package/dist/brep/engine/adapters/occt.js +8 -8
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +2 -3
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +1 -2
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +1 -1
- package/dist/brep/engine/registry.js +1 -1
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +2 -2
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +40 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +268 -25
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step-meta-header.d.ts +102 -0
- package/dist/brep/export/step-meta-header.d.ts.map +1 -0
- package/dist/brep/export/step-meta-header.js +225 -0
- package/dist/brep/export/step-meta-header.js.map +1 -0
- package/dist/brep/export/step.d.ts +5 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +11 -2
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +2 -2
- package/dist/brep/handle-bridge.js +2 -2
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/index.d.ts +6 -3
- package/dist/brep/index.d.ts.map +1 -1
- package/dist/brep/index.js +6 -3
- package/dist/brep/index.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +2 -2
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +2 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -4
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +3 -9
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +12 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +6 -3
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +31 -9
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/interp/env.d.ts +1 -1
- package/dist/cad-runtime/interp/env.js.map +1 -1
- package/dist/cad-runtime/lib-id.d.ts +0 -2
- package/dist/cad-runtime/lib-id.d.ts.map +1 -1
- package/dist/cad-runtime/lib-id.js +0 -2
- package/dist/cad-runtime/lib-id.js.map +1 -1
- package/dist/cad-runtime/live-shapes.d.ts +3 -5
- package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
- package/dist/cad-runtime/live-shapes.js +8 -10
- package/dist/cad-runtime/live-shapes.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +21 -7
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +45 -6
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +4 -3
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +65 -3
- package/dist/define-op.js.map +1 -1
- package/dist/geometry2d/bridge/plane.d.ts +1 -1
- package/dist/geometry2d/bridge/plane.js +1 -1
- package/dist/geometry2d/bridge/plane.js.map +1 -1
- package/dist/geometry2d/curve2d.d.ts +1 -1
- package/dist/geometry2d/curve2d.js +1 -1
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/io/fai-zip/container-read.d.ts +16 -0
- package/dist/io/fai-zip/container-read.d.ts.map +1 -1
- package/dist/io/fai-zip/container-read.js +22 -0
- package/dist/io/fai-zip/container-read.js.map +1 -1
- package/dist/io/fai-zip/index.d.ts +1 -1
- package/dist/io/fai-zip/index.d.ts.map +1 -1
- package/dist/io/fai-zip/index.js +1 -1
- package/dist/io/fai-zip/index.js.map +1 -1
- package/dist/lang/code-to-args.d.ts.map +1 -1
- package/dist/lang/code-to-args.js +10 -1
- package/dist/lang/code-to-args.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts.map +1 -1
- package/dist/lang/determinism-scanner.js +22 -9
- package/dist/lang/determinism-scanner.js.map +1 -1
- package/dist/lang/metadata-extractor.d.ts +27 -6
- package/dist/lang/metadata-extractor.d.ts.map +1 -1
- package/dist/lang/metadata-extractor.js +90 -29
- package/dist/lang/metadata-extractor.js.map +1 -1
- package/dist/lang/parse-error.d.ts +4 -0
- package/dist/lang/parse-error.d.ts.map +1 -1
- package/dist/lang/parse-error.js.map +1 -1
- package/dist/lang/security-scanner.d.ts +27 -2
- package/dist/lang/security-scanner.d.ts.map +1 -1
- package/dist/lang/security-scanner.js +29 -2
- package/dist/lang/security-scanner.js.map +1 -1
- package/dist/lang/source-edit.d.ts +2 -2
- package/dist/lang/source-edit.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +36 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +36 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/types.d.ts +5 -6
- package/dist/lang/types.d.ts.map +1 -1
- package/dist/lang/types.js.map +1 -1
- package/dist/mesh/import-model.d.ts +94 -0
- package/dist/mesh/import-model.d.ts.map +1 -0
- package/dist/mesh/import-model.js +15 -0
- package/dist/mesh/import-model.js.map +1 -0
- package/dist/mesh/index.d.ts +19 -58
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +19 -70
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +39 -16
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +151 -22
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +42 -7
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/threemf-bambu.d.ts +12 -1
- package/dist/mesh/threemf-bambu.d.ts.map +1 -1
- package/dist/mesh/threemf-bambu.js +68 -16
- package/dist/mesh/threemf-bambu.js.map +1 -1
- package/dist/mesh/threemf-loader.d.ts +37 -1
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +205 -14
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/transform.d.ts +1 -1
- package/dist/mesh/transform.js +1 -1
- package/dist/mesh/transform.js.map +1 -1
- package/dist/mesh/types.d.ts +43 -5
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/cli.d.ts +49 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +125 -19
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/execute-script.d.ts +55 -0
- package/dist/node-host/execute-script.d.ts.map +1 -0
- package/dist/node-host/execute-script.js +46 -0
- package/dist/node-host/execute-script.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -1
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
- package/dist/occt-kernel/highLevelApi.d.ts +4 -1
- package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
- package/dist/occt-kernel/highLevelApi.js +4 -2
- package/dist/occt-kernel/highLevelApi.js.map +1 -1
- package/dist/occt-kernel/hullGeometry.d.ts +2 -2
- package/dist/occt-kernel/hullGeometry.js +2 -3
- package/dist/occt-kernel/hullGeometry.js.map +1 -1
- package/dist/occt-kernel/hullOps.d.ts +3 -3
- package/dist/occt-kernel/hullOps.js +4 -4
- package/dist/occt-kernel/hullOps.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +32 -5
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +1 -1
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +19 -1
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
- package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
- package/dist/occt-kernel/stepMetaParser.js +166 -0
- package/dist/occt-kernel/stepMetaParser.js.map +1 -0
- package/dist/occt-scan/recognize.d.ts +58 -0
- package/dist/occt-scan/recognize.d.ts.map +1 -0
- package/dist/occt-scan/recognize.js +216 -0
- package/dist/occt-scan/recognize.js.map +1 -0
- package/dist/primitives/brep-primitives.js +7 -7
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/result/bug.d.ts +1 -1
- package/dist/result/bug.js +1 -1
- package/dist/result/bug.js.map +1 -1
- package/dist/result/errors.d.ts +2 -2
- package/dist/result/errors.d.ts.map +1 -1
- package/dist/result/errors.js +1 -1
- package/dist/result/errors.js.map +1 -1
- package/dist/result/vec3.d.ts +1 -1
- package/dist/result/vec3.js +1 -1
- package/dist/result/vec3.js.map +1 -1
- package/dist/runtime-state.d.ts +16 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +27 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/script-globals.d.ts +24 -0
- package/dist/script-globals.d.ts.map +1 -0
- package/dist/script-globals.js +24 -0
- package/dist/script-globals.js.map +1 -0
- package/dist/shape.d.ts +35 -3
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +44 -2
- package/dist/shape.js.map +1 -1
- package/dist/step/stepMetaParser.d.ts +55 -0
- package/dist/step/stepMetaParser.d.ts.map +1 -0
- package/dist/step/stepMetaParser.js +177 -0
- package/dist/step/stepMetaParser.js.map +1 -0
- package/dist/topology/naming/lineage.d.ts +3 -2
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +9 -11
|
@@ -1 +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}"]}
|
|
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// A4 (2026-10-06): SAFE_CONTAINERS / SAFE_FUNCTIONS are derived from the S4\n// admission list — single source of truth for script-face globals.\nimport { S4_SAFE_GLOBALS } from './security-scanner'\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 *\n * A4 (2026-10-06, user decision): DERIVED from `S4_SAFE_GLOBALS`\n * (security-scanner.ts) instead of hand-maintained. The script face can only\n * name identifiers admitted by the S4 gate, so any container not in S4 is\n * unreachable dead weight — the former hand-copied entries `Intl` / `Reflect`\n * (and the encodeURI family in SAFE_FUNCTIONS) were exactly that, and are gone.\n * Excluded here: bare non-deterministic sources (Date / crypto / performance —\n * they are handled by SOURCE_MEMBERS / SOURCE_IDENTS above). Unit constants\n * (MM, INCH, …) are inert numeric values; keeping them is harmless.\n */\nconst SAFE_CONTAINERS: ReadonlySet<string> = new Set(\n [...S4_SAFE_GLOBALS].filter((name) => !SOURCE_IDENTS.has(name)),\n)\n\n/**\n * Safe top-level functions (pure/known, not geometry). Also derived from\n * `S4_SAFE_GLOBALS`: every name here must be S4-admitted (guard test\n * `test/lang/determinism-scanner.test.ts` enforces both derivations).\n * The former `encodeURI` / `encodeURIComponent` / `decodeURI` /\n * `decodeURIComponent` entries were unreachable in scripts (not in S4) —\n * URL construction is host/IO territory, not geometry-script territory.\n */\nconst SAFE_FUNCTIONS: ReadonlySet<string> = new Set(\n ['parseInt', 'parseFloat', 'isNaN', 'isFinite', 'String', 'Number', 'Boolean'].filter((name) =>\n S4_SAFE_GLOBALS.has(name),\n ),\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}"]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* metadata-extractor — 无 IR 元数据提取器(UI 通道语义源)
|
|
3
3
|
*
|
|
4
|
-
* 方案:docs/plans/2026-09-06-no-ir-dual-channel-runtime.md §4.1(D3)
|
|
5
|
-
*
|
|
6
4
|
* 定位:从 .fai.js 源码(任意合法 JS)提取 **UI 通道需要的全部元数据**。
|
|
7
5
|
* 输入 = 源码文本;输出 = UiMetadata。不生成可执行代码、不求值、不参与执行、
|
|
8
6
|
* 不建执行中介 IR(已删除,只产宿主面类型)。
|
|
@@ -32,7 +30,7 @@ export interface ParamEntry {
|
|
|
32
30
|
/**
|
|
33
31
|
* 单个参数槽的源码来源信息(UI 通道新增,非 IR)。
|
|
34
32
|
*
|
|
35
|
-
* Timeline
|
|
33
|
+
* Timeline 参数表达式编辑:
|
|
36
34
|
* 每个参数槽携带自己的源码区间,编辑 = 精确替换该区间(`editArgSource`),
|
|
37
35
|
* 不重印整行。path 对宿主是不透明标识符——宿主只能从本记录读取后原样回传。
|
|
38
36
|
*/
|
|
@@ -110,9 +108,13 @@ export interface UiMetadata {
|
|
|
110
108
|
*/
|
|
111
109
|
argSources: ArgSource[];
|
|
112
110
|
/**
|
|
113
|
-
*
|
|
114
|
-
* paramNames ∪ declared ∪ nsBindings ∪ localFnParams
|
|
111
|
+
* 本脚本内可被表达式引用的名字(词典序去重):
|
|
112
|
+
* paramNames ∪ declared ∪ nsBindings ∪ localFnParams ∪ 单位常量。
|
|
115
113
|
* `validateExpression` / `editArgSource` 用它做 E_REFERENCE 判定。
|
|
114
|
+
*
|
|
115
|
+
* 注意:S4 免 import 安全全局(Math / JSON / Number / console / Infinity / …)**不**入此表——
|
|
116
|
+
* 它们不属于脚本作用域,`collectExprIdentifiers` 已借 `isSafeGlobalIdent` 无条件放行;
|
|
117
|
+
* 列进来反而会让宿主把它们当成脚本变量(联想/重命名都会误伤)。
|
|
116
118
|
*/
|
|
117
119
|
names: string[];
|
|
118
120
|
}
|
|
@@ -137,6 +139,24 @@ export interface SymbolTable {
|
|
|
137
139
|
/** keep 指令表(lineNo → 调用点条目;行级存活判定静态输入) */
|
|
138
140
|
keep: Map<number, KeepEntry[]>;
|
|
139
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* 引用解析失败时的错误分类(A3):裸标识符既非参数也非已声明变量。
|
|
144
|
+
*
|
|
145
|
+
* - 若它是免 import 安全全局(`isSafeGlobalIdent`,即 `S4_SAFE_GLOBALS` 成员),给出独立错误码
|
|
146
|
+
* `E_GLOBAL_NOT_ADMITTED` 与诚实文案,指明「这是 faijs 的判定点缺陷,不是你的代码问题」,
|
|
147
|
+
* 并指向统一入口(`S4_SAFE_GLOBALS` / 计划 A1)——错误信息不再把调用方引向「这语言没有 Math」
|
|
148
|
+
* 的相反结论。
|
|
149
|
+
* - 真未知标识符仍给 `E_REFERENCE`,语义不变。
|
|
150
|
+
*
|
|
151
|
+
* 各判定点(collectExprIdentifiers / parseValueExpr / shorthand / 位置实参)已优先放行安全全局;
|
|
152
|
+
* 本函数是其兜底:若某个判定点漏放行,错误也必须是诚实的,而非误导性的「unknown identifier」。
|
|
153
|
+
*
|
|
154
|
+
* @param name 被拒绝的裸标识符名。
|
|
155
|
+
* @param line 行号。
|
|
156
|
+
* @param where 出错位置描述(拼进 E_REFERENCE 文案;安全全局分支忽略)。
|
|
157
|
+
* @returns 永不返回(总是抛 ParseError)。
|
|
158
|
+
*/
|
|
159
|
+
export declare function throwReferenceError(name: string, line: number, where: string): never;
|
|
140
160
|
/**
|
|
141
161
|
* <Ns>.fn(...) 等「白名单表达式」结构判定(无可选链、无 spread、成员非计算)。
|
|
142
162
|
* @param node 待判定的表达式 AST 节点;nil 或非法输入按非白名单处理。
|
|
@@ -144,7 +164,8 @@ export interface SymbolTable {
|
|
|
144
164
|
*/
|
|
145
165
|
export declare function isExprWhitelist(node: ASTNode): boolean;
|
|
146
166
|
/**
|
|
147
|
-
* 递归收集表达式引用:参数 → params;已声明变量 → refs
|
|
167
|
+
* 递归收集表达式引用:参数 → params;已声明变量 → refs;
|
|
168
|
+
* 免 import 安全全局/单位常量 → 只放行、不记入(见下方分支注释);未知 → E_REFERENCE。
|
|
148
169
|
*
|
|
149
170
|
* opts(可选扩展;缺省时行为与历史完全一致):
|
|
150
171
|
* - `lenient: true`:未知标识符不抛错(静默跳过)——ArgSource 记录路径用,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-extractor.d.ts","sourceRoot":"","sources":["../../src/lang/metadata-extractor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"metadata-extractor.d.ts","sourceRoot":"","sources":["../../src/lang/metadata-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* metadata-extractor — 无 IR 元数据提取器(UI 通道语义源)
|
|
3
3
|
*
|
|
4
|
-
* 方案:docs/plans/2026-09-06-no-ir-dual-channel-runtime.md §4.1(D3)
|
|
5
|
-
*
|
|
6
4
|
* 定位:从 .fai.js 源码(任意合法 JS)提取 **UI 通道需要的全部元数据**。
|
|
7
5
|
* 输入 = 源码文本;输出 = UiMetadata。不生成可执行代码、不求值、不参与执行、
|
|
8
6
|
* 不建执行中介 IR(已删除,只产宿主面类型)。
|
|
@@ -19,7 +17,7 @@ import { asStmtId, asPartName } from '../identity.js';
|
|
|
19
17
|
import { isHostVarRef, isHostParamRef, isHostCallRef, isHostExprRef } from './host-arg.js';
|
|
20
18
|
import { ParseError } from './parse-error.js';
|
|
21
19
|
import { fnv1a32 } from './fnv-hash.js';
|
|
22
|
-
import { assertSecure } from './security-scanner.js';
|
|
20
|
+
import { assertSecure, isSafeGlobalIdent } from './security-scanner.js';
|
|
23
21
|
import { SCRIPT_UNIT_NAMES, UNIT_DIM, UNIT_SCALE, SCRIPT_UNIT_TO_NAME } from '../units.js';
|
|
24
22
|
const CONTROL_FLOW_TYPES = new Set([
|
|
25
23
|
'IfStatement', 'ForStatement', 'ForInStatement', 'ForOfStatement',
|
|
@@ -55,6 +53,29 @@ function looseEq(a, b) {
|
|
|
55
53
|
return x === null && y === null;
|
|
56
54
|
return x === y;
|
|
57
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* 引用解析失败时的错误分类(A3):裸标识符既非参数也非已声明变量。
|
|
58
|
+
*
|
|
59
|
+
* - 若它是免 import 安全全局(`isSafeGlobalIdent`,即 `S4_SAFE_GLOBALS` 成员),给出独立错误码
|
|
60
|
+
* `E_GLOBAL_NOT_ADMITTED` 与诚实文案,指明「这是 faijs 的判定点缺陷,不是你的代码问题」,
|
|
61
|
+
* 并指向统一入口(`S4_SAFE_GLOBALS` / 计划 A1)——错误信息不再把调用方引向「这语言没有 Math」
|
|
62
|
+
* 的相反结论。
|
|
63
|
+
* - 真未知标识符仍给 `E_REFERENCE`,语义不变。
|
|
64
|
+
*
|
|
65
|
+
* 各判定点(collectExprIdentifiers / parseValueExpr / shorthand / 位置实参)已优先放行安全全局;
|
|
66
|
+
* 本函数是其兜底:若某个判定点漏放行,错误也必须是诚实的,而非误导性的「unknown identifier」。
|
|
67
|
+
*
|
|
68
|
+
* @param name 被拒绝的裸标识符名。
|
|
69
|
+
* @param line 行号。
|
|
70
|
+
* @param where 出错位置描述(拼进 E_REFERENCE 文案;安全全局分支忽略)。
|
|
71
|
+
* @returns 永不返回(总是抛 ParseError)。
|
|
72
|
+
*/
|
|
73
|
+
export function throwReferenceError(name, line, where) {
|
|
74
|
+
if (isSafeGlobalIdent(name)) {
|
|
75
|
+
throw new ParseError(`"${name}" 是免 import 安全全局(见统一入口 S4_SAFE_GLOBALS / 计划 A1),但本判定点未放行它——这是 faijs 判定点的缺陷,不是你的代码问题`, line, 'E_GLOBAL_NOT_ADMITTED');
|
|
76
|
+
}
|
|
77
|
+
throw new ParseError(`unknown identifier "${name}" ${where}`, line, 'E_REFERENCE');
|
|
78
|
+
}
|
|
58
79
|
function tryFoldConstExpr(node, symbols) {
|
|
59
80
|
switch (node.type) {
|
|
60
81
|
case 'Literal':
|
|
@@ -226,7 +247,8 @@ export function isExprWhitelist(node) {
|
|
|
226
247
|
}
|
|
227
248
|
}
|
|
228
249
|
/**
|
|
229
|
-
* 递归收集表达式引用:参数 → params;已声明变量 → refs
|
|
250
|
+
* 递归收集表达式引用:参数 → params;已声明变量 → refs;
|
|
251
|
+
* 免 import 安全全局/单位常量 → 只放行、不记入(见下方分支注释);未知 → E_REFERENCE。
|
|
230
252
|
*
|
|
231
253
|
* opts(可选扩展;缺省时行为与历史完全一致):
|
|
232
254
|
* - `lenient: true`:未知标识符不抛错(静默跳过)——ArgSource 记录路径用,
|
|
@@ -261,11 +283,19 @@ export function collectExprIdentifiers(node, symbols, line, params, refs, opts)
|
|
|
261
283
|
// Treat as a known reference — do not throw E_REFERENCE.
|
|
262
284
|
refs.add(name);
|
|
263
285
|
}
|
|
286
|
+
else if (isSafeGlobalIdent(name)) {
|
|
287
|
+
// 2026-10-06 修复:先前的白名单只内联了单位常量,漏掉 S4_SAFE_GLOBALS 的其余
|
|
288
|
+
// 免 import 安全全局(Math / JSON / Number / console / Infinity / undefined / …),
|
|
289
|
+
// 导致 `cad.box(Math.max(x, 20), 1, 1)` 在提取阶段就抛 E_REFERENCE —— 与 S4 门禁
|
|
290
|
+
// 「Math 合法」直接矛盾,整个脚本连执行都进不去。
|
|
291
|
+
// 这里只判定「合法」,**不**记入 params/refs:它们是 JS 全局,不是脚本作用域变量,
|
|
292
|
+
// 记入会让宿主依赖分析(summary.refs / ArgSource.refs)产生幻影依赖。
|
|
293
|
+
}
|
|
264
294
|
else if (opts?.lenient === true) {
|
|
265
295
|
// lenient:未知标识符跳过(ArgSource 记录路径,保证提取不抛新错)
|
|
266
296
|
}
|
|
267
297
|
else {
|
|
268
|
-
throw
|
|
298
|
+
throw throwReferenceError(name, line, 'in expression');
|
|
269
299
|
}
|
|
270
300
|
return;
|
|
271
301
|
}
|
|
@@ -486,6 +516,41 @@ function recordArgSource(node, ctx, path) {
|
|
|
486
516
|
isExpression: isExpr,
|
|
487
517
|
});
|
|
488
518
|
}
|
|
519
|
+
/**
|
|
520
|
+
* 裸全局标识符实参解析(单位常量 + S4 免 import 安全全局)。
|
|
521
|
+
*
|
|
522
|
+
* 分别收口 `parseValueExpr` 与 `parsePositionalArgs` 的 Identifier 分支:两者此前
|
|
523
|
+
* 都把「不在 paramNames/declared 里」的裸标识符直接判为未声明变量(E_REFERENCE),
|
|
524
|
+
* 于是连 `cad.box(MM, 1, 1)` 这种合法写法也被拒。
|
|
525
|
+
*
|
|
526
|
+
* 返回 undefined 表示「不是全局名字」,交由调用方按变量引用/报错处理。
|
|
527
|
+
*
|
|
528
|
+
* 单位常量(MM/INCH/DEGREE/…)走静态折叠(与 `10 * MM` 同一路径,得折叠字面量 +
|
|
529
|
+
* computed 标记,源文本不回写,见 P7/D10.4);其余安全全局(Math/JSON/console/
|
|
530
|
+
* Infinity/…)保留原文交给运行时求值(expr-ref),两个执行后端都能从 globalThis 解析。
|
|
531
|
+
* @param name 标识符名(须已判定为全局名字)。
|
|
532
|
+
* @param node 该标识符的 AST 节点(取源码区间做 expr-ref 文本)。
|
|
533
|
+
* @param ctx 值解析上下文(符号表 / computed 累积 / 源文本)。
|
|
534
|
+
* @returns 对应的 HostArg。
|
|
535
|
+
*/
|
|
536
|
+
function parseGlobalIdentArg(name, node, ctx) {
|
|
537
|
+
if (!isSafeGlobalIdent(name))
|
|
538
|
+
return undefined;
|
|
539
|
+
if (SCRIPT_UNIT_NAMES.has(name)) {
|
|
540
|
+
const r = tryFoldConstExpr(node, ctx.symbols);
|
|
541
|
+
if (r.ok) {
|
|
542
|
+
ctx.computed.value = true;
|
|
543
|
+
return r.value;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
ctx.computed.value = true;
|
|
547
|
+
return {
|
|
548
|
+
kind: 'expr-ref',
|
|
549
|
+
text: ctx.sourceText.slice(node.start, node.end),
|
|
550
|
+
refs: [],
|
|
551
|
+
params: [],
|
|
552
|
+
};
|
|
553
|
+
}
|
|
489
554
|
function parseValueExpr(node, ctx, path) {
|
|
490
555
|
if (!node)
|
|
491
556
|
throw new ParseError('missing value expression', 1, 'E_VALUE');
|
|
@@ -536,11 +601,14 @@ function parseValueExpr(node, ctx, path) {
|
|
|
536
601
|
if (ctx.symbols.declared.has(name)) {
|
|
537
602
|
return { kind: 'var-ref', name };
|
|
538
603
|
}
|
|
604
|
+
const globalArg = parseGlobalIdentArg(name, node, ctx);
|
|
605
|
+
if (globalArg !== undefined)
|
|
606
|
+
return globalArg;
|
|
539
607
|
if (ctx.looseVars) {
|
|
540
608
|
ctx.symbols.declared.add(name);
|
|
541
609
|
return { kind: 'var-ref', name };
|
|
542
610
|
}
|
|
543
|
-
throw
|
|
611
|
+
throw throwReferenceError(name, line, 'in args value (not a declared param or variable)');
|
|
544
612
|
}
|
|
545
613
|
case 'ArrayExpression': {
|
|
546
614
|
const out = [];
|
|
@@ -646,13 +714,18 @@ function parseObjectValue(node, ctx, path) {
|
|
|
646
714
|
obj[key] = { kind: 'param-ref', name };
|
|
647
715
|
slotParams = [name];
|
|
648
716
|
}
|
|
717
|
+
else if (isSafeGlobalIdent(name)) {
|
|
718
|
+
// 与 longhand `{ q: Math }`(parseValueExpr → parseGlobalIdentArg)一致:免 import 安全全局放行,
|
|
719
|
+
// 不再误报 E_REFERENCE / E_GLOBAL_NOT_ADMITTED(A3:同值 Math 在 longhand 已放行)。
|
|
720
|
+
obj[key] = parseGlobalIdentArg(name, prop.key, ctx);
|
|
721
|
+
}
|
|
649
722
|
else if (ctx.looseVars) {
|
|
650
723
|
ctx.symbols.declared.add(name);
|
|
651
724
|
obj[key] = { kind: 'var-ref', name };
|
|
652
725
|
slotRefs = [name];
|
|
653
726
|
}
|
|
654
727
|
else {
|
|
655
|
-
throw
|
|
728
|
+
throw throwReferenceError(name, line, 'in shorthand object key (not a declared param)');
|
|
656
729
|
}
|
|
657
730
|
// P0-B:shorthand 槽(以属性名 == 变量名作 text,path = <base>.<key>,isExpression=false)
|
|
658
731
|
if (path !== null) {
|
|
@@ -694,12 +767,17 @@ function parsePositionalArgs(argNodes, ctx, line, pathBase = 'positional') {
|
|
|
694
767
|
out.push({ kind: 'var-ref', name });
|
|
695
768
|
continue;
|
|
696
769
|
}
|
|
770
|
+
const globalArg = parseGlobalIdentArg(name, argNode, ctx);
|
|
771
|
+
if (globalArg !== undefined) {
|
|
772
|
+
out.push(globalArg);
|
|
773
|
+
continue;
|
|
774
|
+
}
|
|
697
775
|
if (ctx.looseVars) {
|
|
698
776
|
ctx.symbols.declared.add(name);
|
|
699
777
|
out.push({ kind: 'var-ref', name });
|
|
700
778
|
continue;
|
|
701
779
|
}
|
|
702
|
-
throw
|
|
780
|
+
throw throwReferenceError(name, lineOf(argNode), 'in inputs');
|
|
703
781
|
}
|
|
704
782
|
if (argNode.type === 'SpreadElement') {
|
|
705
783
|
recordArgSource(argNode.argument, ctx, slotPath);
|
|
@@ -838,27 +916,8 @@ function parseReturnStatement(node, ctx) {
|
|
|
838
916
|
if (prop.value?.type === 'Literal')
|
|
839
917
|
meta.name = prop.value.value;
|
|
840
918
|
}
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
if (!meta.appearance)
|
|
844
|
-
meta.appearance = {};
|
|
845
|
-
meta.appearance.color = prop.value.value;
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
else if (key === 'metalness') {
|
|
849
|
-
if (prop.value?.type === 'Literal') {
|
|
850
|
-
if (!meta.appearance)
|
|
851
|
-
meta.appearance = {};
|
|
852
|
-
meta.appearance.metalness = prop.value.value;
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
else if (key === 'roughness') {
|
|
856
|
-
if (prop.value?.type === 'Literal') {
|
|
857
|
-
if (!meta.appearance)
|
|
858
|
-
meta.appearance = {};
|
|
859
|
-
meta.appearance.roughness = prop.value.value;
|
|
860
|
-
}
|
|
861
|
-
}
|
|
919
|
+
// 其余 key(含旧死特性 color/metalness/roughness,2026-10-05 v2 已删除)
|
|
920
|
+
// 静默忽略:return 对象不是 op 参数,未知 key 不做参数校验(宽容语义)。
|
|
862
921
|
}
|
|
863
922
|
return { id, meta: Object.keys(meta).length > 0 ? meta : undefined };
|
|
864
923
|
};
|
|
@@ -1252,6 +1311,8 @@ export function extractMetadata(code, options) {
|
|
|
1252
1311
|
// P0-B:名称集合 = 参数 ∪ 已声明变量 ∪ 命名空间绑定 ∪ 本地函数名 ∪ 单位常量(字典序去重)。
|
|
1253
1312
|
// 宿主把「参数表达式」中的未知标识符当作参数名(期望名)处理时用它做联想。
|
|
1254
1313
|
// P6/D7:单位常量名(MM, INCH, DEGREE, …)加入 knownNames,使表达式实时校验通过。
|
|
1314
|
+
// 2026-10-06:其余 S4 安全全局(Math / JSON / console / …)不入此表——引用合法性由
|
|
1315
|
+
// collectExprIdentifiers + isSafeGlobalIdent 判定,与 knownNames 无关(见 names 字段注释)。
|
|
1255
1316
|
const names = [
|
|
1256
1317
|
...new Set([
|
|
1257
1318
|
...symbols.paramNames,
|