@forgecharts/sdk 1.1.28 → 1.1.30

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.
Files changed (237) hide show
  1. package/dist/index.js +8100 -48
  2. package/dist/index.js.map +1 -1
  3. package/dist/internal.js +8851 -31
  4. package/dist/internal.js.map +1 -1
  5. package/dist/react/index.js +11558 -27
  6. package/dist/react/index.js.map +1 -1
  7. package/dist/react/internal.js +12147 -43
  8. package/dist/react/internal.js.map +1 -1
  9. package/package.json +1 -1
  10. package/dist/__tests__/backwardCompatibility.test.js +0 -159
  11. package/dist/__tests__/backwardCompatibility.test.js.map +0 -1
  12. package/dist/__tests__/candleInvariant.test.js +0 -415
  13. package/dist/__tests__/candleInvariant.test.js.map +0 -1
  14. package/dist/__tests__/public-api-surface.js +0 -38
  15. package/dist/__tests__/public-api-surface.js.map +0 -1
  16. package/dist/__tests__/timeframeBoundary.test.js +0 -452
  17. package/dist/__tests__/timeframeBoundary.test.js.map +0 -1
  18. package/dist/api/DrawingManager.js +0 -190
  19. package/dist/api/DrawingManager.js.map +0 -1
  20. package/dist/api/EventBus.js +0 -44
  21. package/dist/api/EventBus.js.map +0 -1
  22. package/dist/api/IndicatorDAG.js +0 -316
  23. package/dist/api/IndicatorDAG.js.map +0 -1
  24. package/dist/api/IndicatorRegistry.js +0 -39
  25. package/dist/api/IndicatorRegistry.js.map +0 -1
  26. package/dist/api/LayoutManager.js +0 -51
  27. package/dist/api/LayoutManager.js.map +0 -1
  28. package/dist/api/PaneManager.js +0 -119
  29. package/dist/api/PaneManager.js.map +0 -1
  30. package/dist/api/ReferenceAPI.js +0 -153
  31. package/dist/api/ReferenceAPI.js.map +0 -1
  32. package/dist/api/TChart.js +0 -765
  33. package/dist/api/TChart.js.map +0 -1
  34. package/dist/api/createChart.js +0 -42
  35. package/dist/api/createChart.js.map +0 -1
  36. package/dist/api/drawing tools/fib gann menu/fibRetracement.js +0 -22
  37. package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +0 -1
  38. package/dist/api/drawing tools/lines menu/crossLine.js +0 -16
  39. package/dist/api/drawing tools/lines menu/crossLine.js.map +0 -1
  40. package/dist/api/drawing tools/lines menu/disjointChannel.js +0 -59
  41. package/dist/api/drawing tools/lines menu/disjointChannel.js.map +0 -1
  42. package/dist/api/drawing tools/lines menu/extendedLine.js +0 -17
  43. package/dist/api/drawing tools/lines menu/extendedLine.js.map +0 -1
  44. package/dist/api/drawing tools/lines menu/flatTopBottom.js +0 -41
  45. package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +0 -1
  46. package/dist/api/drawing tools/lines menu/horizontal.js +0 -19
  47. package/dist/api/drawing tools/lines menu/horizontal.js.map +0 -1
  48. package/dist/api/drawing tools/lines menu/horizontalRay.js +0 -20
  49. package/dist/api/drawing tools/lines menu/horizontalRay.js.map +0 -1
  50. package/dist/api/drawing tools/lines menu/infoLine.js +0 -107
  51. package/dist/api/drawing tools/lines menu/infoLine.js.map +0 -1
  52. package/dist/api/drawing tools/lines menu/insidePitchfork.js +0 -31
  53. package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +0 -1
  54. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +0 -15
  55. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +0 -1
  56. package/dist/api/drawing tools/lines menu/parallelChannel.js +0 -43
  57. package/dist/api/drawing tools/lines menu/parallelChannel.js.map +0 -1
  58. package/dist/api/drawing tools/lines menu/pitchfork.js +0 -12
  59. package/dist/api/drawing tools/lines menu/pitchfork.js.map +0 -1
  60. package/dist/api/drawing tools/lines menu/ray.js +0 -23
  61. package/dist/api/drawing tools/lines menu/ray.js.map +0 -1
  62. package/dist/api/drawing tools/lines menu/regressionTrend.js +0 -127
  63. package/dist/api/drawing tools/lines menu/regressionTrend.js.map +0 -1
  64. package/dist/api/drawing tools/lines menu/schiffPitchfork.js +0 -15
  65. package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +0 -1
  66. package/dist/api/drawing tools/lines menu/trendAngle.js +0 -51
  67. package/dist/api/drawing tools/lines menu/trendAngle.js.map +0 -1
  68. package/dist/api/drawing tools/lines menu/trendline.js +0 -11
  69. package/dist/api/drawing tools/lines menu/trendline.js.map +0 -1
  70. package/dist/api/drawing tools/lines menu/vertical.js +0 -11
  71. package/dist/api/drawing tools/lines menu/vertical.js.map +0 -1
  72. package/dist/api/drawing tools/pointers menu/crosshair.js +0 -16
  73. package/dist/api/drawing tools/pointers menu/crosshair.js.map +0 -1
  74. package/dist/api/drawing tools/pointers menu/cursor.js +0 -15
  75. package/dist/api/drawing tools/pointers menu/cursor.js.map +0 -1
  76. package/dist/api/drawing tools/pointers menu/demonstration.js +0 -30
  77. package/dist/api/drawing tools/pointers menu/demonstration.js.map +0 -1
  78. package/dist/api/drawing tools/pointers menu/dot.js +0 -23
  79. package/dist/api/drawing tools/pointers menu/dot.js.map +0 -1
  80. package/dist/api/drawing tools/shapes menu/rectangle.js +0 -19
  81. package/dist/api/drawing tools/shapes menu/rectangle.js.map +0 -1
  82. package/dist/api/drawing tools/shapes menu/text.js +0 -25
  83. package/dist/api/drawing tools/shapes menu/text.js.map +0 -1
  84. package/dist/api/drawingUtils.js +0 -83
  85. package/dist/api/drawingUtils.js.map +0 -1
  86. package/dist/core/CanvasLayer.js +0 -56
  87. package/dist/core/CanvasLayer.js.map +0 -1
  88. package/dist/core/Chart.js +0 -839
  89. package/dist/core/Chart.js.map +0 -1
  90. package/dist/core/CoordTransform.js +0 -224
  91. package/dist/core/CoordTransform.js.map +0 -1
  92. package/dist/core/Crosshair.js +0 -186
  93. package/dist/core/Crosshair.js.map +0 -1
  94. package/dist/core/IndicatorEngine.js +0 -181
  95. package/dist/core/IndicatorEngine.js.map +0 -1
  96. package/dist/core/InteractionManager.js +0 -698
  97. package/dist/core/InteractionManager.js.map +0 -1
  98. package/dist/core/PriceScale.js +0 -113
  99. package/dist/core/PriceScale.js.map +0 -1
  100. package/dist/core/Series.js +0 -114
  101. package/dist/core/Series.js.map +0 -1
  102. package/dist/core/TimeScale.js +0 -150
  103. package/dist/core/TimeScale.js.map +0 -1
  104. package/dist/datafeed/DatafeedConnector.js +0 -268
  105. package/dist/datafeed/DatafeedConnector.js.map +0 -1
  106. package/dist/engine/CandleEngine.js +0 -318
  107. package/dist/engine/CandleEngine.js.map +0 -1
  108. package/dist/engine/__tests__/CandleEngine.test.js +0 -300
  109. package/dist/engine/__tests__/CandleEngine.test.js.map +0 -1
  110. package/dist/engine/candleInvariants.js +0 -134
  111. package/dist/engine/candleInvariants.js.map +0 -1
  112. package/dist/engine/mergeUtils.js +0 -64
  113. package/dist/engine/mergeUtils.js.map +0 -1
  114. package/dist/engine/timeframeUtils.js +0 -100
  115. package/dist/engine/timeframeUtils.js.map +0 -1
  116. package/dist/licensing/ChartRuntimeResolver.js +0 -310
  117. package/dist/licensing/ChartRuntimeResolver.js.map +0 -1
  118. package/dist/licensing/LicenseManager.js +0 -114
  119. package/dist/licensing/LicenseManager.js.map +0 -1
  120. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +0 -177
  121. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +0 -1
  122. package/dist/licensing/__tests__/LicenseManager.test.js +0 -153
  123. package/dist/licensing/__tests__/LicenseManager.test.js.map +0 -1
  124. package/dist/licensing/licenseTypes.js +0 -2
  125. package/dist/licensing/licenseTypes.js.map +0 -1
  126. package/dist/pine/PineCompiler.js +0 -44
  127. package/dist/pine/PineCompiler.js.map +0 -1
  128. package/dist/pine/diagnostics.js +0 -11
  129. package/dist/pine/diagnostics.js.map +0 -1
  130. package/dist/pine/index.js +0 -5
  131. package/dist/pine/index.js.map +0 -1
  132. package/dist/pine/pine-ast.js +0 -19
  133. package/dist/pine/pine-ast.js.map +0 -1
  134. package/dist/pine/pine-lexer.js +0 -249
  135. package/dist/pine/pine-lexer.js.map +0 -1
  136. package/dist/pine/pine-parser.js +0 -416
  137. package/dist/pine/pine-parser.js.map +0 -1
  138. package/dist/pine/pine-transpiler.js +0 -260
  139. package/dist/pine/pine-transpiler.js.map +0 -1
  140. package/dist/pixi/LayerName.js +0 -35
  141. package/dist/pixi/LayerName.js.map +0 -1
  142. package/dist/pixi/PixiCandlestickRenderer.js +0 -107
  143. package/dist/pixi/PixiCandlestickRenderer.js.map +0 -1
  144. package/dist/pixi/PixiChart.js +0 -367
  145. package/dist/pixi/PixiChart.js.map +0 -1
  146. package/dist/pixi/PixiCrosshairRenderer.js +0 -110
  147. package/dist/pixi/PixiCrosshairRenderer.js.map +0 -1
  148. package/dist/pixi/PixiDrawingRenderer.js +0 -111
  149. package/dist/pixi/PixiDrawingRenderer.js.map +0 -1
  150. package/dist/pixi/PixiGridRenderer.js +0 -114
  151. package/dist/pixi/PixiGridRenderer.js.map +0 -1
  152. package/dist/pixi/PixiLayerManager.js +0 -92
  153. package/dist/pixi/PixiLayerManager.js.map +0 -1
  154. package/dist/react/canvas/ChartCanvas.js +0 -604
  155. package/dist/react/canvas/ChartCanvas.js.map +0 -1
  156. package/dist/react/canvas/ChartContextMenu.js +0 -5
  157. package/dist/react/canvas/ChartContextMenu.js.map +0 -1
  158. package/dist/react/canvas/ChartSettingsDialog.js +0 -28
  159. package/dist/react/canvas/ChartSettingsDialog.js.map +0 -1
  160. package/dist/react/canvas/IndicatorLabel.js +0 -196
  161. package/dist/react/canvas/IndicatorLabel.js.map +0 -1
  162. package/dist/react/canvas/IndicatorPane.js +0 -395
  163. package/dist/react/canvas/IndicatorPane.js.map +0 -1
  164. package/dist/react/canvas/PointerOverlay.js +0 -61
  165. package/dist/react/canvas/PointerOverlay.js.map +0 -1
  166. package/dist/react/canvas/toolbars/LeftToolbar.js +0 -407
  167. package/dist/react/canvas/toolbars/LeftToolbar.js.map +0 -1
  168. package/dist/react/hooks/useChartCapabilities.js +0 -66
  169. package/dist/react/hooks/useChartCapabilities.js.map +0 -1
  170. package/dist/react/shell/ManagedAppShell.js +0 -440
  171. package/dist/react/shell/ManagedAppShell.js.map +0 -1
  172. package/dist/react/trading/TradingBridge.js +0 -73
  173. package/dist/react/trading/TradingBridge.js.map +0 -1
  174. package/dist/react/workspace/ChartWorkspace.js +0 -42
  175. package/dist/react/workspace/ChartWorkspace.js.map +0 -1
  176. package/dist/react/workspace/FloatingPanel.js +0 -82
  177. package/dist/react/workspace/FloatingPanel.js.map +0 -1
  178. package/dist/react/workspace/IndicatorsDialog.js +0 -121
  179. package/dist/react/workspace/IndicatorsDialog.js.map +0 -1
  180. package/dist/react/workspace/LayoutMenu.js +0 -113
  181. package/dist/react/workspace/LayoutMenu.js.map +0 -1
  182. package/dist/react/workspace/SymbolSearchDialog.js +0 -245
  183. package/dist/react/workspace/SymbolSearchDialog.js.map +0 -1
  184. package/dist/react/workspace/TabBar.js +0 -29
  185. package/dist/react/workspace/TabBar.js.map +0 -1
  186. package/dist/react/workspace/toolbars/BottomToolbar.js +0 -236
  187. package/dist/react/workspace/toolbars/BottomToolbar.js.map +0 -1
  188. package/dist/react/workspace/toolbars/RightToolbar.js +0 -18
  189. package/dist/react/workspace/toolbars/RightToolbar.js.map +0 -1
  190. package/dist/react/workspace/toolbars/TopToolbar.js +0 -82
  191. package/dist/react/workspace/toolbars/TopToolbar.js.map +0 -1
  192. package/dist/renderers/CandlestickRenderer.js +0 -98
  193. package/dist/renderers/CandlestickRenderer.js.map +0 -1
  194. package/dist/renderers/HistogramRenderer.js +0 -50
  195. package/dist/renderers/HistogramRenderer.js.map +0 -1
  196. package/dist/renderers/LineRenderer.js +0 -64
  197. package/dist/renderers/LineRenderer.js.map +0 -1
  198. package/dist/theme/colors.js +0 -19
  199. package/dist/theme/colors.js.map +0 -1
  200. package/dist/tools/barDivergenceCheck.js +0 -200
  201. package/dist/tools/barDivergenceCheck.js.map +0 -1
  202. package/dist/trading/TradingOverlayStore.js +0 -139
  203. package/dist/trading/TradingOverlayStore.js.map +0 -1
  204. package/dist/trading/UnmanagedIngestion.js +0 -114
  205. package/dist/trading/UnmanagedIngestion.js.map +0 -1
  206. package/dist/trading/__tests__/ManagedTradingController.test.js +0 -271
  207. package/dist/trading/__tests__/ManagedTradingController.test.js.map +0 -1
  208. package/dist/trading/__tests__/TradingOverlayStore.test.js +0 -267
  209. package/dist/trading/__tests__/TradingOverlayStore.test.js.map +0 -1
  210. package/dist/trading/__tests__/UnmanagedIngestion.test.js +0 -170
  211. package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +0 -1
  212. package/dist/trading/managed/ManagedTradingController.js +0 -247
  213. package/dist/trading/managed/ManagedTradingController.js.map +0 -1
  214. package/dist/trading/managed/managedCapabilities.js +0 -79
  215. package/dist/trading/managed/managedCapabilities.js.map +0 -1
  216. package/dist/trading/managed/managedTypes.js +0 -13
  217. package/dist/trading/managed/managedTypes.js.map +0 -1
  218. package/dist/trading/tradingTypes.js +0 -8
  219. package/dist/trading/tradingTypes.js.map +0 -1
  220. package/dist/tscript/TScriptIndicator.js +0 -47
  221. package/dist/tscript/TScriptIndicator.js.map +0 -1
  222. package/dist/tscript/ast.js +0 -22
  223. package/dist/tscript/ast.js.map +0 -1
  224. package/dist/tscript/lexer.js +0 -187
  225. package/dist/tscript/lexer.js.map +0 -1
  226. package/dist/tscript/parser.js +0 -318
  227. package/dist/tscript/parser.js.map +0 -1
  228. package/dist/tscript/runtime.js +0 -475
  229. package/dist/tscript/runtime.js.map +0 -1
  230. package/dist/tscript/series.js +0 -79
  231. package/dist/tscript/series.js.map +0 -1
  232. package/dist/types/IChart.js +0 -2
  233. package/dist/types/IChart.js.map +0 -1
  234. package/dist/types/IRenderer.js +0 -2
  235. package/dist/types/IRenderer.js.map +0 -1
  236. package/dist/types/ISeries.js +0 -2
  237. package/dist/types/ISeries.js.map +0 -1
