@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candleInvariant.test.js","sourceRoot":"","sources":["../../src/__tests__/candleInvariant.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * SDK Public API Surface — type-level integration test.
3
+ *
4
+ * Verifies that @forgecharts/sdk exports the required public symbols.
5
+ * Compiled by `tsc --noEmit` (no runtime execution needed).
6
+ *
7
+ * The three primary integration points are:
8
+ * 1. createChart() — vanilla JS/TS DOM-based embed
9
+ * 2. ChartCanvas — React component embed
10
+ * 3. ChartWorkspace — full-workspace React embed
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=public-api-surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api-surface.d.ts","sourceRoot":"","sources":["../../src/__tests__/public-api-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -9,62 +9,23 @@
9
9
  * 2. ChartCanvas — React component embed
10
10
  * 3. ChartWorkspace — full-workspace React embed
11
11
  */
12
-
13
- import type {
14
- // Primary chart config
15
- ChartConfig,
16
- ChartInterval,
17
- ChartTheme,
18
- ChartEventMap,
19
- ChartLayout,
20
- // Datafeed contract
21
- IDatafeed,
22
- HistoricalBarsResult,
23
- SymbolInfo,
24
- // Trading
25
- ChartOrder,
26
- ChartPosition,
27
- ExecutionFill,
28
- // Capabilities
29
- ChartCapabilities,
30
- // Indicator
31
- IndicatorConfig,
32
- IndicatorType,
33
- } from '@forgecharts/sdk';
34
-
35
- import {
36
- createChart,
37
- TChart,
38
- DatafeedConnector,
39
- TradingOverlayStore,
40
- LicenseManager,
41
- CandleEngine,
42
- ReferenceAPI,
43
- // Capability helpers
44
- getCapabilities,
45
- isManagedMode,
46
- isUnmanagedMode,
47
- } from '@forgecharts/sdk';
48
-
12
+ import { createChart, TChart, DatafeedConnector, TradingOverlayStore, LicenseManager, CandleEngine, ReferenceAPI,
13
+ // Capability helpers
14
+ getCapabilities, isManagedMode, isUnmanagedMode, } from '@forgecharts/sdk';
49
15
  // ── Engine internals must NOT be importable from the root path ────────────
50
16
  // The following would correctly fail to compile if enabled:
51
17
  // import { Chart } from '@forgecharts/sdk'; // ❌ moved to ./internal
52
18
  // import { PixiChart } from '@forgecharts/sdk'; // ❌ moved to ./internal
53
-
54
19
  // ── Engine internals ARE importable from the internal path ────────────────
55
20
  import { Chart, PixiChart, InteractionManager } from '@forgecharts/sdk/internal';
56
-
57
21
  // ── Type assertions ───────────────────────────────────────────────────────
58
-
59
22
  // createChart must be callable and TChart must be exported
60
23
  void createChart;
61
24
  void TChart;
62
-
63
25
  // DatafeedConnector, TradingOverlayStore, and capability helpers must be exported
64
26
  void DatafeedConnector;
65
27
  void TradingOverlayStore;
66
28
  void getCapabilities;
67
-
68
29
  // Internal engine: Chart, PixiChart, InteractionManager must still be available
69
30
  void Chart;
70
31
  void PixiChart;
@@ -74,3 +35,4 @@ void CandleEngine;
74
35
  void ReferenceAPI;
75
36
  void isManagedMode;
76
37
  void isUnmanagedMode;
