@metamask-previews/advanced-chart-core 0.0.0-preview-6eb51ef1f → 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 (149) hide show
  1. package/dist/core/bootstrap.cjs +23 -23
  2. package/dist/core/bootstrap.cjs.map +1 -1
  3. package/dist/core/bootstrap.d.cts.map +1 -1
  4. package/dist/core/bootstrap.d.mts.map +1 -1
  5. package/dist/core/bootstrap.mjs +18 -18
  6. package/dist/core/bootstrap.mjs.map +1 -1
  7. package/dist/core/bridge.cjs.map +1 -1
  8. package/dist/core/bridge.mjs.map +1 -1
  9. package/dist/core/dataLifecycle.cjs.map +1 -1
  10. package/dist/core/dataLifecycle.d.cts.map +1 -1
  11. package/dist/core/dataLifecycle.d.mts.map +1 -1
  12. package/dist/core/dataLifecycle.mjs.map +1 -1
  13. package/dist/core/state.cjs.map +1 -1
  14. package/dist/core/state.mjs.map +1 -1
  15. package/dist/core/timeUtils.cjs.map +1 -1
  16. package/dist/core/timeUtils.d.cts.map +1 -1
  17. package/dist/core/timeUtils.d.mts.map +1 -1
  18. package/dist/core/timeUtils.mjs.map +1 -1
  19. package/dist/core/types.cjs.map +1 -1
  20. package/dist/core/types.d.cts.map +1 -1
  21. package/dist/core/types.d.mts.map +1 -1
  22. package/dist/core/types.mjs.map +1 -1
  23. package/dist/features/indicators/index.cjs +1 -1
  24. package/dist/features/indicators/index.cjs.map +1 -1
  25. package/dist/features/indicators/index.d.cts.map +1 -1
  26. package/dist/features/indicators/index.d.mts.map +1 -1
  27. package/dist/features/indicators/index.mjs +1 -1
  28. package/dist/features/indicators/index.mjs.map +1 -1
  29. package/dist/features/indicators/legend.cjs.map +1 -1
  30. package/dist/features/indicators/legend.d.cts.map +1 -1
  31. package/dist/features/indicators/legend.d.mts.map +1 -1
  32. package/dist/features/indicators/legend.mjs.map +1 -1
  33. package/dist/features/indicators/resize.cjs.map +1 -1
  34. package/dist/features/indicators/resize.d.cts.map +1 -1
  35. package/dist/features/indicators/resize.d.mts.map +1 -1
  36. package/dist/features/indicators/resize.mjs.map +1 -1
  37. package/dist/features/indicators/studies.cjs.map +1 -1
  38. package/dist/features/indicators/studies.d.cts.map +1 -1
  39. package/dist/features/indicators/studies.d.mts.map +1 -1
  40. package/dist/features/indicators/studies.mjs.map +1 -1
  41. package/dist/features/indicators/subPane.cjs.map +1 -1
  42. package/dist/features/indicators/subPane.d.cts.map +1 -1
  43. package/dist/features/indicators/subPane.d.mts.map +1 -1
  44. package/dist/features/indicators/subPane.mjs.map +1 -1
  45. package/dist/features/volume/index.cjs +1 -1
  46. package/dist/features/volume/index.cjs.map +1 -1
  47. package/dist/features/volume/index.d.cts.map +1 -1
  48. package/dist/features/volume/index.d.mts.map +1 -1
  49. package/dist/features/volume/index.mjs +1 -1
  50. package/dist/features/volume/index.mjs.map +1 -1
  51. package/dist/interaction/crosshair.cjs.map +1 -1
  52. package/dist/interaction/crosshair.d.cts.map +1 -1
  53. package/dist/interaction/crosshair.d.mts.map +1 -1
  54. package/dist/interaction/crosshair.mjs.map +1 -1
  55. package/dist/interaction/visibleRange.cjs.map +1 -1
  56. package/dist/interaction/visibleRange.d.cts.map +1 -1
  57. package/dist/interaction/visibleRange.d.mts.map +1 -1
  58. package/dist/interaction/visibleRange.mjs.map +1 -1
  59. package/dist/messages/contract.cjs.map +1 -1
  60. package/dist/messages/contract.d.cts.map +1 -1
  61. package/dist/messages/contract.d.mts.map +1 -1
  62. package/dist/messages/contract.mjs.map +1 -1
  63. package/dist/messages/handler.cjs.map +1 -1
  64. package/dist/messages/handler.d.cts.map +1 -1
  65. package/dist/messages/handler.d.mts.map +1 -1
  66. package/dist/messages/handler.mjs.map +1 -1
  67. package/dist/overlays/focusTime/index.cjs.map +1 -1
  68. package/dist/overlays/focusTime/index.d.cts.map +1 -1
  69. package/dist/overlays/focusTime/index.d.mts.map +1 -1
  70. package/dist/overlays/focusTime/index.mjs.map +1 -1
  71. package/dist/overlays/positionLines/index.cjs.map +1 -1
  72. package/dist/overlays/positionLines/index.d.cts.map +1 -1
  73. package/dist/overlays/positionLines/index.d.mts.map +1 -1
  74. package/dist/overlays/positionLines/index.mjs.map +1 -1
  75. package/dist/overlays/socialLeaderboard/index.cjs.map +1 -1
  76. package/dist/overlays/socialLeaderboard/index.d.cts.map +1 -1
  77. package/dist/overlays/socialLeaderboard/index.d.mts.map +1 -1
  78. package/dist/overlays/socialLeaderboard/index.mjs.map +1 -1
  79. package/dist/overlays/tradeMarkers/animation.cjs +1 -1
  80. package/dist/overlays/tradeMarkers/animation.cjs.map +1 -1
  81. package/dist/overlays/tradeMarkers/animation.d.cts.map +1 -1
  82. package/dist/overlays/tradeMarkers/animation.d.mts.map +1 -1
  83. package/dist/overlays/tradeMarkers/animation.mjs +1 -1
  84. package/dist/overlays/tradeMarkers/animation.mjs.map +1 -1
  85. package/dist/overlays/tradeMarkers/index.cjs.map +1 -1
  86. package/dist/overlays/tradeMarkers/index.d.cts.map +1 -1
  87. package/dist/overlays/tradeMarkers/index.d.mts.map +1 -1
  88. package/dist/overlays/tradeMarkers/index.mjs.map +1 -1
  89. package/dist/overlays/tradeMarkers/markerHitTest.cjs +1 -1
  90. package/dist/overlays/tradeMarkers/markerHitTest.cjs.map +1 -1
  91. package/dist/overlays/tradeMarkers/markerHitTest.d.cts.map +1 -1
  92. package/dist/overlays/tradeMarkers/markerHitTest.d.mts.map +1 -1
  93. package/dist/overlays/tradeMarkers/markerHitTest.mjs +1 -1
  94. package/dist/overlays/tradeMarkers/markerHitTest.mjs.map +1 -1
  95. package/dist/overlays/tradeMarkers/state.cjs.map +1 -1
  96. package/dist/overlays/tradeMarkers/state.d.cts.map +1 -1
  97. package/dist/overlays/tradeMarkers/state.d.mts.map +1 -1
  98. package/dist/overlays/tradeMarkers/state.mjs.map +1 -1
  99. package/dist/pagination/priceApi.cjs.map +1 -1
  100. package/dist/pagination/priceApi.d.cts.map +1 -1
  101. package/dist/pagination/priceApi.d.mts.map +1 -1
  102. package/dist/pagination/priceApi.mjs.map +1 -1
  103. package/dist/pagination/rnBacked.cjs.map +1 -1
  104. package/dist/pagination/rnBacked.d.cts.map +1 -1
  105. package/dist/pagination/rnBacked.d.mts.map +1 -1
  106. package/dist/pagination/rnBacked.mjs.map +1 -1
  107. package/dist/widget/datafeed.cjs +1 -1
  108. package/dist/widget/datafeed.cjs.map +1 -1
  109. package/dist/widget/datafeed.d.cts.map +1 -1
  110. package/dist/widget/datafeed.d.mts.map +1 -1
  111. package/dist/widget/datafeed.mjs +1 -1
  112. package/dist/widget/datafeed.mjs.map +1 -1
  113. package/dist/widget/externalLinkBridge.cjs.map +1 -1
  114. package/dist/widget/externalLinkBridge.d.cts.map +1 -1
  115. package/dist/widget/externalLinkBridge.d.mts.map +1 -1
  116. package/dist/widget/externalLinkBridge.mjs.map +1 -1
  117. package/dist/widget/initChart.cjs +1 -1
  118. package/dist/widget/initChart.cjs.map +1 -1
  119. package/dist/widget/initChart.d.cts.map +1 -1
  120. package/dist/widget/initChart.d.mts.map +1 -1
  121. package/dist/widget/initChart.mjs +1 -1
  122. package/dist/widget/initChart.mjs.map +1 -1
  123. package/dist/widget/ohlcvIngestion.cjs +3 -3
  124. package/dist/widget/ohlcvIngestion.cjs.map +1 -1
  125. package/dist/widget/ohlcvIngestion.d.cts.map +1 -1
  126. package/dist/widget/ohlcvIngestion.d.mts.map +1 -1
  127. package/dist/widget/ohlcvIngestion.mjs +3 -3
  128. package/dist/widget/ohlcvIngestion.mjs.map +1 -1
  129. package/dist/widget/priceFormatter.cjs.map +1 -1
  130. package/dist/widget/priceFormatter.d.cts.map +1 -1
  131. package/dist/widget/priceFormatter.d.mts.map +1 -1
  132. package/dist/widget/priceFormatter.mjs.map +1 -1
  133. package/dist/widget/scaleLayout.cjs.map +1 -1
  134. package/dist/widget/scaleLayout.d.cts.map +1 -1
  135. package/dist/widget/scaleLayout.d.mts.map +1 -1
  136. package/dist/widget/scaleLayout.mjs.map +1 -1
  137. package/dist/widget/theme.cjs.map +1 -1
  138. package/dist/widget/theme.d.cts.map +1 -1
  139. package/dist/widget/theme.d.mts.map +1 -1
  140. package/dist/widget/theme.mjs.map +1 -1
  141. package/dist/widget/tvDomHelpers.cjs.map +1 -1
  142. package/dist/widget/tvDomHelpers.d.cts.map +1 -1
  143. package/dist/widget/tvDomHelpers.d.mts.map +1 -1
  144. package/dist/widget/tvDomHelpers.mjs.map +1 -1
  145. package/dist/widget/visualOverrides.cjs.map +1 -1
  146. package/dist/widget/visualOverrides.d.cts.map +1 -1
  147. package/dist/widget/visualOverrides.d.mts.map +1 -1
  148. package/dist/widget/visualOverrides.mjs.map +1 -1
  149. package/package.json +3 -1
