@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,271 +0,0 @@
1
- /**
2
- * ManagedTradingController — unit tests
3
- *
4
- * Covers:
5
- * - Cannot initialize (registerProvider) in unmanaged mode
6
- * - Can initialize in managed mode
7
- * - isReady() reflects provider registration state
8
- * - placeOrder() throws without a provider
9
- * - placeOrder() with a mock provider: writes optimistic overlay entry,
10
- * updates with provider id on success, rolls back on failure
11
- * - cancelOrder() updates overlay status to 'cancelled'
12
- * - modifyOrder() patches price / qty / label in overlay
13
- * - placeBracketOrder() creates 3 orders with the same groupId in the overlay
14
- * - reportFill() pushes to overlay + updates order status
15
- * - All methods blocked in unmanaged mode
16
- */
17
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
18
- import { LicenseManager } from '../../licensing/LicenseManager';
19
- import { TradingOverlayStore } from '../TradingOverlayStore';
20
- import { ManagedTradingController } from '../managed/ManagedTradingController';
21
- // ─── License helpers ──────────────────────────────────────────────────────────
22
- function installManaged() {
23
- LicenseManager.getInstance().loadLicense({ licenseKey: 'm', mode: 'managed' });
24
- }
25
- function installUnmanaged() {
26
- LicenseManager.getInstance().loadLicense({ licenseKey: 'u', mode: 'unmanaged' });
27
- }
28
- function clearLicense() {
29
- LicenseManager.getInstance().clear();
30
- }
31
- // ─── Mock provider factory ────────────────────────────────────────────────────
32
- function makeMockProvider(overrides = {}) {
33
- return {
34
- providerId: 'mock-provider',
35
- placeOrder: vi.fn().mockResolvedValue({ orderId: 'prov-001', status: 'open' }),
36
- cancelOrder: vi.fn().mockResolvedValue(undefined),
37
- modifyOrder: vi.fn().mockResolvedValue({ orderId: 'prov-001', status: 'open' }),
38
- placeBracketOrder: vi.fn().mockResolvedValue({
39
- entry: { orderId: 'prov-entry', timestamp: 1000 },
40
- stopLoss: { orderId: 'prov-sl', timestamp: 1000 },
41
- takeProfit: { orderId: 'prov-tp', timestamp: 1000 },
42
- groupId: 'bracket-test',
43
- }),
44
- ...overrides,
45
- };
46
- }
47
- function makeOrderInput(overrides = {}) {
48
- return {
49
- symbol: 'BTCUSDT',
50
- side: 'buy',
51
- type: 'limit',
52
- limitPrice: 50_000,
53
- qty: 1,
54
- ...overrides,
55
- };
56
- }
57
- // ─── Mode gate ────────────────────────────────────────────────────────────────
58
- describe('ManagedTradingController — mode gate', () => {
59
- afterEach(clearLicense);
60
- it('registerProvider() throws in unmanaged mode', () => {
61
- installUnmanaged();
62
- const store = new TradingOverlayStore();
63
- const ctrl = new ManagedTradingController(store);
64
- expect(() => ctrl.registerProvider(makeMockProvider())).toThrow(/managed/i);
65
- });
66
- it('registerProvider() throws when no license (defaults to unmanaged)', () => {
67
- clearLicense();
68
- const store = new TradingOverlayStore();
69
- const ctrl = new ManagedTradingController(store);
70
- expect(() => ctrl.registerProvider(makeMockProvider())).toThrow(/managed/i);
71
- });
72
- it('registerProvider() succeeds in managed mode', () => {
73
- installManaged();
74
- const store = new TradingOverlayStore();
75
- const ctrl = new ManagedTradingController(store);
76
- expect(() => ctrl.registerProvider(makeMockProvider())).not.toThrow();
77
- });
78
- it('placeOrder() throws in unmanaged mode', async () => {
79
- installUnmanaged();
80
- const store = new TradingOverlayStore();
81
- const ctrl = new ManagedTradingController(store);
82
- await expect(ctrl.placeOrder(makeOrderInput())).rejects.toThrow(/managed/i);
83
- });
84
- });
85
- // ─── isReady / getProviderId ──────────────────────────────────────────────────
86
- describe('ManagedTradingController — readiness', () => {
87
- beforeEach(installManaged);
88
- afterEach(clearLicense);
89
- it('isReady() is false before provider registration', () => {
90
- const ctrl = new ManagedTradingController(new TradingOverlayStore());
91
- expect(ctrl.isReady()).toBe(false);
92
- });
93
- it('isReady() is true after registration', () => {
94
- const ctrl = new ManagedTradingController(new TradingOverlayStore());
95
- ctrl.registerProvider(makeMockProvider());
96
- expect(ctrl.isReady()).toBe(true);
97
- });
98
- it('getProviderId() returns null before registration', () => {
99
- const ctrl = new ManagedTradingController(new TradingOverlayStore());
100
- expect(ctrl.getProviderId()).toBeNull();
101
- });
102
- it('getProviderId() returns the provider id after registration', () => {
103
- const ctrl = new ManagedTradingController(new TradingOverlayStore());
104
- ctrl.registerProvider(makeMockProvider({ providerId: 'rithmic' }));
105
- expect(ctrl.getProviderId()).toBe('rithmic');
106
- });
107
- });
108
- // ─── placeOrder ───────────────────────────────────────────────────────────────
109
- describe('ManagedTradingController — placeOrder', () => {
110
- beforeEach(installManaged);
111
- afterEach(clearLicense);
112
- it('throws when no provider is registered', async () => {
113
- const ctrl = new ManagedTradingController(new TradingOverlayStore());
114
- await expect(ctrl.placeOrder(makeOrderInput())).rejects.toThrow(/no execution provider/i);
115
- });
116
- it('writes a pending order to overlay before provider responds', async () => {
117
- const store = new TradingOverlayStore();
118
- const ctrl = new ManagedTradingController(store);
119
- let resolveAck;
120
- const provider = makeMockProvider({
121
- placeOrder: vi.fn().mockImplementation(() => new Promise((res) => {
122
- resolveAck = () => res({ orderId: 'prov-001', status: 'open' });
123
- })),
124
- });
125
- ctrl.registerProvider(provider);
126
- const promise = ctrl.placeOrder(makeOrderInput());
127
- // Overlay should have a pending entry immediately (optimistic)
128
- expect(store.getOrders().some(o => o.status === 'pending')).toBe(true);
129
- resolveAck();
130
- await promise;
131
- });
132
- it('updates overlay with provider-assigned id on success', async () => {
133
- const store = new TradingOverlayStore();
134
- const ctrl = new ManagedTradingController(store);
135
- const provider = makeMockProvider({
136
- placeOrder: vi.fn().mockResolvedValue({ orderId: 'server-id-1', status: 'open' }),
137
- });
138
- ctrl.registerProvider(provider);
139
- await ctrl.placeOrder(makeOrderInput());
140
- const orders = store.getOrders();
141
- expect(orders.some(o => o.id === 'server-id-1' && o.status === 'open')).toBe(true);
142
- });
143
- it('rolls back to rejected status when provider throws', async () => {
144
- const store = new TradingOverlayStore();
145
- const ctrl = new ManagedTradingController(store);
146
- const provider = makeMockProvider({
147
- placeOrder: vi.fn().mockRejectedValue(new Error('venue rejected')),
148
- });
149
- ctrl.registerProvider(provider);
150
- await expect(ctrl.placeOrder(makeOrderInput())).rejects.toThrow('venue rejected');
151
- const orders = store.getOrders();
152
- expect(orders.some(o => o.status === 'rejected')).toBe(true);
153
- });
154
- it('delegates to the registered provider', async () => {
155
- const store = new TradingOverlayStore();
156
- const ctrl = new ManagedTradingController(store);
157
- const mockFn = vi.fn().mockResolvedValue({ orderId: 'x', status: 'open' });
158
- ctrl.registerProvider(makeMockProvider({ placeOrder: mockFn }));
159
- const input = makeOrderInput({ side: 'sell', qty: 3 });
160
- await ctrl.placeOrder(input);
161
- expect(mockFn).toHaveBeenCalledOnce();
162
- expect(mockFn).toHaveBeenCalledWith(input);
163
- });
164
- });
165
- // ─── cancelOrder ─────────────────────────────────────────────────────────────
166
- describe('ManagedTradingController — cancelOrder', () => {
167
- beforeEach(installManaged);
168
- afterEach(clearLicense);
169
- it('updates overlay status to cancelled after provider confirms', async () => {
170
- const store = new TradingOverlayStore();
171
- const ctrl = new ManagedTradingController(store);
172
- ctrl.registerProvider(makeMockProvider());
173
- await ctrl.placeOrder(makeOrderInput());
174
- // Find the confirmed order id
175
- const orderId = store.getOrders().find(o => o.status === 'open')?.id;
176
- expect(orderId).toBeDefined();
177
- await ctrl.cancelOrder(orderId);
178
- expect(store.getOrders().find(o => o.id === orderId).status).toBe('cancelled');
179
- });
180
- });
181
- // ─── modifyOrder ──────────────────────────────────────────────────────────────
182
- describe('ManagedTradingController — modifyOrder', () => {
183
- beforeEach(installManaged);
184
- afterEach(clearLicense);
185
- it('patches price in overlay when limitPrice is provided', async () => {
186
- const store = new TradingOverlayStore();
187
- const ctrl = new ManagedTradingController(store);
188
- ctrl.registerProvider(makeMockProvider());
189
- await ctrl.placeOrder(makeOrderInput({ limitPrice: 50_000 }));
190
- const orderId = store.getOrders().find(o => o.status === 'open')?.id;
191
- expect(orderId).toBeDefined();
192
- await ctrl.modifyOrder(orderId, { limitPrice: 51_000 });
193
- expect(store.getOrders().find(o => o.id === orderId).price).toBe(51_000);
194
- });
195
- it('patches qty in overlay when qty is provided', async () => {
196
- const store = new TradingOverlayStore();
197
- const ctrl = new ManagedTradingController(store);
198
- ctrl.registerProvider(makeMockProvider());
199
- await ctrl.placeOrder(makeOrderInput({ qty: 1 }));
200
- const orderId = store.getOrders().find(o => o.status === 'open')?.id;
201
- await ctrl.modifyOrder(orderId, { qty: 5 });
202
- expect(store.getOrders().find(o => o.id === orderId).qty).toBe(5);
203
- });
204
- });
205
- // ─── placeBracketOrder ────────────────────────────────────────────────────────
206
- describe('ManagedTradingController — placeBracketOrder', () => {
207
- beforeEach(installManaged);
208
- afterEach(clearLicense);
209
- it('throws without a provider', async () => {
210
- const ctrl = new ManagedTradingController(new TradingOverlayStore());
211
- const input = {
212
- entry: makeOrderInput(),
213
- stopLossPrice: 49_000,
214
- takeProfitPrice: 55_000,
215
- };
216
- await expect(ctrl.placeBracketOrder(input)).rejects.toThrow(/no execution provider/i);
217
- });
218
- it('creates 3 orders sharing a groupId in the overlay', async () => {
219
- const store = new TradingOverlayStore();
220
- const ctrl = new ManagedTradingController(store);
221
- ctrl.registerProvider(makeMockProvider());
222
- const groupId = 'bracket-test';
223
- const input = {
224
- entry: makeOrderInput({ groupId }),
225
- stopLossPrice: 49_000,
226
- takeProfitPrice: 55_000,
227
- };
228
- await ctrl.placeBracketOrder(input);
229
- const group = store.getOrdersByGroup(groupId);
230
- expect(group).toHaveLength(3);
231
- const roles = group.map(o => o.role).sort();
232
- expect(roles).toContain('entry');
233
- expect(roles).toContain('stop_loss');
234
- expect(roles).toContain('take_profit');
235
- });
236
- });
237
- // ─── reportFill ───────────────────────────────────────────────────────────────
238
- describe('ManagedTradingController — reportFill', () => {
239
- beforeEach(installManaged);
240
- afterEach(clearLicense);
241
- it('pushes fill into overlay store', async () => {
242
- const store = new TradingOverlayStore();
243
- const ctrl = new ManagedTradingController(store);
244
- ctrl.registerProvider(makeMockProvider());
245
- await ctrl.placeOrder(makeOrderInput());
246
- const orderId = store.getOrders().find(o => o.status === 'open')?.id ?? 'oid';
247
- const fill = {
248
- id: 'fill-1',
249
- orderId,
250
- side: 'buy',
251
- price: 50_000,
252
- qty: 1,
253
- timestamp: Date.now(),
254
- };
255
- ctrl.reportFill(fill);
256
- expect(store.getFills()).toHaveLength(1);
257
- expect(store.getFills()[0].id).toBe('fill-1');
258
- });
259
- it('updates order status to filled after a fill report', async () => {
260
- const store = new TradingOverlayStore();
261
- const ctrl = new ManagedTradingController(store);
262
- ctrl.registerProvider(makeMockProvider());
263
- await ctrl.placeOrder(makeOrderInput());
264
- const orderId = store.getOrders().find(o => o.status === 'open')?.id ?? 'oid';
265
- ctrl.reportFill({
266
- id: 'fill-2', orderId, side: 'buy', price: 50_000, qty: 1, timestamp: Date.now(),
267
- });
268
- expect(store.getOrders().find(o => o.id === orderId).status).toBe('filled');
269
- });
270
- });
271
- //# sourceMappingURL=ManagedTradingController.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ManagedTradingController.test.js","sourceRoot":"","sources":["../../../src/trading/__tests__/ManagedTradingController.test.ts"],"names":[],"mappings":"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"}
@@ -1,267 +0,0 @@
1
- /**
2
- * TradingOverlayStore — unit tests
3
- *
4
- * Covers:
5
- * - Orders: set, upsert, remove, getByGroup
6
- * - Positions: set, upsert, remove
7
- * - Fills: push, getFills, getFillsByOrder
8
- * - clear() resets everything
9
- * - snapshot() reflects current state
10
- * - onChange subscriber fires on every mutation
11
- * - Both unmanaged and managed pathways can write into the same store
12
- * - groupId-based linked orders coexist correctly
13
- * - TP / SL / entry roles are stored verbatim
14
- */
15
- import { describe, it, expect, beforeEach, vi } from 'vitest';
16
- import { TradingOverlayStore } from '../TradingOverlayStore';
17
- // ─── Helpers ──────────────────────────────────────────────────────────────────
18
- function makeOrder(id, overrides = {}) {
19
- return {
20
- id,
21
- role: 'entry',
22
- side: 'buy',
23
- status: 'open',
24
- price: 100,
25
- qty: 1,
26
- ...overrides,
27
- };
28
- }
29
- function makePosition(id, overrides = {}) {
30
- return {
31
- id,
32
- side: 'long',
33
- status: 'open',
34
- entryPrice: 100,
35
- qty: 1,
36
- ...overrides,
37
- };
38
- }
39
- function makeFill(id, orderId) {
40
- return {
41
- id,
42
- side: 'buy',
43
- price: 100,
44
- qty: 1,
45
- timestamp: Date.now(),
46
- ...(orderId !== undefined ? { orderId } : {}),
47
- };
48
- }
49
- // ─── Orders ───────────────────────────────────────────────────────────────────
50
- describe('TradingOverlayStore — orders', () => {
51
- let store;
52
- beforeEach(() => { store = new TradingOverlayStore(); });
53
- it('starts empty', () => {
54
- expect(store.getOrders()).toHaveLength(0);
55
- });
56
- it('setOrders replaces the entire set', () => {
57
- store.setOrders([makeOrder('a'), makeOrder('b')]);
58
- expect(store.getOrders()).toHaveLength(2);
59
- store.setOrders([makeOrder('c')]);
60
- expect(store.getOrders()).toHaveLength(1);
61
- expect(store.getOrders()[0].id).toBe('c');
62
- });
63
- it('upsertOrder inserts a new order', () => {
64
- store.upsertOrder(makeOrder('o1'));
65
- expect(store.getOrders()).toHaveLength(1);
66
- expect(store.getOrders()[0].id).toBe('o1');
67
- });
68
- it('upsertOrder replaces an existing order by id', () => {
69
- store.upsertOrder(makeOrder('o1', { price: 100 }));
70
- store.upsertOrder(makeOrder('o1', { price: 200 }));
71
- expect(store.getOrders()).toHaveLength(1);
72
- expect(store.getOrders()[0].price).toBe(200);
73
- });
74
- it('removeOrder removes by id', () => {
75
- store.upsertOrder(makeOrder('o1'));
76
- store.upsertOrder(makeOrder('o2'));
77
- store.removeOrder('o1');
78
- expect(store.getOrders()).toHaveLength(1);
79
- expect(store.getOrders()[0].id).toBe('o2');
80
- });
81
- it('removeOrder is a silent no-op for unknown id', () => {
82
- store.upsertOrder(makeOrder('o1'));
83
- store.removeOrder('nonexistent');
84
- expect(store.getOrders()).toHaveLength(1);
85
- });
86
- it('getOrdersByGroup filters correctly', () => {
87
- store.setOrders([
88
- makeOrder('entry', { groupId: 'bracket1', role: 'entry' }),
89
- makeOrder('sl', { groupId: 'bracket1', role: 'stop_loss' }),
90
- makeOrder('tp', { groupId: 'bracket1', role: 'take_profit' }),
91
- makeOrder('lone', { role: 'limit' }), // no groupId
92
- ]);
93
- const group = store.getOrdersByGroup('bracket1');
94
- expect(group).toHaveLength(3);
95
- const roles = group.map(o => o.role).sort();
96
- expect(roles).toEqual(['entry', 'stop_loss', 'take_profit']);
97
- });
98
- it('getOrdersByGroup returns [] for unknown groupId', () => {
99
- store.upsertOrder(makeOrder('o1', { groupId: 'g1' }));
100
- expect(store.getOrdersByGroup('g2')).toHaveLength(0);
101
- });
102
- });
103
- // ─── Positions ────────────────────────────────────────────────────────────────
104
- describe('TradingOverlayStore — positions', () => {
105
- let store;
106
- beforeEach(() => { store = new TradingOverlayStore(); });
107
- it('starts empty', () => {
108
- expect(store.getPositions()).toHaveLength(0);
109
- });
110
- it('setPositions replaces the entire set', () => {
111
- store.setPositions([makePosition('p1'), makePosition('p2')]);
112
- expect(store.getPositions()).toHaveLength(2);
113
- store.setPositions([]);
114
- expect(store.getPositions()).toHaveLength(0);
115
- });
116
- it('upsertPosition inserts when missing', () => {
117
- store.upsertPosition(makePosition('p1'));
118
- expect(store.getPositions()).toHaveLength(1);
119
- });
120
- it('upsertPosition updates when id matches', () => {
121
- store.upsertPosition(makePosition('p1', { qty: 1 }));
122
- store.upsertPosition(makePosition('p1', { qty: 5 }));
123
- expect(store.getPositions()).toHaveLength(1);
124
- expect(store.getPositions()[0].qty).toBe(5);
125
- });
126
- it('removePosition removes by id', () => {
127
- store.upsertPosition(makePosition('p1'));
128
- store.removePosition('p1');
129
- expect(store.getPositions()).toHaveLength(0);
130
- });
131
- it('removePosition is a silent no-op for unknown id', () => {
132
- expect(() => store.removePosition('ghost')).not.toThrow();
133
- });
134
- });
135
- // ─── Fills ────────────────────────────────────────────────────────────────────
136
- describe('TradingOverlayStore — fills', () => {
137
- let store;
138
- beforeEach(() => { store = new TradingOverlayStore(); });
139
- it('starts empty', () => {
140
- expect(store.getFills()).toHaveLength(0);
141
- });
142
- it('pushExecution appends fills in order', () => {
143
- store.pushExecution(makeFill('f1'));
144
- store.pushExecution(makeFill('f2'));
145
- expect(store.getFills()).toHaveLength(2);
146
- expect(store.getFills()[0].id).toBe('f1');
147
- expect(store.getFills()[1].id).toBe('f2');
148
- });
149
- it('getFillsByOrder filters by orderId', () => {
150
- store.pushExecution(makeFill('f1', 'orderA'));
151
- store.pushExecution(makeFill('f2', 'orderB'));
152
- store.pushExecution(makeFill('f3', 'orderA'));
153
- const fills = store.getFillsByOrder('orderA');
154
- expect(fills).toHaveLength(2);
155
- expect(fills.map(f => f.id)).toEqual(['f1', 'f3']);
156
- });
157
- it('getFillsByOrder returns [] for unknown orderId', () => {
158
- store.pushExecution(makeFill('f1', 'o1'));
159
- expect(store.getFillsByOrder('unknown')).toHaveLength(0);
160
- });
161
- });
162
- // ─── clear & snapshot ─────────────────────────────────────────────────────────
163
- describe('TradingOverlayStore — clear and snapshot', () => {
164
- let store;
165
- beforeEach(() => { store = new TradingOverlayStore(); });
166
- it('clear() removes all state', () => {
167
- store.upsertOrder(makeOrder('o1'));
168
- store.upsertPosition(makePosition('p1'));
169
- store.pushExecution(makeFill('f1'));
170
- store.clear();
171
- expect(store.getOrders()).toHaveLength(0);
172
- expect(store.getPositions()).toHaveLength(0);
173
- expect(store.getFills()).toHaveLength(0);
174
- });
175
- it('snapshot() reflects the current state', () => {
176
- store.upsertOrder(makeOrder('o1'));
177
- store.upsertPosition(makePosition('p1'));
178
- store.pushExecution(makeFill('f1'));
179
- const snap = store.snapshot();
180
- expect(snap.orders).toHaveLength(1);
181
- expect(snap.positions).toHaveLength(1);
182
- expect(snap.fills).toHaveLength(1);
183
- });
184
- });
185
- // ─── onChange subscription ────────────────────────────────────────────────────
186
- describe('TradingOverlayStore — onChange notifications', () => {
187
- let store;
188
- beforeEach(() => { store = new TradingOverlayStore(); });
189
- function countCalls(fn) {
190
- const spy = vi.fn();
191
- const unsub = store.onChange(spy);
192
- fn();
193
- unsub();
194
- return spy.mock.calls.length;
195
- }
196
- it('fires on setOrders', () => {
197
- expect(countCalls(() => store.setOrders([makeOrder('o1')]))).toBe(1);
198
- });
199
- it('fires on upsertOrder', () => {
200
- expect(countCalls(() => store.upsertOrder(makeOrder('o1')))).toBe(1);
201
- });
202
- it('fires on removeOrder (when item exists)', () => {
203
- store.upsertOrder(makeOrder('o1'));
204
- expect(countCalls(() => store.removeOrder('o1'))).toBe(1);
205
- });
206
- it('does NOT fire on removeOrder for unknown id', () => {
207
- expect(countCalls(() => store.removeOrder('ghost'))).toBe(0);
208
- });
209
- it('fires on setPositions', () => {
210
- expect(countCalls(() => store.setPositions([makePosition('p1')]))).toBe(1);
211
- });
212
- it('fires on upsertPosition', () => {
213
- expect(countCalls(() => store.upsertPosition(makePosition('p1')))).toBe(1);
214
- });
215
- it('fires on pushExecution', () => {
216
- expect(countCalls(() => store.pushExecution(makeFill('f1')))).toBe(1);
217
- });
218
- it('fires on clear', () => {
219
- expect(countCalls(() => store.clear())).toBe(1);
220
- });
221
- it('unsubscribe stops future notifications', () => {
222
- const spy = vi.fn();
223
- const unsub = store.onChange(spy);
224
- unsub();
225
- store.upsertOrder(makeOrder('o1'));
226
- expect(spy).not.toHaveBeenCalled();
227
- });
228
- });
229
- // ─── Shared overlay: both modes write into the same store ─────────────────────
230
- describe('TradingOverlayStore — shared between unmanaged and managed pathways', () => {
231
- it('unmanaged push and managed push coexist in the same store', () => {
232
- const store = new TradingOverlayStore();
233
- // Simulate unmanaged host pushing an external position
234
- store.upsertPosition(makePosition('ext-pos', { qty: 2 }));
235
- // Simulate managed controller pushing an order (e.g. bracket entry)
236
- store.upsertOrder(makeOrder('mgd-entry', { groupId: 'brk1', role: 'entry' }));
237
- store.upsertOrder(makeOrder('mgd-sl', { groupId: 'brk1', role: 'stop_loss', price: 90 }));
238
- store.upsertOrder(makeOrder('mgd-tp', { groupId: 'brk1', role: 'take_profit', price: 115 }));
239
- expect(store.getPositions()).toHaveLength(1);
240
- expect(store.getOrders()).toHaveLength(3);
241
- expect(store.getOrdersByGroup('brk1')).toHaveLength(3);
242
- });
243
- it('groupId-based bracket legs can coexist alongside unlinked orders', () => {
244
- const store = new TradingOverlayStore();
245
- store.upsertOrder(makeOrder('solo', { role: 'limit' }));
246
- store.upsertOrder(makeOrder('b1-ent', { groupId: 'brk-A', role: 'entry' }));
247
- store.upsertOrder(makeOrder('b1-sl', { groupId: 'brk-A', role: 'stop_loss' }));
248
- store.upsertOrder(makeOrder('b1-tp', { groupId: 'brk-A', role: 'take_profit' }));
249
- store.upsertOrder(makeOrder('b2-ent', { groupId: 'brk-B', role: 'entry' }));
250
- store.upsertOrder(makeOrder('b2-sl', { groupId: 'brk-B', role: 'stop_loss' }));
251
- expect(store.getOrders()).toHaveLength(6);
252
- expect(store.getOrdersByGroup('brk-A')).toHaveLength(3);
253
- expect(store.getOrdersByGroup('brk-B')).toHaveLength(2);
254
- });
255
- it('TP / SL / entry roles are stored verbatim', () => {
256
- const store = new TradingOverlayStore();
257
- const entry = makeOrder('entry-1', { role: 'entry', price: 100 });
258
- const sl = makeOrder('sl-1', { role: 'stop_loss', price: 90 });
259
- const tp = makeOrder('tp-1', { role: 'take_profit', price: 115 });
260
- store.setOrders([entry, sl, tp]);
261
- const orders = store.getOrders();
262
- expect(orders.find(o => o.id === 'entry-1').role).toBe('entry');
263
- expect(orders.find(o => o.id === 'sl-1').role).toBe('stop_loss');
264
- expect(orders.find(o => o.id === 'tp-1').role).toBe('take_profit');
265
- });
266
- });
267
- //# sourceMappingURL=TradingOverlayStore.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TradingOverlayStore.test.js","sourceRoot":"","sources":["../../../src/trading/__tests__/TradingOverlayStore.test.ts"],"names":[],"mappings":"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"}