@@ -1,190 +0,0 @@
1
- import { HANDLE_HALF, HANDLE_FILL, HANDLE_STROKE } from './drawingUtils';
2
- let _counter = 0;
3
- function nextId() {
4
- return `drawing_${(++_counter).toString().padStart(4, '0')}`;
5
- }
6
- // ─── Lines menu ───────────────────────────────────────────────────────────────
7
- import { renderTrendline } from './drawing tools/lines menu/trendline';
8
- import { renderRay } from './drawing tools/lines menu/ray';
9
- import { renderInfoLine } from './drawing tools/lines menu/infoLine';
10
- import { renderExtendedLine } from './drawing tools/lines menu/extendedLine';
11
- import { renderTrendAngle } from './drawing tools/lines menu/trendAngle';
12
- import { renderHorizontal } from './drawing tools/lines menu/horizontal';
13
- import { renderVertical } from './drawing tools/lines menu/vertical';
14
- import { renderHorizontalRay } from './drawing tools/lines menu/horizontalRay';
15
- import { renderCrossLine } from './drawing tools/lines menu/crossLine';
16
- // Channels
17
- import { renderParallelChannel } from './drawing tools/lines menu/parallelChannel';
18
- import { renderRegressionTrend } from './drawing tools/lines menu/regressionTrend';
19
- import { renderFlatTopBottom } from './drawing tools/lines menu/flatTopBottom';
20
- import { renderDisjointChannel } from './drawing tools/lines menu/disjointChannel';
21
- // Pitchforks
22
- import { renderPitchfork } from './drawing tools/lines menu/pitchfork';
23
- import { renderSchiffPitchfork } from './drawing tools/lines menu/schiffPitchfork';
24
- import { renderModifiedSchiffPitchfork } from './drawing tools/lines menu/modifiedSchiffPitchfork';
25
- import { renderInsidePitchfork } from './drawing tools/lines menu/insidePitchfork';
26
- // ─── Shapes menu ─────────────────────────────────────────────────────────────
27
- import { renderRectangle } from './drawing tools/shapes menu/rectangle';
28
- import { renderText } from './drawing tools/shapes menu/text';
29
- // ─── Fib & Gann menu ─────────────────────────────────────────────────────────
30
- import { renderFibRetracement } from './drawing tools/fib gann menu/fibRetracement';
31
- // ─── Internal dispatch ────────────────────────────────────────────────────────
32
- function _renderOne(ctx, d, t, interval = '1h', candles = []) {
33
- switch (d.type) {
34
- // ── Lines menu ────────────────────────────────────────────────────────
35
- case 'trendline':
36
- renderTrendline(ctx, d, t);
37
- break;
38
- case 'ray':
39
- renderRay(ctx, d, t);
40
- break;
41
- case 'infoLine':
42
- renderInfoLine(ctx, d, t, interval);
43
- break;
44
- case 'extendedLine':
45
- renderExtendedLine(ctx, d, t);
46
- break;
47
- case 'trendAngle':
48
- renderTrendAngle(ctx, d, t);
49
- break;
50
- case 'horizontal':
51
- renderHorizontal(ctx, d, t);
52
- break;
53
- case 'vertical':
54
- renderVertical(ctx, d, t);
55
- break;
56
- case 'horizontalRay':
57
- renderHorizontalRay(ctx, d, t);
58
- break;
59
- case 'crossLine':
60
- renderCrossLine(ctx, d, t);
61
- break;
62
- // Channels
63
- case 'parallelChannel':
64
- renderParallelChannel(ctx, d, t);
65
- break;
66
- case 'regressionTrend':
67
- renderRegressionTrend(ctx, d, t, candles);
68
- break;
69
- case 'flatTopBottom':
70
- renderFlatTopBottom(ctx, d, t);
71
- break;
72
- case 'disjointChannel':
73
- renderDisjointChannel(ctx, d, t);
74
- break;
75
- // Pitchforks
76
- case 'pitchfork':
77
- renderPitchfork(ctx, d, t);
78
- break;
79
- case 'schiffPitchfork':
80
- renderSchiffPitchfork(ctx, d, t);
81
- break;
82
- case 'modifiedSchiffPitchfork':
83
- renderModifiedSchiffPitchfork(ctx, d, t);
84
- break;
85
- case 'insidePitchfork':
86
- renderInsidePitchfork(ctx, d, t);
87
- break;
88
- // ── Shapes menu ───────────────────────────────────────────────────────
89
- case 'rectangle':
90
- renderRectangle(ctx, d, t);
91
- break;
92
- case 'text':
93
- renderText(ctx, d, t);
94
- break;
95
- // ── Fib & Gann menu ───────────────────────────────────────────────────
96
- case 'fibRetracement':
97
- renderFibRetracement(ctx, d, t);
98
- break;
99
- }
100
- }
101
- function _renderHandles(ctx, d, t) {
102
- ctx.save();
103
- ctx.setLineDash([]);
104
- ctx.lineWidth = 1.5;
105
- for (const p of d.points) {
106
- const px = t.timeToX(p.time);
107
- const py = t.priceToY(p.price);
108
- ctx.fillStyle = HANDLE_FILL;
109
- ctx.strokeStyle = HANDLE_STROKE;
110
- ctx.beginPath();
111
- ctx.rect(px - HANDLE_HALF, py - HANDLE_HALF, HANDLE_HALF * 2, HANDLE_HALF * 2);
112
- ctx.fill();
113
- ctx.stroke();
114
- }
115
- ctx.restore();
116
- }
117
- // ─── Public API ────────────────────────────────────────────────────────────────
118
- export class DrawingManager {
119
- _map = new Map();
120
- // ─── CRUD ──────────────────────────────────────────────────────────────────
121
- add(drawing) {
122
- const id = nextId();
123
- this._map.set(id, { ...drawing, id });
124
- return id;
125
- }
126
- remove(id) {
127
- return this._map.delete(id);
128
- }
129
- update(id, patches) {
130
- const d = this._map.get(id);
131
- if (!d)
132
- return false;
133
- this._map.set(id, { ...d, ...patches });
134
- return true;
135
- }
136
- get(id) {
137
- return this._map.get(id);
138
- }
139
- has(id) {
140
- return this._map.has(id);
141
- }
142
- all() {
143
- return [...this._map.values()];
144
- }
145
- clear() {
146
- this._map.clear();
147
- }
148
- // ─── Rendering ─────────────────────────────────────────────────────────────
149
- render(ctx, transform, selectedId = null, interval = '1h', candles = []) {
150
- ctx.save();
151
- for (const d of this._map.values()) {
152
- if (d.visible === false)
153
- continue;
154
- ctx.strokeStyle = d.color ?? '#2196f3';
155
- ctx.lineWidth = d.lineWidth ?? 1.5;
156
- ctx.setLineDash([]);
157
- ctx.globalAlpha = 1;
158
- _renderOne(ctx, d, transform, interval, candles);
159
- if (d.id === selectedId) {
160
- // Heavier highlight pass
161
- ctx.save();
162
- ctx.strokeStyle = d.color ?? '#2196f3';
163
- ctx.lineWidth = (d.lineWidth ?? 1.5) + 1;
164
- ctx.globalAlpha = 0.4;
165
- _renderOne(ctx, d, transform, interval, candles);
166
- ctx.restore();
167
- _renderHandles(ctx, d, transform);
168
- }
169
- }
170
- ctx.restore();
171
- }
172
- renderPreview(ctx, transform, draft, interval = '1h', candles = []) {
173
- const d = { id: '__preview__', ...draft };
174
- ctx.save();
175
- ctx.globalAlpha = 0.65;
176
- ctx.setLineDash([6, 4]);
177
- ctx.strokeStyle = d.color ?? '#2196f3';
178
- ctx.lineWidth = d.lineWidth ?? 1.5;
179
- _renderOne(ctx, d, transform, interval, candles);
180
- ctx.restore();
181
- }
182
- /** Returns anchor pixel positions — used by InteractionManager for handle hit-testing. */
183
- static anchorPixels(d, transform) {
184
- return d.points.map((p) => ({
185
- x: transform.timeToX(p.time),
186
- y: transform.priceToY(p.price),
187
- }));
188
- }
189
- }
190
- //# sourceMappingURL=DrawingManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DrawingManager.js","sourceRoot":"","sources":["../../src/api/DrawingManager.ts"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
1
- /**
2
- * EventBus — internal typed pub/sub used by TChart.
3
- *
4
- * All event keys are constrained to `keyof ChartEventMap`, giving
5
- * full type inference on payload shapes at every call site.
6
- */
7
- export class EventBus {
8
- _listeners = new Map();
9
- on(event, handler) {
10
- if (!this._listeners.has(event)) {
11
- this._listeners.set(event, new Set());
12
- }
13
- this._listeners.get(event).add(handler);
14
- }
15
- off(event, handler) {
16
- this._listeners.get(event)?.delete(handler);
17
- }
18
- once(event, handler) {
19
- const wrapper = (payload) => {
20
- handler(payload);
21
- this.off(event, wrapper);
22
- };
23
- this.on(event, wrapper);
24
- }
25
- emit(event, payload) {
26
- const handlers = this._listeners.get(event);
27
- if (!handlers)
28
- return;
29
- for (const h of handlers) {
30
- try {
31
- h(payload);
32
- }
33
- catch (err) {
34
- // Prevent one bad handler from breaking the others
35
- console.error(`[ForgeCharts] Unhandled error in "${event}" listener`, err);
36
- }
37
- }
38
- }
39
- /** Removes all listeners — called on chart destruction. */
40
- clear() {
41
- this._listeners.clear();
42
- }
43
- }
44
- //# sourceMappingURL=EventBus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../../src/api/EventBus.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,OAAO,QAAQ;IACF,UAAU,GAAG,IAAI,GAAG,EAGlC,CAAC;IAEJ,EAAE,CAAgC,KAAQ,EAAE,OAAkC;QAC5E,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,OAA2B,CAAC,CAAC;IAC/D,CAAC;IAED,GAAG,CAAgC,KAAQ,EAAE,OAAkC;QAC7E,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAA2B,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAgC,KAAQ,EAAE,OAAkC;QAC9E,MAAM,OAAO,GAAG,CAAC,OAAyB,EAAQ,EAAE;YAClD,OAAO,CAAC,OAAO,CAAC,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,CAAgC,KAAQ,EAAE,OAAyB;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC;gBACF,CAA+B,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,mDAAmD;gBACnD,OAAO,CAAC,KAAK,CAAC,qCAAqC,KAAK,YAAY,EAAE,GAAG,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF"}
@@ -1,316 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"IndicatorDAG.js","sourceRoot":"","sources":["../../src/api/IndicatorDAG.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AA0B/D,SAAS,YAAY,CAAC,CAAkB,EAAE,CAAkB;IAC1D,OAAO,CACL,CAAC,CAAC,IAAI,KAAY,CAAC,CAAC,IAAI;QACxB,CAAC,CAAC,QAAQ,KAAQ,CAAC,CAAC,QAAQ;QAC5B,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;QAC/B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,OAAO,YAAY;IACN,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IAElD,+EAA+E;IAE/E;;;;;OAKG;IACH,OAAO,CAAC,EAAU,EAAE,MAAuB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC3C,QAAQ,CAAC,MAAM,GAAI,MAAM,CAAC;gBAC1B,QAAQ,CAAC,KAAK,GAAK,IAAI,CAAC;gBACxB,QAAQ,CAAC,MAAM,GAAI,IAAI,CAAC;gBACxB,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;YAClB,EAAE;YACF,MAAM;YACN,MAAM,EAAQ,IAAI;YAClB,WAAW,EAAG,CAAC,CAAC;YAChB,YAAY,EAAE,CAAC,CAAC;YAChB,YAAY,EAAE,GAAG;YACjB,KAAK,EAAS,IAAI;SACnB,CAAC,CAAC;QAEH,gEAAgE;QAChE,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvB,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,UAAU,CAAC,EAAU;QACnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,IAAI,CACF,UAAoF;QAEpF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtD,kCAAkC;QAClC,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACvB,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,KAAK,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;oBAClB,EAAE;oBACF,MAAM;oBACN,MAAM,EAAQ,IAAI;oBAClB,WAAW,EAAG,CAAC,CAAC;oBAChB,YAAY,EAAE,CAAC,CAAC;oBAChB,YAAY,EAAE,GAAG;oBACjB,KAAK,EAAS,IAAI;iBACnB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,MAAM,GAAI,MAAM,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAK,IAAI,CAAC;gBACpB,IAAI,CAAC,MAAM,GAAI,IAAI,CAAC;gBACpB,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,+EAA+E;IAE/E;;;;;;;;OAQG;IACH,OAAO,CAAC,IAAsB;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;gBAAE,SAAS;YAE1C,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAE9C,MAAM,cAAc,GAClB,IAAI,CAAC,MAAM,KAAK,IAAI;gBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAC7B,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY,GAAG,CAAC;gBACtC,IAAI,CAAC,MAAM,KAAM,IAAI,CAAC,WAAW,GAAI,CAAC,CAAC;YAEzC,IAAI,CAAC,MAAM,GAAG,cAAc;gBAC1B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAO,CAAC,MAAmC,EAAE,IAAI,CAAC;gBACtF,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAEzC,IAAI,CAAC,KAAK,GAAU,KAAK,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAI,IAAI,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3E,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,mEAAmE;IACnE,aAAa;QACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,+EAA+E;IAE/E,SAAS,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED,aAAa;QACX,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;QACzC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;gBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,+EAA+E;IAE/E;;;OAGG;IACK,SAAS;QACf,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,MAAM,GAAG,GAAK,IAAI,GAAG,EAAoB,CAAC,CAAC,2BAA2B;QAEtE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACjC,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACpC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC,KAAK,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+EAA+E;IAEvE,SAAS,CAAC,IAAU,EAAE,IAAsB;QAClD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACpD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW;YAAI,OAAO,IAAI,CAAC;QACpD,mFAAmF;QACnF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QACvF,gDAAgD;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAC;QAC/D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uGAAuG;IAC/F,cAAc,CAAC,IAAU,EAAE,IAAsB;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,KAAK,QAAQ;gBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7D,2EAA2E;QAC7E,CAAC;QACD,MAAM,KAAK,GAAe,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC;QAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,yCAAyC;IACjC,YAAY,CAClB,IAAW,EACX,KAAgC,EAChC,IAAuB;QAEvB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAA2B,CAAC;QAC/D,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,KAAK;gBACR,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACpF,KAAK,KAAK;gBACR,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACpF,KAAK,KAAK;gBACR,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACpF,KAAK,KAAK;gBACR,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACzE,KAAK,QAAQ;gBACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,KAAK,MAAM;gBACT,OAAO;oBACL,IAAI,EAAI,MAAM;oBACd,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;iBAC9E,CAAC;YACJ,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,+EAA+E;gBAC/E,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAM,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,oCAAoC;YAC9E,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC/B,IAAI,CAAC,GAAG;oBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBAChD,mCAAmC;gBACnC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACxB,IAAI,CAAC,aAAa,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBACjD,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3C,gDAAgD;gBAChD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACpD,CAAC;YACD;gBACE,mDAAmD;gBACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,UAAU,CAChB,IAAW,EACX,KAAgC,EAChC,IAAgC,EAChC,IAAuB;QAEvB,MAAM,CAAC,GAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAA2B,CAAC;QAClE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QAEtC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC9C,CAAC;gBACD,mEAAmE;gBACnE,MAAM,OAAO,GAAK,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC;gBAC/C,MAAM,QAAQ,GAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;gBAC/D,MAAM,QAAQ,GAAI,CAAC,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;gBACtE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACrF,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,MAAM,GAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC;gBAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACrF,CAAC;YACD;gBACE,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,2EAA2E;IACnE,oBAAoB,CAAC,QAAgB;QAC3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACrD,IAAI,CAAC,KAAK,GAAI,IAAI,CAAC;gBACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -1,39 +0,0 @@
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
@@ -1 +0,0 @@
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"}