@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,153 +0,0 @@
1
- /**
2
- * LicenseManager — unit tests
3
- *
4
- * Covers:
5
- * - Default mode is 'unmanaged' with no license installed
6
- * - loadLicense drives mode and features correctly
7
- * - validateLicense resolves a payload (placeholder logic)
8
- * - clear() resets to safe unmanaged defaults
9
- * - subscribe/unsubscribe fires on every mutation
10
- */
11
- import { describe, it, expect, beforeEach, vi } from 'vitest';
12
- import { LicenseManager } from '../LicenseManager';
13
- const FAKE_URL = 'http://localhost:4100/api/public/license/verify';
14
- // Stub fetch so validateLicense tests don't need a real server
15
- function stubFetch(response) {
16
- vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
17
- ok: true,
18
- json: async () => response,
19
- }));
20
- }
21
- // Always work with a fresh singleton state between tests
22
- function reset() {
23
- LicenseManager.getInstance().clear();
24
- vi.unstubAllGlobals();
25
- }
26
- describe('LicenseManager — defaults', () => {
27
- beforeEach(reset);
28
- it('default mode is unmanaged when no license installed', () => {
29
- expect(LicenseManager.getInstance().getMode()).toBe('unmanaged');
30
- });
31
- it('getLicense() returns null before any license is loaded', () => {
32
- expect(LicenseManager.getInstance().getLicense()).toBeNull();
33
- });
34
- it('getFeatures() returns an empty object by default', () => {
35
- expect(LicenseManager.getInstance().getFeatures()).toEqual({});
36
- });
37
- it('hasFeature() returns false for any key when no license', () => {
38
- const lm = LicenseManager.getInstance();
39
- expect(lm.hasFeature('orderEntry')).toBe(false);
40
- expect(lm.hasFeature('bracketOrders')).toBe(false);
41
- });
42
- });
43
- describe('LicenseManager — loadLicense', () => {
44
- beforeEach(reset);
45
- it('sets mode to managed when payload.mode is managed', () => {
46
- const lm = LicenseManager.getInstance();
47
- const payload = { licenseKey: 'k1', mode: 'managed' };
48
- lm.loadLicense(payload);
49
- expect(lm.getMode()).toBe('managed');
50
- });
51
- it('sets mode to unmanaged when payload.mode is unmanaged', () => {
52
- const lm = LicenseManager.getInstance();
53
- const payload = { licenseKey: 'k2', mode: 'unmanaged' };
54
- lm.loadLicense(payload);
55
- expect(lm.getMode()).toBe('unmanaged');
56
- });
57
- it('exposes feature flags from the payload', () => {
58
- const lm = LicenseManager.getInstance();
59
- lm.loadLicense({
60
- licenseKey: 'k3',
61
- mode: 'managed',
62
- features: { orderEntry: true, bracketOrders: true, draggableOrders: false },
63
- });
64
- expect(lm.hasFeature('orderEntry')).toBe(true);
65
- expect(lm.hasFeature('bracketOrders')).toBe(true);
66
- expect(lm.hasFeature('draggableOrders')).toBe(false);
67
- });
68
- it('getLicense() returns the loaded payload', () => {
69
- const lm = LicenseManager.getInstance();
70
- const payload = { licenseKey: 'k4', mode: 'managed' };
71
- lm.loadLicense(payload);
72
- expect(lm.getLicense()).toEqual(payload);
73
- });
74
- });
75
- describe('LicenseManager — validateLicense', () => {
76
- beforeEach(reset);
77
- it('resolves a LicensePayload for a non-empty key', async () => {
78
- stubFetch({ valid: true, licenseKey: 'TEST-KEY-XYZ', mode: 'unmanaged', plan: 'default', expiresAt: null, features: {} });
79
- const lm = LicenseManager.getInstance();
80
- const payload = await lm.validateLicense('test-key-xyz', FAKE_URL);
81
- expect(payload).toHaveProperty('licenseKey');
82
- expect(payload).toHaveProperty('mode');
83
- expect(lm.getLicense()).not.toBeNull();
84
- });
85
- it('rejects when the key is empty', async () => {
86
- const lm = LicenseManager.getInstance();
87
- await expect(lm.validateLicense('', FAKE_URL)).rejects.toThrow();
88
- });
89
- it('rejects when the key is whitespace-only', async () => {
90
- const lm = LicenseManager.getInstance();
91
- await expect(lm.validateLicense(' ', FAKE_URL)).rejects.toThrow();
92
- });
93
- });
94
- describe('LicenseManager — clear', () => {
95
- beforeEach(reset);
96
- it('resets mode to unmanaged after a managed license', () => {
97
- const lm = LicenseManager.getInstance();
98
- lm.loadLicense({ licenseKey: 'k', mode: 'managed' });
99
- expect(lm.getMode()).toBe('managed');
100
- lm.clear();
101
- expect(lm.getMode()).toBe('unmanaged');
102
- });
103
- it('nulls out getLicense() after clear', () => {
104
- const lm = LicenseManager.getInstance();
105
- lm.loadLicense({ licenseKey: 'k', mode: 'managed' });
106
- lm.clear();
107
- expect(lm.getLicense()).toBeNull();
108
- });
109
- });
110
- describe('LicenseManager — subscribe / notify', () => {
111
- beforeEach(reset);
112
- it('subscriber is called when loadLicense is invoked', () => {
113
- const lm = LicenseManager.getInstance();
114
- const spy = vi.fn();
115
- lm.subscribe(spy);
116
- lm.loadLicense({ licenseKey: 'k', mode: 'unmanaged' });
117
- expect(spy).toHaveBeenCalledTimes(1);
118
- });
119
- it('subscriber is called when clear() is invoked', () => {
120
- const lm = LicenseManager.getInstance();
121
- const spy = vi.fn();
122
- lm.subscribe(spy);
123
- lm.clear();
124
- expect(spy).toHaveBeenCalledTimes(1);
125
- });
126
- it('subscriber is called when validateLicense resolves', async () => {
127
- stubFetch({ valid: true, licenseKey: 'KEY', mode: 'unmanaged', plan: 'default', expiresAt: null, features: {} });
128
- const lm = LicenseManager.getInstance();
129
- const spy = vi.fn();
130
- lm.subscribe(spy);
131
- await lm.validateLicense('key', FAKE_URL);
132
- expect(spy).toHaveBeenCalledTimes(1);
133
- });
134
- it('unsubscribe stops future notifications', () => {
135
- const lm = LicenseManager.getInstance();
136
- const spy = vi.fn();
137
- const unsub = lm.subscribe(spy);
138
- unsub();
139
- lm.loadLicense({ licenseKey: 'k', mode: 'unmanaged' });
140
- expect(spy).not.toHaveBeenCalled();
141
- });
142
- it('multiple subscribers each fire independently', () => {
143
- const lm = LicenseManager.getInstance();
144
- const spyA = vi.fn();
145
- const spyB = vi.fn();
146
- lm.subscribe(spyA);
147
- lm.subscribe(spyB);
148
- lm.loadLicense({ licenseKey: 'k', mode: 'unmanaged' });
149
- expect(spyA).toHaveBeenCalledTimes(1);
150
- expect(spyB).toHaveBeenCalledTimes(1);
151
- });
152
- });
153
- //# sourceMappingURL=LicenseManager.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LicenseManager.test.js","sourceRoot":"","sources":["../../../src/licensing/__tests__/LicenseManager.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=licenseTypes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"licenseTypes.js","sourceRoot":"","sources":["../../src/licensing/licenseTypes.ts"],"names":[],"mappings":""}
@@ -1,44 +0,0 @@
1
- /**
2
- * PineCompiler — public entry point for the Pine Script compatibility layer.
3
- *
4
- * Pipeline:
5
- * Pine source → PineLexer → PineToken[] → PineParser → PineProgram
6
- * → PineTranspiler → TScript source → TScriptIndicator runtime
7
- */
8
- import { PineParser } from './pine-parser';
9
- import { PineTranspiler } from './pine-transpiler';
10
- import { DiagnosticBag } from './diagnostics';
11
- import { TScriptIndicator } from '../tscript/TScriptIndicator';
12
- export class PineCompiler {
13
- /**
14
- * Compile Pine Script source to TScript.
15
- * Parse errors throw a `SyntaxError`; semantic problems populate diagnostics.
16
- */
17
- compile(pineSource) {
18
- const diag = new DiagnosticBag();
19
- const parser = new PineParser(pineSource);
20
- const program = parser.parse();
21
- const transpiler = new PineTranspiler(diag);
22
- const tscript = transpiler.transpile(program);
23
- return {
24
- tscript,
25
- diagnostics: diag.diagnostics,
26
- ok: !diag.hasErrors(),
27
- };
28
- }
29
- /**
30
- * Convenience: compile + run against a bar series.
31
- * Returns the plot outputs and any diagnostics.
32
- */
33
- static run(pineSource, bars) {
34
- const compiler = new PineCompiler();
35
- const result = compiler.compile(pineSource);
36
- if (!result.ok) {
37
- return { plots: [], diagnostics: result.diagnostics };
38
- }
39
- const indicator = new TScriptIndicator(result.tscript);
40
- const plots = indicator.run(bars);
41
- return { plots, diagnostics: result.diagnostics };
42
- }
43
- }
44
- //# sourceMappingURL=PineCompiler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PineCompiler.js","sourceRoot":"","sources":["../../src/pine/PineCompiler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAW,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAO,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAQ,eAAe,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAe/D,MAAM,OAAO,YAAY;IACvB;;;OAGG;IACH,OAAO,CAAC,UAAkB;QACxB,MAAM,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;QAEjC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAE/B,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAE9C,OAAO;YACL,OAAO;YACP,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,EAAE,EAAW,CAAC,IAAI,CAAC,SAAS,EAAE;SAC/B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,GAAG,CACR,UAAkB,EAClB,IAA4B;QAE5B,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,MAAM,GAAK,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE9C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;QACxD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,KAAK,GAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC;CACF"}
@@ -1,11 +0,0 @@
1
- export class DiagnosticBag {
2
- _diags = [];
3
- add(severity, message, loc, code) {
4
- this._diags.push({ severity, message, line: loc.line, col: loc.col, code });
5
- }
6
- get diagnostics() { return this._diags; }
7
- hasErrors() {
8
- return this._diags.some(d => d.severity === 'error');
9
- }
10
- }
11
- //# sourceMappingURL=diagnostics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/pine/diagnostics.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,aAAa;IACP,MAAM,GAAiB,EAAE,CAAC;IAE3C,GAAG,CACD,QAA4B,EAC5B,OAAgB,EAChB,GAAuC,EACvC,IAAgB;QAEhB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,WAAW,KAA4B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhE,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -1,5 +0,0 @@
1
- export { PineParser } from './pine-parser';
2
- export { PineTranspiler } from './pine-transpiler';
3
- export { DiagnosticBag } from './diagnostics';
4
- export { PineCompiler } from './PineCompiler';
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pine/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAU,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAO,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAQ,gBAAgB,CAAC"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Pine Script AST types — subset understood by the ForgeCharts Pine compat layer.
3
- *
4
- * Supported Pine v5 constructs:
5
- * indicator(title, overlay?, ...)
6
- * input(defval, title?, ...) / input.int() / input.float() / input.bool() / input.source()
7
- * ta.sma() ta.ema() ta.wma() ta.rma() ta.rsi() ta.macd()
8
- * ta.stdev() ta.highest() ta.lowest() ta.change() ta.mom() ta.atr()
9
- * ta.crossover() ta.crossunder() ta.barssince()
10
- * math.abs() math.max() math.min() math.round() math.floor() math.ceil()
11
- * math.sqrt() math.log() math.pow() math.sign()
12
- * plot() plotshape()
13
- * nz() na()
14
- * if / else blocks
15
- * var declarations
16
- * ternary a ? b : c
17
- */
18
- export {};
19
- //# sourceMappingURL=pine-ast.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pine-ast.js","sourceRoot":"","sources":["../../src/pine/pine-ast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -1,249 +0,0 @@
1
- /**
2
- * Pine Script Lexer — tokenises a Pine v5 source string.
3
- *
4
- * Differences vs TScript lexer:
5
- * - `//@version=N` comment is parsed for the version number
6
- * - `color.red`, `ta.sma`, `math.abs` — namespace.member chains
7
- * - `:=` reassignment operator
8
- * - Indentation-based block structure (INDENT / DEDENT tokens)
9
- * - `var` / `varip` keywords
10
- * - `=>` (function body arrow, for single-line user functions — recognised
11
- * but not fully transpiled; emits an diagnostic)
12
- */
13
- export class PineLexer {
14
- _src;
15
- _pos = 0;
16
- _line = 1;
17
- _col = 1;
18
- /** Version extracted from `//@version=N` */
19
- version = 5;
20
- constructor(src) {
21
- this._src = src.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
22
- }
23
- tokenize() {
24
- // First pass: raw tokens (with raw NEWLINEs and spaces preserved)
25
- const raw = this._rawTokenize();
26
- // Second pass: inject INDENT / DEDENT for indented blocks
27
- return this._injectIndents(raw);
28
- }
29
- // ─── Raw tokenisation ────────────────────────────────────────────────────────
30
- _rawTokenize() {
31
- const tokens = [];
32
- while (this._pos < this._src.length) {
33
- const ch = this._src[this._pos];
34
- // Handle newline
35
- if (ch === '\n') {
36
- tokens.push(this._make('NEWLINE', '\n'));
37
- this._pos++;
38
- this._line++;
39
- this._col = 1;
40
- continue;
41
- }
42
- // Skip horizontal whitespace (not newlines — needed for indent tracking)
43
- if (ch === ' ' || ch === '\t') {
44
- this._pos++;
45
- this._col++;
46
- continue;
47
- }
48
- // Line comment
49
- if (ch === '/' && this._peek(1) === '/') {
50
- // Check for version annotation
51
- const commentStart = this._pos;
52
- while (this._pos < this._src.length && this._src[this._pos] !== '\n') {
53
- this._pos++;
54
- this._col++;
55
- }
56
- const comment = this._src.slice(commentStart, this._pos);
57
- const vMatch = comment.match(/\/\/@version\s*=\s*(\d+)/);
58
- if (vMatch)
59
- this.version = parseInt(vMatch[1], 10);
60
- continue;
61
- }
62
- // Numbers
63
- if ((ch >= '0' && ch <= '9') || (ch === '.' && this._isDigit(this._peek(1)))) {
64
- tokens.push(this._readNumber());
65
- continue;
66
- }
67
- // Strings
68
- if (ch === '"' || ch === "'") {
69
- tokens.push(this._readString(ch));
70
- continue;
71
- }
72
- // Identifiers / keywords
73
- if (this._isAlpha(ch)) {
74
- const tok = this._readIdent();
75
- tokens.push(tok);
76
- continue;
77
- }
78
- // Two-char operators
79
- const two = this._src.slice(this._pos, this._pos + 2);
80
- if (two === '<=') {
81
- tokens.push(this._make('LTE', two));
82
- this._adv(2);
83
- continue;
84
- }
85
- if (two === '>=') {
86
- tokens.push(this._make('GTE', two));
87
- this._adv(2);
88
- continue;
89
- }
90
- if (two === '==') {
91
- tokens.push(this._make('EQEQ', two));
92
- this._adv(2);
93
- continue;
94
- }
95
- if (two === '!=') {
96
- tokens.push(this._make('NEQ', two));
97
- this._adv(2);
98
- continue;
99
- }
100
- if (two === ':=') {
101
- tokens.push(this._make('REASSIGN', two));
102
- this._adv(2);
103
- continue;
104
- }
105
- if (two === '=>') {
106
- tokens.push(this._make('ARROW', two));
107
- this._adv(2);
108
- continue;
109
- }
110
- // Single-char operators
111
- const singleOps = {
112
- '+': 'PLUS', '-': 'MINUS', '*': 'STAR', '/': 'SLASH', '%': 'PERCENT',
113
- '<': 'LT', '>': 'GT',
114
- '?': 'QMARK', ':': 'COLON',
115
- '(': 'LPAREN', ')': 'RPAREN', '[': 'LBRACKET', ']': 'RBRACKET',
116
- ',': 'COMMA', '.': 'DOT',
117
- '=': 'ASSIGN',
118
- };
119
- if (ch in singleOps) {
120
- tokens.push(this._make(singleOps[ch], ch));
121
- this._pos++;
122
- this._col++;
123
- continue;
124
- }
125
- throw new SyntaxError(`[Pine] Unexpected character '${ch}' at ${this._line}:${this._col}`);
126
- }
127
- tokens.push(this._make('EOF', ''));
128
- return tokens;
129
- }
130
- // ─── Indent/Dedent injection ─────────────────────────────────────────────────
131
- _injectIndents(raw) {
132
- const out = [];
133
- const indentStack = [0];
134
- let i = 0;
135
- while (i < raw.length) {
136
- const tok = raw[i];
137
- if (tok.kind !== 'NEWLINE') {
138
- out.push(tok);
139
- i++;
140
- continue;
141
- }
142
- // After a NEWLINE, measure the indentation of the next non-empty line
143
- out.push(tok); // keep the NEWLINE token
144
- i++;
145
- // Count leading spaces of the next real line
146
- let spaces = 0;
147
- let j = i;
148
- while (j < raw.length && (raw[j].kind === 'NEWLINE')) {
149
- // blank line — skip
150
- out.push(raw[j]);
151
- j++;
152
- }
153
- i = j;
154
- if (i >= raw.length || raw[i].kind === 'EOF')
155
- break;
156
- // Compute indent width from the column of the next token
157
- const nextTok = raw[i];
158
- spaces = nextTok.col - 1; // col is 1-based
159
- const currentIndent = indentStack[indentStack.length - 1];
160
- if (spaces > currentIndent) {
161
- indentStack.push(spaces);
162
- out.push({ kind: 'INDENT', value: '', line: nextTok.line, col: 1 });
163
- }
164
- else {
165
- while (spaces < indentStack[indentStack.length - 1]) {
166
- indentStack.pop();
167
- out.push({ kind: 'DEDENT', value: '', line: nextTok.line, col: 1 });
168
- }
169
- }
170
- }
171
- // Close any remaining open indents
172
- while (indentStack.length > 1) {
173
- indentStack.pop();
174
- out.push({ kind: 'DEDENT', value: '', line: 0, col: 0 });
175
- }
176
- out.push({ kind: 'EOF', value: '', line: this._line, col: this._col });
177
- return out;
178
- }
179
- // ─── Helpers ─────────────────────────────────────────────────────────────────
180
- _make(kind, value) {
181
- return { kind, value, line: this._line, col: this._col };
182
- }
183
- _peek(offset) {
184
- return this._src[this._pos + offset] ?? '';
185
- }
186
- _adv(n = 1) {
187
- this._pos += n;
188
- this._col += n;
189
- }
190
- _isDigit(ch) {
191
- return ch >= '0' && ch <= '9';
192
- }
193
- _isAlpha(ch) {
194
- return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_';
195
- }
196
- _isAlphaNum(ch) {
197
- return this._isAlpha(ch) || this._isDigit(ch);
198
- }
199
- _readNumber() {
200
- const start = this._pos;
201
- const startCol = this._col;
202
- while (this._pos < this._src.length) {
203
- const c = this._src[this._pos];
204
- if (this._isDigit(c) || c === '.') {
205
- this._pos++;
206
- this._col++;
207
- }
208
- else
209
- break;
210
- }
211
- return { kind: 'NUMBER', value: this._src.slice(start, this._pos), line: this._line, col: startCol };
212
- }
213
- _readString(quote) {
214
- const startCol = this._col;
215
- this._pos++;
216
- this._col++;
217
- let result = '';
218
- while (this._pos < this._src.length && this._src[this._pos] !== quote) {
219
- if (this._src[this._pos] === '\\') {
220
- this._pos++;
221
- this._col++;
222
- const esc = this._src[this._pos] ?? '';
223
- result += esc === 'n' ? '\n' : esc === 't' ? '\t' : esc;
224
- }
225
- else {
226
- result += this._src[this._pos];
227
- }
228
- this._pos++;
229
- this._col++;
230
- }
231
- this._pos++;
232
- this._col++;
233
- return { kind: 'STRING', value: result, line: this._line, col: startCol };
234
- }
235
- _readIdent() {
236
- const start = this._pos;
237
- const startCol = this._col;
238
- while (this._pos < this._src.length && this._isAlphaNum(this._src[this._pos])) {
239
- this._pos++;
240
- this._col++;
241
- }
242
- const name = this._src.slice(start, this._pos);
243
- if (name === 'true' || name === 'false') {
244
- return { kind: 'BOOL', value: name, line: this._line, col: startCol };
245
- }
246
- return { kind: 'IDENT', value: name, line: this._line, col: startCol };
247
- }
248
- }
249
- //# sourceMappingURL=pine-lexer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pine-lexer.js","sourceRoot":"","sources":["../../src/pine/pine-lexer.ts"],"names":[],"mappings":"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"}