@forgecharts/sdk 1.1.27 → 1.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/backwardCompatibility.test.d.ts +14 -0
- package/dist/__tests__/backwardCompatibility.test.d.ts.map +1 -0
- package/dist/__tests__/backwardCompatibility.test.js +159 -0
- package/dist/__tests__/backwardCompatibility.test.js.map +1 -0
- package/dist/__tests__/candleInvariant.test.d.ts +20 -0
- package/dist/__tests__/candleInvariant.test.d.ts.map +1 -0
- package/dist/__tests__/candleInvariant.test.js +415 -0
- package/dist/__tests__/candleInvariant.test.js.map +1 -0
- package/dist/__tests__/public-api-surface.d.ts +13 -0
- package/dist/__tests__/public-api-surface.d.ts.map +1 -0
- package/{src/__tests__/public-api-surface.ts → dist/__tests__/public-api-surface.js} +4 -42
- package/dist/__tests__/public-api-surface.js.map +1 -0
- package/dist/__tests__/timeframeBoundary.test.d.ts +17 -0
- package/dist/__tests__/timeframeBoundary.test.d.ts.map +1 -0
- package/dist/__tests__/timeframeBoundary.test.js +452 -0
- package/dist/__tests__/timeframeBoundary.test.js.map +1 -0
- package/dist/api/DrawingManager.d.ts +20 -0
- package/dist/api/DrawingManager.d.ts.map +1 -0
- package/dist/api/DrawingManager.js +190 -0
- package/dist/api/DrawingManager.js.map +1 -0
- package/dist/api/EventBus.d.ts +19 -0
- package/dist/api/EventBus.d.ts.map +1 -0
- package/dist/api/EventBus.js +44 -0
- package/dist/api/EventBus.js.map +1 -0
- package/dist/api/IndicatorDAG.d.ts +85 -0
- package/dist/api/IndicatorDAG.d.ts.map +1 -0
- package/dist/api/IndicatorDAG.js +316 -0
- package/dist/api/IndicatorDAG.js.map +1 -0
- package/dist/api/IndicatorRegistry.d.ts +22 -0
- package/dist/api/IndicatorRegistry.d.ts.map +1 -0
- package/dist/api/IndicatorRegistry.js +39 -0
- package/dist/api/IndicatorRegistry.js.map +1 -0
- package/dist/api/LayoutManager.d.ts +30 -0
- package/dist/api/LayoutManager.d.ts.map +1 -0
- package/dist/api/LayoutManager.js +51 -0
- package/dist/api/LayoutManager.js.map +1 -0
- package/dist/api/PaneManager.d.ts +42 -0
- package/dist/api/PaneManager.d.ts.map +1 -0
- package/dist/api/PaneManager.js +119 -0
- package/dist/api/PaneManager.js.map +1 -0
- package/dist/api/ReferenceAPI.d.ts +78 -0
- package/dist/api/ReferenceAPI.d.ts.map +1 -0
- package/dist/api/ReferenceAPI.js +153 -0
- package/dist/api/ReferenceAPI.js.map +1 -0
- package/dist/api/TChart.d.ts +345 -0
- package/dist/api/TChart.d.ts.map +1 -0
- package/dist/api/TChart.js +765 -0
- package/dist/api/TChart.js.map +1 -0
- package/{src/api/createChart.ts → dist/api/createChart.d.ts} +2 -7
- package/dist/api/createChart.d.ts.map +1 -0
- package/dist/api/createChart.js +42 -0
- package/dist/api/createChart.js.map +1 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts +4 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts.map +1 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js +22 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +1 -0
- package/dist/api/drawing tools/lines menu/crossLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/crossLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/crossLine.js +16 -0
- package/dist/api/drawing tools/lines menu/crossLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.d.ts +17 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.js +59 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.js.map +1 -0
- package/dist/api/drawing tools/lines menu/extendedLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/extendedLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/extendedLine.js +17 -0
- package/dist/api/drawing tools/lines menu/extendedLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.js +41 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontal.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/horizontal.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontal.js +19 -0
- package/dist/api/drawing tools/lines menu/horizontal.js.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.js +20 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.js.map +1 -0
- package/dist/api/drawing tools/lines menu/infoLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/infoLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/infoLine.js +107 -0
- package/dist/api/drawing tools/lines menu/infoLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.js +31 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +15 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.js +43 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.js.map +1 -0
- package/dist/api/drawing tools/lines menu/pitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/pitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/pitchfork.js +12 -0
- package/dist/api/drawing tools/lines menu/pitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/ray.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/ray.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/ray.js +23 -0
- package/dist/api/drawing tools/lines menu/ray.js.map +1 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.js +127 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.js.map +1 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js +15 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/trendAngle.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/trendAngle.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/trendAngle.js +51 -0
- package/dist/api/drawing tools/lines menu/trendAngle.js.map +1 -0
- package/dist/api/drawing tools/lines menu/trendline.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/trendline.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/trendline.js +11 -0
- package/dist/api/drawing tools/lines menu/trendline.js.map +1 -0
- package/dist/api/drawing tools/lines menu/vertical.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/vertical.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/vertical.js +11 -0
- package/dist/api/drawing tools/lines menu/vertical.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/crosshair.d.ts +16 -0
- package/dist/api/drawing tools/pointers menu/crosshair.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/crosshair.ts → dist/api/drawing tools/pointers menu/crosshair.js } +6 -7
- package/dist/api/drawing tools/pointers menu/crosshair.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/cursor.d.ts +15 -0
- package/dist/api/drawing tools/pointers menu/cursor.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/cursor.ts → dist/api/drawing tools/pointers menu/cursor.js } +7 -8
- package/dist/api/drawing tools/pointers menu/cursor.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/demonstration.d.ts +30 -0
- package/dist/api/drawing tools/pointers menu/demonstration.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/demonstration.ts → dist/api/drawing tools/pointers menu/demonstration.js } +9 -14
- package/dist/api/drawing tools/pointers menu/demonstration.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/dot.d.ts +23 -0
- package/dist/api/drawing tools/pointers menu/dot.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/dot.ts → dist/api/drawing tools/pointers menu/dot.js } +8 -11
- package/dist/api/drawing tools/pointers menu/dot.js.map +1 -0
- package/dist/api/drawing tools/shapes menu/rectangle.d.ts +4 -0
- package/dist/api/drawing tools/shapes menu/rectangle.d.ts.map +1 -0
- package/dist/api/drawing tools/shapes menu/rectangle.js +19 -0
- package/dist/api/drawing tools/shapes menu/rectangle.js.map +1 -0
- package/dist/api/drawing tools/shapes menu/text.d.ts +4 -0
- package/dist/api/drawing tools/shapes menu/text.d.ts.map +1 -0
- package/dist/api/drawing tools/shapes menu/text.js +25 -0
- package/dist/api/drawing tools/shapes menu/text.js.map +1 -0
- package/dist/api/drawingUtils.d.ts +22 -0
- package/dist/api/drawingUtils.d.ts.map +1 -0
- package/dist/api/drawingUtils.js +83 -0
- package/dist/api/drawingUtils.js.map +1 -0
- package/dist/core/CanvasLayer.d.ts +26 -0
- package/dist/core/CanvasLayer.d.ts.map +1 -0
- package/dist/core/CanvasLayer.js +56 -0
- package/dist/core/CanvasLayer.js.map +1 -0
- package/dist/core/Chart.d.ts +164 -0
- package/dist/core/Chart.d.ts.map +1 -0
- package/dist/core/Chart.js +839 -0
- package/dist/core/Chart.js.map +1 -0
- package/dist/core/CoordTransform.d.ts +168 -0
- package/dist/core/CoordTransform.d.ts.map +1 -0
- package/dist/core/CoordTransform.js +224 -0
- package/dist/core/CoordTransform.js.map +1 -0
- package/dist/core/Crosshair.d.ts +30 -0
- package/dist/core/Crosshair.d.ts.map +1 -0
- package/dist/core/Crosshair.js +186 -0
- package/dist/core/Crosshair.js.map +1 -0
- package/dist/core/IndicatorEngine.d.ts +51 -0
- package/dist/core/IndicatorEngine.d.ts.map +1 -0
- package/dist/core/IndicatorEngine.js +181 -0
- package/dist/core/IndicatorEngine.js.map +1 -0
- package/dist/core/InteractionManager.d.ts +197 -0
- package/dist/core/InteractionManager.d.ts.map +1 -0
- package/dist/core/InteractionManager.js +698 -0
- package/dist/core/InteractionManager.js.map +1 -0
- package/dist/core/PriceScale.d.ts +27 -0
- package/dist/core/PriceScale.d.ts.map +1 -0
- package/dist/core/PriceScale.js +113 -0
- package/dist/core/PriceScale.js.map +1 -0
- package/dist/core/Series.d.ts +40 -0
- package/dist/core/Series.d.ts.map +1 -0
- package/dist/core/Series.js +114 -0
- package/dist/core/Series.js.map +1 -0
- package/dist/core/TimeScale.d.ts +43 -0
- package/dist/core/TimeScale.d.ts.map +1 -0
- package/dist/core/TimeScale.js +150 -0
- package/dist/core/TimeScale.js.map +1 -0
- package/dist/datafeed/DatafeedConnector.d.ts +89 -0
- package/dist/datafeed/DatafeedConnector.d.ts.map +1 -0
- package/dist/datafeed/DatafeedConnector.js +268 -0
- package/dist/datafeed/DatafeedConnector.js.map +1 -0
- package/dist/engine/CandleEngine.d.ts +207 -0
- package/dist/engine/CandleEngine.d.ts.map +1 -0
- package/dist/engine/CandleEngine.js +318 -0
- package/dist/engine/CandleEngine.js.map +1 -0
- package/dist/engine/__tests__/CandleEngine.test.d.ts +2 -0
- package/dist/engine/__tests__/CandleEngine.test.d.ts.map +1 -0
- package/dist/engine/__tests__/CandleEngine.test.js +300 -0
- package/dist/engine/__tests__/CandleEngine.test.js.map +1 -0
- package/dist/engine/candleInvariants.d.ts +66 -0
- package/dist/engine/candleInvariants.d.ts.map +1 -0
- package/dist/engine/candleInvariants.js +134 -0
- package/dist/engine/candleInvariants.js.map +1 -0
- package/{src/engine/mergeUtils.ts → dist/engine/mergeUtils.d.ts} +15 -52
- package/dist/engine/mergeUtils.d.ts.map +1 -0
- package/dist/engine/mergeUtils.js +64 -0
- package/dist/engine/mergeUtils.js.map +1 -0
- package/dist/engine/timeframeUtils.d.ts +80 -0
- package/dist/engine/timeframeUtils.d.ts.map +1 -0
- package/{src/engine/timeframeUtils.ts → dist/engine/timeframeUtils.js} +30 -48
- package/dist/engine/timeframeUtils.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +29 -0
- package/dist/internal.d.ts.map +1 -0
- package/{src/internal.ts → dist/internal.js} +1 -10
- package/dist/internal.js.map +1 -0
- package/dist/licensing/ChartRuntimeResolver.d.ts +233 -0
- package/dist/licensing/ChartRuntimeResolver.d.ts.map +1 -0
- package/dist/licensing/ChartRuntimeResolver.js +310 -0
- package/dist/licensing/ChartRuntimeResolver.js.map +1 -0
- package/dist/licensing/LicenseManager.d.ts +55 -0
- package/dist/licensing/LicenseManager.d.ts.map +1 -0
- package/dist/licensing/LicenseManager.js +114 -0
- package/dist/licensing/LicenseManager.js.map +1 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts +13 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts.map +1 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +177 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +1 -0
- package/dist/licensing/__tests__/LicenseManager.test.d.ts +12 -0
- package/dist/licensing/__tests__/LicenseManager.test.d.ts.map +1 -0
- package/dist/licensing/__tests__/LicenseManager.test.js +153 -0
- package/dist/licensing/__tests__/LicenseManager.test.js.map +1 -0
- package/dist/licensing/licenseTypes.d.ts +18 -0
- package/dist/licensing/licenseTypes.d.ts.map +1 -0
- package/dist/licensing/licenseTypes.js +2 -0
- package/dist/licensing/licenseTypes.js.map +1 -0
- package/dist/pine/PineCompiler.d.ts +35 -0
- package/dist/pine/PineCompiler.d.ts.map +1 -0
- package/dist/pine/PineCompiler.js +44 -0
- package/dist/pine/PineCompiler.js.map +1 -0
- package/dist/pine/diagnostics.d.ts +20 -0
- package/dist/pine/diagnostics.d.ts.map +1 -0
- package/dist/pine/diagnostics.js +11 -0
- package/dist/pine/diagnostics.js.map +1 -0
- package/{src/pine/index.ts → dist/pine/index.d.ts} +4 -3
- package/dist/pine/index.d.ts.map +1 -0
- package/dist/pine/index.js +5 -0
- package/dist/pine/index.js.map +1 -0
- package/dist/pine/pine-ast.d.ts +142 -0
- package/dist/pine/pine-ast.d.ts.map +1 -0
- package/dist/pine/pine-ast.js +19 -0
- package/dist/pine/pine-ast.js.map +1 -0
- package/dist/pine/pine-lexer.d.ts +41 -0
- package/dist/pine/pine-lexer.d.ts.map +1 -0
- package/dist/pine/pine-lexer.js +249 -0
- package/dist/pine/pine-lexer.js.map +1 -0
- package/dist/pine/pine-parser.d.ts +51 -0
- package/dist/pine/pine-parser.d.ts.map +1 -0
- package/dist/pine/pine-parser.js +416 -0
- package/dist/pine/pine-parser.js.map +1 -0
- package/dist/pine/pine-transpiler.d.ts +33 -0
- package/dist/pine/pine-transpiler.d.ts.map +1 -0
- package/dist/pine/pine-transpiler.js +260 -0
- package/dist/pine/pine-transpiler.js.map +1 -0
- package/dist/pixi/LayerName.d.ts +18 -0
- package/dist/pixi/LayerName.d.ts.map +1 -0
- package/dist/pixi/LayerName.js +35 -0
- package/dist/pixi/LayerName.js.map +1 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts +23 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiCandlestickRenderer.js +107 -0
- package/dist/pixi/PixiCandlestickRenderer.js.map +1 -0
- package/dist/pixi/PixiChart.d.ts +72 -0
- package/dist/pixi/PixiChart.d.ts.map +1 -0
- package/dist/pixi/PixiChart.js +367 -0
- package/dist/pixi/PixiChart.js.map +1 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts +29 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiCrosshairRenderer.js +110 -0
- package/dist/pixi/PixiCrosshairRenderer.js.map +1 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts +17 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiDrawingRenderer.js +111 -0
- package/dist/pixi/PixiDrawingRenderer.js.map +1 -0
- package/dist/pixi/PixiGridRenderer.d.ts +22 -0
- package/dist/pixi/PixiGridRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiGridRenderer.js +114 -0
- package/dist/pixi/PixiGridRenderer.js.map +1 -0
- package/dist/pixi/PixiLayerManager.d.ts +56 -0
- package/dist/pixi/PixiLayerManager.d.ts.map +1 -0
- package/dist/pixi/PixiLayerManager.js +92 -0
- package/dist/pixi/PixiLayerManager.js.map +1 -0
- package/dist/react/canvas/ChartCanvas.d.ts +85 -0
- package/dist/react/canvas/ChartCanvas.d.ts.map +1 -0
- package/dist/react/canvas/ChartCanvas.js +604 -0
- package/dist/react/canvas/ChartCanvas.js.map +1 -0
- package/dist/react/canvas/ChartContextMenu.d.ts +18 -0
- package/dist/react/canvas/ChartContextMenu.d.ts.map +1 -0
- package/dist/react/canvas/ChartContextMenu.js +5 -0
- package/dist/react/canvas/ChartContextMenu.js.map +1 -0
- package/dist/react/canvas/ChartSettingsDialog.d.ts +25 -0
- package/dist/react/canvas/ChartSettingsDialog.d.ts.map +1 -0
- package/dist/react/canvas/ChartSettingsDialog.js +28 -0
- package/dist/react/canvas/ChartSettingsDialog.js.map +1 -0
- package/dist/react/canvas/IndicatorLabel.d.ts +21 -0
- package/dist/react/canvas/IndicatorLabel.d.ts.map +1 -0
- package/dist/react/canvas/IndicatorLabel.js +196 -0
- package/dist/react/canvas/IndicatorLabel.js.map +1 -0
- package/dist/react/canvas/IndicatorPane.d.ts +32 -0
- package/dist/react/canvas/IndicatorPane.d.ts.map +1 -0
- package/dist/react/canvas/IndicatorPane.js +395 -0
- package/dist/react/canvas/IndicatorPane.js.map +1 -0
- package/dist/react/canvas/PointerOverlay.d.ts +23 -0
- package/dist/react/canvas/PointerOverlay.d.ts.map +1 -0
- package/dist/react/canvas/PointerOverlay.js +61 -0
- package/dist/react/canvas/PointerOverlay.js.map +1 -0
- package/dist/react/canvas/toolbars/LeftToolbar.d.ts +19 -0
- package/dist/react/canvas/toolbars/LeftToolbar.d.ts.map +1 -0
- package/dist/react/canvas/toolbars/LeftToolbar.js +407 -0
- package/dist/react/canvas/toolbars/LeftToolbar.js.map +1 -0
- package/dist/react/hooks/useChartCapabilities.d.ts +21 -0
- package/dist/react/hooks/useChartCapabilities.d.ts.map +1 -0
- package/dist/react/hooks/useChartCapabilities.js +66 -0
- package/dist/react/hooks/useChartCapabilities.js.map +1 -0
- package/dist/react/index.d.ts +30 -0
- package/dist/react/index.d.ts.map +1 -0
- package/{src/react/index.ts → dist/react/index.js} +1 -24
- package/dist/react/index.js.map +1 -0
- package/dist/react/internal.d.ts +38 -0
- package/dist/react/internal.d.ts.map +1 -0
- package/{src/react/internal.ts → dist/react/internal.js} +1 -19
- package/dist/react/internal.js.map +1 -0
- package/dist/react/shell/ManagedAppShell.d.ts +91 -0
- package/dist/react/shell/ManagedAppShell.d.ts.map +1 -0
- package/dist/react/shell/ManagedAppShell.js +440 -0
- package/dist/react/shell/ManagedAppShell.js.map +1 -0
- package/dist/react/trading/TradingBridge.d.ts +86 -0
- package/dist/react/trading/TradingBridge.d.ts.map +1 -0
- package/dist/react/trading/TradingBridge.js +73 -0
- package/dist/react/trading/TradingBridge.js.map +1 -0
- package/dist/react/workspace/ChartWorkspace.d.ts +73 -0
- package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -0
- package/dist/react/workspace/ChartWorkspace.js +42 -0
- package/dist/react/workspace/ChartWorkspace.js.map +1 -0
- package/dist/react/workspace/FloatingPanel.d.ts +18 -0
- package/dist/react/workspace/FloatingPanel.d.ts.map +1 -0
- package/dist/react/workspace/FloatingPanel.js +82 -0
- package/dist/react/workspace/FloatingPanel.js.map +1 -0
- package/dist/react/workspace/IndicatorsDialog.d.ts +8 -0
- package/dist/react/workspace/IndicatorsDialog.d.ts.map +1 -0
- package/dist/react/workspace/IndicatorsDialog.js +121 -0
- package/dist/react/workspace/IndicatorsDialog.js.map +1 -0
- package/dist/react/workspace/LayoutMenu.d.ts +33 -0
- package/dist/react/workspace/LayoutMenu.d.ts.map +1 -0
- package/dist/react/workspace/LayoutMenu.js +113 -0
- package/dist/react/workspace/LayoutMenu.js.map +1 -0
- package/dist/react/workspace/SymbolSearchDialog.d.ts +10 -0
- package/dist/react/workspace/SymbolSearchDialog.d.ts.map +1 -0
- package/dist/react/workspace/SymbolSearchDialog.js +245 -0
- package/dist/react/workspace/SymbolSearchDialog.js.map +1 -0
- package/dist/react/workspace/TabBar.d.ts +17 -0
- package/dist/react/workspace/TabBar.d.ts.map +1 -0
- package/dist/react/workspace/TabBar.js +29 -0
- package/dist/react/workspace/TabBar.js.map +1 -0
- package/dist/react/workspace/toolbars/BottomToolbar.d.ts +19 -0
- package/dist/react/workspace/toolbars/BottomToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/BottomToolbar.js +236 -0
- package/dist/react/workspace/toolbars/BottomToolbar.js.map +1 -0
- package/dist/react/workspace/toolbars/RightToolbar.d.ts +8 -0
- package/dist/react/workspace/toolbars/RightToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/RightToolbar.js +18 -0
- package/dist/react/workspace/toolbars/RightToolbar.js.map +1 -0
- package/dist/react/workspace/toolbars/TopToolbar.d.ts +41 -0
- package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/TopToolbar.js +82 -0
- package/dist/react/workspace/toolbars/TopToolbar.js.map +1 -0
- package/dist/renderers/CandlestickRenderer.d.ts +13 -0
- package/dist/renderers/CandlestickRenderer.d.ts.map +1 -0
- package/dist/renderers/CandlestickRenderer.js +98 -0
- package/dist/renderers/CandlestickRenderer.js.map +1 -0
- package/dist/renderers/HistogramRenderer.d.ts +11 -0
- package/dist/renderers/HistogramRenderer.d.ts.map +1 -0
- package/dist/renderers/HistogramRenderer.js +50 -0
- package/dist/renderers/HistogramRenderer.js.map +1 -0
- package/dist/renderers/LineRenderer.d.ts +12 -0
- package/dist/renderers/LineRenderer.d.ts.map +1 -0
- package/dist/renderers/LineRenderer.js +64 -0
- package/dist/renderers/LineRenderer.js.map +1 -0
- package/dist/theme/colors.d.ts +4 -0
- package/dist/theme/colors.d.ts.map +1 -0
- package/dist/theme/colors.js +19 -0
- package/dist/theme/colors.js.map +1 -0
- package/dist/tools/barDivergenceCheck.d.ts +120 -0
- package/dist/tools/barDivergenceCheck.d.ts.map +1 -0
- package/dist/tools/barDivergenceCheck.js +200 -0
- package/dist/tools/barDivergenceCheck.js.map +1 -0
- package/dist/trading/TradingOverlayStore.d.ts +86 -0
- package/dist/trading/TradingOverlayStore.d.ts.map +1 -0
- package/dist/trading/TradingOverlayStore.js +139 -0
- package/dist/trading/TradingOverlayStore.js.map +1 -0
- package/dist/trading/UnmanagedIngestion.d.ts +91 -0
- package/dist/trading/UnmanagedIngestion.d.ts.map +1 -0
- package/dist/trading/UnmanagedIngestion.js +114 -0
- package/dist/trading/UnmanagedIngestion.js.map +1 -0
- package/dist/trading/__tests__/ManagedTradingController.test.d.ts +18 -0
- package/dist/trading/__tests__/ManagedTradingController.test.d.ts.map +1 -0
- package/dist/trading/__tests__/ManagedTradingController.test.js +271 -0
- package/dist/trading/__tests__/ManagedTradingController.test.js.map +1 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.d.ts +16 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.d.ts.map +1 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.js +267 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.js.map +1 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts +16 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts.map +1 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.js +170 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +1 -0
- package/dist/trading/managed/ManagedTradingController.d.ts +110 -0
- package/dist/trading/managed/ManagedTradingController.d.ts.map +1 -0
- package/dist/trading/managed/ManagedTradingController.js +247 -0
- package/dist/trading/managed/ManagedTradingController.js.map +1 -0
- package/dist/trading/managed/managedCapabilities.d.ts +45 -0
- package/dist/trading/managed/managedCapabilities.d.ts.map +1 -0
- package/dist/trading/managed/managedCapabilities.js +79 -0
- package/dist/trading/managed/managedCapabilities.js.map +1 -0
- package/dist/trading/managed/managedTypes.d.ts +122 -0
- package/dist/trading/managed/managedTypes.d.ts.map +1 -0
- package/dist/trading/managed/managedTypes.js +13 -0
- package/dist/trading/managed/managedTypes.js.map +1 -0
- package/dist/trading/tradingTypes.d.ts +89 -0
- package/dist/trading/tradingTypes.d.ts.map +1 -0
- package/dist/trading/tradingTypes.js +8 -0
- package/dist/trading/tradingTypes.js.map +1 -0
- package/dist/tscript/TScriptIndicator.d.ts +41 -0
- package/dist/tscript/TScriptIndicator.d.ts.map +1 -0
- package/dist/tscript/TScriptIndicator.js +47 -0
- package/dist/tscript/TScriptIndicator.js.map +1 -0
- package/dist/tscript/ast.d.ts +89 -0
- package/dist/tscript/ast.d.ts.map +1 -0
- package/dist/tscript/ast.js +22 -0
- package/dist/tscript/ast.js.map +1 -0
- package/dist/tscript/lexer.d.ts +36 -0
- package/dist/tscript/lexer.d.ts.map +1 -0
- package/dist/tscript/lexer.js +187 -0
- package/dist/tscript/lexer.js.map +1 -0
- package/dist/tscript/parser.d.ts +50 -0
- package/dist/tscript/parser.d.ts.map +1 -0
- package/dist/tscript/parser.js +318 -0
- package/dist/tscript/parser.js.map +1 -0
- package/dist/tscript/runtime.d.ts +123 -0
- package/dist/tscript/runtime.d.ts.map +1 -0
- package/dist/tscript/runtime.js +475 -0
- package/dist/tscript/runtime.js.map +1 -0
- package/dist/tscript/series.d.ts +49 -0
- package/dist/tscript/series.d.ts.map +1 -0
- package/dist/tscript/series.js +79 -0
- package/dist/tscript/series.js.map +1 -0
- package/dist/types/IChart.d.ts +48 -0
- package/dist/types/IChart.d.ts.map +1 -0
- package/dist/types/IChart.js +2 -0
- package/dist/types/IChart.js.map +1 -0
- package/{src/types/IRenderer.ts → dist/types/IRenderer.d.ts} +2 -8
- package/dist/types/IRenderer.d.ts.map +1 -0
- package/dist/types/IRenderer.js +2 -0
- package/dist/types/IRenderer.js.map +1 -0
- package/dist/types/ISeries.d.ts +26 -0
- package/dist/types/ISeries.d.ts.map +1 -0
- package/dist/types/ISeries.js +2 -0
- package/dist/types/ISeries.js.map +1 -0
- package/package.json +5 -1
- package/src/__tests__/backwardCompatibility.test.ts +0 -191
- package/src/__tests__/candleInvariant.test.ts +0 -500
- package/src/__tests__/timeframeBoundary.test.ts +0 -583
- package/src/api/DrawingManager.ts +0 -188
- package/src/api/EventBus.ts +0 -53
- package/src/api/IndicatorDAG.ts +0 -389
- package/src/api/IndicatorRegistry.ts +0 -47
- package/src/api/LayoutManager.ts +0 -72
- package/src/api/PaneManager.ts +0 -129
- package/src/api/ReferenceAPI.ts +0 -195
- package/src/api/TChart.ts +0 -881
- package/src/api/drawing tools/fib gann menu/fibRetracement.ts +0 -27
- package/src/api/drawing tools/lines menu/crossLine.ts +0 -21
- package/src/api/drawing tools/lines menu/disjointChannel.ts +0 -74
- package/src/api/drawing tools/lines menu/extendedLine.ts +0 -22
- package/src/api/drawing tools/lines menu/flatTopBottom.ts +0 -45
- package/src/api/drawing tools/lines menu/horizontal.ts +0 -24
- package/src/api/drawing tools/lines menu/horizontalRay.ts +0 -25
- package/src/api/drawing tools/lines menu/infoLine.ts +0 -127
- package/src/api/drawing tools/lines menu/insidePitchfork.ts +0 -21
- package/src/api/drawing tools/lines menu/modifiedSchiffPitchfork.ts +0 -18
- package/src/api/drawing tools/lines menu/parallelChannel.ts +0 -47
- package/src/api/drawing tools/lines menu/pitchfork.ts +0 -15
- package/src/api/drawing tools/lines menu/ray.ts +0 -28
- package/src/api/drawing tools/lines menu/regressionTrend.ts +0 -157
- package/src/api/drawing tools/lines menu/schiffPitchfork.ts +0 -18
- package/src/api/drawing tools/lines menu/trendAngle.ts +0 -64
- package/src/api/drawing tools/lines menu/trendline.ts +0 -16
- package/src/api/drawing tools/lines menu/vertical.ts +0 -16
- package/src/api/drawing tools/shapes menu/rectangle.ts +0 -24
- package/src/api/drawing tools/shapes menu/text.ts +0 -30
- package/src/api/drawingUtils.ts +0 -82
- package/src/core/CanvasLayer.ts +0 -77
- package/src/core/Chart.ts +0 -917
- package/src/core/CoordTransform.ts +0 -282
- package/src/core/Crosshair.ts +0 -207
- package/src/core/IndicatorEngine.ts +0 -216
- package/src/core/InteractionManager.ts +0 -899
- package/src/core/PriceScale.ts +0 -133
- package/src/core/Series.ts +0 -132
- package/src/core/TimeScale.ts +0 -175
- package/src/datafeed/DatafeedConnector.ts +0 -300
- package/src/engine/CandleEngine.ts +0 -458
- package/src/engine/__tests__/CandleEngine.test.ts +0 -402
- package/src/engine/candleInvariants.ts +0 -172
- package/src/index.ts +0 -190
- package/src/licensing/ChartRuntimeResolver.ts +0 -380
- package/src/licensing/LicenseManager.ts +0 -131
- package/src/licensing/__tests__/ChartRuntimeResolver.test.ts +0 -207
- package/src/licensing/__tests__/LicenseManager.test.ts +0 -180
- package/src/licensing/licenseTypes.ts +0 -19
- package/src/pine/PineCompiler.ts +0 -68
- package/src/pine/diagnostics.ts +0 -30
- package/src/pine/pine-ast.ts +0 -163
- package/src/pine/pine-lexer.ts +0 -265
- package/src/pine/pine-parser.ts +0 -439
- package/src/pine/pine-transpiler.ts +0 -301
- package/src/pixi/LayerName.ts +0 -35
- package/src/pixi/PixiCandlestickRenderer.ts +0 -125
- package/src/pixi/PixiChart.ts +0 -425
- package/src/pixi/PixiCrosshairRenderer.ts +0 -134
- package/src/pixi/PixiDrawingRenderer.ts +0 -121
- package/src/pixi/PixiGridRenderer.ts +0 -136
- package/src/pixi/PixiLayerManager.ts +0 -102
- package/src/react/canvas/ChartCanvas.tsx +0 -984
- package/src/react/canvas/ChartContextMenu.tsx +0 -60
- package/src/react/canvas/ChartSettingsDialog.tsx +0 -133
- package/src/react/canvas/IndicatorLabel.tsx +0 -347
- package/src/react/canvas/IndicatorPane.tsx +0 -503
- package/src/react/canvas/PointerOverlay.tsx +0 -126
- package/src/react/canvas/toolbars/LeftToolbar.tsx +0 -1096
- package/src/react/hooks/useChartCapabilities.ts +0 -76
- package/src/react/shell/ManagedAppShell.tsx +0 -699
- package/src/react/trading/TradingBridge.ts +0 -156
- package/src/react/workspace/ChartWorkspace.tsx +0 -228
- package/src/react/workspace/FloatingPanel.tsx +0 -131
- package/src/react/workspace/IndicatorsDialog.tsx +0 -246
- package/src/react/workspace/LayoutMenu.tsx +0 -345
- package/src/react/workspace/SymbolSearchDialog.tsx +0 -377
- package/src/react/workspace/TabBar.tsx +0 -87
- package/src/react/workspace/toolbars/BottomToolbar.tsx +0 -372
- package/src/react/workspace/toolbars/RightToolbar.tsx +0 -46
- package/src/react/workspace/toolbars/TopToolbar.tsx +0 -431
- package/src/renderers/CandlestickRenderer.ts +0 -130
- package/src/renderers/HistogramRenderer.ts +0 -63
- package/src/renderers/LineRenderer.ts +0 -77
- package/src/theme/colors.ts +0 -21
- package/src/tools/barDivergenceCheck.ts +0 -305
- package/src/trading/TradingOverlayStore.ts +0 -161
- package/src/trading/UnmanagedIngestion.ts +0 -156
- package/src/trading/__tests__/ManagedTradingController.test.ts +0 -338
- package/src/trading/__tests__/TradingOverlayStore.test.ts +0 -323
- package/src/trading/__tests__/UnmanagedIngestion.test.ts +0 -205
- package/src/trading/managed/ManagedTradingController.ts +0 -292
- package/src/trading/managed/managedCapabilities.ts +0 -98
- package/src/trading/managed/managedTypes.ts +0 -151
- package/src/trading/tradingTypes.ts +0 -135
- package/src/tscript/TScriptIndicator.ts +0 -54
- package/src/tscript/ast.ts +0 -105
- package/src/tscript/lexer.ts +0 -190
- package/src/tscript/parser.ts +0 -334
- package/src/tscript/runtime.ts +0 -525
- package/src/tscript/series.ts +0 -84
- package/src/types/IChart.ts +0 -56
- package/src/types/ISeries.ts +0 -30
- package/tsconfig.json +0 -23
- package/tsup.config.ts +0 -16
- package/vitest.config.ts +0 -25
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IndicatorDAG — Directed Acyclic Graph for indicator computation.
|
|
3
|
+
*
|
|
4
|
+
* Allows indicators to be chained: e.g. EMA can consume SMA's output instead
|
|
5
|
+
* of raw OHLCV prices. Circular dependencies are rejected at registration time.
|
|
6
|
+
* Results are cached and recomputed only when inputs actually change.
|
|
7
|
+
*
|
|
8
|
+
* Incremental fast-path: when a single bar is appended, SMA and EMA extend
|
|
9
|
+
* their result by exactly one point in O(1) time.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const dag = new IndicatorDAG();
|
|
14
|
+
* dag.addNode('sma1', { type: 'sma', params: { period: 20 } });
|
|
15
|
+
* dag.addNode('ema1', { type: 'ema', params: { period: 10 }, sourceId: 'sma1' });
|
|
16
|
+
*
|
|
17
|
+
* dag.execute(bars); // SMA first, then EMA(SMA)
|
|
18
|
+
* const result = dag.getResult('ema1'); // { kind: 'series', points: [...] }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { extractField, computeSMAFromSeries, computeEMAFromSeries, computeWMAFromSeries, computeRSI, computeMACD, computeVolume, } from '../core/IndicatorEngine';
|
|
22
|
+
import { TScriptIndicator } from '../tscript/TScriptIndicator';
|
|
23
|
+
function _configEqual(a, b) {
|
|
24
|
+
return (a.type === b.type &&
|
|
25
|
+
a.sourceId === b.sourceId &&
|
|
26
|
+
a.sourceField === b.sourceField &&
|
|
27
|
+
JSON.stringify(a.params) === JSON.stringify(b.params));
|
|
28
|
+
}
|
|
29
|
+
// ─── IndicatorDAG ─────────────────────────────────────────────────────────────
|
|
30
|
+
export class IndicatorDAG {
|
|
31
|
+
_nodes = new Map();
|
|
32
|
+
// ─── Registration ───────────────────────────────────────────────────────────
|
|
33
|
+
/**
|
|
34
|
+
* Registers a node for `id`.
|
|
35
|
+
* If the node already exists its config is updated if changed.
|
|
36
|
+
* Throws `'[IndicatorDAG] Circular dependency detected'` if adding `id`
|
|
37
|
+
* would form a cycle.
|
|
38
|
+
*/
|
|
39
|
+
addNode(id, config) {
|
|
40
|
+
const existing = this._nodes.get(id);
|
|
41
|
+
if (existing) {
|
|
42
|
+
if (!_configEqual(existing.config, config)) {
|
|
43
|
+
existing.config = config;
|
|
44
|
+
existing.dirty = true;
|
|
45
|
+
existing.result = null;
|
|
46
|
+
this._markDependentsDirty(id);
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this._nodes.set(id, {
|
|
51
|
+
id,
|
|
52
|
+
config,
|
|
53
|
+
result: null,
|
|
54
|
+
lastBarsLen: -1,
|
|
55
|
+
lastInputLen: -1,
|
|
56
|
+
lastBarClose: NaN,
|
|
57
|
+
dirty: true,
|
|
58
|
+
});
|
|
59
|
+
// Validate immediately — undo and rethrow if a cycle is formed.
|
|
60
|
+
try {
|
|
61
|
+
this._topoSort();
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
this._nodes.delete(id);
|
|
65
|
+
throw e;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Removes `id` and marks any indicators that depended on it as dirty. */
|
|
69
|
+
removeNode(id) {
|
|
70
|
+
this._nodes.delete(id);
|
|
71
|
+
this._markDependentsDirty(id);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Syncs the DAG to exactly the provided indicator list.
|
|
75
|
+
* Adds new nodes, removes obsolete ones, updates changed configs.
|
|
76
|
+
* Throws if the resulting graph contains a cycle.
|
|
77
|
+
*/
|
|
78
|
+
sync(indicators) {
|
|
79
|
+
const incoming = new Set(indicators.map((i) => i.id));
|
|
80
|
+
// Remove nodes no longer present.
|
|
81
|
+
for (const id of [...this._nodes.keys()]) {
|
|
82
|
+
if (!incoming.has(id)) {
|
|
83
|
+
this._nodes.delete(id);
|
|
84
|
+
this._markDependentsDirty(id);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Add or refresh nodes.
|
|
88
|
+
for (const { id, config } of indicators) {
|
|
89
|
+
const node = this._nodes.get(id);
|
|
90
|
+
if (!node) {
|
|
91
|
+
this._nodes.set(id, {
|
|
92
|
+
id,
|
|
93
|
+
config,
|
|
94
|
+
result: null,
|
|
95
|
+
lastBarsLen: -1,
|
|
96
|
+
lastInputLen: -1,
|
|
97
|
+
lastBarClose: NaN,
|
|
98
|
+
dirty: true,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (!_configEqual(node.config, config)) {
|
|
102
|
+
node.config = config;
|
|
103
|
+
node.dirty = true;
|
|
104
|
+
node.result = null;
|
|
105
|
+
this._markDependentsDirty(id);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Validate the whole graph (after all additions) — throws on cycle.
|
|
109
|
+
this._topoSort();
|
|
110
|
+
}
|
|
111
|
+
// ─── Execution ──────────────────────────────────────────────────────────────
|
|
112
|
+
/**
|
|
113
|
+
* Runs all dirty nodes in topological order.
|
|
114
|
+
*
|
|
115
|
+
* When the OHLCV array grew by exactly one bar since a node's last run and
|
|
116
|
+
* its input series also grew by one, SMA and EMA use an O(1) incremental
|
|
117
|
+
* append path. All other types fall back to a full recompute.
|
|
118
|
+
*
|
|
119
|
+
* @returns `true` if any node was executed.
|
|
120
|
+
*/
|
|
121
|
+
execute(bars) {
|
|
122
|
+
const order = this._topoSort();
|
|
123
|
+
let executed = false;
|
|
124
|
+
for (const id of order) {
|
|
125
|
+
const node = this._nodes.get(id);
|
|
126
|
+
if (!this._needsRun(node, bars))
|
|
127
|
+
continue;
|
|
128
|
+
executed = true;
|
|
129
|
+
const input = this._resolveSource(node, bars);
|
|
130
|
+
const canIncremental = node.result !== null &&
|
|
131
|
+
node.result.kind === 'series' &&
|
|
132
|
+
node.result.points.length > 0 &&
|
|
133
|
+
input.length === node.lastInputLen + 1 &&
|
|
134
|
+
bars.length === node.lastBarsLen + 1;
|
|
135
|
+
node.result = canIncremental
|
|
136
|
+
? this._appendOne(node, input, node.result.points, bars)
|
|
137
|
+
: this._computeFull(node, input, bars);
|
|
138
|
+
node.dirty = false;
|
|
139
|
+
node.lastBarsLen = bars.length;
|
|
140
|
+
node.lastInputLen = input.length;
|
|
141
|
+
node.lastBarClose = bars.length > 0 ? bars[bars.length - 1].close : NaN;
|
|
142
|
+
}
|
|
143
|
+
return executed;
|
|
144
|
+
}
|
|
145
|
+
/** Forces every node to recompute on the next `execute()` call. */
|
|
146
|
+
invalidateAll() {
|
|
147
|
+
for (const node of this._nodes.values()) {
|
|
148
|
+
node.dirty = true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
isDirty() {
|
|
152
|
+
return [...this._nodes.values()].some((n) => n.dirty);
|
|
153
|
+
}
|
|
154
|
+
// ─── Results ────────────────────────────────────────────────────────────────
|
|
155
|
+
getResult(id) {
|
|
156
|
+
return this._nodes.get(id)?.result ?? null;
|
|
157
|
+
}
|
|
158
|
+
getAllResults() {
|
|
159
|
+
const out = new Map();
|
|
160
|
+
for (const [id, node] of this._nodes) {
|
|
161
|
+
if (node.result !== null)
|
|
162
|
+
out.set(id, node.result);
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
// ─── Topological sort (Kahn's algorithm) ────────────────────────────────────
|
|
167
|
+
/**
|
|
168
|
+
* Returns node ids in topological execution order.
|
|
169
|
+
* Throws `'[IndicatorDAG] Circular dependency detected'` when a cycle exists.
|
|
170
|
+
*/
|
|
171
|
+
_topoSort() {
|
|
172
|
+
const inDeg = new Map();
|
|
173
|
+
const adj = new Map(); // sourceId → dependent ids
|
|
174
|
+
for (const node of this._nodes.values()) {
|
|
175
|
+
if (!inDeg.has(node.id))
|
|
176
|
+
inDeg.set(node.id, 0);
|
|
177
|
+
const src = node.config.sourceId;
|
|
178
|
+
if (src !== undefined && this._nodes.has(src)) {
|
|
179
|
+
if (!adj.has(src))
|
|
180
|
+
adj.set(src, []);
|
|
181
|
+
adj.get(src).push(node.id);
|
|
182
|
+
inDeg.set(node.id, (inDeg.get(node.id) ?? 0) + 1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const queue = [...this._nodes.keys()].filter((id) => (inDeg.get(id) ?? 0) === 0);
|
|
186
|
+
const order = [];
|
|
187
|
+
while (queue.length > 0) {
|
|
188
|
+
const curr = queue.shift();
|
|
189
|
+
order.push(curr);
|
|
190
|
+
for (const dep of adj.get(curr) ?? []) {
|
|
191
|
+
const d = (inDeg.get(dep) ?? 0) - 1;
|
|
192
|
+
inDeg.set(dep, d);
|
|
193
|
+
if (d === 0)
|
|
194
|
+
queue.push(dep);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (order.length !== this._nodes.size) {
|
|
198
|
+
throw new Error('[IndicatorDAG] Circular dependency detected');
|
|
199
|
+
}
|
|
200
|
+
return order;
|
|
201
|
+
}
|
|
202
|
+
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
203
|
+
_needsRun(node, bars) {
|
|
204
|
+
if (node.dirty || node.result === null)
|
|
205
|
+
return true;
|
|
206
|
+
if (bars.length !== node.lastBarsLen)
|
|
207
|
+
return true;
|
|
208
|
+
// Rerun when the forming bar's close has changed (live WS tick updating in-place).
|
|
209
|
+
if (bars.length > 0 && bars[bars.length - 1].close !== node.lastBarClose)
|
|
210
|
+
return true;
|
|
211
|
+
// Rerun if the source indicator has newer data.
|
|
212
|
+
const srcId = node.config.sourceId;
|
|
213
|
+
if (srcId !== undefined) {
|
|
214
|
+
const src = this._nodes.get(srcId);
|
|
215
|
+
if (src && src.lastBarsLen !== node.lastBarsLen)
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
/** Returns the ordered input series for `node` — either from a source indicator or raw price field. */
|
|
221
|
+
_resolveSource(node, bars) {
|
|
222
|
+
const srcId = node.config.sourceId;
|
|
223
|
+
if (srcId !== undefined) {
|
|
224
|
+
const src = this._nodes.get(srcId);
|
|
225
|
+
if (src?.result?.kind === 'series')
|
|
226
|
+
return src.result.points;
|
|
227
|
+
// Source is missing, MACD, or not yet computed — fall through to raw bars.
|
|
228
|
+
}
|
|
229
|
+
const field = node.config.sourceField ?? 'close';
|
|
230
|
+
return bars.map((b) => ({ time: b.time, value: extractField(b, field) }));
|
|
231
|
+
}
|
|
232
|
+
/** Full recompute of a node's result. */
|
|
233
|
+
_computeFull(node, input, bars) {
|
|
234
|
+
const p = (node.config.params ?? {});
|
|
235
|
+
switch (node.config.type) {
|
|
236
|
+
case 'sma':
|
|
237
|
+
return { kind: 'series', points: computeSMAFromSeries(input, p['period'] ?? 20) };
|
|
238
|
+
case 'ema':
|
|
239
|
+
return { kind: 'series', points: computeEMAFromSeries(input, p['period'] ?? 20) };
|
|
240
|
+
case 'wma':
|
|
241
|
+
return { kind: 'series', points: computeWMAFromSeries(input, p['period'] ?? 20) };
|
|
242
|
+
case 'rsi':
|
|
243
|
+
return { kind: 'series', points: computeRSI(bars, p['period'] ?? 14) };
|
|
244
|
+
case 'volume':
|
|
245
|
+
return { kind: 'series', points: computeVolume(bars) };
|
|
246
|
+
case 'macd':
|
|
247
|
+
return {
|
|
248
|
+
kind: 'macd',
|
|
249
|
+
points: computeMACD(bars, p['fast'] ?? 12, p['slow'] ?? 26, p['signal'] ?? 9),
|
|
250
|
+
};
|
|
251
|
+
case 'bbands': {
|
|
252
|
+
// Bollinger Bands — represented as three series; store middle band as primary.
|
|
253
|
+
const period = p['period'] ?? 20;
|
|
254
|
+
const sma = computeSMAFromSeries(input, period);
|
|
255
|
+
return { kind: 'series', points: sma }; // renderer handles bbands specially
|
|
256
|
+
}
|
|
257
|
+
case 'script': {
|
|
258
|
+
const src = node.config.script;
|
|
259
|
+
if (!src)
|
|
260
|
+
return { kind: 'series', points: [] };
|
|
261
|
+
// Compile once, reuse across bars.
|
|
262
|
+
if (!node.scriptRuntime) {
|
|
263
|
+
node.scriptRuntime = new TScriptIndicator(src);
|
|
264
|
+
}
|
|
265
|
+
const plots = node.scriptRuntime.run(bars);
|
|
266
|
+
// First plot() call becomes the primary series.
|
|
267
|
+
return { kind: 'series', points: plots[0] ?? [] };
|
|
268
|
+
}
|
|
269
|
+
default:
|
|
270
|
+
// Identity passthrough for unknown / future types.
|
|
271
|
+
return { kind: 'series', points: [...input] };
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* O(1) append of a single new point.
|
|
276
|
+
* Only called when `canIncremental` is true (input grew by exactly one element).
|
|
277
|
+
* Falls back to `_computeFull` for types that have no O(1) path.
|
|
278
|
+
*/
|
|
279
|
+
_appendOne(node, input, prev, bars) {
|
|
280
|
+
const p = (node.config.params ?? {});
|
|
281
|
+
const last = input[input.length - 1];
|
|
282
|
+
switch (node.config.type) {
|
|
283
|
+
case 'sma': {
|
|
284
|
+
const period = p['period'] ?? 20;
|
|
285
|
+
if (input.length < period || prev.length === 0) {
|
|
286
|
+
return this._computeFull(node, input, bars);
|
|
287
|
+
}
|
|
288
|
+
// O(1): newSMA = (prevSMA * period - outgoing + incoming) / period
|
|
289
|
+
const prevSMA = prev[prev.length - 1].value;
|
|
290
|
+
const outgoing = input[input.length - 1 - period]?.value ?? 0;
|
|
291
|
+
const newValue = (prevSMA * period - outgoing + last.value) / period;
|
|
292
|
+
return { kind: 'series', points: [...prev, { time: last.time, value: newValue }] };
|
|
293
|
+
}
|
|
294
|
+
case 'ema': {
|
|
295
|
+
const period = p['period'] ?? 20;
|
|
296
|
+
const k = 2 / (period + 1);
|
|
297
|
+
const prevEMA = prev[prev.length - 1].value;
|
|
298
|
+
const newValue = last.value * k + prevEMA * (1 - k);
|
|
299
|
+
return { kind: 'series', points: [...prev, { time: last.time, value: newValue }] };
|
|
300
|
+
}
|
|
301
|
+
default:
|
|
302
|
+
return this._computeFull(node, input, bars);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/** Recursively marks all indicators that depend on `sourceId` as dirty. */
|
|
306
|
+
_markDependentsDirty(sourceId) {
|
|
307
|
+
for (const node of this._nodes.values()) {
|
|
308
|
+
if (node.config.sourceId === sourceId && !node.dirty) {
|
|
309
|
+
node.dirty = true;
|
|
310
|
+
node.result = null;
|
|
311
|
+
this._markDependentsDirty(node.id);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=IndicatorDAG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndicatorDAG.js","sourceRoot":"","sources":["../../src/api/IndicatorDAG.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IndicatorConfig, IndicatorInstance } from '@forgecharts/types';
|
|
2
|
+
/**
|
|
3
|
+
* IndicatorRegistry — tracks active indicator instances for a chart.
|
|
4
|
+
* Rendering is a separate concern (handled by sub-pane renderers, out of SDK scope).
|
|
5
|
+
*/
|
|
6
|
+
export declare class IndicatorRegistry {
|
|
7
|
+
private readonly _map;
|
|
8
|
+
/**
|
|
9
|
+
* Registers a new indicator and returns its opaque id.
|
|
10
|
+
*/
|
|
11
|
+
add(config: IndicatorConfig): string;
|
|
12
|
+
/**
|
|
13
|
+
* Removes an indicator by id.
|
|
14
|
+
* @returns `true` if the indicator existed and was removed.
|
|
15
|
+
*/
|
|
16
|
+
remove(id: string): boolean;
|
|
17
|
+
get(id: string): IndicatorInstance | undefined;
|
|
18
|
+
has(id: string): boolean;
|
|
19
|
+
all(): readonly IndicatorInstance[];
|
|
20
|
+
clear(): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=IndicatorRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndicatorRegistry.d.ts","sourceRoot":"","sources":["../../src/api/IndicatorRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAO7E;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwC;IAE7D;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM;IAMpC;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI9C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,GAAG,IAAI,SAAS,iBAAiB,EAAE;IAInC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
let _counter = 0;
|
|
2
|
+
function nextId() {
|
|
3
|
+
return `indicator_${(++_counter).toString().padStart(4, '0')}`;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* IndicatorRegistry — tracks active indicator instances for a chart.
|
|
7
|
+
* Rendering is a separate concern (handled by sub-pane renderers, out of SDK scope).
|
|
8
|
+
*/
|
|
9
|
+
export class IndicatorRegistry {
|
|
10
|
+
_map = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Registers a new indicator and returns its opaque id.
|
|
13
|
+
*/
|
|
14
|
+
add(config) {
|
|
15
|
+
const id = nextId();
|
|
16
|
+
this._map.set(id, { id, config });
|
|
17
|
+
return id;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Removes an indicator by id.
|
|
21
|
+
* @returns `true` if the indicator existed and was removed.
|
|
22
|
+
*/
|
|
23
|
+
remove(id) {
|
|
24
|
+
return this._map.delete(id);
|
|
25
|
+
}
|
|
26
|
+
get(id) {
|
|
27
|
+
return this._map.get(id);
|
|
28
|
+
}
|
|
29
|
+
has(id) {
|
|
30
|
+
return this._map.has(id);
|
|
31
|
+
}
|
|
32
|
+
all() {
|
|
33
|
+
return [...this._map.values()];
|
|
34
|
+
}
|
|
35
|
+
clear() {
|
|
36
|
+
this._map.clear();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=IndicatorRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndicatorRegistry.js","sourceRoot":"","sources":["../../src/api/IndicatorRegistry.ts"],"names":[],"mappings":"AAEA,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,SAAS,MAAM;IACb,OAAO,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACX,IAAI,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE7D;;OAEG;IACH,GAAG,CAAC,MAAuB;QACzB,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAClC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ChartLayout, ChartInterval, ChartTheme, IndicatorInstance, Drawing, Viewport, PaneDescriptor } from '@forgecharts/types';
|
|
2
|
+
/**
|
|
3
|
+
* LayoutManager — pure serialisation / deserialisation of chart state.
|
|
4
|
+
* No side effects; state mutations are the caller's responsibility.
|
|
5
|
+
*/
|
|
6
|
+
export declare class LayoutManager {
|
|
7
|
+
/**
|
|
8
|
+
* Produces a serialisable snapshot of the current chart state.
|
|
9
|
+
*/
|
|
10
|
+
static save(params: {
|
|
11
|
+
symbol: string;
|
|
12
|
+
interval: ChartInterval;
|
|
13
|
+
theme: ChartTheme;
|
|
14
|
+
indicators: readonly IndicatorInstance[];
|
|
15
|
+
drawings: readonly Drawing[];
|
|
16
|
+
viewport?: Viewport;
|
|
17
|
+
panes?: readonly PaneDescriptor[];
|
|
18
|
+
}): ChartLayout;
|
|
19
|
+
/**
|
|
20
|
+
* Serialises a layout to a JSON string safe for `localStorage` / remote persistence.
|
|
21
|
+
*/
|
|
22
|
+
static toJSON(layout: ChartLayout): string;
|
|
23
|
+
/**
|
|
24
|
+
* Parses a JSON string back into a ChartLayout.
|
|
25
|
+
* Throws if the string is malformed.
|
|
26
|
+
*/
|
|
27
|
+
static fromJSON(raw: string): ChartLayout;
|
|
28
|
+
private static _isLayout;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=LayoutManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayoutManager.d.ts","sourceRoot":"","sources":["../../src/api/LayoutManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,OAAO,EACP,QAAQ,EACR,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,aAAa,CAAC;QACxB,KAAK,EAAE,UAAU,CAAC;QAClB,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;QACzC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;QAC7B,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;KACnC,GAAG,WAAW;IAaf;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;IAI1C;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAQzC,OAAO,CAAC,MAAM,CAAC,SAAS;CAazB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LayoutManager — pure serialisation / deserialisation of chart state.
|
|
3
|
+
* No side effects; state mutations are the caller's responsibility.
|
|
4
|
+
*/
|
|
5
|
+
export class LayoutManager {
|
|
6
|
+
/**
|
|
7
|
+
* Produces a serialisable snapshot of the current chart state.
|
|
8
|
+
*/
|
|
9
|
+
static save(params) {
|
|
10
|
+
return {
|
|
11
|
+
symbol: params.symbol,
|
|
12
|
+
interval: params.interval,
|
|
13
|
+
theme: params.theme,
|
|
14
|
+
indicators: [...params.indicators],
|
|
15
|
+
drawings: [...params.drawings],
|
|
16
|
+
...(params.viewport !== undefined ? { viewport: params.viewport } : {}),
|
|
17
|
+
...(params.panes !== undefined && params.panes.length > 0 ? { panes: [...params.panes] } : {}),
|
|
18
|
+
savedAt: Date.now(),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Serialises a layout to a JSON string safe for `localStorage` / remote persistence.
|
|
23
|
+
*/
|
|
24
|
+
static toJSON(layout) {
|
|
25
|
+
return JSON.stringify(layout);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parses a JSON string back into a ChartLayout.
|
|
29
|
+
* Throws if the string is malformed.
|
|
30
|
+
*/
|
|
31
|
+
static fromJSON(raw) {
|
|
32
|
+
const parsed = JSON.parse(raw);
|
|
33
|
+
if (!LayoutManager._isLayout(parsed)) {
|
|
34
|
+
throw new Error('[ForgeCharts] LayoutManager.fromJSON: invalid layout schema');
|
|
35
|
+
}
|
|
36
|
+
return parsed;
|
|
37
|
+
}
|
|
38
|
+
static _isLayout(v) {
|
|
39
|
+
if (typeof v !== 'object' || v === null)
|
|
40
|
+
return false;
|
|
41
|
+
const l = v;
|
|
42
|
+
return (typeof l['symbol'] === 'string' &&
|
|
43
|
+
typeof l['interval'] === 'string' &&
|
|
44
|
+
typeof l['theme'] === 'string' &&
|
|
45
|
+
Array.isArray(l['indicators']) &&
|
|
46
|
+
Array.isArray(l['drawings']) &&
|
|
47
|
+
typeof l['savedAt'] === 'number' &&
|
|
48
|
+
(l['panes'] === undefined || Array.isArray(l['panes'])));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=LayoutManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayoutManager.js","sourceRoot":"","sources":["../../src/api/LayoutManager.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,MAAM,OAAO,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAQX;QACC,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;YAClC,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC9B,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;SACpB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,MAAmB;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,GAAW;QACzB,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,CAAU;QACjC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;QACvC,OAAO,CACL,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;YAC/B,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ;YACjC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ;YAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ;YAChC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CACxD,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { PaneDescriptor } from '@forgecharts/types';
|
|
2
|
+
/**
|
|
3
|
+
* PaneManager — manages the collection of sub-pane (indicator panel) descriptors.
|
|
4
|
+
*
|
|
5
|
+
* Each `PaneDescriptor` carries:
|
|
6
|
+
* - a stable `id`
|
|
7
|
+
* - a `heightFraction` (0–1, all panes sum to 1)
|
|
8
|
+
* - the `indicatorIds` assigned to that pane
|
|
9
|
+
*
|
|
10
|
+
* Height redistribution is proportional: when a pane is added/removed/resized,
|
|
11
|
+
* the remaining panes absorb or donate height proportionally to their current sizes.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PaneManager {
|
|
14
|
+
private _panes;
|
|
15
|
+
getPanes(): readonly PaneDescriptor[];
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new pane, distributing total height evenly across all panes.
|
|
18
|
+
* @returns The new pane's id.
|
|
19
|
+
*/
|
|
20
|
+
createPane(label?: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Removes a pane and redistributes its height fraction to remaining panes.
|
|
23
|
+
*/
|
|
24
|
+
removePane(id: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Assigns an indicator to a pane, removing it from any previous pane first.
|
|
27
|
+
*/
|
|
28
|
+
assignIndicator(indicatorId: string, paneId: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Unassigns an indicator from whichever pane currently holds it.
|
|
31
|
+
*/
|
|
32
|
+
unassignIndicator(indicatorId: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Resizes a pane by setting its `heightFraction`, clamped to [0.05, 0.9].
|
|
35
|
+
* Remaining panes absorb the difference proportionally.
|
|
36
|
+
*/
|
|
37
|
+
resizePane(id: string, newFraction: number): void;
|
|
38
|
+
serialize(): readonly PaneDescriptor[];
|
|
39
|
+
restore(panes: readonly PaneDescriptor[]): void;
|
|
40
|
+
clear(): void;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=PaneManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaneManager.d.ts","sourceRoot":"","sources":["../../src/api/PaneManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAOzD;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAwB;IAEtC,QAAQ,IAAI,SAAS,cAAc,EAAE;IAIrC;;;OAGG;IACH,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAiBlC;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAmB5B;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAY1D;;OAEG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAO5C;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAoBjD,SAAS,IAAI,SAAS,cAAc,EAAE;IAItC,OAAO,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI;IAI/C,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
let _paneId = 0;
|
|
2
|
+
function _nextId() {
|
|
3
|
+
return `pane-${(++_paneId).toString()}`;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* PaneManager — manages the collection of sub-pane (indicator panel) descriptors.
|
|
7
|
+
*
|
|
8
|
+
* Each `PaneDescriptor` carries:
|
|
9
|
+
* - a stable `id`
|
|
10
|
+
* - a `heightFraction` (0–1, all panes sum to 1)
|
|
11
|
+
* - the `indicatorIds` assigned to that pane
|
|
12
|
+
*
|
|
13
|
+
* Height redistribution is proportional: when a pane is added/removed/resized,
|
|
14
|
+
* the remaining panes absorb or donate height proportionally to their current sizes.
|
|
15
|
+
*/
|
|
16
|
+
export class PaneManager {
|
|
17
|
+
_panes = [];
|
|
18
|
+
getPanes() {
|
|
19
|
+
return this._panes;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates a new pane, distributing total height evenly across all panes.
|
|
23
|
+
* @returns The new pane's id.
|
|
24
|
+
*/
|
|
25
|
+
createPane(label) {
|
|
26
|
+
const id = _nextId();
|
|
27
|
+
const newFraction = 1 / (this._panes.length + 1);
|
|
28
|
+
// Shrink existing panes proportionally
|
|
29
|
+
this._panes = this._panes.map((p) => ({
|
|
30
|
+
...p,
|
|
31
|
+
heightFraction: p.heightFraction * (1 - newFraction),
|
|
32
|
+
}));
|
|
33
|
+
this._panes.push({
|
|
34
|
+
id,
|
|
35
|
+
heightFraction: newFraction,
|
|
36
|
+
indicatorIds: [],
|
|
37
|
+
...(label !== undefined ? { label } : {}),
|
|
38
|
+
});
|
|
39
|
+
return id;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Removes a pane and redistributes its height fraction to remaining panes.
|
|
43
|
+
*/
|
|
44
|
+
removePane(id) {
|
|
45
|
+
const idx = this._panes.findIndex((p) => p.id === id);
|
|
46
|
+
if (idx === -1)
|
|
47
|
+
return;
|
|
48
|
+
const freed = this._panes[idx].heightFraction;
|
|
49
|
+
this._panes.splice(idx, 1);
|
|
50
|
+
if (this._panes.length > 0) {
|
|
51
|
+
const total = this._panes.reduce((s, p) => s + p.heightFraction, 0);
|
|
52
|
+
if (total > 0) {
|
|
53
|
+
this._panes = this._panes.map((p) => ({
|
|
54
|
+
...p,
|
|
55
|
+
heightFraction: p.heightFraction + freed * (p.heightFraction / total),
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const even = 1 / this._panes.length;
|
|
60
|
+
this._panes = this._panes.map((p) => ({ ...p, heightFraction: even }));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Assigns an indicator to a pane, removing it from any previous pane first.
|
|
66
|
+
*/
|
|
67
|
+
assignIndicator(indicatorId, paneId) {
|
|
68
|
+
// Remove from every pane first (mutual exclusion)
|
|
69
|
+
this._panes = this._panes.map((p) => ({
|
|
70
|
+
...p,
|
|
71
|
+
indicatorIds: p.indicatorIds.filter((iid) => iid !== indicatorId),
|
|
72
|
+
}));
|
|
73
|
+
const idx = this._panes.findIndex((p) => p.id === paneId);
|
|
74
|
+
if (idx === -1)
|
|
75
|
+
return;
|
|
76
|
+
const pane = this._panes[idx];
|
|
77
|
+
this._panes[idx] = { ...pane, indicatorIds: [...pane.indicatorIds, indicatorId] };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Unassigns an indicator from whichever pane currently holds it.
|
|
81
|
+
*/
|
|
82
|
+
unassignIndicator(indicatorId) {
|
|
83
|
+
this._panes = this._panes.map((p) => ({
|
|
84
|
+
...p,
|
|
85
|
+
indicatorIds: p.indicatorIds.filter((iid) => iid !== indicatorId),
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Resizes a pane by setting its `heightFraction`, clamped to [0.05, 0.9].
|
|
90
|
+
* Remaining panes absorb the difference proportionally.
|
|
91
|
+
*/
|
|
92
|
+
resizePane(id, newFraction) {
|
|
93
|
+
const clamped = Math.min(Math.max(newFraction, 0.05), 0.9);
|
|
94
|
+
const idx = this._panes.findIndex((p) => p.id === id);
|
|
95
|
+
if (idx === -1)
|
|
96
|
+
return;
|
|
97
|
+
const old = this._panes[idx].heightFraction;
|
|
98
|
+
const delta = clamped - old;
|
|
99
|
+
const othersTotal = this._panes.reduce((s, p, i) => (i !== idx ? s + p.heightFraction : s), 0);
|
|
100
|
+
this._panes = this._panes.map((p, i) => {
|
|
101
|
+
if (i === idx)
|
|
102
|
+
return { ...p, heightFraction: clamped };
|
|
103
|
+
const share = othersTotal > 0
|
|
104
|
+
? p.heightFraction / othersTotal
|
|
105
|
+
: 1 / Math.max(1, this._panes.length - 1);
|
|
106
|
+
return { ...p, heightFraction: Math.max(0.05, p.heightFraction - delta * share) };
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
serialize() {
|
|
110
|
+
return [...this._panes];
|
|
111
|
+
}
|
|
112
|
+
restore(panes) {
|
|
113
|
+
this._panes = [...panes];
|
|
114
|
+
}
|
|
115
|
+
clear() {
|
|
116
|
+
this._panes = [];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=PaneManager.js.map
|