@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,310 +0,0 @@
1
- /**
2
- * ChartRuntimeResolver
3
- *
4
- * Single source of truth for runtime capability queries.
5
- * Mode is always derived from the installed LicenseManager state — it is
6
- * never passed in by chart config, ensuring clients cannot bypass the
7
- * license-driven mode selection.
8
- *
9
- * Usage:
10
- * import { ChartRuntimeResolver } from '@forgecharts/sdk';
11
- * const resolver = ChartRuntimeResolver.getInstance();
12
- *
13
- * resolver.isManagedMode() // true when a managed license is active
14
- * resolver.isUnmanagedMode() // true when no license or unmanaged license
15
- * resolver.canUseOrderEntry() // built-in order entry UI
16
- * resolver.canUseExternalIngestion() // external data ingestion APIs
17
- * resolver.canRenderOverlays() // overlay rendering
18
- * resolver.canUseIndicators() // indicator panel
19
- * resolver.canUseManagedTrading() // managed broker / execution hooks
20
- * resolver.canUseDraggableOrders() // drag-to-price order placement
21
- * resolver.canUseBracketOrders() // bracket / OCO order support
22
- *
23
- * Capability matrix
24
- * ─────────────────────────────────────────────────────
25
- * Capability unmanaged managed
26
- * ─────────────────────────────────────────────────────
27
- * externalIngestion ✓ ✗ (managed feed owns data)
28
- * overlays ✓ ✓ (both modes render overlays)
29
- * indicators ✓ ✓
30
- * orderEntry ✗ ✓ (requires managed license)
31
- * managedTrading ✗ ✓
32
- * draggableOrders ✗ ✓
33
- * bracketOrders ✗ ✓
34
- * ─────────────────────────────────────────────────────
35
- *
36
- * Feature flags in the LicensePayload can further restrict capabilities
37
- * within a mode. A managed license with `orderEntry: false` will still
38
- * return false from canUseOrderEntry().
39
- */
40
- import { LicenseManager } from './LicenseManager';
41
- export class ChartRuntimeResolver {
42
- static instance = null;
43
- /** Always read from the singleton LicenseManager — never store a copy. */
44
- get lm() {
45
- return LicenseManager.getInstance();
46
- }
47
- constructor() { }
48
- static getInstance() {
49
- if (!ChartRuntimeResolver.instance) {
50
- ChartRuntimeResolver.instance = new ChartRuntimeResolver();
51
- }
52
- return ChartRuntimeResolver.instance;
53
- }
54
- // ── Mode checks ─────────────────────────────────────────────────────────────
55
- /** True when the active license is in managed mode. */
56
- isManagedMode() {
57
- return this.lm.getMode() === 'managed';
58
- }
59
- /** True when no license is installed or the license is in unmanaged mode. */
60
- isUnmanagedMode() {
61
- return this.lm.getMode() === 'unmanaged';
62
- }
63
- // ── Capability queries ───────────────────────────────────────────────────────
64
- /**
65
- * External data ingestion APIs (e.g. pushing tick data from an external broker).
66
- * Available in unmanaged mode only — in managed mode the built-in feed owns data.
67
- * Override via `unmanagedIngestion` feature flag on a managed license if needed.
68
- */
69
- canUseExternalIngestion() {
70
- if (this.isUnmanagedMode())
71
- return true;
72
- // A managed license can explicitly opt-in to external ingestion
73
- return this.#featureOrDefault('unmanagedIngestion', false);
74
- }
75
- /**
76
- * Overlay rendering from external state (price levels, zones, signals).
77
- * Enabled in both modes by default; can be restricted via feature flag.
78
- */
79
- canRenderOverlays() {
80
- return this.#featureOrDefault('overlays', true);
81
- }
82
- /**
83
- * Indicator panel / computations.
84
- * Enabled in both modes by default; can be restricted via feature flag.
85
- */
86
- canUseIndicators() {
87
- return this.#featureOrDefault('indicators', true);
88
- }
89
- /**
90
- * Built-in order entry UI hooks.
91
- * Requires managed mode AND the `orderEntry` feature flag (or no flag restriction).
92
- */
93
- canUseOrderEntry() {
94
- if (this.isUnmanagedMode())
95
- return false;
96
- return this.#featureOrDefault('orderEntry', true);
97
- }
98
- /**
99
- * Managed trading service hooks (broker execution, position management).
100
- * Requires managed mode AND the `managedTrading` feature flag (or no flag restriction).
101
- */
102
- canUseManagedTrading() {
103
- if (this.isUnmanagedMode())
104
- return false;
105
- return this.#featureOrDefault('managedTrading', true);
106
- }
107
- /**
108
- * Drag-to-price order placement.
109
- * Requires managed mode AND the `draggableOrders` feature flag (or no flag restriction).
110
- */
111
- canUseDraggableOrders() {
112
- if (this.isUnmanagedMode())
113
- return false;
114
- return this.#featureOrDefault('draggableOrders', true);
115
- }
116
- /**
117
- * Bracket / OCO order support.
118
- * Requires managed mode AND the `bracketOrders` feature flag (or no flag restriction).
119
- */
120
- canUseBracketOrders() {
121
- if (this.isUnmanagedMode())
122
- return false;
123
- return this.#featureOrDefault('bracketOrders', true);
124
- }
125
- // ── UI render capability checks ──────────────────────────────────────────────
126
- // These are component-level gates. They derive from the feature-level checks
127
- // above and are the checks that toolbar / panel components should consume.
128
- /**
129
- * Whether to render the order entry tool in the toolbar.
130
- * Hidden in unmanaged mode — requires managed license with order entry.
131
- */
132
- canRenderOrderEntry() {
133
- return this.canUseOrderEntry();
134
- }
135
- /**
136
- * Whether to render Buy / Sell action buttons on the chart or toolbar.
137
- * Hidden in unmanaged mode — order placement requires managed license.
138
- */
139
- canRenderBuySellButtons() {
140
- return this.canUseOrderEntry();
141
- }
142
- /**
143
- * Whether to render the order ticket panel (entry form / DOM entry).
144
- * Requires managed mode with order entry enabled.
145
- */
146
- canRenderOrderTicket() {
147
- return this.canUseOrderEntry();
148
- }
149
- /**
150
- * Whether to render bracket order controls (TP, SL, OCO).
151
- * Requires managed mode with order entry AND the bracketOrders feature flag.
152
- * If order entry itself is disabled, bracket controls are also hidden.
153
- */
154
- canRenderBracketControls() {
155
- if (!this.canUseOrderEntry())
156
- return false;
157
- return this.canUseBracketOrders();
158
- }
159
- /**
160
- * Whether to render order modification controls (drag-to-modify, edit panel).
161
- * Requires managed mode with order entry AND the draggableOrders feature flag.
162
- * If order entry itself is disabled, modification controls are also hidden.
163
- */
164
- canRenderOrderModificationControls() {
165
- if (!this.canUseOrderEntry())
166
- return false;
167
- return this.canUseDraggableOrders();
168
- }
169
- /**
170
- * Whether to render the managed trading control panel as a whole.
171
- * Guards the container that holds buy/sell, order ticket, bracket controls, etc.
172
- */
173
- canRenderManagedTradingControls() {
174
- return this.canUseManagedTrading();
175
- }
176
- /**
177
- * True when the chart is in external-overlay-only (unmanaged) mode.
178
- * Drives rendering of the external data overlay panel while suppressing
179
- * all order entry UI elements.
180
- */
181
- canRenderExternalOverlayOnlyMode() {
182
- return this.isUnmanagedMode();
183
- }
184
- /**
185
- * Positions are always rendered regardless of license mode.
186
- * Data flows from TradingOverlayStore (host-pushed in unmanaged,
187
- * ManagedTradingController-driven in managed).
188
- */
189
- canRenderPositions() {
190
- return true;
191
- }
192
- /**
193
- * Execution fills are always rendered regardless of license mode.
194
- */
195
- canRenderFills() {
196
- return true;
197
- }
198
- /**
199
- * Candles are always rendered — unaffected by license mode.
200
- * The RapidAPI datafeed remains active in all modes.
201
- */
202
- canRenderCandles() {
203
- return true;
204
- }
205
- /**
206
- * Indicator panel follows the `indicators` feature flag.
207
- * Enabled in both modes by default.
208
- */
209
- canRenderIndicators() {
210
- return this.canUseIndicators();
211
- }
212
- /**
213
- * Drawing tools are always available regardless of license mode.
214
- */
215
- canRenderDrawings() {
216
- return true;
217
- }
218
- // ── Convenience snapshot ────────────────────────────────────────────────────
219
- /**
220
- * Returns the full capability set as a plain object — useful for logging,
221
- * debug panels, or passing state to React context in one call.
222
- */
223
- getCapabilities() {
224
- return {
225
- // ── Mode & feature-level flags ──────────────────────────────────────
226
- mode: this.lm.getMode(),
227
- externalIngestion: this.canUseExternalIngestion(),
228
- overlays: this.canRenderOverlays(),
229
- indicators: this.canUseIndicators(),
230
- orderEntry: this.canUseOrderEntry(),
231
- managedTrading: this.canUseManagedTrading(),
232
- draggableOrders: this.canUseDraggableOrders(),
233
- bracketOrders: this.canUseBracketOrders(),
234
- // ── UI render flags ─────────────────────────────────────────────────
235
- renderOrderEntry: this.canRenderOrderEntry(),
236
- renderBuySellButtons: this.canRenderBuySellButtons(),
237
- renderOrderTicket: this.canRenderOrderTicket(),
238
- renderBracketControls: this.canRenderBracketControls(),
239
- renderOrderModificationControls: this.canRenderOrderModificationControls(),
240
- renderManagedTradingControls: this.canRenderManagedTradingControls(),
241
- renderExternalOverlayOnly: this.canRenderExternalOverlayOnlyMode(),
242
- renderPositions: this.canRenderPositions(),
243
- renderFills: this.canRenderFills(),
244
- renderCandles: this.canRenderCandles(),
245
- renderIndicators: this.canRenderIndicators(),
246
- renderDrawings: this.canRenderDrawings(),
247
- };
248
- }
249
- // ── Private helpers ─────────────────────────────────────────────────────────
250
- /**
251
- * If the active license has an explicit feature flag, use it.
252
- * Otherwise fall back to `defaultValue` (allows capability even without an
253
- * explicit flag, matching the "omitted = allowed" convention).
254
- */
255
- #featureOrDefault(name, defaultValue) {
256
- const features = this.lm.getFeatures();
257
- const flag = features[name];
258
- return flag === undefined ? defaultValue : flag === true;
259
- }
260
- }
261
- // ── Module-level convenience functions ───────────────────────────────────────
262
- // These mirror the instance methods and are the recommended import style for
263
- // non-class consumers.
264
- const resolver = () => ChartRuntimeResolver.getInstance();
265
- /** True when a managed license is active. */
266
- export const isManagedMode = () => resolver().isManagedMode();
267
- /** True when no license or unmanaged license is active (safe default). */
268
- export const isUnmanagedMode = () => resolver().isUnmanagedMode();
269
- /** External data ingestion APIs (unmanaged mode only by default). */
270
- export const canUseExternalIngestion = () => resolver().canUseExternalIngestion();
271
- /** Overlay rendering — enabled in both modes. */
272
- export const canRenderOverlays = () => resolver().canRenderOverlays();
273
- /** Indicator computations — enabled in both modes. */
274
- export const canUseIndicators = () => resolver().canUseIndicators();
275
- /** Built-in order entry UI — managed mode only. */
276
- export const canUseOrderEntry = () => resolver().canUseOrderEntry();
277
- /** Managed trading service hooks — managed mode only. */
278
- export const canUseManagedTrading = () => resolver().canUseManagedTrading();
279
- /** Drag-to-price order placement — managed mode only. */
280
- export const canUseDraggableOrders = () => resolver().canUseDraggableOrders();
281
- /** Bracket / OCO order support — managed mode only. */
282
- export const canUseBracketOrders = () => resolver().canUseBracketOrders();
283
- /** Full capability snapshot as a plain object. */
284
- export const getCapabilities = () => resolver().getCapabilities();
285
- // ── UI render convenience functions ──────────────────────────────────────────
286
- /** Whether to render the order entry tool in toolbars (managed only). */
287
- export const canRenderOrderEntry = () => resolver().canRenderOrderEntry();
288
- /** Whether to render Buy/Sell buttons (managed only). */
289
- export const canRenderBuySellButtons = () => resolver().canRenderBuySellButtons();
290
- /** Whether to render the order ticket panel (managed only). */
291
- export const canRenderOrderTicket = () => resolver().canRenderOrderTicket();
292
- /** Whether to render bracket / OCO controls (managed + bracketOrders feature). */
293
- export const canRenderBracketControls = () => resolver().canRenderBracketControls();
294
- /** Whether to render drag/edit order modification controls (managed + draggableOrders). */
295
- export const canRenderOrderModificationControls = () => resolver().canRenderOrderModificationControls();
296
- /** Whether to render the managed trading control panel (managed only). */
297
- export const canRenderManagedTradingControls = () => resolver().canRenderManagedTradingControls();
298
- /** True when in external-overlay-only (unmanaged) mode — hides all order-entry UI. */
299
- export const canRenderExternalOverlayOnlyMode = () => resolver().canRenderExternalOverlayOnlyMode();
300
- /** Positions always rendered regardless of mode. */
301
- export const canRenderPositions = () => resolver().canRenderPositions();
302
- /** Execution fills always rendered regardless of mode. */
303
- export const canRenderFills = () => resolver().canRenderFills();
304
- /** Candles always rendered — RapidAPI datafeed unaffected by mode. */
305
- export const canRenderCandles = () => resolver().canRenderCandles();
306
- /** Indicators follow the indicators feature flag (both modes by default). */
307
- export const canRenderIndicators = () => resolver().canRenderIndicators();
308
- /** Drawing tools always available regardless of license mode. */
309
- export const canRenderDrawings = () => resolver().canRenderDrawings();
310
- //# sourceMappingURL=ChartRuntimeResolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChartRuntimeResolver.js","sourceRoot":"","sources":["../../src/licensing/ChartRuntimeResolver.ts"],"names":[],"mappings":"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"}
@@ -1,114 +0,0 @@
1
- const DEFAULT_MODE = 'unmanaged';
2
- const DEFAULT_FEATURES = {};
3
- /**
4
- * LicenseManager — single source of truth for chart mode and feature access.
5
- *
6
- * Usage:
7
- * const lm = LicenseManager.getInstance();
8
- * await lm.validateLicense('my-key');
9
- * lm.getMode(); // 'managed' | 'unmanaged'
10
- * lm.hasFeature('orderEntry');
11
- */
12
- export class LicenseManager {
13
- static instance = null;
14
- payload = null;
15
- subscribers = new Set();
16
- constructor() { }
17
- /**
18
- * Subscribe to license state changes (loadLicense, validateLicense, clear).
19
- * Returns an unsubscribe function — call it to stop receiving notifications.
20
- *
21
- * @example
22
- * const unsub = LicenseManager.getInstance().subscribe(() => {
23
- * console.log('license changed', lm.getMode());
24
- * });
25
- * // later:
26
- * unsub();
27
- */
28
- subscribe(cb) {
29
- this.subscribers.add(cb);
30
- return () => this.subscribers.delete(cb);
31
- }
32
- notify() {
33
- this.subscribers.forEach((cb) => {
34
- try {
35
- cb();
36
- }
37
- catch { /* subscriber errors must not affect license state */ }
38
- });
39
- }
40
- static getInstance() {
41
- if (!LicenseManager.instance) {
42
- LicenseManager.instance = new LicenseManager();
43
- }
44
- return LicenseManager.instance;
45
- }
46
- /**
47
- * Validate a license key against the licensing endpoint.
48
- *
49
- * @param key The raw license key entered by the user.
50
- * @param verifyUrl Full URL of the forgecharts-admin verify endpoint,
51
- * e.g. "http://licenses.example.com:4100/api/public/license/verify"
52
- */
53
- async validateLicense(key, verifyUrl) {
54
- if (!key || !key.trim()) {
55
- throw new Error('LicenseManager: license key must not be empty');
56
- }
57
- if (!verifyUrl) {
58
- throw new Error('LicenseManager: verifyUrl is required');
59
- }
60
- const res = await fetch(verifyUrl, {
61
- method: 'POST',
62
- headers: { 'Content-Type': 'application/json' },
63
- body: JSON.stringify({ licenseKey: key.trim().toUpperCase() }),
64
- });
65
- if (!res.ok) {
66
- throw new Error(`License server error: ${res.status} ${res.statusText}`);
67
- }
68
- const data = await res.json();
69
- if (!data.valid) {
70
- throw new Error(data.reason ?? 'License invalid');
71
- }
72
- const payload = {
73
- licenseKey: data.licenseKey ?? key.trim().toUpperCase(),
74
- mode: (data.mode ?? 'unmanaged'),
75
- ...(data.plan != null && { plan: data.plan }),
76
- ...(data.expiresAt != null && { expires: data.expiresAt }),
77
- ...(data.features != null && { features: data.features }),
78
- };
79
- this.payload = payload;
80
- this.notify();
81
- return payload;
82
- }
83
- /** Load a pre-validated payload (e.g. from cache / localStorage). */
84
- loadLicense(payload) {
85
- this.payload = payload;
86
- this.notify();
87
- }
88
- /** Return the currently loaded payload, or null if none. */
89
- getLicense() {
90
- return this.payload;
91
- }
92
- /**
93
- * The chart mode driven by the active license.
94
- * Defaults to 'unmanaged' so no managed features appear without a valid
95
- * managed license.
96
- */
97
- getMode() {
98
- return this.payload?.mode ?? DEFAULT_MODE;
99
- }
100
- /** Return the feature flags for the active license. */
101
- getFeatures() {
102
- return this.payload?.features ?? DEFAULT_FEATURES;
103
- }
104
- /** Check whether a specific feature is enabled on the active license. */
105
- hasFeature(name) {
106
- return this.getFeatures()[name] === true;
107
- }
108
- /** Clear the current license state (returns to safe unmanaged defaults). */
109
- clear() {
110
- this.payload = null;
111
- this.notify();
112
- }
113
- }
114
- //# sourceMappingURL=LicenseManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LicenseManager.js","sourceRoot":"","sources":["../../src/licensing/LicenseManager.ts"],"names":[],"mappings":"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"}
@@ -1,177 +0,0 @@
1
- /**
2
- * ChartRuntimeResolver — unit tests
3
- *
4
- * Covers:
5
- * - No license → unmanaged, all managed UI hidden, overlays/indicators/drawings visible
6
- * - Unmanaged license → same as no license for UI gating
7
- * - Managed license → all managed UI visible, external ingestion blocked
8
- * - Feature flags override defaults within a mode
9
- * - getCapabilities() snapshot is consistent with individual methods
10
- * - Module-level convenience functions alias correctly
11
- */
12
- import { describe, it, expect, beforeEach } from 'vitest';
13
- import { LicenseManager } from '../LicenseManager';
14
- import { ChartRuntimeResolver } from '../ChartRuntimeResolver';
15
- function setLicense(payload) {
16
- const lm = LicenseManager.getInstance();
17
- if (payload === null) {
18
- lm.clear();
19
- }
20
- else {
21
- lm.loadLicense(payload);
22
- }
23
- }
24
- const UNMANAGED_PAYLOAD = { licenseKey: 'u1', mode: 'unmanaged' };
25
- const MANAGED_PAYLOAD = { licenseKey: 'm1', mode: 'managed' };
26
- describe('ChartRuntimeResolver — no license (safe defaults)', () => {
27
- beforeEach(() => setLicense(null));
28
- it('isUnmanagedMode() is true', () => {
29
- expect(ChartRuntimeResolver.getInstance().isUnmanagedMode()).toBe(true);
30
- });
31
- it('isManagedMode() is false', () => {
32
- expect(ChartRuntimeResolver.getInstance().isManagedMode()).toBe(false);
33
- });
34
- it('managed UI render flags are all false', () => {
35
- const r = ChartRuntimeResolver.getInstance();
36
- expect(r.canRenderOrderEntry()).toBe(false);
37
- expect(r.canRenderBuySellButtons()).toBe(false);
38
- expect(r.canRenderOrderTicket()).toBe(false);
39
- expect(r.canRenderBracketControls()).toBe(false);
40
- expect(r.canRenderOrderModificationControls()).toBe(false);
41
- expect(r.canRenderManagedTradingControls()).toBe(false);
42
- });
43
- it('canRenderExternalOverlayOnlyMode() is true', () => {
44
- expect(ChartRuntimeResolver.getInstance().canRenderExternalOverlayOnlyMode()).toBe(true);
45
- });
46
- it('always-on render flags remain true', () => {
47
- const r = ChartRuntimeResolver.getInstance();
48
- expect(r.canRenderCandles()).toBe(true);
49
- expect(r.canRenderIndicators()).toBe(true);
50
- expect(r.canRenderDrawings()).toBe(true);
51
- expect(r.canRenderPositions()).toBe(true);
52
- expect(r.canRenderFills()).toBe(true);
53
- expect(r.canRenderOverlays()).toBe(true);
54
- });
55
- it('external ingestion is allowed in unmanaged mode', () => {
56
- expect(ChartRuntimeResolver.getInstance().canUseExternalIngestion()).toBe(true);
57
- });
58
- });
59
- describe('ChartRuntimeResolver — explicit unmanaged license', () => {
60
- beforeEach(() => setLicense(UNMANAGED_PAYLOAD));
61
- it('matches the no-license behaviour for all managed flags', () => {
62
- const r = ChartRuntimeResolver.getInstance();
63
- expect(r.canRenderOrderEntry()).toBe(false);
64
- expect(r.canRenderManagedTradingControls()).toBe(false);
65
- expect(r.canRenderExternalOverlayOnlyMode()).toBe(true);
66
- expect(r.canRenderCandles()).toBe(true);
67
- });
68
- });
69
- describe('ChartRuntimeResolver — managed license (full features)', () => {
70
- beforeEach(() => setLicense(MANAGED_PAYLOAD));
71
- it('isManagedMode() is true', () => {
72
- expect(ChartRuntimeResolver.getInstance().isManagedMode()).toBe(true);
73
- });
74
- it('external ingestion is blocked in managed mode', () => {
75
- expect(ChartRuntimeResolver.getInstance().canUseExternalIngestion()).toBe(false);
76
- });
77
- it('managed UI render flags are all true (no feature restrictions)', () => {
78
- const r = ChartRuntimeResolver.getInstance();
79
- expect(r.canRenderOrderEntry()).toBe(true);
80
- expect(r.canRenderBuySellButtons()).toBe(true);
81
- expect(r.canRenderOrderTicket()).toBe(true);
82
- expect(r.canRenderBracketControls()).toBe(true);
83
- expect(r.canRenderOrderModificationControls()).toBe(true);
84
- expect(r.canRenderManagedTradingControls()).toBe(true);
85
- });
86
- it('canRenderExternalOverlayOnlyMode() is false', () => {
87
- expect(ChartRuntimeResolver.getInstance().canRenderExternalOverlayOnlyMode()).toBe(false);
88
- });
89
- it('always-on flags still true in managed mode', () => {
90
- const r = ChartRuntimeResolver.getInstance();
91
- expect(r.canRenderCandles()).toBe(true);
92
- expect(r.canRenderPositions()).toBe(true);
93
- expect(r.canRenderFills()).toBe(true);
94
- expect(r.canRenderDrawings()).toBe(true);
95
- });
96
- });
97
- describe('ChartRuntimeResolver — feature flags restrict managed capabilities', () => {
98
- it('orderEntry: false disables order entry render flags', () => {
99
- setLicense({ licenseKey: 'mf', mode: 'managed', features: { orderEntry: false } });
100
- const r = ChartRuntimeResolver.getInstance();
101
- expect(r.canRenderOrderEntry()).toBe(false);
102
- expect(r.canRenderBuySellButtons()).toBe(false);
103
- expect(r.canRenderOrderTicket()).toBe(false);
104
- // bracket/drag also depend on order entry
105
- expect(r.canRenderBracketControls()).toBe(false);
106
- expect(r.canRenderOrderModificationControls()).toBe(false);
107
- });
108
- it('bracketOrders: false hides bracket controls but not basic order entry', () => {
109
- setLicense({
110
- licenseKey: 'mb',
111
- mode: 'managed',
112
- features: { orderEntry: true, bracketOrders: false },
113
- });
114
- const r = ChartRuntimeResolver.getInstance();
115
- expect(r.canRenderOrderEntry()).toBe(true);
116
- expect(r.canRenderBracketControls()).toBe(false);
117
- });
118
- it('draggableOrders: false hides modification controls', () => {
119
- setLicense({
120
- licenseKey: 'md',
121
- mode: 'managed',
122
- features: { orderEntry: true, draggableOrders: false },
123
- });
124
- const r = ChartRuntimeResolver.getInstance();
125
- expect(r.canRenderOrderEntry()).toBe(true);
126
- expect(r.canRenderOrderModificationControls()).toBe(false);
127
- });
128
- it('indicators: false disables indicator rendering in both modes', () => {
129
- setLicense({ licenseKey: 'ui', mode: 'unmanaged', features: { indicators: false } });
130
- expect(ChartRuntimeResolver.getInstance().canRenderIndicators()).toBe(false);
131
- setLicense({ licenseKey: 'mi', mode: 'managed', features: { indicators: false } });
132
- expect(ChartRuntimeResolver.getInstance().canRenderIndicators()).toBe(false);
133
- });
134
- });
135
- describe('ChartRuntimeResolver — getCapabilities() snapshot', () => {
136
- it('snapshot is consistent with individual method values (unmanaged)', () => {
137
- setLicense(UNMANAGED_PAYLOAD);
138
- const r = ChartRuntimeResolver.getInstance();
139
- const caps = r.getCapabilities();
140
- expect(caps.mode).toBe('unmanaged');
141
- expect(caps.renderOrderEntry).toBe(r.canRenderOrderEntry());
142
- expect(caps.renderBuySellButtons).toBe(r.canRenderBuySellButtons());
143
- expect(caps.renderBracketControls).toBe(r.canRenderBracketControls());
144
- expect(caps.renderManagedTradingControls).toBe(r.canRenderManagedTradingControls());
145
- expect(caps.renderExternalOverlayOnly).toBe(r.canRenderExternalOverlayOnlyMode());
146
- expect(caps.renderCandles).toBe(true);
147
- });
148
- it('snapshot is consistent with individual method values (managed)', () => {
149
- setLicense(MANAGED_PAYLOAD);
150
- const r = ChartRuntimeResolver.getInstance();
151
- const caps = r.getCapabilities();
152
- expect(caps.mode).toBe('managed');
153
- expect(caps.renderOrderEntry).toBe(r.canRenderOrderEntry());
154
- expect(caps.renderBracketControls).toBe(r.canRenderBracketControls());
155
- expect(caps.renderExternalOverlayOnly).toBe(false);
156
- expect(caps.renderCandles).toBe(true);
157
- });
158
- });
159
- describe('ChartRuntimeResolver — module-level convenience exports', () => {
160
- it('module-level functions reflect the singleton state', async () => {
161
- const { isManagedMode, isUnmanagedMode, canRenderOrderEntry, canRenderManagedTradingControls, canRenderExternalOverlayOnlyMode, canRenderCandles, getCapabilities, } = await import('../ChartRuntimeResolver');
162
- setLicense(null);
163
- expect(isUnmanagedMode()).toBe(true);
164
- expect(isManagedMode()).toBe(false);
165
- expect(canRenderOrderEntry()).toBe(false);
166
- expect(canRenderManagedTradingControls()).toBe(false);
167
- expect(canRenderExternalOverlayOnlyMode()).toBe(true);
168
- expect(canRenderCandles()).toBe(true);
169
- expect(getCapabilities().mode).toBe('unmanaged');
170
- setLicense(MANAGED_PAYLOAD);
171
- expect(isManagedMode()).toBe(true);
172
- expect(canRenderOrderEntry()).toBe(true);
173
- expect(canRenderManagedTradingControls()).toBe(true);
174
- expect(canRenderExternalOverlayOnlyMode()).toBe(false);
175
- });
176
- });
177
- //# sourceMappingURL=ChartRuntimeResolver.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChartRuntimeResolver.test.js","sourceRoot":"","sources":["../../../src/licensing/__tests__/ChartRuntimeResolver.test.ts"],"names":[],"mappings":"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"}