@forgecharts/sdk 1.1.28 → 1.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/dist/index.js +8100 -48
  2. package/dist/index.js.map +1 -1
  3. package/dist/internal.js +8851 -31
  4. package/dist/internal.js.map +1 -1
  5. package/dist/react/index.js +11558 -27
  6. package/dist/react/index.js.map +1 -1
  7. package/dist/react/internal.js +12147 -43
  8. package/dist/react/internal.js.map +1 -1
  9. package/package.json +1 -1
  10. package/dist/__tests__/backwardCompatibility.test.js +0 -159
  11. package/dist/__tests__/backwardCompatibility.test.js.map +0 -1
  12. package/dist/__tests__/candleInvariant.test.js +0 -415
  13. package/dist/__tests__/candleInvariant.test.js.map +0 -1
  14. package/dist/__tests__/public-api-surface.js +0 -38
  15. package/dist/__tests__/public-api-surface.js.map +0 -1
  16. package/dist/__tests__/timeframeBoundary.test.js +0 -452
  17. package/dist/__tests__/timeframeBoundary.test.js.map +0 -1
  18. package/dist/api/DrawingManager.js +0 -190
  19. package/dist/api/DrawingManager.js.map +0 -1
  20. package/dist/api/EventBus.js +0 -44
  21. package/dist/api/EventBus.js.map +0 -1
  22. package/dist/api/IndicatorDAG.js +0 -316
  23. package/dist/api/IndicatorDAG.js.map +0 -1
  24. package/dist/api/IndicatorRegistry.js +0 -39
  25. package/dist/api/IndicatorRegistry.js.map +0 -1
  26. package/dist/api/LayoutManager.js +0 -51
  27. package/dist/api/LayoutManager.js.map +0 -1
  28. package/dist/api/PaneManager.js +0 -119
  29. package/dist/api/PaneManager.js.map +0 -1
  30. package/dist/api/ReferenceAPI.js +0 -153
  31. package/dist/api/ReferenceAPI.js.map +0 -1
  32. package/dist/api/TChart.js +0 -765
  33. package/dist/api/TChart.js.map +0 -1
  34. package/dist/api/createChart.js +0 -42
  35. package/dist/api/createChart.js.map +0 -1
  36. package/dist/api/drawing tools/fib gann menu/fibRetracement.js +0 -22
  37. package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +0 -1
  38. package/dist/api/drawing tools/lines menu/crossLine.js +0 -16
  39. package/dist/api/drawing tools/lines menu/crossLine.js.map +0 -1
  40. package/dist/api/drawing tools/lines menu/disjointChannel.js +0 -59
  41. package/dist/api/drawing tools/lines menu/disjointChannel.js.map +0 -1
  42. package/dist/api/drawing tools/lines menu/extendedLine.js +0 -17
  43. package/dist/api/drawing tools/lines menu/extendedLine.js.map +0 -1
  44. package/dist/api/drawing tools/lines menu/flatTopBottom.js +0 -41
  45. package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +0 -1
  46. package/dist/api/drawing tools/lines menu/horizontal.js +0 -19
  47. package/dist/api/drawing tools/lines menu/horizontal.js.map +0 -1
  48. package/dist/api/drawing tools/lines menu/horizontalRay.js +0 -20
  49. package/dist/api/drawing tools/lines menu/horizontalRay.js.map +0 -1
  50. package/dist/api/drawing tools/lines menu/infoLine.js +0 -107
  51. package/dist/api/drawing tools/lines menu/infoLine.js.map +0 -1
  52. package/dist/api/drawing tools/lines menu/insidePitchfork.js +0 -31
  53. package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +0 -1
  54. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +0 -15
  55. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +0 -1
  56. package/dist/api/drawing tools/lines menu/parallelChannel.js +0 -43
  57. package/dist/api/drawing tools/lines menu/parallelChannel.js.map +0 -1
  58. package/dist/api/drawing tools/lines menu/pitchfork.js +0 -12
  59. package/dist/api/drawing tools/lines menu/pitchfork.js.map +0 -1
  60. package/dist/api/drawing tools/lines menu/ray.js +0 -23
  61. package/dist/api/drawing tools/lines menu/ray.js.map +0 -1
  62. package/dist/api/drawing tools/lines menu/regressionTrend.js +0 -127
  63. package/dist/api/drawing tools/lines menu/regressionTrend.js.map +0 -1
  64. package/dist/api/drawing tools/lines menu/schiffPitchfork.js +0 -15
  65. package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +0 -1
  66. package/dist/api/drawing tools/lines menu/trendAngle.js +0 -51
  67. package/dist/api/drawing tools/lines menu/trendAngle.js.map +0 -1
  68. package/dist/api/drawing tools/lines menu/trendline.js +0 -11
  69. package/dist/api/drawing tools/lines menu/trendline.js.map +0 -1
  70. package/dist/api/drawing tools/lines menu/vertical.js +0 -11
  71. package/dist/api/drawing tools/lines menu/vertical.js.map +0 -1
  72. package/dist/api/drawing tools/pointers menu/crosshair.js +0 -16
  73. package/dist/api/drawing tools/pointers menu/crosshair.js.map +0 -1
  74. package/dist/api/drawing tools/pointers menu/cursor.js +0 -15
  75. package/dist/api/drawing tools/pointers menu/cursor.js.map +0 -1
  76. package/dist/api/drawing tools/pointers menu/demonstration.js +0 -30
  77. package/dist/api/drawing tools/pointers menu/demonstration.js.map +0 -1
  78. package/dist/api/drawing tools/pointers menu/dot.js +0 -23
  79. package/dist/api/drawing tools/pointers menu/dot.js.map +0 -1
  80. package/dist/api/drawing tools/shapes menu/rectangle.js +0 -19
  81. package/dist/api/drawing tools/shapes menu/rectangle.js.map +0 -1
  82. package/dist/api/drawing tools/shapes menu/text.js +0 -25
  83. package/dist/api/drawing tools/shapes menu/text.js.map +0 -1
  84. package/dist/api/drawingUtils.js +0 -83
  85. package/dist/api/drawingUtils.js.map +0 -1
  86. package/dist/core/CanvasLayer.js +0 -56
  87. package/dist/core/CanvasLayer.js.map +0 -1
  88. package/dist/core/Chart.js +0 -839
  89. package/dist/core/Chart.js.map +0 -1
  90. package/dist/core/CoordTransform.js +0 -224
  91. package/dist/core/CoordTransform.js.map +0 -1
  92. package/dist/core/Crosshair.js +0 -186
  93. package/dist/core/Crosshair.js.map +0 -1
  94. package/dist/core/IndicatorEngine.js +0 -181
  95. package/dist/core/IndicatorEngine.js.map +0 -1
  96. package/dist/core/InteractionManager.js +0 -698
  97. package/dist/core/InteractionManager.js.map +0 -1
  98. package/dist/core/PriceScale.js +0 -113
  99. package/dist/core/PriceScale.js.map +0 -1
  100. package/dist/core/Series.js +0 -114
  101. package/dist/core/Series.js.map +0 -1
  102. package/dist/core/TimeScale.js +0 -150
  103. package/dist/core/TimeScale.js.map +0 -1
  104. package/dist/datafeed/DatafeedConnector.js +0 -268
  105. package/dist/datafeed/DatafeedConnector.js.map +0 -1
  106. package/dist/engine/CandleEngine.js +0 -318
  107. package/dist/engine/CandleEngine.js.map +0 -1
  108. package/dist/engine/__tests__/CandleEngine.test.js +0 -300
  109. package/dist/engine/__tests__/CandleEngine.test.js.map +0 -1
  110. package/dist/engine/candleInvariants.js +0 -134
  111. package/dist/engine/candleInvariants.js.map +0 -1
  112. package/dist/engine/mergeUtils.js +0 -64
  113. package/dist/engine/mergeUtils.js.map +0 -1
  114. package/dist/engine/timeframeUtils.js +0 -100
  115. package/dist/engine/timeframeUtils.js.map +0 -1
  116. package/dist/licensing/ChartRuntimeResolver.js +0 -310
  117. package/dist/licensing/ChartRuntimeResolver.js.map +0 -1
  118. package/dist/licensing/LicenseManager.js +0 -114
  119. package/dist/licensing/LicenseManager.js.map +0 -1
  120. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +0 -177
  121. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +0 -1
  122. package/dist/licensing/__tests__/LicenseManager.test.js +0 -153
  123. package/dist/licensing/__tests__/LicenseManager.test.js.map +0 -1
  124. package/dist/licensing/licenseTypes.js +0 -2
  125. package/dist/licensing/licenseTypes.js.map +0 -1
  126. package/dist/pine/PineCompiler.js +0 -44
  127. package/dist/pine/PineCompiler.js.map +0 -1
  128. package/dist/pine/diagnostics.js +0 -11
  129. package/dist/pine/diagnostics.js.map +0 -1
  130. package/dist/pine/index.js +0 -5
  131. package/dist/pine/index.js.map +0 -1
  132. package/dist/pine/pine-ast.js +0 -19
  133. package/dist/pine/pine-ast.js.map +0 -1
  134. package/dist/pine/pine-lexer.js +0 -249
  135. package/dist/pine/pine-lexer.js.map +0 -1
  136. package/dist/pine/pine-parser.js +0 -416
  137. package/dist/pine/pine-parser.js.map +0 -1
  138. package/dist/pine/pine-transpiler.js +0 -260
  139. package/dist/pine/pine-transpiler.js.map +0 -1
  140. package/dist/pixi/LayerName.js +0 -35
  141. package/dist/pixi/LayerName.js.map +0 -1
  142. package/dist/pixi/PixiCandlestickRenderer.js +0 -107
  143. package/dist/pixi/PixiCandlestickRenderer.js.map +0 -1
  144. package/dist/pixi/PixiChart.js +0 -367
  145. package/dist/pixi/PixiChart.js.map +0 -1
  146. package/dist/pixi/PixiCrosshairRenderer.js +0 -110
  147. package/dist/pixi/PixiCrosshairRenderer.js.map +0 -1
  148. package/dist/pixi/PixiDrawingRenderer.js +0 -111
  149. package/dist/pixi/PixiDrawingRenderer.js.map +0 -1
  150. package/dist/pixi/PixiGridRenderer.js +0 -114
  151. package/dist/pixi/PixiGridRenderer.js.map +0 -1
  152. package/dist/pixi/PixiLayerManager.js +0 -92
  153. package/dist/pixi/PixiLayerManager.js.map +0 -1
  154. package/dist/react/canvas/ChartCanvas.js +0 -604
  155. package/dist/react/canvas/ChartCanvas.js.map +0 -1
  156. package/dist/react/canvas/ChartContextMenu.js +0 -5
  157. package/dist/react/canvas/ChartContextMenu.js.map +0 -1
  158. package/dist/react/canvas/ChartSettingsDialog.js +0 -28
  159. package/dist/react/canvas/ChartSettingsDialog.js.map +0 -1
  160. package/dist/react/canvas/IndicatorLabel.js +0 -196
  161. package/dist/react/canvas/IndicatorLabel.js.map +0 -1
  162. package/dist/react/canvas/IndicatorPane.js +0 -395
  163. package/dist/react/canvas/IndicatorPane.js.map +0 -1
  164. package/dist/react/canvas/PointerOverlay.js +0 -61
  165. package/dist/react/canvas/PointerOverlay.js.map +0 -1
  166. package/dist/react/canvas/toolbars/LeftToolbar.js +0 -407
  167. package/dist/react/canvas/toolbars/LeftToolbar.js.map +0 -1
  168. package/dist/react/hooks/useChartCapabilities.js +0 -66
  169. package/dist/react/hooks/useChartCapabilities.js.map +0 -1
  170. package/dist/react/shell/ManagedAppShell.js +0 -440
  171. package/dist/react/shell/ManagedAppShell.js.map +0 -1
  172. package/dist/react/trading/TradingBridge.js +0 -73
  173. package/dist/react/trading/TradingBridge.js.map +0 -1
  174. package/dist/react/workspace/ChartWorkspace.js +0 -42
  175. package/dist/react/workspace/ChartWorkspace.js.map +0 -1
  176. package/dist/react/workspace/FloatingPanel.js +0 -82
  177. package/dist/react/workspace/FloatingPanel.js.map +0 -1
  178. package/dist/react/workspace/IndicatorsDialog.js +0 -121
  179. package/dist/react/workspace/IndicatorsDialog.js.map +0 -1
  180. package/dist/react/workspace/LayoutMenu.js +0 -113
  181. package/dist/react/workspace/LayoutMenu.js.map +0 -1
  182. package/dist/react/workspace/SymbolSearchDialog.js +0 -245
  183. package/dist/react/workspace/SymbolSearchDialog.js.map +0 -1
  184. package/dist/react/workspace/TabBar.js +0 -29
  185. package/dist/react/workspace/TabBar.js.map +0 -1
  186. package/dist/react/workspace/toolbars/BottomToolbar.js +0 -236
  187. package/dist/react/workspace/toolbars/BottomToolbar.js.map +0 -1
  188. package/dist/react/workspace/toolbars/RightToolbar.js +0 -18
  189. package/dist/react/workspace/toolbars/RightToolbar.js.map +0 -1
  190. package/dist/react/workspace/toolbars/TopToolbar.js +0 -82
  191. package/dist/react/workspace/toolbars/TopToolbar.js.map +0 -1
  192. package/dist/renderers/CandlestickRenderer.js +0 -98
  193. package/dist/renderers/CandlestickRenderer.js.map +0 -1
  194. package/dist/renderers/HistogramRenderer.js +0 -50
  195. package/dist/renderers/HistogramRenderer.js.map +0 -1
  196. package/dist/renderers/LineRenderer.js +0 -64
  197. package/dist/renderers/LineRenderer.js.map +0 -1
  198. package/dist/theme/colors.js +0 -19
  199. package/dist/theme/colors.js.map +0 -1
  200. package/dist/tools/barDivergenceCheck.js +0 -200
  201. package/dist/tools/barDivergenceCheck.js.map +0 -1
  202. package/dist/trading/TradingOverlayStore.js +0 -139
  203. package/dist/trading/TradingOverlayStore.js.map +0 -1
  204. package/dist/trading/UnmanagedIngestion.js +0 -114
  205. package/dist/trading/UnmanagedIngestion.js.map +0 -1
  206. package/dist/trading/__tests__/ManagedTradingController.test.js +0 -271
  207. package/dist/trading/__tests__/ManagedTradingController.test.js.map +0 -1
  208. package/dist/trading/__tests__/TradingOverlayStore.test.js +0 -267
  209. package/dist/trading/__tests__/TradingOverlayStore.test.js.map +0 -1
  210. package/dist/trading/__tests__/UnmanagedIngestion.test.js +0 -170
  211. package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +0 -1
  212. package/dist/trading/managed/ManagedTradingController.js +0 -247
  213. package/dist/trading/managed/ManagedTradingController.js.map +0 -1
  214. package/dist/trading/managed/managedCapabilities.js +0 -79
  215. package/dist/trading/managed/managedCapabilities.js.map +0 -1
  216. package/dist/trading/managed/managedTypes.js +0 -13
  217. package/dist/trading/managed/managedTypes.js.map +0 -1
  218. package/dist/trading/tradingTypes.js +0 -8
  219. package/dist/trading/tradingTypes.js.map +0 -1
  220. package/dist/tscript/TScriptIndicator.js +0 -47
  221. package/dist/tscript/TScriptIndicator.js.map +0 -1
  222. package/dist/tscript/ast.js +0 -22
  223. package/dist/tscript/ast.js.map +0 -1
  224. package/dist/tscript/lexer.js +0 -187
  225. package/dist/tscript/lexer.js.map +0 -1
  226. package/dist/tscript/parser.js +0 -318
  227. package/dist/tscript/parser.js.map +0 -1
  228. package/dist/tscript/runtime.js +0 -475
  229. package/dist/tscript/runtime.js.map +0 -1
  230. package/dist/tscript/series.js +0 -79
  231. package/dist/tscript/series.js.map +0 -1
  232. package/dist/types/IChart.js +0 -2
  233. package/dist/types/IChart.js.map +0 -1
  234. package/dist/types/IRenderer.js +0 -2
  235. package/dist/types/IRenderer.js.map +0 -1
  236. package/dist/types/ISeries.js +0 -2
  237. package/dist/types/ISeries.js.map +0 -1
