@forgecharts/sdk 1.1.27 → 1.1.29
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__/candleInvariant.test.d.ts +20 -0
- package/dist/__tests__/candleInvariant.test.d.ts.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/dist/__tests__/timeframeBoundary.test.d.ts +17 -0
- package/dist/__tests__/timeframeBoundary.test.d.ts.map +1 -0
- package/dist/api/DrawingManager.d.ts +20 -0
- package/dist/api/DrawingManager.d.ts.map +1 -0
- package/dist/api/EventBus.d.ts +19 -0
- package/dist/api/EventBus.d.ts.map +1 -0
- package/dist/api/IndicatorDAG.d.ts +85 -0
- package/dist/api/IndicatorDAG.d.ts.map +1 -0
- package/dist/api/IndicatorRegistry.d.ts +22 -0
- package/dist/api/IndicatorRegistry.d.ts.map +1 -0
- package/dist/api/LayoutManager.d.ts +30 -0
- package/dist/api/LayoutManager.d.ts.map +1 -0
- package/dist/api/PaneManager.d.ts +42 -0
- package/dist/api/PaneManager.d.ts.map +1 -0
- package/dist/api/ReferenceAPI.d.ts +78 -0
- package/dist/api/ReferenceAPI.d.ts.map +1 -0
- package/dist/api/TChart.d.ts +345 -0
- package/dist/api/TChart.d.ts.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/vertical.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/vertical.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/crosshair.ts → dist/api/drawing tools/pointers menu/crosshair.d.ts } +8 -9
- package/dist/api/drawing tools/pointers menu/crosshair.d.ts.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/demonstration.ts → dist/api/drawing tools/pointers menu/demonstration.d.ts } +12 -17
- package/dist/api/drawing tools/pointers menu/demonstration.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/dot.ts → dist/api/drawing tools/pointers menu/dot.d.ts } +10 -13
- package/dist/api/drawing tools/pointers menu/dot.d.ts.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/text.d.ts +4 -0
- package/dist/api/drawing tools/shapes menu/text.d.ts.map +1 -0
- package/dist/api/drawingUtils.d.ts +22 -0
- package/dist/api/drawingUtils.d.ts.map +1 -0
- package/dist/core/CanvasLayer.d.ts +26 -0
- package/dist/core/CanvasLayer.d.ts.map +1 -0
- package/dist/core/Chart.d.ts +164 -0
- package/dist/core/Chart.d.ts.map +1 -0
- package/dist/core/CoordTransform.d.ts +168 -0
- package/dist/core/CoordTransform.d.ts.map +1 -0
- package/dist/core/Crosshair.d.ts +30 -0
- package/dist/core/Crosshair.d.ts.map +1 -0
- package/dist/core/IndicatorEngine.d.ts +51 -0
- package/dist/core/IndicatorEngine.d.ts.map +1 -0
- package/dist/core/InteractionManager.d.ts +197 -0
- package/dist/core/InteractionManager.d.ts.map +1 -0
- package/dist/core/PriceScale.d.ts +27 -0
- package/dist/core/PriceScale.d.ts.map +1 -0
- package/dist/core/Series.d.ts +40 -0
- package/dist/core/Series.d.ts.map +1 -0
- package/dist/core/TimeScale.d.ts +43 -0
- package/dist/core/TimeScale.d.ts.map +1 -0
- package/dist/datafeed/DatafeedConnector.d.ts +89 -0
- package/dist/datafeed/DatafeedConnector.d.ts.map +1 -0
- package/dist/engine/CandleEngine.d.ts +207 -0
- package/dist/engine/CandleEngine.d.ts.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/candleInvariants.d.ts +66 -0
- package/dist/engine/candleInvariants.d.ts.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/timeframeUtils.d.ts +80 -0
- package/dist/engine/timeframeUtils.d.ts.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8101 -0
- package/dist/index.js.map +1 -0
- package/{src/internal.ts → dist/internal.d.ts} +1 -13
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +8852 -0
- 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/LicenseManager.d.ts +55 -0
- package/dist/licensing/LicenseManager.d.ts.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__/LicenseManager.test.d.ts +12 -0
- package/dist/licensing/__tests__/LicenseManager.test.d.ts.map +1 -0
- package/dist/licensing/licenseTypes.d.ts +18 -0
- package/dist/licensing/licenseTypes.d.ts.map +1 -0
- package/dist/pine/PineCompiler.d.ts +35 -0
- package/dist/pine/PineCompiler.d.ts.map +1 -0
- package/dist/pine/diagnostics.d.ts +20 -0
- package/dist/pine/diagnostics.d.ts.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/pine-ast.d.ts +142 -0
- package/dist/pine/pine-ast.d.ts.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-parser.d.ts +51 -0
- package/dist/pine/pine-parser.d.ts.map +1 -0
- package/dist/pine/pine-transpiler.d.ts +33 -0
- package/dist/pine/pine-transpiler.d.ts.map +1 -0
- package/dist/pixi/LayerName.d.ts +18 -0
- package/dist/pixi/LayerName.d.ts.map +1 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts +23 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiChart.d.ts +72 -0
- package/dist/pixi/PixiChart.d.ts.map +1 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts +29 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts +17 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiGridRenderer.d.ts +22 -0
- package/dist/pixi/PixiGridRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiLayerManager.d.ts +56 -0
- package/dist/pixi/PixiLayerManager.d.ts.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/ChartContextMenu.d.ts +18 -0
- package/dist/react/canvas/ChartContextMenu.d.ts.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/IndicatorLabel.d.ts +21 -0
- package/dist/react/canvas/IndicatorLabel.d.ts.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/PointerOverlay.d.ts +23 -0
- package/dist/react/canvas/PointerOverlay.d.ts.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/hooks/useChartCapabilities.d.ts +21 -0
- package/dist/react/hooks/useChartCapabilities.d.ts.map +1 -0
- package/{src/react/index.ts → dist/react/index.d.ts} +2 -23
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +11559 -0
- package/dist/react/index.js.map +1 -0
- package/{src/react/internal.ts → dist/react/internal.d.ts} +2 -26
- package/dist/react/internal.d.ts.map +1 -0
- package/dist/react/internal.js +12148 -0
- 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/trading/TradingBridge.d.ts +86 -0
- package/dist/react/trading/TradingBridge.d.ts.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/FloatingPanel.d.ts +18 -0
- package/dist/react/workspace/FloatingPanel.d.ts.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/LayoutMenu.d.ts +33 -0
- package/dist/react/workspace/LayoutMenu.d.ts.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/TabBar.d.ts +17 -0
- package/dist/react/workspace/TabBar.d.ts.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/RightToolbar.d.ts +8 -0
- package/dist/react/workspace/toolbars/RightToolbar.d.ts.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/renderers/CandlestickRenderer.d.ts +13 -0
- package/dist/renderers/CandlestickRenderer.d.ts.map +1 -0
- package/dist/renderers/HistogramRenderer.d.ts +11 -0
- package/dist/renderers/HistogramRenderer.d.ts.map +1 -0
- package/dist/renderers/LineRenderer.d.ts +12 -0
- package/dist/renderers/LineRenderer.d.ts.map +1 -0
- package/dist/theme/colors.d.ts +4 -0
- package/dist/theme/colors.d.ts.map +1 -0
- package/dist/tools/barDivergenceCheck.d.ts +120 -0
- package/dist/tools/barDivergenceCheck.d.ts.map +1 -0
- package/dist/trading/TradingOverlayStore.d.ts +86 -0
- package/dist/trading/TradingOverlayStore.d.ts.map +1 -0
- package/dist/trading/UnmanagedIngestion.d.ts +91 -0
- package/dist/trading/UnmanagedIngestion.d.ts.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__/TradingOverlayStore.test.d.ts +16 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.d.ts.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/managed/ManagedTradingController.d.ts +110 -0
- package/dist/trading/managed/ManagedTradingController.d.ts.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/managedTypes.d.ts +122 -0
- package/dist/trading/managed/managedTypes.d.ts.map +1 -0
- package/dist/trading/tradingTypes.d.ts +89 -0
- package/dist/trading/tradingTypes.d.ts.map +1 -0
- package/dist/tscript/TScriptIndicator.d.ts +41 -0
- package/dist/tscript/TScriptIndicator.d.ts.map +1 -0
- package/dist/tscript/ast.d.ts +89 -0
- package/dist/tscript/ast.d.ts.map +1 -0
- package/dist/tscript/lexer.d.ts +36 -0
- package/dist/tscript/lexer.d.ts.map +1 -0
- package/dist/tscript/parser.d.ts +50 -0
- package/dist/tscript/parser.d.ts.map +1 -0
- package/dist/tscript/runtime.d.ts +123 -0
- package/dist/tscript/runtime.d.ts.map +1 -0
- package/dist/tscript/series.d.ts +49 -0
- package/dist/tscript/series.d.ts.map +1 -0
- package/dist/types/IChart.d.ts +48 -0
- package/dist/types/IChart.d.ts.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/ISeries.d.ts +26 -0
- package/dist/types/ISeries.d.ts.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__/public-api-surface.ts +0 -76
- 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/pointers menu/cursor.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/engine/timeframeUtils.ts +0 -118
- 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,197 @@
|
|
|
1
|
+
import type { Drawing, OHLCV, HitTestResult, ChartKeyAction, KeyModifiers } from '@forgecharts/types';
|
|
2
|
+
import type { CoordTransform } from './CoordTransform';
|
|
3
|
+
/**
|
|
4
|
+
* Callbacks injected by the owning chart engine.
|
|
5
|
+
* Every handler is optional; omit the ones your engine doesn't need.
|
|
6
|
+
*/
|
|
7
|
+
export type InteractionHandlers = {
|
|
8
|
+
/** User dragged the chart. Apply `transform.pan(dx, dy)` and mark dirty. */
|
|
9
|
+
onPan?: (dx: number, dy: number) => void;
|
|
10
|
+
/**
|
|
11
|
+
* User scrolled the wheel or pressed +/-.
|
|
12
|
+
* `factor > 1` = zoom out (more bars visible); `factor < 1` = zoom in.
|
|
13
|
+
* Apply `transform.zoomTime(factor, originX)` and mark dirty.
|
|
14
|
+
*/
|
|
15
|
+
onZoom?: (factor: number, originX: number) => void;
|
|
16
|
+
/** Mouse moved while not dragging — update the crosshair. */
|
|
17
|
+
onCrosshairMove?: (x: number, y: number, hit: HitTestResult) => void;
|
|
18
|
+
/** Mouse left the chart area — hide the crosshair. */
|
|
19
|
+
onCrosshairHide?: () => void;
|
|
20
|
+
/**
|
|
21
|
+
* Left-click without drag (click threshold not exceeded).
|
|
22
|
+
* Selection state is updated internally before this fires.
|
|
23
|
+
*/
|
|
24
|
+
onSelect?: (x: number, y: number, hit: HitTestResult) => void;
|
|
25
|
+
/** User clicked empty space — selection cleared. */
|
|
26
|
+
onDeselect?: () => void;
|
|
27
|
+
/** Right-click / contextmenu. `e.preventDefault()` is already called. */
|
|
28
|
+
onContextMenu?: (x: number, y: number, hit: HitTestResult) => void;
|
|
29
|
+
/** Recognised keyboard shortcut. */
|
|
30
|
+
onKeyAction?: (action: ChartKeyAction, modifiers: KeyModifiers) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Double-click on the price axis — reset price scale to fit visible bars
|
|
33
|
+
* and scroll to the latest bar.
|
|
34
|
+
*/
|
|
35
|
+
onFitContent?: () => void;
|
|
36
|
+
/** User scrolled the wheel over the price axis — zoom the price scale. */
|
|
37
|
+
onPriceScaleZoom?: (factor: number, originY: number) => void;
|
|
38
|
+
/** User dragged up/down on the price axis strip — drag down expands, up compresses. */
|
|
39
|
+
onPriceAxisDrag?: (dy: number) => void;
|
|
40
|
+
/** Called when the user clicks while a drawing tool is active. */
|
|
41
|
+
onDrawClick?: (x: number, y: number) => void;
|
|
42
|
+
/** Called on every mousemove while a drawing tool is active (preview). */
|
|
43
|
+
onDrawPointerMove?: (x: number, y: number) => void;
|
|
44
|
+
/** Handle drag start — anchor `handleIndex` of drawing `id`. */
|
|
45
|
+
onHandleDragStart?: (id: string, handleIndex: number) => void;
|
|
46
|
+
/** Handle dragged to new pixel position. */
|
|
47
|
+
onHandleDragMove?: (id: string, handleIndex: number, x: number, y: number) => void;
|
|
48
|
+
/** Handle drag released. */
|
|
49
|
+
onHandleDragEnd?: (id: string, handleIndex: number) => void;
|
|
50
|
+
/** Body of drawing `id` grabbed for move. */
|
|
51
|
+
onBodyMoveStart?: (id: string) => void;
|
|
52
|
+
/** Body dragged by (dx, dy) pixel delta. */
|
|
53
|
+
onBodyMoveMove?: (id: string, dx: number, dy: number) => void;
|
|
54
|
+
/** Body move released. */
|
|
55
|
+
onBodyMoveEnd?: (id: string) => void;
|
|
56
|
+
};
|
|
57
|
+
export type InteractionOptions = {
|
|
58
|
+
/** Allow click-drag panning. Defaults to `true`. */
|
|
59
|
+
readonly enablePan?: boolean;
|
|
60
|
+
/** Allow mouse-wheel zooming. Defaults to `true`. */
|
|
61
|
+
readonly enableZoom?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Pointer travel distance (px) below which mousedown + mouseup is treated
|
|
64
|
+
* as a click rather than a pan gesture. Defaults to `4`.
|
|
65
|
+
*/
|
|
66
|
+
readonly clickThreshold?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Zoom multiplier per wheel step.
|
|
69
|
+
* `factor > 1` = zoom out on scroll-down. Defaults to `1.1`.
|
|
70
|
+
*/
|
|
71
|
+
readonly zoomStep?: number;
|
|
72
|
+
/** Pixels to scroll per arrow-key press. Defaults to `40`. */
|
|
73
|
+
readonly keyPanStep?: number;
|
|
74
|
+
/** Zoom multiplier per keyboard +/- press. Defaults to `1.1`. */
|
|
75
|
+
readonly keyZoomStep?: number;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* InteractionManager — the single owner of all DOM input events for a chart.
|
|
79
|
+
*
|
|
80
|
+
* Responsibilities:
|
|
81
|
+
* - Mouse: pan (left-drag), crosshair tracking, click detection
|
|
82
|
+
* - Wheel: zoom
|
|
83
|
+
* - Right-click: contextmenu routing
|
|
84
|
+
* - Keyboard: arrow-key pan, +/- zoom, Esc / Delete shortcuts
|
|
85
|
+
* - Hit-testing: drawings → bars → axis zones
|
|
86
|
+
* - Selection state: tracks the currently selected drawing id
|
|
87
|
+
*
|
|
88
|
+
* Usage:
|
|
89
|
+
* ```ts
|
|
90
|
+
* const interaction = new InteractionManager(
|
|
91
|
+
* canvasElement,
|
|
92
|
+
* chart.transform(),
|
|
93
|
+
* {
|
|
94
|
+
* onPan: (dx, dy) => { transform.pan(dx, dy); markDirty(); },
|
|
95
|
+
* onZoom: (f, ox) => { transform.zoomTime(f, ox); markDirty(); },
|
|
96
|
+
* onCrosshairMove: (x, y) => { crosshair.update(x, y); markDirty(); },
|
|
97
|
+
* onCrosshairHide: () => { crosshair.hide(); markDirty(); },
|
|
98
|
+
* onContextMenu: (x, y, hit) => showMenu(x, y, hit),
|
|
99
|
+
* onKeyAction: (action) => handleKey(action),
|
|
100
|
+
* },
|
|
101
|
+
* );
|
|
102
|
+
*
|
|
103
|
+
* // Call on chart resize:
|
|
104
|
+
* interaction.setTransform(chart.transform());
|
|
105
|
+
*
|
|
106
|
+
* // Feed visible bars for bar-snap hit-testing:
|
|
107
|
+
* interaction.setBars(series.data());
|
|
108
|
+
*
|
|
109
|
+
* // Feed drawings for drawing hit-testing:
|
|
110
|
+
* interaction.setDrawings(drawingManager.all());
|
|
111
|
+
*
|
|
112
|
+
* // Teardown:
|
|
113
|
+
* interaction.destroy();
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export declare class InteractionManager {
|
|
117
|
+
private readonly _el;
|
|
118
|
+
private _transform;
|
|
119
|
+
private readonly _handlers;
|
|
120
|
+
private readonly _opts;
|
|
121
|
+
private _drawings;
|
|
122
|
+
private _bars;
|
|
123
|
+
private _isDragging;
|
|
124
|
+
private _dragStartX;
|
|
125
|
+
private _dragStartY;
|
|
126
|
+
private _lastDragX;
|
|
127
|
+
private _lastDragY;
|
|
128
|
+
/** True once the pointer has moved past `clickThreshold` during a drag. */
|
|
129
|
+
private _hasMoved;
|
|
130
|
+
/** True while the user is dragging on the price axis strip. */
|
|
131
|
+
private _priceAxisDragging;
|
|
132
|
+
private _selectedDrawingId;
|
|
133
|
+
private _drawingMode;
|
|
134
|
+
/** True when the native cursor should be hidden (crosshair / dot / demonstration). */
|
|
135
|
+
private _hideCursor;
|
|
136
|
+
/** Sets cursor style, respecting _hideCursor — 'none' always wins when hiding. */
|
|
137
|
+
private _setCursor;
|
|
138
|
+
/** Set when a drawing is committed mid-mousedown; prevents the paired mouseup from auto-selecting it. */
|
|
139
|
+
private _suppressNextClick;
|
|
140
|
+
private _handleDragId;
|
|
141
|
+
private _handleDragIdx;
|
|
142
|
+
private _bodyMoveId;
|
|
143
|
+
private _bodyMovePrevX;
|
|
144
|
+
private _bodyMovePrevY;
|
|
145
|
+
constructor(element: HTMLElement, transform: CoordTransform, handlers: InteractionHandlers, options?: InteractionOptions);
|
|
146
|
+
/** Swap the transform reference after a resize. */
|
|
147
|
+
setTransform(transform: CoordTransform): void;
|
|
148
|
+
/** Provide the current drawing list for hit-testing. */
|
|
149
|
+
setDrawings(drawings: readonly Drawing[]): void;
|
|
150
|
+
/**
|
|
151
|
+
* Provide the visible bars for bar-snap hit-testing on the primary series.
|
|
152
|
+
* Passing `series.data()` is fine; the manager filters by visible range.
|
|
153
|
+
*/
|
|
154
|
+
setBars(bars: readonly OHLCV[]): void;
|
|
155
|
+
/** Id of the currently selected drawing, or `null`. */
|
|
156
|
+
get selectedDrawingId(): string | null;
|
|
157
|
+
/** Programmatically deselect (e.g. on symbol / timeframe change). */
|
|
158
|
+
clearSelection(): void;
|
|
159
|
+
/**
|
|
160
|
+
* Switches between drawing-tool mode (crosshair cursor, click fires onDrawClick)
|
|
161
|
+
* and normal cursor mode. Also resets any in-progress drag state.
|
|
162
|
+
*/
|
|
163
|
+
/** Hides (`true`) or shows (`false`) the native OS cursor. Used by crosshair, dot, and demonstration modes. */
|
|
164
|
+
setHideCursor(hidden: boolean): void;
|
|
165
|
+
setDrawingMode(active: boolean): void;
|
|
166
|
+
/** Removes all DOM event listeners. Must be called in the chart's `destroy()`. */
|
|
167
|
+
destroy(): void;
|
|
168
|
+
private _attach;
|
|
169
|
+
private _detach;
|
|
170
|
+
private _onMouseDown;
|
|
171
|
+
private _onMouseMove;
|
|
172
|
+
private _onMouseUp;
|
|
173
|
+
private _onMouseLeave;
|
|
174
|
+
private _onWheel;
|
|
175
|
+
private _onDblClick;
|
|
176
|
+
private _onContextMenu;
|
|
177
|
+
private _onKeyDown;
|
|
178
|
+
private _keyToAction;
|
|
179
|
+
private _handleClick;
|
|
180
|
+
private _hitTest;
|
|
181
|
+
private _hitTestHandles;
|
|
182
|
+
private _hitTestDrawings;
|
|
183
|
+
private _distToDrawing;
|
|
184
|
+
/**
|
|
185
|
+
* Returns the nearest visible bar to x-coordinate `mx`, or `null` if no bar
|
|
186
|
+
* falls within half a bar-width.
|
|
187
|
+
*/
|
|
188
|
+
private _hitTestBar;
|
|
189
|
+
/** Distance from point (px, py) to line segment (x1,y1)→(x2,y2). */
|
|
190
|
+
private _distPointToSegment;
|
|
191
|
+
/**
|
|
192
|
+
* Minimum distance from point (px, py) to the perimeter of an
|
|
193
|
+
* axis-aligned rectangle. Returns 0 if the point is inside.
|
|
194
|
+
*/
|
|
195
|
+
private _distToRect;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=InteractionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteractionManager.d.ts","sourceRoot":"","sources":["../../src/core/InteractionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { PriceRange, ChartColors, PriceScaleOptions } from '@forgecharts/types';
|
|
2
|
+
import type { CanvasLayer } from './CanvasLayer';
|
|
3
|
+
/**
|
|
4
|
+
* PriceScale — manages the vertical price axis.
|
|
5
|
+
* Auto-scales to the visible data range and renders price labels.
|
|
6
|
+
*/
|
|
7
|
+
export declare class PriceScale {
|
|
8
|
+
private _visibleRange;
|
|
9
|
+
private readonly _layer;
|
|
10
|
+
private readonly _colors;
|
|
11
|
+
private readonly _options;
|
|
12
|
+
constructor(layer: CanvasLayer, colors: ChartColors, options?: PriceScaleOptions);
|
|
13
|
+
get visibleRange(): PriceRange;
|
|
14
|
+
get width(): number;
|
|
15
|
+
setVisibleRange(range: PriceRange): void;
|
|
16
|
+
/**
|
|
17
|
+
* Converts a price value to a canvas Y coordinate.
|
|
18
|
+
*/
|
|
19
|
+
priceToY(price: number, canvasHeight: number): number;
|
|
20
|
+
/**
|
|
21
|
+
* Converts a canvas Y coordinate back to a price value.
|
|
22
|
+
*/
|
|
23
|
+
yToPrice(y: number, canvasHeight: number): number;
|
|
24
|
+
render(ctx: CanvasRenderingContext2D, width: number, height: number): void;
|
|
25
|
+
private _formatPrice;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=PriceScale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PriceScale.d.ts","sourceRoot":"","sources":["../../src/core/PriceScale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAKjD;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;gBAE3C,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,iBAAsB;IAcpF,IAAI,YAAY,IAAI,UAAU,CAE7B;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIxC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAgBrD;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAMjD,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAwD1E,OAAO,CAAC,YAAY;CAKrB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { OHLCV, SeriesOptions, Viewport, Rect, ChartColors } from '@forgecharts/types';
|
|
2
|
+
import type { ISeries } from '../types/ISeries';
|
|
3
|
+
/**
|
|
4
|
+
* Series holds a dataset (OHLCV[]) and delegates pixel-level rendering
|
|
5
|
+
* to the appropriate IRenderer implementation.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Series implements ISeries {
|
|
8
|
+
private _data;
|
|
9
|
+
private _options;
|
|
10
|
+
private readonly _renderer;
|
|
11
|
+
/**
|
|
12
|
+
* Optional callback invoked after `setData()` or `update()` mutates the dataset.
|
|
13
|
+
* Used by `PixiChart` to mark the PriceSeries layer dirty without polling.
|
|
14
|
+
*/
|
|
15
|
+
onDataChanged?: () => void;
|
|
16
|
+
constructor(options: SeriesOptions, colors: ChartColors);
|
|
17
|
+
setData(data: readonly OHLCV[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Apply a real-time OHLCV tick to the series.
|
|
20
|
+
*
|
|
21
|
+
* Rules (mirrors TradingView / Binance behaviour):
|
|
22
|
+
* - time normalisation : if > 1e12 it is milliseconds → convert to seconds
|
|
23
|
+
* - same candle (time === last.time):
|
|
24
|
+
* open → unchanged (preserved from first tick of this candle)
|
|
25
|
+
* high → max(prev.high, incoming.high, incoming.close)
|
|
26
|
+
* low → min(prev.low, incoming.low, incoming.close)
|
|
27
|
+
* close → incoming.close
|
|
28
|
+
* volume → incoming.volume
|
|
29
|
+
* - new candle (time > last.time) → append
|
|
30
|
+
* - out-of-order (time < last.time) → silently ignored
|
|
31
|
+
*/
|
|
32
|
+
update(bar: OHLCV): void;
|
|
33
|
+
data(): readonly OHLCV[];
|
|
34
|
+
applyOptions(options: Partial<SeriesOptions>): void;
|
|
35
|
+
options(): SeriesOptions;
|
|
36
|
+
render(ctx: CanvasRenderingContext2D, viewport: Viewport, rect: Rect): void;
|
|
37
|
+
private _getVisibleData;
|
|
38
|
+
private static _createRenderer;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=Series.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Series.d.ts","sourceRoot":"","sources":["../../src/core/Series.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMhD;;;GAGG;AACH,qBAAa,MAAO,YAAW,OAAO;IACpC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;gBAEf,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW;IAOvD,OAAO,CAAC,IAAI,EAAE,SAAS,KAAK,EAAE,GAAG,IAAI;IAKrC;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI;IAiCxB,IAAI,IAAI,SAAS,KAAK,EAAE;IAIxB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAInD,OAAO,IAAI,aAAa;IAMxB,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAa3E,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,MAAM,CAAC,eAAe;CAiB/B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { TimeRange, ChartColors, TimeScaleOptions, Timeframe } from '@forgecharts/types';
|
|
2
|
+
import { computeTicks } from '@forgecharts/utils';
|
|
3
|
+
import type { CanvasLayer } from './CanvasLayer';
|
|
4
|
+
/**
|
|
5
|
+
* TimeScale — manages the horizontal time axis.
|
|
6
|
+
* Handles pan/zoom of the visible time range and renders tick labels.
|
|
7
|
+
*/
|
|
8
|
+
export declare class TimeScale {
|
|
9
|
+
private _visibleRange;
|
|
10
|
+
private readonly _layer;
|
|
11
|
+
private readonly _colors;
|
|
12
|
+
private readonly _options;
|
|
13
|
+
private _activeTimeframe;
|
|
14
|
+
/** IANA timezone for axis labels. Falls back to UTC when unset. */
|
|
15
|
+
timezone: string | undefined;
|
|
16
|
+
constructor(layer: CanvasLayer, colors: ChartColors, options?: TimeScaleOptions);
|
|
17
|
+
get visibleRange(): TimeRange;
|
|
18
|
+
get height(): number;
|
|
19
|
+
get activeTimeframe(): Timeframe;
|
|
20
|
+
setVisibleRange(range: TimeRange): void;
|
|
21
|
+
setTimeframe(tf: Timeframe): void;
|
|
22
|
+
/**
|
|
23
|
+
* Converts a Unix timestamp to a canvas X coordinate.
|
|
24
|
+
*/
|
|
25
|
+
timeToX(time: number, canvasWidth: number): number;
|
|
26
|
+
/**
|
|
27
|
+
* Converts a canvas X coordinate back to a Unix timestamp.
|
|
28
|
+
*/
|
|
29
|
+
xToTime(x: number, canvasWidth: number): number;
|
|
30
|
+
/**
|
|
31
|
+
* Zooms around a pivot X coordinate by a scale factor.
|
|
32
|
+
*/
|
|
33
|
+
zoom(factor: number, pivotX: number, canvasWidth?: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* Scrolls by a delta in seconds.
|
|
36
|
+
*/
|
|
37
|
+
scroll(deltaSeconds: number): void;
|
|
38
|
+
render(ctx: CanvasRenderingContext2D, width: number, height: number): void;
|
|
39
|
+
private _priceScaleWidth;
|
|
40
|
+
private _niceTimeStep;
|
|
41
|
+
}
|
|
42
|
+
export { computeTicks };
|
|
43
|
+
//# sourceMappingURL=TimeScale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeScale.d.ts","sourceRoot":"","sources":["../../src/core/TimeScale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAY,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjD;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,mEAAmE;IACnE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAa;gBAE7B,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,gBAAqB;IAenF,IAAI,YAAY,IAAI,SAAS,CAE5B;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,eAAe,IAAI,SAAS,CAE/B;IAED,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIvC,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI;IAIjC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAKlD;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAK/C;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,MAA0B,GAAG,IAAI;IASnF;;OAEG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAOlC,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA0D1E,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,aAAa;CAgBtB;AAGD,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { IDatafeed, OHLCV, Timeframe } from '@forgecharts/types';
|
|
2
|
+
import type { ISeries } from '../types/ISeries';
|
|
3
|
+
/**
|
|
4
|
+
* Lifecycle callbacks injected by TChart so it can relay data-load state
|
|
5
|
+
* as EventBus events without coupling DatafeedConnector to the bus.
|
|
6
|
+
*/
|
|
7
|
+
export type ConnectorCallbacks = {
|
|
8
|
+
onLoading(symbol: string, interval: Timeframe): void;
|
|
9
|
+
onLoaded(symbol: string, interval: Timeframe, count: number): void;
|
|
10
|
+
onError(symbol: string, interval: Timeframe, error: string): void;
|
|
11
|
+
/** Called on every real-time tick after the series is updated. Optional. */
|
|
12
|
+
onUpdate?: (bar: OHLCV) => void;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* DatafeedConnector wires an {@link IDatafeed} to an {@link ISeries}.
|
|
16
|
+
*
|
|
17
|
+
* Responsibilities:
|
|
18
|
+
* - Generates stable, unique subscriber UIDs (`forgecharts-<symbol>-<tf>-<n>`).
|
|
19
|
+
* - Calls `getHistoricalBars` and pushes the result into `series.setData()`.
|
|
20
|
+
* - Calls `subscribeBars` so real-time ticks flow into `series.update()`.
|
|
21
|
+
* - Guards against stale async responses after a reconnect or destroy.
|
|
22
|
+
* - Tears down the active subscription cleanly on `disconnect()` / `destroy()`.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const connector = new DatafeedConnector(datafeed, series, {
|
|
27
|
+
* onLoading: (s, tf) => console.log('loading', s, tf),
|
|
28
|
+
* onLoaded: (s, tf, n) => console.log('loaded', n, 'bars'),
|
|
29
|
+
* onError: (s, tf, e) => console.error(e),
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* connector.connect('BTCUSDT', '1h');
|
|
33
|
+
* // ...later, on symbol change:
|
|
34
|
+
* connector.reconnect('ETHUSDT', '1h');
|
|
35
|
+
* // ...on unmount:
|
|
36
|
+
* connector.destroy();
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare class DatafeedConnector {
|
|
40
|
+
private readonly _datafeed;
|
|
41
|
+
private readonly _series;
|
|
42
|
+
private readonly _cb;
|
|
43
|
+
/**
|
|
44
|
+
* UID of the outstanding subscription.
|
|
45
|
+
* `null` means nothing is subscribed / all responses for older UIDs are stale.
|
|
46
|
+
*/
|
|
47
|
+
private _activeUID;
|
|
48
|
+
private _activeEngine;
|
|
49
|
+
private _destroyed;
|
|
50
|
+
/** True while an async `loadMoreHistory()` request is in-flight. */
|
|
51
|
+
private _isLoadingMore;
|
|
52
|
+
/** True once the datafeed returned 0 bars for a backwards page — no point fetching older. */
|
|
53
|
+
private _noMoreHistory;
|
|
54
|
+
constructor(datafeed: IDatafeed, series: ISeries, callbacks: ConnectorCallbacks);
|
|
55
|
+
/**
|
|
56
|
+
* Loads historical bars then subscribes for real-time updates.
|
|
57
|
+
* Safe to call while a previous subscription is still active — it will be
|
|
58
|
+
* cancelled first (same as calling `disconnect()` then `connect()`).
|
|
59
|
+
*/
|
|
60
|
+
connect(symbol: string, timeframe: Timeframe): void;
|
|
61
|
+
/**
|
|
62
|
+
* Cancels the active subscription without starting a new one.
|
|
63
|
+
* Historical-bar `Promise` results arriving after this call are silently
|
|
64
|
+
* discarded via the UID guard.
|
|
65
|
+
*/
|
|
66
|
+
disconnect(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Convenience shorthand: `disconnect()` then `connect()`.
|
|
69
|
+
* Use this for symbol or timeframe changes.
|
|
70
|
+
*/
|
|
71
|
+
reconnect(symbol: string, timeframe: Timeframe): void;
|
|
72
|
+
/**
|
|
73
|
+
* Permanently deactivates the connector.
|
|
74
|
+
* Any subscription or in-flight request is cancelled; subsequent calls to
|
|
75
|
+
* `connect()` / `reconnect()` are no-ops.
|
|
76
|
+
*/
|
|
77
|
+
destroy(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Fetches a page of older history (up to ~500 candles) and prepends it to
|
|
80
|
+
* the loaded dataset. Safe to call on every pan event — it is internally
|
|
81
|
+
* debounced by the `_isLoadingMore` flag and stops permanently once the
|
|
82
|
+
* datafeed signals no more history (`_noMoreHistory = true`).
|
|
83
|
+
*
|
|
84
|
+
* The series is updated automatically via the engine's `onResync` callback.
|
|
85
|
+
*/
|
|
86
|
+
loadMoreHistory(symbol: string, timeframe: Timeframe): void;
|
|
87
|
+
private _cancelActive;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=DatafeedConnector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatafeedConnector.d.ts","sourceRoot":"","sources":["../../src/datafeed/DatafeedConnector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAoEhD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACnE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClE,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,CAAC;AAIF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IAEzC;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAAS;IAE3B,oEAAoE;IACpE,OAAO,CAAC,cAAc,CAAS;IAC/B,6FAA6F;IAC7F,OAAO,CAAC,cAAc,CAAS;gBAEnB,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB;IAQ/E;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IA0EnD;;;;OAIG;IACH,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAKrD;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAOf;;;;;;;OAOG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAgC3D,OAAO,CAAC,aAAa;CAgBtB"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CandleEngine — the single source of truth for live candle data.
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
*
|
|
6
|
+
* WebSocket feed
|
|
7
|
+
* ↓
|
|
8
|
+
* Market Data Normalizer (normalizeOhlcv — handles strings, ms vs s)
|
|
9
|
+
* ↓
|
|
10
|
+
* CandleEngine (applyCandleUpdate — O(1) update path)
|
|
11
|
+
* ↓
|
|
12
|
+
* Chart Update Adapter (onBarUpdated / onResync callbacks)
|
|
13
|
+
* ↓
|
|
14
|
+
* Chart Library (series.update / series.setData)
|
|
15
|
+
*
|
|
16
|
+
* Guarantees:
|
|
17
|
+
* - open is never overwritten on an existing live candle
|
|
18
|
+
* - high can only increase within a candle
|
|
19
|
+
* - low can only decrease within a candle
|
|
20
|
+
* - close updates on every tick
|
|
21
|
+
* - out-of-order ticks are silently discarded
|
|
22
|
+
* - gaps are detected and reported for async REST backfill
|
|
23
|
+
* - the engine is framework-agnostic (no DOM, React, or chart-lib imports)
|
|
24
|
+
*/
|
|
25
|
+
import type { Timeframe } from '@forgecharts/types';
|
|
26
|
+
/**
|
|
27
|
+
* Normalised candle shape used throughout the engine.
|
|
28
|
+
*
|
|
29
|
+
* `timeMs` — millisecond timestamp (used for bucket identity comparisons)
|
|
30
|
+
* `time` — second timestamp (used for chart library rendering)
|
|
31
|
+
*/
|
|
32
|
+
export interface CandleBar {
|
|
33
|
+
/** Candle open-time in milliseconds — the primary bucket key. */
|
|
34
|
+
timeMs: number;
|
|
35
|
+
/** Candle open-time in seconds — passed directly to the chart library. */
|
|
36
|
+
time: number;
|
|
37
|
+
open: number;
|
|
38
|
+
high: number;
|
|
39
|
+
low: number;
|
|
40
|
+
close: number;
|
|
41
|
+
volume: number;
|
|
42
|
+
/** True once the next candle has started and this bar is fully formed. */
|
|
43
|
+
isClosed: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Raw OHLCV input accepted by the engine.
|
|
47
|
+
* Values may be number or numeric string; `time` may be milliseconds or seconds.
|
|
48
|
+
*/
|
|
49
|
+
export interface RawOHLCV {
|
|
50
|
+
time: number | string;
|
|
51
|
+
open: number | string;
|
|
52
|
+
high: number | string;
|
|
53
|
+
low: number | string;
|
|
54
|
+
close: number | string;
|
|
55
|
+
volume?: number | string;
|
|
56
|
+
isClosed?: boolean;
|
|
57
|
+
}
|
|
58
|
+
/** Describes what the engine did with a live update. */
|
|
59
|
+
export type UpdateResult = {
|
|
60
|
+
type: 'update';
|
|
61
|
+
bar: CandleBar;
|
|
62
|
+
} | {
|
|
63
|
+
type: 'append';
|
|
64
|
+
bar: CandleBar;
|
|
65
|
+
previousBarClosed: boolean;
|
|
66
|
+
} | {
|
|
67
|
+
type: 'gap';
|
|
68
|
+
bar: CandleBar;
|
|
69
|
+
missingCount: number;
|
|
70
|
+
} | {
|
|
71
|
+
type: 'ignore';
|
|
72
|
+
};
|
|
73
|
+
/** Gap information emitted via `onGapDetected`. */
|
|
74
|
+
export interface GapInfo {
|
|
75
|
+
fromTimeMs: number;
|
|
76
|
+
toTimeMs: number;
|
|
77
|
+
missingCount: number;
|
|
78
|
+
}
|
|
79
|
+
export interface CandleEngineOptions {
|
|
80
|
+
/**
|
|
81
|
+
* Enable structured debug logging to the console.
|
|
82
|
+
* Log every incoming tick with action, timestamps, and resulting OHLCV.
|
|
83
|
+
*/
|
|
84
|
+
debug?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Fired when the live stream skips one or more candle buckets.
|
|
87
|
+
* Use this to trigger an async REST backfill; do not block the live stream.
|
|
88
|
+
*/
|
|
89
|
+
onGapDetected?: (info: GapInfo) => void;
|
|
90
|
+
/**
|
|
91
|
+
* Fired after every bar mutation (update or append).
|
|
92
|
+
* The chart adapter should call `series.update(bar)` here.
|
|
93
|
+
*/
|
|
94
|
+
onBarUpdated?: (bar: CandleBar, result: UpdateResult) => void;
|
|
95
|
+
/** Fired when a candle is finalised — the next candle's first tick arrived. */
|
|
96
|
+
onBarClosed?: (bar: CandleBar) => void;
|
|
97
|
+
/**
|
|
98
|
+
* Fired after the full bar array changes (backfillGap / handleReconnect).
|
|
99
|
+
* The chart adapter should call `series.setData(bars)` here to fully resync.
|
|
100
|
+
*/
|
|
101
|
+
onResync?: (bars: readonly CandleBar[]) => void;
|
|
102
|
+
}
|
|
103
|
+
export declare class CandleEngine {
|
|
104
|
+
/** Authoritative ordered bar array. Only the rightmost bar may be open. */
|
|
105
|
+
private _bars;
|
|
106
|
+
private _timeframe;
|
|
107
|
+
private _intervalMs;
|
|
108
|
+
private readonly _opts;
|
|
109
|
+
constructor(options?: CandleEngineOptions);
|
|
110
|
+
/**
|
|
111
|
+
* Seed the engine with historical bars and set the active timeframe.
|
|
112
|
+
* All existing bars are replaced.
|
|
113
|
+
*
|
|
114
|
+
* Historical bars loaded from REST are assumed closed, except possibly
|
|
115
|
+
* the last one (which may represent the still-forming candle).
|
|
116
|
+
*
|
|
117
|
+
* @param history Raw bars from a REST endpoint (oldest → newest).
|
|
118
|
+
* @param timeframe The active timeframe label (e.g. '1m', '1h').
|
|
119
|
+
*/
|
|
120
|
+
initialize(history: RawOHLCV[], timeframe: Timeframe): void;
|
|
121
|
+
/**
|
|
122
|
+
* Process a single live OHLCV tick from the WebSocket feed.
|
|
123
|
+
*
|
|
124
|
+
* Algorithm (mirrors TradingView / Binance candle engine behaviour):
|
|
125
|
+
*
|
|
126
|
+
* 1. Normalise: coerce strings to numbers, detect ms vs s, align to bucket.
|
|
127
|
+
* 2. Empty array → append as first bar.
|
|
128
|
+
* 3. incoming.timeMs === last.timeMs → SAME CANDLE (update in-place):
|
|
129
|
+
* open = unchanged (first tick's open is authoritative)
|
|
130
|
+
* high = max(last.high, inc.high, inc.close)
|
|
131
|
+
* low = min(last.low, inc.low, inc.close)
|
|
132
|
+
* close = inc.close
|
|
133
|
+
* volume = inc.volume
|
|
134
|
+
* 4. incoming.timeMs > last.timeMs → NEW CANDLE:
|
|
135
|
+
* - Detect and report any gap (missing buckets between last and incoming).
|
|
136
|
+
* - Mark last bar as closed, fire onBarClosed.
|
|
137
|
+
* - Append incoming as a fresh live candle.
|
|
138
|
+
* 5. incoming.timeMs < last.timeMs → OUT-OF-ORDER: discard silently.
|
|
139
|
+
*
|
|
140
|
+
* @returns UpdateResult indicating what was done — the chart adapter uses
|
|
141
|
+
* this to choose between series.update() and series.setData().
|
|
142
|
+
*/
|
|
143
|
+
applyLiveUpdate(raw: RawOHLCV): UpdateResult;
|
|
144
|
+
/**
|
|
145
|
+
* Merge REST-fetched bars into the engine to fill a detected gap.
|
|
146
|
+
*
|
|
147
|
+
* Incoming bars are treated as authoritative closed candles.
|
|
148
|
+
* The current live candle is preserved if present.
|
|
149
|
+
*
|
|
150
|
+
* After calling this, `onResync` fires — the chart adapter must call
|
|
151
|
+
* `series.setData(engine.getBars())` to fully resync the chart.
|
|
152
|
+
*
|
|
153
|
+
* @param rawBars Historical bars from the REST endpoint covering the gap.
|
|
154
|
+
*/
|
|
155
|
+
backfillGap(rawBars: RawOHLCV[]): void;
|
|
156
|
+
/**
|
|
157
|
+
* Reconcile after a WebSocket reconnect.
|
|
158
|
+
*
|
|
159
|
+
* Fetch a rolling overlap window from REST (e.g. last 50 bars or 2 hours)
|
|
160
|
+
* and pass them here. The engine merges them with the existing bar array,
|
|
161
|
+
* correcting any candles that were missed or corrupted during the outage.
|
|
162
|
+
*
|
|
163
|
+
* After reconciliation, `onResync` fires so the chart adapter can resync
|
|
164
|
+
* the chart series with `series.setData(engine.getBars())`.
|
|
165
|
+
*
|
|
166
|
+
* @param recentBars REST bars covering the reconnect overlap window.
|
|
167
|
+
*/
|
|
168
|
+
handleReconnect(recentBars: RawOHLCV[]): void;
|
|
169
|
+
/**
|
|
170
|
+
* Stub for future tick/trade-based candle construction.
|
|
171
|
+
*
|
|
172
|
+
* When implemented, this will:
|
|
173
|
+
* - Assign the trade to its bucket using `getBucketStart(timeMs, intervalMs)`.
|
|
174
|
+
* - Create a new candle if the bucket is absent.
|
|
175
|
+
* - Update OHLCV: open/close from trade price, high/low expanded, volume summed.
|
|
176
|
+
*
|
|
177
|
+
* Not yet implemented — structure is in place for future extension.
|
|
178
|
+
*/
|
|
179
|
+
applyTradeTick(_trade: {
|
|
180
|
+
time: number | string;
|
|
181
|
+
price: number | string;
|
|
182
|
+
size?: number | string;
|
|
183
|
+
}): void;
|
|
184
|
+
/**
|
|
185
|
+
* Returns a readonly view of the authoritative bar array.
|
|
186
|
+
* Do not mutate — call `applyLiveUpdate`, `backfillGap`, etc. instead.
|
|
187
|
+
*/
|
|
188
|
+
getBars(): readonly CandleBar[];
|
|
189
|
+
/** Returns the most recent (possibly still live) bar, or null if empty. */
|
|
190
|
+
getLastBar(): CandleBar | null;
|
|
191
|
+
/**
|
|
192
|
+
* Prepend older historical bars fetched during a lazy scroll-left page load.
|
|
193
|
+
* Only bars older than the current oldest bar are accepted; duplicates and
|
|
194
|
+
* out-of-range bars are silently dropped.
|
|
195
|
+
* Fires `onResync` so the chart adapter updates the series with `setData`.
|
|
196
|
+
*
|
|
197
|
+
* @param rawBars Historical bars from the REST endpoint, oldest → newest.
|
|
198
|
+
*/
|
|
199
|
+
prependHistory(rawBars: RawOHLCV[]): void;
|
|
200
|
+
/**
|
|
201
|
+
* Clear all state.
|
|
202
|
+
* Call before switching symbol or timeframe, or on a hard disconnect.
|
|
203
|
+
*/
|
|
204
|
+
reset(): void;
|
|
205
|
+
private _debugLog;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=CandleEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CandleEngine.d.ts","sourceRoot":"","sources":["../../src/engine/CandleEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAcpD;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wDAAwD;AACxD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,SAAS,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,SAAS,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAI,GAAG,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB,mDAAmD;AACnD,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAExC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAE9D,+EAA+E;IAC/E,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IAEvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,KAAK,IAAI,CAAC;CACjD;AAuCD,qBAAa,YAAY;IACvB,2EAA2E;IAC3E,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;gBAEhC,OAAO,GAAE,mBAAwB;IAM7C;;;;;;;;;OASG;IACH,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IA4B3D;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,YAAY;IAsF5C;;;;;;;;;;OAUG;IACH,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI;IA0BtC;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI;IAS7C;;;;;;;;;OASG;IACH,cAAc,CACZ,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAChF,IAAI;IAMP;;;OAGG;IACH,OAAO,IAAI,SAAS,SAAS,EAAE;IAI/B,2EAA2E;IAC3E,UAAU,IAAI,SAAS,GAAG,IAAI;IAI9B;;;;;;;OAOG;IACH,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI;IAyBzC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,SAAS;CAYlB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CandleEngine.test.d.ts","sourceRoot":"","sources":["../../../src/engine/__tests__/CandleEngine.test.ts"],"names":[],"mappings":""}
|