@@ -16,32 +16,32 @@
16
16
  // apply visual overrides, attach crosshair + visible-range listeners.
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
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
19
  const index_js_1 = require("../features/indicators/index.cjs");
34
- const subPane_js_1 = require("../features/indicators/subPane.cjs");
35
20
  const legend_js_1 = require("../features/indicators/legend.cjs");
21
+ const subPane_js_1 = require("../features/indicators/subPane.cjs");
36
22
  const index_js_2 = require("../features/volume/index.cjs");
37
- const index_js_3 = require("../overlays/tradeMarkers/index.cjs");
23
+ const crosshair_js_1 = require("../interaction/crosshair.cjs");
24
+ const visibleRange_js_1 = require("../interaction/visibleRange.cjs");
25
+ const handler_js_1 = require("../messages/handler.cjs");
26
+ const index_js_3 = require("../overlays/focusTime/index.cjs");
27
+ const index_js_4 = require("../overlays/positionLines/index.cjs");
28
+ const index_js_5 = require("../overlays/socialLeaderboard/index.cjs");
38
29
  const animation_js_1 = require("../overlays/tradeMarkers/animation.cjs");
30
+ const index_js_6 = require("../overlays/tradeMarkers/index.cjs");
39
31
  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
32
  const rnBacked_js_1 = require("../pagination/rnBacked.cjs");
