@metamask-previews/advanced-chart-core 0.0.0-preview-e58fe0640 → 0.0.0-preview-6eb51ef1f

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 +1 -1
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ // Entry orchestration. Called once from src/index.ts when the IIFE evaluates
3
+ // inside the WebView.
4
+ //
5
+ // Responsibilities (Phase 1 + 2):
6
+ // 1. Read window.CONFIG (must be inlined by AdvancedChartTemplate before this
7
+ // script runs).
8
+ // 2. Seed core state with the symbol / resolution / theme from CONFIG.
9
+ // 3. Wire the RN→WV bridge to the message dispatcher.
10
+ // 4. Register Phase 1 + 2 message handlers:
11
+ // SET_THEME_COLORS (Phase 1), SET_OHLCV_DATA, REALTIME_UPDATE,
12
+ // SET_CHART_TYPE (Phase 2).
13
+ // 5. Begin loading the TradingView library so it's ready when the first
14
+ // SET_OHLCV_DATA arrives.
15
+ // 6. On first SET_OHLCV_DATA: createChartWidget with the default datafeed,
16
+ // apply visual overrides, attach crosshair + visible-range listeners.
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.bootstrap = void 0;
19
+ const bridge_js_1 = require("./bridge.cjs");
20
+ const loadLibrary_js_1 = require("./loadLibrary.cjs");
21
+ const handler_js_1 = require("../messages/handler.cjs");
22
+ const theme_js_1 = require("../widget/theme.cjs");
23
+ const datafeed_js_1 = require("../widget/datafeed.cjs");
24
+ const priceFormatter_js_1 = require("../widget/priceFormatter.cjs");
25
+ const timeUtils_js_1 = require("./timeUtils.cjs");
26
+ const ohlcvIngestion_js_1 = require("../widget/ohlcvIngestion.cjs");
27
+ const chartType_js_1 = require("../widget/chartType.cjs");
28
+ const visualOverrides_js_1 = require("../widget/visualOverrides.cjs");
29
+ const initChart_js_1 = require("../widget/initChart.cjs");
30
+ const crosshair_js_1 = require("../interaction/crosshair.cjs");
31
+ const visibleRange_js_1 = require("../interaction/visibleRange.cjs");
32
+ const scaleLayout_js_1 = require("../widget/scaleLayout.cjs");
33
+ const index_js_1 = require("../features/indicators/index.cjs");
34
+ const subPane_js_1 = require("../features/indicators/subPane.cjs");
35
+ const legend_js_1 = require("../features/indicators/legend.cjs");
36
+ const index_js_2 = require("../features/volume/index.cjs");
37
+ const index_js_3 = require("../overlays/tradeMarkers/index.cjs");
38
+ const animation_js_1 = require("../overlays/tradeMarkers/animation.cjs");
39
+ const markerHitTest_js_1 = require("../overlays/tradeMarkers/markerHitTest.cjs");
40
+ const index_js_4 = require("../overlays/focusTime/index.cjs");
41
+ const index_js_5 = require("../overlays/positionLines/index.cjs");
42
+ const index_js_6 = require("../overlays/socialLeaderboard/index.cjs");
43
+ const rnBacked_js_1 = require("../pagination/rnBacked.cjs");
44
+ const state_js_1 = require("./state.cjs");
45
+ /**
46
+ * When RN passes an explicit visible-range start (e.g. a specific period like
47
+ * 1D/1W/1M), build a `{ type: 'time-range', from, to }` timeframe so the
48
+ * initial view snaps to that window instead of defaulting to `Date.now()`.
49
+ * Padded by 2 bar durations so the last bar isn't glued to the right edge.
50
+ * Ported from chartLogic.js initChart's `tfOption` computation (~line 5284).
51
+ *
52
+ * @returns A `time-range` timeframe pinned to the requested window, or
53
+ * `undefined` when RN did not pass an explicit visible-range start.
54
+ */
55
+ function buildInitialTimeframe() {
56
+ const visibleFromMs = (0, state_js_1.getVisibleFromMs)();
57
+ if (visibleFromMs === null) {
58
+ return undefined;
59
+ }
60
+ const visibleToMs = (0, state_js_1.getVisibleToMs)() ?? Date.now();
61
+ const initBarPadSec = (0, timeUtils_js_1.getApproxBarDurationSec)((0, state_js_1.getOhlcvData)()) * 2;
62
+ return {
63
+ type: 'time-range',
64
+ from: Math.floor(visibleFromMs / 1000),
65
+ to: Math.ceil(visibleToMs / 1000) + initBarPadSec,
66
+ };
67
+ }
68
+ function readConfig() {
69
+ const config = window.CONFIG;
70
+ if (!config) {
71
+ throw new Error('window.CONFIG is missing — AdvancedChartTemplate must inline ' +
72
+ 'CONFIG before chartLogic runs.');
73
+ }
74
+ return config;
75
+ }
76
+ /**
77
+ * Phase 1 + 2 bootstrap. Returns the resolved CONFIG so callers (and tests)
78
+ * can inspect what booted. Idempotent on its inbound subscription — the
79
+ * WebView is not expected to bootstrap twice.
80
+ *
81
+ * @returns The resolved chart configuration read from `window.CONFIG`.
82
+ */
83
+ function bootstrap() {
84
+ const config = readConfig();
85
+ (0, theme_js_1.initThemeFromConfig)(config.theme);
86
+ if (typeof config.subPaneHeightRatio === 'number') {
87
+ (0, state_js_1.setSubPaneHeightRatio)(config.subPaneHeightRatio);
88
+ }
89
+ (0, handler_js_1.registerHandler)('SET_THEME_COLORS', (payload) => {
90
+ (0, theme_js_1.applyThemeColors)(payload);
91
+ });
92
+ (0, handler_js_1.registerHandler)('SET_OHLCV_DATA', (payload) => {
93
+ (0, ohlcvIngestion_js_1.handleSetOHLCVData)(payload);
94
+ });
95
+ (0, handler_js_1.registerHandler)('REALTIME_UPDATE', (payload) => {
96
+ (0, ohlcvIngestion_js_1.handleRealtimeUpdate)(payload);
97
+ });
98
+ (0, handler_js_1.registerHandler)('SET_CHART_TYPE', (payload) => {
99
+ (0, chartType_js_1.handleSetChartType)(payload);
100
+ });
101
+ (0, handler_js_1.registerHandler)('ADD_INDICATOR', (payload) => {
102
+ (0, index_js_1.handleAddIndicator)(payload, config);
103
+ });
104
+ (0, handler_js_1.registerHandler)('REMOVE_INDICATOR', (payload) => {
105
+ (0, index_js_1.handleRemoveIndicator)(payload);
106
+ });
107
+ (0, handler_js_1.registerHandler)('SET_MA_VISIBILITY', (payload) => {
108
+ (0, index_js_1.handleSetMAVisibility)(payload, config);
109
+ });
110
+ (0, handler_js_1.registerHandler)('TOGGLE_VOLUME', (payload) => {
111
+ (0, index_js_2.handleToggleVolume)(payload);
112
+ });
113
+ (0, handler_js_1.registerHandler)('SET_SUB_PANE_LAYOUT', (payload) => {
114
+ (0, subPane_js_1.handleSetSubPaneLayout)(payload);
115
+ });
116
+ (0, index_js_3.registerTradeMarkerOverlay)();
117
+ (0, animation_js_1.registerTradeMarkerPulseHandler)();
118
+ (0, index_js_4.registerFocusTimeOverlay)();
119
+ (0, index_js_5.registerPositionLinesOverlay)();
120
+ (0, rnBacked_js_1.registerRnBackedPaginationHandler)();
121
+ (0, index_js_2.registerVolumeThemeSync)();
122
+ (0, bridge_js_1.onFromRN)((message) => {
123
+ (0, handler_js_1.dispatchInboundMessage)(message);
124
+ });
125
+ // Library load is fire-and-forget; the first-data handler awaits readiness
126
+ // again before constructing the widget, so this is purely a head-start.
127
+ (0, loadLibrary_js_1.loadTradingViewLibrary)(config.libraryUrl).catch((error) => {
128
+ (0, bridge_js_1.reportErrorToRN)(error);
129
+ });
130
+ (0, ohlcvIngestion_js_1.onFirstOhlcvData)(() => {
131
+ (0, loadLibrary_js_1.loadTradingViewLibrary)(config.libraryUrl)
132
+ .then(() => {
133
+ return (0, initChart_js_1.createChartWidget)(config, {
134
+ datafeed: datafeed_js_1.customDatafeed,
135
+ customFormatters: {
136
+ priceFormatterFactory: priceFormatter_js_1.advancedChartPriceFormatterFactory,
137
+ },
138
+ timeframe: buildInitialTimeframe(),
139
+ onReady: (widget) => {
140
+ try {
141
+ (0, theme_js_1.flushPendingTheme)();
142
+ (0, scaleLayout_js_1.applyScaleLayout)();
143
+ (0, visualOverrides_js_1.applyVisualOverrides)(config.visualOverrides);
144
+ (0, legend_js_1.setupLegendOverlay)(config.legendOverlay);
145
+ const chart = widget.activeChart();
146
+ // Match legacy onChartReady: when no explicit visible range
147
+ // was passed, pin a 2-bar gap on the right. TV's default is
148
+ // wider, leaving the chart visibly offset left.
149
+ if ((0, state_js_1.getVisibleFromMs)() === null) {
150
+ try {
151
+ chart.getTimeScale().setRightOffset(2);
152
+ }
153
+ catch (rightOffsetError) {
154
+ (0, bridge_js_1.reportErrorToRN)(rightOffsetError);
155
+ }
156
+ }
157
+ (0, crosshair_js_1.attachCrosshairListener)(chart);
158
+ (0, crosshair_js_1.attachTapDismiss)(widget);
159
+ (0, markerHitTest_js_1.attachMarkerHitTest)(widget, chart);
160
+ (0, visibleRange_js_1.attachVisibleRangeListeners)(chart);
161
+ chart
162
+ .selection()
163
+ .onChanged()
164
+ .subscribe(null, () => {
165
+ chart.selection().clear();
166
+ });
167
+ (0, legend_js_1.attachLegendResizeListener)(widget);
168
+ (0, index_js_6.slbScheduleInitialCentering)();
169
+ (0, initChart_js_1.scheduleChartLayoutSettledNotify)();
170
+ }
171
+ catch (error) {
172
+ (0, bridge_js_1.reportErrorToRN)(error);
173
+ }
174
+ },
175
+ });
176
+ })
177
+ .catch((error) => {
178
+ (0, bridge_js_1.reportErrorToRN)(error);
179
+ });
180
+ });
181
+ (0, bridge_js_1.postToRN)('DEBUG', { message: 'modular-bootstrap-ready' });
182
+ return config;
183
+ }
184
+ exports.bootstrap = bootstrap;
185
+ //# sourceMappingURL=bootstrap.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.cjs","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["// Entry orchestration. Called once from src/index.ts when the IIFE evaluates\n// inside the WebView.\n//\n// Responsibilities (Phase 1 + 2):\n// 1. Read window.CONFIG (must be inlined by AdvancedChartTemplate before this\n// script runs).\n// 2. Seed core state with the symbol / resolution / theme from CONFIG.\n// 3. Wire the RN→WV bridge to the message dispatcher.\n// 4. Register Phase 1 + 2 message handlers:\n// SET_THEME_COLORS (Phase 1), SET_OHLCV_DATA, REALTIME_UPDATE,\n// SET_CHART_TYPE (Phase 2).\n// 5. Begin loading the TradingView library so it's ready when the first\n// SET_OHLCV_DATA arrives.\n// 6. On first SET_OHLCV_DATA: createChartWidget with the default datafeed,\n// apply visual overrides, attach crosshair + visible-range listeners.\n\nimport { onFromRN, postToRN, reportErrorToRN } from './bridge.js';\nimport { loadTradingViewLibrary } from './loadLibrary.js';\nimport { dispatchInboundMessage, registerHandler } from '../messages/handler.js';\nimport {\n applyThemeColors,\n flushPendingTheme,\n initThemeFromConfig,\n} from '../widget/theme.js';\nimport { customDatafeed } from '../widget/datafeed.js';\nimport { advancedChartPriceFormatterFactory } from '../widget/priceFormatter.js';\nimport { getApproxBarDurationSec } from './timeUtils.js';\nimport {\n handleRealtimeUpdate,\n handleSetOHLCVData,\n onFirstOhlcvData,\n} from '../widget/ohlcvIngestion.js';\nimport { handleSetChartType } from '../widget/chartType.js';\nimport { applyVisualOverrides } from '../widget/visualOverrides.js';\nimport {\n createChartWidget,\n scheduleChartLayoutSettledNotify,\n} from '../widget/initChart.js';\nimport {\n attachCrosshairListener,\n attachTapDismiss,\n} from '../interaction/crosshair.js';\nimport { attachVisibleRangeListeners } from '../interaction/visibleRange.js';\nimport { applyScaleLayout } from '../widget/scaleLayout.js';\nimport {\n handleAddIndicator,\n handleRemoveIndicator,\n handleSetMAVisibility,\n} from '../features/indicators/index.js';\nimport { handleSetSubPaneLayout } from '../features/indicators/subPane.js';\nimport {\n attachLegendResizeListener,\n setupLegendOverlay,\n} from '../features/indicators/legend.js';\nimport {\n handleToggleVolume,\n registerVolumeThemeSync,\n} from '../features/volume/index.js';\nimport { registerTradeMarkerOverlay } from '../overlays/tradeMarkers/index.js';\nimport { registerTradeMarkerPulseHandler } from '../overlays/tradeMarkers/animation.js';\nimport { attachMarkerHitTest } from '../overlays/tradeMarkers/markerHitTest.js';\nimport { registerFocusTimeOverlay } from '../overlays/focusTime/index.js';\nimport { registerPositionLinesOverlay } from '../overlays/positionLines/index.js';\nimport { slbScheduleInitialCentering } from '../overlays/socialLeaderboard/index.js';\nimport { registerRnBackedPaginationHandler } from '../pagination/rnBacked.js';\nimport {\n getOhlcvData,\n getVisibleFromMs,\n getVisibleToMs,\n setSubPaneHeightRatio,\n} from './state.js';\nimport type { ChartConfig } from './types.js';\n\n/**\n * When RN passes an explicit visible-range start (e.g. a specific period like\n * 1D/1W/1M), build a `{ type: 'time-range', from, to }` timeframe so the\n * initial view snaps to that window instead of defaulting to `Date.now()`.\n * Padded by 2 bar durations so the last bar isn't glued to the right edge.\n * Ported from chartLogic.js initChart's `tfOption` computation (~line 5284).\n *\n * @returns A `time-range` timeframe pinned to the requested window, or\n * `undefined` when RN did not pass an explicit visible-range start.\n */\nfunction buildInitialTimeframe():\n | { type: 'time-range'; from: number; to: number }\n | undefined {\n const visibleFromMs = getVisibleFromMs();\n if (visibleFromMs === null) {return undefined;}\n const visibleToMs = getVisibleToMs() ?? Date.now();\n const initBarPadSec = getApproxBarDurationSec(getOhlcvData()) * 2;\n return {\n type: 'time-range',\n from: Math.floor(visibleFromMs / 1000),\n to: Math.ceil(visibleToMs / 1000) + initBarPadSec,\n };\n}\n\nfunction readConfig(): ChartConfig {\n const config = window.CONFIG;\n if (!config) {\n throw new Error(\n 'window.CONFIG is missing — AdvancedChartTemplate must inline ' +\n 'CONFIG before chartLogic runs.',\n );\n }\n return config;\n}\n\n/**\n * Phase 1 + 2 bootstrap. Returns the resolved CONFIG so callers (and tests)\n * can inspect what booted. Idempotent on its inbound subscription — the\n * WebView is not expected to bootstrap twice.\n *\n * @returns The resolved chart configuration read from `window.CONFIG`.\n */\nexport function bootstrap(): ChartConfig {\n const config = readConfig();\n\n initThemeFromConfig(config.theme);\n if (typeof config.subPaneHeightRatio === 'number') {\n setSubPaneHeightRatio(config.subPaneHeightRatio);\n }\n\n registerHandler('SET_THEME_COLORS', (payload) => {\n applyThemeColors(payload);\n });\n registerHandler('SET_OHLCV_DATA', (payload) => {\n handleSetOHLCVData(payload);\n });\n registerHandler('REALTIME_UPDATE', (payload) => {\n handleRealtimeUpdate(payload);\n });\n registerHandler('SET_CHART_TYPE', (payload) => {\n handleSetChartType(payload);\n });\n registerHandler('ADD_INDICATOR', (payload) => {\n handleAddIndicator(payload, config);\n });\n registerHandler('REMOVE_INDICATOR', (payload) => {\n handleRemoveIndicator(payload);\n });\n registerHandler('SET_MA_VISIBILITY', (payload) => {\n handleSetMAVisibility(payload, config);\n });\n registerHandler('TOGGLE_VOLUME', (payload) => {\n handleToggleVolume(payload);\n });\n registerHandler('SET_SUB_PANE_LAYOUT', (payload) => {\n handleSetSubPaneLayout(payload);\n });\n\n registerTradeMarkerOverlay();\n registerTradeMarkerPulseHandler();\n registerFocusTimeOverlay();\n registerPositionLinesOverlay();\n registerRnBackedPaginationHandler();\n registerVolumeThemeSync();\n\n onFromRN((message) => {\n dispatchInboundMessage(message);\n });\n\n // Library load is fire-and-forget; the first-data handler awaits readiness\n // again before constructing the widget, so this is purely a head-start.\n loadTradingViewLibrary(config.libraryUrl).catch((error) => {\n reportErrorToRN(error);\n });\n\n onFirstOhlcvData(() => {\n loadTradingViewLibrary(config.libraryUrl)\n .then(() => {\n return createChartWidget(config, {\n datafeed: customDatafeed,\n customFormatters: {\n priceFormatterFactory: advancedChartPriceFormatterFactory,\n },\n timeframe: buildInitialTimeframe(),\n onReady: (widget) => {\n try {\n flushPendingTheme();\n applyScaleLayout();\n applyVisualOverrides(config.visualOverrides);\n setupLegendOverlay(config.legendOverlay);\n const chart = widget.activeChart();\n // Match legacy onChartReady: when no explicit visible range\n // was passed, pin a 2-bar gap on the right. TV's default is\n // wider, leaving the chart visibly offset left.\n if (getVisibleFromMs() === null) {\n try {\n chart.getTimeScale().setRightOffset(2);\n } catch (rightOffsetError) {\n reportErrorToRN(rightOffsetError);\n }\n }\n attachCrosshairListener(chart);\n attachTapDismiss(widget);\n attachMarkerHitTest(widget, chart);\n attachVisibleRangeListeners(chart);\n chart\n .selection()\n .onChanged()\n .subscribe(null, () => {\n chart.selection().clear();\n });\n attachLegendResizeListener(widget);\n slbScheduleInitialCentering();\n scheduleChartLayoutSettledNotify();\n } catch (error) {\n reportErrorToRN(error);\n }\n },\n });\n })\n .catch((error) => {\n reportErrorToRN(error);\n });\n });\n\n postToRN('DEBUG', { message: 'modular-bootstrap-ready' });\n\n return config;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ChartConfig } from "./types.cjs";
2
+ /**
3
+ * Phase 1 + 2 bootstrap. Returns the resolved CONFIG so callers (and tests)
4
+ * can inspect what booted. Idempotent on its inbound subscription — the
5
+ * WebView is not expected to bootstrap twice.
6
+ *
7
+ * @returns The resolved chart configuration read from `window.CONFIG`.
8
+ */
9
+ export declare function bootstrap(): ChartConfig;
10
+ //# sourceMappingURL=bootstrap.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.cts","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AAuEA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAmB;AAqC9C;;;;;;GAMG;AACH,wBAAgB,SAAS,IAAI,WAAW,CA0GvC"}
@@ -0,0 +1,10 @@
1
+ import type { ChartConfig } from "./types.mjs";
2
+ /**
3
+ * Phase 1 + 2 bootstrap. Returns the resolved CONFIG so callers (and tests)
4
+ * can inspect what booted. Idempotent on its inbound subscription — the
5
+ * WebView is not expected to bootstrap twice.
6
+ *
7
+ * @returns The resolved chart configuration read from `window.CONFIG`.
8
+ */
9
+ export declare function bootstrap(): ChartConfig;
10
+ //# sourceMappingURL=bootstrap.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.mts","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AAuEA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAmB;AAqC9C;;;;;;GAMG;AACH,wBAAgB,SAAS,IAAI,WAAW,CA0GvC"}
@@ -0,0 +1,181 @@
1
+ // Entry orchestration. Called once from src/index.ts when the IIFE evaluates
2
+ // inside the WebView.
3
+ //
4
+ // Responsibilities (Phase 1 + 2):
5
+ // 1. Read window.CONFIG (must be inlined by AdvancedChartTemplate before this
6
+ // script runs).
7
+ // 2. Seed core state with the symbol / resolution / theme from CONFIG.
8
+ // 3. Wire the RN→WV bridge to the message dispatcher.
9
+ // 4. Register Phase 1 + 2 message handlers:
10
+ // SET_THEME_COLORS (Phase 1), SET_OHLCV_DATA, REALTIME_UPDATE,
11
+ // SET_CHART_TYPE (Phase 2).
12
+ // 5. Begin loading the TradingView library so it's ready when the first
13
+ // SET_OHLCV_DATA arrives.
14
+ // 6. On first SET_OHLCV_DATA: createChartWidget with the default datafeed,
15
+ // apply visual overrides, attach crosshair + visible-range listeners.
16
+ import { onFromRN, postToRN, reportErrorToRN } from "./bridge.mjs";
17
+ import { loadTradingViewLibrary } from "./loadLibrary.mjs";
18
+ import { dispatchInboundMessage, registerHandler } from "../messages/handler.mjs";
19
+ import { applyThemeColors, flushPendingTheme, initThemeFromConfig } from "../widget/theme.mjs";
20
+ import { customDatafeed } from "../widget/datafeed.mjs";
21
+ import { advancedChartPriceFormatterFactory } from "../widget/priceFormatter.mjs";
22
+ import { getApproxBarDurationSec } from "./timeUtils.mjs";
23
+ import { handleRealtimeUpdate, handleSetOHLCVData, onFirstOhlcvData } from "../widget/ohlcvIngestion.mjs";
24
+ import { handleSetChartType } from "../widget/chartType.mjs";
25
+ import { applyVisualOverrides } from "../widget/visualOverrides.mjs";
26
+ import { createChartWidget, scheduleChartLayoutSettledNotify } from "../widget/initChart.mjs";
27
+ import { attachCrosshairListener, attachTapDismiss } from "../interaction/crosshair.mjs";
28
+ import { attachVisibleRangeListeners } from "../interaction/visibleRange.mjs";
29
+ import { applyScaleLayout } from "../widget/scaleLayout.mjs";
30
+ import { handleAddIndicator, handleRemoveIndicator, handleSetMAVisibility } from "../features/indicators/index.mjs";
31
+ import { handleSetSubPaneLayout } from "../features/indicators/subPane.mjs";
32
+ import { attachLegendResizeListener, setupLegendOverlay } from "../features/indicators/legend.mjs";
33
+ import { handleToggleVolume, registerVolumeThemeSync } from "../features/volume/index.mjs";
34
+ import { registerTradeMarkerOverlay } from "../overlays/tradeMarkers/index.mjs";
35
+ import { registerTradeMarkerPulseHandler } from "../overlays/tradeMarkers/animation.mjs";
36
+ import { attachMarkerHitTest } from "../overlays/tradeMarkers/markerHitTest.mjs";
37
+ import { registerFocusTimeOverlay } from "../overlays/focusTime/index.mjs";
38
+ import { registerPositionLinesOverlay } from "../overlays/positionLines/index.mjs";
39
+ import { slbScheduleInitialCentering } from "../overlays/socialLeaderboard/index.mjs";
40
+ import { registerRnBackedPaginationHandler } from "../pagination/rnBacked.mjs";
41
+ import { getOhlcvData, getVisibleFromMs, getVisibleToMs, setSubPaneHeightRatio } from "./state.mjs";
42
+ /**
43
+ * When RN passes an explicit visible-range start (e.g. a specific period like
44
+ * 1D/1W/1M), build a `{ type: 'time-range', from, to }` timeframe so the
45
+ * initial view snaps to that window instead of defaulting to `Date.now()`.
46
+ * Padded by 2 bar durations so the last bar isn't glued to the right edge.
47
+ * Ported from chartLogic.js initChart's `tfOption` computation (~line 5284).
48
+ *
49
+ * @returns A `time-range` timeframe pinned to the requested window, or
50
+ * `undefined` when RN did not pass an explicit visible-range start.
51
+ */
52
+ function buildInitialTimeframe() {
53
+ const visibleFromMs = getVisibleFromMs();
54
+ if (visibleFromMs === null) {
55
+ return undefined;
56
+ }
57
+ const visibleToMs = getVisibleToMs() ?? Date.now();
58
+ const initBarPadSec = getApproxBarDurationSec(getOhlcvData()) * 2;
59
+ return {
60
+ type: 'time-range',
61
+ from: Math.floor(visibleFromMs / 1000),
62
+ to: Math.ceil(visibleToMs / 1000) + initBarPadSec,
63
+ };
64
+ }
65
+ function readConfig() {
66
+ const config = window.CONFIG;
67
+ if (!config) {
68
+ throw new Error('window.CONFIG is missing — AdvancedChartTemplate must inline ' +
69
+ 'CONFIG before chartLogic runs.');
70
+ }
71
+ return config;
72
+ }
73
+ /**
74
+ * Phase 1 + 2 bootstrap. Returns the resolved CONFIG so callers (and tests)
75
+ * can inspect what booted. Idempotent on its inbound subscription — the
76
+ * WebView is not expected to bootstrap twice.
77
+ *
78
+ * @returns The resolved chart configuration read from `window.CONFIG`.
79
+ */
80
+ export function bootstrap() {
81
+ const config = readConfig();
82
+ initThemeFromConfig(config.theme);
83
+ if (typeof config.subPaneHeightRatio === 'number') {
84
+ setSubPaneHeightRatio(config.subPaneHeightRatio);
85
+ }
86
+ registerHandler('SET_THEME_COLORS', (payload) => {
87
+ applyThemeColors(payload);
88
+ });
89
+ registerHandler('SET_OHLCV_DATA', (payload) => {
90
+ handleSetOHLCVData(payload);
91
+ });
92
+ registerHandler('REALTIME_UPDATE', (payload) => {
93
+ handleRealtimeUpdate(payload);
94
+ });
95
+ registerHandler('SET_CHART_TYPE', (payload) => {
96
+ handleSetChartType(payload);
97
+ });
98
+ registerHandler('ADD_INDICATOR', (payload) => {
99
+ handleAddIndicator(payload, config);
100
+ });
101
+ registerHandler('REMOVE_INDICATOR', (payload) => {
102
+ handleRemoveIndicator(payload);
103
+ });
104
+ registerHandler('SET_MA_VISIBILITY', (payload) => {
105
+ handleSetMAVisibility(payload, config);
106
+ });
107
+ registerHandler('TOGGLE_VOLUME', (payload) => {
108
+ handleToggleVolume(payload);
109
+ });
110
+ registerHandler('SET_SUB_PANE_LAYOUT', (payload) => {
111
+ handleSetSubPaneLayout(payload);
112
+ });
113
+ registerTradeMarkerOverlay();
114
+ registerTradeMarkerPulseHandler();
115
+ registerFocusTimeOverlay();
116
+ registerPositionLinesOverlay();
117
+ registerRnBackedPaginationHandler();
118
+ registerVolumeThemeSync();
119
+ onFromRN((message) => {
120
+ dispatchInboundMessage(message);
121
+ });
122
+ // Library load is fire-and-forget; the first-data handler awaits readiness
123
+ // again before constructing the widget, so this is purely a head-start.
124
+ loadTradingViewLibrary(config.libraryUrl).catch((error) => {
125
+ reportErrorToRN(error);
126
+ });
127
+ onFirstOhlcvData(() => {
128
+ loadTradingViewLibrary(config.libraryUrl)
129
+ .then(() => {
130
+ return createChartWidget(config, {
131
+ datafeed: customDatafeed,
132
+ customFormatters: {
133
+ priceFormatterFactory: advancedChartPriceFormatterFactory,
134
+ },
135
+ timeframe: buildInitialTimeframe(),
136
+ onReady: (widget) => {
137
+ try {
138
+ flushPendingTheme();
139
+ applyScaleLayout();
140
+ applyVisualOverrides(config.visualOverrides);
141
+ setupLegendOverlay(config.legendOverlay);
142
+ const chart = widget.activeChart();
143
+ // Match legacy onChartReady: when no explicit visible range
144
+ // was passed, pin a 2-bar gap on the right. TV's default is
145
+ // wider, leaving the chart visibly offset left.
146
+ if (getVisibleFromMs() === null) {
147
+ try {
148
+ chart.getTimeScale().setRightOffset(2);
149
+ }
150
+ catch (rightOffsetError) {
151
+ reportErrorToRN(rightOffsetError);
152
+ }
153
+ }
154
+ attachCrosshairListener(chart);
155
+ attachTapDismiss(widget);
156
+ attachMarkerHitTest(widget, chart);
157
+ attachVisibleRangeListeners(chart);
158
+ chart
159
+ .selection()
160
+ .onChanged()
161
+ .subscribe(null, () => {
162
+ chart.selection().clear();
163
+ });
164
+ attachLegendResizeListener(widget);
165
+ slbScheduleInitialCentering();
166
+ scheduleChartLayoutSettledNotify();
167
+ }
168
+ catch (error) {
169
+ reportErrorToRN(error);
170
+ }
171
+ },
172
+ });
173
+ })
174
+ .catch((error) => {
175
+ reportErrorToRN(error);
176
+ });
177
+ });
178
+ postToRN('DEBUG', { message: 'modular-bootstrap-ready' });
179
+ return config;
180
+ }
181
+ //# sourceMappingURL=bootstrap.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.mjs","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["// Entry orchestration. Called once from src/index.ts when the IIFE evaluates\n// inside the WebView.\n//\n// Responsibilities (Phase 1 + 2):\n// 1. Read window.CONFIG (must be inlined by AdvancedChartTemplate before this\n// script runs).\n// 2. Seed core state with the symbol / resolution / theme from CONFIG.\n// 3. Wire the RN→WV bridge to the message dispatcher.\n// 4. Register Phase 1 + 2 message handlers:\n// SET_THEME_COLORS (Phase 1), SET_OHLCV_DATA, REALTIME_UPDATE,\n// SET_CHART_TYPE (Phase 2).\n// 5. Begin loading the TradingView library so it's ready when the first\n// SET_OHLCV_DATA arrives.\n// 6. On first SET_OHLCV_DATA: createChartWidget with the default datafeed,\n// apply visual overrides, attach crosshair + visible-range listeners.\n\nimport { onFromRN, postToRN, reportErrorToRN } from './bridge.js';\nimport { loadTradingViewLibrary } from './loadLibrary.js';\nimport { dispatchInboundMessage, registerHandler } from '../messages/handler.js';\nimport {\n applyThemeColors,\n flushPendingTheme,\n initThemeFromConfig,\n} from '../widget/theme.js';\nimport { customDatafeed } from '../widget/datafeed.js';\nimport { advancedChartPriceFormatterFactory } from '../widget/priceFormatter.js';\nimport { getApproxBarDurationSec } from './timeUtils.js';\nimport {\n handleRealtimeUpdate,\n handleSetOHLCVData,\n onFirstOhlcvData,\n} from '../widget/ohlcvIngestion.js';\nimport { handleSetChartType } from '../widget/chartType.js';\nimport { applyVisualOverrides } from '../widget/visualOverrides.js';\nimport {\n createChartWidget,\n scheduleChartLayoutSettledNotify,\n} from '../widget/initChart.js';\nimport {\n attachCrosshairListener,\n attachTapDismiss,\n} from '../interaction/crosshair.js';\nimport { attachVisibleRangeListeners } from '../interaction/visibleRange.js';\nimport { applyScaleLayout } from '../widget/scaleLayout.js';\nimport {\n handleAddIndicator,\n handleRemoveIndicator,\n handleSetMAVisibility,\n} from '../features/indicators/index.js';\nimport { handleSetSubPaneLayout } from '../features/indicators/subPane.js';\nimport {\n attachLegendResizeListener,\n setupLegendOverlay,\n} from '../features/indicators/legend.js';\nimport {\n handleToggleVolume,\n registerVolumeThemeSync,\n} from '../features/volume/index.js';\nimport { registerTradeMarkerOverlay } from '../overlays/tradeMarkers/index.js';\nimport { registerTradeMarkerPulseHandler } from '../overlays/tradeMarkers/animation.js';\nimport { attachMarkerHitTest } from '../overlays/tradeMarkers/markerHitTest.js';\nimport { registerFocusTimeOverlay } from '../overlays/focusTime/index.js';\nimport { registerPositionLinesOverlay } from '../overlays/positionLines/index.js';\nimport { slbScheduleInitialCentering } from '../overlays/socialLeaderboard/index.js';\nimport { registerRnBackedPaginationHandler } from '../pagination/rnBacked.js';\nimport {\n getOhlcvData,\n getVisibleFromMs,\n getVisibleToMs,\n setSubPaneHeightRatio,\n} from './state.js';\nimport type { ChartConfig } from './types.js';\n\n/**\n * When RN passes an explicit visible-range start (e.g. a specific period like\n * 1D/1W/1M), build a `{ type: 'time-range', from, to }` timeframe so the\n * initial view snaps to that window instead of defaulting to `Date.now()`.\n * Padded by 2 bar durations so the last bar isn't glued to the right edge.\n * Ported from chartLogic.js initChart's `tfOption` computation (~line 5284).\n *\n * @returns A `time-range` timeframe pinned to the requested window, or\n * `undefined` when RN did not pass an explicit visible-range start.\n */\nfunction buildInitialTimeframe():\n | { type: 'time-range'; from: number; to: number }\n | undefined {\n const visibleFromMs = getVisibleFromMs();\n if (visibleFromMs === null) {return undefined;}\n const visibleToMs = getVisibleToMs() ?? Date.now();\n const initBarPadSec = getApproxBarDurationSec(getOhlcvData()) * 2;\n return {\n type: 'time-range',\n from: Math.floor(visibleFromMs / 1000),\n to: Math.ceil(visibleToMs / 1000) + initBarPadSec,\n };\n}\n\nfunction readConfig(): ChartConfig {\n const config = window.CONFIG;\n if (!config) {\n throw new Error(\n 'window.CONFIG is missing — AdvancedChartTemplate must inline ' +\n 'CONFIG before chartLogic runs.',\n );\n }\n return config;\n}\n\n/**\n * Phase 1 + 2 bootstrap. Returns the resolved CONFIG so callers (and tests)\n * can inspect what booted. Idempotent on its inbound subscription — the\n * WebView is not expected to bootstrap twice.\n *\n * @returns The resolved chart configuration read from `window.CONFIG`.\n */\nexport function bootstrap(): ChartConfig {\n const config = readConfig();\n\n initThemeFromConfig(config.theme);\n if (typeof config.subPaneHeightRatio === 'number') {\n setSubPaneHeightRatio(config.subPaneHeightRatio);\n }\n\n registerHandler('SET_THEME_COLORS', (payload) => {\n applyThemeColors(payload);\n });\n registerHandler('SET_OHLCV_DATA', (payload) => {\n handleSetOHLCVData(payload);\n });\n registerHandler('REALTIME_UPDATE', (payload) => {\n handleRealtimeUpdate(payload);\n });\n registerHandler('SET_CHART_TYPE', (payload) => {\n handleSetChartType(payload);\n });\n registerHandler('ADD_INDICATOR', (payload) => {\n handleAddIndicator(payload, config);\n });\n registerHandler('REMOVE_INDICATOR', (payload) => {\n handleRemoveIndicator(payload);\n });\n registerHandler('SET_MA_VISIBILITY', (payload) => {\n handleSetMAVisibility(payload, config);\n });\n registerHandler('TOGGLE_VOLUME', (payload) => {\n handleToggleVolume(payload);\n });\n registerHandler('SET_SUB_PANE_LAYOUT', (payload) => {\n handleSetSubPaneLayout(payload);\n });\n\n registerTradeMarkerOverlay();\n registerTradeMarkerPulseHandler();\n registerFocusTimeOverlay();\n registerPositionLinesOverlay();\n registerRnBackedPaginationHandler();\n registerVolumeThemeSync();\n\n onFromRN((message) => {\n dispatchInboundMessage(message);\n });\n\n // Library load is fire-and-forget; the first-data handler awaits readiness\n // again before constructing the widget, so this is purely a head-start.\n loadTradingViewLibrary(config.libraryUrl).catch((error) => {\n reportErrorToRN(error);\n });\n\n onFirstOhlcvData(() => {\n loadTradingViewLibrary(config.libraryUrl)\n .then(() => {\n return createChartWidget(config, {\n datafeed: customDatafeed,\n customFormatters: {\n priceFormatterFactory: advancedChartPriceFormatterFactory,\n },\n timeframe: buildInitialTimeframe(),\n onReady: (widget) => {\n try {\n flushPendingTheme();\n applyScaleLayout();\n applyVisualOverrides(config.visualOverrides);\n setupLegendOverlay(config.legendOverlay);\n const chart = widget.activeChart();\n // Match legacy onChartReady: when no explicit visible range\n // was passed, pin a 2-bar gap on the right. TV's default is\n // wider, leaving the chart visibly offset left.\n if (getVisibleFromMs() === null) {\n try {\n chart.getTimeScale().setRightOffset(2);\n } catch (rightOffsetError) {\n reportErrorToRN(rightOffsetError);\n }\n }\n attachCrosshairListener(chart);\n attachTapDismiss(widget);\n attachMarkerHitTest(widget, chart);\n attachVisibleRangeListeners(chart);\n chart\n .selection()\n .onChanged()\n .subscribe(null, () => {\n chart.selection().clear();\n });\n attachLegendResizeListener(widget);\n slbScheduleInitialCentering();\n scheduleChartLayoutSettledNotify();\n } catch (error) {\n reportErrorToRN(error);\n }\n },\n });\n })\n .catch((error) => {\n reportErrorToRN(error);\n });\n });\n\n postToRN('DEBUG', { message: 'modular-bootstrap-ready' });\n\n return config;\n}\n"]}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ // Typed bridge between the WebView IIFE and React Native.
3
+ //
4
+ // Wraps the same window.ReactNativeWebView.postMessage(...) call shape that
5
+ // legacy chartLogic.js's sendToReactNative() uses, so the RN-side
6
+ // parseWebViewMessage in AdvancedChart.types.ts decodes our messages without
7
+ // any change to its consumers.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.onFromRN = exports.reportErrorToRN = exports.postToRN = exports.safeStringify = void 0;
10
+ function safeStringify(value) {
11
+ try {
12
+ return JSON.stringify(value) ?? 'Unknown error';
13
+ }
14
+ catch {
15
+ return String(value);
16
+ }
17
+ }
18
+ exports.safeStringify = safeStringify;
19
+ /**
20
+ * Posts a typed message to React Native via window.ReactNativeWebView.
21
+ * Equivalent to legacy `sendToReactNative(type, payload)` at chartLogic.js
22
+ * line ~98. Silently no-ops when window.ReactNativeWebView is absent (e.g.
23
+ * during unit tests in a jsdom environment without the RN bridge stub).
24
+ *
25
+ * @param type - The outbound message type tag.
26
+ * @param payload - The payload associated with the message type.
27
+ */
28
+ function postToRN(type, payload) {
29
+ const bridge = window.ReactNativeWebView;
30
+ if (!bridge) {
31
+ return;
32
+ }
33
+ try {
34
+ bridge.postMessage(JSON.stringify({ type, payload }));
35
+ }
36
+ catch {
37
+ // postMessage / JSON.stringify failure: nothing to do — the WebView
38
+ // cannot inform RN of its own bridge failure.
39
+ }
40
+ }
41
+ exports.postToRN = postToRN;
42
+ /**
43
+ * Reports a runtime error to React Native via the ERROR channel. Matches the
44
+ * legacy `sendToReactNative('ERROR', { message })` pattern used throughout
45
+ * chartLogic.js.
46
+ *
47
+ * @param error - The error (or arbitrary thrown value) to report.
48
+ */
49
+ function reportErrorToRN(error) {
50
+ let message;
51
+ if (error instanceof Error) {
52
+ message = error.message;
53
+ }
54
+ else if (typeof error === 'string') {
55
+ message = error;
56
+ }
57
+ else {
58
+ message = safeStringify(error);
59
+ }
60
+ postToRN('ERROR', { message });
61
+ }
62
+ exports.reportErrorToRN = reportErrorToRN;
63
+ /**
64
+ * Registers a single inbound listener. React Native posts JSON strings via
65
+ * webView.postMessage; the WebView receives them on window 'message' on iOS
66
+ * and document 'message' on Android (see chartLogic.js line ~400). We
67
+ * subscribe to both so consumers don't have to.
68
+ *
69
+ * The returned function unsubscribes — useful for tests; the real bundle
70
+ * subscribes once at bootstrap and never unsubscribes.
71
+ *
72
+ * @param handler - Callback invoked with each well-formed inbound message.
73
+ * @returns A function that removes the registered listeners.
74
+ */
75
+ function onFromRN(handler) {
76
+ const dispatch = (event) => {
77
+ // RN WebView inline HTML: native bridge messages arrive with an empty
78
+ // or "null" origin. Reject messages from real web origins.
79
+ const { origin } = event;
80
+ if (origin && origin !== 'null' && !origin.startsWith('file:')) {
81
+ return;
82
+ }
83
+ let parsed;
84
+ try {
85
+ parsed =
86
+ typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
87
+ }
88
+ catch (parseError) {
89
+ reportErrorToRN(parseError);
90
+ return;
91
+ }
92
+ if (!parsed || typeof parsed !== 'object') {
93
+ return;
94
+ }
95
+ const candidate = parsed;
96
+ if (typeof candidate.type !== 'string') {
97
+ return;
98
+ }
99
+ // Trusting the type narrowing here is fine because messages/handler.ts
100
+ // re-validates via a switch on candidate.type before dispatching to a
101
+ // typed handler. Phase 1 only routes SET_THEME_COLORS, but the listener
102
+ // forwards every well-formed message so the handler can decide.
103
+ handler(parsed);
104
+ };
105
+ // iOS posts arrive on window; Android posts arrive on document. Subscribe
106
+ // to both to match legacy chartLogic.js handleMessage wiring.
107
+ window.addEventListener('message', dispatch);
108
+ document.addEventListener('message', dispatch);
109
+ return () => {
110
+ window.removeEventListener('message', dispatch);
111
+ document.removeEventListener('message', dispatch);
112
+ };
113
+ }
114
+ exports.onFromRN = onFromRN;
115
+ //# sourceMappingURL=bridge.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.cjs","sourceRoot":"","sources":["../../src/core/bridge.ts"],"names":[],"mappings":"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","sourcesContent":["// Typed bridge between the WebView IIFE and React Native.\n//\n// Wraps the same window.ReactNativeWebView.postMessage(...) call shape that\n// legacy chartLogic.js's sendToReactNative() uses, so the RN-side\n// parseWebViewMessage in AdvancedChart.types.ts decodes our messages without\n// any change to its consumers.\n\nimport type {\n InboundMessage,\n OutboundMessageType,\n OutboundPayloads,\n} from '../messages/contract.js';\n\nexport function safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? 'Unknown error';\n } catch {\n return String(value);\n }\n}\n\n/**\n * Posts a typed message to React Native via window.ReactNativeWebView.\n * Equivalent to legacy `sendToReactNative(type, payload)` at chartLogic.js\n * line ~98. Silently no-ops when window.ReactNativeWebView is absent (e.g.\n * during unit tests in a jsdom environment without the RN bridge stub).\n *\n * @param type - The outbound message type tag.\n * @param payload - The payload associated with the message type.\n */\nexport function postToRN<Type extends OutboundMessageType>(\n type: Type,\n payload: OutboundPayloads[Type],\n): void {\n const bridge = window.ReactNativeWebView;\n if (!bridge) {\n return;\n }\n try {\n bridge.postMessage(JSON.stringify({ type, payload }));\n } catch {\n // postMessage / JSON.stringify failure: nothing to do — the WebView\n // cannot inform RN of its own bridge failure.\n }\n}\n\n/**\n * Reports a runtime error to React Native via the ERROR channel. Matches the\n * legacy `sendToReactNative('ERROR', { message })` pattern used throughout\n * chartLogic.js.\n *\n * @param error - The error (or arbitrary thrown value) to report.\n */\nexport function reportErrorToRN(error: unknown): void {\n let message: string;\n if (error instanceof Error) {\n message = error.message;\n } else if (typeof error === 'string') {\n message = error;\n } else {\n message = safeStringify(error);\n }\n postToRN('ERROR', { message });\n}\n\nexport type InboundMessageHandler = (message: InboundMessage) => void;\n\n/**\n * Registers a single inbound listener. React Native posts JSON strings via\n * webView.postMessage; the WebView receives them on window 'message' on iOS\n * and document 'message' on Android (see chartLogic.js line ~400). We\n * subscribe to both so consumers don't have to.\n *\n * The returned function unsubscribes — useful for tests; the real bundle\n * subscribes once at bootstrap and never unsubscribes.\n *\n * @param handler - Callback invoked with each well-formed inbound message.\n * @returns A function that removes the registered listeners.\n */\nexport function onFromRN(handler: InboundMessageHandler): () => void {\n const dispatch = (event: MessageEvent): void => {\n // RN WebView inline HTML: native bridge messages arrive with an empty\n // or \"null\" origin. Reject messages from real web origins.\n const {origin} = event;\n if (origin && origin !== 'null' && !origin.startsWith('file:')) {\n return;\n }\n\n let parsed: unknown;\n try {\n parsed =\n typeof event.data === 'string' ? JSON.parse(event.data) : event.data;\n } catch (parseError) {\n reportErrorToRN(parseError);\n return;\n }\n if (!parsed || typeof parsed !== 'object') {\n return;\n }\n const candidate = parsed as { type?: unknown };\n if (typeof candidate.type !== 'string') {\n return;\n }\n // Trusting the type narrowing here is fine because messages/handler.ts\n // re-validates via a switch on candidate.type before dispatching to a\n // typed handler. Phase 1 only routes SET_THEME_COLORS, but the listener\n // forwards every well-formed message so the handler can decide.\n handler(parsed as InboundMessage);\n };\n\n // iOS posts arrive on window; Android posts arrive on document. Subscribe\n // to both to match legacy chartLogic.js handleMessage wiring.\n window.addEventListener('message', dispatch as EventListener);\n document.addEventListener('message', dispatch as EventListener);\n\n return () => {\n window.removeEventListener('message', dispatch as EventListener);\n document.removeEventListener('message', dispatch as EventListener);\n };\n}\n\n/** Re-export for callers that want the type tag union. */\nexport type { InboundMessageType } from '../messages/contract.js';\n"]}
@@ -0,0 +1,37 @@
1
+ import type { InboundMessage, OutboundMessageType, OutboundPayloads } from "../messages/contract.cjs";
2
+ export declare function safeStringify(value: unknown): string;
3
+ /**
4
+ * Posts a typed message to React Native via window.ReactNativeWebView.
5
+ * Equivalent to legacy `sendToReactNative(type, payload)` at chartLogic.js
6
+ * line ~98. Silently no-ops when window.ReactNativeWebView is absent (e.g.
7
+ * during unit tests in a jsdom environment without the RN bridge stub).
8
+ *
9
+ * @param type - The outbound message type tag.
10
+ * @param payload - The payload associated with the message type.
11
+ */
12
+ export declare function postToRN<Type extends OutboundMessageType>(type: Type, payload: OutboundPayloads[Type]): void;
13
+ /**
14
+ * Reports a runtime error to React Native via the ERROR channel. Matches the
15
+ * legacy `sendToReactNative('ERROR', { message })` pattern used throughout
16
+ * chartLogic.js.
17
+ *
18
+ * @param error - The error (or arbitrary thrown value) to report.
19
+ */
20
+ export declare function reportErrorToRN(error: unknown): void;
21
+ export type InboundMessageHandler = (message: InboundMessage) => void;
22
+ /**
23
+ * Registers a single inbound listener. React Native posts JSON strings via
24
+ * webView.postMessage; the WebView receives them on window 'message' on iOS
25
+ * and document 'message' on Android (see chartLogic.js line ~400). We
26
+ * subscribe to both so consumers don't have to.
27
+ *
28
+ * The returned function unsubscribes — useful for tests; the real bundle
29
+ * subscribes once at bootstrap and never unsubscribes.
30
+ *
31
+ * @param handler - Callback invoked with each well-formed inbound message.
32
+ * @returns A function that removes the registered listeners.
33
+ */
34
+ export declare function onFromRN(handler: InboundMessageHandler): () => void;
35
+ /** Re-export for callers that want the type tag union. */
36
+ export type { InboundMessageType } from "../messages/contract.cjs";
37
+ //# sourceMappingURL=bridge.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.cts","sourceRoot":"","sources":["../../src/core/bridge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EACjB,iCAAgC;AAEjC,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,SAAS,mBAAmB,EACvD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,GAC9B,IAAI,CAWN;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAUpD;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAEtE;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI,CAwCnE;AAED,0DAA0D;AAC1D,YAAY,EAAE,kBAAkB,EAAE,iCAAgC"}