dipping-charts 0.1.0

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 (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -0
  3. package/dist/__tests__/FullFeaturedChart.test.d.ts +2 -0
  4. package/dist/__tests__/FullFeaturedChart.test.d.ts.map +1 -0
  5. package/dist/__tests__/indicators-accuracy.test.d.ts +2 -0
  6. package/dist/__tests__/indicators-accuracy.test.d.ts.map +1 -0
  7. package/dist/__tests__/indicators.test.d.ts +2 -0
  8. package/dist/__tests__/indicators.test.d.ts.map +1 -0
  9. package/dist/__tests__/setup.d.ts +1 -0
  10. package/dist/__tests__/setup.d.ts.map +1 -0
  11. package/dist/__tests__/validateCandle.test.d.ts +2 -0
  12. package/dist/__tests__/validateCandle.test.d.ts.map +1 -0
  13. package/dist/chart/index.d.ts +2 -0
  14. package/dist/chart/index.js +5 -0
  15. package/dist/chart/index.js.map +1 -0
  16. package/dist/components/TradingChart.d.ts +24 -0
  17. package/dist/components/TradingChart.d.ts.map +1 -0
  18. package/dist/components/TradingChart.js +100 -0
  19. package/dist/components/TradingChart.js.map +1 -0
  20. package/dist/components/index.d.ts +3 -0
  21. package/dist/components/index.d.ts.map +1 -0
  22. package/dist/dipping-charts.css +1 -0
  23. package/dist/index.d.ts +5 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +28 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/indicators/atr.d.ts +15 -0
  28. package/dist/indicators/atr.d.ts.map +1 -0
  29. package/dist/indicators/atr.js +30 -0
  30. package/dist/indicators/atr.js.map +1 -0
  31. package/dist/indicators/bollingerBands.d.ts +11 -0
  32. package/dist/indicators/bollingerBands.d.ts.map +1 -0
  33. package/dist/indicators/bollingerBands.js +39 -0
  34. package/dist/indicators/bollingerBands.js.map +1 -0
  35. package/dist/indicators/currencyStrength.d.ts +43 -0
  36. package/dist/indicators/currencyStrength.d.ts.map +1 -0
  37. package/dist/indicators/currencyStrength.js +53 -0
  38. package/dist/indicators/currencyStrength.js.map +1 -0
  39. package/dist/indicators/ema.d.ts +11 -0
  40. package/dist/indicators/ema.d.ts.map +1 -0
  41. package/dist/indicators/ema.js +24 -0
  42. package/dist/indicators/ema.js.map +1 -0
  43. package/dist/indicators/index.d.ts +19 -0
  44. package/dist/indicators/index.d.ts.map +1 -0
  45. package/dist/indicators/index.js +23 -0
  46. package/dist/indicators/index.js.map +1 -0
  47. package/dist/indicators/macd.d.ts +11 -0
  48. package/dist/indicators/macd.d.ts.map +1 -0
  49. package/dist/indicators/macd.js +52 -0
  50. package/dist/indicators/macd.js.map +1 -0
  51. package/dist/indicators/rsi.d.ts +11 -0
  52. package/dist/indicators/rsi.d.ts.map +1 -0
  53. package/dist/indicators/rsi.js +29 -0
  54. package/dist/indicators/rsi.js.map +1 -0
  55. package/dist/indicators/sma.d.ts +13 -0
  56. package/dist/indicators/sma.d.ts.map +1 -0
  57. package/dist/indicators/sma.js +22 -0
  58. package/dist/indicators/sma.js.map +1 -0
  59. package/dist/indicators/stochastic.d.ts +15 -0
  60. package/dist/indicators/stochastic.d.ts.map +1 -0
  61. package/dist/indicators/stochastic.js +34 -0
  62. package/dist/indicators/stochastic.js.map +1 -0
  63. package/dist/indicators/types.d.ts +102 -0
  64. package/dist/indicators/types.d.ts.map +1 -0
  65. package/dist/indicators/vwap.d.ts +14 -0
  66. package/dist/indicators/vwap.d.ts.map +1 -0
  67. package/dist/indicators/vwap.js +17 -0
  68. package/dist/indicators/vwap.js.map +1 -0
  69. package/dist/indicators/williamsR.d.ts +17 -0
  70. package/dist/indicators/williamsR.d.ts.map +1 -0
  71. package/dist/indicators/williamsR.js +19 -0
  72. package/dist/indicators/williamsR.js.map +1 -0
  73. package/dist/react/FullFeaturedChart.d.ts +3 -0
  74. package/dist/react/FullFeaturedChart.d.ts.map +1 -0
  75. package/dist/react/FullFeaturedChart.js +640 -0
  76. package/dist/react/FullFeaturedChart.js.map +1 -0
  77. package/dist/react/components/IndicatorSettings.d.ts +20 -0
  78. package/dist/react/components/IndicatorSettings.d.ts.map +1 -0
  79. package/dist/react/components/IndicatorSettings.js +748 -0
  80. package/dist/react/components/IndicatorSettings.js.map +1 -0
  81. package/dist/react/hooks/useChart.d.ts +15 -0
  82. package/dist/react/hooks/useChart.d.ts.map +1 -0
  83. package/dist/react/hooks/useChart.js +155 -0
  84. package/dist/react/hooks/useChart.js.map +1 -0
  85. package/dist/react/hooks/useIndicators.d.ts +10 -0
  86. package/dist/react/hooks/useIndicators.d.ts.map +1 -0
  87. package/dist/react/hooks/useIndicators.js +264 -0
  88. package/dist/react/hooks/useIndicators.js.map +1 -0
  89. package/dist/react/hooks/useLineTools.d.ts +26 -0
  90. package/dist/react/hooks/useLineTools.d.ts.map +1 -0
  91. package/dist/react/hooks/useLineTools.js +189 -0
  92. package/dist/react/hooks/useLineTools.js.map +1 -0
  93. package/dist/react/hooks/useShiftSnap.d.ts +12 -0
  94. package/dist/react/hooks/useShiftSnap.d.ts.map +1 -0
  95. package/dist/react/hooks/useShiftSnap.js +54 -0
  96. package/dist/react/hooks/useShiftSnap.js.map +1 -0
  97. package/dist/react/index.d.ts +14 -0
  98. package/dist/react/index.d.ts.map +1 -0
  99. package/dist/react/index.js +18 -0
  100. package/dist/react/index.js.map +1 -0
  101. package/dist/react/loadLightweightCharts.d.ts +18 -0
  102. package/dist/react/loadLightweightCharts.d.ts.map +1 -0
  103. package/dist/react/loadLightweightCharts.js +32 -0
  104. package/dist/react/loadLightweightCharts.js.map +1 -0
  105. package/dist/react/locale.d.ts +79 -0
  106. package/dist/react/locale.d.ts.map +1 -0
  107. package/dist/react/locale.js +158 -0
  108. package/dist/react/locale.js.map +1 -0
  109. package/dist/react/types.d.ts +130 -0
  110. package/dist/react/types.d.ts.map +1 -0
  111. package/dist/types/index.d.ts +24 -0
  112. package/dist/types/index.d.ts.map +1 -0
  113. package/dist/utils/getToolId.d.ts +9 -0
  114. package/dist/utils/getToolId.d.ts.map +1 -0
  115. package/dist/utils/getToolId.js +12 -0
  116. package/dist/utils/getToolId.js.map +1 -0
  117. package/dist/utils/mockData.d.ts +10 -0
  118. package/dist/utils/mockData.d.ts.map +1 -0
  119. package/dist/utils/mockData.js +61 -0
  120. package/dist/utils/mockData.js.map +1 -0
  121. package/dist/utils/snapCrosshair.d.ts +25 -0
  122. package/dist/utils/snapCrosshair.d.ts.map +1 -0
  123. package/dist/utils/validateCandle.d.ts +30 -0
  124. package/dist/utils/validateCandle.d.ts.map +1 -0
  125. package/dist/utils/validateCandle.js +21 -0
  126. package/dist/utils/validateCandle.js.map +1 -0
  127. package/examples/css/base.css +209 -0
  128. package/examples/css/chart.css +282 -0
  129. package/examples/css/indicators.css +255 -0
  130. package/examples/index.html +163 -0
  131. package/examples/js/chart.js +370 -0
  132. package/examples/js/indicators.js +27 -0
  133. package/examples/js/main.js +6 -0
  134. package/examples/js/ui.js +1641 -0
  135. package/lib/lightweight-charts.standalone.production.js +7 -0
  136. package/package.json +106 -0
  137. package/src/react/FullFeaturedChart.css +1007 -0
@@ -0,0 +1,158 @@
1
+ const t = {
2
+ tf_1m: "1m",
3
+ tf_5m: "5m",
4
+ tf_15m: "15m",
5
+ tf_30m: "30m",
6
+ tf_1h: "1H",
7
+ tf_1d: "D",
8
+ tf_1w: "W",
9
+ tf_1M: "M",
10
+ tf_unavailable: "Not available in current session",
11
+ tool_TrendLine: "Trend Line",
12
+ tool_HorizontalLine: "Horizontal",
13
+ tool_VerticalLine: "Vertical",
14
+ tool_Rectangle: "Rectangle",
15
+ tool_FibRetracement: "Fibonacci",
16
+ tool_Text: "Text",
17
+ tool_drawing: "drawing",
18
+ btn_indicators: "+ Indicators",
19
+ btn_draw: "✏️ Draw",
20
+ btn_clearAll: "Clear All",
21
+ cat_overlay: "Overlay",
22
+ cat_oscillator: "Oscillator",
23
+ ind_sma: "SMA",
24
+ ind_ema: "EMA",
25
+ ind_bbands: "Bollinger Bands",
26
+ ind_rsi: "RSI",
27
+ ind_macd: "MACD",
28
+ ind_stochastic: "Stochastic",
29
+ ind_atr: "ATR",
30
+ ind_vwap: "VWAP",
31
+ ind_williamsR: "Williams %R",
32
+ ind_sma_desc: "Simple moving average over n periods",
33
+ ind_ema_desc: "Exponential moving average with recent price weighting",
34
+ ind_bbands_desc: "Volatility bands around a moving average",
35
+ ind_rsi_desc: "Relative Strength Index — overbought/oversold detection",
36
+ ind_macd_desc: "Moving Average Convergence Divergence — trend reversal signal",
37
+ ind_stochastic_desc: "Stochastic Oscillator — momentum based on high/low range",
38
+ ind_atr_desc: "Average True Range — measures price volatility",
39
+ ind_vwap_desc: "Volume Weighted Average Price — intraday fair value",
40
+ ind_williamsR_desc: "Williams %R — overbought/oversold momentum oscillator",
41
+ selectIndicator: "Select an indicator",
42
+ enableIndicator: "Check the box to enable this indicator",
43
+ color: "Color",
44
+ period: "Period",
45
+ periodN: (e) => `Period ${e}`,
46
+ addPeriod: "+ Add Period",
47
+ thickness: "Width",
48
+ stdDev: "Std Dev",
49
+ oversold: "Oversold",
50
+ overbought: "Overbought",
51
+ upper: "Upper",
52
+ middle: "Middle",
53
+ lower: "Lower",
54
+ fast: "Fast",
55
+ slow: "Slow",
56
+ signal: "Signal",
57
+ bullish: "Bullish",
58
+ bearish: "Bearish",
59
+ colorPaletteTitle: "Color",
60
+ kPeriod: "%K Period",
61
+ dPeriod: "%D Period",
62
+ smooth: "Smooth",
63
+ kLine: "%K Line",
64
+ dLine: "%D Line",
65
+ src_close: "Close",
66
+ src_open: "Open",
67
+ src_high: "High",
68
+ src_low: "Low",
69
+ loading: "Loading chart data...",
70
+ noData: "No chart data",
71
+ textEdit: "Edit Text",
72
+ textAdd: "Enter Text",
73
+ textPlaceholder: "Enter text",
74
+ cancel: "Cancel",
75
+ confirm: "OK"
76
+ }, o = {
77
+ tf_1m: "1분",
78
+ tf_5m: "5분",
79
+ tf_15m: "15분",
80
+ tf_30m: "30분",
81
+ tf_1h: "1시간",
82
+ tf_1d: "일",
83
+ tf_1w: "주",
84
+ tf_1M: "월",
85
+ tf_unavailable: "현재 시간대에서 사용할 수 없습니다",
86
+ tool_TrendLine: "추세선",
87
+ tool_HorizontalLine: "수평선",
88
+ tool_VerticalLine: "수직선",
89
+ tool_Rectangle: "사각형",
90
+ tool_FibRetracement: "피보나치",
91
+ tool_Text: "텍스트",
92
+ tool_drawing: "그리는 중",
93
+ btn_indicators: "+ 보조지표",
94
+ btn_draw: "✏️ 그리기",
95
+ btn_clearAll: "전체 삭제",
96
+ cat_overlay: "상단 지표",
97
+ cat_oscillator: "하단 지표",
98
+ ind_sma: "이동평균선",
99
+ ind_ema: "지수이동평균",
100
+ ind_bbands: "볼린저 밴드",
101
+ ind_rsi: "RSI",
102
+ ind_macd: "MACD",
103
+ ind_stochastic: "스토캐스틱",
104
+ ind_atr: "ATR",
105
+ ind_vwap: "VWAP",
106
+ ind_williamsR: "윌리엄스 %R",
107
+ ind_sma_desc: "지난 n일 동안 주가 평균값을 이은 선",
108
+ ind_ema_desc: "최근 가격에 더 큰 가중치를 둔 이동평균선",
109
+ ind_bbands_desc: "가격 변동성을 나타내는 밴드",
110
+ ind_rsi_desc: "상대강도지수 - 과매수/과매도 판단",
111
+ ind_macd_desc: "이동평균 수렴확산 - 추세 전환 신호",
112
+ ind_stochastic_desc: "스토캐스틱 오실레이터 - 고저 범위 기반 모멘텀",
113
+ ind_atr_desc: "평균 진폭 - 가격 변동성 측정",
114
+ ind_vwap_desc: "거래량 가중 평균가 - 장중 적정 가격",
115
+ ind_williamsR_desc: "윌리엄스 %R - 과매수/과매도 모멘텀 오실레이터",
116
+ selectIndicator: "지표를 선택하세요",
117
+ enableIndicator: "체크박스를 클릭하여 지표를 활성화하세요",
118
+ color: "색상",
119
+ period: "기간",
120
+ periodN: (e) => `기간${e}`,
121
+ addPeriod: "+ 기간 추가",
122
+ thickness: "두께",
123
+ stdDev: "표준편차",
124
+ oversold: "과매도",
125
+ overbought: "과매수",
126
+ upper: "상단",
127
+ middle: "중간",
128
+ lower: "하단",
129
+ fast: "단기",
130
+ slow: "장기",
131
+ signal: "시그널",
132
+ bullish: "양봉",
133
+ bearish: "음봉",
134
+ colorPaletteTitle: "컬러",
135
+ kPeriod: "%K 기간",
136
+ dPeriod: "%D 기간",
137
+ smooth: "스무딩",
138
+ kLine: "%K 라인",
139
+ dLine: "%D 라인",
140
+ src_close: "종가",
141
+ src_open: "시가",
142
+ src_high: "고가",
143
+ src_low: "저가",
144
+ loading: "차트 데이터 로딩 중...",
145
+ noData: "차트 데이터가 없습니다",
146
+ textEdit: "텍스트 수정",
147
+ textAdd: "텍스트 입력",
148
+ textPlaceholder: "텍스트를 입력하세요",
149
+ cancel: "취소",
150
+ confirm: "확인"
151
+ }, i = { en: t, ko: o };
152
+ function a(e = "en") {
153
+ return i[e] || i.en;
154
+ }
155
+ export {
156
+ a as getLocaleStrings
157
+ };
158
+ //# sourceMappingURL=locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.js","sources":["../../src/react/locale.ts"],"sourcesContent":["export type Locale = 'en' | 'ko';\n\nexport interface LocaleStrings {\n // Timeframe labels\n tf_1m: string;\n tf_5m: string;\n tf_15m: string;\n tf_30m: string;\n tf_1h: string;\n tf_1d: string;\n tf_1w: string;\n tf_1M: string;\n tf_unavailable: string;\n\n // Drawing tool labels\n tool_TrendLine: string;\n tool_HorizontalLine: string;\n tool_VerticalLine: string;\n tool_Rectangle: string;\n tool_FibRetracement: string;\n tool_Text: string;\n tool_drawing: string;\n\n // Header buttons\n btn_indicators: string;\n btn_draw: string;\n btn_clearAll: string;\n\n // Indicator categories\n cat_overlay: string;\n cat_oscillator: string;\n\n // Indicator names\n ind_sma: string;\n ind_ema: string;\n ind_bbands: string;\n ind_rsi: string;\n ind_macd: string;\n ind_stochastic: string;\n ind_atr: string;\n ind_vwap: string;\n ind_williamsR: string;\n\n // Indicator descriptions\n ind_sma_desc: string;\n ind_ema_desc: string;\n ind_bbands_desc: string;\n ind_rsi_desc: string;\n ind_macd_desc: string;\n ind_stochastic_desc: string;\n ind_atr_desc: string;\n ind_vwap_desc: string;\n ind_williamsR_desc: string;\n\n // Indicator settings\n selectIndicator: string;\n enableIndicator: string;\n color: string;\n period: string;\n periodN: (n: number) => string;\n addPeriod: string;\n thickness: string;\n stdDev: string;\n oversold: string;\n overbought: string;\n upper: string;\n middle: string;\n lower: string;\n fast: string;\n slow: string;\n signal: string;\n bullish: string;\n bearish: string;\n colorPaletteTitle: string;\n\n // Stochastic-specific\n kPeriod: string;\n dPeriod: string;\n smooth: string;\n kLine: string;\n dLine: string;\n\n // Source options\n src_close: string;\n src_open: string;\n src_high: string;\n src_low: string;\n\n // Chart overlays\n loading: string;\n noData: string;\n\n // Text modal\n textEdit: string;\n textAdd: string;\n textPlaceholder: string;\n cancel: string;\n confirm: string;\n}\n\nconst en: LocaleStrings = {\n tf_1m: '1m',\n tf_5m: '5m',\n tf_15m: '15m',\n tf_30m: '30m',\n tf_1h: '1H',\n tf_1d: 'D',\n tf_1w: 'W',\n tf_1M: 'M',\n tf_unavailable: 'Not available in current session',\n\n tool_TrendLine: 'Trend Line',\n tool_HorizontalLine: 'Horizontal',\n tool_VerticalLine: 'Vertical',\n tool_Rectangle: 'Rectangle',\n tool_FibRetracement: 'Fibonacci',\n tool_Text: 'Text',\n tool_drawing: 'drawing',\n\n btn_indicators: '+ Indicators',\n btn_draw: '✏️ Draw',\n btn_clearAll: 'Clear All',\n\n cat_overlay: 'Overlay',\n cat_oscillator: 'Oscillator',\n\n ind_sma: 'SMA',\n ind_ema: 'EMA',\n ind_bbands: 'Bollinger Bands',\n ind_rsi: 'RSI',\n ind_macd: 'MACD',\n ind_stochastic: 'Stochastic',\n ind_atr: 'ATR',\n ind_vwap: 'VWAP',\n ind_williamsR: 'Williams %R',\n\n ind_sma_desc: 'Simple moving average over n periods',\n ind_ema_desc: 'Exponential moving average with recent price weighting',\n ind_bbands_desc: 'Volatility bands around a moving average',\n ind_rsi_desc: 'Relative Strength Index — overbought/oversold detection',\n ind_macd_desc: 'Moving Average Convergence Divergence — trend reversal signal',\n ind_stochastic_desc: 'Stochastic Oscillator — momentum based on high/low range',\n ind_atr_desc: 'Average True Range — measures price volatility',\n ind_vwap_desc: 'Volume Weighted Average Price — intraday fair value',\n ind_williamsR_desc: 'Williams %R — overbought/oversold momentum oscillator',\n\n selectIndicator: 'Select an indicator',\n enableIndicator: 'Check the box to enable this indicator',\n color: 'Color',\n period: 'Period',\n periodN: (n: number) => `Period ${n}`,\n addPeriod: '+ Add Period',\n thickness: 'Width',\n stdDev: 'Std Dev',\n oversold: 'Oversold',\n overbought: 'Overbought',\n upper: 'Upper',\n middle: 'Middle',\n lower: 'Lower',\n fast: 'Fast',\n slow: 'Slow',\n signal: 'Signal',\n bullish: 'Bullish',\n bearish: 'Bearish',\n colorPaletteTitle: 'Color',\n\n kPeriod: '%K Period',\n dPeriod: '%D Period',\n smooth: 'Smooth',\n kLine: '%K Line',\n dLine: '%D Line',\n\n src_close: 'Close',\n src_open: 'Open',\n src_high: 'High',\n src_low: 'Low',\n\n loading: 'Loading chart data...',\n noData: 'No chart data',\n\n textEdit: 'Edit Text',\n textAdd: 'Enter Text',\n textPlaceholder: 'Enter text',\n cancel: 'Cancel',\n confirm: 'OK',\n};\n\nconst ko: LocaleStrings = {\n tf_1m: '1분',\n tf_5m: '5분',\n tf_15m: '15분',\n tf_30m: '30분',\n tf_1h: '1시간',\n tf_1d: '일',\n tf_1w: '주',\n tf_1M: '월',\n tf_unavailable: '현재 시간대에서 사용할 수 없습니다',\n\n tool_TrendLine: '추세선',\n tool_HorizontalLine: '수평선',\n tool_VerticalLine: '수직선',\n tool_Rectangle: '사각형',\n tool_FibRetracement: '피보나치',\n tool_Text: '텍스트',\n tool_drawing: '그리는 중',\n\n btn_indicators: '+ 보조지표',\n btn_draw: '✏️ 그리기',\n btn_clearAll: '전체 삭제',\n\n cat_overlay: '상단 지표',\n cat_oscillator: '하단 지표',\n\n ind_sma: '이동평균선',\n ind_ema: '지수이동평균',\n ind_bbands: '볼린저 밴드',\n ind_rsi: 'RSI',\n ind_macd: 'MACD',\n ind_stochastic: '스토캐스틱',\n ind_atr: 'ATR',\n ind_vwap: 'VWAP',\n ind_williamsR: '윌리엄스 %R',\n\n ind_sma_desc: '지난 n일 동안 주가 평균값을 이은 선',\n ind_ema_desc: '최근 가격에 더 큰 가중치를 둔 이동평균선',\n ind_bbands_desc: '가격 변동성을 나타내는 밴드',\n ind_rsi_desc: '상대강도지수 - 과매수/과매도 판단',\n ind_macd_desc: '이동평균 수렴확산 - 추세 전환 신호',\n ind_stochastic_desc: '스토캐스틱 오실레이터 - 고저 범위 기반 모멘텀',\n ind_atr_desc: '평균 진폭 - 가격 변동성 측정',\n ind_vwap_desc: '거래량 가중 평균가 - 장중 적정 가격',\n ind_williamsR_desc: '윌리엄스 %R - 과매수/과매도 모멘텀 오실레이터',\n\n selectIndicator: '지표를 선택하세요',\n enableIndicator: '체크박스를 클릭하여 지표를 활성화하세요',\n color: '색상',\n period: '기간',\n periodN: (n: number) => `기간${n}`,\n addPeriod: '+ 기간 추가',\n thickness: '두께',\n stdDev: '표준편차',\n oversold: '과매도',\n overbought: '과매수',\n upper: '상단',\n middle: '중간',\n lower: '하단',\n fast: '단기',\n slow: '장기',\n signal: '시그널',\n bullish: '양봉',\n bearish: '음봉',\n colorPaletteTitle: '컬러',\n\n kPeriod: '%K 기간',\n dPeriod: '%D 기간',\n smooth: '스무딩',\n kLine: '%K 라인',\n dLine: '%D 라인',\n\n src_close: '종가',\n src_open: '시가',\n src_high: '고가',\n src_low: '저가',\n\n loading: '차트 데이터 로딩 중...',\n noData: '차트 데이터가 없습니다',\n\n textEdit: '텍스트 수정',\n textAdd: '텍스트 입력',\n textPlaceholder: '텍스트를 입력하세요',\n cancel: '취소',\n confirm: '확인',\n};\n\nconst locales: Record<Locale, LocaleStrings> = { en, ko };\n\nexport function getLocaleStrings(locale: Locale = 'en'): LocaleStrings {\n return locales[locale] || locales.en;\n}\n"],"names":["en","n","ko","locales","getLocaleStrings","locale"],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ import { CandleData, TimeFrame } from '../types';
2
+ import { Locale } from './locale';
3
+ export type { TimeFrame, Locale };
4
+ export interface IndicatorConfig {
5
+ color: string;
6
+ thickness: number;
7
+ source: 'close' | 'open' | 'high' | 'low';
8
+ value: number;
9
+ overbought?: number;
10
+ oversold?: number;
11
+ }
12
+ export interface BollingerBandsConfig extends IndicatorConfig {
13
+ upperColor: string;
14
+ middleColor: string;
15
+ lowerColor: string;
16
+ stdDev: number;
17
+ }
18
+ export interface MACDConfig {
19
+ fastPeriod: number;
20
+ slowPeriod: number;
21
+ signalPeriod: number;
22
+ thickness: number;
23
+ histUpColor?: string;
24
+ histDownColor?: string;
25
+ }
26
+ export interface StochasticConfig {
27
+ kPeriod: number;
28
+ dPeriod: number;
29
+ smooth: number;
30
+ kColor: string;
31
+ dColor: string;
32
+ thickness: number;
33
+ }
34
+ export interface VWAPConfig {
35
+ color: string;
36
+ thickness: number;
37
+ }
38
+ export type IndicatorType = 'sma' | 'ema' | 'rsi' | 'macd' | 'bbands' | 'stochastic' | 'atr' | 'vwap' | 'williamsR';
39
+ export interface IndicatorConfigs {
40
+ sma: IndicatorConfig[];
41
+ ema: IndicatorConfig[];
42
+ rsi: IndicatorConfig[];
43
+ macd: MACDConfig[];
44
+ bbands: BollingerBandsConfig[];
45
+ stochastic: StochasticConfig[];
46
+ atr: IndicatorConfig[];
47
+ vwap: VWAPConfig[];
48
+ williamsR: IndicatorConfig[];
49
+ }
50
+ export type MarketSession = 'premarket' | 'regular' | 'aftermarket' | 'daymarket' | 'closed';
51
+ export interface TimeframeAvailability {
52
+ enabled: TimeFrame[];
53
+ disabled: TimeFrame[];
54
+ currentSession: MarketSession;
55
+ }
56
+ export type LineToolType = 'TrendLine' | 'HorizontalLine' | 'VerticalLine' | 'Rectangle' | 'FibRetracement' | 'Text';
57
+ export interface LineToolOptions {
58
+ line?: {
59
+ width: number;
60
+ color: string;
61
+ };
62
+ text?: {
63
+ value: string;
64
+ font?: {
65
+ color: string;
66
+ size: number;
67
+ };
68
+ };
69
+ }
70
+ export interface LineTool {
71
+ id: string;
72
+ toolType: LineToolType;
73
+ points: any[];
74
+ options: LineToolOptions;
75
+ }
76
+ export interface PriceLine {
77
+ price: number;
78
+ color?: string;
79
+ lineWidth?: number;
80
+ lineStyle?: 'solid' | 'dashed' | 'dotted';
81
+ label?: string;
82
+ labelVisible?: boolean;
83
+ axisLabelVisible?: boolean;
84
+ }
85
+ export interface FullFeaturedChartProps {
86
+ /** UI language. Defaults to 'en'. */
87
+ locale?: Locale;
88
+ data?: CandleData[];
89
+ width?: number;
90
+ height?: number;
91
+ className?: string;
92
+ enableTimeframes?: boolean;
93
+ enableIndicators?: boolean;
94
+ enableDrawingTools?: boolean;
95
+ defaultTimeframe?: TimeFrame;
96
+ timeframeAvailability?: TimeframeAvailability;
97
+ onTimeframeChange?: (timeframe: TimeFrame) => void;
98
+ realtimeCandle?: CandleData;
99
+ loading?: boolean;
100
+ error?: string | null;
101
+ symbol?: string;
102
+ statusBadge?: React.ReactNode;
103
+ priceLines?: PriceLine[];
104
+ initialLineTools?: LineTool[];
105
+ onLineToolsChange?: (tools: LineTool[]) => void;
106
+ showVolume?: boolean;
107
+ indicatorStorageKey?: string;
108
+ initialIndicatorState?: {
109
+ configs: IndicatorConfigs;
110
+ checked: IndicatorType[];
111
+ macdColors: {
112
+ line: string;
113
+ signal: string;
114
+ };
115
+ };
116
+ onIndicatorStateChange?: (state: {
117
+ configs: IndicatorConfigs;
118
+ checked: IndicatorType[];
119
+ macdColors: {
120
+ line: string;
121
+ signal: string;
122
+ };
123
+ }) => void;
124
+ /**
125
+ * 그리기 도구 클릭 시 호출되는 콜백
126
+ * false 반환 시 그리기 도구 활성화가 취소됨 (로그인 체크 등에 활용)
127
+ */
128
+ onDrawingToolClick?: () => boolean;
129
+ }
130
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/react/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 캔들 데이터 타입
3
+ */
4
+ export interface CandleData {
5
+ time: number;
6
+ open: number;
7
+ high: number;
8
+ low: number;
9
+ close: number;
10
+ volume: number;
11
+ }
12
+ /**
13
+ * 시간봉 타입
14
+ */
15
+ export type TimeFrame = '1m' | '5m' | '15m' | '30m' | '1h' | '1d' | '1w' | '1M' | '1y';
16
+ /**
17
+ * 차트 옵션
18
+ */
19
+ export interface ChartOptions {
20
+ width?: number;
21
+ height?: number;
22
+ timeFrame?: TimeFrame;
23
+ }
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 난독화된 lightweight-charts Line Tool 결과에서 도구 ID를 추출합니다.
3
+ *
4
+ * lightweight-charts의 minified 빌드에서 `addLineTool()`의 반환값은
5
+ * `result.ak.ji` 형태의 난독화된 프로퍼티 경로에 ID가 들어있습니다.
6
+ * 이 헬퍼를 사용하면 난독화 경로가 변경될 때 한 곳만 수정하면 됩니다.
7
+ */
8
+ export declare function getToolIdFromResult(result: any): string | null;
9
+ //# sourceMappingURL=getToolId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getToolId.d.ts","sourceRoot":"","sources":["../../src/utils/getToolId.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAM9D"}
@@ -0,0 +1,12 @@
1
+ function t(n) {
2
+ var o;
3
+ try {
4
+ return ((o = n == null ? void 0 : n.ak) == null ? void 0 : o.ji) ?? null;
5
+ } catch {
6
+ return null;
7
+ }
8
+ }
9
+ export {
10
+ t as getToolIdFromResult
11
+ };
12
+ //# sourceMappingURL=getToolId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getToolId.js","sources":["../../src/utils/getToolId.ts"],"sourcesContent":["/**\n * 난독화된 lightweight-charts Line Tool 결과에서 도구 ID를 추출합니다.\n *\n * lightweight-charts의 minified 빌드에서 `addLineTool()`의 반환값은\n * `result.ak.ji` 형태의 난독화된 프로퍼티 경로에 ID가 들어있습니다.\n * 이 헬퍼를 사용하면 난독화 경로가 변경될 때 한 곳만 수정하면 됩니다.\n */\nexport function getToolIdFromResult(result: any): string | null {\n try {\n return result?.ak?.ji ?? null;\n } catch {\n return null;\n }\n}\n"],"names":["getToolIdFromResult","result","_a"],"mappings":"AAOO,SAASA,EAAoBC,GAA4B;AAAzD,MAAAC;AACL,MAAI;AACF,aAAOA,IAAAD,KAAA,gBAAAA,EAAQ,OAAR,gBAAAC,EAAY,OAAM;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}
@@ -0,0 +1,10 @@
1
+ import { CandleData, TimeFrame } from '../types';
2
+ /**
3
+ * 가상의 캔들 데이터 생성
4
+ */
5
+ export declare function generateMockCandles(timeFrame: TimeFrame, count?: number, basePrice?: number): CandleData[];
6
+ /**
7
+ * 모든 시간봉 데이터 생성
8
+ */
9
+ export declare function generateAllTimeFrames(basePrice?: number): Record<TimeFrame, CandleData[]>;
10
+ //# sourceMappingURL=mockData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockData.d.ts","sourceRoot":"","sources":["../../src/utils/mockData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiBjD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EACpB,KAAK,GAAE,MAAY,EACnB,SAAS,GAAE,MAAY,GACtB,UAAU,EAAE,CAoCd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,GAAE,MAAY,GAAG,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAY9F"}
@@ -0,0 +1,61 @@
1
+ const u = {
2
+ "1m": 60,
3
+ // 1분
4
+ "5m": 300,
5
+ // 5분
6
+ "15m": 900,
7
+ // 15분
8
+ "30m": 1800,
9
+ // 30분
10
+ "1h": 3600,
11
+ // 1시간
12
+ "1d": 86400,
13
+ // 1일
14
+ "1w": 604800,
15
+ // 1주
16
+ "1M": 2592e3,
17
+ // 1개월 (30일)
18
+ "1y": 31536e3
19
+ // 1년
20
+ };
21
+ function t(o, l = 100, r = 100) {
22
+ const h = [], d = u[o], M = Math.floor(Date.now() / 1e3);
23
+ let n = r;
24
+ for (let a = l - 1; a >= 0; a--) {
25
+ const s = M - a * d, c = n * (Math.random() * 0.04 - 0.02);
26
+ n += c;
27
+ const m = n, e = n + (Math.random() * 4 - 2), p = Math.max(m, e) + Math.random() * 2, F = Math.min(m, e) - Math.random() * 2, i = Math.floor(Math.random() * 1e6) + 1e5;
28
+ h.push({
29
+ time: s,
30
+ open: parseFloat(m.toFixed(2)),
31
+ high: parseFloat(p.toFixed(2)),
32
+ low: parseFloat(F.toFixed(2)),
33
+ close: parseFloat(e.toFixed(2)),
34
+ volume: i
35
+ }), n = e;
36
+ }
37
+ return h;
38
+ }
39
+ function w(o = 150) {
40
+ return {
41
+ "1m": t("1m", 200, o),
42
+ "5m": t("5m", 200, o),
43
+ "15m": t("15m", 200, o),
44
+ "30m": t("30m", 200, o),
45
+ "1h": t("1h", 168, o),
46
+ // 1주일
47
+ "1d": t("1d", 365, o),
48
+ // 1년
49
+ "1w": t("1w", 52, o),
50
+ // 1년
51
+ "1M": t("1M", 24, o),
52
+ // 2년
53
+ "1y": t("1y", 10, o)
54
+ // 10년
55
+ };
56
+ }
57
+ export {
58
+ w as generateAllTimeFrames,
59
+ t as generateMockCandles
60
+ };
61
+ //# sourceMappingURL=mockData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockData.js","sources":["../../src/utils/mockData.ts"],"sourcesContent":["import { CandleData, TimeFrame } from '../types';\n\n/**\n * 시간봉에 따른 시간 간격 (초 단위)\n */\nconst TIME_INTERVALS: Record<TimeFrame, number> = {\n '1m': 60, // 1분\n '5m': 300, // 5분\n '15m': 900, // 15분\n '30m': 1800, // 30분\n '1h': 3600, // 1시간\n '1d': 86400, // 1일\n '1w': 604800, // 1주\n '1M': 2592000, // 1개월 (30일)\n '1y': 31536000, // 1년\n};\n\n/**\n * 가상의 캔들 데이터 생성\n */\nexport function generateMockCandles(\n timeFrame: TimeFrame,\n count: number = 100,\n basePrice: number = 100\n): CandleData[] {\n const candles: CandleData[] = [];\n const interval = TIME_INTERVALS[timeFrame];\n const now = Math.floor(Date.now() / 1000);\n\n let currentPrice = basePrice;\n\n for (let i = count - 1; i >= 0; i--) {\n const time = now - (i * interval);\n\n // 가격 변동 (-2% ~ +2%)\n const priceChange = currentPrice * (Math.random() * 0.04 - 0.02);\n currentPrice += priceChange;\n\n // OHLC 생성\n const open = currentPrice;\n const close = currentPrice + (Math.random() * 4 - 2);\n const high = Math.max(open, close) + Math.random() * 2;\n const low = Math.min(open, close) - Math.random() * 2;\n\n // 거래량 (랜덤)\n const volume = Math.floor(Math.random() * 1000000) + 100000;\n\n candles.push({\n time,\n open: parseFloat(open.toFixed(2)),\n high: parseFloat(high.toFixed(2)),\n low: parseFloat(low.toFixed(2)),\n close: parseFloat(close.toFixed(2)),\n volume,\n });\n\n currentPrice = close;\n }\n\n return candles;\n}\n\n/**\n * 모든 시간봉 데이터 생성\n */\nexport function generateAllTimeFrames(basePrice: number = 150): Record<TimeFrame, CandleData[]> {\n return {\n '1m': generateMockCandles('1m', 200, basePrice),\n '5m': generateMockCandles('5m', 200, basePrice),\n '15m': generateMockCandles('15m', 200, basePrice),\n '30m': generateMockCandles('30m', 200, basePrice),\n '1h': generateMockCandles('1h', 168, basePrice), // 1주일\n '1d': generateMockCandles('1d', 365, basePrice), // 1년\n '1w': generateMockCandles('1w', 52, basePrice), // 1년\n '1M': generateMockCandles('1M', 24, basePrice), // 2년\n '1y': generateMockCandles('1y', 10, basePrice), // 10년\n };\n}\n"],"names":["TIME_INTERVALS","generateMockCandles","timeFrame","count","basePrice","candles","interval","now","currentPrice","i","time","priceChange","open","close","high","low","volume","generateAllTimeFrames"],"mappings":"AAKA,MAAMA,IAA4C;AAAA,EAChD,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,OAAO;AAAA;AAAA,EACP,OAAO;AAAA;AAAA,EACP,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AACR;AAKO,SAASC,EACdC,GACAC,IAAgB,KAChBC,IAAoB,KACN;AACd,QAAMC,IAAwB,CAAA,GACxBC,IAAWN,EAAeE,CAAS,GACnCK,IAAM,KAAK,MAAM,KAAK,IAAA,IAAQ,GAAI;AAExC,MAAIC,IAAeJ;AAEnB,WAASK,IAAIN,IAAQ,GAAGM,KAAK,GAAGA,KAAK;AACnC,UAAMC,IAAOH,IAAOE,IAAIH,GAGlBK,IAAcH,KAAgB,KAAK,OAAA,IAAW,OAAO;AAC3D,IAAAA,KAAgBG;AAGhB,UAAMC,IAAOJ,GACPK,IAAQL,KAAgB,KAAK,OAAA,IAAW,IAAI,IAC5CM,IAAO,KAAK,IAAIF,GAAMC,CAAK,IAAI,KAAK,WAAW,GAC/CE,IAAM,KAAK,IAAIH,GAAMC,CAAK,IAAI,KAAK,WAAW,GAG9CG,IAAS,KAAK,MAAM,KAAK,OAAA,IAAW,GAAO,IAAI;AAErD,IAAAX,EAAQ,KAAK;AAAA,MACX,MAAAK;AAAA,MACA,MAAM,WAAWE,EAAK,QAAQ,CAAC,CAAC;AAAA,MAChC,MAAM,WAAWE,EAAK,QAAQ,CAAC,CAAC;AAAA,MAChC,KAAK,WAAWC,EAAI,QAAQ,CAAC,CAAC;AAAA,MAC9B,OAAO,WAAWF,EAAM,QAAQ,CAAC,CAAC;AAAA,MAClC,QAAAG;AAAA,IAAA,CACD,GAEDR,IAAeK;AAAA,EACjB;AAEA,SAAOR;AACT;AAKO,SAASY,EAAsBb,IAAoB,KAAsC;AAC9F,SAAO;AAAA,IACL,MAAMH,EAAoB,MAAM,KAAKG,CAAS;AAAA,IAC9C,MAAMH,EAAoB,MAAM,KAAKG,CAAS;AAAA,IAC9C,OAAOH,EAAoB,OAAO,KAAKG,CAAS;AAAA,IAChD,OAAOH,EAAoB,OAAO,KAAKG,CAAS;AAAA,IAChD,MAAMH,EAAoB,MAAM,KAAKG,CAAS;AAAA;AAAA,IAC9C,MAAMH,EAAoB,MAAM,KAAKG,CAAS;AAAA;AAAA,IAC9C,MAAMH,EAAoB,MAAM,IAAIG,CAAS;AAAA;AAAA,IAC7C,MAAMH,EAAoB,MAAM,IAAIG,CAAS;AAAA;AAAA,IAC7C,MAAMH,EAAoB,MAAM,IAAIG,CAAS;AAAA;AAAA,EAAA;AAEjD;"}
@@ -0,0 +1,25 @@
1
+ import { IChartApi, ISeriesApi } from 'lightweight-charts';
2
+ /**
3
+ * Snap Crosshair Plugin
4
+ * Shift 키를 누르면 마우스 위치에 따라 High/Low에 snap
5
+ */
6
+ export declare class SnapCrosshairPlugin {
7
+ private chart;
8
+ private series;
9
+ private container;
10
+ private isShiftPressed;
11
+ private verticalLine;
12
+ private horizontalLine;
13
+ private priceLabel;
14
+ constructor(chart: IChartApi, series: ISeriesApi<'Candlestick'>, container: HTMLElement);
15
+ private createLine;
16
+ private createPriceLabel;
17
+ private init;
18
+ private handleKeyDown;
19
+ private handleKeyUp;
20
+ private handleCrosshairMove;
21
+ private showCrosshair;
22
+ private hideCrosshair;
23
+ destroy(): void;
24
+ }
25
+ //# sourceMappingURL=snapCrosshair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapCrosshair.d.ts","sourceRoot":"","sources":["../../src/utils/snapCrosshair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AAE7E;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,cAAc,CAAkB;IAGxC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,UAAU,CAAiB;gBAEvB,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,WAAW;IAavF,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,aAAa,CAWnB;IAEF,OAAO,CAAC,WAAW,CAajB;IAEF,OAAO,CAAC,mBAAmB,CAoCzB;IAEF,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,aAAa;IAMrB,OAAO;CAOR"}
@@ -0,0 +1,30 @@
1
+ import { CandleData } from '../types';
2
+ /**
3
+ * 단일 캔들이 유효한지 검사합니다.
4
+ * lightweight-charts는 null/NaN/Infinity를 허용하지 않으므로
5
+ * OHLC와 time 필드 모두 유한한 숫자인지 확인합니다.
6
+ */
7
+ export declare function isValidCandle(c: CandleData): boolean;
8
+ /**
9
+ * 유효하지 않은 캔들을 필터링합니다.
10
+ * 제거된 건수가 있으면 콘솔 경고를 출력합니다.
11
+ */
12
+ export declare function filterValidCandles(data: CandleData[], label?: string): CandleData[];
13
+ /**
14
+ * 인디케이터 데이터 포인트가 유효한지 검사합니다.
15
+ */
16
+ export declare function isValidIndicatorPoint(d: {
17
+ time: number;
18
+ value: number;
19
+ }): boolean;
20
+ /**
21
+ * 유효하지 않은 인디케이터 데이터 포인트를 필터링합니다.
22
+ */
23
+ export declare function filterValidIndicatorPoints(data: Array<{
24
+ time: number;
25
+ value: number;
26
+ }>): Array<{
27
+ time: number;
28
+ value: number;
29
+ }>;
30
+ //# sourceMappingURL=validateCandle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateCandle.d.ts","sourceRoot":"","sources":["../../src/utils/validateCandle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CASpD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAMnF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAOjF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAE/H"}
@@ -0,0 +1,21 @@
1
+ function n(i) {
2
+ const e = typeof i.time == "number" ? i.time : Number(i.time);
3
+ return Number.isFinite(e) && e > 0 && Number.isFinite(i.open) && Number.isFinite(i.high) && Number.isFinite(i.low) && Number.isFinite(i.close);
4
+ }
5
+ function r(i, e) {
6
+ const t = i.filter(n);
7
+ return t.length !== i.length && console.warn(`[${e ?? "filterValidCandles"}] Filtered out ${i.length - t.length} candles with invalid values`), t;
8
+ }
9
+ function l(i) {
10
+ return i.time != null && i.value != null && Number.isFinite(i.value) && Number.isFinite(typeof i.time == "number" ? i.time : Number(i.time));
11
+ }
12
+ function u(i) {
13
+ return i.filter(l);
14
+ }
15
+ export {
16
+ r as filterValidCandles,
17
+ u as filterValidIndicatorPoints,
18
+ n as isValidCandle,
19
+ l as isValidIndicatorPoint
20
+ };
21
+ //# sourceMappingURL=validateCandle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateCandle.js","sources":["../../src/utils/validateCandle.ts"],"sourcesContent":["import type { CandleData } from '../types';\n\n/**\n * 단일 캔들이 유효한지 검사합니다.\n * lightweight-charts는 null/NaN/Infinity를 허용하지 않으므로\n * OHLC와 time 필드 모두 유한한 숫자인지 확인합니다.\n */\nexport function isValidCandle(c: CandleData): boolean {\n const time = typeof c.time === 'number' ? c.time : Number(c.time);\n return (\n Number.isFinite(time) && time > 0 &&\n Number.isFinite(c.open) &&\n Number.isFinite(c.high) &&\n Number.isFinite(c.low) &&\n Number.isFinite(c.close)\n );\n}\n\n/**\n * 유효하지 않은 캔들을 필터링합니다.\n * 제거된 건수가 있으면 콘솔 경고를 출력합니다.\n */\nexport function filterValidCandles(data: CandleData[], label?: string): CandleData[] {\n const valid = data.filter(isValidCandle);\n if (valid.length !== data.length) {\n console.warn(`[${label ?? 'filterValidCandles'}] Filtered out ${data.length - valid.length} candles with invalid values`);\n }\n return valid;\n}\n\n/**\n * 인디케이터 데이터 포인트가 유효한지 검사합니다.\n */\nexport function isValidIndicatorPoint(d: { time: number; value: number }): boolean {\n return (\n d.time != null &&\n d.value != null &&\n Number.isFinite(d.value) &&\n Number.isFinite(typeof d.time === 'number' ? d.time : Number(d.time))\n );\n}\n\n/**\n * 유효하지 않은 인디케이터 데이터 포인트를 필터링합니다.\n */\nexport function filterValidIndicatorPoints(data: Array<{ time: number; value: number }>): Array<{ time: number; value: number }> {\n return data.filter(isValidIndicatorPoint);\n}\n"],"names":["isValidCandle","c","time","filterValidCandles","data","label","valid","isValidIndicatorPoint","d","filterValidIndicatorPoints"],"mappings":"AAOO,SAASA,EAAcC,GAAwB;AACpD,QAAMC,IAAO,OAAOD,EAAE,QAAS,WAAWA,EAAE,OAAO,OAAOA,EAAE,IAAI;AAChE,SACE,OAAO,SAASC,CAAI,KAAKA,IAAO,KAChC,OAAO,SAASD,EAAE,IAAI,KACtB,OAAO,SAASA,EAAE,IAAI,KACtB,OAAO,SAASA,EAAE,GAAG,KACrB,OAAO,SAASA,EAAE,KAAK;AAE3B;AAMO,SAASE,EAAmBC,GAAoBC,GAA8B;AACnF,QAAMC,IAAQF,EAAK,OAAOJ,CAAa;AACvC,SAAIM,EAAM,WAAWF,EAAK,UACxB,QAAQ,KAAK,IAAIC,KAAS,oBAAoB,kBAAkBD,EAAK,SAASE,EAAM,MAAM,8BAA8B,GAEnHA;AACT;AAKO,SAASC,EAAsBC,GAA6C;AACjF,SACEA,EAAE,QAAQ,QACVA,EAAE,SAAS,QACX,OAAO,SAASA,EAAE,KAAK,KACvB,OAAO,SAAS,OAAOA,EAAE,QAAS,WAAWA,EAAE,OAAO,OAAOA,EAAE,IAAI,CAAC;AAExE;AAKO,SAASC,EAA2BL,GAAsF;AAC/H,SAAOA,EAAK,OAAOG,CAAqB;AAC1C;"}