33
+ const chartType_js_1 = require("../widget/chartType.cjs");
34
+ const datafeed_js_1 = require("../widget/datafeed.cjs");
35
+ const initChart_js_1 = require("../widget/initChart.cjs");
36
+ const ohlcvIngestion_js_1 = require("../widget/ohlcvIngestion.cjs");
37
+ const priceFormatter_js_1 = require("../widget/priceFormatter.cjs");
38
+ const scaleLayout_js_1 = require("../widget/scaleLayout.cjs");
39
+ const theme_js_1 = require("../widget/theme.cjs");
40
+ const visualOverrides_js_1 = require("../widget/visualOverrides.cjs");
41
+ const bridge_js_1 = require("./bridge.cjs");
42
+ const loadLibrary_js_1 = require("./loadLibrary.cjs");
44
43
  const state_js_1 = require("./state.cjs");
44
+ const timeUtils_js_1 = require("./timeUtils.cjs");
45
45
  /**
46
46
  * When RN passes an explicit visible-range start (e.g. a specific period like
47
47
  * 1D/1W/1M), build a `{ type: 'time-range', from, to }` timeframe so the
@@ -113,10 +113,10 @@ function bootstrap() {
113
113
  (0, handler_js_1.registerHandler)('SET_SUB_PANE_LAYOUT', (payload) => {
114
114
  (0, subPane_js_1.handleSetSubPaneLayout)(payload);
115
115
  });
116
- (0, index_js_3.registerTradeMarkerOverlay)();
116
+ (0, index_js_6.registerTradeMarkerOverlay)();
117
117
  (0, animation_js_1.registerTradeMarkerPulseHandler)();
118
- (0, index_js_4.registerFocusTimeOverlay)();
119
- (0, index_js_5.registerPositionLinesOverlay)();
118
+ (0, index_js_3.registerFocusTimeOverlay)();
119
+ (0, index_js_4.registerPositionLinesOverlay)();
120
120
  (0, rnBacked_js_1.registerRnBackedPaginationHandler)();
121
121
  (0, index_js_2.registerVolumeThemeSync)();
122
122
  (0, bridge_js_1.onFromRN)((message) => {
@@ -165,7 +165,7 @@ function bootstrap() {
165
165
  chart.selection().clear();
166
166
  });
167
167
  (0, legend_js_1.attachLegendResizeListener)(widget);
168
- (0, index_js_6.slbScheduleInitialCentering)();
168
+ (0, index_js_5.slbScheduleInitialCentering)();
169
169
  (0, initChart_js_1.scheduleChartLayoutSettledNotify)();
170
170
  }
171
171
  catch (error) {
@@ -1 +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"]}
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 {\n handleAddIndicator,\n handleRemoveIndicator,\n handleSetMAVisibility,\n} from '../features/indicators/index.js';\nimport {\n attachLegendResizeListener,\n setupLegendOverlay,\n} from '../features/indicators/legend.js';\nimport { handleSetSubPaneLayout } from '../features/indicators/subPane.js';\nimport {\n handleToggleVolume,\n registerVolumeThemeSync,\n} from '../features/volume/index.js';\nimport {\n attachCrosshairListener,\n attachTapDismiss,\n} from '../interaction/crosshair.js';\nimport { attachVisibleRangeListeners } from '../interaction/visibleRange.js';\nimport {\n dispatchInboundMessage,\n registerHandler,\n} from '../messages/handler.js';\nimport { registerFocusTimeOverlay } from '../overlays/focusTime/index.js';\nimport { registerPositionLinesOverlay } from '../overlays/positionLines/index.js';\nimport { slbScheduleInitialCentering } from '../overlays/socialLeaderboard/index.js';\nimport { registerTradeMarkerPulseHandler } from '../overlays/tradeMarkers/animation.js';\nimport { registerTradeMarkerOverlay } from '../overlays/tradeMarkers/index.js';\nimport { attachMarkerHitTest } from '../overlays/tradeMarkers/markerHitTest.js';\nimport { registerRnBackedPaginationHandler } from '../pagination/rnBacked.js';\nimport { handleSetChartType } from '../widget/chartType.js';\nimport { customDatafeed } from '../widget/datafeed.js';\nimport {\n createChartWidget,\n scheduleChartLayoutSettledNotify,\n} from '../widget/initChart.js';\nimport {\n handleRealtimeUpdate,\n handleSetOHLCVData,\n onFirstOhlcvData,\n} from '../widget/ohlcvIngestion.js';\nimport { advancedChartPriceFormatterFactory } from '../widget/priceFormatter.js';\nimport { applyScaleLayout } from '../widget/scaleLayout.js';\nimport {\n applyThemeColors,\n flushPendingTheme,\n initThemeFromConfig,\n} from '../widget/theme.js';\nimport { applyVisualOverrides } from '../widget/visualOverrides.js';\nimport { onFromRN, postToRN, reportErrorToRN } from './bridge.js';\nimport { loadTradingViewLibrary } from './loadLibrary.js';\nimport {\n getOhlcvData,\n getVisibleFromMs,\n getVisibleToMs,\n setSubPaneHeightRatio,\n} from './state.js';\nimport { getApproxBarDurationSec } from './timeUtils.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) {\n return undefined;\n }\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"]}
@@ -1 +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"}
1
+ {"version":3,"file":"bootstrap.d.cts","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AA0EA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAmB;AAuC9C;;;;;;GAMG;AACH,wBAAgB,SAAS,IAAI,WAAW,CA0GvC"}
@@ -1 +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"}
1
+ {"version":3,"file":"bootstrap.d.mts","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AA0EA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAmB;AAuC9C;;;;;;GAMG;AACH,wBAAgB,SAAS,IAAI,WAAW,CA0GvC"}
@@ -13,32 +13,32 @@
13
13
  // SET_OHLCV_DATA arrives.
14
14
  // 6. On first SET_OHLCV_DATA: createChartWidget with the default datafeed,
15
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
16
  import { handleAddIndicator, handleRemoveIndicator, handleSetMAVisibility } from "../features/indicators/index.mjs";
31
- import { handleSetSubPaneLayout } from "../features/indicators/subPane.mjs";
32
17
  import { attachLegendResizeListener, setupLegendOverlay } from "../features/indicators/legend.mjs";
18
+ import { handleSetSubPaneLayout } from "../features/indicators/subPane.mjs";
33
19
  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";
20
+ import { attachCrosshairListener, attachTapDismiss } from "../interaction/crosshair.mjs";
21
+ import { attachVisibleRangeListeners } from "../interaction/visibleRange.mjs";
22
+ import { dispatchInboundMessage, registerHandler } from "../messages/handler.mjs";
37
23
  import { registerFocusTimeOverlay } from "../overlays/focusTime/index.mjs";
38
24
  import { registerPositionLinesOverlay } from "../overlays/positionLines/index.mjs";
39
25
  import { slbScheduleInitialCentering } from "../overlays/socialLeaderboard/index.mjs";
26
+ import { registerTradeMarkerPulseHandler } from "../overlays/tradeMarkers/animation.mjs";
27
+ import { registerTradeMarkerOverlay } from "../overlays/tradeMarkers/index.mjs";
28
+ import { attachMarkerHitTest } from "../overlays/tradeMarkers/markerHitTest.mjs";
40
29
  import { registerRnBackedPaginationHandler } from "../pagination/rnBacked.mjs";
30
+ import { handleSetChartType } from "../widget/chartType.mjs";
31
+ import { customDatafeed } from "../widget/datafeed.mjs";
32
+ import { createChartWidget, scheduleChartLayoutSettledNotify } from "../widget/initChart.mjs";
33
+ import { handleRealtimeUpdate, handleSetOHLCVData, onFirstOhlcvData } from "../widget/ohlcvIngestion.mjs";
34
+ import { advancedChartPriceFormatterFactory } from "../widget/priceFormatter.mjs";
35
+ import { applyScaleLayout } from "../widget/scaleLayout.mjs";
36
+ import { applyThemeColors, flushPendingTheme, initThemeFromConfig } from "../widget/theme.mjs";
37
+ import { applyVisualOverrides } from "../widget/visualOverrides.mjs";
38
+ import { onFromRN, postToRN, reportErrorToRN } from "./bridge.mjs";
39
+ import { loadTradingViewLibrary } from "./loadLibrary.mjs";
41
40
  import { getOhlcvData, getVisibleFromMs, getVisibleToMs, setSubPaneHeightRatio } from "./state.mjs";
41
+ import { getApproxBarDurationSec } from "./timeUtils.mjs";
42
42
  /**
43
43
  * When RN passes an explicit visible-range start (e.g. a specific period like
44
44
  * 1D/1W/1M), build a `{ type: 'time-range', from, to }` timeframe so the
@@ -1 +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"]}
1
+ {"version":3,"file":"bootstrap.mjs","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,sBAAsB;AACtB,EAAE;AACF,kCAAkC;AAClC,8EAA8E;AAC9E,mBAAmB;AACnB,uEAAuE;AACvE,sDAAsD;AACtD,4CAA4C;AAC5C,oEAAoE;AACpE,iCAAiC;AACjC,wEAAwE;AACxE,6BAA6B;AAC7B,2EAA2E;AAC3E,yEAAyE;AAEzE,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACtB,yCAAwC;AACzC,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EACnB,0CAAyC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,2CAA0C;AAC3E,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACxB,qCAAoC;AACrC,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EACjB,qCAAoC;AACrC,OAAO,EAAE,2BAA2B,EAAE,wCAAuC;AAC7E,OAAO,EACL,sBAAsB,EACtB,eAAe,EAChB,gCAA+B;AAChC,OAAO,EAAE,wBAAwB,EAAE,wCAAuC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,4CAA2C;AAClF,OAAO,EAAE,2BAA2B,EAAE,gDAA+C;AACrF,OAAO,EAAE,+BAA+B,EAAE,+CAA8C;AACxF,OAAO,EAAE,0BAA0B,EAAE,2CAA0C;AAC/E,OAAO,EAAE,mBAAmB,EAAE,mDAAkD;AAChF,OAAO,EAAE,iCAAiC,EAAE,mCAAkC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,gCAA+B;AAC5D,OAAO,EAAE,cAAc,EAAE,+BAA8B;AACvD,OAAO,EACL,iBAAiB,EACjB,gCAAgC,EACjC,gCAA+B;AAChC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EACjB,qCAAoC;AACrC,OAAO,EAAE,kCAAkC,EAAE,qCAAoC;AACjF,OAAO,EAAE,gBAAgB,EAAE,kCAAiC;AAC5D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACpB,4BAA2B;AAC5B,OAAO,EAAE,oBAAoB,EAAE,sCAAqC;AACpE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,qBAAoB;AAClE,OAAO,EAAE,sBAAsB,EAAE,0BAAyB;AAC1D,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACtB,oBAAmB;AACpB,OAAO,EAAE,uBAAuB,EAAE,wBAAuB;AAGzD;;;;;;;;;GASG;AACH,SAAS,qBAAqB;IAG5B,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,WAAW,GAAG,cAAc,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,aAAa,GAAG,uBAAuB,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC;IAClE,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QACtC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,aAAa;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,+DAA+D;YAC7D,gCAAgC,CACnC,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ,EAAE,CAAC;QAClD,qBAAqB,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC;IAED,eAAe,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC9C,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC5C,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC7C,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC5C,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE;QAC3C,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC9C,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC/C,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE;QAC3C,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,eAAe,CAAC,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE;QACjD,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,0BAA0B,EAAE,CAAC;IAC7B,+BAA+B,EAAE,CAAC;IAClC,wBAAwB,EAAE,CAAC;IAC3B,4BAA4B,EAAE,CAAC;IAC/B,iCAAiC,EAAE,CAAC;IACpC,uBAAuB,EAAE,CAAC;IAE1B,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE;QACnB,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,wEAAwE;IACxE,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACxD,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,gBAAgB,CAAC,GAAG,EAAE;QACpB,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC;aACtC,IAAI,CAAC,GAAG,EAAE;YACT,OAAO,iBAAiB,CAAC,MAAM,EAAE;gBAC/B,QAAQ,EAAE,cAAc;gBACxB,gBAAgB,EAAE;oBAChB,qBAAqB,EAAE,kCAAkC;iBAC1D;gBACD,SAAS,EAAE,qBAAqB,EAAE;gBAClC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;oBAClB,IAAI,CAAC;wBACH,iBAAiB,EAAE,CAAC;wBACpB,gBAAgB,EAAE,CAAC;wBACnB,oBAAoB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;wBAC7C,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;wBACzC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;wBACnC,4DAA4D;wBAC5D,4DAA4D;wBAC5D,gDAAgD;wBAChD,IAAI,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC;4BAChC,IAAI,CAAC;gCACH,KAAK,CAAC,YAAY,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;4BACzC,CAAC;4BAAC,OAAO,gBAAgB,EAAE,CAAC;gCAC1B,eAAe,CAAC,gBAAgB,CAAC,CAAC;4BACpC,CAAC;wBACH,CAAC;wBACD,uBAAuB,CAAC,KAAK,CAAC,CAAC;wBAC/B,gBAAgB,CAAC,MAAM,CAAC,CAAC;wBACzB,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;wBACnC,2BAA2B,CAAC,KAAK,CAAC,CAAC;wBACnC,KAAK;6BACF,SAAS,EAAE;6BACX,SAAS,EAAE;6BACX,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE;4BACpB,KAAK,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;wBAC5B,CAAC,CAAC,CAAC;wBACL,0BAA0B,CAAC,MAAM,CAAC,CAAC;wBACnC,2BAA2B,EAAE,CAAC;wBAC9B,gCAAgC,EAAE,CAAC;oBACrC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,eAAe,CAAC,KAAK,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAE1D,OAAO,MAAM,CAAC;AAChB,CAAC","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 {\n handleAddIndicator,\n handleRemoveIndicator,\n handleSetMAVisibility,\n} from '../features/indicators/index.js';\nimport {\n attachLegendResizeListener,\n setupLegendOverlay,\n} from '../features/indicators/legend.js';\nimport { handleSetSubPaneLayout } from '../features/indicators/subPane.js';\nimport {\n handleToggleVolume,\n registerVolumeThemeSync,\n} from '../features/volume/index.js';\nimport {\n attachCrosshairListener,\n attachTapDismiss,\n} from '../interaction/crosshair.js';\nimport { attachVisibleRangeListeners } from '../interaction/visibleRange.js';\nimport {\n dispatchInboundMessage,\n registerHandler,\n} from '../messages/handler.js';\nimport { registerFocusTimeOverlay } from '../overlays/focusTime/index.js';\nimport { registerPositionLinesOverlay } from '../overlays/positionLines/index.js';\nimport { slbScheduleInitialCentering } from '../overlays/socialLeaderboard/index.js';\nimport { registerTradeMarkerPulseHandler } from '../overlays/tradeMarkers/animation.js';\nimport { registerTradeMarkerOverlay } from '../overlays/tradeMarkers/index.js';\nimport { attachMarkerHitTest } from '../overlays/tradeMarkers/markerHitTest.js';\nimport { registerRnBackedPaginationHandler } from '../pagination/rnBacked.js';\nimport { handleSetChartType } from '../widget/chartType.js';\nimport { customDatafeed } from '../widget/datafeed.js';\nimport {\n createChartWidget,\n scheduleChartLayoutSettledNotify,\n} from '../widget/initChart.js';\nimport {\n handleRealtimeUpdate,\n handleSetOHLCVData,\n onFirstOhlcvData,\n} from '../widget/ohlcvIngestion.js';\nimport { advancedChartPriceFormatterFactory } from '../widget/priceFormatter.js';\nimport { applyScaleLayout } from '../widget/scaleLayout.js';\nimport {\n applyThemeColors,\n flushPendingTheme,\n initThemeFromConfig,\n} from '../widget/theme.js';\nimport { applyVisualOverrides } from '../widget/visualOverrides.js';\nimport { onFromRN, postToRN, reportErrorToRN } from './bridge.js';\nimport { loadTradingViewLibrary } from './loadLibrary.js';\nimport {\n getOhlcvData,\n getVisibleFromMs,\n getVisibleToMs,\n setSubPaneHeightRatio,\n} from './state.js';\nimport { getApproxBarDurationSec } from './timeUtils.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) {\n return undefined;\n }\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"]}
@@ -1 +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"]}
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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.mjs","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"]}
1
+ {"version":3,"file":"bridge.mjs","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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dataLifecycle.cjs","sourceRoot":"","sources":["../../src/core/dataLifecycle.ts"],"names":[],"mappings":";AAAA,6EAA6E;AAC7E,EAAE;AACF,wEAAwE;AACxE,kEAAkE;AAClE,uEAAuE;AACvE,wEAAwE;AACxE,kEAAkE;AAClE,mCAAmC;AACnC,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,kEAAkE;;;AAElE,4CAA8C;AAS9C,MAAM,SAAS,GAA2C;IACxD,UAAU,EAAE,EAAE;IACd,cAAc,EAAE,EAAE;IAClB,mBAAmB,EAAE,EAAE;CACxB,CAAC;AAEF,SAAgB,eAAe,CAC7B,KAAyB,EACzB,QAAkB;IAElB,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,GAAG,EAAE;QACV,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAA,CAAC;IAC1C,CAAC,CAAC;AACJ,CAAC;AAVD,0CAUC;AAED,SAAgB,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,QAAQ,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,2BAAe,EAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AATD,kDASC;AAED,0DAA0D;AAC1D,SAAgB,2BAA2B;IACzC,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;IAC1B,SAAS,CAAC,cAAc,GAAG,EAAE,CAAC;IAC9B,SAAS,CAAC,mBAAmB,GAAG,EAAE,CAAC;AACrC,CAAC;AAJD,kEAIC","sourcesContent":["// Lightweight event bus for data lifecycle events overlays need to react to.\n//\n// The widget modules (ohlcvIngestion, pagination, visibleRange) publish\n// events after they mutate the OHLCV series or the visible range;\n// overlay modules (tradeMarkers, positionLines) subscribe and re-place\n// their shapes. Keeps overlays decoupled from widget/* — overlays never\n// import from widget/*, matching the ESLint `no-restricted-paths`\n// direction described in the plan.\n//\n// The events are intentionally void — subscribers read whatever state\n// they need from core/state.ts. Errors inside a subscriber are logged\n// to RN so a broken overlay doesn't take the widget down with it.\n\nimport { reportErrorToRN } from './bridge.js';\n\nexport type DataLifecycleEvent =\n | 'ohlcvReset'\n | 'ohlcvPrepended'\n | 'visibleRangeChanged';\n\ntype Listener = () => void;\n\nconst listeners: Record<DataLifecycleEvent, Listener[]> = {\n ohlcvReset: [],\n ohlcvPrepended: [],\n visibleRangeChanged: [],\n};\n\nexport function onDataLifecycle(\n event: DataLifecycleEvent,\n listener: Listener,\n): () => void {\n listeners[event].push(listener);\n return () => {\n const bucket = listeners[event];\n const idx = bucket.indexOf(listener);\n if (idx !== -1) {bucket.splice(idx, 1);}\n };\n}\n\nexport function notifyDataLifecycle(event: DataLifecycleEvent): void {\n const bucket = listeners[event];\n for (const listener of bucket) {\n try {\n listener();\n } catch (error) {\n reportErrorToRN(error);\n }\n }\n}\n\n/** Test-only: clear every listener across every event. */\nexport function _resetDataLifecycleForTests(): void {\n listeners.ohlcvReset = [];\n listeners.ohlcvPrepended = [];\n listeners.visibleRangeChanged = [];\n}\n"]}
1
+ {"version":3,"file":"dataLifecycle.cjs","sourceRoot":"","sources":["../../src/core/dataLifecycle.ts"],"names":[],"mappings":";AAAA,6EAA6E;AAC7E,EAAE;AACF,wEAAwE;AACxE,kEAAkE;AAClE,uEAAuE;AACvE,wEAAwE;AACxE,kEAAkE;AAClE,mCAAmC;AACnC,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,kEAAkE;;;AAElE,4CAA8C;AAS9C,MAAM,SAAS,GAA2C;IACxD,UAAU,EAAE,EAAE;IACd,cAAc,EAAE,EAAE;IAClB,mBAAmB,EAAE,EAAE;CACxB,CAAC;AAEF,SAAgB,eAAe,CAC7B,KAAyB,EACzB,QAAkB;IAElB,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,GAAG,EAAE;QACV,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAZD,0CAYC;AAED,SAAgB,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,QAAQ,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,2BAAe,EAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AATD,kDASC;AAED,0DAA0D;AAC1D,SAAgB,2BAA2B;IACzC,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;IAC1B,SAAS,CAAC,cAAc,GAAG,EAAE,CAAC;IAC9B,SAAS,CAAC,mBAAmB,GAAG,EAAE,CAAC;AACrC,CAAC;AAJD,kEAIC","sourcesContent":["// Lightweight event bus for data lifecycle events overlays need to react to.\n//\n// The widget modules (ohlcvIngestion, pagination, visibleRange) publish\n// events after they mutate the OHLCV series or the visible range;\n// overlay modules (tradeMarkers, positionLines) subscribe and re-place\n// their shapes. Keeps overlays decoupled from widget/* — overlays never\n// import from widget/*, matching the ESLint `no-restricted-paths`\n// direction described in the plan.\n//\n// The events are intentionally void — subscribers read whatever state\n// they need from core/state.ts. Errors inside a subscriber are logged\n// to RN so a broken overlay doesn't take the widget down with it.\n\nimport { reportErrorToRN } from './bridge.js';\n\nexport type DataLifecycleEvent =\n | 'ohlcvReset'\n | 'ohlcvPrepended'\n | 'visibleRangeChanged';\n\ntype Listener = () => void;\n\nconst listeners: Record<DataLifecycleEvent, Listener[]> = {\n ohlcvReset: [],\n ohlcvPrepended: [],\n visibleRangeChanged: [],\n};\n\nexport function onDataLifecycle(\n event: DataLifecycleEvent,\n listener: Listener,\n): () => void {\n listeners[event].push(listener);\n return () => {\n const bucket = listeners[event];\n const idx = bucket.indexOf(listener);\n if (idx !== -1) {\n bucket.splice(idx, 1);\n }\n };\n}\n\nexport function notifyDataLifecycle(event: DataLifecycleEvent): void {\n const bucket = listeners[event];\n for (const listener of bucket) {\n try {\n listener();\n } catch (error) {\n reportErrorToRN(error);\n }\n }\n}\n\n/** Test-only: clear every listener across every event. */\nexport function _resetDataLifecycleForTests(): void {\n listeners.ohlcvReset = [];\n listeners.ohlcvPrepended = [];\n listeners.visibleRangeChanged = [];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dataLifecycle.d.cts","sourceRoot":"","sources":["../../src/core/dataLifecycle.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,CAAC;AAE1B,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAQ3B,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,QAAQ,GACjB,MAAM,IAAI,CAOZ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CASnE;AAED,0DAA0D;AAC1D,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD"}
1
+ {"version":3,"file":"dataLifecycle.d.cts","sourceRoot":"","sources":["../../src/core/dataLifecycle.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,CAAC;AAE1B,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAQ3B,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,QAAQ,GACjB,MAAM,IAAI,CASZ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CASnE;AAED,0DAA0D;AAC1D,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD"}
@@ -1 +1 @@
1
- {"version":3,"file":"dataLifecycle.d.mts","sourceRoot":"","sources":["../../src/core/dataLifecycle.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,CAAC;AAE1B,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAQ3B,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,QAAQ,GACjB,MAAM,IAAI,CAOZ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CASnE;AAED,0DAA0D;AAC1D,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD"}
1
+ {"version":3,"file":"dataLifecycle.d.mts","sourceRoot":"","sources":["../../src/core/dataLifecycle.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,CAAC;AAE1B,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAQ3B,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,QAAQ,GACjB,MAAM,IAAI,CASZ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CASnE;AAED,0DAA0D;AAC1D,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD"}
@@ -1 +1 @@
1
- {"version":3,"file":"dataLifecycle.mjs","sourceRoot":"","sources":["../../src/core/dataLifecycle.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,EAAE;AACF,wEAAwE;AACxE,kEAAkE;AAClE,uEAAuE;AACvE,wEAAwE;AACxE,kEAAkE;AAClE,mCAAmC;AACnC,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,kEAAkE;AAElE,OAAO,EAAE,eAAe,EAAE,qBAAoB;AAS9C,MAAM,SAAS,GAA2C;IACxD,UAAU,EAAE,EAAE;IACd,cAAc,EAAE,EAAE;IAClB,mBAAmB,EAAE,EAAE;CACxB,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,KAAyB,EACzB,QAAkB;IAElB,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,GAAG,EAAE;QACV,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAA,CAAC;IAC1C,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,QAAQ,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,2BAA2B;IACzC,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;IAC1B,SAAS,CAAC,cAAc,GAAG,EAAE,CAAC;IAC9B,SAAS,CAAC,mBAAmB,GAAG,EAAE,CAAC;AACrC,CAAC","sourcesContent":["// Lightweight event bus for data lifecycle events overlays need to react to.\n//\n// The widget modules (ohlcvIngestion, pagination, visibleRange) publish\n// events after they mutate the OHLCV series or the visible range;\n// overlay modules (tradeMarkers, positionLines) subscribe and re-place\n// their shapes. Keeps overlays decoupled from widget/* — overlays never\n// import from widget/*, matching the ESLint `no-restricted-paths`\n// direction described in the plan.\n//\n// The events are intentionally void — subscribers read whatever state\n// they need from core/state.ts. Errors inside a subscriber are logged\n// to RN so a broken overlay doesn't take the widget down with it.\n\nimport { reportErrorToRN } from './bridge.js';\n\nexport type DataLifecycleEvent =\n | 'ohlcvReset'\n | 'ohlcvPrepended'\n | 'visibleRangeChanged';\n\ntype Listener = () => void;\n\nconst listeners: Record<DataLifecycleEvent, Listener[]> = {\n ohlcvReset: [],\n ohlcvPrepended: [],\n visibleRangeChanged: [],\n};\n\nexport function onDataLifecycle(\n event: DataLifecycleEvent,\n listener: Listener,\n): () => void {\n listeners[event].push(listener);\n return () => {\n const bucket = listeners[event];\n const idx = bucket.indexOf(listener);\n if (idx !== -1) {bucket.splice(idx, 1);}\n };\n}\n\nexport function notifyDataLifecycle(event: DataLifecycleEvent): void {\n const bucket = listeners[event];\n for (const listener of bucket) {\n try {\n listener();\n } catch (error) {\n reportErrorToRN(error);\n }\n }\n}\n\n/** Test-only: clear every listener across every event. */\nexport function _resetDataLifecycleForTests(): void {\n listeners.ohlcvReset = [];\n listeners.ohlcvPrepended = [];\n listeners.visibleRangeChanged = [];\n}\n"]}
1
+ {"version":3,"file":"dataLifecycle.mjs","sourceRoot":"","sources":["../../src/core/dataLifecycle.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,EAAE;AACF,wEAAwE;AACxE,kEAAkE;AAClE,uEAAuE;AACvE,wEAAwE;AACxE,kEAAkE;AAClE,mCAAmC;AACnC,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,kEAAkE;AAElE,OAAO,EAAE,eAAe,EAAE,qBAAoB;AAS9C,MAAM,SAAS,GAA2C;IACxD,UAAU,EAAE,EAAE;IACd,cAAc,EAAE,EAAE;IAClB,mBAAmB,EAAE,EAAE;CACxB,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,KAAyB,EACzB,QAAkB;IAElB,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,GAAG,EAAE;QACV,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,QAAQ,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,2BAA2B;IACzC,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;IAC1B,SAAS,CAAC,cAAc,GAAG,EAAE,CAAC;IAC9B,SAAS,CAAC,mBAAmB,GAAG,EAAE,CAAC;AACrC,CAAC","sourcesContent":["// Lightweight event bus for data lifecycle events overlays need to react to.\n//\n// The widget modules (ohlcvIngestion, pagination, visibleRange) publish\n// events after they mutate the OHLCV series or the visible range;\n// overlay modules (tradeMarkers, positionLines) subscribe and re-place\n// their shapes. Keeps overlays decoupled from widget/* — overlays never\n// import from widget/*, matching the ESLint `no-restricted-paths`\n// direction described in the plan.\n//\n// The events are intentionally void — subscribers read whatever state\n// they need from core/state.ts. Errors inside a subscriber are logged\n// to RN so a broken overlay doesn't take the widget down with it.\n\nimport { reportErrorToRN } from './bridge.js';\n\nexport type DataLifecycleEvent =\n | 'ohlcvReset'\n | 'ohlcvPrepended'\n | 'visibleRangeChanged';\n\ntype Listener = () => void;\n\nconst listeners: Record<DataLifecycleEvent, Listener[]> = {\n ohlcvReset: [],\n ohlcvPrepended: [],\n visibleRangeChanged: [],\n};\n\nexport function onDataLifecycle(\n event: DataLifecycleEvent,\n listener: Listener,\n): () => void {\n listeners[event].push(listener);\n return () => {\n const bucket = listeners[event];\n const idx = bucket.indexOf(listener);\n if (idx !== -1) {\n bucket.splice(idx, 1);\n }\n };\n}\n\nexport function notifyDataLifecycle(event: DataLifecycleEvent): void {\n const bucket = listeners[event];\n for (const listener of bucket) {\n try {\n listener();\n } catch (error) {\n reportErrorToRN(error);\n }\n }\n}\n\n/** Test-only: clear every listener across every event. */\nexport function _resetDataLifecycleForTests(): void {\n listeners.ohlcvReset = [];\n listeners.ohlcvPrepended = [];\n listeners.visibleRangeChanged = [];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"state.cjs","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"]}
1
+ {"version":3,"file":"state.cjs","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"]}