brep-io-kernel 1.0.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/LICENSE.md +32 -0
- package/README.md +144 -0
- package/dist-kernel/brep-kernel.js +74699 -0
- package/dist-kernel/help/CONTRIBUTING.html +248 -0
- package/dist-kernel/help/LICENSE.html +248 -0
- package/dist-kernel/help/MODELING.png +0 -0
- package/dist-kernel/help/PMI.png +0 -0
- package/dist-kernel/help/SKETCH.png +0 -0
- package/dist-kernel/help/assembly-constraints__Coincident_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Angle_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Distance_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Fixed_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Parallel_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Touch_Align_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints__angle-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__coincident-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__distance-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__fixed-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__parallel-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__solver.html +248 -0
- package/dist-kernel/help/assembly-constraints__touch-align-constraint.html +248 -0
- package/dist-kernel/help/brep-api.html +263 -0
- package/dist-kernel/help/brep-kernel.html +258 -0
- package/dist-kernel/help/brep-model.html +248 -0
- package/dist-kernel/help/cylindrical-face-radius-embedding.html +290 -0
- package/dist-kernel/help/dialog-screenshots.html +248 -0
- package/dist-kernel/help/extruded-sketch-radius-embedding.html +336 -0
- package/dist-kernel/help/features__Assembly_Component_dialog.png +0 -0
- package/dist-kernel/help/features__Boolean_dialog.png +0 -0
- package/dist-kernel/help/features__Chamfer_dialog.png +0 -0
- package/dist-kernel/help/features__Datium_dialog.png +0 -0
- package/dist-kernel/help/features__Extrude_dialog.png +0 -0
- package/dist-kernel/help/features__Fillet_dialog.png +0 -0
- package/dist-kernel/help/features__Helix_dialog.png +0 -0
- package/dist-kernel/help/features__Hole_dialog.png +0 -0
- package/dist-kernel/help/features__Image_Heightmap_Solid_dialog.png +0 -0
- package/dist-kernel/help/features__Image_to_Face_dialog.png +0 -0
- package/dist-kernel/help/features__Import_3D_Model_dialog.png +0 -0
- package/dist-kernel/help/features__Loft_dialog.png +0 -0
- package/dist-kernel/help/features__Mirror_dialog.png +0 -0
- package/dist-kernel/help/features__Offset_Shell_dialog.png +0 -0
- package/dist-kernel/help/features__Overlap_Cleanup_dialog.png +0 -0
- package/dist-kernel/help/features__Pattern_Linear_dialog.png +0 -0
- package/dist-kernel/help/features__Pattern_Radial_dialog.png +0 -0
- package/dist-kernel/help/features__Pattern_dialog.png +0 -0
- package/dist-kernel/help/features__Plane_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Cone_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Cube_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Cylinder_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Pyramid_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Sphere_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Torus_dialog.png +0 -0
- package/dist-kernel/help/features__Remesh_dialog.png +0 -0
- package/dist-kernel/help/features__Revolve_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Contour_Flange_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Cutout_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Flange_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Tab_dialog.png +0 -0
- package/dist-kernel/help/features__Sketch_dialog.png +0 -0
- package/dist-kernel/help/features__Spline_dialog.png +0 -0
- package/dist-kernel/help/features__Sweep_dialog.png +0 -0
- package/dist-kernel/help/features__Transform_dialog.png +0 -0
- package/dist-kernel/help/features__Tube_dialog.png +0 -0
- package/dist-kernel/help/features__assembly-component.html +248 -0
- package/dist-kernel/help/features__boolean.html +248 -0
- package/dist-kernel/help/features__chamfer.html +248 -0
- package/dist-kernel/help/features__datium.html +248 -0
- package/dist-kernel/help/features__datum.html +248 -0
- package/dist-kernel/help/features__extrude.html +248 -0
- package/dist-kernel/help/features__fillet.html +248 -0
- package/dist-kernel/help/features__helix.html +248 -0
- package/dist-kernel/help/features__hole.html +248 -0
- package/dist-kernel/help/features__image-heightmap-solid.html +248 -0
- package/dist-kernel/help/features__image-to-face-2D_dialog.png +0 -0
- package/dist-kernel/help/features__image-to-face-3D_dialog.png +0 -0
- package/dist-kernel/help/features__image-to-face.html +248 -0
- package/dist-kernel/help/features__import-3d-model.html +248 -0
- package/dist-kernel/help/features__index.html +248 -0
- package/dist-kernel/help/features__loft.html +248 -0
- package/dist-kernel/help/features__mirror.html +248 -0
- package/dist-kernel/help/features__offset-shell.html +248 -0
- package/dist-kernel/help/features__pattern-linear.html +248 -0
- package/dist-kernel/help/features__pattern-radial.html +248 -0
- package/dist-kernel/help/features__pattern.html +248 -0
- package/dist-kernel/help/features__plane.html +248 -0
- package/dist-kernel/help/features__primitive-cone.html +248 -0
- package/dist-kernel/help/features__primitive-cube.html +248 -0
- package/dist-kernel/help/features__primitive-cylinder.html +248 -0
- package/dist-kernel/help/features__primitive-pyramid.html +248 -0
- package/dist-kernel/help/features__primitive-sphere.html +248 -0
- package/dist-kernel/help/features__primitive-torus.html +248 -0
- package/dist-kernel/help/features__remesh.html +248 -0
- package/dist-kernel/help/features__revolve.html +248 -0
- package/dist-kernel/help/features__sheet-metal-contour-flange.html +248 -0
- package/dist-kernel/help/features__sheet-metal-flange.html +248 -0
- package/dist-kernel/help/features__sheet-metal-tab.html +248 -0
- package/dist-kernel/help/features__sketch.html +248 -0
- package/dist-kernel/help/features__spline.html +248 -0
- package/dist-kernel/help/features__sweep.html +248 -0
- package/dist-kernel/help/features__transform.html +248 -0
- package/dist-kernel/help/features__tube.html +248 -0
- package/dist-kernel/help/file-formats.html +248 -0
- package/dist-kernel/help/getting-started.html +248 -0
- package/dist-kernel/help/highlights.html +248 -0
- package/dist-kernel/help/history-systems.html +248 -0
- package/dist-kernel/help/how-it-works.html +248 -0
- package/dist-kernel/help/index.html +862 -0
- package/dist-kernel/help/input-params-schema.html +363 -0
- package/dist-kernel/help/inspector-improvements.html +248 -0
- package/dist-kernel/help/inspector.html +248 -0
- package/dist-kernel/help/modes__modeling.html +248 -0
- package/dist-kernel/help/modes__pmi.html +248 -0
- package/dist-kernel/help/modes__sketch.html +248 -0
- package/dist-kernel/help/plugins.html +248 -0
- package/dist-kernel/help/pmi-annotations__Angle_Dimension_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Explode_Body_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Hole_Callout_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Leader_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Linear_Dimension_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Note_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Radial_Dimension_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__angle-dimension.html +248 -0
- package/dist-kernel/help/pmi-annotations__explode-body.html +248 -0
- package/dist-kernel/help/pmi-annotations__hole-callout.html +248 -0
- package/dist-kernel/help/pmi-annotations__index.html +248 -0
- package/dist-kernel/help/pmi-annotations__leader.html +248 -0
- package/dist-kernel/help/pmi-annotations__linear-dimension.html +248 -0
- package/dist-kernel/help/pmi-annotations__note.html +248 -0
- package/dist-kernel/help/pmi-annotations__radial-dimension.html +248 -0
- package/dist-kernel/help/search-index.json +464 -0
- package/dist-kernel/help/simplified-radial-dimensions.html +298 -0
- package/dist-kernel/help/solid-methods.html +359 -0
- package/dist-kernel/help/table-of-contents.html +330 -0
- package/dist-kernel/help/ui-overview.html +248 -0
- package/dist-kernel/help/whats-new.html +248 -0
- package/package.json +54 -0
- package/src/BREP/AssemblyComponent.js +42 -0
- package/src/BREP/BREP.js +43 -0
- package/src/BREP/BetterSolid.js +805 -0
- package/src/BREP/Edge.js +103 -0
- package/src/BREP/Extrude.js +403 -0
- package/src/BREP/Face.js +187 -0
- package/src/BREP/MeshRepairer.js +634 -0
- package/src/BREP/OffsetShellSolid.js +614 -0
- package/src/BREP/PointCloudWrap.js +302 -0
- package/src/BREP/Revolve.js +345 -0
- package/src/BREP/SolidMethods/authoring.js +112 -0
- package/src/BREP/SolidMethods/booleanOps.js +230 -0
- package/src/BREP/SolidMethods/chamfer.js +122 -0
- package/src/BREP/SolidMethods/edgeResolution.js +25 -0
- package/src/BREP/SolidMethods/fillet.js +792 -0
- package/src/BREP/SolidMethods/index.js +72 -0
- package/src/BREP/SolidMethods/io.js +105 -0
- package/src/BREP/SolidMethods/lifecycle.js +103 -0
- package/src/BREP/SolidMethods/manifoldOps.js +375 -0
- package/src/BREP/SolidMethods/meshCleanup.js +2512 -0
- package/src/BREP/SolidMethods/meshQueries.js +264 -0
- package/src/BREP/SolidMethods/metadata.js +106 -0
- package/src/BREP/SolidMethods/metrics.js +51 -0
- package/src/BREP/SolidMethods/transforms.js +361 -0
- package/src/BREP/SolidMethods/visualize.js +508 -0
- package/src/BREP/SolidShared.js +26 -0
- package/src/BREP/Sweep.js +1596 -0
- package/src/BREP/Tube.js +857 -0
- package/src/BREP/Vertex.js +43 -0
- package/src/BREP/applyBooleanOperation.js +704 -0
- package/src/BREP/boundsUtils.js +48 -0
- package/src/BREP/chamfer.js +551 -0
- package/src/BREP/edgePolylineUtils.js +85 -0
- package/src/BREP/fillets/common.js +388 -0
- package/src/BREP/fillets/fillet.js +1422 -0
- package/src/BREP/fillets/filletGeometry.js +15 -0
- package/src/BREP/fillets/inset.js +389 -0
- package/src/BREP/fillets/offsetHelper.js +143 -0
- package/src/BREP/fillets/outset.js +88 -0
- package/src/BREP/helix.js +193 -0
- package/src/BREP/meshToBrep.js +234 -0
- package/src/BREP/primitives.js +279 -0
- package/src/BREP/setupManifold.js +71 -0
- package/src/BREP/threadGeometry.js +1120 -0
- package/src/BREP/triangleUtils.js +8 -0
- package/src/BREP/triangulate.js +608 -0
- package/src/FeatureRegistry.js +183 -0
- package/src/PartHistory.js +1132 -0
- package/src/UI/AccordionWidget.js +292 -0
- package/src/UI/CADmaterials.js +850 -0
- package/src/UI/EnvMonacoEditor.js +522 -0
- package/src/UI/FloatingWindow.js +396 -0
- package/src/UI/HistoryWidget.js +457 -0
- package/src/UI/MainToolbar.js +131 -0
- package/src/UI/ModelLibraryView.js +194 -0
- package/src/UI/OrthoCameraIdle.js +206 -0
- package/src/UI/PluginsWidget.js +280 -0
- package/src/UI/SceneListing.js +606 -0
- package/src/UI/SelectionFilter.js +629 -0
- package/src/UI/ViewCube.js +389 -0
- package/src/UI/assembly/AssemblyConstraintCollectionWidget.js +329 -0
- package/src/UI/assembly/AssemblyConstraintControlsWidget.js +282 -0
- package/src/UI/assembly/AssemblyConstraintsWidget.css +292 -0
- package/src/UI/assembly/AssemblyConstraintsWidget.js +1373 -0
- package/src/UI/assembly/constraintFaceUtils.js +115 -0
- package/src/UI/assembly/constraintHighlightUtils.js +70 -0
- package/src/UI/assembly/constraintLabelUtils.js +31 -0
- package/src/UI/assembly/constraintPointUtils.js +64 -0
- package/src/UI/assembly/constraintSelectionUtils.js +185 -0
- package/src/UI/assembly/constraintStatusUtils.js +142 -0
- package/src/UI/componentSelectorModal.js +240 -0
- package/src/UI/controls/CombinedTransformControls.js +386 -0
- package/src/UI/dialogs.js +351 -0
- package/src/UI/expressionsManager.js +100 -0
- package/src/UI/featureDialogWidgets/booleanField.js +25 -0
- package/src/UI/featureDialogWidgets/booleanOperationField.js +97 -0
- package/src/UI/featureDialogWidgets/buttonField.js +45 -0
- package/src/UI/featureDialogWidgets/componentSelectorField.js +102 -0
- package/src/UI/featureDialogWidgets/defaultField.js +23 -0
- package/src/UI/featureDialogWidgets/fileField.js +66 -0
- package/src/UI/featureDialogWidgets/index.js +34 -0
- package/src/UI/featureDialogWidgets/numberField.js +165 -0
- package/src/UI/featureDialogWidgets/optionsField.js +33 -0
- package/src/UI/featureDialogWidgets/referenceSelectionField.js +208 -0
- package/src/UI/featureDialogWidgets/stringField.js +24 -0
- package/src/UI/featureDialogWidgets/textareaField.js +28 -0
- package/src/UI/featureDialogWidgets/threadDesignationField.js +160 -0
- package/src/UI/featureDialogWidgets/transformField.js +252 -0
- package/src/UI/featureDialogWidgets/utils.js +43 -0
- package/src/UI/featureDialogWidgets/vec3Field.js +133 -0
- package/src/UI/featureDialogs.js +1414 -0
- package/src/UI/fileManagerWidget.js +615 -0
- package/src/UI/history/HistoryCollectionWidget.js +1294 -0
- package/src/UI/history/historyCollectionWidget.css.js +257 -0
- package/src/UI/history/historyDisplayInfo.js +133 -0
- package/src/UI/mobile.js +28 -0
- package/src/UI/objectDump.js +442 -0
- package/src/UI/pmi/AnnotationCollectionWidget.js +120 -0
- package/src/UI/pmi/AnnotationHistory.js +353 -0
- package/src/UI/pmi/AnnotationRegistry.js +90 -0
- package/src/UI/pmi/BaseAnnotation.js +269 -0
- package/src/UI/pmi/LabelOverlay.css +102 -0
- package/src/UI/pmi/LabelOverlay.js +191 -0
- package/src/UI/pmi/PMIMode.js +1550 -0
- package/src/UI/pmi/PMIViewsWidget.js +1098 -0
- package/src/UI/pmi/annUtils.js +729 -0
- package/src/UI/pmi/dimensions/AngleDimensionAnnotation.js +647 -0
- package/src/UI/pmi/dimensions/ExplodeBodyAnnotation.js +507 -0
- package/src/UI/pmi/dimensions/HoleCalloutAnnotation.js +462 -0
- package/src/UI/pmi/dimensions/LeaderAnnotation.js +403 -0
- package/src/UI/pmi/dimensions/LinearDimensionAnnotation.js +532 -0
- package/src/UI/pmi/dimensions/NoteAnnotation.js +110 -0
- package/src/UI/pmi/dimensions/RadialDimensionAnnotation.js +659 -0
- package/src/UI/pmi/pmiStyle.js +44 -0
- package/src/UI/sketcher/SketchMode3D.js +4095 -0
- package/src/UI/sketcher/dimensions.js +674 -0
- package/src/UI/sketcher/glyphs.js +236 -0
- package/src/UI/sketcher/highlights.js +60 -0
- package/src/UI/toolbarButtons/aboutButton.js +5 -0
- package/src/UI/toolbarButtons/exportButton.js +609 -0
- package/src/UI/toolbarButtons/flatPatternButton.js +307 -0
- package/src/UI/toolbarButtons/importButton.js +160 -0
- package/src/UI/toolbarButtons/inspectorToggleButton.js +12 -0
- package/src/UI/toolbarButtons/metadataButton.js +1063 -0
- package/src/UI/toolbarButtons/orientToFaceButton.js +114 -0
- package/src/UI/toolbarButtons/registerDefaultButtons.js +46 -0
- package/src/UI/toolbarButtons/saveButton.js +99 -0
- package/src/UI/toolbarButtons/scriptRunnerButton.js +302 -0
- package/src/UI/toolbarButtons/testsButton.js +26 -0
- package/src/UI/toolbarButtons/undoRedoButtons.js +25 -0
- package/src/UI/toolbarButtons/wireframeToggleButton.js +5 -0
- package/src/UI/toolbarButtons/zoomToFitButton.js +5 -0
- package/src/UI/triangleDebuggerWindow.js +945 -0
- package/src/UI/viewer.js +4228 -0
- package/src/assemblyConstraints/AssemblyConstraintHistory.js +1576 -0
- package/src/assemblyConstraints/AssemblyConstraintRegistry.js +120 -0
- package/src/assemblyConstraints/BaseAssemblyConstraint.js +66 -0
- package/src/assemblyConstraints/constraintExpressionUtils.js +35 -0
- package/src/assemblyConstraints/constraintUtils/parallelAlignment.js +676 -0
- package/src/assemblyConstraints/constraints/AngleConstraint.js +485 -0
- package/src/assemblyConstraints/constraints/CoincidentConstraint.js +194 -0
- package/src/assemblyConstraints/constraints/DistanceConstraint.js +616 -0
- package/src/assemblyConstraints/constraints/FixedConstraint.js +78 -0
- package/src/assemblyConstraints/constraints/ParallelConstraint.js +252 -0
- package/src/assemblyConstraints/constraints/TouchAlignConstraint.js +961 -0
- package/src/core/entities/HistoryCollectionBase.js +72 -0
- package/src/core/entities/ListEntityBase.js +109 -0
- package/src/core/entities/schemaProcesser.js +121 -0
- package/src/exporters/sheetMetalFlatPattern.js +659 -0
- package/src/exporters/sheetMetalUnfold.js +862 -0
- package/src/exporters/step.js +1135 -0
- package/src/exporters/threeMF.js +575 -0
- package/src/features/assemblyComponent/AssemblyComponentFeature.js +780 -0
- package/src/features/boolean/BooleanFeature.js +94 -0
- package/src/features/chamfer/ChamferFeature.js +116 -0
- package/src/features/datium/DatiumFeature.js +80 -0
- package/src/features/edgeFeatureUtils.js +41 -0
- package/src/features/extrude/ExtrudeFeature.js +143 -0
- package/src/features/fillet/FilletFeature.js +197 -0
- package/src/features/helix/HelixFeature.js +405 -0
- package/src/features/hole/HoleFeature.js +1050 -0
- package/src/features/hole/screwClearance.js +86 -0
- package/src/features/hole/threadDesignationCatalog.js +149 -0
- package/src/features/imageHeightSolid/ImageHeightmapSolidFeature.js +463 -0
- package/src/features/imageToFace/ImageToFaceFeature.js +727 -0
- package/src/features/imageToFace/imageEditor.js +1270 -0
- package/src/features/imageToFace/traceUtils.js +971 -0
- package/src/features/import3dModel/Import3dModelFeature.js +151 -0
- package/src/features/loft/LoftFeature.js +605 -0
- package/src/features/mirror/MirrorFeature.js +151 -0
- package/src/features/offsetFace/OffsetFaceFeature.js +370 -0
- package/src/features/offsetShell/OffsetShellFeature.js +89 -0
- package/src/features/overlapCleanup/OverlapCleanupFeature.js +85 -0
- package/src/features/pattern/PatternFeature.js +275 -0
- package/src/features/patternLinear/PatternLinearFeature.js +120 -0
- package/src/features/patternRadial/PatternRadialFeature.js +186 -0
- package/src/features/plane/PlaneFeature.js +154 -0
- package/src/features/primitiveCone/primitiveConeFeature.js +99 -0
- package/src/features/primitiveCube/primitiveCubeFeature.js +70 -0
- package/src/features/primitiveCylinder/primitiveCylinderFeature.js +91 -0
- package/src/features/primitivePyramid/primitivePyramidFeature.js +72 -0
- package/src/features/primitiveSphere/primitiveSphereFeature.js +62 -0
- package/src/features/primitiveTorus/primitiveTorusFeature.js +109 -0
- package/src/features/remesh/RemeshFeature.js +97 -0
- package/src/features/revolve/RevolveFeature.js +111 -0
- package/src/features/selectionUtils.js +118 -0
- package/src/features/sheetMetal/SheetMetalContourFlangeFeature.js +1656 -0
- package/src/features/sheetMetal/SheetMetalCutoutFeature.js +1056 -0
- package/src/features/sheetMetal/SheetMetalFlangeFeature.js +1568 -0
- package/src/features/sheetMetal/SheetMetalHemFeature.js +43 -0
- package/src/features/sheetMetal/SheetMetalObject.js +141 -0
- package/src/features/sheetMetal/SheetMetalTabFeature.js +176 -0
- package/src/features/sheetMetal/UNFOLD_NEUTRAL_REQUIREMENTS.md +153 -0
- package/src/features/sheetMetal/contour-flange-rebuild-spec.md +261 -0
- package/src/features/sheetMetal/profileUtils.js +25 -0
- package/src/features/sheetMetal/sheetMetalCleanup.js +9 -0
- package/src/features/sheetMetal/sheetMetalFaceTypes.js +146 -0
- package/src/features/sheetMetal/sheetMetalMetadata.js +165 -0
- package/src/features/sheetMetal/sheetMetalPipeline.js +169 -0
- package/src/features/sheetMetal/sheetMetalProfileUtils.js +216 -0
- package/src/features/sheetMetal/sheetMetalTabUtils.js +29 -0
- package/src/features/sheetMetal/sheetMetalTree.js +210 -0
- package/src/features/sketch/SketchFeature.js +955 -0
- package/src/features/sketch/sketchSolver2D/ConstraintEngine.js +800 -0
- package/src/features/sketch/sketchSolver2D/constraintDefinitions.js +704 -0
- package/src/features/sketch/sketchSolver2D/mathHelpersMod.js +307 -0
- package/src/features/spline/SplineEditorSession.js +988 -0
- package/src/features/spline/SplineFeature.js +1388 -0
- package/src/features/spline/splineUtils.js +218 -0
- package/src/features/sweep/SweepFeature.js +110 -0
- package/src/features/transform/TransformFeature.js +152 -0
- package/src/features/tube/TubeFeature.js +635 -0
- package/src/fs.proxy.js +625 -0
- package/src/idbStorage.js +254 -0
- package/src/index.js +12 -0
- package/src/main.js +15 -0
- package/src/metadataManager.js +64 -0
- package/src/path.proxy.js +277 -0
- package/src/plugins/ghLoader.worker.js +151 -0
- package/src/plugins/pluginManager.js +286 -0
- package/src/pmi/PMIViewsManager.js +134 -0
- package/src/services/componentLibrary.js +198 -0
- package/src/tests/ConsoleCapture.js +189 -0
- package/src/tests/S7-diagnostics-2025-12-23T18-37-23-570Z.json +630 -0
- package/src/tests/browserTests.js +597 -0
- package/src/tests/debugBoolean.js +225 -0
- package/src/tests/partFiles/badBoolean.json +957 -0
- package/src/tests/partFiles/extrudeTest.json +88 -0
- package/src/tests/partFiles/filletFail.json +58 -0
- package/src/tests/partFiles/import_TEst.part.part.json +646 -0
- package/src/tests/partFiles/sheetMetalHem.BREP.json +734 -0
- package/src/tests/test_boolean_subtract.js +27 -0
- package/src/tests/test_chamfer.js +17 -0
- package/src/tests/test_extrudeFace.js +24 -0
- package/src/tests/test_fillet.js +17 -0
- package/src/tests/test_fillet_nonClosed.js +45 -0
- package/src/tests/test_filletsMoreDifficult.js +46 -0
- package/src/tests/test_history_features_basic.js +149 -0
- package/src/tests/test_hole.js +282 -0
- package/src/tests/test_mirror.js +16 -0
- package/src/tests/test_offsetShellGrouping.js +85 -0
- package/src/tests/test_plane.js +4 -0
- package/src/tests/test_primitiveCone.js +11 -0
- package/src/tests/test_primitiveCube.js +7 -0
- package/src/tests/test_primitiveCylinder.js +8 -0
- package/src/tests/test_primitivePyramid.js +9 -0
- package/src/tests/test_primitiveSphere.js +17 -0
- package/src/tests/test_primitiveTorus.js +21 -0
- package/src/tests/test_pushFace.js +126 -0
- package/src/tests/test_sheetMetalContourFlange.js +125 -0
- package/src/tests/test_sheetMetal_features.js +80 -0
- package/src/tests/test_sketch_openLoop.js +45 -0
- package/src/tests/test_solidMetrics.js +58 -0
- package/src/tests/test_stlLoader.js +1889 -0
- package/src/tests/test_sweepFace.js +55 -0
- package/src/tests/test_tube.js +45 -0
- package/src/tests/test_tube_closedLoop.js +67 -0
- package/src/tests/tests.js +493 -0
- package/src/tools/assemblyConstraintDialogCapturePage.js +56 -0
- package/src/tools/dialogCapturePageFactory.js +227 -0
- package/src/tools/featureDialogCapturePage.js +47 -0
- package/src/tools/pmiAnnotationDialogCapturePage.js +60 -0
- package/src/utils/axisHelpers.js +99 -0
- package/src/utils/deepClone.js +69 -0
- package/src/utils/geometryTolerance.js +37 -0
- package/src/utils/normalizeTypeString.js +8 -0
- package/src/utils/xformMath.js +51 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/* idbStorage.js
|
|
2
|
+
Primary IndexedDB-backed app storage with a localStorage-like API.
|
|
3
|
+
- Synchronous reads via in-memory cache
|
|
4
|
+
- Async persistence to IndexedDB
|
|
5
|
+
- Same-tab + optional cross-tab change events
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const STORAGE_DB_NAME = '__LS_SHIM_DB__';
|
|
9
|
+
const STORE_NAME = 'kv';
|
|
10
|
+
const DB_VERSION = 1;
|
|
11
|
+
const BC_NAME = '__BREP_STORAGE_BC__';
|
|
12
|
+
|
|
13
|
+
const hasIndexedDB = typeof indexedDB !== 'undefined' && !!indexedDB.open;
|
|
14
|
+
|
|
15
|
+
function toStringValue(v) {
|
|
16
|
+
// Match Web Storage semantics: everything is coerced to string
|
|
17
|
+
return v === undefined || v === null ? String(v) : String(v);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function tryDispatchStorageEvent(storage, { key, oldValue, newValue }) {
|
|
21
|
+
try {
|
|
22
|
+
if (typeof window !== 'undefined') {
|
|
23
|
+
let ev;
|
|
24
|
+
try {
|
|
25
|
+
ev = new StorageEvent('storage', {
|
|
26
|
+
key,
|
|
27
|
+
oldValue,
|
|
28
|
+
newValue,
|
|
29
|
+
url: window.location.href,
|
|
30
|
+
storageArea: storage,
|
|
31
|
+
});
|
|
32
|
+
} catch {
|
|
33
|
+
ev = new CustomEvent('storage', { detail: { key, oldValue, newValue } });
|
|
34
|
+
}
|
|
35
|
+
window.dispatchEvent(ev);
|
|
36
|
+
}
|
|
37
|
+
} catch {}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function promisifyRequest(req) {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
req.onsuccess = () => resolve(req.result);
|
|
43
|
+
req.onerror = () => reject(req.error || new Error('IDB request failed'));
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function openDB() {
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
const openReq = indexedDB.open(STORAGE_DB_NAME, DB_VERSION);
|
|
50
|
+
openReq.onupgradeneeded = () => {
|
|
51
|
+
const db = openReq.result;
|
|
52
|
+
if (!db.objectStoreNames.contains(STORE_NAME)) {
|
|
53
|
+
db.createObjectStore(STORE_NAME, { keyPath: 'key' });
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
openReq.onsuccess = () => resolve(openReq.result);
|
|
57
|
+
openReq.onerror = () => reject(openReq.error || new Error('Failed to open storage DB'));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function unwrapStoredValue(value) {
|
|
62
|
+
if (value && typeof value === 'object' && 'value' in value) return value.value;
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function idbGetAll(db) {
|
|
67
|
+
const tx = db.transaction([STORE_NAME], 'readonly');
|
|
68
|
+
const store = tx.objectStore(STORE_NAME);
|
|
69
|
+
if (store.getAll && store.getAllKeys) {
|
|
70
|
+
const [items, keys] = await Promise.all([promisifyRequest(store.getAll()), promisifyRequest(store.getAllKeys())]);
|
|
71
|
+
const out = new Map();
|
|
72
|
+
for (let i = 0; i < keys.length; i++) {
|
|
73
|
+
out.set(String(keys[i]), unwrapStoredValue(items[i]));
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
const out = new Map();
|
|
79
|
+
const req = store.openCursor();
|
|
80
|
+
req.onsuccess = (e) => {
|
|
81
|
+
const cursor = e.target.result;
|
|
82
|
+
if (cursor) {
|
|
83
|
+
out.set(String(cursor.key), unwrapStoredValue(cursor.value));
|
|
84
|
+
cursor.continue();
|
|
85
|
+
} else {
|
|
86
|
+
resolve(out);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
req.onerror = () => reject(req.error || new Error('Cursor failed'));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function idbPut(db, key, value) {
|
|
94
|
+
const tx = db.transaction([STORE_NAME], 'readwrite');
|
|
95
|
+
const store = tx.objectStore(STORE_NAME);
|
|
96
|
+
if (store.keyPath) {
|
|
97
|
+
store.put({ key, value });
|
|
98
|
+
} else {
|
|
99
|
+
store.put(value, key);
|
|
100
|
+
}
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
tx.oncomplete = () => resolve();
|
|
103
|
+
tx.onerror = () => reject(tx.error || new Error('IDB put failed'));
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function idbDelete(db, key) {
|
|
108
|
+
const tx = db.transaction([STORE_NAME], 'readwrite');
|
|
109
|
+
tx.objectStore(STORE_NAME).delete(key);
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
tx.oncomplete = () => resolve();
|
|
112
|
+
tx.onerror = () => reject(tx.error || new Error('IDB delete failed'));
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function idbClear(db) {
|
|
117
|
+
const tx = db.transaction([STORE_NAME], 'readwrite');
|
|
118
|
+
tx.objectStore(STORE_NAME).clear();
|
|
119
|
+
return new Promise((resolve, reject) => {
|
|
120
|
+
tx.oncomplete = () => resolve();
|
|
121
|
+
tx.onerror = () => reject(tx.error || new Error('IDB clear failed'));
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
class IdbStorage {
|
|
126
|
+
constructor() {
|
|
127
|
+
this._cache = new Map();
|
|
128
|
+
this._ready = false;
|
|
129
|
+
this._dbPromise = null;
|
|
130
|
+
this._bc = null;
|
|
131
|
+
this._idbEnabled = hasIndexedDB;
|
|
132
|
+
this._init();
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async _init() {
|
|
136
|
+
if (!this._idbEnabled) {
|
|
137
|
+
this._ready = true;
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
this._dbPromise = openDB();
|
|
143
|
+
const db = await this._dbPromise;
|
|
144
|
+
const idbMap = await idbGetAll(db);
|
|
145
|
+
idbMap.forEach((v, k) => this._cache.set(k, toStringValue(v)));
|
|
146
|
+
this._setupBroadcast();
|
|
147
|
+
} catch (err) {
|
|
148
|
+
console.warn('[idb-storage] IndexedDB unavailable; using in-memory storage only.', err);
|
|
149
|
+
this._idbEnabled = false;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
this._ready = true;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
_setupBroadcast() {
|
|
156
|
+
try {
|
|
157
|
+
if (typeof BroadcastChannel !== 'undefined') {
|
|
158
|
+
this._bc = new BroadcastChannel(BC_NAME);
|
|
159
|
+
this._bc.onmessage = (ev) => {
|
|
160
|
+
const { type, key, newValue, oldValue } = ev.data || {};
|
|
161
|
+
if (type === 'set') {
|
|
162
|
+
const prev = this._cache.get(key) ?? null;
|
|
163
|
+
const next = toStringValue(newValue);
|
|
164
|
+
this._cache.set(key, next);
|
|
165
|
+
tryDispatchStorageEvent(this, { key, oldValue: prev, newValue: next });
|
|
166
|
+
} else if (type === 'remove') {
|
|
167
|
+
const prev = this._cache.get(key) ?? null;
|
|
168
|
+
this._cache.delete(key);
|
|
169
|
+
tryDispatchStorageEvent(this, { key, oldValue: prev, newValue: null });
|
|
170
|
+
} else if (type === 'clear') {
|
|
171
|
+
if (this._cache.size) {
|
|
172
|
+
this._cache.clear();
|
|
173
|
+
tryDispatchStorageEvent(this, { key: null, oldValue: null, newValue: null });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
} catch {}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
get length() {
|
|
182
|
+
return this._cache.size;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
key(n) {
|
|
186
|
+
if (typeof n !== 'number' || n < 0 || n >= this._cache.size) return null;
|
|
187
|
+
return Array.from(this._cache.keys())[n] ?? null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
getItem(key) {
|
|
191
|
+
const k = toStringValue(key);
|
|
192
|
+
const v = this._cache.get(k);
|
|
193
|
+
return v === undefined ? null : v;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
setItem(key, value) {
|
|
197
|
+
const k = toStringValue(key);
|
|
198
|
+
const v = toStringValue(value);
|
|
199
|
+
const oldValue = this._cache.get(k) ?? null;
|
|
200
|
+
this._cache.set(k, v);
|
|
201
|
+
|
|
202
|
+
if (this._idbEnabled) {
|
|
203
|
+
this._dbPromise?.then((db) => idbPut(db, k, v)).catch((e) => {
|
|
204
|
+
console.warn('[idb-storage] setItem persist failed:', e);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
tryDispatchStorageEvent(this, { key: k, oldValue, newValue: v });
|
|
209
|
+
try { this._bc?.postMessage({ type: 'set', key: k, newValue: v, oldValue }); } catch {}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
removeItem(key) {
|
|
213
|
+
const k = toStringValue(key);
|
|
214
|
+
const oldValue = this._cache.get(k) ?? null;
|
|
215
|
+
this._cache.delete(k);
|
|
216
|
+
|
|
217
|
+
if (this._idbEnabled) {
|
|
218
|
+
this._dbPromise?.then((db) => idbDelete(db, k)).catch((e) => {
|
|
219
|
+
console.warn('[idb-storage] removeItem persist failed:', e);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
tryDispatchStorageEvent(this, { key: k, oldValue, newValue: null });
|
|
224
|
+
try { this._bc?.postMessage({ type: 'remove', key: k, oldValue, newValue: null }); } catch {}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
clear() {
|
|
228
|
+
if (this._cache.size === 0) return;
|
|
229
|
+
this._cache.clear();
|
|
230
|
+
|
|
231
|
+
if (this._idbEnabled) {
|
|
232
|
+
this._dbPromise?.then((db) => idbClear(db)).catch((e) => {
|
|
233
|
+
console.warn('[idb-storage] clear persist failed:', e);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
tryDispatchStorageEvent(this, { key: null, oldValue: null, newValue: null });
|
|
238
|
+
try { this._bc?.postMessage({ type: 'clear' }); } catch {}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
*keys() {
|
|
242
|
+
yield* this._cache.keys();
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
ready() {
|
|
246
|
+
if (!this._idbEnabled) return Promise.resolve();
|
|
247
|
+
if (this._ready) return Promise.resolve();
|
|
248
|
+
return this._dbPromise.then(() => undefined).catch(() => undefined);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const localStorage = new IdbStorage();
|
|
253
|
+
|
|
254
|
+
export { localStorage };
|
package/src/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Public entry point for the BREP kernel package
|
|
2
|
+
// Expose the core BREP kernel and part history classes
|
|
3
|
+
|
|
4
|
+
export { BREP } from './BREP/BREP.js';
|
|
5
|
+
|
|
6
|
+
// Part history API
|
|
7
|
+
export { PartHistory, extractDefaultValues } from './PartHistory.js';
|
|
8
|
+
|
|
9
|
+
// Assembly constraints history and registry (useful when working with PartHistory)
|
|
10
|
+
export { AssemblyConstraintHistory } from './assemblyConstraints/AssemblyConstraintHistory.js';
|
|
11
|
+
export { AssemblyConstraintRegistry } from './assemblyConstraints/AssemblyConstraintRegistry.js';
|
|
12
|
+
|
package/src/main.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// App entry: create the main Viewer and expose as window.env
|
|
2
|
+
import { Viewer } from './UI/viewer.js';
|
|
3
|
+
|
|
4
|
+
const containerEl = document.getElementById('viewport');
|
|
5
|
+
const sidebarEl = document.getElementById('sidebar');
|
|
6
|
+
|
|
7
|
+
if (!containerEl) throw new Error('Missing #viewport element');
|
|
8
|
+
|
|
9
|
+
const viewer = new Viewer({ container: containerEl, sidebar: sidebarEl });
|
|
10
|
+
|
|
11
|
+
try { window.env = viewer; } catch {}
|
|
12
|
+
|
|
13
|
+
// Viewer registers default toolbar buttons internally; the "tests" button
|
|
14
|
+
// loads the Browser Testing UI on demand.
|
|
15
|
+
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// this will be used to store information against items in the scene that could be used to capture things like
|
|
2
|
+
// material assignments, layer assignments, grouping information, etc.
|
|
3
|
+
// For example if there is a particular type of weld that needs to be applied allong a particular edge, that information
|
|
4
|
+
// could be stored here
|
|
5
|
+
// This is a simple key/value store, where the key is the name of the object in the scene, and the value is an object
|
|
6
|
+
// containing key/value pairs of metadata. There is also support for inheritance, so that if an object has an attribute
|
|
7
|
+
// called "inheritsFrom", it will look up the metadata for that object and merge it with its own metadata, giving precedence
|
|
8
|
+
// to its own metadata in case of inheritance giving precedence to its own metadata in case of conflicts.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
export class MetadataManager {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.metadata = {};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getMetadata(targetObjectName) {
|
|
17
|
+
// look up the metadata for the given object name
|
|
18
|
+
const metadataForTarget = this.metadata[targetObjectName] || {};
|
|
19
|
+
|
|
20
|
+
// check if there is an attribute called inheritsFrom
|
|
21
|
+
if (metadataForTarget.inheritsFrom) {
|
|
22
|
+
const parentMetadata = this.getMetadata(metadataForTarget.inheritsFrom);
|
|
23
|
+
// merge parent metadata with current metadata, giving precedence to current metadata
|
|
24
|
+
return { ...parentMetadata, ...metadataForTarget };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return metadataForTarget;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
getOwnMetadata(targetObjectName) {
|
|
31
|
+
// shallow clone to avoid exposing internal references
|
|
32
|
+
const raw = this.metadata[targetObjectName];
|
|
33
|
+
return raw ? { ...raw } : {};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
setMetadata(targetObjectName, keyName, value) {
|
|
37
|
+
// grab the current metadata for the target object, or create a new object if it doesn't exist
|
|
38
|
+
if (!this.metadata[targetObjectName]) {
|
|
39
|
+
this.metadata[targetObjectName] = {};
|
|
40
|
+
}
|
|
41
|
+
this.metadata[targetObjectName][keyName] = value;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
setMetadataObject(targetObjectName, metadataObject) {
|
|
45
|
+
if (metadataObject && Object.keys(metadataObject).length > 0) {
|
|
46
|
+
this.metadata[targetObjectName] = { ...metadataObject };
|
|
47
|
+
} else {
|
|
48
|
+
delete this.metadata[targetObjectName];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
deleteMetadataKey(targetObjectName, keyName) {
|
|
53
|
+
const entry = this.metadata[targetObjectName];
|
|
54
|
+
if (!entry) return;
|
|
55
|
+
delete entry[keyName];
|
|
56
|
+
if (Object.keys(entry).length === 0) {
|
|
57
|
+
delete this.metadata[targetObjectName];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
clearMetadata(targetObjectName) {
|
|
62
|
+
delete this.metadata[targetObjectName];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
// universal-path.js (ESM, no dependencies, ES6)
|
|
2
|
+
// POSIX-only path replacement that works in Node and the browser.
|
|
3
|
+
// Node: proxies to node:path.posix when possible (CJS); falls back to shim in ESM.
|
|
4
|
+
// Browser: minimal POSIX path implementation compatible with Node's API.
|
|
5
|
+
|
|
6
|
+
const isNode =
|
|
7
|
+
typeof process !== 'undefined' &&
|
|
8
|
+
process.versions &&
|
|
9
|
+
process.versions.node &&
|
|
10
|
+
typeof window === 'undefined';
|
|
11
|
+
|
|
12
|
+
// -------------------- Node path passthrough (POSIX) --------------------
|
|
13
|
+
let nodePosix = null;
|
|
14
|
+
async function loadNodePathIfNeeded() {
|
|
15
|
+
if (!isNode) return;
|
|
16
|
+
if (!nodePosix) {
|
|
17
|
+
const mod = await import('node:path');
|
|
18
|
+
nodePosix = (mod.default ?? mod).posix;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// IMPORTANT: Never assume `require` exists in ESM.
|
|
23
|
+
// In CJS we use `require('node:path')`; in ESM we fall back to the shim.
|
|
24
|
+
function getNodePosixSync() {
|
|
25
|
+
if (!isNode) return browserPosix;
|
|
26
|
+
|
|
27
|
+
// CJS: require is available
|
|
28
|
+
/* eslint-disable no-undef */
|
|
29
|
+
if (typeof require === 'function') {
|
|
30
|
+
const mod = require('node:path');
|
|
31
|
+
return (mod.default ?? mod).posix;
|
|
32
|
+
}
|
|
33
|
+
/* eslint-enable no-undef */
|
|
34
|
+
|
|
35
|
+
// Some runtimes expose module.createRequire in CJS-like contexts
|
|
36
|
+
if (typeof module !== 'undefined' && module && typeof module.createRequire === 'function') {
|
|
37
|
+
const req = module.createRequire(typeof __filename !== 'undefined' ? __filename : process.cwd());
|
|
38
|
+
const mod = req('node:path');
|
|
39
|
+
return (mod.default ?? mod).posix;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Pure ESM: no sync loader available - use the shim (POSIX semantics).
|
|
43
|
+
return browserPosix;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// -------------------- Browser POSIX implementation --------------------
|
|
47
|
+
const SEP = '/';
|
|
48
|
+
const DELIM = ':';
|
|
49
|
+
|
|
50
|
+
function _assertString(p) {
|
|
51
|
+
if (typeof p !== 'string') throw new TypeError('Path must be a string');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function _isAbsolute(p) {
|
|
55
|
+
return p.startsWith(SEP);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function _normalizeString(path, allowAboveRoot) {
|
|
59
|
+
const parts = path.split('/');
|
|
60
|
+
const newParts = [];
|
|
61
|
+
for (let i = 0; i < parts.length; i++) {
|
|
62
|
+
const part = parts[i];
|
|
63
|
+
if (!part || part === '.') continue;
|
|
64
|
+
if (part === '..') {
|
|
65
|
+
if (newParts.length && newParts[newParts.length - 1] !== '..') {
|
|
66
|
+
newParts.pop();
|
|
67
|
+
} else if (allowAboveRoot) {
|
|
68
|
+
newParts.push('..');
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
newParts.push(part);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return newParts.join('/');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function _normalize(path) {
|
|
78
|
+
_assertString(path);
|
|
79
|
+
if (path === '') return '.';
|
|
80
|
+
const isAbs = _isAbsolute(path);
|
|
81
|
+
const trailingSlash = path.endsWith('/');
|
|
82
|
+
let res = _normalizeString(path, !isAbs);
|
|
83
|
+
if (res === '' && !isAbs) res = '.';
|
|
84
|
+
if (res !== '' && trailingSlash) res += '/';
|
|
85
|
+
return (isAbs ? '/' : '') + res;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function _join(...paths) {
|
|
89
|
+
let joined = '';
|
|
90
|
+
for (let i = 0; i < paths.length; i++) {
|
|
91
|
+
const segment = paths[i];
|
|
92
|
+
_assertString(segment);
|
|
93
|
+
if (segment !== '') {
|
|
94
|
+
if (joined === '') joined = segment;
|
|
95
|
+
else joined += '/' + segment;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return _normalize(joined);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function _resolve(...paths) {
|
|
102
|
+
// For browser & ESM fallback: base is '/', to match VFS root
|
|
103
|
+
let resolvedPath = '';
|
|
104
|
+
let resolvedAbsolute = false;
|
|
105
|
+
|
|
106
|
+
for (let i = paths.length - 1; i >= 0; i--) {
|
|
107
|
+
const p = paths[i];
|
|
108
|
+
if (p === undefined) continue;
|
|
109
|
+
_assertString(p);
|
|
110
|
+
if (p === '') continue;
|
|
111
|
+
resolvedPath = p + '/' + resolvedPath;
|
|
112
|
+
if (p.startsWith('/')) {
|
|
113
|
+
resolvedAbsolute = true;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (!resolvedAbsolute) {
|
|
119
|
+
resolvedPath = '/' + resolvedPath;
|
|
120
|
+
resolvedAbsolute = true;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const normalized = _normalizeString(resolvedPath, false);
|
|
124
|
+
return (resolvedAbsolute ? '/' : '') + normalized || (resolvedAbsolute ? '/' : '.');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function _relative(from, to) {
|
|
128
|
+
_assertString(from); _assertString(to);
|
|
129
|
+
if (from === to) return '';
|
|
130
|
+
from = _resolve(from);
|
|
131
|
+
to = _resolve(to);
|
|
132
|
+
|
|
133
|
+
if (from === to) return '';
|
|
134
|
+
|
|
135
|
+
const fromParts = from.slice(1).split('/').filter(Boolean);
|
|
136
|
+
const toParts = to.slice(1).split('/').filter(Boolean);
|
|
137
|
+
|
|
138
|
+
let i = 0;
|
|
139
|
+
const len = Math.min(fromParts.length, toParts.length);
|
|
140
|
+
for (; i < len; i++) {
|
|
141
|
+
if (fromParts[i] !== toParts[i]) break;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const up = fromParts.slice(i).map(() => '..');
|
|
145
|
+
const down = toParts.slice(i);
|
|
146
|
+
const rel = up.concat(down).join('/');
|
|
147
|
+
return rel || '';
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function _dirname(path) {
|
|
151
|
+
_assertString(path);
|
|
152
|
+
if (path.length === 0) return '.';
|
|
153
|
+
const isAbs = _isAbsolute(path);
|
|
154
|
+
const end = path.endsWith('/') ? path.length - 1 : path.length;
|
|
155
|
+
let slashIndex = -1;
|
|
156
|
+
for (let i = end - 1; i >= 0; --i) {
|
|
157
|
+
if (path.charCodeAt(i) === 47) { slashIndex = i; break; }
|
|
158
|
+
}
|
|
159
|
+
if (slashIndex === -1) return isAbs ? '/' : '.';
|
|
160
|
+
if (isAbs && slashIndex === 0) return '/';
|
|
161
|
+
return path.slice(0, slashIndex);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function _basename(path, ext = '') {
|
|
165
|
+
_assertString(path);
|
|
166
|
+
if (ext !== undefined && typeof ext !== 'string') throw new TypeError('ext must be a string');
|
|
167
|
+
let end = path.length;
|
|
168
|
+
if (end === 0) return '';
|
|
169
|
+
while (end > 0 && path.charCodeAt(end - 1) === 47) end--;
|
|
170
|
+
if (end === 0) return '/';
|
|
171
|
+
|
|
172
|
+
let start = 0;
|
|
173
|
+
for (let i = end - 1; i >= 0; --i) {
|
|
174
|
+
if (path.charCodeAt(i) === 47) { start = i + 1; break; }
|
|
175
|
+
}
|
|
176
|
+
let base = path.slice(start, end);
|
|
177
|
+
if (ext && base.endsWith(ext) && ext !== '' && ext !== base) {
|
|
178
|
+
base = base.slice(0, base.length - ext.length);
|
|
179
|
+
}
|
|
180
|
+
return base;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function _extname(path) {
|
|
184
|
+
_assertString(path);
|
|
185
|
+
let startDot = -1;
|
|
186
|
+
let startPart = 0;
|
|
187
|
+
let end = -1;
|
|
188
|
+
let preDotState = 0;
|
|
189
|
+
for (let i = path.length - 1; i >= 0; --i) {
|
|
190
|
+
const code = path.charCodeAt(i);
|
|
191
|
+
if (code === 47) {
|
|
192
|
+
if (end !== -1) { startPart = i + 1; break; }
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (end === -1) end = i + 1;
|
|
196
|
+
if (code === 46) {
|
|
197
|
+
if (startDot === -1) startDot = i;
|
|
198
|
+
else if (preDotState !== 1) preDotState = 1;
|
|
199
|
+
} else if (startDot !== -1) {
|
|
200
|
+
preDotState = -1;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (startDot === -1 || end === -1 || preDotState === 0 || (startDot === startPart)) return '';
|
|
204
|
+
return path.slice(startDot, end);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function _parse(path) {
|
|
208
|
+
_assertString(path);
|
|
209
|
+
const root = _isAbsolute(path) ? '/' : '';
|
|
210
|
+
const dir = _dirname(path);
|
|
211
|
+
const base = _basename(path);
|
|
212
|
+
const ext = _extname(base);
|
|
213
|
+
const name = ext ? base.slice(0, base.length - ext.length) : base;
|
|
214
|
+
return { root, dir, base, ext, name };
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function _format(obj) {
|
|
218
|
+
const dir = obj.dir || obj.root || '';
|
|
219
|
+
const base = obj.base || (obj.name || '') + (obj.ext || '');
|
|
220
|
+
if (!dir) return base || '.';
|
|
221
|
+
if (dir.endsWith('/')) return dir + base;
|
|
222
|
+
return dir + '/' + base;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function _toNamespacedPath(p) { return p; }
|
|
226
|
+
|
|
227
|
+
// The browser POSIX object (also used as Node ESM fallback)
|
|
228
|
+
const browserPosix = {
|
|
229
|
+
sep: SEP,
|
|
230
|
+
delimiter: DELIM,
|
|
231
|
+
normalize: _normalize,
|
|
232
|
+
join: _join,
|
|
233
|
+
resolve: _resolve,
|
|
234
|
+
isAbsolute: _isAbsolute,
|
|
235
|
+
relative: _relative,
|
|
236
|
+
dirname: _dirname,
|
|
237
|
+
basename: _basename,
|
|
238
|
+
extname: _extname,
|
|
239
|
+
parse: _parse,
|
|
240
|
+
format: _format,
|
|
241
|
+
toNamespacedPath: _toNamespacedPath,
|
|
242
|
+
posix: null, // set below
|
|
243
|
+
win32: null, // shimbed
|
|
244
|
+
};
|
|
245
|
+
browserPosix.posix = browserPosix;
|
|
246
|
+
|
|
247
|
+
// -------------------- Unified export --------------------
|
|
248
|
+
const universalPosix = {
|
|
249
|
+
get sep() { return isNode ? getNodePosixSync().sep : browserPosix.sep; },
|
|
250
|
+
get delimiter() { return isNode ? getNodePosixSync().delimiter : browserPosix.delimiter; },
|
|
251
|
+
|
|
252
|
+
normalize: (...args) => isNode ? getNodePosixSync().normalize(...args) : browserPosix.normalize(...args),
|
|
253
|
+
join: (...args) => isNode ? getNodePosixSync().join(...args) : browserPosix.join(...args),
|
|
254
|
+
resolve: (...args) => isNode ? getNodePosixSync().resolve(...args) : browserPosix.resolve(...args),
|
|
255
|
+
isAbsolute: (...args) => isNode ? getNodePosixSync().isAbsolute(...args) : browserPosix.isAbsolute(...args),
|
|
256
|
+
relative: (...args) => isNode ? getNodePosixSync().relative(...args) : browserPosix.relative(...args),
|
|
257
|
+
dirname: (...args) => isNode ? getNodePosixSync().dirname(...args) : browserPosix.dirname(...args),
|
|
258
|
+
basename: (...args) => isNode ? getNodePosixSync().basename(...args) : browserPosix.basename(...args),
|
|
259
|
+
extname: (...args) => isNode ? getNodePosixSync().extname(...args) : browserPosix.extname(...args),
|
|
260
|
+
parse: (...args) => isNode ? getNodePosixSync().parse(...args) : browserPosix.parse(...args),
|
|
261
|
+
format: (...args) => isNode ? getNodePosixSync().format(...args) : browserPosix.format(...args),
|
|
262
|
+
toNamespacedPath: (...args) => isNode ? getNodePosixSync().toNamespacedPath(...args) : browserPosix.toNamespacedPath(...args),
|
|
263
|
+
|
|
264
|
+
posix: null,
|
|
265
|
+
win32: null,
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
universalPosix.posix = universalPosix;
|
|
269
|
+
const win32Shim = new Proxy({}, {
|
|
270
|
+
get() {
|
|
271
|
+
throw new Error("POSIX-only path module: use the named export `posix` with your VFS.");
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
universalPosix.win32 = win32Shim;
|
|
275
|
+
export const posix = universalPosix;
|
|
276
|
+
export const win32 = win32Shim;
|
|
277
|
+
export const ensureNodePathLoaded = loadNodePathIfNeeded;
|