@peter.prib/renderengine 0.0.0-stage → 0.2.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 +21 -0
- package/README.md +203 -2
- package/REFERENCE.md +2198 -0
- package/dist/renderengine-workspace.umd.js +46905 -0
- package/dist/renderengine.umd.js +42223 -0
- package/examples/archimate.html +66 -0
- package/examples/diagram-editor.html +51 -0
- package/package.json +65 -4
- package/src/BaseRenderer.js +57 -0
- package/src/CanvasRenderer.js +194 -0
- package/src/Mat4.js +111 -0
- package/src/OrbitCamera.js +57 -0
- package/src/RendererFactory.js +50 -0
- package/src/SVGRenderer.js +439 -0
- package/src/archimate.js +723 -0
- package/src/archimateArchiFormat.js +1693 -0
- package/src/archimateArchiTypes.js +72 -0
- package/src/archimateArchive.js +140 -0
- package/src/archimateCSV.js +127 -0
- package/src/archimateDrawio.js +182 -0
- package/src/archimateExchangeFormat.js +546 -0
- package/src/archimateRelationshipTable.js +93 -0
- package/src/archimateSpecializations.js +161 -0
- package/src/chartCatalog.js +589 -0
- package/src/charting/ArchimateDiagramEditor.js +1624 -0
- package/src/charting/ArchimateSpecializationSelector.js +134 -0
- package/src/charting/Axis.js +68 -0
- package/src/charting/CameraSeeder.js +30 -0
- package/src/charting/CatalogDialog.js +92 -0
- package/src/charting/Chart.js +37 -0
- package/src/charting/Chart3D.js +99 -0
- package/src/charting/ChartBox.js +80 -0
- package/src/charting/ChartData.js +27 -0
- package/src/charting/ChartRegistry.js +76 -0
- package/src/charting/CheckboxTreeSelector.js +304 -0
- package/src/charting/ColorField.js +107 -0
- package/src/charting/ColorPalette.js +88 -0
- package/src/charting/CommandHistory.js +176 -0
- package/src/charting/DataFilter.js +52 -0
- package/src/charting/Diagram.js +36 -0
- package/src/charting/Diagram3D.js +29 -0
- package/src/charting/DiagramClipboard.js +31 -0
- package/src/charting/DiagramEditor.js +3330 -0
- package/src/charting/DiagramEditorCommand.js +110 -0
- package/src/charting/DiagramEditorCommands.js +237 -0
- package/src/charting/DiagramEditorEdgeCommands.js +142 -0
- package/src/charting/DiagramEditorState.js +98 -0
- package/src/charting/DiagramRegistry.js +86 -0
- package/src/charting/DiagramTypeRegistry.js +326 -0
- package/src/charting/DiagramViewPropertiesDialog.js +46 -0
- package/src/charting/Edge.js +113 -0
- package/src/charting/ErrorBars.js +37 -0
- package/src/charting/FilterSystem.js +285 -0
- package/src/charting/FindReplaceDialog.js +139 -0
- package/src/charting/FormDialog.js +385 -0
- package/src/charting/Gauge.js +58 -0
- package/src/charting/Hierarchy.js +175 -0
- package/src/charting/HintPanel.js +86 -0
- package/src/charting/ImageSelector.js +148 -0
- package/src/charting/InteractionManager.js +725 -0
- package/src/charting/Legend.js +58 -0
- package/src/charting/MenuBar.js +62 -0
- package/src/charting/ModelFileFormat.js +115 -0
- package/src/charting/OrbitControls.js +77 -0
- package/src/charting/Palette.js +119 -0
- package/src/charting/PopupMenu.js +117 -0
- package/src/charting/PropertiesPanel.js +155 -0
- package/src/charting/PropertyListEditor.js +96 -0
- package/src/charting/PropertyLog.js +92 -0
- package/src/charting/SettingsCascade.js +93 -0
- package/src/charting/SettingsDialog.js +53 -0
- package/src/charting/SettingsManager.js +179 -0
- package/src/charting/SettingsViewPropertiesDialog.js +58 -0
- package/src/charting/ShapePaths.js +27 -0
- package/src/charting/Statistics.js +134 -0
- package/src/charting/TemplateCatalog.js +59 -0
- package/src/charting/TemplateLibrary.js +103 -0
- package/src/charting/TextStyle.js +168 -0
- package/src/charting/ViewFit.js +55 -0
- package/src/charting/ViewMenu.js +70 -0
- package/src/charting/ViewPropertiesDialog.js +77 -0
- package/src/charting/ViewTabStrip.js +81 -0
- package/src/charting/archimate/ArchiFileFormat.js +32 -0
- package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
- package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
- package/src/charting/archimate/ArchimateEdge.js +137 -0
- package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
- package/src/charting/archimate/ArchimatePalette.js +102 -0
- package/src/charting/archimate/CsvImportDialog.js +105 -0
- package/src/charting/archimate/CustomViewpoints.js +74 -0
- package/src/charting/archimate/DerivedEdge.js +29 -0
- package/src/charting/archimate/DrawioFileFormat.js +24 -0
- package/src/charting/archimate/ElementFilterRule.js +21 -0
- package/src/charting/archimate/ExchangeFileFormat.js +28 -0
- package/src/charting/archimate/ViewGroupTemplate.js +137 -0
- package/src/charting/archimate/ViewLineEdge.js +84 -0
- package/src/charting/archimate/ViewpointRule.js +45 -0
- package/src/charting/archimate/archimateFileFormats.js +12 -0
- package/src/charting/archimate/archimateNames.js +5 -0
- package/src/charting/archimate/csvMapping.js +122 -0
- package/src/charting/archimate/elementMenuItems.js +32 -0
- package/src/charting/archimate/elementProperties.js +146 -0
- package/src/charting/archimate/elementTypeChoices.js +7 -0
- package/src/charting/archimate/elementTypeGroups.js +19 -0
- package/src/charting/archimate/index.js +17 -0
- package/src/charting/archimate/specializationCatalogDialog.js +64 -0
- package/src/charting/archimate/typeGlyph.js +29 -0
- package/src/charting/arrangement/Arrangement.js +112 -0
- package/src/charting/arrangement/ArrangementCommand.js +29 -0
- package/src/charting/arrangement/BackgroundCommand.js +41 -0
- package/src/charting/arrangement/BackgroundGroup.js +18 -0
- package/src/charting/arrangement/GroupCommand.js +46 -0
- package/src/charting/arrangement/ItemGroup.js +62 -0
- package/src/charting/arrangement/LockCommand.js +32 -0
- package/src/charting/arrangement/UngroupCommand.js +27 -0
- package/src/charting/arrangement/alignment.js +88 -0
- package/src/charting/arrangement/arrangeMenuItems.js +25 -0
- package/src/charting/arrangement/index.js +11 -0
- package/src/charting/arrangement/layouts.js +233 -0
- package/src/charting/canvas/ArchiHint.js +78 -0
- package/src/charting/canvas/CanvasBoxKind.js +39 -0
- package/src/charting/canvas/CanvasPalette.js +49 -0
- package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
- package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
- package/src/charting/canvas/EditHintCommand.js +28 -0
- package/src/charting/canvas/canvasBoxKinds.js +27 -0
- package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
- package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
- package/src/charting/canvas/diagramBoxKinds.js +12 -0
- package/src/charting/canvas/hintMenuItems.js +49 -0
- package/src/charting/charts/ArcGauge.js +55 -0
- package/src/charting/charts/AreaChart.js +71 -0
- package/src/charting/charts/BarChart.js +80 -0
- package/src/charting/charts/BarChart3D.js +56 -0
- package/src/charting/charts/BarChart3DOrbit.js +53 -0
- package/src/charting/charts/BarChartBase.js +70 -0
- package/src/charting/charts/BarGauge.js +42 -0
- package/src/charting/charts/BoxPlotChart.js +41 -0
- package/src/charting/charts/BubbleChart.js +99 -0
- package/src/charting/charts/BubbleChart3D.js +78 -0
- package/src/charting/charts/BulletGauge.js +87 -0
- package/src/charting/charts/CalendarHeatmapChart.js +204 -0
- package/src/charting/charts/CandlestickChart.js +54 -0
- package/src/charting/charts/ChordDiagram.js +130 -0
- package/src/charting/charts/DensityChart.js +73 -0
- package/src/charting/charts/DialGauge.js +65 -0
- package/src/charting/charts/DonutChart.js +15 -0
- package/src/charting/charts/FunnelChart.js +47 -0
- package/src/charting/charts/GanttChart.js +201 -0
- package/src/charting/charts/GaugeChart.js +175 -0
- package/src/charting/charts/GeoMapChart.js +146 -0
- package/src/charting/charts/GroupedBarChart.js +88 -0
- package/src/charting/charts/GroupedDistributionChart.js +70 -0
- package/src/charting/charts/HeatmapChart.js +80 -0
- package/src/charting/charts/HierarchyChart.js +39 -0
- package/src/charting/charts/HistogramChart.js +45 -0
- package/src/charting/charts/KpiTile.js +72 -0
- package/src/charting/charts/LagPlotChart.js +41 -0
- package/src/charting/charts/LineChart.js +124 -0
- package/src/charting/charts/MultiRingGauge.js +54 -0
- package/src/charting/charts/OutlineChart.js +95 -0
- package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
- package/src/charting/charts/PieChart.js +56 -0
- package/src/charting/charts/PipeChart.js +88 -0
- package/src/charting/charts/PopulationPyramidChart.js +106 -0
- package/src/charting/charts/QQPlotChart.js +64 -0
- package/src/charting/charts/RadarChart.js +76 -0
- package/src/charting/charts/RadialBarChart.js +96 -0
- package/src/charting/charts/RingGauge.js +23 -0
- package/src/charting/charts/SankeyDiagram.js +174 -0
- package/src/charting/charts/ScatterChart.js +104 -0
- package/src/charting/charts/StackedAreaChart.js +15 -0
- package/src/charting/charts/StackedBarChart.js +33 -0
- package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
- package/src/charting/charts/StreamGraphChart.js +131 -0
- package/src/charting/charts/SunburstChart.js +57 -0
- package/src/charting/charts/ThermometerGauge.js +43 -0
- package/src/charting/charts/TreemapChart.js +54 -0
- package/src/charting/charts/ViolinChart.js +37 -0
- package/src/charting/charts/WaterfallChart.js +66 -0
- package/src/charting/charts/WordCloudChart.js +104 -0
- package/src/charting/diagramModel/AddViewCommand.js +33 -0
- package/src/charting/diagramModel/DiagramModel.js +39 -0
- package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
- package/src/charting/diagramModel/DiagramView.js +50 -0
- package/src/charting/diagramModel/ModelHistory.js +43 -0
- package/src/charting/diagramModel/ModelReport.js +153 -0
- package/src/charting/diagramModel/ModelSearch.js +223 -0
- package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
- package/src/charting/diagramModel/RenameViewCommand.js +21 -0
- package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
- package/src/charting/diagramModel/ViewSetChecker.js +34 -0
- package/src/charting/diagramModel/ViewSetModel.js +243 -0
- package/src/charting/diagramModel/index.js +6 -0
- package/src/charting/diagramModel/nameTransforms.js +29 -0
- package/src/charting/diagrams/ArchimateCommands.js +141 -0
- package/src/charting/diagrams/ArchimateDiagram.js +263 -0
- package/src/charting/diagrams/ArchimateModel.js +1155 -0
- package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
- package/src/charting/diagrams/ArchimateModelReport.js +128 -0
- package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
- package/src/charting/diagrams/ArchimateValidator.js +357 -0
- package/src/charting/diagrams/CanvasView.js +112 -0
- package/src/charting/diagrams/ContextMenu.js +37 -0
- package/src/charting/diagrams/DataModelDiagram.js +86 -0
- package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
- package/src/charting/diagrams/DerivedRelationships.js +102 -0
- package/src/charting/diagrams/EbnfDiagram.js +39 -0
- package/src/charting/diagrams/EdgeGeometry.js +553 -0
- package/src/charting/diagrams/EditViewItemCommand.js +128 -0
- package/src/charting/diagrams/ElementInstance.js +157 -0
- package/src/charting/diagrams/GraphDiagram.js +1340 -0
- package/src/charting/diagrams/GraphDiagram3D.js +152 -0
- package/src/charting/diagrams/GraphMetrics.js +81 -0
- package/src/charting/diagrams/GridOverlay.js +137 -0
- package/src/charting/diagrams/ImportRowsCommand.js +62 -0
- package/src/charting/diagrams/LabelHelper.js +108 -0
- package/src/charting/diagrams/MergeElementsCommand.js +101 -0
- package/src/charting/diagrams/NestInstanceCommand.js +34 -0
- package/src/charting/diagrams/NodeGeometry.js +158 -0
- package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
- package/src/charting/diagrams/RadialLayout.js +101 -0
- package/src/charting/diagrams/RelationshipInstance.js +93 -0
- package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
- package/src/charting/diagrams/RemoveLineCommand.js +27 -0
- package/src/charting/diagrams/ShowElementCommand.js +43 -0
- package/src/charting/diagrams/SvgCoordinate.js +17 -0
- package/src/charting/diagrams/SvgZoom.js +127 -0
- package/src/charting/diagrams/Tooltip.js +62 -0
- package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
- package/src/charting/diagrams/ViewObjectInstance.js +56 -0
- package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
- package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
- package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
- package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
- package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
- package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
- package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
- package/src/charting/diagrams/commands/GraphCommand.js +65 -0
- package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
- package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
- package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
- package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
- package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
- package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
- package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
- package/src/charting/diagrams/commands/index.js +17 -0
- package/src/charting/diagrams/duplicates.js +49 -0
- package/src/charting/diagrams/nesting.js +30 -0
- package/src/charting/diagrams/roadmap.js +77 -0
- package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
- package/src/charting/edgeMarkers/CircleMarker.js +13 -0
- package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
- package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
- package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
- package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
- package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
- package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
- package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
- package/src/charting/edgeMarkers/index.js +27 -0
- package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
- package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
- package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
- package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
- package/src/charting/edgeStyle/index.js +4 -0
- package/src/charting/emphasis/EmphasisRule.js +42 -0
- package/src/charting/emphasis/HighlightRule.js +24 -0
- package/src/charting/gauges/ArcTrack.js +51 -0
- package/src/charting/gauges/GaugeAnimation.js +51 -0
- package/src/charting/gauges/GaugeBands.js +48 -0
- package/src/charting/gauges/GaugeScale.js +87 -0
- package/src/charting/gauges/GaugeTrack.js +44 -0
- package/src/charting/gauges/GaugeValue.js +61 -0
- package/src/charting/gauges/HorizontalTrack.js +14 -0
- package/src/charting/gauges/LinearTrack.js +29 -0
- package/src/charting/gauges/Sparkline.js +42 -0
- package/src/charting/gauges/VerticalTrack.js +17 -0
- package/src/charting/glyphs/ArrowGlyph.js +21 -0
- package/src/charting/glyphs/BatteryGlyph.js +18 -0
- package/src/charting/glyphs/ChevronGlyph.js +18 -0
- package/src/charting/glyphs/CircleGlyph.js +15 -0
- package/src/charting/glyphs/CloudGlyph.js +19 -0
- package/src/charting/glyphs/ComponentGlyph.js +18 -0
- package/src/charting/glyphs/ConstraintGlyph.js +24 -0
- package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
- package/src/charting/glyphs/CubeGlyph.js +19 -0
- package/src/charting/glyphs/CylinderGlyph.js +19 -0
- package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
- package/src/charting/glyphs/DeviceGlyph.js +17 -0
- package/src/charting/glyphs/DiamondGlyph.js +17 -0
- package/src/charting/glyphs/DocumentGlyph.js +17 -0
- package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
- package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
- package/src/charting/glyphs/EllipseGlyph.js +18 -0
- package/src/charting/glyphs/FactoryGlyph.js +20 -0
- package/src/charting/glyphs/FlagGlyph.js +16 -0
- package/src/charting/glyphs/GapCircleGlyph.js +17 -0
- package/src/charting/glyphs/GearGlyph.js +37 -0
- package/src/charting/glyphs/Glyph.js +98 -0
- package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
- package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
- package/src/charting/glyphs/HexagonGlyph.js +28 -0
- package/src/charting/glyphs/IconGlyph.js +22 -0
- package/src/charting/glyphs/ImageGlyph.js +16 -0
- package/src/charting/glyphs/JunctionGlyph.js +17 -0
- package/src/charting/glyphs/LollipopGlyph.js +22 -0
- package/src/charting/glyphs/MagnifierGlyph.js +17 -0
- package/src/charting/glyphs/NoteGlyph.js +33 -0
- package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
- package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
- package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
- package/src/charting/glyphs/PersonGlyph.js +23 -0
- package/src/charting/glyphs/PillGlyph.js +23 -0
- package/src/charting/glyphs/PinGlyph.js +18 -0
- package/src/charting/glyphs/PrincipleGlyph.js +23 -0
- package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
- package/src/charting/glyphs/RectGlyph.js +15 -0
- package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
- package/src/charting/glyphs/StackGlyph.js +14 -0
- package/src/charting/glyphs/StepsGlyph.js +20 -0
- package/src/charting/glyphs/StickFigureGlyph.js +32 -0
- package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
- package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
- package/src/charting/glyphs/TargetGlyph.js +23 -0
- package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
- package/src/charting/glyphs/WheelGlyph.js +28 -0
- package/src/charting/glyphs/drawGlyph.js +28 -0
- package/src/charting/glyphs/glyphSvg.js +55 -0
- package/src/charting/glyphs/index.js +109 -0
- package/src/charting/modelTree/AnalysisPanel.js +159 -0
- package/src/charting/modelTree/DiagramTabs.js +217 -0
- package/src/charting/modelTree/ModelTree.js +164 -0
- package/src/charting/modelTree/ModelTreePanel.js +914 -0
- package/src/charting/modelTree/TreeBuilder.js +238 -0
- package/src/charting/modelTree/TreeModeRegistry.js +51 -0
- package/src/charting/modelTree/TreeViewMode.js +110 -0
- package/src/charting/modelTree/buildFilterTrees.js +138 -0
- package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
- package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
- package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
- package/src/charting/modelTree/treeLayers.js +11 -0
- package/src/charting/report/reportHtml.js +82 -0
- package/src/charting/report/reportViewer.js +118 -0
- package/src/charting/shapes/CircleShape.js +19 -0
- package/src/charting/shapes/PathShape.js +17 -0
- package/src/charting/shapes/RectShape.js +20 -0
- package/src/charting/shapes/Shape.js +20 -0
- package/src/charting/shapes/ShapeFactory.js +23 -0
- package/src/charting/storage/LocalJsonStore.js +43 -0
- package/src/charting/templates/ActorTemplate.js +36 -0
- package/src/charting/templates/BoxTemplate.js +27 -0
- package/src/charting/templates/CircleTemplate.js +18 -0
- package/src/charting/templates/ClassTemplate.js +20 -0
- package/src/charting/templates/CloudTemplate.js +43 -0
- package/src/charting/templates/ComponentTemplate.js +19 -0
- package/src/charting/templates/CylinderTemplate.js +30 -0
- package/src/charting/templates/DataStoreTemplate.js +16 -0
- package/src/charting/templates/DiamondTemplate.js +10 -0
- package/src/charting/templates/DocumentTemplate.js +32 -0
- package/src/charting/templates/EllipseTemplate.js +15 -0
- package/src/charting/templates/FinalStateTemplate.js +12 -0
- package/src/charting/templates/GlyphTemplate.js +47 -0
- package/src/charting/templates/HexagonTemplate.js +17 -0
- package/src/charting/templates/LifelineTemplate.js +20 -0
- package/src/charting/templates/ManualInputTemplate.js +12 -0
- package/src/charting/templates/NoteTemplate.js +23 -0
- package/src/charting/templates/OctagonTemplate.js +7 -0
- package/src/charting/templates/PackageTemplate.js +25 -0
- package/src/charting/templates/ParallelogramTemplate.js +11 -0
- package/src/charting/templates/PentagonTemplate.js +5 -0
- package/src/charting/templates/PolygonTemplate.js +18 -0
- package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
- package/src/charting/templates/RectangleTemplate.js +28 -0
- package/src/charting/templates/RegularPolygonTemplate.js +21 -0
- package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
- package/src/charting/templates/StadiumTemplate.js +8 -0
- package/src/charting/templates/StarTemplate.js +17 -0
- package/src/charting/templates/SwimlaneTemplate.js +18 -0
- package/src/charting/templates/Template.js +208 -0
- package/src/charting/templates/TrapezoidTemplate.js +11 -0
- package/src/charting/templates/TriangleTemplate.js +12 -0
- package/src/charting/templates/index.js +31 -0
- package/src/charting/templates/outline.js +59 -0
- package/src/charting/templates/svg.js +19 -0
- package/src/charting/textToShapes.js +61 -0
- package/src/charting/toolbar/ToolbarButton.js +38 -0
- package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
- package/src/charting/toolbar/ToolbarItem.js +19 -0
- package/src/charting/toolbar/ToolbarMenu.js +36 -0
- package/src/charting/toolbar/ToolbarSelect.js +38 -0
- package/src/charting/toolbar/ToolbarSeparator.js +7 -0
- package/src/charting/toolbar/ToolbarText.js +22 -0
- package/src/charting/toolbar/index.js +8 -0
- package/src/charting/toolbar/pickFile.js +14 -0
- package/src/charting/viewDecorations.js +85 -0
- package/src/charting/zOrder.js +57 -0
- package/src/csvTable.js +61 -0
- package/src/datamodel.js +122 -0
- package/src/datawindow/BoundedWindow.js +36 -0
- package/src/datawindow/FlatDataWindow.js +34 -0
- package/src/datawindow/GraphDataWindow.js +40 -0
- package/src/datawindow/GroupedSampleDataWindow.js +16 -0
- package/src/datawindow/SeriesDataWindow.js +42 -0
- package/src/datawindow/index.js +31 -0
- package/src/diagramCatalog.js +30 -0
- package/src/ebnfDiagram.js +57 -0
- package/src/ebnfParser.js +129 -0
- package/src/exportImage.js +233 -0
- package/src/index.js +2636 -0
- package/src/itIcons.js +84 -0
- package/src/kernelExpr.js +243 -0
- package/src/propertiesDialog.js +463 -0
- package/src/railroadDiagram.js +571 -0
- package/src/treeModeCatalog.js +16 -0
- package/src/workspace/ContextBus.js +79 -0
- package/src/workspace/EditorShell.js +67 -0
- package/src/workspace/Part.js +163 -0
- package/src/workspace/PartFactory.js +49 -0
- package/src/workspace/PartRegistry.js +86 -0
- package/src/workspace/Workspace.js +321 -0
- package/src/workspace/archimateServices.js +33 -0
- package/src/workspace/dom.js +120 -0
- package/src/workspace/index.js +75 -0
- package/src/workspace/layout/GridNode.js +280 -0
- package/src/workspace/layout/LayoutNode.js +89 -0
- package/src/workspace/layout/PartNode.js +77 -0
- package/src/workspace/layout/SplitNode.js +114 -0
- package/src/workspace/layout/TabsNode.js +191 -0
- package/src/workspace/layout/index.js +24 -0
- package/src/workspace/parts/AdapterPart.js +33 -0
- package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
- package/src/workspace/parts/ArchimateEditorPart.js +79 -0
- package/src/workspace/parts/ChartPart.js +115 -0
- package/src/workspace/parts/ContentPart.js +34 -0
- package/src/workspace/parts/DetailPart.js +46 -0
- package/src/workspace/parts/DiagramEditorPart.js +135 -0
- package/src/workspace/parts/EditorPart.js +388 -0
- package/src/workspace/parts/HtmlPart.js +25 -0
- package/src/workspace/parts/ListPart.js +57 -0
- package/src/workspace/parts/ModelFile.js +187 -0
- package/src/workspace/parts/ModelsPart.js +135 -0
- package/src/workspace/styles.js +258 -0
- package/src/workspace/themes.js +96 -0
- package/src/workspace/workArea.js +413 -0
- package/src/workspace/workAreaModel.js +197 -0
- package/src/workspace.js +16 -0
- package/src/zip/ZipArchive.js +160 -0
- package/src/zip/crc32.js +25 -0
- package/src/zip/inflate.js +159 -0
package/src/itIcons.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// Copyright 2026 Jaroslav Peter Prib, Purveyor of Excellence
|
|
2
|
+
/**
|
|
3
|
+
* IT / infrastructure icon and type extensions for ArchiMate diagrams.
|
|
4
|
+
*
|
|
5
|
+
* ArchiMate itself does not define element types for every IT artefact an
|
|
6
|
+
* enterprise architect actually draws — firewall, laptop, database table,
|
|
7
|
+
* container, and so on. This module provides a small, well-known catalog of
|
|
8
|
+
* such concepts so they can be used as custom types in `archimateDiagram`
|
|
9
|
+
* while still behaving like real ArchiMate elements: they resolve to a layer
|
|
10
|
+
* (almost always `technology`), an aspect (`active-structure` for devices and
|
|
11
|
+
* services, `passive-structure` for data/files), and an icon. They are NOT
|
|
12
|
+
* part of the official ArchiMate specification, so `ArchimateValidator` treats
|
|
13
|
+
* them as extended/custom types rather than standard ones.
|
|
14
|
+
*
|
|
15
|
+
* The registry is intentionally separate from `src/archimate.js` so the
|
|
16
|
+
* official catalog stays pure and spec-aligned; `ArchimateNotation` optionally
|
|
17
|
+
* merges these in when an `itIcons` flag is passed.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { ArchimateLayer, ArchimateNotation } from './archimate.js';
|
|
21
|
+
|
|
22
|
+
/** One IT/infrastructure element type — layer, aspect, icon, and an optional
|
|
23
|
+
* notation shape. Layer is usually 'technology'; aspect follows ArchiMate's
|
|
24
|
+
* own meaning (active-structure = performs/provides behavior, passive-structure
|
|
25
|
+
* = is acted upon). */
|
|
26
|
+
export class ITElementType {
|
|
27
|
+
constructor(name, layer, aspect, icon, notationShape, description) {
|
|
28
|
+
this.name = name;
|
|
29
|
+
this.layer = layer;
|
|
30
|
+
this.aspect = aspect;
|
|
31
|
+
this.icon = icon;
|
|
32
|
+
this.notationShape = notationShape;
|
|
33
|
+
this.description = description;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const IT_ELEMENT_TYPES = new Map();
|
|
38
|
+
const IT_ELEMENT_ROWS = [
|
|
39
|
+
// Active-structure devices and hardware
|
|
40
|
+
['firewall', 'technology', 'active-structure', '🧱', undefined, 'A network security device that monitors and filters incoming/outgoing network traffic.'],
|
|
41
|
+
['router', 'technology', 'active-structure', '🌐', undefined, 'A networking device that forwards data packets between computer networks.'],
|
|
42
|
+
['switch', 'technology', 'active-structure', '🔀', undefined, 'A networking device that connects devices together on a computer network.'],
|
|
43
|
+
['load-balancer', 'technology', 'active-structure', '⚖️', undefined, 'A device or service that distributes network traffic across multiple servers.'],
|
|
44
|
+
['laptop', 'technology', 'active-structure', '💻', undefined, 'A portable personal computer used by an end user.'],
|
|
45
|
+
['workstation', 'technology', 'active-structure', '🖥️', undefined, 'A high-performance personal computer used for technical or professional work.'],
|
|
46
|
+
['server', 'technology', 'active-structure', '🖥️', undefined, 'A computer or program that provides functionality to other computers or programs.'],
|
|
47
|
+
['mobile-device', 'technology', 'active-structure', '📱', undefined, 'A handheld computing device such as a smartphone.'],
|
|
48
|
+
['tablet', 'technology', 'active-structure', '📱', undefined, 'A portable touchscreen computing device.'],
|
|
49
|
+
['printer', 'technology', 'active-structure', '🖨️', undefined, 'A device that produces a hard copy of documents.'],
|
|
50
|
+
['iot-device', 'technology', 'active-structure', '📡', undefined, 'An Internet-of-Things device that connects and exchanges data over a network.'],
|
|
51
|
+
// Active-structure software/runtime
|
|
52
|
+
['container', 'technology', 'active-structure', '📦', undefined, 'A lightweight, standalone, executable package of software.'],
|
|
53
|
+
['pod', 'technology', 'active-structure', '🛞', undefined, 'A group of one or more containers in a Kubernetes cluster.'],
|
|
54
|
+
['virtual-machine', 'technology', 'active-structure', '💻', undefined, 'A software emulation of a physical computer.'],
|
|
55
|
+
['api-gateway', 'technology', 'active-structure', '🚪', undefined, 'A service that manages, routes, and secures API requests.'],
|
|
56
|
+
// Passive-structure data/files
|
|
57
|
+
['database', 'technology', 'passive-structure', '🗄️', undefined, 'A structured collection of data stored and accessed electronically.'],
|
|
58
|
+
['table', 'technology', 'passive-structure', '📊', undefined, 'A structured set of data held in a database, consisting of rows and columns.'],
|
|
59
|
+
['file', 'technology', 'passive-structure', '📄', undefined, 'A named collection of data stored on a computer system.'],
|
|
60
|
+
['folder', 'technology', 'passive-structure', '📁', undefined, 'A container for organising files.'],
|
|
61
|
+
['bucket', 'technology', 'passive-structure', '🪣', undefined, 'A cloud-storage container for objects such as files and backups.'],
|
|
62
|
+
['queue', 'technology', 'passive-structure', '📬', undefined, 'A temporary holding structure for messages or tasks waiting to be processed.'],
|
|
63
|
+
// Composite / other
|
|
64
|
+
['cloud-region', 'technology', 'active-structure', '☁️', undefined, 'A geographic area of a cloud provider that contains one or more data centres.'],
|
|
65
|
+
['datacentre', 'technology', 'active-structure', '🏢', undefined, 'A facility used to house computer systems and associated components.'],
|
|
66
|
+
['network', 'technology', 'active-structure', '📡', undefined, 'A group of interconnected computers and devices that can exchange data.'],
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
for (const [name, layerKey, aspect, icon, notationShape, description] of IT_ELEMENT_ROWS) {
|
|
70
|
+
const layer = ArchimateNotation.layer(layerKey);
|
|
71
|
+
IT_ELEMENT_TYPES.set(name, new ITElementType(name, layer, aspect, icon, notationShape, description));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Registry for looking up IT/infrastructure element types. */
|
|
75
|
+
export const ITIconNotation = {
|
|
76
|
+
/** Every IT element type, in catalog order. */
|
|
77
|
+
elementTypes() { return [...IT_ELEMENT_TYPES.values()]; },
|
|
78
|
+
/** Just the names. */
|
|
79
|
+
elementTypeNames() { return [...IT_ELEMENT_TYPES.keys()]; },
|
|
80
|
+
/** An IT element type by name, or undefined. */
|
|
81
|
+
elementType(name) { return IT_ELEMENT_TYPES.get(name); },
|
|
82
|
+
/** Whether a name is a known IT element type. */
|
|
83
|
+
has(name) { return IT_ELEMENT_TYPES.has(name); },
|
|
84
|
+
};
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
// Copyright 2026 Jaroslav Peter Prib, Purveyor of Excellence
|
|
2
|
+
/**
|
|
3
|
+
* A small scalar expression language for computed chart encodings — letting
|
|
4
|
+
* `colorCol`/similar options be a FORMULA over a data point's own fields
|
|
5
|
+
* ("value > threshold ? 1 : 0") instead of only a plain field name.
|
|
6
|
+
*
|
|
7
|
+
* This is renderengine's own copy of sqlengine's
|
|
8
|
+
* `src/compute/kernel/parseKernel.js` grammar, adapted to compile a single
|
|
9
|
+
* ROW at a time (one JS number per parameter in, one number out) rather than
|
|
10
|
+
* a whole column, since a chart evaluates an encoding once per data point,
|
|
11
|
+
* not once per query. Kept as a standalone copy rather than a shared
|
|
12
|
+
* dependency — the two repos have no package link today, and this grammar is
|
|
13
|
+
* small enough that duplicating it costs less than a cross-repo dependency
|
|
14
|
+
* would. See renderengine's own `tasks.md` for why this exists, and
|
|
15
|
+
* sqlengine's `documentation/kernel-language.md` for the full grammar
|
|
16
|
+
* reference this is a subset of.
|
|
17
|
+
*
|
|
18
|
+
* DELIBERATELY SMALL, same reasoning as the original: scalar arithmetic,
|
|
19
|
+
* comparisons, a fixed set of maths functions, and a conditional. No loops,
|
|
20
|
+
* no state, no calls out — anything outside that stays an ordinary
|
|
21
|
+
* JavaScript option (a function passed directly), which still works.
|
|
22
|
+
*
|
|
23
|
+
* NO GPU/WASM/WebNN TARGETS HERE, unlike the sqlengine original — renderengine
|
|
24
|
+
* has no compute-backend concept and nothing has measured a need for one for
|
|
25
|
+
* per-point chart encodings (see tasks.md's "Gated on a measurement" entry).
|
|
26
|
+
* This only ever emits JavaScript.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/** The functions a formula may call, with how many arguments each takes. */
|
|
30
|
+
export const KERNEL_FUNCTIONS = {
|
|
31
|
+
abs: 1, floor: 1, ceil: 1, round: 1, sign: 1, sqrt: 1,
|
|
32
|
+
exp: 1, log: 1, sin: 1, cos: 1, tanh: 1,
|
|
33
|
+
min: 2, max: 2, pow: 2, clamp: 3,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const FN_NAMES = {
|
|
37
|
+
abs: 'Math.abs', floor: 'Math.floor', ceil: 'Math.ceil', round: 'Math.round',
|
|
38
|
+
sign: 'Math.sign', sqrt: 'Math.sqrt', exp: 'Math.exp', log: 'Math.log',
|
|
39
|
+
sin: 'Math.sin', cos: 'Math.cos', tanh: 'Math.tanh', min: 'Math.min',
|
|
40
|
+
max: 'Math.max', pow: 'Math.pow', clamp: '__clamp',
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Parse a formula into `{ast, params}`.
|
|
45
|
+
* @param {string} source — e.g. `value > threshold ? 1 : 0`
|
|
46
|
+
* @param {string[]} params — the names the formula may read
|
|
47
|
+
*/
|
|
48
|
+
export function parseKernelExpr(source, params) {
|
|
49
|
+
if (typeof source !== 'string' || source.trim() === '')
|
|
50
|
+
throw new Error('parseKernelExpr: the formula is empty');
|
|
51
|
+
if (!Array.isArray(params) || params.length === 0)
|
|
52
|
+
throw new Error('parseKernelExpr: at least one parameter name is required');
|
|
53
|
+
for (const p of params) {
|
|
54
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(p))
|
|
55
|
+
throw new Error(`parseKernelExpr: '${p}' is not a usable parameter name`);
|
|
56
|
+
if (p in KERNEL_FUNCTIONS)
|
|
57
|
+
throw new Error(`parseKernelExpr: '${p}' is the name of a built-in function`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const tokens = _tokenize(source);
|
|
61
|
+
const state = { tokens, at: 0, params: new Set(params) };
|
|
62
|
+
const ast = _parseTernary(state);
|
|
63
|
+
|
|
64
|
+
if (state.at < tokens.length)
|
|
65
|
+
throw new Error(
|
|
66
|
+
`parseKernelExpr: unexpected '${tokens[state.at].value}' at position ${tokens[state.at].pos}. ` +
|
|
67
|
+
`This formula language is a single scalar expression — no statements, no assignment.`);
|
|
68
|
+
|
|
69
|
+
return { ast, params: [...params] };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// ── Tokenizer ───────────────────────────────────────────────────────────────
|
|
73
|
+
|
|
74
|
+
const PUNCTUATION = ['<=', '>=', '==', '!=', '&&', '||',
|
|
75
|
+
'+', '-', '*', '/', '%', '<', '>', '(', ')', ',', '?', ':', '!'];
|
|
76
|
+
|
|
77
|
+
function _tokenize(src) {
|
|
78
|
+
const out = [];
|
|
79
|
+
let i = 0;
|
|
80
|
+
while (i < src.length) {
|
|
81
|
+
const ch = src[i];
|
|
82
|
+
if (/\s/.test(ch)) { i++; continue; }
|
|
83
|
+
|
|
84
|
+
if (/[0-9.]/.test(ch)) {
|
|
85
|
+
const m = /^\d*\.?\d+(?:[eE][+-]?\d+)?/.exec(src.slice(i));
|
|
86
|
+
if (!m) throw new Error(`parseKernelExpr: malformed number at position ${i}`);
|
|
87
|
+
out.push({ type: 'number', value: Number(m[0]), pos: i });
|
|
88
|
+
i += m[0].length;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (/[A-Za-z_]/.test(ch)) {
|
|
93
|
+
const m = /^[A-Za-z_][A-Za-z0-9_]*/.exec(src.slice(i));
|
|
94
|
+
out.push({ type: 'name', value: m[0], pos: i });
|
|
95
|
+
i += m[0].length;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Two-character operators listed first, so `<=` is never read as `<`
|
|
100
|
+
// followed by something the parser will not recognise.
|
|
101
|
+
const punct = PUNCTUATION.find(p => src.startsWith(p, i));
|
|
102
|
+
if (!punct)
|
|
103
|
+
throw new Error(`parseKernelExpr: '${ch}' at position ${i} is not part of this formula language`);
|
|
104
|
+
out.push({ type: 'punct', value: punct, pos: i });
|
|
105
|
+
i += punct.length;
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// ── Recursive descent, lowest precedence outermost ──────────────────────────
|
|
111
|
+
|
|
112
|
+
const _peek = (s) => s.tokens[s.at];
|
|
113
|
+
const _eat = (s, value) => {
|
|
114
|
+
const t = _peek(s);
|
|
115
|
+
if (t && t.type === 'punct' && t.value === value) { s.at++; return true; }
|
|
116
|
+
return false;
|
|
117
|
+
};
|
|
118
|
+
const _expect = (s, value) => {
|
|
119
|
+
if (!_eat(s, value)) {
|
|
120
|
+
const t = _peek(s);
|
|
121
|
+
throw new Error(
|
|
122
|
+
`parseKernelExpr: expected '${value}' but found ` +
|
|
123
|
+
(t ? `'${t.value}' at position ${t.pos}` : 'the end of the expression'));
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
function _parseTernary(s) {
|
|
128
|
+
const cond = _parseBinary(s, 0);
|
|
129
|
+
if (!_eat(s, '?')) return cond;
|
|
130
|
+
const then = _parseTernary(s);
|
|
131
|
+
_expect(s, ':');
|
|
132
|
+
const other = _parseTernary(s);
|
|
133
|
+
return { kind: 'cond', cond, then, else: other };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Precedence tiers, loosest first. */
|
|
137
|
+
const TIERS = [['||'], ['&&'], ['==', '!='], ['<', '<=', '>', '>='], ['+', '-'], ['*', '/', '%']];
|
|
138
|
+
|
|
139
|
+
function _parseBinary(s, tier) {
|
|
140
|
+
if (tier >= TIERS.length) return _parseUnary(s);
|
|
141
|
+
let left = _parseBinary(s, tier + 1);
|
|
142
|
+
for (;;) {
|
|
143
|
+
const t = _peek(s);
|
|
144
|
+
if (!t || t.type !== 'punct' || !TIERS[tier].includes(t.value)) return left;
|
|
145
|
+
s.at++;
|
|
146
|
+
const right = _parseBinary(s, tier + 1);
|
|
147
|
+
left = { kind: 'binary', op: t.value, left, right };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function _parseUnary(s) {
|
|
152
|
+
if (_eat(s, '-')) return { kind: 'neg', operand: _parseUnary(s) };
|
|
153
|
+
if (_eat(s, '!')) return { kind: 'not', operand: _parseUnary(s) };
|
|
154
|
+
return _parsePrimary(s);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function _parsePrimary(s) {
|
|
158
|
+
const t = _peek(s);
|
|
159
|
+
if (!t) throw new Error('parseKernelExpr: the expression ends where a value was expected');
|
|
160
|
+
|
|
161
|
+
if (_eat(s, '(')) {
|
|
162
|
+
const inner = _parseTernary(s);
|
|
163
|
+
_expect(s, ')');
|
|
164
|
+
return inner;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (t.type === 'number') { s.at++; return { kind: 'literal', value: t.value }; }
|
|
168
|
+
|
|
169
|
+
if (t.type === 'name') {
|
|
170
|
+
s.at++;
|
|
171
|
+
const argCount = KERNEL_FUNCTIONS[t.value];
|
|
172
|
+
if (argCount != null) {
|
|
173
|
+
_expect(s, '(');
|
|
174
|
+
const args = [];
|
|
175
|
+
if (!_eat(s, ')')) {
|
|
176
|
+
do { args.push(_parseTernary(s)); } while (_eat(s, ','));
|
|
177
|
+
_expect(s, ')');
|
|
178
|
+
}
|
|
179
|
+
if (args.length !== argCount)
|
|
180
|
+
throw new Error(
|
|
181
|
+
`parseKernelExpr: ${t.value}() takes ${argCount} argument${argCount === 1 ? '' : 's'}, ` +
|
|
182
|
+
`not ${args.length}`);
|
|
183
|
+
return { kind: 'call', name: t.value, args };
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (!s.params.has(t.value))
|
|
187
|
+
throw new Error(
|
|
188
|
+
`parseKernelExpr: '${t.value}' is neither a parameter nor a built-in function. ` +
|
|
189
|
+
`Parameters here are ${[...s.params].join(', ')}; functions are ` +
|
|
190
|
+
`${Object.keys(KERNEL_FUNCTIONS).join(', ')}.`);
|
|
191
|
+
return { kind: 'param', name: t.value };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
throw new Error(`parseKernelExpr: unexpected '${t.value}' at position ${t.pos}`);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// ── JavaScript emission ──────────────────────────────────────────────────────
|
|
198
|
+
|
|
199
|
+
function _emitJs(node) {
|
|
200
|
+
const go = (n) => {
|
|
201
|
+
switch (n.kind) {
|
|
202
|
+
case 'literal': return `${n.value}`;
|
|
203
|
+
case 'param': return n.name;
|
|
204
|
+
case 'neg': return `(-${go(n.operand)})`;
|
|
205
|
+
case 'not': return `(${go(n.operand)} === 0 ? 1 : 0)`;
|
|
206
|
+
case 'cond': return `((${go(n.cond)}) !== 0 ? ${go(n.then)} : ${go(n.else)})`;
|
|
207
|
+
case 'binary': {
|
|
208
|
+
const l = go(n.left), r = go(n.right);
|
|
209
|
+
if (n.op === '&&' || n.op === '||')
|
|
210
|
+
return `(((${l}) !== 0 ${n.op} (${r}) !== 0) ? 1 : 0)`;
|
|
211
|
+
if (['<', '<=', '>', '>=', '==', '!='].includes(n.op))
|
|
212
|
+
return `((${l} ${n.op === '==' ? '===' : n.op === '!=' ? '!==' : n.op} ${r}) ? 1 : 0)`;
|
|
213
|
+
return `(${l} ${n.op} ${r})`;
|
|
214
|
+
}
|
|
215
|
+
case 'call': {
|
|
216
|
+
const args = n.args.map(go).join(', ');
|
|
217
|
+
return `${FN_NAMES[n.name]}(${args})`;
|
|
218
|
+
}
|
|
219
|
+
default: throw new Error(`_emitJs: unknown node '${n.kind}'`);
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
return go(node);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Compile a formula to a callable JavaScript function — `fn(...paramValues)
|
|
227
|
+
* -> number`. Built with `new Function` from an expression THIS module
|
|
228
|
+
* generated, not from anything a caller passed in directly: the parser
|
|
229
|
+
* accepts only its own small grammar, so arbitrary text never reaches the
|
|
230
|
+
* function body, the same reasoning sqlengine's compiled UDFs rely on.
|
|
231
|
+
*
|
|
232
|
+
* @param {string} source
|
|
233
|
+
* @param {string[]} params
|
|
234
|
+
* @returns {(...values: number[]) => number}
|
|
235
|
+
*/
|
|
236
|
+
export function compileFormula(source, params) {
|
|
237
|
+
const { ast } = parseKernelExpr(source, params);
|
|
238
|
+
const __clamp = (x, lo, hi) => Math.min(Math.max(x, lo), hi);
|
|
239
|
+
const body = `return ${_emitJs(ast)};`;
|
|
240
|
+
// eslint-disable-next-line no-new-func
|
|
241
|
+
const fn = new Function('__clamp', ...params, body);
|
|
242
|
+
return (...values) => fn(__clamp, ...values);
|
|
243
|
+
}
|