@forgecharts/sdk 1.1.23 → 1.1.28

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 (562) hide show
  1. package/dist/__tests__/backwardCompatibility.test.d.ts +14 -0
  2. package/dist/__tests__/backwardCompatibility.test.d.ts.map +1 -0
  3. package/dist/__tests__/backwardCompatibility.test.js +159 -0
  4. package/dist/__tests__/backwardCompatibility.test.js.map +1 -0
  5. package/dist/__tests__/candleInvariant.test.d.ts +20 -0
  6. package/dist/__tests__/candleInvariant.test.d.ts.map +1 -0
  7. package/dist/__tests__/candleInvariant.test.js +415 -0
  8. package/dist/__tests__/candleInvariant.test.js.map +1 -0
  9. package/dist/__tests__/public-api-surface.d.ts +13 -0
  10. package/dist/__tests__/public-api-surface.d.ts.map +1 -0
  11. package/{src/__tests__/public-api-surface.ts → dist/__tests__/public-api-surface.js} +4 -42
  12. package/dist/__tests__/public-api-surface.js.map +1 -0
  13. package/dist/__tests__/timeframeBoundary.test.d.ts +17 -0
  14. package/dist/__tests__/timeframeBoundary.test.d.ts.map +1 -0
  15. package/dist/__tests__/timeframeBoundary.test.js +452 -0
  16. package/dist/__tests__/timeframeBoundary.test.js.map +1 -0
  17. package/dist/api/DrawingManager.d.ts +20 -0
  18. package/dist/api/DrawingManager.d.ts.map +1 -0
  19. package/dist/api/DrawingManager.js +190 -0
  20. package/dist/api/DrawingManager.js.map +1 -0
  21. package/dist/api/EventBus.d.ts +19 -0
  22. package/dist/api/EventBus.d.ts.map +1 -0
  23. package/dist/api/EventBus.js +44 -0
  24. package/dist/api/EventBus.js.map +1 -0
  25. package/dist/api/IndicatorDAG.d.ts +85 -0
  26. package/dist/api/IndicatorDAG.d.ts.map +1 -0
  27. package/dist/api/IndicatorDAG.js +316 -0
  28. package/dist/api/IndicatorDAG.js.map +1 -0
  29. package/dist/api/IndicatorRegistry.d.ts +22 -0
  30. package/dist/api/IndicatorRegistry.d.ts.map +1 -0
  31. package/dist/api/IndicatorRegistry.js +39 -0
  32. package/dist/api/IndicatorRegistry.js.map +1 -0
  33. package/dist/api/LayoutManager.d.ts +30 -0
  34. package/dist/api/LayoutManager.d.ts.map +1 -0
  35. package/dist/api/LayoutManager.js +51 -0
  36. package/dist/api/LayoutManager.js.map +1 -0
  37. package/dist/api/PaneManager.d.ts +42 -0
  38. package/dist/api/PaneManager.d.ts.map +1 -0
  39. package/dist/api/PaneManager.js +119 -0
  40. package/dist/api/PaneManager.js.map +1 -0
  41. package/dist/api/ReferenceAPI.d.ts +78 -0
  42. package/dist/api/ReferenceAPI.d.ts.map +1 -0
  43. package/dist/api/ReferenceAPI.js +153 -0
  44. package/dist/api/ReferenceAPI.js.map +1 -0
  45. package/dist/api/TChart.d.ts +345 -0
  46. package/dist/api/TChart.d.ts.map +1 -0
  47. package/dist/api/TChart.js +765 -0
  48. package/dist/api/TChart.js.map +1 -0
  49. package/{src/api/createChart.ts → dist/api/createChart.d.ts} +2 -7
  50. package/dist/api/createChart.d.ts.map +1 -0
  51. package/dist/api/createChart.js +42 -0
  52. package/dist/api/createChart.js.map +1 -0
  53. package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts +4 -0
  54. package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts.map +1 -0
  55. package/dist/api/drawing tools/fib gann menu/fibRetracement.js +22 -0
  56. package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +1 -0
  57. package/dist/api/drawing tools/lines menu/crossLine.d.ts +4 -0
  58. package/dist/api/drawing tools/lines menu/crossLine.d.ts.map +1 -0
  59. package/dist/api/drawing tools/lines menu/crossLine.js +16 -0
  60. package/dist/api/drawing tools/lines menu/crossLine.js.map +1 -0
  61. package/dist/api/drawing tools/lines menu/disjointChannel.d.ts +17 -0
  62. package/dist/api/drawing tools/lines menu/disjointChannel.d.ts.map +1 -0
  63. package/dist/api/drawing tools/lines menu/disjointChannel.js +59 -0
  64. package/dist/api/drawing tools/lines menu/disjointChannel.js.map +1 -0
  65. package/dist/api/drawing tools/lines menu/extendedLine.d.ts +4 -0
  66. package/dist/api/drawing tools/lines menu/extendedLine.d.ts.map +1 -0
  67. package/dist/api/drawing tools/lines menu/extendedLine.js +17 -0
  68. package/dist/api/drawing tools/lines menu/extendedLine.js.map +1 -0
  69. package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts +4 -0
  70. package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts.map +1 -0
  71. package/dist/api/drawing tools/lines menu/flatTopBottom.js +41 -0
  72. package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +1 -0
  73. package/dist/api/drawing tools/lines menu/horizontal.d.ts +4 -0
  74. package/dist/api/drawing tools/lines menu/horizontal.d.ts.map +1 -0
  75. package/dist/api/drawing tools/lines menu/horizontal.js +19 -0
  76. package/dist/api/drawing tools/lines menu/horizontal.js.map +1 -0
  77. package/dist/api/drawing tools/lines menu/horizontalRay.d.ts +4 -0
  78. package/dist/api/drawing tools/lines menu/horizontalRay.d.ts.map +1 -0
  79. package/dist/api/drawing tools/lines menu/horizontalRay.js +20 -0
  80. package/dist/api/drawing tools/lines menu/horizontalRay.js.map +1 -0
  81. package/dist/api/drawing tools/lines menu/infoLine.d.ts +4 -0
  82. package/dist/api/drawing tools/lines menu/infoLine.d.ts.map +1 -0
  83. package/dist/api/drawing tools/lines menu/infoLine.js +107 -0
  84. package/dist/api/drawing tools/lines menu/infoLine.js.map +1 -0
  85. package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts +4 -0
  86. package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts.map +1 -0
  87. package/dist/api/drawing tools/lines menu/insidePitchfork.js +31 -0
  88. package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +1 -0
  89. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts +4 -0
  90. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts.map +1 -0
  91. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +15 -0
  92. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +1 -0
  93. package/dist/api/drawing tools/lines menu/parallelChannel.d.ts +4 -0
  94. package/dist/api/drawing tools/lines menu/parallelChannel.d.ts.map +1 -0
  95. package/dist/api/drawing tools/lines menu/parallelChannel.js +43 -0
  96. package/dist/api/drawing tools/lines menu/parallelChannel.js.map +1 -0
  97. package/dist/api/drawing tools/lines menu/pitchfork.d.ts +4 -0
  98. package/dist/api/drawing tools/lines menu/pitchfork.d.ts.map +1 -0
  99. package/dist/api/drawing tools/lines menu/pitchfork.js +12 -0
  100. package/dist/api/drawing tools/lines menu/pitchfork.js.map +1 -0
  101. package/dist/api/drawing tools/lines menu/ray.d.ts +4 -0
  102. package/dist/api/drawing tools/lines menu/ray.d.ts.map +1 -0
  103. package/dist/api/drawing tools/lines menu/ray.js +23 -0
  104. package/dist/api/drawing tools/lines menu/ray.js.map +1 -0
  105. package/dist/api/drawing tools/lines menu/regressionTrend.d.ts +4 -0
  106. package/dist/api/drawing tools/lines menu/regressionTrend.d.ts.map +1 -0
  107. package/dist/api/drawing tools/lines menu/regressionTrend.js +127 -0
  108. package/dist/api/drawing tools/lines menu/regressionTrend.js.map +1 -0
  109. package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts +4 -0
  110. package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts.map +1 -0
  111. package/dist/api/drawing tools/lines menu/schiffPitchfork.js +15 -0
  112. package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +1 -0
  113. package/dist/api/drawing tools/lines menu/trendAngle.d.ts +4 -0
  114. package/dist/api/drawing tools/lines menu/trendAngle.d.ts.map +1 -0
  115. package/dist/api/drawing tools/lines menu/trendAngle.js +51 -0
  116. package/dist/api/drawing tools/lines menu/trendAngle.js.map +1 -0
  117. package/dist/api/drawing tools/lines menu/trendline.d.ts +4 -0
  118. package/dist/api/drawing tools/lines menu/trendline.d.ts.map +1 -0
  119. package/dist/api/drawing tools/lines menu/trendline.js +11 -0
  120. package/dist/api/drawing tools/lines menu/trendline.js.map +1 -0
  121. package/dist/api/drawing tools/lines menu/vertical.d.ts +4 -0
  122. package/dist/api/drawing tools/lines menu/vertical.d.ts.map +1 -0
  123. package/dist/api/drawing tools/lines menu/vertical.js +11 -0
  124. package/dist/api/drawing tools/lines menu/vertical.js.map +1 -0
  125. package/dist/api/drawing tools/pointers menu/crosshair.d.ts +16 -0
  126. package/dist/api/drawing tools/pointers menu/crosshair.d.ts.map +1 -0
  127. package/{src/api/drawing tools/pointers menu/crosshair.ts → dist/api/drawing tools/pointers menu/crosshair.js } +6 -7
  128. package/dist/api/drawing tools/pointers menu/crosshair.js.map +1 -0
  129. package/dist/api/drawing tools/pointers menu/cursor.d.ts +15 -0
  130. package/dist/api/drawing tools/pointers menu/cursor.d.ts.map +1 -0
  131. package/{src/api/drawing tools/pointers menu/cursor.ts → dist/api/drawing tools/pointers menu/cursor.js } +7 -8
  132. package/dist/api/drawing tools/pointers menu/cursor.js.map +1 -0
  133. package/dist/api/drawing tools/pointers menu/demonstration.d.ts +30 -0
  134. package/dist/api/drawing tools/pointers menu/demonstration.d.ts.map +1 -0
  135. package/{src/api/drawing tools/pointers menu/demonstration.ts → dist/api/drawing tools/pointers menu/demonstration.js } +9 -14
  136. package/dist/api/drawing tools/pointers menu/demonstration.js.map +1 -0
  137. package/dist/api/drawing tools/pointers menu/dot.d.ts +23 -0
  138. package/dist/api/drawing tools/pointers menu/dot.d.ts.map +1 -0
  139. package/{src/api/drawing tools/pointers menu/dot.ts → dist/api/drawing tools/pointers menu/dot.js } +8 -11
  140. package/dist/api/drawing tools/pointers menu/dot.js.map +1 -0
  141. package/dist/api/drawing tools/shapes menu/rectangle.d.ts +4 -0
  142. package/dist/api/drawing tools/shapes menu/rectangle.d.ts.map +1 -0
  143. package/dist/api/drawing tools/shapes menu/rectangle.js +19 -0
  144. package/dist/api/drawing tools/shapes menu/rectangle.js.map +1 -0
  145. package/dist/api/drawing tools/shapes menu/text.d.ts +4 -0
  146. package/dist/api/drawing tools/shapes menu/text.d.ts.map +1 -0
  147. package/dist/api/drawing tools/shapes menu/text.js +25 -0
  148. package/dist/api/drawing tools/shapes menu/text.js.map +1 -0
  149. package/dist/api/drawingUtils.d.ts +22 -0
  150. package/dist/api/drawingUtils.d.ts.map +1 -0
  151. package/dist/api/drawingUtils.js +83 -0
  152. package/dist/api/drawingUtils.js.map +1 -0
  153. package/dist/core/CanvasLayer.d.ts +26 -0
  154. package/dist/core/CanvasLayer.d.ts.map +1 -0
  155. package/dist/core/CanvasLayer.js +56 -0
  156. package/dist/core/CanvasLayer.js.map +1 -0
  157. package/dist/core/Chart.d.ts +164 -0
  158. package/dist/core/Chart.d.ts.map +1 -0
  159. package/dist/core/Chart.js +839 -0
  160. package/dist/core/Chart.js.map +1 -0
  161. package/dist/core/CoordTransform.d.ts +168 -0
  162. package/dist/core/CoordTransform.d.ts.map +1 -0
  163. package/dist/core/CoordTransform.js +224 -0
  164. package/dist/core/CoordTransform.js.map +1 -0
  165. package/dist/core/Crosshair.d.ts +30 -0
  166. package/dist/core/Crosshair.d.ts.map +1 -0
  167. package/dist/core/Crosshair.js +186 -0
  168. package/dist/core/Crosshair.js.map +1 -0
  169. package/dist/core/IndicatorEngine.d.ts +51 -0
  170. package/dist/core/IndicatorEngine.d.ts.map +1 -0
  171. package/dist/core/IndicatorEngine.js +181 -0
  172. package/dist/core/IndicatorEngine.js.map +1 -0
  173. package/dist/core/InteractionManager.d.ts +197 -0
  174. package/dist/core/InteractionManager.d.ts.map +1 -0
  175. package/dist/core/InteractionManager.js +698 -0
  176. package/dist/core/InteractionManager.js.map +1 -0
  177. package/dist/core/PriceScale.d.ts +27 -0
  178. package/dist/core/PriceScale.d.ts.map +1 -0
  179. package/dist/core/PriceScale.js +113 -0
  180. package/dist/core/PriceScale.js.map +1 -0
  181. package/dist/core/Series.d.ts +40 -0
  182. package/dist/core/Series.d.ts.map +1 -0
  183. package/dist/core/Series.js +114 -0
  184. package/dist/core/Series.js.map +1 -0
  185. package/dist/core/TimeScale.d.ts +43 -0
  186. package/dist/core/TimeScale.d.ts.map +1 -0
  187. package/dist/core/TimeScale.js +150 -0
  188. package/dist/core/TimeScale.js.map +1 -0
  189. package/dist/datafeed/DatafeedConnector.d.ts +89 -0
  190. package/dist/datafeed/DatafeedConnector.d.ts.map +1 -0
  191. package/dist/datafeed/DatafeedConnector.js +268 -0
  192. package/dist/datafeed/DatafeedConnector.js.map +1 -0
  193. package/dist/engine/CandleEngine.d.ts +207 -0
  194. package/dist/engine/CandleEngine.d.ts.map +1 -0
  195. package/dist/engine/CandleEngine.js +318 -0
  196. package/dist/engine/CandleEngine.js.map +1 -0
  197. package/dist/engine/__tests__/CandleEngine.test.d.ts +2 -0
  198. package/dist/engine/__tests__/CandleEngine.test.d.ts.map +1 -0
  199. package/dist/engine/__tests__/CandleEngine.test.js +300 -0
  200. package/dist/engine/__tests__/CandleEngine.test.js.map +1 -0
  201. package/dist/engine/candleInvariants.d.ts +66 -0
  202. package/dist/engine/candleInvariants.d.ts.map +1 -0
  203. package/dist/engine/candleInvariants.js +134 -0
  204. package/dist/engine/candleInvariants.js.map +1 -0
  205. package/{src/engine/mergeUtils.ts → dist/engine/mergeUtils.d.ts} +15 -52
  206. package/dist/engine/mergeUtils.d.ts.map +1 -0
  207. package/dist/engine/mergeUtils.js +64 -0
  208. package/dist/engine/mergeUtils.js.map +1 -0
  209. package/dist/engine/timeframeUtils.d.ts +80 -0
  210. package/dist/engine/timeframeUtils.d.ts.map +1 -0
  211. package/{src/engine/timeframeUtils.ts → dist/engine/timeframeUtils.js} +30 -48
  212. package/dist/engine/timeframeUtils.js.map +1 -0
  213. package/dist/index.d.ts +40 -0
  214. package/dist/index.d.ts.map +1 -0
  215. package/dist/index.js +49 -0
  216. package/dist/index.js.map +1 -0
  217. package/dist/internal.d.ts +29 -0
  218. package/dist/internal.d.ts.map +1 -0
  219. package/{src/internal.ts → dist/internal.js} +2 -11
  220. package/dist/internal.js.map +1 -0
  221. package/dist/licensing/ChartRuntimeResolver.d.ts +233 -0
  222. package/dist/licensing/ChartRuntimeResolver.d.ts.map +1 -0
  223. package/dist/licensing/ChartRuntimeResolver.js +310 -0
  224. package/dist/licensing/ChartRuntimeResolver.js.map +1 -0
  225. package/dist/licensing/LicenseManager.d.ts +55 -0
  226. package/dist/licensing/LicenseManager.d.ts.map +1 -0
  227. package/dist/licensing/LicenseManager.js +114 -0
  228. package/dist/licensing/LicenseManager.js.map +1 -0
  229. package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts +13 -0
  230. package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts.map +1 -0
  231. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +177 -0
  232. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +1 -0
  233. package/dist/licensing/__tests__/LicenseManager.test.d.ts +12 -0
  234. package/dist/licensing/__tests__/LicenseManager.test.d.ts.map +1 -0
  235. package/dist/licensing/__tests__/LicenseManager.test.js +153 -0
  236. package/dist/licensing/__tests__/LicenseManager.test.js.map +1 -0
  237. package/dist/licensing/licenseTypes.d.ts +18 -0
  238. package/dist/licensing/licenseTypes.d.ts.map +1 -0
  239. package/dist/licensing/licenseTypes.js +2 -0
  240. package/dist/licensing/licenseTypes.js.map +1 -0
  241. package/dist/pine/PineCompiler.d.ts +35 -0
  242. package/dist/pine/PineCompiler.d.ts.map +1 -0
  243. package/dist/pine/PineCompiler.js +44 -0
  244. package/dist/pine/PineCompiler.js.map +1 -0
  245. package/dist/pine/diagnostics.d.ts +20 -0
  246. package/dist/pine/diagnostics.d.ts.map +1 -0
  247. package/dist/pine/diagnostics.js +11 -0
  248. package/dist/pine/diagnostics.js.map +1 -0
  249. package/{src/pine/index.ts → dist/pine/index.d.ts} +4 -3
  250. package/dist/pine/index.d.ts.map +1 -0
  251. package/dist/pine/index.js +5 -0
  252. package/dist/pine/index.js.map +1 -0
  253. package/dist/pine/pine-ast.d.ts +142 -0
  254. package/dist/pine/pine-ast.d.ts.map +1 -0
  255. package/dist/pine/pine-ast.js +19 -0
  256. package/dist/pine/pine-ast.js.map +1 -0
  257. package/dist/pine/pine-lexer.d.ts +41 -0
  258. package/dist/pine/pine-lexer.d.ts.map +1 -0
  259. package/dist/pine/pine-lexer.js +249 -0
  260. package/dist/pine/pine-lexer.js.map +1 -0
  261. package/dist/pine/pine-parser.d.ts +51 -0
  262. package/dist/pine/pine-parser.d.ts.map +1 -0
  263. package/dist/pine/pine-parser.js +416 -0
  264. package/dist/pine/pine-parser.js.map +1 -0
  265. package/dist/pine/pine-transpiler.d.ts +33 -0
  266. package/dist/pine/pine-transpiler.d.ts.map +1 -0
  267. package/dist/pine/pine-transpiler.js +260 -0
  268. package/dist/pine/pine-transpiler.js.map +1 -0
  269. package/dist/pixi/LayerName.d.ts +18 -0
  270. package/dist/pixi/LayerName.d.ts.map +1 -0
  271. package/dist/pixi/LayerName.js +35 -0
  272. package/dist/pixi/LayerName.js.map +1 -0
  273. package/dist/pixi/PixiCandlestickRenderer.d.ts +23 -0
  274. package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -0
  275. package/dist/pixi/PixiCandlestickRenderer.js +107 -0
  276. package/dist/pixi/PixiCandlestickRenderer.js.map +1 -0
  277. package/dist/pixi/PixiChart.d.ts +72 -0
  278. package/dist/pixi/PixiChart.d.ts.map +1 -0
  279. package/dist/pixi/PixiChart.js +367 -0
  280. package/dist/pixi/PixiChart.js.map +1 -0
  281. package/dist/pixi/PixiCrosshairRenderer.d.ts +29 -0
  282. package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -0
  283. package/dist/pixi/PixiCrosshairRenderer.js +110 -0
  284. package/dist/pixi/PixiCrosshairRenderer.js.map +1 -0
  285. package/dist/pixi/PixiDrawingRenderer.d.ts +17 -0
  286. package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -0
  287. package/dist/pixi/PixiDrawingRenderer.js +111 -0
  288. package/dist/pixi/PixiDrawingRenderer.js.map +1 -0
  289. package/dist/pixi/PixiGridRenderer.d.ts +22 -0
  290. package/dist/pixi/PixiGridRenderer.d.ts.map +1 -0
  291. package/dist/pixi/PixiGridRenderer.js +114 -0
  292. package/dist/pixi/PixiGridRenderer.js.map +1 -0
  293. package/dist/pixi/PixiLayerManager.d.ts +56 -0
  294. package/dist/pixi/PixiLayerManager.d.ts.map +1 -0
  295. package/dist/pixi/PixiLayerManager.js +92 -0
  296. package/dist/pixi/PixiLayerManager.js.map +1 -0
  297. package/dist/react/canvas/ChartCanvas.d.ts +85 -0
  298. package/dist/react/canvas/ChartCanvas.d.ts.map +1 -0
  299. package/dist/react/canvas/ChartCanvas.js +604 -0
  300. package/dist/react/canvas/ChartCanvas.js.map +1 -0
  301. package/dist/react/canvas/ChartContextMenu.d.ts +18 -0
  302. package/dist/react/canvas/ChartContextMenu.d.ts.map +1 -0
  303. package/dist/react/canvas/ChartContextMenu.js +5 -0
  304. package/dist/react/canvas/ChartContextMenu.js.map +1 -0
  305. package/dist/react/canvas/ChartSettingsDialog.d.ts +25 -0
  306. package/dist/react/canvas/ChartSettingsDialog.d.ts.map +1 -0
  307. package/dist/react/canvas/ChartSettingsDialog.js +28 -0
  308. package/dist/react/canvas/ChartSettingsDialog.js.map +1 -0
  309. package/dist/react/canvas/IndicatorLabel.d.ts +21 -0
  310. package/dist/react/canvas/IndicatorLabel.d.ts.map +1 -0
  311. package/dist/react/canvas/IndicatorLabel.js +196 -0
  312. package/dist/react/canvas/IndicatorLabel.js.map +1 -0
  313. package/dist/react/canvas/IndicatorPane.d.ts +32 -0
  314. package/dist/react/canvas/IndicatorPane.d.ts.map +1 -0
  315. package/dist/react/canvas/IndicatorPane.js +395 -0
  316. package/dist/react/canvas/IndicatorPane.js.map +1 -0
  317. package/dist/react/canvas/PointerOverlay.d.ts +23 -0
  318. package/dist/react/canvas/PointerOverlay.d.ts.map +1 -0
  319. package/dist/react/canvas/PointerOverlay.js +61 -0
  320. package/dist/react/canvas/PointerOverlay.js.map +1 -0
  321. package/dist/react/canvas/toolbars/LeftToolbar.d.ts +19 -0
  322. package/dist/react/canvas/toolbars/LeftToolbar.d.ts.map +1 -0
  323. package/dist/react/canvas/toolbars/LeftToolbar.js +407 -0
  324. package/dist/react/canvas/toolbars/LeftToolbar.js.map +1 -0
  325. package/dist/react/hooks/useChartCapabilities.d.ts +21 -0
  326. package/dist/react/hooks/useChartCapabilities.d.ts.map +1 -0
  327. package/dist/react/hooks/useChartCapabilities.js +66 -0
  328. package/dist/react/hooks/useChartCapabilities.js.map +1 -0
  329. package/dist/react/index.d.ts +30 -0
  330. package/dist/react/index.d.ts.map +1 -0
  331. package/dist/react/index.js +28 -0
  332. package/dist/react/index.js.map +1 -0
  333. package/dist/react/internal.d.ts +38 -0
  334. package/dist/react/internal.d.ts.map +1 -0
  335. package/dist/react/internal.js +44 -0
  336. package/dist/react/internal.js.map +1 -0
  337. package/dist/react/shell/ManagedAppShell.d.ts +91 -0
  338. package/dist/react/shell/ManagedAppShell.d.ts.map +1 -0
  339. package/dist/react/shell/ManagedAppShell.js +440 -0
  340. package/dist/react/shell/ManagedAppShell.js.map +1 -0
  341. package/dist/react/trading/TradingBridge.d.ts +86 -0
  342. package/dist/react/trading/TradingBridge.d.ts.map +1 -0
  343. package/dist/react/trading/TradingBridge.js +73 -0
  344. package/dist/react/trading/TradingBridge.js.map +1 -0
  345. package/dist/react/workspace/ChartWorkspace.d.ts +73 -0
  346. package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -0
  347. package/dist/react/workspace/ChartWorkspace.js +42 -0
  348. package/dist/react/workspace/ChartWorkspace.js.map +1 -0
  349. package/dist/react/workspace/FloatingPanel.d.ts +18 -0
  350. package/dist/react/workspace/FloatingPanel.d.ts.map +1 -0
  351. package/dist/react/workspace/FloatingPanel.js +82 -0
  352. package/dist/react/workspace/FloatingPanel.js.map +1 -0
  353. package/dist/react/workspace/IndicatorsDialog.d.ts +8 -0
  354. package/dist/react/workspace/IndicatorsDialog.d.ts.map +1 -0
  355. package/dist/react/workspace/IndicatorsDialog.js +121 -0
  356. package/dist/react/workspace/IndicatorsDialog.js.map +1 -0
  357. package/dist/react/workspace/LayoutMenu.d.ts +33 -0
  358. package/dist/react/workspace/LayoutMenu.d.ts.map +1 -0
  359. package/dist/react/workspace/LayoutMenu.js +113 -0
  360. package/dist/react/workspace/LayoutMenu.js.map +1 -0
  361. package/dist/react/workspace/SymbolSearchDialog.d.ts +10 -0
  362. package/dist/react/workspace/SymbolSearchDialog.d.ts.map +1 -0
  363. package/dist/react/workspace/SymbolSearchDialog.js +245 -0
  364. package/dist/react/workspace/SymbolSearchDialog.js.map +1 -0
  365. package/dist/react/workspace/TabBar.d.ts +17 -0
  366. package/dist/react/workspace/TabBar.d.ts.map +1 -0
  367. package/dist/react/workspace/TabBar.js +29 -0
  368. package/dist/react/workspace/TabBar.js.map +1 -0
  369. package/dist/react/workspace/toolbars/BottomToolbar.d.ts +19 -0
  370. package/dist/react/workspace/toolbars/BottomToolbar.d.ts.map +1 -0
  371. package/dist/react/workspace/toolbars/BottomToolbar.js +236 -0
  372. package/dist/react/workspace/toolbars/BottomToolbar.js.map +1 -0
  373. package/dist/react/workspace/toolbars/RightToolbar.d.ts +8 -0
  374. package/dist/react/workspace/toolbars/RightToolbar.d.ts.map +1 -0
  375. package/dist/react/workspace/toolbars/RightToolbar.js +18 -0
  376. package/dist/react/workspace/toolbars/RightToolbar.js.map +1 -0
  377. package/dist/react/workspace/toolbars/TopToolbar.d.ts +41 -0
  378. package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -0
  379. package/dist/react/workspace/toolbars/TopToolbar.js +82 -0
  380. package/dist/react/workspace/toolbars/TopToolbar.js.map +1 -0
  381. package/dist/renderers/CandlestickRenderer.d.ts +13 -0
  382. package/dist/renderers/CandlestickRenderer.d.ts.map +1 -0
  383. package/dist/renderers/CandlestickRenderer.js +98 -0
  384. package/dist/renderers/CandlestickRenderer.js.map +1 -0
  385. package/dist/renderers/HistogramRenderer.d.ts +11 -0
  386. package/dist/renderers/HistogramRenderer.d.ts.map +1 -0
  387. package/dist/renderers/HistogramRenderer.js +50 -0
  388. package/dist/renderers/HistogramRenderer.js.map +1 -0
  389. package/dist/renderers/LineRenderer.d.ts +12 -0
  390. package/dist/renderers/LineRenderer.d.ts.map +1 -0
  391. package/dist/renderers/LineRenderer.js +64 -0
  392. package/dist/renderers/LineRenderer.js.map +1 -0
  393. package/dist/theme/colors.d.ts +4 -0
  394. package/dist/theme/colors.d.ts.map +1 -0
  395. package/dist/theme/colors.js +19 -0
  396. package/dist/theme/colors.js.map +1 -0
  397. package/dist/tools/barDivergenceCheck.d.ts +120 -0
  398. package/dist/tools/barDivergenceCheck.d.ts.map +1 -0
  399. package/dist/tools/barDivergenceCheck.js +200 -0
  400. package/dist/tools/barDivergenceCheck.js.map +1 -0
  401. package/dist/trading/TradingOverlayStore.d.ts +86 -0
  402. package/dist/trading/TradingOverlayStore.d.ts.map +1 -0
  403. package/dist/trading/TradingOverlayStore.js +139 -0
  404. package/dist/trading/TradingOverlayStore.js.map +1 -0
  405. package/dist/trading/UnmanagedIngestion.d.ts +91 -0
  406. package/dist/trading/UnmanagedIngestion.d.ts.map +1 -0
  407. package/dist/trading/UnmanagedIngestion.js +114 -0
  408. package/dist/trading/UnmanagedIngestion.js.map +1 -0
  409. package/dist/trading/__tests__/ManagedTradingController.test.d.ts +18 -0
  410. package/dist/trading/__tests__/ManagedTradingController.test.d.ts.map +1 -0
  411. package/dist/trading/__tests__/ManagedTradingController.test.js +271 -0
  412. package/dist/trading/__tests__/ManagedTradingController.test.js.map +1 -0
  413. package/dist/trading/__tests__/TradingOverlayStore.test.d.ts +16 -0
  414. package/dist/trading/__tests__/TradingOverlayStore.test.d.ts.map +1 -0
  415. package/dist/trading/__tests__/TradingOverlayStore.test.js +267 -0
  416. package/dist/trading/__tests__/TradingOverlayStore.test.js.map +1 -0
  417. package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts +16 -0
  418. package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts.map +1 -0
  419. package/dist/trading/__tests__/UnmanagedIngestion.test.js +170 -0
  420. package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +1 -0
  421. package/dist/trading/managed/ManagedTradingController.d.ts +110 -0
  422. package/dist/trading/managed/ManagedTradingController.d.ts.map +1 -0
  423. package/dist/trading/managed/ManagedTradingController.js +247 -0
  424. package/dist/trading/managed/ManagedTradingController.js.map +1 -0
  425. package/dist/trading/managed/managedCapabilities.d.ts +45 -0
  426. package/dist/trading/managed/managedCapabilities.d.ts.map +1 -0
  427. package/dist/trading/managed/managedCapabilities.js +79 -0
  428. package/dist/trading/managed/managedCapabilities.js.map +1 -0
  429. package/dist/trading/managed/managedTypes.d.ts +122 -0
  430. package/dist/trading/managed/managedTypes.d.ts.map +1 -0
  431. package/dist/trading/managed/managedTypes.js +13 -0
  432. package/dist/trading/managed/managedTypes.js.map +1 -0
  433. package/dist/trading/tradingTypes.d.ts +89 -0
  434. package/dist/trading/tradingTypes.d.ts.map +1 -0
  435. package/dist/trading/tradingTypes.js +8 -0
  436. package/dist/trading/tradingTypes.js.map +1 -0
  437. package/dist/tscript/TScriptIndicator.d.ts +41 -0
  438. package/dist/tscript/TScriptIndicator.d.ts.map +1 -0
  439. package/dist/tscript/TScriptIndicator.js +47 -0
  440. package/dist/tscript/TScriptIndicator.js.map +1 -0
  441. package/dist/tscript/ast.d.ts +89 -0
  442. package/dist/tscript/ast.d.ts.map +1 -0
  443. package/dist/tscript/ast.js +22 -0
  444. package/dist/tscript/ast.js.map +1 -0
  445. package/dist/tscript/lexer.d.ts +36 -0
  446. package/dist/tscript/lexer.d.ts.map +1 -0
  447. package/dist/tscript/lexer.js +187 -0
  448. package/dist/tscript/lexer.js.map +1 -0
  449. package/dist/tscript/parser.d.ts +50 -0
  450. package/dist/tscript/parser.d.ts.map +1 -0
  451. package/dist/tscript/parser.js +318 -0
  452. package/dist/tscript/parser.js.map +1 -0
  453. package/dist/tscript/runtime.d.ts +123 -0
  454. package/dist/tscript/runtime.d.ts.map +1 -0
  455. package/dist/tscript/runtime.js +475 -0
  456. package/dist/tscript/runtime.js.map +1 -0
  457. package/dist/tscript/series.d.ts +49 -0
  458. package/dist/tscript/series.d.ts.map +1 -0
  459. package/dist/tscript/series.js +79 -0
  460. package/dist/tscript/series.js.map +1 -0
  461. package/dist/types/IChart.d.ts +48 -0
  462. package/dist/types/IChart.d.ts.map +1 -0
  463. package/dist/types/IChart.js +2 -0
  464. package/dist/types/IChart.js.map +1 -0
  465. package/{src/types/IRenderer.ts → dist/types/IRenderer.d.ts} +2 -8
  466. package/dist/types/IRenderer.d.ts.map +1 -0
  467. package/dist/types/IRenderer.js +2 -0
  468. package/dist/types/IRenderer.js.map +1 -0
  469. package/dist/types/ISeries.d.ts +26 -0
  470. package/dist/types/ISeries.d.ts.map +1 -0
  471. package/dist/types/ISeries.js +2 -0
  472. package/dist/types/ISeries.js.map +1 -0
  473. package/package.json +32 -4
  474. package/src/__tests__/backwardCompatibility.test.ts +0 -191
  475. package/src/__tests__/candleInvariant.test.ts +0 -500
  476. package/src/__tests__/timeframeBoundary.test.ts +0 -583
  477. package/src/api/DrawingManager.ts +0 -188
  478. package/src/api/EventBus.ts +0 -53
  479. package/src/api/IndicatorDAG.ts +0 -389
  480. package/src/api/IndicatorRegistry.ts +0 -47
  481. package/src/api/LayoutManager.ts +0 -72
  482. package/src/api/PaneManager.ts +0 -129
  483. package/src/api/ReferenceAPI.ts +0 -195
  484. package/src/api/TChart.ts +0 -881
  485. package/src/api/drawing tools/fib gann menu/fibRetracement.ts +0 -27
  486. package/src/api/drawing tools/lines menu/crossLine.ts +0 -21
  487. package/src/api/drawing tools/lines menu/disjointChannel.ts +0 -74
  488. package/src/api/drawing tools/lines menu/extendedLine.ts +0 -22
  489. package/src/api/drawing tools/lines menu/flatTopBottom.ts +0 -45
  490. package/src/api/drawing tools/lines menu/horizontal.ts +0 -24
  491. package/src/api/drawing tools/lines menu/horizontalRay.ts +0 -25
  492. package/src/api/drawing tools/lines menu/infoLine.ts +0 -127
  493. package/src/api/drawing tools/lines menu/insidePitchfork.ts +0 -21
  494. package/src/api/drawing tools/lines menu/modifiedSchiffPitchfork.ts +0 -18
  495. package/src/api/drawing tools/lines menu/parallelChannel.ts +0 -47
  496. package/src/api/drawing tools/lines menu/pitchfork.ts +0 -15
  497. package/src/api/drawing tools/lines menu/ray.ts +0 -28
  498. package/src/api/drawing tools/lines menu/regressionTrend.ts +0 -157
  499. package/src/api/drawing tools/lines menu/schiffPitchfork.ts +0 -18
  500. package/src/api/drawing tools/lines menu/trendAngle.ts +0 -64
  501. package/src/api/drawing tools/lines menu/trendline.ts +0 -16
  502. package/src/api/drawing tools/lines menu/vertical.ts +0 -16
  503. package/src/api/drawing tools/shapes menu/rectangle.ts +0 -24
  504. package/src/api/drawing tools/shapes menu/text.ts +0 -30
  505. package/src/api/drawingUtils.ts +0 -82
  506. package/src/core/CanvasLayer.ts +0 -77
  507. package/src/core/Chart.ts +0 -917
  508. package/src/core/CoordTransform.ts +0 -282
  509. package/src/core/Crosshair.ts +0 -207
  510. package/src/core/IndicatorEngine.ts +0 -216
  511. package/src/core/InteractionManager.ts +0 -899
  512. package/src/core/PriceScale.ts +0 -133
  513. package/src/core/Series.ts +0 -132
  514. package/src/core/TimeScale.ts +0 -175
  515. package/src/datafeed/DatafeedConnector.ts +0 -300
  516. package/src/engine/CandleEngine.ts +0 -458
  517. package/src/engine/__tests__/CandleEngine.test.ts +0 -402
  518. package/src/engine/candleInvariants.ts +0 -172
  519. package/src/index.ts +0 -190
  520. package/src/licensing/ChartRuntimeResolver.ts +0 -380
  521. package/src/licensing/LicenseManager.ts +0 -131
  522. package/src/licensing/__tests__/ChartRuntimeResolver.test.ts +0 -207
  523. package/src/licensing/__tests__/LicenseManager.test.ts +0 -180
  524. package/src/licensing/licenseTypes.ts +0 -19
  525. package/src/pine/PineCompiler.ts +0 -68
  526. package/src/pine/diagnostics.ts +0 -30
  527. package/src/pine/pine-ast.ts +0 -163
  528. package/src/pine/pine-lexer.ts +0 -265
  529. package/src/pine/pine-parser.ts +0 -439
  530. package/src/pine/pine-transpiler.ts +0 -301
  531. package/src/pixi/LayerName.ts +0 -35
  532. package/src/pixi/PixiCandlestickRenderer.ts +0 -125
  533. package/src/pixi/PixiChart.ts +0 -425
  534. package/src/pixi/PixiCrosshairRenderer.ts +0 -134
  535. package/src/pixi/PixiDrawingRenderer.ts +0 -121
  536. package/src/pixi/PixiGridRenderer.ts +0 -136
  537. package/src/pixi/PixiLayerManager.ts +0 -102
  538. package/src/renderers/CandlestickRenderer.ts +0 -130
  539. package/src/renderers/HistogramRenderer.ts +0 -63
  540. package/src/renderers/LineRenderer.ts +0 -77
  541. package/src/theme/colors.ts +0 -21
  542. package/src/tools/barDivergenceCheck.ts +0 -305
  543. package/src/trading/TradingOverlayStore.ts +0 -161
  544. package/src/trading/UnmanagedIngestion.ts +0 -156
  545. package/src/trading/__tests__/ManagedTradingController.test.ts +0 -338
  546. package/src/trading/__tests__/TradingOverlayStore.test.ts +0 -323
  547. package/src/trading/__tests__/UnmanagedIngestion.test.ts +0 -205
  548. package/src/trading/managed/ManagedTradingController.ts +0 -292
  549. package/src/trading/managed/managedCapabilities.ts +0 -98
  550. package/src/trading/managed/managedTypes.ts +0 -151
  551. package/src/trading/tradingTypes.ts +0 -135
  552. package/src/tscript/TScriptIndicator.ts +0 -54
  553. package/src/tscript/ast.ts +0 -105
  554. package/src/tscript/lexer.ts +0 -190
  555. package/src/tscript/parser.ts +0 -334
  556. package/src/tscript/runtime.ts +0 -525
  557. package/src/tscript/series.ts +0 -84
  558. package/src/types/IChart.ts +0 -56
  559. package/src/types/ISeries.ts +0 -30
  560. package/tsconfig.json +0 -22
  561. package/tsup.config.ts +0 -15
  562. package/vitest.config.ts +0 -25
