@metamask-previews/advanced-chart-core 0.0.0-preview-e58fe0640 → 0.0.0-preview-238cb7063
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/bootstrap.cjs +185 -0
- package/dist/core/bootstrap.cjs.map +1 -0
- package/dist/core/bootstrap.d.cts +10 -0
- package/dist/core/bootstrap.d.cts.map +1 -0
- package/dist/core/bootstrap.d.mts +10 -0
- package/dist/core/bootstrap.d.mts.map +1 -0
- package/dist/core/bootstrap.mjs +181 -0
- package/dist/core/bootstrap.mjs.map +1 -0
- package/dist/core/bridge.cjs +115 -0
- package/dist/core/bridge.cjs.map +1 -0
- package/dist/core/bridge.d.cts +37 -0
- package/dist/core/bridge.d.cts.map +1 -0
- package/dist/core/bridge.d.mts +37 -0
- package/dist/core/bridge.d.mts.map +1 -0
- package/dist/core/bridge.mjs +108 -0
- package/dist/core/bridge.mjs.map +1 -0
- package/dist/core/dataLifecycle.cjs +52 -0
- package/dist/core/dataLifecycle.cjs.map +1 -0
- package/dist/core/dataLifecycle.d.cts +8 -0
- package/dist/core/dataLifecycle.d.cts.map +1 -0
- package/dist/core/dataLifecycle.d.mts +8 -0
- package/dist/core/dataLifecycle.d.mts.map +1 -0
- package/dist/core/dataLifecycle.mjs +46 -0
- package/dist/core/dataLifecycle.mjs.map +1 -0
- package/dist/core/loadLibrary.cjs +63 -0
- package/dist/core/loadLibrary.cjs.map +1 -0
- package/dist/core/loadLibrary.d.cts +16 -0
- package/dist/core/loadLibrary.d.cts.map +1 -0
- package/dist/core/loadLibrary.d.mts +16 -0
- package/dist/core/loadLibrary.d.mts.map +1 -0
- package/dist/core/loadLibrary.mjs +58 -0
- package/dist/core/loadLibrary.mjs.map +1 -0
- package/dist/core/resolution.cjs +58 -0
- package/dist/core/resolution.cjs.map +1 -0
- package/dist/core/resolution.d.cts +15 -0
- package/dist/core/resolution.d.cts.map +1 -0
- package/dist/core/resolution.d.mts +15 -0
- package/dist/core/resolution.d.mts.map +1 -0
- package/dist/core/resolution.mjs +54 -0
- package/dist/core/resolution.mjs.map +1 -0
- package/dist/core/state.cjs +343 -0
- package/dist/core/state.cjs.map +1 -0
- package/dist/core/state.d.cts +67 -0
- package/dist/core/state.d.cts.map +1 -0
- package/dist/core/state.d.mts +67 -0
- package/dist/core/state.d.mts.map +1 -0
- package/dist/core/state.mjs +283 -0
- package/dist/core/state.mjs.map +1 -0
- package/dist/core/timeUtils.cjs +72 -0
- package/dist/core/timeUtils.cjs.map +1 -0
- package/dist/core/timeUtils.d.cts +32 -0
- package/dist/core/timeUtils.d.cts.map +1 -0
- package/dist/core/timeUtils.d.mts +32 -0
- package/dist/core/timeUtils.d.mts.map +1 -0
- package/dist/core/timeUtils.mjs +66 -0
- package/dist/core/timeUtils.mjs.map +1 -0
- package/dist/core/timezone.cjs +135 -0
- package/dist/core/timezone.cjs.map +1 -0
- package/dist/core/timezone.d.cts +16 -0
- package/dist/core/timezone.d.cts.map +1 -0
- package/dist/core/timezone.d.mts +16 -0
- package/dist/core/timezone.d.mts.map +1 -0
- package/dist/core/timezone.mjs +131 -0
- package/dist/core/timezone.mjs.map +1 -0
- package/dist/core/types.cjs +20 -0
- package/dist/core/types.cjs.map +1 -0
- package/dist/core/types.d.cts +323 -0
- package/dist/core/types.d.cts.map +1 -0
- package/dist/core/types.d.mts +323 -0
- package/dist/core/types.d.mts.map +1 -0
- package/dist/core/types.mjs +17 -0
- package/dist/core/types.mjs.map +1 -0
- package/dist/features/indicators/index.cjs +183 -0
- package/dist/features/indicators/index.cjs.map +1 -0
- package/dist/features/indicators/index.d.cts +6 -0
- package/dist/features/indicators/index.d.cts.map +1 -0
- package/dist/features/indicators/index.d.mts +6 -0
- package/dist/features/indicators/index.d.mts.map +1 -0
- package/dist/features/indicators/index.mjs +177 -0
- package/dist/features/indicators/index.mjs.map +1 -0
- package/dist/features/indicators/legend.cjs +575 -0
- package/dist/features/indicators/legend.cjs.map +1 -0
- package/dist/features/indicators/legend.d.cts +40 -0
- package/dist/features/indicators/legend.d.cts.map +1 -0
- package/dist/features/indicators/legend.d.mts +40 -0
- package/dist/features/indicators/legend.d.mts.map +1 -0
- package/dist/features/indicators/legend.mjs +564 -0
- package/dist/features/indicators/legend.mjs.map +1 -0
- package/dist/features/indicators/resize.cjs +34 -0
- package/dist/features/indicators/resize.cjs.map +1 -0
- package/dist/features/indicators/resize.d.cts +2 -0
- package/dist/features/indicators/resize.d.cts.map +1 -0
- package/dist/features/indicators/resize.d.mts +2 -0
- package/dist/features/indicators/resize.d.mts.map +1 -0
- package/dist/features/indicators/resize.mjs +30 -0
- package/dist/features/indicators/resize.mjs.map +1 -0
- package/dist/features/indicators/studies.cjs +147 -0
- package/dist/features/indicators/studies.cjs.map +1 -0
- package/dist/features/indicators/studies.d.cts +36 -0
- package/dist/features/indicators/studies.d.cts.map +1 -0
- package/dist/features/indicators/studies.d.mts +36 -0
- package/dist/features/indicators/studies.d.mts.map +1 -0
- package/dist/features/indicators/studies.mjs +140 -0
- package/dist/features/indicators/studies.mjs.map +1 -0
- package/dist/features/indicators/subPane.cjs +78 -0
- package/dist/features/indicators/subPane.cjs.map +1 -0
- package/dist/features/indicators/subPane.d.cts +6 -0
- package/dist/features/indicators/subPane.d.cts.map +1 -0
- package/dist/features/indicators/subPane.d.mts +6 -0
- package/dist/features/indicators/subPane.d.mts.map +1 -0
- package/dist/features/indicators/subPane.mjs +72 -0
- package/dist/features/indicators/subPane.mjs.map +1 -0
- package/dist/features/volume/index.cjs +145 -0
- package/dist/features/volume/index.cjs.map +1 -0
- package/dist/features/volume/index.d.cts +4 -0
- package/dist/features/volume/index.d.cts.map +1 -0
- package/dist/features/volume/index.d.mts +4 -0
- package/dist/features/volume/index.d.mts.map +1 -0
- package/dist/features/volume/index.mjs +140 -0
- package/dist/features/volume/index.mjs.map +1 -0
- package/dist/index.cjs +20 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +18 -0
- package/dist/index.mjs.map +1 -0
- package/dist/interaction/crosshair.cjs +147 -0
- package/dist/interaction/crosshair.cjs.map +1 -0
- package/dist/interaction/crosshair.d.cts +21 -0
- package/dist/interaction/crosshair.d.cts.map +1 -0
- package/dist/interaction/crosshair.d.mts +21 -0
- package/dist/interaction/crosshair.d.mts.map +1 -0
- package/dist/interaction/crosshair.mjs +141 -0
- package/dist/interaction/crosshair.mjs.map +1 -0
- package/dist/interaction/visibleRange.cjs +102 -0
- package/dist/interaction/visibleRange.cjs.map +1 -0
- package/dist/interaction/visibleRange.d.cts +11 -0
- package/dist/interaction/visibleRange.d.cts.map +1 -0
- package/dist/interaction/visibleRange.d.mts +11 -0
- package/dist/interaction/visibleRange.d.mts.map +1 -0
- package/dist/interaction/visibleRange.mjs +97 -0
- package/dist/interaction/visibleRange.mjs.map +1 -0
- package/dist/messages/contract.cjs +27 -0
- package/dist/messages/contract.cjs.map +1 -0
- package/dist/messages/contract.d.cts +262 -0
- package/dist/messages/contract.d.cts.map +1 -0
- package/dist/messages/contract.d.mts +262 -0
- package/dist/messages/contract.d.mts.map +1 -0
- package/dist/messages/contract.mjs +26 -0
- package/dist/messages/contract.mjs.map +1 -0
- package/dist/messages/handler.cjs +54 -0
- package/dist/messages/handler.cjs.map +1 -0
- package/dist/messages/handler.d.cts +25 -0
- package/dist/messages/handler.d.cts.map +1 -0
- package/dist/messages/handler.d.mts +25 -0
- package/dist/messages/handler.d.mts.map +1 -0
- package/dist/messages/handler.mjs +48 -0
- package/dist/messages/handler.mjs.map +1 -0
- package/dist/overlays/focusTime/index.cjs +161 -0
- package/dist/overlays/focusTime/index.cjs.map +1 -0
- package/dist/overlays/focusTime/index.d.cts +6 -0
- package/dist/overlays/focusTime/index.d.cts.map +1 -0
- package/dist/overlays/focusTime/index.d.mts +6 -0
- package/dist/overlays/focusTime/index.d.mts.map +1 -0
- package/dist/overlays/focusTime/index.mjs +155 -0
- package/dist/overlays/focusTime/index.mjs.map +1 -0
- package/dist/overlays/positionLines/index.cjs +188 -0
- package/dist/overlays/positionLines/index.cjs.map +1 -0
- package/dist/overlays/positionLines/index.d.cts +4 -0
- package/dist/overlays/positionLines/index.d.cts.map +1 -0
- package/dist/overlays/positionLines/index.d.mts +4 -0
- package/dist/overlays/positionLines/index.d.mts.map +1 -0
- package/dist/overlays/positionLines/index.mjs +183 -0
- package/dist/overlays/positionLines/index.mjs.map +1 -0
- package/dist/overlays/positionLines/state.cjs +35 -0
- package/dist/overlays/positionLines/state.cjs.map +1 -0
- package/dist/overlays/positionLines/state.d.cts +8 -0
- package/dist/overlays/positionLines/state.d.cts.map +1 -0
- package/dist/overlays/positionLines/state.d.mts +8 -0
- package/dist/overlays/positionLines/state.d.mts.map +1 -0
- package/dist/overlays/positionLines/state.mjs +26 -0
- package/dist/overlays/positionLines/state.mjs.map +1 -0
- package/dist/overlays/socialLeaderboard/index.cjs +229 -0
- package/dist/overlays/socialLeaderboard/index.cjs.map +1 -0
- package/dist/overlays/socialLeaderboard/index.d.cts +48 -0
- package/dist/overlays/socialLeaderboard/index.d.cts.map +1 -0
- package/dist/overlays/socialLeaderboard/index.d.mts +48 -0
- package/dist/overlays/socialLeaderboard/index.d.mts.map +1 -0
- package/dist/overlays/socialLeaderboard/index.mjs +222 -0
- package/dist/overlays/socialLeaderboard/index.mjs.map +1 -0
- package/dist/overlays/tradeMarkers/animation.cjs +123 -0
- package/dist/overlays/tradeMarkers/animation.cjs.map +1 -0
- package/dist/overlays/tradeMarkers/animation.d.cts +5 -0
- package/dist/overlays/tradeMarkers/animation.d.cts.map +1 -0
- package/dist/overlays/tradeMarkers/animation.d.mts +5 -0
- package/dist/overlays/tradeMarkers/animation.d.mts.map +1 -0
- package/dist/overlays/tradeMarkers/animation.mjs +118 -0
- package/dist/overlays/tradeMarkers/animation.mjs.map +1 -0
- package/dist/overlays/tradeMarkers/index.cjs +334 -0
- package/dist/overlays/tradeMarkers/index.cjs.map +1 -0
- package/dist/overlays/tradeMarkers/index.d.cts +35 -0
- package/dist/overlays/tradeMarkers/index.d.cts.map +1 -0
- package/dist/overlays/tradeMarkers/index.d.mts +35 -0
- package/dist/overlays/tradeMarkers/index.d.mts.map +1 -0
- package/dist/overlays/tradeMarkers/index.mjs +324 -0
- package/dist/overlays/tradeMarkers/index.mjs.map +1 -0
- package/dist/overlays/tradeMarkers/markerHitTest.cjs +337 -0
- package/dist/overlays/tradeMarkers/markerHitTest.cjs.map +1 -0
- package/dist/overlays/tradeMarkers/markerHitTest.d.cts +15 -0
- package/dist/overlays/tradeMarkers/markerHitTest.d.cts.map +1 -0
- package/dist/overlays/tradeMarkers/markerHitTest.d.mts +15 -0
- package/dist/overlays/tradeMarkers/markerHitTest.d.mts.map +1 -0
- package/dist/overlays/tradeMarkers/markerHitTest.mjs +331 -0
- package/dist/overlays/tradeMarkers/markerHitTest.mjs.map +1 -0
- package/dist/overlays/tradeMarkers/state.cjs +75 -0
- package/dist/overlays/tradeMarkers/state.cjs.map +1 -0
- package/dist/overlays/tradeMarkers/state.d.cts +20 -0
- package/dist/overlays/tradeMarkers/state.d.cts.map +1 -0
- package/dist/overlays/tradeMarkers/state.d.mts +20 -0
- package/dist/overlays/tradeMarkers/state.d.mts.map +1 -0
- package/dist/overlays/tradeMarkers/state.mjs +60 -0
- package/dist/overlays/tradeMarkers/state.mjs.map +1 -0
- package/dist/pagination/priceApi.cjs +102 -0
- package/dist/pagination/priceApi.cjs.map +1 -0
- package/dist/pagination/priceApi.d.cts +43 -0
- package/dist/pagination/priceApi.d.cts.map +1 -0
- package/dist/pagination/priceApi.d.mts +43 -0
- package/dist/pagination/priceApi.d.mts.map +1 -0
- package/dist/pagination/priceApi.mjs +97 -0
- package/dist/pagination/priceApi.mjs.map +1 -0
- package/dist/pagination/rnBacked.cjs +108 -0
- package/dist/pagination/rnBacked.cjs.map +1 -0
- package/dist/pagination/rnBacked.d.cts +15 -0
- package/dist/pagination/rnBacked.d.cts.map +1 -0
- package/dist/pagination/rnBacked.d.mts +15 -0
- package/dist/pagination/rnBacked.d.mts.map +1 -0
- package/dist/pagination/rnBacked.mjs +100 -0
- package/dist/pagination/rnBacked.mjs.map +1 -0
- package/dist/widget/chartType.cjs +39 -0
- package/dist/widget/chartType.cjs.map +1 -0
- package/dist/widget/chartType.d.cts +4 -0
- package/dist/widget/chartType.d.cts.map +1 -0
- package/dist/widget/chartType.d.mts +4 -0
- package/dist/widget/chartType.d.mts.map +1 -0
- package/dist/widget/chartType.mjs +34 -0
- package/dist/widget/chartType.mjs.map +1 -0
- package/dist/widget/datafeed.cjs +228 -0
- package/dist/widget/datafeed.cjs.map +1 -0
- package/dist/widget/datafeed.d.cts +22 -0
- package/dist/widget/datafeed.d.cts.map +1 -0
- package/dist/widget/datafeed.d.mts +22 -0
- package/dist/widget/datafeed.d.mts.map +1 -0
- package/dist/widget/datafeed.mjs +223 -0
- package/dist/widget/datafeed.mjs.map +1 -0
- package/dist/widget/externalLinkBridge.cjs +134 -0
- package/dist/widget/externalLinkBridge.cjs.map +1 -0
- package/dist/widget/externalLinkBridge.d.cts +14 -0
- package/dist/widget/externalLinkBridge.d.cts.map +1 -0
- package/dist/widget/externalLinkBridge.d.mts +14 -0
- package/dist/widget/externalLinkBridge.d.mts.map +1 -0
- package/dist/widget/externalLinkBridge.mjs +127 -0
- package/dist/widget/externalLinkBridge.mjs.map +1 -0
- package/dist/widget/initChart.cjs +242 -0
- package/dist/widget/initChart.cjs.map +1 -0
- package/dist/widget/initChart.d.cts +53 -0
- package/dist/widget/initChart.d.cts.map +1 -0
- package/dist/widget/initChart.d.mts +53 -0
- package/dist/widget/initChart.d.mts.map +1 -0
- package/dist/widget/initChart.mjs +235 -0
- package/dist/widget/initChart.mjs.map +1 -0
- package/dist/widget/ohlcvIngestion.cjs +240 -0
- package/dist/widget/ohlcvIngestion.cjs.map +1 -0
- package/dist/widget/ohlcvIngestion.d.cts +16 -0
- package/dist/widget/ohlcvIngestion.d.cts.map +1 -0
- package/dist/widget/ohlcvIngestion.d.mts +16 -0
- package/dist/widget/ohlcvIngestion.d.mts.map +1 -0
- package/dist/widget/ohlcvIngestion.mjs +233 -0
- package/dist/widget/ohlcvIngestion.mjs.map +1 -0
- package/dist/widget/priceFormatter.cjs +142 -0
- package/dist/widget/priceFormatter.cjs.map +1 -0
- package/dist/widget/priceFormatter.d.cts +38 -0
- package/dist/widget/priceFormatter.d.cts.map +1 -0
- package/dist/widget/priceFormatter.d.mts +38 -0
- package/dist/widget/priceFormatter.d.mts.map +1 -0
- package/dist/widget/priceFormatter.mjs +134 -0
- package/dist/widget/priceFormatter.mjs.map +1 -0
- package/dist/widget/scaleLayout.cjs +89 -0
- package/dist/widget/scaleLayout.cjs.map +1 -0
- package/dist/widget/scaleLayout.d.cts +9 -0
- package/dist/widget/scaleLayout.d.cts.map +1 -0
- package/dist/widget/scaleLayout.d.mts +9 -0
- package/dist/widget/scaleLayout.d.mts.map +1 -0
- package/dist/widget/scaleLayout.mjs +85 -0
- package/dist/widget/scaleLayout.mjs.map +1 -0
- package/dist/widget/theme.cjs +286 -0
- package/dist/widget/theme.cjs.map +1 -0
- package/dist/widget/theme.d.cts +99 -0
- package/dist/widget/theme.d.cts.map +1 -0
- package/dist/widget/theme.d.mts +99 -0
- package/dist/widget/theme.d.mts.map +1 -0
- package/dist/widget/theme.mjs +270 -0
- package/dist/widget/theme.mjs.map +1 -0
- package/dist/widget/tvDomHelpers.cjs +65 -0
- package/dist/widget/tvDomHelpers.cjs.map +1 -0
- package/dist/widget/tvDomHelpers.d.cts +19 -0
- package/dist/widget/tvDomHelpers.d.cts.map +1 -0
- package/dist/widget/tvDomHelpers.d.mts +19 -0
- package/dist/widget/tvDomHelpers.d.mts.map +1 -0
- package/dist/widget/tvDomHelpers.mjs +60 -0
- package/dist/widget/tvDomHelpers.mjs.map +1 -0
- package/dist/widget/visualOverrides.cjs +63 -0
- package/dist/widget/visualOverrides.cjs.map +1 -0
- package/dist/widget/visualOverrides.d.cts +27 -0
- package/dist/widget/visualOverrides.d.cts.map +1 -0
- package/dist/widget/visualOverrides.d.mts +27 -0
- package/dist/widget/visualOverrides.d.mts.map +1 -0
- package/dist/widget/visualOverrides.mjs +58 -0
- package/dist/widget/visualOverrides.mjs.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { InboundMessage, OutboundMessageType, OutboundPayloads } from "../messages/contract.mjs";
|
|
2
|
+
export declare function safeStringify(value: unknown): string;
|
|
3
|
+
/**
|
|
4
|
+
* Posts a typed message to React Native via window.ReactNativeWebView.
|
|
5
|
+
* Equivalent to legacy `sendToReactNative(type, payload)` at chartLogic.js
|
|
6
|
+
* line ~98. Silently no-ops when window.ReactNativeWebView is absent (e.g.
|
|
7
|
+
* during unit tests in a jsdom environment without the RN bridge stub).
|
|
8
|
+
*
|
|
9
|
+
* @param type - The outbound message type tag.
|
|
10
|
+
* @param payload - The payload associated with the message type.
|
|
11
|
+
*/
|
|
12
|
+
export declare function postToRN<Type extends OutboundMessageType>(type: Type, payload: OutboundPayloads[Type]): void;
|
|
13
|
+
/**
|
|
14
|
+
* Reports a runtime error to React Native via the ERROR channel. Matches the
|
|
15
|
+
* legacy `sendToReactNative('ERROR', { message })` pattern used throughout
|
|
16
|
+
* chartLogic.js.
|
|
17
|
+
*
|
|
18
|
+
* @param error - The error (or arbitrary thrown value) to report.
|
|
19
|
+
*/
|
|
20
|
+
export declare function reportErrorToRN(error: unknown): void;
|
|
21
|
+
export type InboundMessageHandler = (message: InboundMessage) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Registers a single inbound listener. React Native posts JSON strings via
|
|
24
|
+
* webView.postMessage; the WebView receives them on window 'message' on iOS
|
|
25
|
+
* and document 'message' on Android (see chartLogic.js line ~400). We
|
|
26
|
+
* subscribe to both so consumers don't have to.
|
|
27
|
+
*
|
|
28
|
+
* The returned function unsubscribes — useful for tests; the real bundle
|
|
29
|
+
* subscribes once at bootstrap and never unsubscribes.
|
|
30
|
+
*
|
|
31
|
+
* @param handler - Callback invoked with each well-formed inbound message.
|
|
32
|
+
* @returns A function that removes the registered listeners.
|
|
33
|
+
*/
|
|
34
|
+
export declare function onFromRN(handler: InboundMessageHandler): () => void;
|
|
35
|
+
/** Re-export for callers that want the type tag union. */
|
|
36
|
+
export type { InboundMessageType } from "../messages/contract.mjs";
|
|
37
|
+
//# sourceMappingURL=bridge.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.mts","sourceRoot":"","sources":["../../src/core/bridge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EACjB,iCAAgC;AAEjC,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,SAAS,mBAAmB,EACvD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,GAC9B,IAAI,CAWN;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAUpD;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAEtE;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI,CAwCnE;AAED,0DAA0D;AAC1D,YAAY,EAAE,kBAAkB,EAAE,iCAAgC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Typed bridge between the WebView IIFE and React Native.
|
|
2
|
+
//
|
|
3
|
+
// Wraps the same window.ReactNativeWebView.postMessage(...) call shape that
|
|
4
|
+
// legacy chartLogic.js's sendToReactNative() uses, so the RN-side
|
|
5
|
+
// parseWebViewMessage in AdvancedChart.types.ts decodes our messages without
|
|
6
|
+
// any change to its consumers.
|
|
7
|
+
export function safeStringify(value) {
|
|
8
|
+
try {
|
|
9
|
+
return JSON.stringify(value) ?? 'Unknown error';
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return String(value);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Posts a typed message to React Native via window.ReactNativeWebView.
|
|
17
|
+
* Equivalent to legacy `sendToReactNative(type, payload)` at chartLogic.js
|
|
18
|
+
* line ~98. Silently no-ops when window.ReactNativeWebView is absent (e.g.
|
|
19
|
+
* during unit tests in a jsdom environment without the RN bridge stub).
|
|
20
|
+
*
|
|
21
|
+
* @param type - The outbound message type tag.
|
|
22
|
+
* @param payload - The payload associated with the message type.
|
|
23
|
+
*/
|
|
24
|
+
export function postToRN(type, payload) {
|
|
25
|
+
const bridge = window.ReactNativeWebView;
|
|
26
|
+
if (!bridge) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
bridge.postMessage(JSON.stringify({ type, payload }));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// postMessage / JSON.stringify failure: nothing to do — the WebView
|
|
34
|
+
// cannot inform RN of its own bridge failure.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Reports a runtime error to React Native via the ERROR channel. Matches the
|
|
39
|
+
* legacy `sendToReactNative('ERROR', { message })` pattern used throughout
|
|
40
|
+
* chartLogic.js.
|
|
41
|
+
*
|
|
42
|
+
* @param error - The error (or arbitrary thrown value) to report.
|
|
43
|
+
*/
|
|
44
|
+
export function reportErrorToRN(error) {
|
|
45
|
+
let message;
|
|
46
|
+
if (error instanceof Error) {
|
|
47
|
+
message = error.message;
|
|
48
|
+
}
|
|
49
|
+
else if (typeof error === 'string') {
|
|
50
|
+
message = error;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
message = safeStringify(error);
|
|
54
|
+
}
|
|
55
|
+
postToRN('ERROR', { message });
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Registers a single inbound listener. React Native posts JSON strings via
|
|
59
|
+
* webView.postMessage; the WebView receives them on window 'message' on iOS
|
|
60
|
+
* and document 'message' on Android (see chartLogic.js line ~400). We
|
|
61
|
+
* subscribe to both so consumers don't have to.
|
|
62
|
+
*
|
|
63
|
+
* The returned function unsubscribes — useful for tests; the real bundle
|
|
64
|
+
* subscribes once at bootstrap and never unsubscribes.
|
|
65
|
+
*
|
|
66
|
+
* @param handler - Callback invoked with each well-formed inbound message.
|
|
67
|
+
* @returns A function that removes the registered listeners.
|
|
68
|
+
*/
|
|
69
|
+
export function onFromRN(handler) {
|
|
70
|
+
const dispatch = (event) => {
|
|
71
|
+
// RN WebView inline HTML: native bridge messages arrive with an empty
|
|
72
|
+
// or "null" origin. Reject messages from real web origins.
|
|
73
|
+
const { origin } = event;
|
|
74
|
+
if (origin && origin !== 'null' && !origin.startsWith('file:')) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
let parsed;
|
|
78
|
+
try {
|
|
79
|
+
parsed =
|
|
80
|
+
typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
|
|
81
|
+
}
|
|
82
|
+
catch (parseError) {
|
|
83
|
+
reportErrorToRN(parseError);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const candidate = parsed;
|
|
90
|
+
if (typeof candidate.type !== 'string') {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Trusting the type narrowing here is fine because messages/handler.ts
|
|
94
|
+
// re-validates via a switch on candidate.type before dispatching to a
|
|
95
|
+
// typed handler. Phase 1 only routes SET_THEME_COLORS, but the listener
|
|
96
|
+
// forwards every well-formed message so the handler can decide.
|
|
97
|
+
handler(parsed);
|
|
98
|
+
};
|
|
99
|
+
// iOS posts arrive on window; Android posts arrive on document. Subscribe
|
|
100
|
+
// to both to match legacy chartLogic.js handleMessage wiring.
|
|
101
|
+
window.addEventListener('message', dispatch);
|
|
102
|
+
document.addEventListener('message', dispatch);
|
|
103
|
+
return () => {
|
|
104
|
+
window.removeEventListener('message', dispatch);
|
|
105
|
+
document.removeEventListener('message', dispatch);
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=bridge.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.mjs","sourceRoot":"","sources":["../../src/core/bridge.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,4EAA4E;AAC5E,kEAAkE;AAClE,6EAA6E;AAC7E,+BAA+B;AAQ/B,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CACtB,IAAU,EACV,OAA+B;IAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;QACpE,8CAA8C;IAChD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,OAAe,CAAC;IACpB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AACjC,CAAC;AAID;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CAAC,OAA8B;IACrD,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAQ,EAAE;QAC7C,sEAAsE;QACtE,2DAA2D;QAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QACzB,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM;gBACJ,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACzE,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,eAAe,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,MAA4B,CAAC;QAC/C,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QACD,uEAAuE;QACvE,sEAAsE;QACtE,wEAAwE;QACxE,gEAAgE;QAChE,OAAO,CAAC,MAAwB,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAyB,CAAC,CAAC;IAC9D,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAyB,CAAC,CAAC;IAEhE,OAAO,GAAG,EAAE;QACV,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAyB,CAAC,CAAC;QACjE,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAyB,CAAC,CAAC;IACrE,CAAC,CAAC;AACJ,CAAC","sourcesContent":["// Typed bridge between the WebView IIFE and React Native.\n//\n// Wraps the same window.ReactNativeWebView.postMessage(...) call shape that\n// legacy chartLogic.js's sendToReactNative() uses, so the RN-side\n// parseWebViewMessage in AdvancedChart.types.ts decodes our messages without\n// any change to its consumers.\n\nimport type {\n InboundMessage,\n OutboundMessageType,\n OutboundPayloads,\n} from '../messages/contract.js';\n\nexport function safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? 'Unknown error';\n } catch {\n return String(value);\n }\n}\n\n/**\n * Posts a typed message to React Native via window.ReactNativeWebView.\n * Equivalent to legacy `sendToReactNative(type, payload)` at chartLogic.js\n * line ~98. Silently no-ops when window.ReactNativeWebView is absent (e.g.\n * during unit tests in a jsdom environment without the RN bridge stub).\n *\n * @param type - The outbound message type tag.\n * @param payload - The payload associated with the message type.\n */\nexport function postToRN<Type extends OutboundMessageType>(\n type: Type,\n payload: OutboundPayloads[Type],\n): void {\n const bridge = window.ReactNativeWebView;\n if (!bridge) {\n return;\n }\n try {\n bridge.postMessage(JSON.stringify({ type, payload }));\n } catch {\n // postMessage / JSON.stringify failure: nothing to do — the WebView\n // cannot inform RN of its own bridge failure.\n }\n}\n\n/**\n * Reports a runtime error to React Native via the ERROR channel. Matches the\n * legacy `sendToReactNative('ERROR', { message })` pattern used throughout\n * chartLogic.js.\n *\n * @param error - The error (or arbitrary thrown value) to report.\n */\nexport function reportErrorToRN(error: unknown): void {\n let message: string;\n if (error instanceof Error) {\n message = error.message;\n } else if (typeof error === 'string') {\n message = error;\n } else {\n message = safeStringify(error);\n }\n postToRN('ERROR', { message });\n}\n\nexport type InboundMessageHandler = (message: InboundMessage) => void;\n\n/**\n * Registers a single inbound listener. React Native posts JSON strings via\n * webView.postMessage; the WebView receives them on window 'message' on iOS\n * and document 'message' on Android (see chartLogic.js line ~400). We\n * subscribe to both so consumers don't have to.\n *\n * The returned function unsubscribes — useful for tests; the real bundle\n * subscribes once at bootstrap and never unsubscribes.\n *\n * @param handler - Callback invoked with each well-formed inbound message.\n * @returns A function that removes the registered listeners.\n */\nexport function onFromRN(handler: InboundMessageHandler): () => void {\n const dispatch = (event: MessageEvent): void => {\n // RN WebView inline HTML: native bridge messages arrive with an empty\n // or \"null\" origin. Reject messages from real web origins.\n const { origin } = event;\n if (origin && origin !== 'null' && !origin.startsWith('file:')) {\n return;\n }\n\n let parsed: unknown;\n try {\n parsed =\n typeof event.data === 'string' ? JSON.parse(event.data) : event.data;\n } catch (parseError) {\n reportErrorToRN(parseError);\n return;\n }\n if (!parsed || typeof parsed !== 'object') {\n return;\n }\n const candidate = parsed as { type?: unknown };\n if (typeof candidate.type !== 'string') {\n return;\n }\n // Trusting the type narrowing here is fine because messages/handler.ts\n // re-validates via a switch on candidate.type before dispatching to a\n // typed handler. Phase 1 only routes SET_THEME_COLORS, but the listener\n // forwards every well-formed message so the handler can decide.\n handler(parsed as InboundMessage);\n };\n\n // iOS posts arrive on window; Android posts arrive on document. Subscribe\n // to both to match legacy chartLogic.js handleMessage wiring.\n window.addEventListener('message', dispatch as EventListener);\n document.addEventListener('message', dispatch as EventListener);\n\n return () => {\n window.removeEventListener('message', dispatch as EventListener);\n document.removeEventListener('message', dispatch as EventListener);\n };\n}\n\n/** Re-export for callers that want the type tag union. */\nexport type { InboundMessageType } from '../messages/contract.js';\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Lightweight event bus for data lifecycle events overlays need to react to.
|
|
3
|
+
//
|
|
4
|
+
// The widget modules (ohlcvIngestion, pagination, visibleRange) publish
|
|
5
|
+
// events after they mutate the OHLCV series or the visible range;
|
|
6
|
+
// overlay modules (tradeMarkers, positionLines) subscribe and re-place
|
|
7
|
+
// their shapes. Keeps overlays decoupled from widget/* — overlays never
|
|
8
|
+
// import from widget/*, matching the ESLint `no-restricted-paths`
|
|
9
|
+
// direction described in the plan.
|
|
10
|
+
//
|
|
11
|
+
// The events are intentionally void — subscribers read whatever state
|
|
12
|
+
// they need from core/state.ts. Errors inside a subscriber are logged
|
|
13
|
+
// to RN so a broken overlay doesn't take the widget down with it.
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports._resetDataLifecycleForTests = exports.notifyDataLifecycle = exports.onDataLifecycle = void 0;
|
|
16
|
+
const bridge_js_1 = require("./bridge.cjs");
|
|
17
|
+
const listeners = {
|
|
18
|
+
ohlcvReset: [],
|
|
19
|
+
ohlcvPrepended: [],
|
|
20
|
+
visibleRangeChanged: [],
|
|
21
|
+
};
|
|
22
|
+
function onDataLifecycle(event, listener) {
|
|
23
|
+
listeners[event].push(listener);
|
|
24
|
+
return () => {
|
|
25
|
+
const bucket = listeners[event];
|
|
26
|
+
const idx = bucket.indexOf(listener);
|
|
27
|
+
if (idx !== -1) {
|
|
28
|
+
bucket.splice(idx, 1);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
exports.onDataLifecycle = onDataLifecycle;
|
|
33
|
+
function notifyDataLifecycle(event) {
|
|
34
|
+
const bucket = listeners[event];
|
|
35
|
+
for (const listener of bucket) {
|
|
36
|
+
try {
|
|
37
|
+
listener();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
(0, bridge_js_1.reportErrorToRN)(error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.notifyDataLifecycle = notifyDataLifecycle;
|
|
45
|
+
/** Test-only: clear every listener across every event. */
|
|
46
|
+
function _resetDataLifecycleForTests() {
|
|
47
|
+
listeners.ohlcvReset = [];
|
|
48
|
+
listeners.ohlcvPrepended = [];
|
|
49
|
+
listeners.visibleRangeChanged = [];
|
|
50
|
+
}
|
|
51
|
+
exports._resetDataLifecycleForTests = _resetDataLifecycleForTests;
|
|
52
|
+
//# sourceMappingURL=dataLifecycle.cjs.map
|
|
@@ -0,0 +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;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"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type DataLifecycleEvent = 'ohlcvReset' | 'ohlcvPrepended' | 'visibleRangeChanged';
|
|
2
|
+
type Listener = () => void;
|
|
3
|
+
export declare function onDataLifecycle(event: DataLifecycleEvent, listener: Listener): () => void;
|
|
4
|
+
export declare function notifyDataLifecycle(event: DataLifecycleEvent): void;
|
|
5
|
+
/** Test-only: clear every listener across every event. */
|
|
6
|
+
export declare function _resetDataLifecycleForTests(): void;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=dataLifecycle.d.cts.map
|
|
@@ -0,0 +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,CASZ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CASnE;AAED,0DAA0D;AAC1D,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type DataLifecycleEvent = 'ohlcvReset' | 'ohlcvPrepended' | 'visibleRangeChanged';
|
|
2
|
+
type Listener = () => void;
|
|
3
|
+
export declare function onDataLifecycle(event: DataLifecycleEvent, listener: Listener): () => void;
|
|
4
|
+
export declare function notifyDataLifecycle(event: DataLifecycleEvent): void;
|
|
5
|
+
/** Test-only: clear every listener across every event. */
|
|
6
|
+
export declare function _resetDataLifecycleForTests(): void;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=dataLifecycle.d.mts.map
|
|
@@ -0,0 +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,CASZ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CASnE;AAED,0DAA0D;AAC1D,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Lightweight event bus for data lifecycle events overlays need to react to.
|
|
2
|
+
//
|
|
3
|
+
// The widget modules (ohlcvIngestion, pagination, visibleRange) publish
|
|
4
|
+
// events after they mutate the OHLCV series or the visible range;
|
|
5
|
+
// overlay modules (tradeMarkers, positionLines) subscribe and re-place
|
|
6
|
+
// their shapes. Keeps overlays decoupled from widget/* — overlays never
|
|
7
|
+
// import from widget/*, matching the ESLint `no-restricted-paths`
|
|
8
|
+
// direction described in the plan.
|
|
9
|
+
//
|
|
10
|
+
// The events are intentionally void — subscribers read whatever state
|
|
11
|
+
// they need from core/state.ts. Errors inside a subscriber are logged
|
|
12
|
+
// to RN so a broken overlay doesn't take the widget down with it.
|
|
13
|
+
import { reportErrorToRN } from "./bridge.mjs";
|
|
14
|
+
const listeners = {
|
|
15
|
+
ohlcvReset: [],
|
|
16
|
+
ohlcvPrepended: [],
|
|
17
|
+
visibleRangeChanged: [],
|
|
18
|
+
};
|
|
19
|
+
export function onDataLifecycle(event, listener) {
|
|
20
|
+
listeners[event].push(listener);
|
|
21
|
+
return () => {
|
|
22
|
+
const bucket = listeners[event];
|
|
23
|
+
const idx = bucket.indexOf(listener);
|
|
24
|
+
if (idx !== -1) {
|
|
25
|
+
bucket.splice(idx, 1);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function notifyDataLifecycle(event) {
|
|
30
|
+
const bucket = listeners[event];
|
|
31
|
+
for (const listener of bucket) {
|
|
32
|
+
try {
|
|
33
|
+
listener();
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
reportErrorToRN(error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Test-only: clear every listener across every event. */
|
|
41
|
+
export function _resetDataLifecycleForTests() {
|
|
42
|
+
listeners.ohlcvReset = [];
|
|
43
|
+
listeners.ohlcvPrepended = [];
|
|
44
|
+
listeners.visibleRangeChanged = [];
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=dataLifecycle.mjs.map
|
|
@@ -0,0 +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;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"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Loads the TradingView Advanced Charts library from window.CONFIG.libraryUrl
|
|
3
|
+
// by injecting a <script> tag into the document head.
|
|
4
|
+
//
|
|
5
|
+
// Mirrors legacy chartLogic.js `loadLibrary()` (lines ~5211-5237) but returns
|
|
6
|
+
// a Promise so callers can `await` library readiness in bootstrap.ts.
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports._resetLoadLibraryForTests = exports.loadTradingViewLibrary = void 0;
|
|
9
|
+
const bridge_js_1 = require("./bridge.cjs");
|
|
10
|
+
const state_js_1 = require("./state.cjs");
|
|
11
|
+
const CHARTING_LIBRARY_FILE = 'charting_library.js';
|
|
12
|
+
let inflightPromise = null;
|
|
13
|
+
/**
|
|
14
|
+
* Loads the TradingView library script. Subsequent calls resolve immediately
|
|
15
|
+
* if the library is already loaded; rejected if a previous load failed.
|
|
16
|
+
* Concurrent calls while the script is still loading share the same promise.
|
|
17
|
+
*
|
|
18
|
+
* @param libraryUrl - Base URL that the `charting_library.js` file is appended to.
|
|
19
|
+
* @returns A promise that resolves once the library script has loaded.
|
|
20
|
+
*/
|
|
21
|
+
function loadTradingViewLibrary(libraryUrl) {
|
|
22
|
+
if ((0, state_js_1.isLibraryLoaded)()) {
|
|
23
|
+
return Promise.resolve();
|
|
24
|
+
}
|
|
25
|
+
const existingError = (0, state_js_1.getLibraryError)();
|
|
26
|
+
if (existingError) {
|
|
27
|
+
return Promise.reject(new Error(existingError));
|
|
28
|
+
}
|
|
29
|
+
if (inflightPromise) {
|
|
30
|
+
return inflightPromise;
|
|
31
|
+
}
|
|
32
|
+
inflightPromise = new Promise((resolve, reject) => {
|
|
33
|
+
const scriptUrl = libraryUrl + CHARTING_LIBRARY_FILE;
|
|
34
|
+
const script = document.createElement('script');
|
|
35
|
+
script.type = 'text/javascript';
|
|
36
|
+
script.src = scriptUrl;
|
|
37
|
+
script.onload = () => {
|
|
38
|
+
(0, state_js_1.setLibraryLoaded)(true);
|
|
39
|
+
inflightPromise = null;
|
|
40
|
+
resolve();
|
|
41
|
+
};
|
|
42
|
+
script.onerror = () => {
|
|
43
|
+
const message = `Failed to load TradingView library. URL: ${scriptUrl}`;
|
|
44
|
+
(0, state_js_1.setLibraryError)(message);
|
|
45
|
+
inflightPromise = null;
|
|
46
|
+
(0, bridge_js_1.reportErrorToRN)(message);
|
|
47
|
+
reject(new Error(message));
|
|
48
|
+
};
|
|
49
|
+
document.head.appendChild(script);
|
|
50
|
+
});
|
|
51
|
+
return inflightPromise;
|
|
52
|
+
}
|
|
53
|
+
exports.loadTradingViewLibrary = loadTradingViewLibrary;
|
|
54
|
+
/**
|
|
55
|
+
* Resets the cached in-flight library-load promise.
|
|
56
|
+
*
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
function _resetLoadLibraryForTests() {
|
|
60
|
+
inflightPromise = null;
|
|
61
|
+
}
|
|
62
|
+
exports._resetLoadLibraryForTests = _resetLoadLibraryForTests;
|
|
63
|
+
//# sourceMappingURL=loadLibrary.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadLibrary.cjs","sourceRoot":"","sources":["../../src/core/loadLibrary.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,sDAAsD;AACtD,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;;;AAEtE,4CAA8C;AAC9C,0CAKoB;AAEpB,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAEpD,IAAI,eAAe,GAAyB,IAAI,CAAC;AAEjD;;;;;;;GAOG;AACH,SAAgB,sBAAsB,CAAC,UAAkB;IACvD,IAAI,IAAA,0BAAe,GAAE,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,aAAa,GAAG,IAAA,0BAAe,GAAE,CAAC;IACxC,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,eAAe,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtD,MAAM,SAAS,GAAG,UAAU,GAAG,qBAAqB,CAAC;QACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAChC,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;QACvB,MAAM,CAAC,MAAM,GAAG,GAAS,EAAE;YACzB,IAAA,2BAAgB,EAAC,IAAI,CAAC,CAAC;YACvB,eAAe,GAAG,IAAI,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,CAAC,OAAO,GAAG,GAAS,EAAE;YAC1B,MAAM,OAAO,GAAG,4CAA4C,SAAS,EAAE,CAAC;YACxE,IAAA,0BAAe,EAAC,OAAO,CAAC,CAAC;YACzB,eAAe,GAAG,IAAI,CAAC;YACvB,IAAA,2BAAe,EAAC,OAAO,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,OAAO,eAAe,CAAC;AACzB,CAAC;AAhCD,wDAgCC;AAED;;;;GAIG;AACH,SAAgB,yBAAyB;IACvC,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAFD,8DAEC","sourcesContent":["// Loads the TradingView Advanced Charts library from window.CONFIG.libraryUrl\n// by injecting a <script> tag into the document head.\n//\n// Mirrors legacy chartLogic.js `loadLibrary()` (lines ~5211-5237) but returns\n// a Promise so callers can `await` library readiness in bootstrap.ts.\n\nimport { reportErrorToRN } from './bridge.js';\nimport {\n setLibraryLoaded,\n setLibraryError,\n isLibraryLoaded,\n getLibraryError,\n} from './state.js';\n\nconst CHARTING_LIBRARY_FILE = 'charting_library.js';\n\nlet inflightPromise: Promise<void> | null = null;\n\n/**\n * Loads the TradingView library script. Subsequent calls resolve immediately\n * if the library is already loaded; rejected if a previous load failed.\n * Concurrent calls while the script is still loading share the same promise.\n *\n * @param libraryUrl - Base URL that the `charting_library.js` file is appended to.\n * @returns A promise that resolves once the library script has loaded.\n */\nexport function loadTradingViewLibrary(libraryUrl: string): Promise<void> {\n if (isLibraryLoaded()) {\n return Promise.resolve();\n }\n const existingError = getLibraryError();\n if (existingError) {\n return Promise.reject(new Error(existingError));\n }\n if (inflightPromise) {\n return inflightPromise;\n }\n\n inflightPromise = new Promise<void>((resolve, reject) => {\n const scriptUrl = libraryUrl + CHARTING_LIBRARY_FILE;\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = scriptUrl;\n script.onload = (): void => {\n setLibraryLoaded(true);\n inflightPromise = null;\n resolve();\n };\n script.onerror = (): void => {\n const message = `Failed to load TradingView library. URL: ${scriptUrl}`;\n setLibraryError(message);\n inflightPromise = null;\n reportErrorToRN(message);\n reject(new Error(message));\n };\n document.head.appendChild(script);\n });\n return inflightPromise;\n}\n\n/**\n * Resets the cached in-flight library-load promise.\n *\n * @internal\n */\nexport function _resetLoadLibraryForTests(): void {\n inflightPromise = null;\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads the TradingView library script. Subsequent calls resolve immediately
|
|
3
|
+
* if the library is already loaded; rejected if a previous load failed.
|
|
4
|
+
* Concurrent calls while the script is still loading share the same promise.
|
|
5
|
+
*
|
|
6
|
+
* @param libraryUrl - Base URL that the `charting_library.js` file is appended to.
|
|
7
|
+
* @returns A promise that resolves once the library script has loaded.
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadTradingViewLibrary(libraryUrl: string): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Resets the cached in-flight library-load promise.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export declare function _resetLoadLibraryForTests(): void;
|
|
16
|
+
//# sourceMappingURL=loadLibrary.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadLibrary.d.cts","sourceRoot":"","sources":["../../src/core/loadLibrary.ts"],"names":[],"mappings":"AAkBA;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCxE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads the TradingView library script. Subsequent calls resolve immediately
|
|
3
|
+
* if the library is already loaded; rejected if a previous load failed.
|
|
4
|
+
* Concurrent calls while the script is still loading share the same promise.
|
|
5
|
+
*
|
|
6
|
+
* @param libraryUrl - Base URL that the `charting_library.js` file is appended to.
|
|
7
|
+
* @returns A promise that resolves once the library script has loaded.
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadTradingViewLibrary(libraryUrl: string): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Resets the cached in-flight library-load promise.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export declare function _resetLoadLibraryForTests(): void;
|
|
16
|
+
//# sourceMappingURL=loadLibrary.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadLibrary.d.mts","sourceRoot":"","sources":["../../src/core/loadLibrary.ts"],"names":[],"mappings":"AAkBA;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCxE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Loads the TradingView Advanced Charts library from window.CONFIG.libraryUrl
|
|
2
|
+
// by injecting a <script> tag into the document head.
|
|
3
|
+
//
|
|
4
|
+
// Mirrors legacy chartLogic.js `loadLibrary()` (lines ~5211-5237) but returns
|
|
5
|
+
// a Promise so callers can `await` library readiness in bootstrap.ts.
|
|
6
|
+
import { reportErrorToRN } from "./bridge.mjs";
|
|
7
|
+
import { setLibraryLoaded, setLibraryError, isLibraryLoaded, getLibraryError } from "./state.mjs";
|
|
8
|
+
const CHARTING_LIBRARY_FILE = 'charting_library.js';
|
|
9
|
+
let inflightPromise = null;
|
|
10
|
+
/**
|
|
11
|
+
* Loads the TradingView library script. Subsequent calls resolve immediately
|
|
12
|
+
* if the library is already loaded; rejected if a previous load failed.
|
|
13
|
+
* Concurrent calls while the script is still loading share the same promise.
|
|
14
|
+
*
|
|
15
|
+
* @param libraryUrl - Base URL that the `charting_library.js` file is appended to.
|
|
16
|
+
* @returns A promise that resolves once the library script has loaded.
|
|
17
|
+
*/
|
|
18
|
+
export function loadTradingViewLibrary(libraryUrl) {
|
|
19
|
+
if (isLibraryLoaded()) {
|
|
20
|
+
return Promise.resolve();
|
|
21
|
+
}
|
|
22
|
+
const existingError = getLibraryError();
|
|
23
|
+
if (existingError) {
|
|
24
|
+
return Promise.reject(new Error(existingError));
|
|
25
|
+
}
|
|
26
|
+
if (inflightPromise) {
|
|
27
|
+
return inflightPromise;
|
|
28
|
+
}
|
|
29
|
+
inflightPromise = new Promise((resolve, reject) => {
|
|
30
|
+
const scriptUrl = libraryUrl + CHARTING_LIBRARY_FILE;
|
|
31
|
+
const script = document.createElement('script');
|
|
32
|
+
script.type = 'text/javascript';
|
|
33
|
+
script.src = scriptUrl;
|
|
34
|
+
script.onload = () => {
|
|
35
|
+
setLibraryLoaded(true);
|
|
36
|
+
inflightPromise = null;
|
|
37
|
+
resolve();
|
|
38
|
+
};
|
|
39
|
+
script.onerror = () => {
|
|
40
|
+
const message = `Failed to load TradingView library. URL: ${scriptUrl}`;
|
|
41
|
+
setLibraryError(message);
|
|
42
|
+
inflightPromise = null;
|
|
43
|
+
reportErrorToRN(message);
|
|
44
|
+
reject(new Error(message));
|
|
45
|
+
};
|
|
46
|
+
document.head.appendChild(script);
|
|
47
|
+
});
|
|
48
|
+
return inflightPromise;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resets the cached in-flight library-load promise.
|
|
52
|
+
*
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
export function _resetLoadLibraryForTests() {
|
|
56
|
+
inflightPromise = null;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=loadLibrary.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadLibrary.mjs","sourceRoot":"","sources":["../../src/core/loadLibrary.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sDAAsD;AACtD,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AAEtE,OAAO,EAAE,eAAe,EAAE,qBAAoB;AAC9C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EAChB,oBAAmB;AAEpB,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAEpD,IAAI,eAAe,GAAyB,IAAI,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,aAAa,GAAG,eAAe,EAAE,CAAC;IACxC,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,eAAe,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtD,MAAM,SAAS,GAAG,UAAU,GAAG,qBAAqB,CAAC;QACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAChC,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;QACvB,MAAM,CAAC,MAAM,GAAG,GAAS,EAAE;YACzB,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,eAAe,GAAG,IAAI,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,CAAC,OAAO,GAAG,GAAS,EAAE;YAC1B,MAAM,OAAO,GAAG,4CAA4C,SAAS,EAAE,CAAC;YACxE,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,eAAe,GAAG,IAAI,CAAC;YACvB,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB;IACvC,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC","sourcesContent":["// Loads the TradingView Advanced Charts library from window.CONFIG.libraryUrl\n// by injecting a <script> tag into the document head.\n//\n// Mirrors legacy chartLogic.js `loadLibrary()` (lines ~5211-5237) but returns\n// a Promise so callers can `await` library readiness in bootstrap.ts.\n\nimport { reportErrorToRN } from './bridge.js';\nimport {\n setLibraryLoaded,\n setLibraryError,\n isLibraryLoaded,\n getLibraryError,\n} from './state.js';\n\nconst CHARTING_LIBRARY_FILE = 'charting_library.js';\n\nlet inflightPromise: Promise<void> | null = null;\n\n/**\n * Loads the TradingView library script. Subsequent calls resolve immediately\n * if the library is already loaded; rejected if a previous load failed.\n * Concurrent calls while the script is still loading share the same promise.\n *\n * @param libraryUrl - Base URL that the `charting_library.js` file is appended to.\n * @returns A promise that resolves once the library script has loaded.\n */\nexport function loadTradingViewLibrary(libraryUrl: string): Promise<void> {\n if (isLibraryLoaded()) {\n return Promise.resolve();\n }\n const existingError = getLibraryError();\n if (existingError) {\n return Promise.reject(new Error(existingError));\n }\n if (inflightPromise) {\n return inflightPromise;\n }\n\n inflightPromise = new Promise<void>((resolve, reject) => {\n const scriptUrl = libraryUrl + CHARTING_LIBRARY_FILE;\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = scriptUrl;\n script.onload = (): void => {\n setLibraryLoaded(true);\n inflightPromise = null;\n resolve();\n };\n script.onerror = (): void => {\n const message = `Failed to load TradingView library. URL: ${scriptUrl}`;\n setLibraryError(message);\n inflightPromise = null;\n reportErrorToRN(message);\n reject(new Error(message));\n };\n document.head.appendChild(script);\n });\n return inflightPromise;\n}\n\n/**\n * Resets the cached in-flight library-load promise.\n *\n * @internal\n */\nexport function _resetLoadLibraryForTests(): void {\n inflightPromise = null;\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Maps OHLCV bar intervals (milliseconds) to TradingView resolution strings.
|
|
3
|
+
//
|
|
4
|
+
// Ported verbatim from chartLogic.js INTERVAL_MS_TO_TV + detectResolution
|
|
5
|
+
// (lines ~463-505). Phase 2 consumes this from widget/ohlcvIngestion.ts.
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.detectResolution = exports.INTERVAL_MS_TO_TV = void 0;
|
|
8
|
+
/** OHLCV bar interval in milliseconds → TradingView resolution code. */
|
|
9
|
+
exports.INTERVAL_MS_TO_TV = {
|
|
10
|
+
60000: '1',
|
|
11
|
+
180000: '3',
|
|
12
|
+
300000: '5',
|
|
13
|
+
900000: '15',
|
|
14
|
+
1800000: '30',
|
|
15
|
+
3600000: '60',
|
|
16
|
+
7200000: '120',
|
|
17
|
+
14400000: '240',
|
|
18
|
+
28800000: '480',
|
|
19
|
+
43200000: '720',
|
|
20
|
+
86400000: '1D',
|
|
21
|
+
259200000: '3D',
|
|
22
|
+
604800000: '1W',
|
|
23
|
+
2592000000: '1M',
|
|
24
|
+
};
|
|
25
|
+
const DEFAULT_RESOLUTION = '5';
|
|
26
|
+
/**
|
|
27
|
+
* Picks the closest matching TV resolution for an OHLCV bar series.
|
|
28
|
+
* Uses the median diff over the first few bars so a single gap doesn't skew
|
|
29
|
+
* the result (matches legacy chartLogic.js detectResolution semantics).
|
|
30
|
+
*
|
|
31
|
+
* @param data - The OHLCV bar series (each bar carries a `time` in ms).
|
|
32
|
+
* @returns The closest matching TradingView resolution.
|
|
33
|
+
*/
|
|
34
|
+
function detectResolution(data) {
|
|
35
|
+
if (data.length < 2) {
|
|
36
|
+
return DEFAULT_RESOLUTION;
|
|
37
|
+
}
|
|
38
|
+
const sampleCount = Math.min(data.length - 1, 10);
|
|
39
|
+
const diffs = [];
|
|
40
|
+
for (let i = 0; i < sampleCount; i++) {
|
|
41
|
+
diffs.push(data[i + 1].time - data[i].time);
|
|
42
|
+
}
|
|
43
|
+
diffs.sort((a, b) => a - b);
|
|
44
|
+
const median = diffs[Math.floor(diffs.length / 2)];
|
|
45
|
+
let best = DEFAULT_RESOLUTION;
|
|
46
|
+
let bestDist = Infinity;
|
|
47
|
+
for (const key of Object.keys(exports.INTERVAL_MS_TO_TV)) {
|
|
48
|
+
const intervalMs = Number(key);
|
|
49
|
+
const distance = Math.abs(intervalMs - median);
|
|
50
|
+
if (distance < bestDist) {
|
|
51
|
+
bestDist = distance;
|
|
52
|
+
best = exports.INTERVAL_MS_TO_TV[intervalMs];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return best;
|
|
56
|
+
}
|
|
57
|
+
exports.detectResolution = detectResolution;
|
|
58
|
+
//# sourceMappingURL=resolution.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution.cjs","sourceRoot":"","sources":["../../src/core/resolution.ts"],"names":[],"mappings":";AAAA,6EAA6E;AAC7E,EAAE;AACF,0EAA0E;AAC1E,yEAAyE;;;AAIzE,wEAAwE;AAC3D,QAAA,iBAAiB,GAA2C;IACvE,KAAM,EAAE,GAAG;IACX,MAAO,EAAE,GAAG;IACZ,MAAO,EAAE,GAAG;IACZ,MAAO,EAAE,IAAI;IACb,OAAS,EAAE,IAAI;IACf,OAAS,EAAE,IAAI;IACf,OAAS,EAAE,KAAK;IAChB,QAAU,EAAE,KAAK;IACjB,QAAU,EAAE,KAAK;IACjB,QAAU,EAAE,KAAK;IACjB,QAAU,EAAE,IAAI;IAChB,SAAW,EAAE,IAAI;IACjB,SAAW,EAAE,IAAI;IACjB,UAAa,EAAE,IAAI;CACpB,CAAC;AAEF,MAAM,kBAAkB,GAAiB,GAAG,CAAC;AAE7C;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAAC,IAAwB;IACvD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAEnD,IAAI,IAAI,GAAG,kBAAkB,CAAC;IAC9B,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,yBAAiB,CAAC,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC;QAC/C,IAAI,QAAQ,GAAG,QAAQ,EAAE,CAAC;YACxB,QAAQ,GAAG,QAAQ,CAAC;YACpB,IAAI,GAAG,yBAAiB,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAvBD,4CAuBC","sourcesContent":["// Maps OHLCV bar intervals (milliseconds) to TradingView resolution strings.\n//\n// Ported verbatim from chartLogic.js INTERVAL_MS_TO_TV + detectResolution\n// (lines ~463-505). Phase 2 consumes this from widget/ohlcvIngestion.ts.\n\nimport type { TVResolution } from './types.js';\n\n/** OHLCV bar interval in milliseconds → TradingView resolution code. */\nexport const INTERVAL_MS_TO_TV: Readonly<Record<number, TVResolution>> = {\n 60_000: '1',\n 180_000: '3',\n 300_000: '5',\n 900_000: '15',\n 1_800_000: '30',\n 3_600_000: '60',\n 7_200_000: '120',\n 14_400_000: '240',\n 28_800_000: '480',\n 43_200_000: '720',\n 86_400_000: '1D',\n 259_200_000: '3D',\n 604_800_000: '1W',\n 2_592_000_000: '1M',\n};\n\nconst DEFAULT_RESOLUTION: TVResolution = '5';\n\n/**\n * Picks the closest matching TV resolution for an OHLCV bar series.\n * Uses the median diff over the first few bars so a single gap doesn't skew\n * the result (matches legacy chartLogic.js detectResolution semantics).\n *\n * @param data - The OHLCV bar series (each bar carries a `time` in ms).\n * @returns The closest matching TradingView resolution.\n */\nexport function detectResolution(data: { time: number }[]): TVResolution {\n if (data.length < 2) {\n return DEFAULT_RESOLUTION;\n }\n const sampleCount = Math.min(data.length - 1, 10);\n const diffs: number[] = [];\n for (let i = 0; i < sampleCount; i++) {\n diffs.push(data[i + 1].time - data[i].time);\n }\n diffs.sort((a, b) => a - b);\n const median = diffs[Math.floor(diffs.length / 2)];\n\n let best = DEFAULT_RESOLUTION;\n let bestDist = Infinity;\n for (const key of Object.keys(INTERVAL_MS_TO_TV)) {\n const intervalMs = Number(key);\n const distance = Math.abs(intervalMs - median);\n if (distance < bestDist) {\n bestDist = distance;\n best = INTERVAL_MS_TO_TV[intervalMs];\n }\n }\n return best;\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TVResolution } from "./types.cjs";
|
|
2
|
+
/** OHLCV bar interval in milliseconds → TradingView resolution code. */
|
|
3
|
+
export declare const INTERVAL_MS_TO_TV: Readonly<Record<number, TVResolution>>;
|
|
4
|
+
/**
|
|
5
|
+
* Picks the closest matching TV resolution for an OHLCV bar series.
|
|
6
|
+
* Uses the median diff over the first few bars so a single gap doesn't skew
|
|
7
|
+
* the result (matches legacy chartLogic.js detectResolution semantics).
|
|
8
|
+
*
|
|
9
|
+
* @param data - The OHLCV bar series (each bar carries a `time` in ms).
|
|
10
|
+
* @returns The closest matching TradingView resolution.
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectResolution(data: {
|
|
13
|
+
time: number;
|
|
14
|
+
}[]): TVResolution;
|
|
15
|
+
//# sourceMappingURL=resolution.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution.d.cts","sourceRoot":"","sources":["../../src/core/resolution.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAmB;AAE/C,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAepE,CAAC;AAIF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,YAAY,CAuBvE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TVResolution } from "./types.mjs";
|
|
2
|
+
/** OHLCV bar interval in milliseconds → TradingView resolution code. */
|
|
3
|
+
export declare const INTERVAL_MS_TO_TV: Readonly<Record<number, TVResolution>>;
|
|
4
|
+
/**
|
|
5
|
+
* Picks the closest matching TV resolution for an OHLCV bar series.
|
|
6
|
+
* Uses the median diff over the first few bars so a single gap doesn't skew
|
|
7
|
+
* the result (matches legacy chartLogic.js detectResolution semantics).
|
|
8
|
+
*
|
|
9
|
+
* @param data - The OHLCV bar series (each bar carries a `time` in ms).
|
|
10
|
+
* @returns The closest matching TradingView resolution.
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectResolution(data: {
|
|
13
|
+
time: number;
|
|
14
|
+
}[]): TVResolution;
|
|
15
|
+
//# sourceMappingURL=resolution.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution.d.mts","sourceRoot":"","sources":["../../src/core/resolution.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAmB;AAE/C,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAepE,CAAC;AAIF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,YAAY,CAuBvE"}
|