@metamask-previews/advanced-chart-core 0.0.0-preview-e58fe0640 → 0.0.0-preview-238cb7063

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 (321) hide show
  1. package/dist/core/bootstrap.cjs +185 -0
  2. package/dist/core/bootstrap.cjs.map +1 -0
  3. package/dist/core/bootstrap.d.cts +10 -0
  4. package/dist/core/bootstrap.d.cts.map +1 -0
  5. package/dist/core/bootstrap.d.mts +10 -0
  6. package/dist/core/bootstrap.d.mts.map +1 -0
  7. package/dist/core/bootstrap.mjs +181 -0
  8. package/dist/core/bootstrap.mjs.map +1 -0
  9. package/dist/core/bridge.cjs +115 -0
  10. package/dist/core/bridge.cjs.map +1 -0
  11. package/dist/core/bridge.d.cts +37 -0
  12. package/dist/core/bridge.d.cts.map +1 -0
  13. package/dist/core/bridge.d.mts +37 -0
  14. package/dist/core/bridge.d.mts.map +1 -0
  15. package/dist/core/bridge.mjs +108 -0
  16. package/dist/core/bridge.mjs.map +1 -0
  17. package/dist/core/dataLifecycle.cjs +52 -0
  18. package/dist/core/dataLifecycle.cjs.map +1 -0
  19. package/dist/core/dataLifecycle.d.cts +8 -0
  20. package/dist/core/dataLifecycle.d.cts.map +1 -0
  21. package/dist/core/dataLifecycle.d.mts +8 -0
  22. package/dist/core/dataLifecycle.d.mts.map +1 -0
  23. package/dist/core/dataLifecycle.mjs +46 -0
  24. package/dist/core/dataLifecycle.mjs.map +1 -0
  25. package/dist/core/loadLibrary.cjs +63 -0
  26. package/dist/core/loadLibrary.cjs.map +1 -0
  27. package/dist/core/loadLibrary.d.cts +16 -0
  28. package/dist/core/loadLibrary.d.cts.map +1 -0
  29. package/dist/core/loadLibrary.d.mts +16 -0
  30. package/dist/core/loadLibrary.d.mts.map +1 -0
  31. package/dist/core/loadLibrary.mjs +58 -0
  32. package/dist/core/loadLibrary.mjs.map +1 -0
  33. package/dist/core/resolution.cjs +58 -0
  34. package/dist/core/resolution.cjs.map +1 -0
  35. package/dist/core/resolution.d.cts +15 -0
  36. package/dist/core/resolution.d.cts.map +1 -0
  37. package/dist/core/resolution.d.mts +15 -0
  38. package/dist/core/resolution.d.mts.map +1 -0
  39. package/dist/core/resolution.mjs +54 -0
  40. package/dist/core/resolution.mjs.map +1 -0
  41. package/dist/core/state.cjs +343 -0
  42. package/dist/core/state.cjs.map +1 -0
  43. package/dist/core/state.d.cts +67 -0
  44. package/dist/core/state.d.cts.map +1 -0
  45. package/dist/core/state.d.mts +67 -0
  46. package/dist/core/state.d.mts.map +1 -0
  47. package/dist/core/state.mjs +283 -0
  48. package/dist/core/state.mjs.map +1 -0
  49. package/dist/core/timeUtils.cjs +72 -0
  50. package/dist/core/timeUtils.cjs.map +1 -0
  51. package/dist/core/timeUtils.d.cts +32 -0
  52. package/dist/core/timeUtils.d.cts.map +1 -0
  53. package/dist/core/timeUtils.d.mts +32 -0
  54. package/dist/core/timeUtils.d.mts.map +1 -0
  55. package/dist/core/timeUtils.mjs +66 -0
  56. package/dist/core/timeUtils.mjs.map +1 -0
  57. package/dist/core/timezone.cjs +135 -0
  58. package/dist/core/timezone.cjs.map +1 -0
  59. package/dist/core/timezone.d.cts +16 -0
  60. package/dist/core/timezone.d.cts.map +1 -0
  61. package/dist/core/timezone.d.mts +16 -0
  62. package/dist/core/timezone.d.mts.map +1 -0
  63. package/dist/core/timezone.mjs +131 -0
  64. package/dist/core/timezone.mjs.map +1 -0
  65. package/dist/core/types.cjs +20 -0
  66. package/dist/core/types.cjs.map +1 -0
  67. package/dist/core/types.d.cts +323 -0
  68. package/dist/core/types.d.cts.map +1 -0
  69. package/dist/core/types.d.mts +323 -0
  70. package/dist/core/types.d.mts.map +1 -0
  71. package/dist/core/types.mjs +17 -0
  72. package/dist/core/types.mjs.map +1 -0
  73. package/dist/features/indicators/index.cjs +183 -0
  74. package/dist/features/indicators/index.cjs.map +1 -0
  75. package/dist/features/indicators/index.d.cts +6 -0
  76. package/dist/features/indicators/index.d.cts.map +1 -0
  77. package/dist/features/indicators/index.d.mts +6 -0
  78. package/dist/features/indicators/index.d.mts.map +1 -0
  79. package/dist/features/indicators/index.mjs +177 -0
  80. package/dist/features/indicators/index.mjs.map +1 -0
  81. package/dist/features/indicators/legend.cjs +575 -0
  82. package/dist/features/indicators/legend.cjs.map +1 -0
  83. package/dist/features/indicators/legend.d.cts +40 -0
  84. package/dist/features/indicators/legend.d.cts.map +1 -0
  85. package/dist/features/indicators/legend.d.mts +40 -0
  86. package/dist/features/indicators/legend.d.mts.map +1 -0
  87. package/dist/features/indicators/legend.mjs +564 -0
  88. package/dist/features/indicators/legend.mjs.map +1 -0
  89. package/dist/features/indicators/resize.cjs +34 -0
  90. package/dist/features/indicators/resize.cjs.map +1 -0
  91. package/dist/features/indicators/resize.d.cts +2 -0
  92. package/dist/features/indicators/resize.d.cts.map +1 -0
  93. package/dist/features/indicators/resize.d.mts +2 -0
  94. package/dist/features/indicators/resize.d.mts.map +1 -0
  95. package/dist/features/indicators/resize.mjs +30 -0
  96. package/dist/features/indicators/resize.mjs.map +1 -0
  97. package/dist/features/indicators/studies.cjs +147 -0
  98. package/dist/features/indicators/studies.cjs.map +1 -0
  99. package/dist/features/indicators/studies.d.cts +36 -0
  100. package/dist/features/indicators/studies.d.cts.map +1 -0
  101. package/dist/features/indicators/studies.d.mts +36 -0
  102. package/dist/features/indicators/studies.d.mts.map +1 -0
  103. package/dist/features/indicators/studies.mjs +140 -0
  104. package/dist/features/indicators/studies.mjs.map +1 -0
  105. package/dist/features/indicators/subPane.cjs +78 -0
  106. package/dist/features/indicators/subPane.cjs.map +1 -0
  107. package/dist/features/indicators/subPane.d.cts +6 -0
  108. package/dist/features/indicators/subPane.d.cts.map +1 -0
  109. package/dist/features/indicators/subPane.d.mts +6 -0
  110. package/dist/features/indicators/subPane.d.mts.map +1 -0
  111. package/dist/features/indicators/subPane.mjs +72 -0
  112. package/dist/features/indicators/subPane.mjs.map +1 -0
  113. package/dist/features/volume/index.cjs +145 -0
  114. package/dist/features/volume/index.cjs.map +1 -0
  115. package/dist/features/volume/index.d.cts +4 -0
  116. package/dist/features/volume/index.d.cts.map +1 -0
  117. package/dist/features/volume/index.d.mts +4 -0
  118. package/dist/features/volume/index.d.mts.map +1 -0
  119. package/dist/features/volume/index.mjs +140 -0
  120. package/dist/features/volume/index.mjs.map +1 -0
  121. package/dist/index.cjs +20 -0
  122. package/dist/index.cjs.map +1 -0
  123. package/dist/index.d.cts +2 -0
  124. package/dist/index.d.cts.map +1 -0
  125. package/dist/index.d.mts +2 -0
  126. package/dist/index.d.mts.map +1 -0
  127. package/dist/index.mjs +18 -0
  128. package/dist/index.mjs.map +1 -0
  129. package/dist/interaction/crosshair.cjs +147 -0
  130. package/dist/interaction/crosshair.cjs.map +1 -0
  131. package/dist/interaction/crosshair.d.cts +21 -0
  132. package/dist/interaction/crosshair.d.cts.map +1 -0
  133. package/dist/interaction/crosshair.d.mts +21 -0
  134. package/dist/interaction/crosshair.d.mts.map +1 -0
  135. package/dist/interaction/crosshair.mjs +141 -0
  136. package/dist/interaction/crosshair.mjs.map +1 -0
  137. package/dist/interaction/visibleRange.cjs +102 -0
  138. package/dist/interaction/visibleRange.cjs.map +1 -0
  139. package/dist/interaction/visibleRange.d.cts +11 -0
  140. package/dist/interaction/visibleRange.d.cts.map +1 -0
  141. package/dist/interaction/visibleRange.d.mts +11 -0
  142. package/dist/interaction/visibleRange.d.mts.map +1 -0
  143. package/dist/interaction/visibleRange.mjs +97 -0
  144. package/dist/interaction/visibleRange.mjs.map +1 -0
  145. package/dist/messages/contract.cjs +27 -0
  146. package/dist/messages/contract.cjs.map +1 -0
  147. package/dist/messages/contract.d.cts +262 -0
  148. package/dist/messages/contract.d.cts.map +1 -0
  149. package/dist/messages/contract.d.mts +262 -0
  150. package/dist/messages/contract.d.mts.map +1 -0
  151. package/dist/messages/contract.mjs +26 -0
  152. package/dist/messages/contract.mjs.map +1 -0
  153. package/dist/messages/handler.cjs +54 -0
  154. package/dist/messages/handler.cjs.map +1 -0
  155. package/dist/messages/handler.d.cts +25 -0
  156. package/dist/messages/handler.d.cts.map +1 -0
  157. package/dist/messages/handler.d.mts +25 -0
  158. package/dist/messages/handler.d.mts.map +1 -0
  159. package/dist/messages/handler.mjs +48 -0
  160. package/dist/messages/handler.mjs.map +1 -0
  161. package/dist/overlays/focusTime/index.cjs +161 -0
  162. package/dist/overlays/focusTime/index.cjs.map +1 -0
  163. package/dist/overlays/focusTime/index.d.cts +6 -0
  164. package/dist/overlays/focusTime/index.d.cts.map +1 -0
  165. package/dist/overlays/focusTime/index.d.mts +6 -0
  166. package/dist/overlays/focusTime/index.d.mts.map +1 -0
  167. package/dist/overlays/focusTime/index.mjs +155 -0
  168. package/dist/overlays/focusTime/index.mjs.map +1 -0
  169. package/dist/overlays/positionLines/index.cjs +188 -0
  170. package/dist/overlays/positionLines/index.cjs.map +1 -0
  171. package/dist/overlays/positionLines/index.d.cts +4 -0
  172. package/dist/overlays/positionLines/index.d.cts.map +1 -0
  173. package/dist/overlays/positionLines/index.d.mts +4 -0
  174. package/dist/overlays/positionLines/index.d.mts.map +1 -0
  175. package/dist/overlays/positionLines/index.mjs +183 -0
  176. package/dist/overlays/positionLines/index.mjs.map +1 -0
  177. package/dist/overlays/positionLines/state.cjs +35 -0
  178. package/dist/overlays/positionLines/state.cjs.map +1 -0
  179. package/dist/overlays/positionLines/state.d.cts +8 -0
  180. package/dist/overlays/positionLines/state.d.cts.map +1 -0
  181. package/dist/overlays/positionLines/state.d.mts +8 -0
  182. package/dist/overlays/positionLines/state.d.mts.map +1 -0
  183. package/dist/overlays/positionLines/state.mjs +26 -0
  184. package/dist/overlays/positionLines/state.mjs.map +1 -0
  185. package/dist/overlays/socialLeaderboard/index.cjs +229 -0
  186. package/dist/overlays/socialLeaderboard/index.cjs.map +1 -0
  187. package/dist/overlays/socialLeaderboard/index.d.cts +48 -0
  188. package/dist/overlays/socialLeaderboard/index.d.cts.map +1 -0
  189. package/dist/overlays/socialLeaderboard/index.d.mts +48 -0
  190. package/dist/overlays/socialLeaderboard/index.d.mts.map +1 -0
  191. package/dist/overlays/socialLeaderboard/index.mjs +222 -0
  192. package/dist/overlays/socialLeaderboard/index.mjs.map +1 -0
  193. package/dist/overlays/tradeMarkers/animation.cjs +123 -0
  194. package/dist/overlays/tradeMarkers/animation.cjs.map +1 -0
  195. package/dist/overlays/tradeMarkers/animation.d.cts +5 -0
  196. package/dist/overlays/tradeMarkers/animation.d.cts.map +1 -0
  197. package/dist/overlays/tradeMarkers/animation.d.mts +5 -0
  198. package/dist/overlays/tradeMarkers/animation.d.mts.map +1 -0
  199. package/dist/overlays/tradeMarkers/animation.mjs +118 -0
  200. package/dist/overlays/tradeMarkers/animation.mjs.map +1 -0
  201. package/dist/overlays/tradeMarkers/index.cjs +334 -0
  202. package/dist/overlays/tradeMarkers/index.cjs.map +1 -0
  203. package/dist/overlays/tradeMarkers/index.d.cts +35 -0
  204. package/dist/overlays/tradeMarkers/index.d.cts.map +1 -0
  205. package/dist/overlays/tradeMarkers/index.d.mts +35 -0
  206. package/dist/overlays/tradeMarkers/index.d.mts.map +1 -0
  207. package/dist/overlays/tradeMarkers/index.mjs +324 -0
  208. package/dist/overlays/tradeMarkers/index.mjs.map +1 -0
  209. package/dist/overlays/tradeMarkers/markerHitTest.cjs +337 -0
  210. package/dist/overlays/tradeMarkers/markerHitTest.cjs.map +1 -0
  211. package/dist/overlays/tradeMarkers/markerHitTest.d.cts +15 -0
  212. package/dist/overlays/tradeMarkers/markerHitTest.d.cts.map +1 -0
  213. package/dist/overlays/tradeMarkers/markerHitTest.d.mts +15 -0
  214. package/dist/overlays/tradeMarkers/markerHitTest.d.mts.map +1 -0
  215. package/dist/overlays/tradeMarkers/markerHitTest.mjs +331 -0
  216. package/dist/overlays/tradeMarkers/markerHitTest.mjs.map +1 -0
  217. package/dist/overlays/tradeMarkers/state.cjs +75 -0
  218. package/dist/overlays/tradeMarkers/state.cjs.map +1 -0
  219. package/dist/overlays/tradeMarkers/state.d.cts +20 -0
  220. package/dist/overlays/tradeMarkers/state.d.cts.map +1 -0
  221. package/dist/overlays/tradeMarkers/state.d.mts +20 -0
  222. package/dist/overlays/tradeMarkers/state.d.mts.map +1 -0
  223. package/dist/overlays/tradeMarkers/state.mjs +60 -0
  224. package/dist/overlays/tradeMarkers/state.mjs.map +1 -0
  225. package/dist/pagination/priceApi.cjs +102 -0
  226. package/dist/pagination/priceApi.cjs.map +1 -0
  227. package/dist/pagination/priceApi.d.cts +43 -0
  228. package/dist/pagination/priceApi.d.cts.map +1 -0
  229. package/dist/pagination/priceApi.d.mts +43 -0
  230. package/dist/pagination/priceApi.d.mts.map +1 -0
  231. package/dist/pagination/priceApi.mjs +97 -0
  232. package/dist/pagination/priceApi.mjs.map +1 -0
  233. package/dist/pagination/rnBacked.cjs +108 -0
  234. package/dist/pagination/rnBacked.cjs.map +1 -0
  235. package/dist/pagination/rnBacked.d.cts +15 -0
  236. package/dist/pagination/rnBacked.d.cts.map +1 -0
  237. package/dist/pagination/rnBacked.d.mts +15 -0
  238. package/dist/pagination/rnBacked.d.mts.map +1 -0
  239. package/dist/pagination/rnBacked.mjs +100 -0
  240. package/dist/pagination/rnBacked.mjs.map +1 -0
  241. package/dist/widget/chartType.cjs +39 -0
  242. package/dist/widget/chartType.cjs.map +1 -0
  243. package/dist/widget/chartType.d.cts +4 -0
  244. package/dist/widget/chartType.d.cts.map +1 -0
  245. package/dist/widget/chartType.d.mts +4 -0
  246. package/dist/widget/chartType.d.mts.map +1 -0
  247. package/dist/widget/chartType.mjs +34 -0
  248. package/dist/widget/chartType.mjs.map +1 -0
  249. package/dist/widget/datafeed.cjs +228 -0
  250. package/dist/widget/datafeed.cjs.map +1 -0
  251. package/dist/widget/datafeed.d.cts +22 -0
  252. package/dist/widget/datafeed.d.cts.map +1 -0
  253. package/dist/widget/datafeed.d.mts +22 -0
  254. package/dist/widget/datafeed.d.mts.map +1 -0
  255. package/dist/widget/datafeed.mjs +223 -0
  256. package/dist/widget/datafeed.mjs.map +1 -0
  257. package/dist/widget/externalLinkBridge.cjs +134 -0
  258. package/dist/widget/externalLinkBridge.cjs.map +1 -0
  259. package/dist/widget/externalLinkBridge.d.cts +14 -0
  260. package/dist/widget/externalLinkBridge.d.cts.map +1 -0
  261. package/dist/widget/externalLinkBridge.d.mts +14 -0
  262. package/dist/widget/externalLinkBridge.d.mts.map +1 -0
  263. package/dist/widget/externalLinkBridge.mjs +127 -0
  264. package/dist/widget/externalLinkBridge.mjs.map +1 -0
  265. package/dist/widget/initChart.cjs +242 -0
  266. package/dist/widget/initChart.cjs.map +1 -0
  267. package/dist/widget/initChart.d.cts +53 -0
  268. package/dist/widget/initChart.d.cts.map +1 -0
  269. package/dist/widget/initChart.d.mts +53 -0
  270. package/dist/widget/initChart.d.mts.map +1 -0
  271. package/dist/widget/initChart.mjs +235 -0
  272. package/dist/widget/initChart.mjs.map +1 -0
  273. package/dist/widget/ohlcvIngestion.cjs +240 -0
  274. package/dist/widget/ohlcvIngestion.cjs.map +1 -0
  275. package/dist/widget/ohlcvIngestion.d.cts +16 -0
  276. package/dist/widget/ohlcvIngestion.d.cts.map +1 -0
  277. package/dist/widget/ohlcvIngestion.d.mts +16 -0
  278. package/dist/widget/ohlcvIngestion.d.mts.map +1 -0
  279. package/dist/widget/ohlcvIngestion.mjs +233 -0
  280. package/dist/widget/ohlcvIngestion.mjs.map +1 -0
  281. package/dist/widget/priceFormatter.cjs +142 -0
  282. package/dist/widget/priceFormatter.cjs.map +1 -0
  283. package/dist/widget/priceFormatter.d.cts +38 -0
  284. package/dist/widget/priceFormatter.d.cts.map +1 -0
  285. package/dist/widget/priceFormatter.d.mts +38 -0
  286. package/dist/widget/priceFormatter.d.mts.map +1 -0
  287. package/dist/widget/priceFormatter.mjs +134 -0
  288. package/dist/widget/priceFormatter.mjs.map +1 -0
  289. package/dist/widget/scaleLayout.cjs +89 -0
  290. package/dist/widget/scaleLayout.cjs.map +1 -0
  291. package/dist/widget/scaleLayout.d.cts +9 -0
  292. package/dist/widget/scaleLayout.d.cts.map +1 -0
  293. package/dist/widget/scaleLayout.d.mts +9 -0
  294. package/dist/widget/scaleLayout.d.mts.map +1 -0
  295. package/dist/widget/scaleLayout.mjs +85 -0
  296. package/dist/widget/scaleLayout.mjs.map +1 -0
  297. package/dist/widget/theme.cjs +286 -0
  298. package/dist/widget/theme.cjs.map +1 -0
  299. package/dist/widget/theme.d.cts +99 -0
  300. package/dist/widget/theme.d.cts.map +1 -0
  301. package/dist/widget/theme.d.mts +99 -0
  302. package/dist/widget/theme.d.mts.map +1 -0
  303. package/dist/widget/theme.mjs +270 -0
  304. package/dist/widget/theme.mjs.map +1 -0
  305. package/dist/widget/tvDomHelpers.cjs +65 -0
  306. package/dist/widget/tvDomHelpers.cjs.map +1 -0
  307. package/dist/widget/tvDomHelpers.d.cts +19 -0
  308. package/dist/widget/tvDomHelpers.d.cts.map +1 -0
  309. package/dist/widget/tvDomHelpers.d.mts +19 -0
  310. package/dist/widget/tvDomHelpers.d.mts.map +1 -0
  311. package/dist/widget/tvDomHelpers.mjs +60 -0
  312. package/dist/widget/tvDomHelpers.mjs.map +1 -0
  313. package/dist/widget/visualOverrides.cjs +63 -0
  314. package/dist/widget/visualOverrides.cjs.map +1 -0
  315. package/dist/widget/visualOverrides.d.cts +27 -0
  316. package/dist/widget/visualOverrides.d.cts.map +1 -0
  317. package/dist/widget/visualOverrides.d.mts +27 -0
  318. package/dist/widget/visualOverrides.d.mts.map +1 -0
  319. package/dist/widget/visualOverrides.mjs +58 -0
  320. package/dist/widget/visualOverrides.mjs.map +1 -0
  321. package/package.json +3 -1