@@ -1,38 +0,0 @@
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
- import { createChart, TChart, DatafeedConnector, TradingOverlayStore, LicenseManager, CandleEngine, ReferenceAPI,
13
- // Capability helpers
14
- getCapabilities, isManagedMode, isUnmanagedMode, } from '@forgecharts/sdk';
15
- // ── Engine internals must NOT be importable from the root path ────────────
16
- // The following would correctly fail to compile if enabled:
17
- // import { Chart } from '@forgecharts/sdk'; // ❌ moved to ./internal
18
- // import { PixiChart } from '@forgecharts/sdk'; // ❌ moved to ./internal
19
- // ── Engine internals ARE importable from the internal path ────────────────
20
- import { Chart, PixiChart, InteractionManager } from '@forgecharts/sdk/internal';
21
- // ── Type assertions ───────────────────────────────────────────────────────
22
- // createChart must be callable and TChart must be exported
23
- void createChart;
24
- void TChart;
25
- // DatafeedConnector, TradingOverlayStore, and capability helpers must be exported
26
- void DatafeedConnector;
27
- void TradingOverlayStore;
28
- void getCapabilities;
29
- // Internal engine: Chart, PixiChart, InteractionManager must still be available
30
- void Chart;
31
- void PixiChart;
32
- void InteractionManager;
33
- void LicenseManager;
34
- void CandleEngine;
35
- void ReferenceAPI;
36
- void isManagedMode;
37
- void isUnmanagedMode;
38
- //# sourceMappingURL=public-api-surface.js.map
@@ -1 +0,0 @@
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"}
@@ -1,452 +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
- 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
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeframeBoundary.test.js","sourceRoot":"","sources":["../../src/__tests__/timeframeBoundary.test.ts"],"names":[],"mappings":"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"}