38
+ //# sourceMappingURL=public-api-surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api-surface.js","sourceRoot":"","sources":["../../src/__tests__/public-api-surface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwBH,OAAO,EACL,WAAW,EACX,MAAM,EACN,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,YAAY;AACZ,qBAAqB;AACrB,eAAe,EACf,aAAa,EACb,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,6EAA6E;AAC7E,4DAA4D;AAC5D,qEAAqE;AACrE,yEAAyE;AAEzE,6EAA6E;AAC7E,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEjF,6EAA6E;AAE7E,2DAA2D;AAC3D,KAAK,WAAW,CAAC;AACjB,KAAK,MAAM,CAAC;AAEZ,kFAAkF;AAClF,KAAK,iBAAiB,CAAC;AACvB,KAAK,mBAAmB,CAAC;AACzB,KAAK,eAAe,CAAC;AAErB,gFAAgF;AAChF,KAAK,KAAK,CAAC;AACX,KAAK,SAAS,CAAC;AACf,KAAK,kBAAkB,CAAC;AACxB,KAAK,cAAc,CAAC;AACpB,KAAK,YAAY,CAAC;AAClB,KAAK,YAAY,CAAC;AAClB,KAAK,aAAa,CAAC;AACnB,KAAK,eAAe,CAAC"}
@@ -0,0 +1,17 @@
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
+ export {};
17
+ //# sourceMappingURL=timeframeBoundary.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeframeBoundary.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/timeframeBoundary.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,452 @@
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
+ import { describe, it, expect, beforeEach } from 'vitest';
17
+ import { getBucketStart, getWeekBucketStart, getMonthBucketStart, isSameBucket, normalizeTimestamp, timeframeToMs, TIMEFRAMES, } from '@forgecharts/shared/time';
18
+ import { CandleEngine } from '../engine/CandleEngine';
19
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
20
+ /** Parse an ISO-8601 UTC string to Unix milliseconds. */
21
+ const ms = (iso) => new Date(iso).getTime();
22
+ /** Parse an ISO-8601 UTC string to Unix seconds. */
23
+ const sec = (iso) => new Date(iso).getTime() / 1000;
24
+ /** Build a minimal RawOHLCV tick (all values in Unix seconds by default). */
25
+ function tick(timeSecOrMs, open = 100, high = 110, low = 90, close = 105, volume = 1) {
26
+ return { time: timeSecOrMs, open, high, low, close, volume };
27
+ }
28
+ // ─── 1. Fixed intervals ───────────────────────────────────────────────────────
29
+ describe('getBucketStart — fixed intervals', () => {
30
+ /**
31
+ * Reference point: 2025-03-09 14:37:42 UTC
32
+ * ms = 1741528662000
33
+ * sec = 1741528662
34
+ */
35
+ const REF_MS = ms('2025-03-09T14:37:42Z');
36
+ it('1m: floors to the minute boundary', () => {
37
+ expect(getBucketStart(REF_MS, '1m')).toBe(ms('2025-03-09T14:37:00Z'));
38
+ });
39
+ it('2m: floors to the 2-minute boundary', () => {
40
+ // 14:37 → bucket start is 14:36 (36 is divisible by 2)
41
+ expect(getBucketStart(REF_MS, '2m')).toBe(ms('2025-03-09T14:36:00Z'));
42
+ });
43
+ it('3m (previously missing): floors correctly', () => {
44
+ // 14:37 → bucket start is 14:36 (36 is divisible by 3)
45
+ expect(getBucketStart(REF_MS, '3m')).toBe(ms('2025-03-09T14:36:00Z'));
46
+ // 14:37:42 inside [14:36, 14:39) — confirm
47
+ expect(getBucketStart(ms('2025-03-09T14:38:59Z'), '3m')).toBe(ms('2025-03-09T14:36:00Z'));
48
+ expect(getBucketStart(ms('2025-03-09T14:39:00Z'), '3m')).toBe(ms('2025-03-09T14:39:00Z'));
49
+ });
50
+ it('4m (previously missing): floors correctly', () => {
51
+ // 14:37 → bucket start is 14:36 (36 is divisible by 4)
52
+ expect(getBucketStart(REF_MS, '4m')).toBe(ms('2025-03-09T14:36:00Z'));
53
+ expect(getBucketStart(ms('2025-03-09T14:39:59Z'), '4m')).toBe(ms('2025-03-09T14:36:00Z'));
54
+ expect(getBucketStart(ms('2025-03-09T14:40:00Z'), '4m')).toBe(ms('2025-03-09T14:40:00Z'));
55
+ });
56
+ it('5m: floors to the 5-minute boundary', () => {
57
+ expect(getBucketStart(REF_MS, '5m')).toBe(ms('2025-03-09T14:35:00Z'));
58
+ expect(getBucketStart(ms('2025-03-09T14:39:59Z'), '5m')).toBe(ms('2025-03-09T14:35:00Z'));
59
+ expect(getBucketStart(ms('2025-03-09T14:40:00Z'), '5m')).toBe(ms('2025-03-09T14:40:00Z'));
60
+ });
61
+ it('10m (previously missing): floors correctly', () => {
62
+ expect(getBucketStart(REF_MS, '10m')).toBe(ms('2025-03-09T14:30:00Z'));
63
+ expect(getBucketStart(ms('2025-03-09T14:39:59Z'), '10m')).toBe(ms('2025-03-09T14:30:00Z'));
64
+ expect(getBucketStart(ms('2025-03-09T14:40:00Z'), '10m')).toBe(ms('2025-03-09T14:40:00Z'));
65
+ });
66
+ it('15m: floors to the 15-minute boundary', () => {
67
+ expect(getBucketStart(REF_MS, '15m')).toBe(ms('2025-03-09T14:30:00Z'));
68
+ expect(getBucketStart(ms('2025-03-09T14:44:59Z'), '15m')).toBe(ms('2025-03-09T14:30:00Z'));
69
+ expect(getBucketStart(ms('2025-03-09T14:45:00Z'), '15m')).toBe(ms('2025-03-09T14:45:00Z'));
70
+ });
71
+ it('20m (previously missing): floors correctly', () => {
72
+ expect(getBucketStart(REF_MS, '20m')).toBe(ms('2025-03-09T14:20:00Z'));
73
+ expect(getBucketStart(ms('2025-03-09T14:39:59Z'), '20m')).toBe(ms('2025-03-09T14:20:00Z'));
74
+ expect(getBucketStart(ms('2025-03-09T14:40:00Z'), '20m')).toBe(ms('2025-03-09T14:40:00Z'));
75
+ });
76
+ it('30m: floors to the 30-minute boundary', () => {
77
+ expect(getBucketStart(REF_MS, '30m')).toBe(ms('2025-03-09T14:30:00Z'));
78
+ expect(getBucketStart(ms('2025-03-09T14:59:59Z'), '30m')).toBe(ms('2025-03-09T14:30:00Z'));
79
+ expect(getBucketStart(ms('2025-03-09T15:00:00Z'), '30m')).toBe(ms('2025-03-09T15:00:00Z'));
80
+ });
81
+ it('45m (previously missing): floors correctly', () => {
82
+ // 14:37 → bucket start is 14:00 (14*60=840, 840/45=18.666 → floor*45=810=13:30)?
83
+ // Actually 14:00 = 840 min from epoch day. 840 / 45 = 18.666... → floor = 18 → 18*45 = 810 min
84
+ // 810 min = 13:30. So 14:37 falls in the [13:30, 14:15) bucket.
85
+ // Wait — getBucketStart uses epoch ms, not minutes within a day.
86
+ // Let me recalculate: epoch for 14:37 on 2025-03-09, then floor to 45-min intervals.
87
+ const bucket = getBucketStart(REF_MS, '45m');
88
+ const INTERVAL = TIMEFRAMES['45m'].ms; // 2_700_000
89
+ expect(bucket % INTERVAL).toBe(0); // must be on a 45-min epoch boundary
90
+ expect(bucket).toBeLessThanOrEqual(REF_MS);
91
+ expect(bucket + INTERVAL).toBeGreaterThan(REF_MS);
92
+ });
93
+ it('1h: floors to the hour boundary', () => {
94
+ expect(getBucketStart(REF_MS, '1h')).toBe(ms('2025-03-09T14:00:00Z'));
95
+ expect(getBucketStart(ms('2025-03-09T14:59:59Z'), '1h')).toBe(ms('2025-03-09T14:00:00Z'));
96
+ expect(getBucketStart(ms('2025-03-09T15:00:00Z'), '1h')).toBe(ms('2025-03-09T15:00:00Z'));
97
+ });
98
+ it('2h: floors to the 2-hour boundary', () => {
99
+ expect(getBucketStart(REF_MS, '2h')).toBe(ms('2025-03-09T14:00:00Z'));
100
+ expect(getBucketStart(ms('2025-03-09T15:59:59Z'), '2h')).toBe(ms('2025-03-09T14:00:00Z'));
101
+ expect(getBucketStart(ms('2025-03-09T16:00:00Z'), '2h')).toBe(ms('2025-03-09T16:00:00Z'));
102
+ });
103
+ it('4h: floors to the 4-hour boundary', () => {
104
+ expect(getBucketStart(REF_MS, '4h')).toBe(ms('2025-03-09T12:00:00Z'));
105
+ });
106
+ it('6h: floors to the 6-hour boundary', () => {
107
+ expect(getBucketStart(REF_MS, '6h')).toBe(ms('2025-03-09T12:00:00Z'));
108
+ });
109
+ it('12h: floors to the 12-hour boundary', () => {
110
+ expect(getBucketStart(REF_MS, '12h')).toBe(ms('2025-03-09T12:00:00Z'));
111
+ expect(getBucketStart(ms('2025-03-09T11:59:59Z'), '12h')).toBe(ms('2025-03-09T00:00:00Z'));
112
+ });
113
+ it('1d: floors to UTC midnight', () => {
114
+ expect(getBucketStart(REF_MS, '1d')).toBe(ms('2025-03-09T00:00:00Z'));
115
+ expect(getBucketStart(ms('2025-03-09T23:59:59Z'), '1d')).toBe(ms('2025-03-09T00:00:00Z'));
116
+ expect(getBucketStart(ms('2025-03-10T00:00:00Z'), '1d')).toBe(ms('2025-03-10T00:00:00Z'));
117
+ });
118
+ it('3d: floors to the 3-day epoch boundary', () => {
119
+ const bucket = getBucketStart(REF_MS, '3d');
120
+ const INTERVAL = TIMEFRAMES['3d'].ms; // 259_200_000
121
+ expect(bucket % INTERVAL).toBe(0);
122
+ expect(bucket).toBeLessThanOrEqual(REF_MS);
123
+ expect(bucket + INTERVAL).toBeGreaterThan(REF_MS);
124
+ });
125
+ it('exact boundary: timestamp == bucket start maps to itself', () => {
126
+ const hourStart = ms('2025-03-09T14:00:00Z');
127
+ expect(getBucketStart(hourStart, '1h')).toBe(hourStart);
128
+ const minuteStart = ms('2025-03-09T14:37:00Z');
129
+ expect(getBucketStart(minuteStart, '1m')).toBe(minuteStart);
130
+ });
131
+ it('isSameBucket: two timestamps in the same 1h bucket', () => {
132
+ expect(isSameBucket(ms('2025-03-09T14:01:00Z'), ms('2025-03-09T14:59:00Z'), '1h')).toBe(true);
133
+ });
134
+ it('isSameBucket: timestamps on either side of an hour boundary', () => {
135
+ expect(isSameBucket(ms('2025-03-09T13:59:59Z'), ms('2025-03-09T14:00:01Z'), '1h')).toBe(false);
136
+ });
137
+ it('timeframeToMs: returns null for calendar types and unknown keys', () => {
138
+ expect(timeframeToMs('1w')).toBeNull();
139
+ expect(timeframeToMs('1M')).toBeNull();
140
+ expect(timeframeToMs('3h')).toBeNull(); // orphaned — excluded from registry
141
+ expect(timeframeToMs('8h')).toBeNull(); // orphaned — excluded from registry
142
+ });
143
+ it('timeframeToMs: returns correct ms for all fixed timeframes', () => {
144
+ expect(timeframeToMs('1m')).toBe(60_000);
145
+ expect(timeframeToMs('5m')).toBe(300_000);
146
+ expect(timeframeToMs('15m')).toBe(900_000);
147
+ expect(timeframeToMs('1h')).toBe(3_600_000);
148
+ expect(timeframeToMs('4h')).toBe(14_400_000);
149
+ expect(timeframeToMs('1d')).toBe(86_400_000);
150
+ });
151
+ });
152
+ // ─── 2. Weekly alignment ──────────────────────────────────────────────────────
153
+ describe('getBucketStart — weekly (Monday alignment)', () => {
154
+ it('Sunday maps to the immediately preceding Monday', () => {
155
+ // 2025-03-09 is a Sunday → bucket should be Mon 2025-03-03
156
+ expect(getWeekBucketStart(ms('2025-03-09T12:00:00Z'))).toBe(ms('2025-03-03T00:00:00Z'));
157
+ expect(getBucketStart(ms('2025-03-09T12:00:00Z'), '1w')).toBe(ms('2025-03-03T00:00:00Z'));
158
+ });
159
+ it('Monday midnight maps to itself', () => {
160
+ expect(getWeekBucketStart(ms('2025-03-03T00:00:00Z'))).toBe(ms('2025-03-03T00:00:00Z'));
161
+ expect(getBucketStart(ms('2025-03-03T00:00:00Z'), '1w')).toBe(ms('2025-03-03T00:00:00Z'));
162
+ });
163
+ it('Monday 00:00:01 maps to the same Monday', () => {
164
+ expect(getBucketStart(ms('2025-03-03T00:00:01Z'), '1w')).toBe(ms('2025-03-03T00:00:00Z'));
165
+ });
166
+ it('Saturday 23:59:59 maps to the week-opening Monday', () => {
167
+ expect(getBucketStart(ms('2025-03-08T23:59:59Z'), '1w')).toBe(ms('2025-03-03T00:00:00Z'));
168
+ });
169
+ it('does NOT anchor to Thursday (Unix epoch)', () => {
170
+ // The naive floor(t / 604800)*604800 anchors to Thursday 1970-01-01.
171
+ // Our implementation must yield a Monday for any input.
172
+ for (const iso of [
173
+ '2025-01-01T00:00:00Z', // Wednesday
174
+ '2025-02-15T12:00:00Z', // Saturday
175
+ '2024-12-25T00:00:00Z', // Wednesday (Christmas)
176
+ '2025-03-09T23:59:59Z', // Sunday
177
+ ]) {
178
+ const bucket = getWeekBucketStart(ms(iso));
179
+ const day = new Date(bucket).getUTCDay();
180
+ expect(day, `${iso} → bucket day should be Monday (1), got ${day}`).toBe(1);
181
+ }
182
+ });
183
+ it('successive week buckets are exactly 7 days apart', () => {
184
+ const w1 = getWeekBucketStart(ms('2025-03-03T00:00:00Z'));
185
+ const w2 = getWeekBucketStart(ms('2025-03-10T00:00:00Z'));
186
+ expect(w2 - w1).toBe(7 * 24 * 60 * 60 * 1000);
187
+ });
188
+ it('isSameBucket: Monday and Sunday of the same ISO week', () => {
189
+ expect(isSameBucket(ms('2025-03-03T00:00:00Z'), // Monday
190
+ ms('2025-03-09T23:59:59Z'), // Sunday
191
+ '1w')).toBe(true);
192
+ });
193
+ it('isSameBucket: Sunday and the next Monday are different buckets', () => {
194
+ expect(isSameBucket(ms('2025-03-09T23:59:59Z'), // Sunday (week of Mar-03)
195
+ ms('2025-03-10T00:00:00Z'), // Monday (next week)
196
+ '1w')).toBe(false);
197
+ });
198
+ });
199
+ // ─── 3. Monthly alignment ─────────────────────────────────────────────────────
200
+ describe('getBucketStart — monthly (calendar first-of-month)', () => {
201
+ it('mid-month maps to the first of that month', () => {
202
+ expect(getMonthBucketStart(ms('2025-03-15T18:30:00Z'))).toBe(ms('2025-03-01T00:00:00Z'));
203
+ expect(getBucketStart(ms('2025-03-15T18:30:00Z'), '1M')).toBe(ms('2025-03-01T00:00:00Z'));
204
+ });
205
+ it('first of month 00:00 UTC maps to itself', () => {
206
+ expect(getBucketStart(ms('2025-03-01T00:00:00Z'), '1M')).toBe(ms('2025-03-01T00:00:00Z'));
207
+ });
208
+ it('last second of January maps to January 1st', () => {
209
+ expect(getBucketStart(ms('2025-01-31T23:59:59Z'), '1M')).toBe(ms('2025-01-01T00:00:00Z'));
210
+ });
211
+ it('January → February rollover (Feb 1st maps to Feb 1st)', () => {
212
+ expect(getBucketStart(ms('2025-02-01T00:00:00Z'), '1M')).toBe(ms('2025-02-01T00:00:00Z'));
213
+ expect(getBucketStart(ms('2025-01-31T23:59:59Z'), '1M')).toBe(ms('2025-01-01T00:00:00Z'));
214
+ });
215
+ it('February (non-leap): entire month maps to Feb 1', () => {
216
+ expect(getBucketStart(ms('2025-02-14T12:00:00Z'), '1M')).toBe(ms('2025-02-01T00:00:00Z'));
217
+ expect(getBucketStart(ms('2025-02-28T23:59:59Z'), '1M')).toBe(ms('2025-02-01T00:00:00Z'));
218
+ });
219
+ it('February (leap year 2024): Feb 29 maps to Feb 1', () => {
220
+ expect(getBucketStart(ms('2024-02-29T12:00:00Z'), '1M')).toBe(ms('2024-02-01T00:00:00Z'));
221
+ });
222
+ it('month-end rollover: March 1st is a new bucket', () => {
223
+ expect(isSameBucket(ms('2025-02-28T23:59:59Z'), ms('2025-03-01T00:00:00Z'), '1M')).toBe(false);
224
+ });
225
+ it('isSameBucket: Feb 1 and Feb 28 (non-leap)', () => {
226
+ expect(isSameBucket(ms('2025-02-01T00:00:00Z'), ms('2025-02-28T23:59:59Z'), '1M')).toBe(true);
227
+ });
228
+ it('does NOT use 30-day approximation', () => {
229
+ // Using epoch / 2_592_000_000 (30 days) would shift December 2024 to wrong month.
230
+ // Date.UTC-based implementation must be correct.
231
+ expect(getBucketStart(ms('2024-12-31T23:59:59Z'), '1M')).toBe(ms('2024-12-01T00:00:00Z'));
232
+ expect(getBucketStart(ms('2025-01-01T00:00:00Z'), '1M')).toBe(ms('2025-01-01T00:00:00Z'));
233
+ });
234
+ });
235
+ // ─── 4. Live update semantics ─────────────────────────────────────────────────
236
+ describe('CandleEngine — live update semantics', () => {
237
+ let engine;
238
+ const TF = '1m';
239
+ // A round 1-minute boundary in Unix seconds: 2025-03-09 14:00:00 UTC
240
+ const T0 = sec('2025-03-09T14:00:00Z'); // candle 0 open
241
+ const T1 = sec('2025-03-09T14:01:00Z'); // candle 1 open
242
+ beforeEach(() => {
243
+ engine = new CandleEngine();
244
+ engine.initialize([], TF);
245
+ });
246
+ it('first tick creates the candle', () => {
247
+ const result = engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
248
+ expect(result.type).toBe('append');
249
+ const bar = engine.getLastBar();
250
+ expect(bar.open).toBe(100);
251
+ expect(bar.high).toBe(110);
252
+ expect(bar.low).toBe(90);
253
+ expect(bar.close).toBe(105);
254
+ });
255
+ it('same-bucket update: open is immutable', () => {
256
+ engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
257
+ // Second tick with different open — open must stay 100
258
+ engine.applyLiveUpdate(tick(T0 + 30, 200, 215, 195, 210));
259
+ const bar = engine.getLastBar();
260
+ expect(bar.open).toBe(100); // unchanged
261
+ expect(bar.close).toBe(210); // updated
262
+ });
263
+ it('same-bucket update: high expands upward', () => {
264
+ engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
265
+ engine.applyLiveUpdate(tick(T0 + 30, 100, 150, 90, 145));
266
+ expect(engine.getLastBar().high).toBe(150);
267
+ });
268
+ it('same-bucket update: high never decreases', () => {
269
+ engine.applyLiveUpdate(tick(T0, 100, 150, 90, 145));
270
+ engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 90, 105));
271
+ expect(engine.getLastBar().high).toBe(150);
272
+ });
273
+ it('same-bucket update: low expands downward', () => {
274
+ engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
275
+ engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 70, 80));
276
+ expect(engine.getLastBar().low).toBe(70);
277
+ });
278
+ it('same-bucket update: low never increases', () => {
279
+ engine.applyLiveUpdate(tick(T0, 100, 110, 70, 80));
280
+ engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 90, 105));
281
+ expect(engine.getLastBar().low).toBe(70);
282
+ });
283
+ it('same-bucket update: close always updates to the latest tick', () => {
284
+ engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
285
+ engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 90, 108));
286
+ engine.applyLiveUpdate(tick(T0 + 45, 100, 110, 90, 111));
287
+ expect(engine.getLastBar().close).toBe(111);
288
+ });
289
+ it('same-bucket update: bar count stays the same', () => {
290
+ engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
291
+ engine.applyLiveUpdate(tick(T0 + 30, 100, 110, 90, 108));
292
+ expect(engine.getBars().length).toBe(1);
293
+ });
294
+ it('new-bucket: creates a new bar and closes the previous', () => {
295
+ engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
296
+ const result = engine.applyLiveUpdate(tick(T1, 106, 120, 100, 115));
297
+ expect(result.type).toBe('append');
298
+ expect(engine.getBars().length).toBe(2);
299
+ const bars = engine.getBars();
300
+ expect(bars[0].isClosed).toBe(true);
301
+ expect(bars[1].isClosed).toBe(false);
302
+ });
303
+ it('new-bucket: previous bar open is unchanged', () => {
304
+ engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
305
+ engine.applyLiveUpdate(tick(T1, 106, 120, 100, 115));
306
+ expect(engine.getBars()[0].open).toBe(100);
307
+ });
308
+ it('out-of-order tick: ignored and bar count unchanged', () => {
309
+ engine.applyLiveUpdate(tick(T1, 106, 120, 100, 115)); // candle 1
310
+ const result = engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105)); // older — ignore
311
+ expect(result.type).toBe('ignore');
312
+ expect(engine.getBars().length).toBe(1);
313
+ });
314
+ it('gap detection: skipping multiple buckets emits gap result', () => {
315
+ const T5 = sec('2025-03-09T14:05:00Z'); // 5 minutes after T0
316
+ engine.applyLiveUpdate(tick(T0, 100, 110, 90, 105));
317
+ const result = engine.applyLiveUpdate(tick(T5, 106, 120, 100, 115));
318
+ expect(result.type).toBe('gap');
319
+ if (result.type === 'gap') {
320
+ expect(result.missingCount).toBe(4); // T1, T2, T3, T4 missing
321
+ }
322
+ });
323
+ });
324
+ // ─── 5. Reconnect tests ───────────────────────────────────────────────────────
325
+ describe('CandleEngine — reconnect and backfill', () => {
326
+ const TF = '1m';
327
+ const T0 = sec('2025-03-09T14:00:00Z');
328
+ const T1 = sec('2025-03-09T14:01:00Z');
329
+ const T2 = sec('2025-03-09T14:02:00Z');
330
+ const T3 = sec('2025-03-09T14:03:00Z');
331
+ const T4 = sec('2025-03-09T14:04:00Z');
332
+ it('backfillGap: merges missing bars into existing array', () => {
333
+ const engine = new CandleEngine();
334
+ engine.initialize([tick(T0, 100, 110, 90, 105)], TF);
335
+ engine.applyLiveUpdate(tick(T4, 130, 140, 120, 135)); // jumps over T1–T3
336
+ // Backfill T1–T3 from REST
337
+ engine.backfillGap([
338
+ tick(T1, 106, 115, 100, 112),
339
+ tick(T2, 112, 118, 105, 116),
340
+ tick(T3, 116, 125, 110, 120),
341
+ ]);
342
+ const bars = engine.getBars();
343
+ expect(bars.length).toBe(5);
344
+ expect(bars.map(b => b.time)).toEqual([T0, T1, T2, T3, T4]);
345
+ });
346
+ it('backfillGap: historical bars override closed provisional bars', () => {
347
+ const engine = new CandleEngine();
348
+ engine.initialize([
349
+ tick(T0, 100, 110, 90, 105),
350
+ tick(T1, 106, 115, 100, 112), // provisional T1 (currently live/open)
351
+ ], TF);
352
+ // Advance to T2 — this closes T1, making it eligible for REST override
353
+ engine.applyLiveUpdate(tick(T2, 112, 118, 105, 116));
354
+ // REST returns authoritative data for the now-closed T1
355
+ engine.backfillGap([tick(T1, 106, 120, 98, 119)]);
356
+ const bars = engine.getBars();
357
+ const t1bar = bars.find(b => b.time === T1);
358
+ expect(t1bar.high).toBe(120); // authoritative REST value wins for CLOSED bars
359
+ expect(t1bar.low).toBe(98);
360
+ expect(t1bar.close).toBe(119);
361
+ });
362
+ it('backfillGap: forming candle is preserved after merge', () => {
363
+ const engine = new CandleEngine();
364
+ engine.initialize([tick(T0, 100, 110, 90, 105)], TF);
365
+ engine.applyLiveUpdate(tick(T3, 130, 140, 120, 135)); // live bar at T3
366
+ // Backfill T1–T2 (gap bars before the live bar)
367
+ engine.backfillGap([
368
+ tick(T1, 106, 115, 100, 112),
369
+ tick(T2, 112, 118, 105, 116),
370
+ ]);
371
+ const last = engine.getLastBar();
372
+ expect(last.time).toBe(T3);
373
+ expect(last.close).toBe(135); // forming candle values preserved
374
+ });
375
+ it('handleReconnect: REST overlap corrects stale candles', () => {
376
+ const engine = new CandleEngine();
377
+ engine.initialize([
378
+ tick(T0, 100, 110, 90, 105),
379
+ tick(T1, 106, 112, 100, 110), // stale — missed a major move during outage
380
+ tick(T2, 110, 115, 105, 113),
381
+ ], TF);
382
+ // Reconnect supplies corrected data for T1
383
+ engine.handleReconnect([
384
+ tick(T1, 106, 150, 80, 145), // correct high/low for T1
385
+ tick(T2, 145, 160, 130, 155), // correct T2
386
+ ]);
387
+ const bars = engine.getBars();
388
+ const t1 = bars.find(b => b.time === T1);
389
+ expect(t1.high).toBe(150);
390
+ expect(t1.low).toBe(80);
391
+ const t2 = bars.find(b => b.time === T2);
392
+ expect(t2.high).toBe(160);
393
+ });
394
+ it('handleReconnect: forming candle survives a reconnect', () => {
395
+ const engine = new CandleEngine();
396
+ engine.initialize([tick(T0, 100, 110, 90, 105)], TF);
397
+ engine.applyLiveUpdate(tick(T2, 112, 120, 108, 118)); // forming candle at T2
398
+ // The overlap window includes T0–T1 history but not yet T2
399
+ engine.handleReconnect([
400
+ tick(T0, 100, 115, 88, 108), // slightly different authoritative T0
401
+ tick(T1, 108, 120, 104, 116),
402
+ ]);
403
+ // T2 (live bar) should survive untouched
404
+ const last = engine.getLastBar();
405
+ expect(last.time).toBe(T2);
406
+ expect(last.close).toBe(118);
407
+ });
408
+ it('handleReconnect: gaps between reconnect bars are handled', () => {
409
+ const engine = new CandleEngine();
410
+ engine.initialize([
411
+ tick(T0, 100, 110, 90, 105),
412
+ ], TF);
413
+ engine.handleReconnect([
414
+ tick(T0, 100, 115, 88, 112),
415
+ tick(T2, 112, 120, 108, 118), // T1 is missing from the REST window
416
+ tick(T4, 120, 130, 115, 128),
417
+ ]);
418
+ // Result must be sorted and include all available bars
419
+ const bars = engine.getBars();
420
+ const times = bars.map(b => b.time);
421
+ expect(times).toEqual(times.slice().sort((a, b) => a - b));
422
+ });
423
+ });
424
+ // ─── 6. normalizeTimestamp edge cases ────────────────────────────────────────
425
+ describe('normalizeTimestamp — boundary cases', () => {
426
+ it('Unix seconds (≤ 1e12) are multiplied by 1000', () => {
427
+ expect(normalizeTimestamp(1_741_528_662)).toBe(1_741_528_662_000);
428
+ });
429
+ it('Unix milliseconds (> 1e12) are returned as-is', () => {
430
+ expect(normalizeTimestamp(1_741_528_662_000)).toBe(1_741_528_662_000);
431
+ });
432
+ it('numeric string in seconds is treated as seconds', () => {
433
+ expect(normalizeTimestamp('1741528662')).toBe(1_741_528_662_000);
434
+ });
435
+ it('numeric string in ms is returned as-is', () => {
436
+ expect(normalizeTimestamp('1741528662000')).toBe(1_741_528_662_000);
437
+ });
438
+ it('Date object returns its getTime()', () => {
439
+ const d = new Date('2025-03-09T14:37:42Z');
440
+ expect(normalizeTimestamp(d)).toBe(d.getTime());
441
+ });
442
+ it('throws RangeError on NaN', () => {
443
+ expect(() => normalizeTimestamp(NaN)).toThrow(RangeError);
444
+ });
445
+ it('throws RangeError on Infinity', () => {
446
+ expect(() => normalizeTimestamp(Infinity)).toThrow(RangeError);
447
+ });
448
+ it('throws RangeError on invalid date string', () => {
449
+ expect(() => normalizeTimestamp('not-a-date')).toThrow(RangeError);
450
+ });
451
+ });
452
+ //# sourceMappingURL=timeframeBoundary.test.js.map