@@ -0,0 +1,283 @@
1
+ // Module-local state container for the AdvancedChart WebView.
2
+ //
3
+ // Replaces the legacy `window.chartWidget`, `window.isChartReady`,
4
+ // `window.currentSymbol`, etc. (chartLogic.js lines ~21-60). Module-scoped
5
+ // variables — not window.* globals — so behaviour is testable and ownership
6
+ // is explicit. Future phases extend this with the OHLCV slice, the indicator
7
+ // slice, and so on; the convention is "core state goes here, feature-local
8
+ // state goes in features/<feature>/state.ts or overlays/<feature>/state.ts".
9
+ const emptyPagination = () => ({
10
+ nextCursor: null,
11
+ hasMore: false,
12
+ assetId: null,
13
+ vsCurrency: null,
14
+ });
15
+ const state = {
16
+ widget: null,
17
+ isChartReady: false,
18
+ currentSymbol: 'ASSET',
19
+ currentResolution: '5',
20
+ currentChartType: 2,
21
+ theme: null,
22
+ libraryLoaded: false,
23
+ libraryError: null,
24
+ ohlcvData: [],
25
+ ohlcvGeneration: 0,
26
+ ohlcvPagination: emptyPagination(),
27
+ visibleFromMs: null,
28
+ visibleToMs: null,
29
+ realtimeCallbacks: {},
30
+ activeStudies: new Map(),
31
+ maStudies: new Map(),
32
+ legendStudyOrder: new Map(),
33
+ volumeStudyId: null,
34
+ volumeIsOverlay: null,
35
+ subPaneHeightRatio: null,
36
+ rnBackedPagination: { enabled: false },
37
+ hasExplicitCurrentPriceLine: false,
38
+ hotReloadSeq: 0,
39
+ slbMode: false,
40
+ slbCenteringPending: false,
41
+ legendOwnsLayoutSettle: false,
42
+ };
43
+ // ----- Widget lifecycle ---------------------------------------------------
44
+ export function getWidget() {
45
+ return state.widget;
46
+ }
47
+ export function setWidget(widget) {
48
+ state.widget = widget;
49
+ }
50
+ export function isChartReady() {
51
+ return state.isChartReady;
52
+ }
53
+ export function setChartReady(ready) {
54
+ state.isChartReady = ready;
55
+ }
56
+ // ----- Symbol + resolution ------------------------------------------------
57
+ export function getCurrentSymbol() {
58
+ return state.currentSymbol;
59
+ }
60
+ export function setCurrentSymbol(symbol) {
61
+ state.currentSymbol = symbol;
62
+ }
63
+ export function getCurrentResolution() {
64
+ return state.currentResolution;
65
+ }
66
+ export function setCurrentResolution(resolution) {
67
+ state.currentResolution = resolution;
68
+ }
69
+ // ----- Theme --------------------------------------------------------------
70
+ export function getTheme() {
71
+ return state.theme;
72
+ }
73
+ export function setTheme(theme) {
74
+ state.theme = theme;
75
+ }
76
+ // ----- Library load -------------------------------------------------------
77
+ export function isLibraryLoaded() {
78
+ return state.libraryLoaded;
79
+ }
80
+ export function setLibraryLoaded(loaded) {
81
+ state.libraryLoaded = loaded;
82
+ }
83
+ export function getLibraryError() {
84
+ return state.libraryError;
85
+ }
86
+ export function setLibraryError(error) {
87
+ state.libraryError = error;
88
+ }
89
+ // ----- Chart type --------------------------------------------------------
90
+ export function getCurrentChartType() {
91
+ return state.currentChartType;
92
+ }
93
+ export function setCurrentChartType(type) {
94
+ state.currentChartType = type;
95
+ }
96
+ // ----- OHLCV data --------------------------------------------------------
97
+ export function getOhlcvData() {
98
+ return state.ohlcvData;
99
+ }
100
+ export function setOhlcvData(data) {
101
+ state.ohlcvData = data;
102
+ }
103
+ export function appendOrReplaceLastBar(bar) {
104
+ const data = state.ohlcvData;
105
+ const last = data.at(-1);
106
+ if (data.length > 0 && last?.time === bar.time) {
107
+ data[data.length - 1] = bar;
108
+ }
109
+ else {
110
+ data.push(bar);
111
+ }
112
+ }
113
+ export function prependOhlcvBars(bars) {
114
+ state.ohlcvData = bars.concat(state.ohlcvData);
115
+ }
116
+ export function getOhlcvGeneration() {
117
+ return state.ohlcvGeneration;
118
+ }
119
+ export function bumpOhlcvGeneration() {
120
+ state.ohlcvGeneration += 1;
121
+ return state.ohlcvGeneration;
122
+ }
123
+ export function getOhlcvPagination() {
124
+ return state.ohlcvPagination;
125
+ }
126
+ export function setOhlcvPagination(pagination) {
127
+ state.ohlcvPagination = pagination;
128
+ }
129
+ export function clearOhlcvPagination() {
130
+ state.ohlcvPagination = emptyPagination();
131
+ }
132
+ // ----- Visible range ------------------------------------------------------
133
+ export function getVisibleFromMs() {
134
+ return state.visibleFromMs;
135
+ }
136
+ export function setVisibleFromMs(ms) {
137
+ state.visibleFromMs = ms;
138
+ }
139
+ export function getVisibleToMs() {
140
+ return state.visibleToMs;
141
+ }
142
+ export function setVisibleToMs(ms) {
143
+ state.visibleToMs = ms;
144
+ }
145
+ // ----- Realtime tick subscribers ------------------------------------------
146
+ export function registerRealtimeCallback(listenerGuid, callback) {
147
+ state.realtimeCallbacks[listenerGuid] = callback;
148
+ }
149
+ export function unregisterRealtimeCallback(listenerGuid) {
150
+ delete state.realtimeCallbacks[listenerGuid];
151
+ }
152
+ export function getRealtimeCallbacks() {
153
+ return state.realtimeCallbacks;
154
+ }
155
+ // ----- Indicator studies --------------------------------------------------
156
+ export function getActiveStudies() {
157
+ return state.activeStudies;
158
+ }
159
+ export function getMaStudies() {
160
+ return state.maStudies;
161
+ }
162
+ export function getLegendStudyOrder() {
163
+ return state.legendStudyOrder;
164
+ }
165
+ export function registerStudy(bucket, name, studyId) {
166
+ if (bucket === 'active') {
167
+ state.activeStudies.set(name, studyId);
168
+ }
169
+ else {
170
+ state.maStudies.set(name, studyId);
171
+ }
172
+ state.legendStudyOrder.set(name, studyId);
173
+ }
174
+ export function unregisterStudy(name) {
175
+ const fromActive = state.activeStudies.get(name);
176
+ const fromMA = state.maStudies.get(name);
177
+ state.activeStudies.delete(name);
178
+ state.maStudies.delete(name);
179
+ state.legendStudyOrder.delete(name);
180
+ return fromActive ?? fromMA;
181
+ }
182
+ // ----- Volume study -------------------------------------------------------
183
+ export function getVolumeStudyId() {
184
+ return state.volumeStudyId;
185
+ }
186
+ export function setVolumeStudyId(id) {
187
+ state.volumeStudyId = id;
188
+ if (id) {
189
+ state.legendStudyOrder.set('Volume', id);
190
+ }
191
+ else {
192
+ state.legendStudyOrder.delete('Volume');
193
+ }
194
+ }
195
+ export function getVolumeIsOverlay() {
196
+ return state.volumeIsOverlay;
197
+ }
198
+ export function setVolumeIsOverlay(isOverlay) {
199
+ state.volumeIsOverlay = isOverlay;
200
+ }
201
+ // ----- Sub-pane height ratio ----------------------------------------------
202
+ export function getSubPaneHeightRatio() {
203
+ return state.subPaneHeightRatio;
204
+ }
205
+ export function setSubPaneHeightRatio(ratio) {
206
+ state.subPaneHeightRatio = ratio;
207
+ }
208
+ // ----- RN-backed pagination --------------------------------------------------
209
+ export function getRnBackedPagination() {
210
+ return state.rnBackedPagination;
211
+ }
212
+ export function setRnBackedPagination(config) {
213
+ state.rnBackedPagination = config;
214
+ }
215
+ // ----- Hot-reload sequence guards --------------------------------------------
216
+ export function bumpHotReloadSeq() {
217
+ state.hotReloadSeq += 1;
218
+ return state.hotReloadSeq;
219
+ }
220
+ export function getHotReloadSeq() {
221
+ return state.hotReloadSeq;
222
+ }
223
+ // ----- SLB (Social Leaderboard) mode -----------------------------------------
224
+ export function getSlbMode() {
225
+ return state.slbMode;
226
+ }
227
+ export function setSlbMode(enabled) {
228
+ state.slbMode = enabled;
229
+ }
230
+ export function isSlbCenteringPending() {
231
+ return state.slbCenteringPending;
232
+ }
233
+ export function setSlbCenteringPending(pending) {
234
+ state.slbCenteringPending = pending;
235
+ }
236
+ // ----- Legend owns layout settle ---------------------------------------------
237
+ export function setLegendOwnsLayoutSettle(owns) {
238
+ state.legendOwnsLayoutSettle = owns;
239
+ }
240
+ export function doesLegendOwnLayoutSettle() {
241
+ return state.legendOwnsLayoutSettle;
242
+ }
243
+ // ----- Explicit current price line -------------------------------------------
244
+ export function getHasExplicitCurrentPriceLine() {
245
+ return state.hasExplicitCurrentPriceLine;
246
+ }
247
+ export function setHasExplicitCurrentPriceLine(has) {
248
+ state.hasExplicitCurrentPriceLine = has;
249
+ }
250
+ /**
251
+ * Resets state to defaults — useful for unit tests. NOT for runtime use; the
252
+ * WebView is created fresh per mount (the RN side recreates the HTML when
253
+ * the theme or feature flags change).
254
+ */
255
+ export function _resetStateForTests() {
256
+ state.widget = null;
257
+ state.isChartReady = false;
258
+ state.currentSymbol = 'ASSET';
259
+ state.currentResolution = '5';
260
+ state.currentChartType = 2;
261
+ state.theme = null;
262
+ state.libraryLoaded = false;
263
+ state.libraryError = null;
264
+ state.ohlcvData = [];
265
+ state.ohlcvGeneration = 0;
266
+ state.ohlcvPagination = emptyPagination();
267
+ state.visibleFromMs = null;
268
+ state.visibleToMs = null;
269
+ state.realtimeCallbacks = {};
270
+ state.activeStudies = new Map();
271
+ state.maStudies = new Map();
272
+ state.legendStudyOrder = new Map();
273
+ state.volumeStudyId = null;
274
+ state.volumeIsOverlay = null;
275
+ state.subPaneHeightRatio = null;
276
+ state.rnBackedPagination = { enabled: false };
277
+ state.hasExplicitCurrentPriceLine = false;
278
+ state.hotReloadSeq = 0;
279
+ state.slbMode = false;
280
+ state.slbCenteringPending = false;
281
+ state.legendOwnsLayoutSettle = false;
282
+ }
283
+ //# sourceMappingURL=state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.mjs","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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","sourcesContent":["// Module-local state container for the AdvancedChart WebView.\n//\n// Replaces the legacy `window.chartWidget`, `window.isChartReady`,\n// `window.currentSymbol`, etc. (chartLogic.js lines ~21-60). Module-scoped\n// variables — not window.* globals — so behaviour is testable and ownership\n// is explicit. Future phases extend this with the OHLCV slice, the indicator\n// slice, and so on; the convention is \"core state goes here, feature-local\n// state goes in features/<feature>/state.ts or overlays/<feature>/state.ts\".\n\nimport type {\n ChartTheme,\n ChartType,\n OHLCVBar,\n OHLCVPaginationConfig,\n RealtimeTickCallback,\n StudyId,\n TVChartingLibraryWidget,\n} from './types.js';\n\ntype CoreState = {\n widget: TVChartingLibraryWidget | null;\n isChartReady: boolean;\n currentSymbol: string;\n currentResolution: string;\n currentChartType: ChartType;\n theme: ChartTheme | null;\n libraryLoaded: boolean;\n libraryError: string | null;\n ohlcvData: OHLCVBar[];\n /** Bumped on every SET_OHLCV_DATA; stale async resolutions discard via this token. */\n ohlcvGeneration: number;\n ohlcvPagination: OHLCVPaginationConfig;\n /** Visible-range bounds (ms) for the next setVisibleRange after reset; null = use TV default. */\n visibleFromMs: number | null;\n visibleToMs: number | null;\n /** TradingView subscribeBars listenerGuid → tick callback (forwarded by REALTIME_UPDATE). */\n realtimeCallbacks: Record<string, RealtimeTickCallback>;\n /** Curated indicators (MACD, RSI, BOL, MA200) keyed by indicator name → studyId. */\n activeStudies: Map<string, StudyId>;\n /** MA visibility-driven studies (MA5/10/20/50/200) keyed by name → studyId. */\n maStudies: Map<string, StudyId>;\n /** Insertion order used to render legend pills consistently across renders. */\n legendStudyOrder: Map<string, StudyId>;\n volumeStudyId: StudyId | null;\n /** null when no volume; tracks overlay vs sub-pane for toggle continuity. */\n volumeIsOverlay: boolean | null;\n /** Effective ratio in (0, 1] for sub-pane height; null = TV default. */\n subPaneHeightRatio: number | null;\n /** When enabled, getBars sends FETCH_OLDER_BARS_REQUEST to RN instead of Price API. */\n rnBackedPagination: { enabled: boolean };\n /** True when position lines include a currentPrice line; hides TV's native price line. */\n hasExplicitCurrentPriceLine: boolean;\n /** Sequence counter for setResolution callbacks; stale callbacks bail when mismatched. */\n hotReloadSeq: number;\n /** SLB scoping flag — activates Strategy C (bulk back-fill) pagination. */\n slbMode: boolean;\n /**\n * Set to true when SLB data arrives and the viewport hasn't been\n * centered yet. Cleared after the first successful setVisibleRange\n * so re-centering only happens on a fresh SET_OHLCV_DATA.\n */\n slbCenteringPending: boolean;\n /**\n * When true, the legend module owns the CHART_LAYOUT_SETTLED signal.\n * ohlcvIngestion skips its early 2-rAF-tick emit and lets the legend\n * fire it after the first successful render post-reset.\n */\n legendOwnsLayoutSettle: boolean;\n};\n\nconst emptyPagination = (): OHLCVPaginationConfig => ({\n nextCursor: null,\n hasMore: false,\n assetId: null,\n vsCurrency: null,\n});\n\nconst state: CoreState = {\n widget: null,\n isChartReady: false,\n currentSymbol: 'ASSET',\n currentResolution: '5',\n currentChartType: 2,\n theme: null,\n libraryLoaded: false,\n libraryError: null,\n ohlcvData: [],\n ohlcvGeneration: 0,\n ohlcvPagination: emptyPagination(),\n visibleFromMs: null,\n visibleToMs: null,\n realtimeCallbacks: {},\n activeStudies: new Map(),\n maStudies: new Map(),\n legendStudyOrder: new Map(),\n volumeStudyId: null,\n volumeIsOverlay: null,\n subPaneHeightRatio: null,\n rnBackedPagination: { enabled: false },\n hasExplicitCurrentPriceLine: false,\n hotReloadSeq: 0,\n slbMode: false,\n slbCenteringPending: false,\n legendOwnsLayoutSettle: false,\n};\n\n// ----- Widget lifecycle ---------------------------------------------------\n\nexport function getWidget(): TVChartingLibraryWidget | null {\n return state.widget;\n}\n\nexport function setWidget(widget: TVChartingLibraryWidget | null): void {\n state.widget = widget;\n}\n\nexport function isChartReady(): boolean {\n return state.isChartReady;\n}\n\nexport function setChartReady(ready: boolean): void {\n state.isChartReady = ready;\n}\n\n// ----- Symbol + resolution ------------------------------------------------\n\nexport function getCurrentSymbol(): string {\n return state.currentSymbol;\n}\n\nexport function setCurrentSymbol(symbol: string): void {\n state.currentSymbol = symbol;\n}\n\nexport function getCurrentResolution(): string {\n return state.currentResolution;\n}\n\nexport function setCurrentResolution(resolution: string): void {\n state.currentResolution = resolution;\n}\n\n// ----- Theme --------------------------------------------------------------\n\nexport function getTheme(): ChartTheme | null {\n return state.theme;\n}\n\nexport function setTheme(theme: ChartTheme): void {\n state.theme = theme;\n}\n\n// ----- Library load -------------------------------------------------------\n\nexport function isLibraryLoaded(): boolean {\n return state.libraryLoaded;\n}\n\nexport function setLibraryLoaded(loaded: boolean): void {\n state.libraryLoaded = loaded;\n}\n\nexport function getLibraryError(): string | null {\n return state.libraryError;\n}\n\nexport function setLibraryError(error: string | null): void {\n state.libraryError = error;\n}\n\n// ----- Chart type --------------------------------------------------------\n\nexport function getCurrentChartType(): ChartType {\n return state.currentChartType;\n}\n\nexport function setCurrentChartType(type: ChartType): void {\n state.currentChartType = type;\n}\n\n// ----- OHLCV data --------------------------------------------------------\n\nexport function getOhlcvData(): OHLCVBar[] {\n return state.ohlcvData;\n}\n\nexport function setOhlcvData(data: OHLCVBar[]): void {\n state.ohlcvData = data;\n}\n\nexport function appendOrReplaceLastBar(bar: OHLCVBar): void {\n const data = state.ohlcvData;\n const last = data.at(-1);\n if (data.length > 0 && last?.time === bar.time) {\n data[data.length - 1] = bar;\n } else {\n data.push(bar);\n }\n}\n\nexport function prependOhlcvBars(bars: OHLCVBar[]): void {\n state.ohlcvData = bars.concat(state.ohlcvData);\n}\n\nexport function getOhlcvGeneration(): number {\n return state.ohlcvGeneration;\n}\n\nexport function bumpOhlcvGeneration(): number {\n state.ohlcvGeneration += 1;\n return state.ohlcvGeneration;\n}\n\nexport function getOhlcvPagination(): OHLCVPaginationConfig {\n return state.ohlcvPagination;\n}\n\nexport function setOhlcvPagination(pagination: OHLCVPaginationConfig): void {\n state.ohlcvPagination = pagination;\n}\n\nexport function clearOhlcvPagination(): void {\n state.ohlcvPagination = emptyPagination();\n}\n\n// ----- Visible range ------------------------------------------------------\n\nexport function getVisibleFromMs(): number | null {\n return state.visibleFromMs;\n}\n\nexport function setVisibleFromMs(ms: number | null): void {\n state.visibleFromMs = ms;\n}\n\nexport function getVisibleToMs(): number | null {\n return state.visibleToMs;\n}\n\nexport function setVisibleToMs(ms: number | null): void {\n state.visibleToMs = ms;\n}\n\n// ----- Realtime tick subscribers ------------------------------------------\n\nexport function registerRealtimeCallback(\n listenerGuid: string,\n callback: RealtimeTickCallback,\n): void {\n state.realtimeCallbacks[listenerGuid] = callback;\n}\n\nexport function unregisterRealtimeCallback(listenerGuid: string): void {\n delete state.realtimeCallbacks[listenerGuid];\n}\n\nexport function getRealtimeCallbacks(): Record<string, RealtimeTickCallback> {\n return state.realtimeCallbacks;\n}\n\n// ----- Indicator studies --------------------------------------------------\n\nexport function getActiveStudies(): Map<string, StudyId> {\n return state.activeStudies;\n}\n\nexport function getMaStudies(): Map<string, StudyId> {\n return state.maStudies;\n}\n\nexport function getLegendStudyOrder(): Map<string, StudyId> {\n return state.legendStudyOrder;\n}\n\nexport function registerStudy(\n bucket: 'active' | 'ma',\n name: string,\n studyId: StudyId,\n): void {\n if (bucket === 'active') {\n state.activeStudies.set(name, studyId);\n } else {\n state.maStudies.set(name, studyId);\n }\n state.legendStudyOrder.set(name, studyId);\n}\n\nexport function unregisterStudy(name: string): StudyId | undefined {\n const fromActive = state.activeStudies.get(name);\n const fromMA = state.maStudies.get(name);\n state.activeStudies.delete(name);\n state.maStudies.delete(name);\n state.legendStudyOrder.delete(name);\n return fromActive ?? fromMA;\n}\n\n// ----- Volume study -------------------------------------------------------\n\nexport function getVolumeStudyId(): StudyId | null {\n return state.volumeStudyId;\n}\n\nexport function setVolumeStudyId(id: StudyId | null): void {\n state.volumeStudyId = id;\n if (id) {\n state.legendStudyOrder.set('Volume', id);\n } else {\n state.legendStudyOrder.delete('Volume');\n }\n}\n\nexport function getVolumeIsOverlay(): boolean | null {\n return state.volumeIsOverlay;\n}\n\nexport function setVolumeIsOverlay(isOverlay: boolean | null): void {\n state.volumeIsOverlay = isOverlay;\n}\n\n// ----- Sub-pane height ratio ----------------------------------------------\n\nexport function getSubPaneHeightRatio(): number | null {\n return state.subPaneHeightRatio;\n}\n\nexport function setSubPaneHeightRatio(ratio: number | null): void {\n state.subPaneHeightRatio = ratio;\n}\n\n// ----- RN-backed pagination --------------------------------------------------\n\nexport function getRnBackedPagination(): { enabled: boolean } {\n return state.rnBackedPagination;\n}\n\nexport function setRnBackedPagination(config: { enabled: boolean }): void {\n state.rnBackedPagination = config;\n}\n\n// ----- Hot-reload sequence guards --------------------------------------------\n\nexport function bumpHotReloadSeq(): number {\n state.hotReloadSeq += 1;\n return state.hotReloadSeq;\n}\n\nexport function getHotReloadSeq(): number {\n return state.hotReloadSeq;\n}\n\n// ----- SLB (Social Leaderboard) mode -----------------------------------------\n\nexport function getSlbMode(): boolean {\n return state.slbMode;\n}\n\nexport function setSlbMode(enabled: boolean): void {\n state.slbMode = enabled;\n}\n\nexport function isSlbCenteringPending(): boolean {\n return state.slbCenteringPending;\n}\n\nexport function setSlbCenteringPending(pending: boolean): void {\n state.slbCenteringPending = pending;\n}\n\n// ----- Legend owns layout settle ---------------------------------------------\n\nexport function setLegendOwnsLayoutSettle(owns: boolean): void {\n state.legendOwnsLayoutSettle = owns;\n}\n\nexport function doesLegendOwnLayoutSettle(): boolean {\n return state.legendOwnsLayoutSettle;\n}\n\n// ----- Explicit current price line -------------------------------------------\n\nexport function getHasExplicitCurrentPriceLine(): boolean {\n return state.hasExplicitCurrentPriceLine;\n}\n\nexport function setHasExplicitCurrentPriceLine(has: boolean): void {\n state.hasExplicitCurrentPriceLine = has;\n}\n\n/**\n * Resets state to defaults — useful for unit tests. NOT for runtime use; the\n * WebView is created fresh per mount (the RN side recreates the HTML when\n * the theme or feature flags change).\n */\nexport function _resetStateForTests(): void {\n state.widget = null;\n state.isChartReady = false;\n state.currentSymbol = 'ASSET';\n state.currentResolution = '5';\n state.currentChartType = 2;\n state.theme = null;\n state.libraryLoaded = false;\n state.libraryError = null;\n state.ohlcvData = [];\n state.ohlcvGeneration = 0;\n state.ohlcvPagination = emptyPagination();\n state.visibleFromMs = null;\n state.visibleToMs = null;\n state.realtimeCallbacks = {};\n state.activeStudies = new Map();\n state.maStudies = new Map();\n state.legendStudyOrder = new Map();\n state.volumeStudyId = null;\n state.volumeIsOverlay = null;\n state.subPaneHeightRatio = null;\n state.rnBackedPagination = { enabled: false };\n state.hasExplicitCurrentPriceLine = false;\n state.hotReloadSeq = 0;\n state.slbMode = false;\n state.slbCenteringPending = false;\n state.legendOwnsLayoutSettle = false;\n}\n"]}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ // Time normalization helpers used across modules.
3
+ //
4
+ // Ported from chartLogic.js: normalizeChartUnixSec (line ~3564),
5
+ // chartRawTimeToUnixMs (line ~3573), getApproxBarDurationSec (line ~3587).
6
+ // Phase 2's widget/ohlcvIngestion.ts and pagination/priceApi.ts consume
7
+ // these.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.getApproxBarDurationSec = exports.chartRawTimeToUnixMs = exports.normalizeChartUnixSec = void 0;
10
+ /**
11
+ * Convert a timestamp to unix seconds, accepting either ms or seconds.
12
+ * Values ≥ 1e12 are treated as milliseconds (~Sep 2001 in seconds; safe
13
+ * threshold). Returns null for non-finite input.
14
+ *
15
+ * @param value - A timestamp in seconds or milliseconds.
16
+ * @returns The timestamp in unix seconds, or null when non-finite.
17
+ */
18
+ function normalizeChartUnixSec(value) {
19
+ const numericValue = Number(value);
20
+ if (!Number.isFinite(numericValue)) {
21
+ return null;
22
+ }
23
+ return numericValue >= 1e12
24
+ ? Math.floor(numericValue / 1000)
25
+ : Math.floor(numericValue);
26
+ }
27
+ exports.normalizeChartUnixSec = normalizeChartUnixSec;
28
+ /**
29
+ * Convert a raw TradingView timestamp to unix milliseconds. Unlike
30
+ * normalizeChartUnixSec, keeps sub-second precision when the input is already
31
+ * in seconds (multiplies by 1000 instead of flooring).
32
+ *
33
+ * @param value - A raw TradingView timestamp in seconds or milliseconds.
34
+ * @returns The timestamp in unix milliseconds, or null when non-finite.
35
+ */
36
+ function chartRawTimeToUnixMs(value) {
37
+ const numericValue = Number(value);
38
+ if (!Number.isFinite(numericValue)) {
39
+ return null;
40
+ }
41
+ if (numericValue >= 1e12) {
42
+ return numericValue;
43
+ }
44
+ return numericValue * 1000;
45
+ }
46
+ exports.chartRawTimeToUnixMs = chartRawTimeToUnixMs;
47
+ const DEFAULT_BAR_DURATION_SEC = 300;
48
+ const MIN_BAR_DURATION_SEC = 60;
49
+ /**
50
+ * Approximates the bar duration (seconds) for a series of OHLCV bars by
51
+ * measuring the gap between the last two points. Used for visible-range
52
+ * alignment and end-icon insets.
53
+ *
54
+ * Returns a sensible default when the series is too short.
55
+ *
56
+ * @param bars - The OHLCV bar series to measure.
57
+ * @returns The approximate bar duration in seconds.
58
+ */
59
+ function getApproxBarDurationSec(bars) {
60
+ if (!bars || bars.length < 2) {
61
+ return DEFAULT_BAR_DURATION_SEC;
62
+ }
63
+ const prev = bars.at(-2);
64
+ const last = bars.at(-1);
65
+ if (!prev || !last) {
66
+ return DEFAULT_BAR_DURATION_SEC;
67
+ }
68
+ const lastMs = Math.abs(last.time - prev.time);
69
+ return Math.max(MIN_BAR_DURATION_SEC, Math.round(lastMs / 1000));
70
+ }
71
+ exports.getApproxBarDurationSec = getApproxBarDurationSec;
72
+ //# sourceMappingURL=timeUtils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeUtils.cjs","sourceRoot":"","sources":["../../src/core/timeUtils.ts"],"names":[],"mappings":";AAAA,kDAAkD;AAClD,EAAE;AACF,iEAAiE;AACjE,2EAA2E;AAC3E,wEAAwE;AACxE,SAAS;;;AAET;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CAAC,KAAc;IAClD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,YAAY,IAAI,IAAI;QACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC;AARD,sDAQC;AAED;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAAC,KAAc;IACjD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,YAAY,GAAG,IAAI,CAAC;AAC7B,CAAC;AATD,oDASC;AAED,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC;;;;;;;;;GASG;AACH,SAAgB,uBAAuB,CACrC,IAAiC;IAEjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC;AAbD,0DAaC","sourcesContent":["// Time normalization helpers used across modules.\n//\n// Ported from chartLogic.js: normalizeChartUnixSec (line ~3564),\n// chartRawTimeToUnixMs (line ~3573), getApproxBarDurationSec (line ~3587).\n// Phase 2's widget/ohlcvIngestion.ts and pagination/priceApi.ts consume\n// these.\n\n/**\n * Convert a timestamp to unix seconds, accepting either ms or seconds.\n * Values ≥ 1e12 are treated as milliseconds (~Sep 2001 in seconds; safe\n * threshold). Returns null for non-finite input.\n *\n * @param value - A timestamp in seconds or milliseconds.\n * @returns The timestamp in unix seconds, or null when non-finite.\n */\nexport function normalizeChartUnixSec(value: unknown): number | null {\n const numericValue = Number(value);\n if (!Number.isFinite(numericValue)) {\n return null;\n }\n return numericValue >= 1e12\n ? Math.floor(numericValue / 1000)\n : Math.floor(numericValue);\n}\n\n/**\n * Convert a raw TradingView timestamp to unix milliseconds. Unlike\n * normalizeChartUnixSec, keeps sub-second precision when the input is already\n * in seconds (multiplies by 1000 instead of flooring).\n *\n * @param value - A raw TradingView timestamp in seconds or milliseconds.\n * @returns The timestamp in unix milliseconds, or null when non-finite.\n */\nexport function chartRawTimeToUnixMs(value: unknown): number | null {\n const numericValue = Number(value);\n if (!Number.isFinite(numericValue)) {\n return null;\n }\n if (numericValue >= 1e12) {\n return numericValue;\n }\n return numericValue * 1000;\n}\n\nconst DEFAULT_BAR_DURATION_SEC = 300;\nconst MIN_BAR_DURATION_SEC = 60;\n\n/**\n * Approximates the bar duration (seconds) for a series of OHLCV bars by\n * measuring the gap between the last two points. Used for visible-range\n * alignment and end-icon insets.\n *\n * Returns a sensible default when the series is too short.\n *\n * @param bars - The OHLCV bar series to measure.\n * @returns The approximate bar duration in seconds.\n */\nexport function getApproxBarDurationSec(\n bars: readonly { time: number }[],\n): number {\n if (!bars || bars.length < 2) {\n return DEFAULT_BAR_DURATION_SEC;\n }\n const prev = bars.at(-2);\n const last = bars.at(-1);\n if (!prev || !last) {\n return DEFAULT_BAR_DURATION_SEC;\n }\n const lastMs = Math.abs(last.time - prev.time);\n return Math.max(MIN_BAR_DURATION_SEC, Math.round(lastMs / 1000));\n}\n"]}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Convert a timestamp to unix seconds, accepting either ms or seconds.
3
+ * Values ≥ 1e12 are treated as milliseconds (~Sep 2001 in seconds; safe
4
+ * threshold). Returns null for non-finite input.
5
+ *
6
+ * @param value - A timestamp in seconds or milliseconds.
7
+ * @returns The timestamp in unix seconds, or null when non-finite.
8
+ */
9
+ export declare function normalizeChartUnixSec(value: unknown): number | null;
10
+ /**
11
+ * Convert a raw TradingView timestamp to unix milliseconds. Unlike
12
+ * normalizeChartUnixSec, keeps sub-second precision when the input is already
13
+ * in seconds (multiplies by 1000 instead of flooring).
14
+ *
15
+ * @param value - A raw TradingView timestamp in seconds or milliseconds.
16
+ * @returns The timestamp in unix milliseconds, or null when non-finite.
17
+ */
18
+ export declare function chartRawTimeToUnixMs(value: unknown): number | null;
19
+ /**
20
+ * Approximates the bar duration (seconds) for a series of OHLCV bars by
21
+ * measuring the gap between the last two points. Used for visible-range
22
+ * alignment and end-icon insets.
23
+ *
24
+ * Returns a sensible default when the series is too short.
25
+ *
26
+ * @param bars - The OHLCV bar series to measure.
27
+ * @returns The approximate bar duration in seconds.
28
+ */
29
+ export declare function getApproxBarDurationSec(bars: readonly {
30
+ time: number;
31
+ }[]): number;
32
+ //# sourceMappingURL=timeUtils.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeUtils.d.cts","sourceRoot":"","sources":["../../src/core/timeUtils.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQnE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CASlE;AAKD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAChC,MAAM,CAWR"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Convert a timestamp to unix seconds, accepting either ms or seconds.
3
+ * Values ≥ 1e12 are treated as milliseconds (~Sep 2001 in seconds; safe
4
+ * threshold). Returns null for non-finite input.
5
+ *
6
+ * @param value - A timestamp in seconds or milliseconds.
7
+ * @returns The timestamp in unix seconds, or null when non-finite.
8
+ */
9
+ export declare function normalizeChartUnixSec(value: unknown): number | null;
10
+ /**
11
+ * Convert a raw TradingView timestamp to unix milliseconds. Unlike
12
+ * normalizeChartUnixSec, keeps sub-second precision when the input is already
13
+ * in seconds (multiplies by 1000 instead of flooring).
14
+ *
15
+ * @param value - A raw TradingView timestamp in seconds or milliseconds.
16
+ * @returns The timestamp in unix milliseconds, or null when non-finite.
17
+ */
18
+ export declare function chartRawTimeToUnixMs(value: unknown): number | null;
19
+ /**
20
+ * Approximates the bar duration (seconds) for a series of OHLCV bars by
21
+ * measuring the gap between the last two points. Used for visible-range
22
+ * alignment and end-icon insets.
23
+ *
24
+ * Returns a sensible default when the series is too short.
25
+ *
26
+ * @param bars - The OHLCV bar series to measure.
27
+ * @returns The approximate bar duration in seconds.
28
+ */
29
+ export declare function getApproxBarDurationSec(bars: readonly {
30
+ time: number;
31
+ }[]): number;
32
+ //# sourceMappingURL=timeUtils.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeUtils.d.mts","sourceRoot":"","sources":["../../src/core/timeUtils.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQnE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CASlE;AAKD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAChC,MAAM,CAWR"}
@@ -0,0 +1,66 @@
1
+ // Time normalization helpers used across modules.
2
+ //
3
+ // Ported from chartLogic.js: normalizeChartUnixSec (line ~3564),
4
+ // chartRawTimeToUnixMs (line ~3573), getApproxBarDurationSec (line ~3587).
5
+ // Phase 2's widget/ohlcvIngestion.ts and pagination/priceApi.ts consume
6
+ // these.
7
+ /**
8
+ * Convert a timestamp to unix seconds, accepting either ms or seconds.
9
+ * Values ≥ 1e12 are treated as milliseconds (~Sep 2001 in seconds; safe
10
+ * threshold). Returns null for non-finite input.
11
+ *
12
+ * @param value - A timestamp in seconds or milliseconds.
13
+ * @returns The timestamp in unix seconds, or null when non-finite.
14
+ */
15
+ export function normalizeChartUnixSec(value) {
16
+ const numericValue = Number(value);
17
+ if (!Number.isFinite(numericValue)) {
18
+ return null;
19
+ }
20
+ return numericValue >= 1e12
21
+ ? Math.floor(numericValue / 1000)
22
+ : Math.floor(numericValue);
23
+ }
24
+ /**
25
+ * Convert a raw TradingView timestamp to unix milliseconds. Unlike
26
+ * normalizeChartUnixSec, keeps sub-second precision when the input is already
27
+ * in seconds (multiplies by 1000 instead of flooring).
28
+ *
29
+ * @param value - A raw TradingView timestamp in seconds or milliseconds.
30
+ * @returns The timestamp in unix milliseconds, or null when non-finite.
31
+ */
32
+ export function chartRawTimeToUnixMs(value) {
33
+ const numericValue = Number(value);
34
+ if (!Number.isFinite(numericValue)) {
35
+ return null;
36
+ }
37
+ if (numericValue >= 1e12) {
38
+ return numericValue;
39
+ }
40
+ return numericValue * 1000;
41
+ }
42
+ const DEFAULT_BAR_DURATION_SEC = 300;
43
+ const MIN_BAR_DURATION_SEC = 60;
44
+ /**
45
+ * Approximates the bar duration (seconds) for a series of OHLCV bars by
46
+ * measuring the gap between the last two points. Used for visible-range
47
+ * alignment and end-icon insets.
48
+ *
49
+ * Returns a sensible default when the series is too short.
50
+ *
51
+ * @param bars - The OHLCV bar series to measure.
52
+ * @returns The approximate bar duration in seconds.
53
+ */
54
+ export function getApproxBarDurationSec(bars) {
55
+ if (!bars || bars.length < 2) {
56
+ return DEFAULT_BAR_DURATION_SEC;
57
+ }
58
+ const prev = bars.at(-2);
59
+ const last = bars.at(-1);
60
+ if (!prev || !last) {
61
+ return DEFAULT_BAR_DURATION_SEC;
62
+ }
63
+ const lastMs = Math.abs(last.time - prev.time);
64
+ return Math.max(MIN_BAR_DURATION_SEC, Math.round(lastMs / 1000));
65
+ }
66
+ //# sourceMappingURL=timeUtils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeUtils.mjs","sourceRoot":"","sources":["../../src/core/timeUtils.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,iEAAiE;AACjE,2EAA2E;AAC3E,wEAAwE;AACxE,SAAS;AAET;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,YAAY,IAAI,IAAI;QACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,YAAY,GAAG,IAAI,CAAC;AAC7B,CAAC;AAED,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAiC;IAEjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC","sourcesContent":["// Time normalization helpers used across modules.\n//\n// Ported from chartLogic.js: normalizeChartUnixSec (line ~3564),\n// chartRawTimeToUnixMs (line ~3573), getApproxBarDurationSec (line ~3587).\n// Phase 2's widget/ohlcvIngestion.ts and pagination/priceApi.ts consume\n// these.\n\n/**\n * Convert a timestamp to unix seconds, accepting either ms or seconds.\n * Values ≥ 1e12 are treated as milliseconds (~Sep 2001 in seconds; safe\n * threshold). Returns null for non-finite input.\n *\n * @param value - A timestamp in seconds or milliseconds.\n * @returns The timestamp in unix seconds, or null when non-finite.\n */\nexport function normalizeChartUnixSec(value: unknown): number | null {\n const numericValue = Number(value);\n if (!Number.isFinite(numericValue)) {\n return null;\n }\n return numericValue >= 1e12\n ? Math.floor(numericValue / 1000)\n : Math.floor(numericValue);\n}\n\n/**\n * Convert a raw TradingView timestamp to unix milliseconds. Unlike\n * normalizeChartUnixSec, keeps sub-second precision when the input is already\n * in seconds (multiplies by 1000 instead of flooring).\n *\n * @param value - A raw TradingView timestamp in seconds or milliseconds.\n * @returns The timestamp in unix milliseconds, or null when non-finite.\n */\nexport function chartRawTimeToUnixMs(value: unknown): number | null {\n const numericValue = Number(value);\n if (!Number.isFinite(numericValue)) {\n return null;\n }\n if (numericValue >= 1e12) {\n return numericValue;\n }\n return numericValue * 1000;\n}\n\nconst DEFAULT_BAR_DURATION_SEC = 300;\nconst MIN_BAR_DURATION_SEC = 60;\n\n/**\n * Approximates the bar duration (seconds) for a series of OHLCV bars by\n * measuring the gap between the last two points. Used for visible-range\n * alignment and end-icon insets.\n *\n * Returns a sensible default when the series is too short.\n *\n * @param bars - The OHLCV bar series to measure.\n * @returns The approximate bar duration in seconds.\n */\nexport function getApproxBarDurationSec(\n bars: readonly { time: number }[],\n): number {\n if (!bars || bars.length < 2) {\n return DEFAULT_BAR_DURATION_SEC;\n }\n const prev = bars.at(-2);\n const last = bars.at(-1);\n if (!prev || !last) {\n return DEFAULT_BAR_DURATION_SEC;\n }\n const lastMs = Math.abs(last.time - prev.time);\n return Math.max(MIN_BAR_DURATION_SEC, Math.round(lastMs / 1000));\n}\n"]}