@@ -1,583 +0,0 @@
1
- /**
2
- * Timeframe Boundary Tests
3
- *
4
- * Verifies correctness of `getBucketStart` (from `@forgecharts/shared`) and the
5
- * `CandleEngine` live-update / reconnect behaviour at every critical boundary.
6
- *
7
- * Test categories:
8
- * 1. Fixed intervals — standard and previously-missing timeframes
9
- * 2. Weekly alignment — Monday start (ISO 8601)
10
- * 3. Monthly alignment — calendar first-of-month, incl. leap-year February
11
- * 4. Live update semantics — open immutability, high/low expansion, close,
12
- * same-bucket vs new-bucket
13
- * 5. Reconnect — gap backfill, historical bars override provisional,
14
- * forming candle survives reconnect
15
- */
16
-
17
- import { describe, it, expect, beforeEach } from 'vitest';
18
- import {
19
- getBucketStart,
20
- getWeekBucketStart,
21
- getMonthBucketStart,
22
- isSameBucket,
23
- normalizeTimestamp,
24
- timeframeToMs,
25
- TIMEFRAMES,
26
- } from '@forgecharts/shared/time';
27
- import { CandleEngine } from '../engine/CandleEngine';
28
- import type { RawOHLCV } from '../engine/CandleEngine';
29
-
30
- // ─── Helpers ─────────────────────────────────────────────────────────────────
31
-
32
- /** Parse an ISO-8601 UTC string to Unix milliseconds. */
33
- const ms = (iso: string): number => new Date(iso).getTime();
34
- /** Parse an ISO-8601 UTC string to Unix seconds. */
35
- const sec = (iso: string): number => new Date(iso).getTime() / 1000;
36
-
37
- /** Build a minimal RawOHLCV tick (all values in Unix seconds by default). */
38
- function tick(
39
- timeSecOrMs: number,
40
- open = 100,
41
- high = 110,
42
- low = 90,
43
- close = 105,
44
- volume = 1,
45
- ): RawOHLCV {
46
- return { time: timeSecOrMs, open, high, low, close, volume };
47
- }
48
-
49
- // ─── 1. Fixed intervals ───────────────────────────────────────────────────────
50
-
51
- describe('getBucketStart — fixed intervals', () => {
52
- /**
53
- * Reference point: 2025-03-09 14:37:42 UTC
54
- * ms = 1741528662000
55
- * sec = 1741528662
56
- */
57
- const REF_MS = ms('2025-03-09T14:37:42Z');
58
-
59
- it('1m: floors to the minute boundary', () => {
60
- expect(getBucketStart(REF_MS, '1m')).toBe(ms('2025-03-09T14:37:00Z'));
61
- });
62
-
63
- it('2m: floors to the 2-minute boundary', () => {
64
- // 14:37 → bucket start is 14:36 (36 is divisible by 2)
65
- expect(getBucketStart(REF_MS, '2m')).toBe(ms('2025-03-09T14:36:00Z'));
66
- });
67
-
68
- it('3m (previously missing): floors correctly', () => {
69
- // 14:37 → bucket start is 14:36 (36 is divisible by 3)
70
- expect(getBucketStart(REF_MS, '3m')).toBe(ms('2025-03-09T14:36:00Z'));
71
- // 14:37:42 inside [14:36, 14:39) — confirm
72
- expect(getBucketStart(ms('2025-03-09T14:38:59Z'), '3m')).toBe(ms('2025-03-09T14:36:00Z'));
73
- expect(getBucketStart(ms('2025-03-09T14:39:00Z'), '3m')).toBe(ms('2025-03-09T14:39:00Z'));
74
- });
75
-
76
- it('4m (previously missing): floors correctly', () => {
77
- // 14:37 → bucket start is 14:36 (36 is divisible by 4)
78
- expect(getBucketStart(REF_MS, '4m')).toBe(ms('2025-03-09T14:36:00Z'));
79
- expect(getBucketStart(ms('2025-03-09T14:39:59Z'), '4m')).toBe(ms('2025-03-09T14:36:00Z'));
80
- expect(getBucketStart(ms('2025-03-09T14:40:00Z'), '4m')).toBe(ms('2025-03-09T14:40:00Z'));
81
- });
82
-
83
- it('5m: floors to the 5-minute boundary', () => {
84
- expect(getBucketStart(REF_MS, '5m')).toBe(ms('2025-03-09T14:35:00Z'));
85
- expect(getBucketStart(ms('2025-03-09T14:39:59Z'), '5m')).toBe(ms('2025-03-09T14:35:00Z'));
86
- expect(getBucketStart(ms('2025-03-09T14:40:00Z'), '5m')).toBe(ms('2025-03-09T14:40:00Z'));
87
- });
88
-
89
- it('10m (previously missing): floors correctly', () => {
90
- expect(getBucketStart(REF_MS, '10m')).toBe(ms('2025-03-09T14:30:00Z'));
91
- expect(getBucketStart(ms('2025-03-09T14:39:59Z'), '10m')).toBe(ms('2025-03-09T14:30:00Z'));
92
- expect(getBucketStart(ms('2025-03-09T14:40:00Z'), '10m')).toBe(ms('2025-03-09T14:40:00Z'));
93
- });
94
-
95
- it('15m: floors to the 15-minute boundary', () => {
96
- expect(getBucketStart(REF_MS, '15m')).toBe(ms('2025-03-09T14:30:00Z'));
97
- expect(getBucketStart(ms('2025-03-09T14:44:59Z'), '15m')).toBe(ms('2025-03-09T14:30:00Z'));
98
- expect(getBucketStart(ms('2025-03-09T14:45:00Z'), '15m')).toBe(ms('2025-03-09T14:45:00Z'));
99
- });
100
-
101
- it('20m (previously missing): floors correctly', () => {
102
- expect(getBucketStart(REF_MS, '20m')).toBe(ms('2025-03-09T14:20:00Z'));
103
- expect(getBucketStart(ms('2025-03-09T14:39:59Z'), '20m')).toBe(ms('2025-03-09T14:20:00Z'));
104
- expect(getBucketStart(ms('2025-03-09T14:40:00Z'), '20m')).toBe(ms('2025-03-09T14:40:00Z'));
105
- });
106
-
107
- it('30m: floors to the 30-minute boundary', () => {
108
- expect(getBucketStart(REF_MS, '30m')).toBe(ms('2025-03-09T14:30:00Z'));
109
- expect(getBucketStart(ms('2025-03-09T14:59:59Z'), '30m')).toBe(ms('2025-03-09T14:30:00Z'));
110
- expect(getBucketStart(ms('2025-03-09T15:00:00Z'), '30m')).toBe(ms('2025-03-09T15:00:00Z'));
111
- });
112
-
113
- it('45m (previously missing): floors correctly', () => {
114
- // 14:37 → bucket start is 14:00 (14*60=840, 840/45=18.666 → floor*45=810=13:30)?
115
- // Actually 14:00 = 840 min from epoch day. 840 / 45 = 18.666... → floor = 18 → 18*45 = 810 min
116
- // 810 min = 13:30. So 14:37 falls in the [13:30, 14:15) bucket.
117
- // Wait — getBucketStart uses epoch ms, not minutes within a day.
118
- // Let me recalculate: epoch for 14:37 on 2025-03-09, then floor to 45-min intervals.
119
- const bucket = getBucketStart(REF_MS, '45m');
120
- const INTERVAL = TIMEFRAMES['45m']!.ms!; // 2_700_000
121
- expect(bucket % INTERVAL).toBe(0); // must be on a 45-min epoch boundary
122
- expect(bucket).toBeLessThanOrEqual(REF_MS);
123
- expect(bucket + INTERVAL).toBeGreaterThan(REF_MS);
124
- });
125
-
126
- it('1h: floors to the hour boundary', () => {
127
- expect(getBucketStart(REF_MS, '1h')).toBe(ms('2025-03-09T14:00:00Z'));
128
- expect(getBucketStart(ms('2025-03-09T14:59:59Z'), '1h')).toBe(ms('2025-03-09T14:00:00Z'));
129
- expect(getBucketStart(ms('2025-03-09T15:00:00Z'), '1h')).toBe(ms('2025-03-09T15:00:00Z'));
130
- });
131
-
132
- it('2h: floors to the 2-hour boundary', () => {
133
- expect(getBucketStart(REF_MS, '2h')).toBe(ms('2025-03-09T14:00:00Z'));
134
- expect(getBucketStart(ms('2025-03-09T15:59:59Z'), '2h')).toBe(ms('2025-03-09T14:00:00Z'));
135
- expect(getBucketStart(ms('2025-03-09T16:00:00Z'), '2h')).toBe(ms('2025-03-09T16:00:00Z'));
136
- });
137
-
138
- it('4h: floors to the 4-hour boundary', () => {
139
- expect(getBucketStart(REF_MS, '4h')).toBe(ms('2025-03-09T12:00:00Z'));
140
- });
141
-
142
- it('6h: floors to the 6-hour boundary', () => {
143
- expect(getBucketStart(REF_MS, '6h')).toBe(ms('2025-03-09T12:00:00Z'));
144
- });
145
-
146
- it('12h: floors to the 12-hour boundary', () => {
147
- expect(getBucketStart(REF_MS, '12h')).toBe(ms('2025-03-09T12:00:00Z'));
148
- expect(getBucketStart(ms('2025-03-09T11:59:59Z'), '12h')).toBe(ms('2025-03-09T00:00:00Z'));
149
- });
150
-
151
- it('1d: floors to UTC midnight', () => {
152
- expect(getBucketStart(REF_MS, '1d')).toBe(ms('2025-03-09T00:00:00Z'));
153
- expect(getBucketStart(ms('2025-03-09T23:59:59Z'), '1d')).toBe(ms('2025-03-09T00:00:00Z'));
154
- expect(getBucketStart(ms('2025-03-10T00:00:00Z'), '1d')).toBe(ms('2025-03-10T00:00:00Z'));
155
- });
156
-
157
- it('3d: floors to the 3-day epoch boundary', () => {
158
- const bucket = getBucketStart(REF_MS, '3d');
159
- const INTERVAL = TIMEFRAMES['3d']!.ms!; // 259_200_000
160
- expect(bucket % INTERVAL).toBe(0);
161
- expect(bucket).toBeLessThanOrEqual(REF_MS);
162
- expect(bucket + INTERVAL).toBeGreaterThan(REF_MS);
163
- });
164
-
165
- it('exact boundary: timestamp == bucket start maps to itself', () => {
166
- const hourStart = ms('2025-03-09T14:00:00Z');
167
- expect(getBucketStart(hourStart, '1h')).toBe(hourStart);
168
-
169
- const minuteStart = ms('2025-03-09T14:37:00Z');
170
- expect(getBucketStart(minuteStart, '1m')).toBe(minuteStart);
171
- });
172
-
173
- it('isSameBucket: two timestamps in the same 1h bucket', () => {
174
- expect(isSameBucket(
175
- ms('2025-03-09T14:01:00Z'),
176
- ms('2025-03-09T14:59:00Z'),
177
- '1h',
178
- )).toBe(true);
179
- });
180
-
181
- it('isSameBucket: timestamps on either side of an hour boundary', () => {
182
- expect(isSameBucket(
183
- ms('2025-03-09T13:59:59Z'),
184
- ms('2025-03-09T14:00:01Z'),
185
- '1h',
186
- )).toBe(false);
187
- });
188
-
189
- it('timeframeToMs: returns null for calendar types and unknown keys', () => {
190
- expect(timeframeToMs('1w')).toBeNull();
191
- expect(timeframeToMs('1M')).toBeNull();
192
- expect(timeframeToMs('3h')).toBeNull(); // orphaned — excluded from registry
193
- expect(timeframeToMs('8h')).toBeNull(); // orphaned — excluded from registry
194
- });
195
-
196
- it('timeframeToMs: returns correct ms for all fixed timeframes', () => {
197
- expect(timeframeToMs('1m')).toBe(60_000);
198
- expect(timeframeToMs('5m')).toBe(300_000);
199
- expect(timeframeToMs('15m')).toBe(900_000);
200
- expect(timeframeToMs('1h')).toBe(3_600_000);
201
- expect(timeframeToMs('4h')).toBe(14_400_000);
202
- expect(timeframeToMs('1d')).toBe(86_400_000);
203
- });
204
- });
205
-
206
- // ─── 2. Weekly alignment ──────────────────────────────────────────────────────
207
-
208
- describe('getBucketStart — weekly (Monday alignment)', () => {
209
- it('Sunday maps to the immediately preceding Monday', () => {
210
- // 2025-03-09 is a Sunday → bucket should be Mon 2025-03-03
211
- expect(getWeekBucketStart(ms('2025-03-09T12:00:00Z'))).toBe(ms('2025-03-03T00:00:00Z'));
212
- expect(getBucketStart(ms('2025-03-09T12:00:00Z'), '1w')).toBe(ms('2025-03-03T00:00:00Z'));
213
- });
214
-
215
- it('Monday midnight maps to itself', () => {
216
- expect(getWeekBucketStart(ms('2025-03-03T00:00:00Z'))).toBe(ms('2025-03-03T00:00:00Z'));
217
- expect(getBucketStart(ms('2025-03-03T00:00:00Z'), '1w')).toBe(ms('2025-03-03T00:00:00Z'));
218
- });
219
-
220
- it('Monday 00:00:01 maps to the same Monday', () => {
221
- expect(getBucketStart(ms('2025-03-03T00:00:01Z'), '1w')).toBe(ms('2025-03-03T00:00:00Z'));
222
- });
223
-
224
- it('Saturday 23:59:59 maps to the week-opening Monday', () => {
225
- expect(getBucketStart(ms('2025-03-08T23:59:59Z'), '1w')).toBe(ms('2025-03-03T00:00:00Z'));
226
- });
227
-
228
- it('does NOT anchor to Thursday (Unix epoch)', () => {
229
- // The naive floor(t / 604800)*604800 anchors to Thursday 1970-01-01.
230
- // Our implementation must yield a Monday for any input.
231
- for (const iso of [
232
- '2025-01-01T00:00:00Z', // Wednesday
233
- '2025-02-15T12:00:00Z', // Saturday
234
- '2024-12-25T00:00:00Z', // Wednesday (Christmas)
235
- '2025-03-09T23:59:59Z', // Sunday
236
- ]) {
237
- const bucket = getWeekBucketStart(ms(iso));
238
- const day = new Date(bucket).getUTCDay();
239
- expect(day, `${iso} → bucket day should be Monday (1), got ${day}`).toBe(1);
240
- }
241
- });
242
-
243
- it('successive week buckets are exactly 7 days apart', () => {
244
- const w1 = getWeekBucketStart(ms('2025-03-03T00:00:00Z'));
245
- const w2 = getWeekBucketStart(ms('2025-03-10T00:00:00Z'));
246
- expect(w2 - w1).toBe(7 * 24 * 60 * 60 * 1000);
247
- });
248
-
249
- it('isSameBucket: Monday and Sunday of the same ISO week', () => {
250
- expect(isSameBucket(
251
- ms('2025-03-03T00:00:00Z'), // Monday
252
- ms('2025-03-09T23:59:59Z'), // Sunday
253
- '1w',
254
- )).toBe(true);
255
- });
256
-
257
- it('isSameBucket: Sunday and the next Monday are different buckets', () => {
258
- expect(isSameBucket(
259
- ms('2025-03-09T23:59:59Z'), // Sunday (week of Mar-03)
260
- ms('2025-03-10T00:00:00Z'), // Monday (next week)
261
- '1w',
262
- )).toBe(false);
263
- });
264
- });
265
-
266
- // ─── 3. Monthly alignment ─────────────────────────────────────────────────────
267
-
268
- describe('getBucketStart — monthly (calendar first-of-month)', () => {
269
- it('mid-month maps to the first of that month', () => {
270
- expect(getMonthBucketStart(ms('2025-03-15T18:30:00Z'))).toBe(ms('2025-03-01T00:00:00Z'));
271
- expect(getBucketStart(ms('2025-03-15T18:30:00Z'), '1M')).toBe(ms('2025-03-01T00:00:00Z'));
272
- });
273
-
274
- it('first of month 00:00 UTC maps to itself', () => {
275
- expect(getBucketStart(ms('2025-03-01T00:00:00Z'), '1M')).toBe(ms('2025-03-01T00:00:00Z'));
276
- });
277
-
278
- it('last second of January maps to January 1st', () => {
279
- expect(getBucketStart(ms('2025-01-31T23:59:59Z'), '1M')).toBe(ms('2025-01-01T00:00:00Z'));
280
- });
281
-
282
- it('January → February rollover (Feb 1st maps to Feb 1st)', () => {
283
- expect(getBucketStart(ms('2025-02-01T00:00:00Z'), '1M')).toBe(ms('2025-02-01T00:00:00Z'));
284
- expect(getBucketStart(ms('2025-01-31T23:59:59Z'), '1M')).toBe(ms('2025-01-01T00:00:00Z'));
285
- });
286
-
287
- it('February (non-leap): entire month maps to Feb 1', () => {
288
- expect(getBucketStart(ms('2025-02-14T12:00:00Z'), '1M')).toBe(ms('2025-02-01T00:00:00Z'));
289
- expect(getBucketStart(ms('2025-02-28T23:59:59Z'), '1M')).toBe(ms('2025-02-01T00:00:00Z'));
290
- });
291
-
292
- it('February (leap year 2024): Feb 29 maps to Feb 1', () => {
293
- expect(getBucketStart(ms('2024-02-29T12:00:00Z'), '1M')).toBe(ms('2024-02-01T00:00:00Z'));
294
- });
295
-
296
- it('month-end rollover: March 1st is a new bucket', () => {
297
- expect(isSameBucket(
298
- ms('2025-02-28T23:59:59Z'),
299
- ms('2025-03-01T00:00:00Z'),
300
- '1M',
301
- )).toBe(false);
302
- });
303
-
304
- it('isSameBucket: Feb 1 and Feb 28 (non-leap)', () => {
305
- expect(isSameBucket(
306
- ms('2025-02-01T00:00:00Z'),
307
- ms('2025-02-28T23:59:59Z'),
308
- '1M',
309
- )).toBe(true);
310
- });
311
-
312
- it('does NOT use 30-day approximation', () => {
313
- // Using epoch / 2_592_000_000 (30 days) would shift December 2024 to wrong month.
314
- // Date.UTC-based implementation must be correct.
315
- expect(getBucketStart(ms('2024-12-31T23:59:59Z'), '1M')).toBe(ms('2024-12-01T00:00:00Z'));
316
- expect(getBucketStart(ms('2025-01-01T00:00:00Z'), '1M')).toBe(ms('2025-01-01T00:00:00Z'));
317
- });
318
- });
319
-
320
- // ─── 4. Live update semantics ─────────────────────────────────────────────────
321
-
322
- describe('CandleEngine — live update semantics', () => {
323
- let engine: CandleEngine;
324
- const TF = '1m';
325
-
326
- // A round 1-minute boundary in Unix seconds: 2025-03-09 14:00:00 UTC
327
- const T0 = sec('2025-03-09T14:00:00Z'); // candle 0 open
328
- const T1 = sec('2025-03-09T14:01:00Z'); // candle 1 open
329
-
330
- beforeEach(() => {
331
- engine = new CandleEngine();
332
- engine.initialize([], TF as any);
333
- });
334
-
335
- it('first tick creates the candle', () => {
336
- const result = engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
337
- expect(result.type).toBe('append');
338
- const bar = engine.getLastBar()!;
339
- expect(bar.open).toBe(100);
340
- expect(bar.high).toBe(110);
341
- expect(bar.low).toBe(90);
342
- expect(bar.close).toBe(105);
343
- });
344
-
345
- it('same-bucket update: open is immutable', () => {
346
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
347
- // Second tick with different open — open must stay 100
348
- engine.applyLiveUpdate(tick(T0 + 30, 200, 215, 195, 210));
349
- const bar = engine.getLastBar()!;
350
- expect(bar.open).toBe(100); // unchanged
351
- expect(bar.close).toBe(210); // updated
352
- });
353
-
354
- it('same-bucket update: high expands upward', () => {
355
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
356
- engine.applyLiveUpdate(tick(T0 + 30, 100, 150, 90, 145));
357
- expect(engine.getLastBar()!.high).toBe(150);
358
- });
359
-
360
- it('same-bucket update: high never decreases', () => {
361
- engine.applyLiveUpdate(tick(T0, 100, 150, 90, 145));
362
- engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 90, 105));
363
- expect(engine.getLastBar()!.high).toBe(150);
364
- });
365
-
366
- it('same-bucket update: low expands downward', () => {
367
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
368
- engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 70, 80));
369
- expect(engine.getLastBar()!.low).toBe(70);
370
- });
371
-
372
- it('same-bucket update: low never increases', () => {
373
- engine.applyLiveUpdate(tick(T0, 100, 110, 70, 80));
374
- engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 90, 105));
375
- expect(engine.getLastBar()!.low).toBe(70);
376
- });
377
-
378
- it('same-bucket update: close always updates to the latest tick', () => {
379
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
380
- engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 90, 108));
381
- engine.applyLiveUpdate(tick(T0 + 45, 100, 110, 90, 111));
382
- expect(engine.getLastBar()!.close).toBe(111);
383
- });
384
-
385
- it('same-bucket update: bar count stays the same', () => {
386
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
387
- engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 90, 108));
388
- expect(engine.getBars().length).toBe(1);
389
- });
390
-
391
- it('new-bucket: creates a new bar and closes the previous', () => {
392
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
393
- const result = engine.applyLiveUpdate(tick(T1, 106, 120, 100, 115));
394
- expect(result.type).toBe('append');
395
- expect(engine.getBars().length).toBe(2);
396
-
397
- const bars = engine.getBars();
398
- expect(bars[0]!.isClosed).toBe(true);
399
- expect(bars[1]!.isClosed).toBe(false);
400
- });
401
-
402
- it('new-bucket: previous bar open is unchanged', () => {
403
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
404
- engine.applyLiveUpdate(tick(T1, 106, 120, 100, 115));
405
- expect(engine.getBars()[0]!.open).toBe(100);
406
- });
407
-
408
- it('out-of-order tick: ignored and bar count unchanged', () => {
409
- engine.applyLiveUpdate(tick(T1, 106, 120, 100, 115)); // candle 1
410
- const result = engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105)); // older — ignore
411
- expect(result.type).toBe('ignore');
412
- expect(engine.getBars().length).toBe(1);
413
- });
414
-
415
- it('gap detection: skipping multiple buckets emits gap result', () => {
416
- const T5 = sec('2025-03-09T14:05:00Z'); // 5 minutes after T0
417
- engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
418
- const result = engine.applyLiveUpdate(tick(T5, 106, 120, 100, 115));
419
- expect(result.type).toBe('gap');
420
- if (result.type === 'gap') {
421
- expect(result.missingCount).toBe(4); // T1, T2, T3, T4 missing
422
- }
423
- });
424
- });
425
-
426
- // ─── 5. Reconnect tests ───────────────────────────────────────────────────────
427
-
428
- describe('CandleEngine — reconnect and backfill', () => {
429
- const TF = '1m';
430
- const T0 = sec('2025-03-09T14:00:00Z');
431
- const T1 = sec('2025-03-09T14:01:00Z');
432
- const T2 = sec('2025-03-09T14:02:00Z');
433
- const T3 = sec('2025-03-09T14:03:00Z');
434
- const T4 = sec('2025-03-09T14:04:00Z');
435
-
436
- it('backfillGap: merges missing bars into existing array', () => {
437
- const engine = new CandleEngine();
438
- engine.initialize([tick(T0, 100, 110, 90, 105)], TF as any);
439
- engine.applyLiveUpdate(tick(T4, 130, 140, 120, 135)); // jumps over T1–T3
440
-
441
- // Backfill T1–T3 from REST
442
- engine.backfillGap([
443
- tick(T1, 106, 115, 100, 112),
444
- tick(T2, 112, 118, 105, 116),
445
- tick(T3, 116, 125, 110, 120),
446
- ]);
447
-
448
- const bars = engine.getBars();
449
- expect(bars.length).toBe(5);
450
- expect(bars.map(b => b.time)).toEqual([T0, T1, T2, T3, T4]);
451
- });
452
-
453
- it('backfillGap: historical bars override closed provisional bars', () => {
454
- const engine = new CandleEngine();
455
- engine.initialize([
456
- tick(T0, 100, 110, 90, 105),
457
- tick(T1, 106, 115, 100, 112), // provisional T1 (currently live/open)
458
- ], TF as any);
459
-
460
- // Advance to T2 — this closes T1, making it eligible for REST override
461
- engine.applyLiveUpdate(tick(T2, 112, 118, 105, 116));
462
-
463
- // REST returns authoritative data for the now-closed T1
464
- engine.backfillGap([tick(T1, 106, 120, 98, 119)]);
465
-
466
- const bars = engine.getBars();
467
- const t1bar = bars.find(b => b.time === T1)!;
468
- expect(t1bar.high).toBe(120); // authoritative REST value wins for CLOSED bars
469
- expect(t1bar.low).toBe(98);
470
- expect(t1bar.close).toBe(119);
471
- });
472
-
473
- it('backfillGap: forming candle is preserved after merge', () => {
474
- const engine = new CandleEngine();
475
- engine.initialize([tick(T0, 100, 110, 90, 105)], TF as any);
476
- engine.applyLiveUpdate(tick(T3, 130, 140, 120, 135)); // live bar at T3
477
-
478
- // Backfill T1–T2 (gap bars before the live bar)
479
- engine.backfillGap([
480
- tick(T1, 106, 115, 100, 112),
481
- tick(T2, 112, 118, 105, 116),
482
- ]);
483
-
484
- const last = engine.getLastBar()!;
485
- expect(last.time).toBe(T3);
486
- expect(last.close).toBe(135); // forming candle values preserved
487
- });
488
-
489
- it('handleReconnect: REST overlap corrects stale candles', () => {
490
- const engine = new CandleEngine();
491
- engine.initialize([
492
- tick(T0, 100, 110, 90, 105),
493
- tick(T1, 106, 112, 100, 110), // stale — missed a major move during outage
494
- tick(T2, 110, 115, 105, 113),
495
- ], TF as any);
496
-
497
- // Reconnect supplies corrected data for T1
498
- engine.handleReconnect([
499
- tick(T1, 106, 150, 80, 145), // correct high/low for T1
500
- tick(T2, 145, 160, 130, 155), // correct T2
501
- ]);
502
-
503
- const bars = engine.getBars();
504
- const t1 = bars.find(b => b.time === T1)!;
505
- expect(t1.high).toBe(150);
506
- expect(t1.low).toBe(80);
507
-
508
- const t2 = bars.find(b => b.time === T2)!;
509
- expect(t2.high).toBe(160);
510
- });
511
-
512
- it('handleReconnect: forming candle survives a reconnect', () => {
513
- const engine = new CandleEngine();
514
- engine.initialize([tick(T0, 100, 110, 90, 105)], TF as any);
515
- engine.applyLiveUpdate(tick(T2, 112, 120, 108, 118)); // forming candle at T2
516
-
517
- // The overlap window includes T0–T1 history but not yet T2
518
- engine.handleReconnect([
519
- tick(T0, 100, 115, 88, 108), // slightly different authoritative T0
520
- tick(T1, 108, 120, 104, 116),
521
- ]);
522
-
523
- // T2 (live bar) should survive untouched
524
- const last = engine.getLastBar()!;
525
- expect(last.time).toBe(T2);
526
- expect(last.close).toBe(118);
527
- });
528
-
529
- it('handleReconnect: gaps between reconnect bars are handled', () => {
530
- const engine = new CandleEngine();
531
- engine.initialize([
532
- tick(T0, 100, 110, 90, 105),
533
- ], TF as any);
534
-
535
- engine.handleReconnect([
536
- tick(T0, 100, 115, 88, 112),
537
- tick(T2, 112, 120, 108, 118), // T1 is missing from the REST window
538
- tick(T4, 120, 130, 115, 128),
539
- ]);
540
-
541
- // Result must be sorted and include all available bars
542
- const bars = engine.getBars();
543
- const times = bars.map(b => b.time);
544
- expect(times).toEqual(times.slice().sort((a, b) => a - b));
545
- });
546
- });
547
-
548
- // ─── 6. normalizeTimestamp edge cases ────────────────────────────────────────
549
-
550
- describe('normalizeTimestamp — boundary cases', () => {
551
- it('Unix seconds (≤ 1e12) are multiplied by 1000', () => {
552
- expect(normalizeTimestamp(1_741_528_662)).toBe(1_741_528_662_000);
553
- });
554
-
555
- it('Unix milliseconds (> 1e12) are returned as-is', () => {
556
- expect(normalizeTimestamp(1_741_528_662_000)).toBe(1_741_528_662_000);
557
- });
558
-
559
- it('numeric string in seconds is treated as seconds', () => {
560
- expect(normalizeTimestamp('1741528662')).toBe(1_741_528_662_000);
561
- });
562
-
563
- it('numeric string in ms is returned as-is', () => {
564
- expect(normalizeTimestamp('1741528662000')).toBe(1_741_528_662_000);
565
- });
566
-
567
- it('Date object returns its getTime()', () => {
568
- const d = new Date('2025-03-09T14:37:42Z');
569
- expect(normalizeTimestamp(d)).toBe(d.getTime());
570
- });
571
-
572
- it('throws RangeError on NaN', () => {
573
- expect(() => normalizeTimestamp(NaN)).toThrow(RangeError);
574
- });
575
-
576
- it('throws RangeError on Infinity', () => {
577
- expect(() => normalizeTimestamp(Infinity)).toThrow(RangeError);
578
- });
579
-
580
- it('throws RangeError on invalid date string', () => {
581
- expect(() => normalizeTimestamp('not-a-date')).toThrow(RangeError);
582
- });
583
- });