minerva-design 1.4.0 → 1.5.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 (670) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +4047 -1703
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1436 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +573 -4
  7. package/dist/charts/canvas.d.cts +2 -2
  8. package/dist/charts/canvas.d.ts +2 -2
  9. package/dist/charts/core.cjs +1 -1
  10. package/dist/charts/core.d.cts +6 -4
  11. package/dist/charts/core.d.ts +6 -4
  12. package/dist/charts/core.js +24 -16
  13. package/dist/charts/engine/axis.cjs +1 -1
  14. package/dist/charts/engine/axis.cjs.map +1 -1
  15. package/dist/charts/engine/axis.js +42 -19
  16. package/dist/charts/engine/axis.js.map +1 -1
  17. package/dist/charts/engine/canvas.cjs +1 -1
  18. package/dist/charts/engine/canvas.cjs.map +1 -1
  19. package/dist/charts/engine/canvas.js +154 -127
  20. package/dist/charts/engine/canvas.js.map +1 -1
  21. package/dist/charts/engine/chart.cjs +1 -1
  22. package/dist/charts/engine/chart.cjs.map +1 -1
  23. package/dist/charts/engine/chart.js +365 -251
  24. package/dist/charts/engine/chart.js.map +1 -1
  25. package/dist/charts/engine/color.cjs +1 -1
  26. package/dist/charts/engine/color.cjs.map +1 -1
  27. package/dist/charts/engine/color.d.cts +18 -0
  28. package/dist/charts/engine/color.d.ts +18 -0
  29. package/dist/charts/engine/color.js +48 -2
  30. package/dist/charts/engine/color.js.map +1 -1
  31. package/dist/charts/engine/controller.cjs +2 -2
  32. package/dist/charts/engine/controller.cjs.map +1 -1
  33. package/dist/charts/engine/controller.d.cts +32 -1
  34. package/dist/charts/engine/controller.d.ts +32 -1
  35. package/dist/charts/engine/controller.js +310 -263
  36. package/dist/charts/engine/controller.js.map +1 -1
  37. package/dist/charts/engine/data.cjs +1 -1
  38. package/dist/charts/engine/data.cjs.map +1 -1
  39. package/dist/charts/engine/data.d.cts +3 -1
  40. package/dist/charts/engine/data.d.ts +3 -1
  41. package/dist/charts/engine/data.js +6 -4
  42. package/dist/charts/engine/data.js.map +1 -1
  43. package/dist/charts/engine/defaults.cjs +2 -0
  44. package/dist/charts/engine/defaults.cjs.map +1 -0
  45. package/dist/charts/engine/defaults.d.cts +20 -0
  46. package/dist/charts/engine/defaults.d.ts +20 -0
  47. package/dist/charts/engine/defaults.js +35 -0
  48. package/dist/charts/engine/defaults.js.map +1 -0
  49. package/dist/charts/engine/format.cjs +1 -1
  50. package/dist/charts/engine/format.cjs.map +1 -1
  51. package/dist/charts/engine/format.d.cts +6 -0
  52. package/dist/charts/engine/format.d.ts +6 -0
  53. package/dist/charts/engine/format.js +15 -2
  54. package/dist/charts/engine/format.js.map +1 -1
  55. package/dist/charts/engine/graph/chart.cjs +2 -0
  56. package/dist/charts/engine/graph/chart.cjs.map +1 -0
  57. package/dist/charts/engine/graph/chart.d.cts +3 -0
  58. package/dist/charts/engine/graph/chart.d.ts +3 -0
  59. package/dist/charts/engine/graph/chart.js +1565 -0
  60. package/dist/charts/engine/graph/chart.js.map +1 -0
  61. package/dist/charts/engine/graph/circular.cjs +2 -0
  62. package/dist/charts/engine/graph/circular.cjs.map +1 -0
  63. package/dist/charts/engine/graph/circular.d.cts +16 -0
  64. package/dist/charts/engine/graph/circular.d.ts +16 -0
  65. package/dist/charts/engine/graph/circular.js +62 -0
  66. package/dist/charts/engine/graph/circular.js.map +1 -0
  67. package/dist/charts/engine/graph/dag.cjs +2 -0
  68. package/dist/charts/engine/graph/dag.cjs.map +1 -0
  69. package/dist/charts/engine/graph/dag.d.cts +34 -0
  70. package/dist/charts/engine/graph/dag.d.ts +34 -0
  71. package/dist/charts/engine/graph/dag.js +314 -0
  72. package/dist/charts/engine/graph/dag.js.map +1 -0
  73. package/dist/charts/engine/graph/dom.cjs +2 -0
  74. package/dist/charts/engine/graph/dom.cjs.map +1 -0
  75. package/dist/charts/engine/graph/dom.d.cts +23 -0
  76. package/dist/charts/engine/graph/dom.d.ts +23 -0
  77. package/dist/charts/engine/graph/dom.js +158 -0
  78. package/dist/charts/engine/graph/dom.js.map +1 -0
  79. package/dist/charts/engine/graph/force.cjs +2 -0
  80. package/dist/charts/engine/graph/force.cjs.map +1 -0
  81. package/dist/charts/engine/graph/force.d.cts +67 -0
  82. package/dist/charts/engine/graph/force.d.ts +67 -0
  83. package/dist/charts/engine/graph/force.js +325 -0
  84. package/dist/charts/engine/graph/force.js.map +1 -0
  85. package/dist/charts/engine/graph/geometry.cjs +2 -0
  86. package/dist/charts/engine/graph/geometry.cjs.map +1 -0
  87. package/dist/charts/engine/graph/geometry.d.cts +37 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +37 -0
  89. package/dist/charts/engine/graph/geometry.js +144 -0
  90. package/dist/charts/engine/graph/geometry.js.map +1 -0
  91. package/dist/charts/engine/graph/index.cjs +1 -0
  92. package/dist/charts/engine/graph/index.d.cts +6 -0
  93. package/dist/charts/engine/graph/index.d.ts +6 -0
  94. package/dist/charts/engine/graph/index.js +6 -0
  95. package/dist/charts/engine/graph/labels.cjs +2 -0
  96. package/dist/charts/engine/graph/labels.cjs.map +1 -0
  97. package/dist/charts/engine/graph/labels.d.cts +12 -0
  98. package/dist/charts/engine/graph/labels.d.ts +12 -0
  99. package/dist/charts/engine/graph/labels.js +128 -0
  100. package/dist/charts/engine/graph/labels.js.map +1 -0
  101. package/dist/charts/engine/graph/model.cjs +2 -0
  102. package/dist/charts/engine/graph/model.cjs.map +1 -0
  103. package/dist/charts/engine/graph/model.d.cts +43 -0
  104. package/dist/charts/engine/graph/model.d.ts +43 -0
  105. package/dist/charts/engine/graph/model.js +88 -0
  106. package/dist/charts/engine/graph/model.js.map +1 -0
  107. package/dist/charts/engine/graph/sizing.cjs +2 -0
  108. package/dist/charts/engine/graph/sizing.cjs.map +1 -0
  109. package/dist/charts/engine/graph/sizing.d.cts +33 -0
  110. package/dist/charts/engine/graph/sizing.d.ts +33 -0
  111. package/dist/charts/engine/graph/sizing.js +60 -0
  112. package/dist/charts/engine/graph/sizing.js.map +1 -0
  113. package/dist/charts/engine/graph/tree.cjs +2 -0
  114. package/dist/charts/engine/graph/tree.cjs.map +1 -0
  115. package/dist/charts/engine/graph/tree.d.cts +30 -0
  116. package/dist/charts/engine/graph/tree.d.ts +30 -0
  117. package/dist/charts/engine/graph/tree.js +218 -0
  118. package/dist/charts/engine/graph/tree.js.map +1 -0
  119. package/dist/charts/engine/graph/types.d.cts +626 -0
  120. package/dist/charts/engine/graph/types.d.ts +626 -0
  121. package/dist/charts/engine/graph/worker.cjs +46 -0
  122. package/dist/charts/engine/graph/worker.cjs.map +1 -0
  123. package/dist/charts/engine/graph/worker.d.cts +36 -0
  124. package/dist/charts/engine/graph/worker.d.ts +36 -0
  125. package/dist/charts/engine/graph/worker.js +129 -0
  126. package/dist/charts/engine/graph/worker.js.map +1 -0
  127. package/dist/charts/engine/items.cjs +1 -1
  128. package/dist/charts/engine/items.cjs.map +1 -1
  129. package/dist/charts/engine/items.d.cts +15 -2
  130. package/dist/charts/engine/items.d.ts +15 -2
  131. package/dist/charts/engine/items.js +131 -112
  132. package/dist/charts/engine/items.js.map +1 -1
  133. package/dist/charts/engine/labels.cjs +1 -1
  134. package/dist/charts/engine/labels.cjs.map +1 -1
  135. package/dist/charts/engine/labels.js +28 -4
  136. package/dist/charts/engine/labels.js.map +1 -1
  137. package/dist/charts/engine/layout.cjs +1 -1
  138. package/dist/charts/engine/layout.cjs.map +1 -1
  139. package/dist/charts/engine/layout.d.cts +9 -0
  140. package/dist/charts/engine/layout.d.ts +9 -0
  141. package/dist/charts/engine/layout.js +11 -2
  142. package/dist/charts/engine/layout.js.map +1 -1
  143. package/dist/charts/engine/model.cjs +1 -1
  144. package/dist/charts/engine/model.cjs.map +1 -1
  145. package/dist/charts/engine/model.d.cts +40 -3
  146. package/dist/charts/engine/model.d.ts +40 -3
  147. package/dist/charts/engine/model.js +246 -165
  148. package/dist/charts/engine/model.js.map +1 -1
  149. package/dist/charts/engine/orderbook/format.cjs +1 -1
  150. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  151. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  152. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  153. package/dist/charts/engine/orderbook/format.js +5 -5
  154. package/dist/charts/engine/orderbook/format.js.map +1 -1
  155. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  156. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  157. package/dist/charts/engine/orderbook/heatmap.js +527 -408
  158. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  159. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  160. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  161. package/dist/charts/engine/orderbook/layout.d.cts +37 -0
  162. package/dist/charts/engine/orderbook/layout.d.ts +37 -0
  163. package/dist/charts/engine/orderbook/layout.js +70 -0
  164. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  165. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  166. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  167. package/dist/charts/engine/orderbook/tape.js +1 -1
  168. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  169. package/dist/charts/engine/orderbook/types.d.cts +18 -2
  170. package/dist/charts/engine/orderbook/types.d.ts +18 -2
  171. package/dist/charts/engine/overlay.cjs +1 -1
  172. package/dist/charts/engine/overlay.cjs.map +1 -1
  173. package/dist/charts/engine/overlay.d.cts +10 -0
  174. package/dist/charts/engine/overlay.d.ts +10 -0
  175. package/dist/charts/engine/overlay.js +6 -0
  176. package/dist/charts/engine/overlay.js.map +1 -1
  177. package/dist/charts/engine/presets.cjs +2 -2
  178. package/dist/charts/engine/presets.cjs.map +1 -1
  179. package/dist/charts/engine/presets.d.cts +25 -3
  180. package/dist/charts/engine/presets.d.ts +25 -3
  181. package/dist/charts/engine/presets.js +115 -101
  182. package/dist/charts/engine/presets.js.map +1 -1
  183. package/dist/charts/engine/renderers/detect.cjs +1 -1
  184. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  185. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  186. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  187. package/dist/charts/engine/renderers/detect.js +23 -21
  188. package/dist/charts/engine/renderers/detect.js.map +1 -1
  189. package/dist/charts/engine/scene.cjs +1 -1
  190. package/dist/charts/engine/scene.cjs.map +1 -1
  191. package/dist/charts/engine/scene.d.cts +57 -4
  192. package/dist/charts/engine/scene.d.ts +57 -4
  193. package/dist/charts/engine/scene.js +335 -182
  194. package/dist/charts/engine/scene.js.map +1 -1
  195. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  196. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  197. package/dist/charts/engine/shapes/bullet.js +110 -110
  198. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  199. package/dist/charts/engine/shapes/chart.cjs +1 -1
  200. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  201. package/dist/charts/engine/shapes/chart.js +4 -1
  202. package/dist/charts/engine/shapes/chart.js.map +1 -1
  203. package/dist/charts/engine/shapes/chord.cjs +2 -0
  204. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  205. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  206. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  207. package/dist/charts/engine/shapes/chord.js +414 -0
  208. package/dist/charts/engine/shapes/chord.js.map +1 -0
  209. package/dist/charts/engine/shapes/draw.cjs +1 -1
  210. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  211. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  212. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  213. package/dist/charts/engine/shapes/draw.js +47 -17
  214. package/dist/charts/engine/shapes/draw.js.map +1 -1
  215. package/dist/charts/engine/shapes/hit.cjs +1 -1
  216. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  217. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  218. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  219. package/dist/charts/engine/shapes/hit.js +75 -46
  220. package/dist/charts/engine/shapes/hit.js.map +1 -1
  221. package/dist/charts/engine/shapes/index.d.cts +3 -2
  222. package/dist/charts/engine/shapes/index.d.ts +3 -2
  223. package/dist/charts/engine/shapes/labels.cjs +1 -1
  224. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  225. package/dist/charts/engine/shapes/labels.js +12 -4
  226. package/dist/charts/engine/shapes/labels.js.map +1 -1
  227. package/dist/charts/engine/shapes/layout.cjs +2 -2
  228. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  229. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  230. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  231. package/dist/charts/engine/shapes/layout.js +106 -78
  232. package/dist/charts/engine/shapes/layout.js.map +1 -1
  233. package/dist/charts/engine/shapes/scene.cjs +1 -1
  234. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  235. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  236. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  237. package/dist/charts/engine/shapes/scene.js +62 -19
  238. package/dist/charts/engine/shapes/scene.js.map +1 -1
  239. package/dist/charts/engine/shapes/types.d.cts +119 -8
  240. package/dist/charts/engine/shapes/types.d.ts +119 -8
  241. package/dist/charts/engine/signature.cjs +1 -1
  242. package/dist/charts/engine/signature.cjs.map +1 -1
  243. package/dist/charts/engine/signature.js +1 -1
  244. package/dist/charts/engine/signature.js.map +1 -1
  245. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  246. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  247. package/dist/charts/engine/three-d/canvas2d.d.cts +5 -2
  248. package/dist/charts/engine/three-d/canvas2d.d.ts +5 -2
  249. package/dist/charts/engine/three-d/canvas2d.js +89 -65
  250. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  251. package/dist/charts/engine/three-d/detect.cjs +1 -1
  252. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  253. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  254. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  255. package/dist/charts/engine/three-d/detect.js +22 -20
  256. package/dist/charts/engine/three-d/detect.js.map +1 -1
  257. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  258. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  259. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  260. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  261. package/dist/charts/engine/three-d/geometry.js +106 -90
  262. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  263. package/dist/charts/engine/three-d/model.cjs +1 -1
  264. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  265. package/dist/charts/engine/three-d/model.d.cts +2 -0
  266. package/dist/charts/engine/three-d/model.d.ts +2 -0
  267. package/dist/charts/engine/three-d/model.js +2 -0
  268. package/dist/charts/engine/three-d/model.js.map +1 -1
  269. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  270. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  271. package/dist/charts/engine/three-d/overlay.js +43 -36
  272. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  273. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  274. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  275. package/dist/charts/engine/three-d/render-types.d.cts +24 -3
  276. package/dist/charts/engine/three-d/render-types.d.ts +24 -3
  277. package/dist/charts/engine/three-d/render-types.js +6 -7
  278. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  279. package/dist/charts/engine/three-d/shaders.cjs +63 -28
  280. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  281. package/dist/charts/engine/three-d/shaders.d.cts +2 -3
  282. package/dist/charts/engine/three-d/shaders.d.ts +2 -3
  283. package/dist/charts/engine/three-d/shaders.js +41 -22
  284. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  285. package/dist/charts/engine/three-d/sort.cjs +1 -1
  286. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  287. package/dist/charts/engine/three-d/sort.d.cts +15 -4
  288. package/dist/charts/engine/three-d/sort.d.ts +15 -4
  289. package/dist/charts/engine/three-d/sort.js +117 -43
  290. package/dist/charts/engine/three-d/sort.js.map +1 -1
  291. package/dist/charts/engine/three-d/types.d.cts +27 -0
  292. package/dist/charts/engine/three-d/types.d.ts +27 -0
  293. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  294. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  295. package/dist/charts/engine/three-d/webgl.js +15 -13
  296. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  297. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  298. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  299. package/dist/charts/engine/three-d/webgpu.js +50 -39
  300. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  301. package/dist/charts/engine/trading/chart.cjs +1 -1
  302. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  303. package/dist/charts/engine/trading/chart.d.cts +10 -0
  304. package/dist/charts/engine/trading/chart.d.ts +10 -0
  305. package/dist/charts/engine/trading/chart.js +1475 -776
  306. package/dist/charts/engine/trading/chart.js.map +1 -1
  307. package/dist/charts/engine/trading/drawings.cjs +2 -1
  308. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  309. package/dist/charts/engine/trading/drawings.d.cts +47 -9
  310. package/dist/charts/engine/trading/drawings.d.ts +47 -9
  311. package/dist/charts/engine/trading/drawings.js +338 -75
  312. package/dist/charts/engine/trading/drawings.js.map +1 -1
  313. package/dist/charts/engine/trading/format.cjs +1 -1
  314. package/dist/charts/engine/trading/format.cjs.map +1 -1
  315. package/dist/charts/engine/trading/format.d.cts +13 -0
  316. package/dist/charts/engine/trading/format.d.ts +13 -0
  317. package/dist/charts/engine/trading/format.js +51 -19
  318. package/dist/charts/engine/trading/format.js.map +1 -1
  319. package/dist/charts/engine/trading/index.cjs +1 -1
  320. package/dist/charts/engine/trading/index.d.cts +2 -1
  321. package/dist/charts/engine/trading/index.d.ts +2 -1
  322. package/dist/charts/engine/trading/index.js +4 -3
  323. package/dist/charts/engine/trading/indicators.cjs +1 -1
  324. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  325. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  326. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  327. package/dist/charts/engine/trading/indicators.js +449 -173
  328. package/dist/charts/engine/trading/indicators.js.map +1 -1
  329. package/dist/charts/engine/trading/labels.cjs +1 -1
  330. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  331. package/dist/charts/engine/trading/labels.js +84 -4
  332. package/dist/charts/engine/trading/labels.js.map +1 -1
  333. package/dist/charts/engine/trading/store.cjs +1 -1
  334. package/dist/charts/engine/trading/store.cjs.map +1 -1
  335. package/dist/charts/engine/trading/store.d.cts +21 -0
  336. package/dist/charts/engine/trading/store.d.ts +21 -0
  337. package/dist/charts/engine/trading/store.js +22 -1
  338. package/dist/charts/engine/trading/store.js.map +1 -1
  339. package/dist/charts/engine/trading/studies.cjs +1 -1
  340. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  341. package/dist/charts/engine/trading/studies.d.cts +41 -8
  342. package/dist/charts/engine/trading/studies.d.ts +41 -8
  343. package/dist/charts/engine/trading/studies.js +349 -93
  344. package/dist/charts/engine/trading/studies.js.map +1 -1
  345. package/dist/charts/engine/trading/sync.cjs +2 -0
  346. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  347. package/dist/charts/engine/trading/sync.d.cts +8 -0
  348. package/dist/charts/engine/trading/sync.d.ts +8 -0
  349. package/dist/charts/engine/trading/sync.js +25 -0
  350. package/dist/charts/engine/trading/sync.js.map +1 -0
  351. package/dist/charts/engine/trading/types.d.cts +484 -9
  352. package/dist/charts/engine/trading/types.d.ts +484 -9
  353. package/dist/charts/engine/types.d.cts +82 -8
  354. package/dist/charts/engine/types.d.ts +82 -8
  355. package/dist/charts/index.cjs +1 -1
  356. package/dist/charts/index.d.cts +3 -2
  357. package/dist/charts/index.d.ts +3 -2
  358. package/dist/charts/index.js +30 -22
  359. package/dist/charts/react/charts.cjs +1 -1
  360. package/dist/charts/react/charts.cjs.map +1 -1
  361. package/dist/charts/react/charts.js +46 -34
  362. package/dist/charts/react/charts.js.map +1 -1
  363. package/dist/charts/react/graph.cjs +2 -0
  364. package/dist/charts/react/graph.cjs.map +1 -0
  365. package/dist/charts/react/graph.d.cts +213 -0
  366. package/dist/charts/react/graph.d.ts +213 -0
  367. package/dist/charts/react/graph.js +159 -0
  368. package/dist/charts/react/graph.js.map +1 -0
  369. package/dist/charts/react/shapes.cjs +1 -1
  370. package/dist/charts/react/shapes.cjs.map +1 -1
  371. package/dist/charts/react/shapes.d.cts +87 -4
  372. package/dist/charts/react/shapes.d.ts +87 -4
  373. package/dist/charts/react/shapes.js +55 -12
  374. package/dist/charts/react/shapes.js.map +1 -1
  375. package/dist/charts/react/trading.cjs +1 -1
  376. package/dist/charts/react/trading.cjs.map +1 -1
  377. package/dist/charts/react/trading.d.cts +53 -1
  378. package/dist/charts/react/trading.d.ts +53 -1
  379. package/dist/charts/react/trading.js +68 -37
  380. package/dist/charts/react/trading.js.map +1 -1
  381. package/dist/charts/react/types.d.cts +11 -0
  382. package/dist/charts/react/types.d.ts +11 -0
  383. package/dist/core/contracts.cjs +1 -1
  384. package/dist/core/contracts.cjs.map +1 -1
  385. package/dist/core/contracts.js +1 -1
  386. package/dist/core/contracts.js.map +1 -1
  387. package/dist/native/charts/src/canvas.cjs +1 -1
  388. package/dist/native/charts/src/canvas.js +3 -3
  389. package/dist/native/charts/src/engine/axis.cjs +1 -1
  390. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  391. package/dist/native/charts/src/engine/axis.js +42 -19
  392. package/dist/native/charts/src/engine/axis.js.map +1 -1
  393. package/dist/native/charts/src/engine/color.cjs +1 -1
  394. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  395. package/dist/native/charts/src/engine/color.js +47 -5
  396. package/dist/native/charts/src/engine/color.js.map +1 -1
  397. package/dist/native/charts/src/engine/controller.cjs +2 -2
  398. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  399. package/dist/native/charts/src/engine/controller.js +300 -253
  400. package/dist/native/charts/src/engine/controller.js.map +1 -1
  401. package/dist/native/charts/src/engine/data.cjs +1 -1
  402. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  403. package/dist/native/charts/src/engine/data.js +6 -4
  404. package/dist/native/charts/src/engine/data.js.map +1 -1
  405. package/dist/native/charts/src/engine/format.cjs +1 -1
  406. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  407. package/dist/native/charts/src/engine/format.js +15 -2
  408. package/dist/native/charts/src/engine/format.js.map +1 -1
  409. package/dist/native/charts/src/engine/labels.cjs +1 -1
  410. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  411. package/dist/native/charts/src/engine/labels.js +28 -4
  412. package/dist/native/charts/src/engine/labels.js.map +1 -1
  413. package/dist/native/charts/src/engine/layout.cjs +1 -1
  414. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  415. package/dist/native/charts/src/engine/layout.js +11 -2
  416. package/dist/native/charts/src/engine/layout.js.map +1 -1
  417. package/dist/native/charts/src/engine/model.cjs +1 -1
  418. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  419. package/dist/native/charts/src/engine/model.js +252 -171
  420. package/dist/native/charts/src/engine/model.js.map +1 -1
  421. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  422. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  423. package/dist/native/charts/src/engine/presets.cjs +2 -2
  424. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  425. package/dist/native/charts/src/engine/presets.js +104 -90
  426. package/dist/native/charts/src/engine/presets.js.map +1 -1
  427. package/dist/native/charts/src/engine/scene.cjs +1 -1
  428. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  429. package/dist/native/charts/src/engine/scene.js +341 -188
  430. package/dist/native/charts/src/engine/scene.js.map +1 -1
  431. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  432. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  433. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  434. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  435. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  436. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  437. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  438. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  439. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  440. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  441. package/dist/native/charts/src/engine/shapes/chord.js +414 -0
  442. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  443. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  444. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  445. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  446. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  447. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  448. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  449. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  450. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  451. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  452. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  453. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  454. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  455. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  456. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  457. package/dist/native/charts/src/engine/shapes/layout.js +117 -90
  458. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  459. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  460. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  461. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  462. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  463. package/dist/native/components/Chart/scene.cjs +1 -1
  464. package/dist/native/components/Chart/scene.cjs.map +1 -1
  465. package/dist/native/components/Chart/scene.js +140 -71
  466. package/dist/native/components/Chart/scene.js.map +1 -1
  467. package/dist/native/components/Charts/charts.cjs +1 -1
  468. package/dist/native/components/Charts/charts.cjs.map +1 -1
  469. package/dist/native/components/Charts/charts.js +54 -42
  470. package/dist/native/components/Charts/charts.js.map +1 -1
  471. package/dist/native/components/Charts/types.d.cts +11 -0
  472. package/dist/native/components/Charts/types.d.ts +11 -0
  473. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  474. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  475. package/dist/native/components/ShapeChart/ShapeChartBase.js +1 -0
  476. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  477. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  478. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  479. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  480. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  481. package/dist/native/components/ShapeChart/charts.js +138 -96
  482. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  483. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  484. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  485. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  486. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  487. package/dist/native/components/ShapeChart/draw.js +26 -17
  488. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  489. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  490. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  491. package/dist/native/components/ShapeChart/geometry.js +138 -59
  492. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  493. package/dist/native/components/ShapeChart/index.cjs +1 -1
  494. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  495. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  496. package/dist/native/components/ShapeChart/index.js +2 -2
  497. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  498. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  499. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  500. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  501. package/dist/native/components/ShapeChart/recorder.js +19 -10
  502. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  503. package/dist/native/components/ShapeChart/types.d.cts +92 -7
  504. package/dist/native/components/ShapeChart/types.d.ts +92 -7
  505. package/dist/native/index.cjs +1 -1
  506. package/dist/native/index.js +2 -2
  507. package/dist/native/source/components/Chart/scene.tsx +158 -14
  508. package/dist/native/source/components/Charts/charts.tsx +30 -2
  509. package/dist/native/source/components/Charts/types.ts +11 -0
  510. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +2 -0
  511. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  512. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  513. package/dist/native/source/components/ShapeChart/geometry.ts +189 -8
  514. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  515. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  516. package/dist/native/source/components/ShapeChart/types.ts +96 -5
  517. package/dist/native/source/manifest.ts +1 -0
  518. package/dist/taro/charts.d.ts +25 -5
  519. package/dist/taro/index.js +3900 -2836
  520. package/dist/taro/shape-charts.d.ts +96 -4
  521. package/dist/uni/AreaChart.vue.d.ts +5 -1
  522. package/dist/uni/Badge.vue.d.ts +1 -1
  523. package/dist/uni/BarChart.vue.d.ts +5 -1
  524. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  525. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  526. package/dist/uni/BulletChart.vue.d.ts +4 -0
  527. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  528. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  529. package/dist/uni/Chart.vue.d.ts +4 -0
  530. package/dist/uni/ChordChart.vue +93 -0
  531. package/dist/uni/ChordChart.vue.d.ts +136 -0
  532. package/dist/uni/DonutChart.vue.d.ts +4 -0
  533. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  534. package/dist/uni/GanttChart.vue.d.ts +4 -0
  535. package/dist/uni/GaugeChart.vue.d.ts +4 -0
  536. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  537. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  538. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  539. package/dist/uni/LineChart.vue.d.ts +4 -0
  540. package/dist/uni/MixedChart.vue.d.ts +4 -0
  541. package/dist/uni/PieChart.vue.d.ts +4 -0
  542. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  543. package/dist/uni/RadarChart.vue.d.ts +4 -0
  544. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  545. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  546. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  547. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  548. package/dist/uni/Sparkline.vue.d.ts +4 -0
  549. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  550. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  551. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  552. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  553. package/dist/uni/chart-canvas.d.ts +3 -0
  554. package/dist/uni/chart-canvas.js +4 -0
  555. package/dist/uni/chart-types.d.ts +28 -4
  556. package/dist/uni/chart-types.js +26 -2
  557. package/dist/uni/charts-canvas.js +1 -1
  558. package/dist/uni/index.d.ts +2 -1
  559. package/dist/uni/index.js +1 -0
  560. package/dist/uni/manifest.d.ts +7 -0
  561. package/dist/uni/manifest.js +10 -0
  562. package/dist/uni/named-chart-options.d.ts +9 -2
  563. package/dist/uni/named-chart-options.js +18 -1
  564. package/dist/uni/shape-chart-canvas.d.ts +3 -1
  565. package/dist/uni/shape-chart-canvas.js +15 -24
  566. package/dist/uni/shape-chart-types.d.ts +52 -2
  567. package/dist/uni/shape-chart-types.js +44 -0
  568. package/dist/vue/charts-global.d.ts +48 -0
  569. package/dist/vue/charts.d.ts +18 -0
  570. package/dist/vue/charts.js +56 -0
  571. package/dist/vue/charts.js.map +1 -0
  572. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  573. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  574. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  575. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  576. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  577. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  578. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  579. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  580. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  581. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +179 -0
  582. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  583. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  584. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  585. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  586. package/dist/vue/components/Chart/GanttChart.vue.d.ts +4 -0
  587. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  588. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +4 -1
  589. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  590. package/dist/vue/components/Chart/GraphChart.vue.d.ts +184 -0
  591. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  592. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  593. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  594. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  595. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  596. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  597. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  598. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  599. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  600. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  601. package/dist/vue/components/Chart/TradingChart.vue.d.ts +49 -1
  602. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  603. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  604. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  605. package/dist/vue/components/Chart/TreeChart.vue.d.ts +172 -0
  606. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  607. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  608. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  609. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  610. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  611. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  612. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  613. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  614. package/dist/vue/components/Chart/graph.d.ts +153 -0
  615. package/dist/vue/components/Chart/graph.js +135 -0
  616. package/dist/vue/components/Chart/graph.js.map +1 -0
  617. package/dist/vue/components/Chart/index.d.ts +5 -1
  618. package/dist/vue/components/Chart/index.js +5 -1
  619. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  620. package/dist/vue/components/Chart/orderbook.js +2 -0
  621. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  622. package/dist/vue/components/Chart/trading.d.ts +24 -2
  623. package/dist/vue/components/Chart/trading.js +8 -0
  624. package/dist/vue/components/Chart/trading.js.map +1 -1
  625. package/dist/vue/components/Chart/types.d.ts +74 -2
  626. package/dist/vue/global.d.ts +2 -38
  627. package/dist/vue/groups/charts.js +10 -2
  628. package/dist/vue/groups/charts.js.map +1 -1
  629. package/dist/vue/index.js +6 -2
  630. package/dist/vue/internal/register.d.ts +7 -0
  631. package/dist/vue/internal/register.js +14 -0
  632. package/dist/vue/internal/register.js.map +1 -0
  633. package/dist/vue/plugin.d.ts +9 -4
  634. package/dist/vue/plugin.js +6 -11
  635. package/dist/vue/plugin.js.map +1 -1
  636. package/dist/weapp/charts/canvas.js +1687 -147
  637. package/dist/weapp/charts/core.js +1 -0
  638. package/dist/weapp/chord-chart/index.js +1 -0
  639. package/dist/weapp/chord-chart/index.json +1 -0
  640. package/dist/weapp/chord-chart/index.wxml +1 -0
  641. package/dist/weapp/chord-chart/index.wxss +1 -0
  642. package/dist/weapp/controls.js +92 -32
  643. package/dist/weapp/types.d.ts +87 -4
  644. package/dist/web-components/components/chart/charts.d.ts +4 -2
  645. package/dist/web-components/components/chart/charts.js +8 -1
  646. package/dist/web-components/components/chart/charts.js.map +1 -1
  647. package/dist/web-components/components/chart/extended.d.ts +17 -7
  648. package/dist/web-components/components/chart/extended.js +23 -9
  649. package/dist/web-components/components/chart/extended.js.map +1 -1
  650. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  651. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  652. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  653. package/dist/web-components/components/graph/graph.d.ts +154 -0
  654. package/dist/web-components/components/graph/graph.js +149 -0
  655. package/dist/web-components/components/graph/graph.js.map +1 -0
  656. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  657. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  658. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  659. package/dist/web-components/elements/chart.d.ts +1 -1
  660. package/dist/web-components/elements/chart.js +6 -5
  661. package/dist/web-components/elements/chart.js.map +1 -1
  662. package/dist/web-components/elements/graph.d.ts +2 -0
  663. package/dist/web-components/elements/graph.js +12 -0
  664. package/dist/web-components/elements/graph.js.map +1 -0
  665. package/dist/web-components/html-custom-data.json +273 -4
  666. package/dist/web-components/types/react.d.ts +63 -4
  667. package/dist/web-components/types/solid.d.ts +55 -8
  668. package/dist/web-components/types/svelte.d.ts +55 -8
  669. package/dist/web-components/types/vue.d.ts +55 -4
  670. package/package.json +16 -1
@@ -1,2 +1,2 @@
1
- const e=require("../locale.cjs");var t=6e4,n=36e5,r=864e5,i=(t,n)=>e.numberFormat(e.resolveLocale(t),n),a=(e,t,n)=>{let r=0,i=Math.max(0,n-300,t);for(let t=i;t<n;t++){let n=Math.abs(e[t]);if(Number.isFinite(n))for(;r<8;){let e=n*10**r;if(Math.abs(e-Math.round(e))<1e-8*Math.max(1,e))break;r++}}return r},o=(e,t)=>{let n=Math.max(0,Math.min(12,Math.round(e))),r=i(t,{minimumFractionDigits:n,maximumFractionDigits:n});return e=>Number.isFinite(e)?r.format(e):`–`},s=(t,n)=>{if(!Number.isFinite(t))return`–`;let r=i(n,{maximumFractionDigits:2}),a=Math.abs(t);for(let[i,o]of e.compactUnits(n))if(a>=i*.999995)return`${r.format(t/i)}${o}`;return r.format(t)},c=(e,t,n=2)=>{if(!Number.isFinite(e))return`–`;let r=i(t,{minimumFractionDigits:n,maximumFractionDigits:n}).format(Math.abs(e));return`${Math.abs(e)<.5*10**-n?``:e>0?`+`:`−`}${r}%`},l=(e,t,n)=>Number.isFinite(e)?i(n,{minimumFractionDigits:t,maximumFractionDigits:t}).format(e):`–`,u=new Map,d=(t,n)=>{let r=`${t??``}|${JSON.stringify(n)}`,i=u.get(r);if(!i){let a={...n,timeZone:`UTC`};try{i=new Intl.DateTimeFormat(e.resolveLocale(t),a)}catch{i=new Intl.DateTimeFormat(`en`,a)}u.set(r,i)}return i},f=(e,t)=>t??-new Date(Number.isFinite(e)?e:0).getTimezoneOffset(),p=(e,n)=>e+f(e,n)*t,m=(e,r)=>{if(!Number.isFinite(e))return 70;let i=new Date(e),a=new Date(r);if(i.getUTCFullYear()!==a.getUTCFullYear())return 70;if(i.getUTCMonth()!==a.getUTCMonth())return 60;if(i.getUTCDate()!==a.getUTCDate())return 50;let o=[[12*n,46],[6*n,45],[3*n,44],[n,43],[30*t,34],[15*t,33],[5*t,32],[t,31],[3e4,24],[15e3,23],[5e3,22],[1e3,21]];for(let[t,n]of o)if(Math.floor(e/t)!==Math.floor(r/t))return n;return 10},h=(e,t,n,r)=>t>=70?d(n,{year:`numeric`}).format(e):t>=60?d(n,{month:`short`}).format(e):t>=50?r?d(n,{month:`short`,day:`numeric`}).format(e):d(n,{day:`numeric`}).format(e):t>=30?d(n,{hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`}).format(e):d(n,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hourCycle:`h23`}).format(e),g=(e,t)=>{let n=e.map((e,t)=>t).sort((t,n)=>e[n].weight-e[t].weight||t-n),r=[],i=[];for(let a of n){let n=e[a],o=0,s=r.length;for(;o<s;){let e=o+s>>>1;r[e]<n.x?o=e+1:s=e}let c=o>0?r[o-1]:-1/0,l=o<r.length?r[o]:1/0;n.x-c<t||l-n.x<t||(r.splice(o,0,n.x),i.push(n))}return i.sort((e,t)=>e.x-t.x)},_=(e,t,n)=>{let r={weekday:`short`,year:`numeric`,month:`short`,day:`numeric`};return t>=864e5?d(n,r).format(e):d(n,{...r,hour:`2-digit`,minute:`2-digit`,...t<6e4?{second:`2-digit`}:{},hourCycle:`h23`}).format(e)},v=(e,t={days:`{count}d`,hours:`{count}h`})=>{let n=Math.max(0,Math.floor(e/1e3)),r=e=>String(e).padStart(2,`0`);if(n>=86400){let e=String(Math.floor(n/86400)),i=r(Math.floor(n%86400/3600));return`${t.days.replace(`{count}`,e)} ${t.hours.replace(`{count}`,i)}`}return n>=3600?`${r(Math.floor(n/3600))}:${r(Math.floor(n%3600/60))}:${r(n%60)}`:`${r(Math.floor(n/60))}:${r(n%60)}`},y=(e,t)=>{let n=[];for(let r=Math.max(1,t-64);r<t;r++){let t=e[r]-e[r-1];t>0&&Number.isFinite(t)&&n.push(t)}return n.length?(n.sort((e,t)=>e-t),n[Math.floor(n.length*.25)]):r};exports.DAY=r,exports.HOUR=n,exports.MINUTE=t,exports.boundaryWeight=m,exports.dateFormat=d,exports.detectPrecision=a,exports.formatCountdown=v,exports.formatCrosshairTime=_,exports.formatFixed=l,exports.formatPercent=c,exports.formatVolume=s,exports.inferTimeframe=y,exports.offsetAt=f,exports.pickTicks=g,exports.priceFormatter=o,exports.shiftTime=p,exports.tickText=h;
1
+ const e=require("../locale.cjs");var t=6e4,n=36e5,r=864e5,i=(t,n)=>e.numberFormat(e.resolveLocale(t),n),a=(e,t,n)=>{let r=0,i=Math.max(0,n-300,t);for(let t=i;t<n;t++){let n=Math.abs(e[t]);if(Number.isFinite(n))for(;r<8;){let e=n*10**r;if(Math.abs(e-Math.round(e))<1e-8*Math.max(1,e))break;r++}}return r},o=(e,t)=>{let n=Math.max(0,Math.min(12,Math.round(e))),r=i(t,{minimumFractionDigits:n,maximumFractionDigits:n});return e=>Number.isFinite(e)?s(r.format(e)):`–`},s=e=>e.replace(`-`,`−`),c=(t,n)=>{if(!Number.isFinite(t))return`–`;let r=i(n,{maximumFractionDigits:2}),a=Math.abs(t);for(let[i,o]of e.compactUnits(n))if(a>=i*.999995)return s(`${r.format(t/i)}${o}`);return s(r.format(t))},l=(e,t,n=2)=>{if(!Number.isFinite(e))return`–`;let r=i(t,{minimumFractionDigits:n,maximumFractionDigits:n}).format(Math.abs(e));return`${Math.abs(e)<.5*10**-n?``:e>0?`+`:`−`}${r}%`},u=(e,t,n)=>Number.isFinite(e)?s(i(n,{minimumFractionDigits:t,maximumFractionDigits:t}).format(e)):`–`,d=new Map,f=(t,n)=>{let r=`${t??``}|${JSON.stringify(n)}`,i=d.get(r);if(!i){let a={...n,timeZone:`UTC`};try{i=new Intl.DateTimeFormat(e.resolveLocale(t),a)}catch{i=new Intl.DateTimeFormat(`en`,a)}d.set(r,i)}return i},p=(e,t)=>typeof e==`number`?e:e(t),m=new Map,h=new Map,g=15*t,_=e=>v(e)!==null,v=e=>{let t=m.get(e);if(t===void 0){try{t=new Intl.DateTimeFormat(`en-US`,{timeZone:e,hourCycle:`h23`,year:`numeric`,month:`numeric`,day:`numeric`,hour:`numeric`,minute:`numeric`})}catch{t=null}m.set(e,t)}return t},y=(e,n)=>{let r=v(n);if(!r||!Number.isFinite(e))return-new Date(Number.isFinite(e)?e:0).getTimezoneOffset();let i=h.get(n);i||h.set(n,i=new Map);let a=Math.floor(e/g),o=i.get(a);if(o===void 0){let e=a*g,n={};for(let t of r.formatToParts(e))t.type!==`literal`&&(n[t.type]=Number(t.value));let s=Date.UTC(n.year??1970,(n.month??1)-1,n.day??1,(n.hour??0)%24,n.minute??0);o=Math.round((s-e)/t),i.size>5e4&&i.clear(),i.set(a,o)}return o},b=(e,r)=>{if(!Number.isFinite(e))return 70;let i=new Date(e),a=new Date(r);if(i.getUTCFullYear()!==a.getUTCFullYear())return 70;if(i.getUTCMonth()!==a.getUTCMonth())return 60;if(i.getUTCDate()!==a.getUTCDate())return 50;let o=[[12*n,46],[6*n,45],[3*n,44],[n,43],[30*t,34],[15*t,33],[5*t,32],[t,31],[3e4,24],[15e3,23],[5e3,22],[1e3,21]];for(let[t,n]of o)if(Math.floor(e/t)!==Math.floor(r/t))return n;return 10},x=(e,t,n,r)=>t>=70?f(n,{year:`numeric`}).format(e):t>=60?f(n,{month:`short`}).format(e):t>=50?r?f(n,{month:`short`,day:`numeric`}).format(e):f(n,{day:`numeric`}).format(e):t>=30?f(n,{hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`}).format(e):f(n,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hourCycle:`h23`}).format(e),S=(e,t)=>{let n=e.map((e,t)=>t).sort((t,n)=>e[n].weight-e[t].weight||t-n),r=[],i=[];for(let a of n){let n=e[a],o=0,s=r.length;for(;o<s;){let e=o+s>>>1;r[e]<n.x?o=e+1:s=e}let c=o>0?r[o-1]:-1/0,l=o<r.length?r[o]:1/0;n.x-c<t||l-n.x<t||(r.splice(o,0,n.x),i.push(n))}return i.sort((e,t)=>e.x-t.x)},C=(e,t,n)=>{let r={weekday:`short`,year:`numeric`,month:`short`,day:`numeric`};return t>=864e5?f(n,r).format(e):f(n,{...r,hour:`2-digit`,minute:`2-digit`,...t<6e4?{second:`2-digit`}:{},hourCycle:`h23`}).format(e)},w=(e,t={days:`{count}d`,hours:`{count}h`})=>{let n=Math.max(0,Math.floor(e/1e3)),r=e=>String(e).padStart(2,`0`);if(n>=86400){let e=String(Math.floor(n/86400)),i=r(Math.floor(n%86400/3600));return`${t.days.replace(`{count}`,e)} ${t.hours.replace(`{count}`,i)}`}return n>=3600?`${r(Math.floor(n/3600))}:${r(Math.floor(n%3600/60))}:${r(n%60)}`:`${r(Math.floor(n/60))}:${r(n%60)}`},T=(e,t)=>{let n=[];for(let r=Math.max(1,t-64);r<t;r++){let t=e[r]-e[r-1];t>0&&Number.isFinite(t)&&n.push(t)}return n.length?(n.sort((e,t)=>e-t),n[Math.floor(n.length*.25)]):r};exports.DAY=r,exports.HOUR=n,exports.MINUTE=t,exports.boundaryWeight=b,exports.dateFormat=f,exports.detectPrecision=a,exports.formatCountdown=w,exports.formatCrosshairTime=C,exports.formatFixed=u,exports.formatPercent=l,exports.formatVolume=c,exports.inferTimeframe=T,exports.isTimeZone=_,exports.offsetOf=p,exports.pickTicks=S,exports.priceFormatter=o,exports.tickText=x,exports.typographicMinus=s,exports.zoneOffset=y;
2
2
  //# sourceMappingURL=format.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.cjs","names":["sharedNumberFormat","resolveLocale","compactUnits","require_locale","MINUTE","HOUR","DAY","numberFormat","locale","options","detectPrecision","decimals","start","to","from","i","v","values","scaled","priceFormatter","p","precision","format","value","formatVolume","abs","unit","suffix","formatPercent","text","formatFixed","dateFormats","dateFormat","key","full","offsetAt","utcOffset","time","shiftTime","boundaryWeight","prev","a","b","steps","weight","tickText","intraday","pickTicks","order","candidates","kept","result","c","lo","hi","mid","left","right","minGap","formatCrosshairTime","date","timeframeMs","shifted","formatCountdown","s","ms","pad","days","hours","units","inferTimeframe","gaps","n","d"],"sources":["../../../../../charts/src/engine/trading/format.ts"],"sourcesContent":["// Formatting of prices, volumes and times, and the labels of the time axis.\n// `locale` is resolved by the caller (`resolveLocale`) on hot paths.\n\nimport {\n compactUnits,\n numberFormat as sharedNumberFormat,\n resolveLocale,\n} from \"../locale\";\n\nexport const MINUTE = 60_000;\nexport const HOUR = 3_600_000;\nexport const DAY = 86_400_000;\n\nconst numberFormat = (\n locale: string | undefined,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat => sharedNumberFormat(resolveLocale(locale), options);\n\n/** Decimals needed by the prices (0-8), detected from a sample of them */\nexport const detectPrecision = (\n values: ArrayLike<number>,\n from: number,\n to: number,\n): number => {\n let decimals = 0;\n const start = Math.max(0, to - 300, from);\n for (let i = start; i < to; i++) {\n const v = Math.abs(values[i]);\n if (!Number.isFinite(v)) continue;\n while (decimals < 8) {\n const scaled = v * 10 ** decimals;\n if (Math.abs(scaled - Math.round(scaled)) < 1e-8 * Math.max(1, scaled))\n break;\n decimals++;\n }\n }\n return decimals;\n};\n\n/** Price formatter: fixed decimals, grouped digits of `locale` */\nexport const priceFormatter = (\n precision: number,\n locale: string | undefined,\n): ((value: number) => string) => {\n const p = Math.max(0, Math.min(12, Math.round(precision)));\n const format = numberFormat(locale, {\n minimumFractionDigits: p,\n maximumFractionDigits: p,\n });\n return (value) => (Number.isFinite(value) ? format.format(value) : \"–\");\n};\n\n/** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */\nexport const formatVolume = (value: number, locale?: string): string => {\n if (!Number.isFinite(value)) return \"–\";\n const format = numberFormat(locale, { maximumFractionDigits: 2 });\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(locale)) {\n // 999,999 shows as 1M, not 1,000k\n if (abs >= unit * 0.999995)\n return `${format.format(value / unit)}${suffix}`;\n }\n return format.format(value);\n};\n\n/** `+1.25%` */\nexport const formatPercent = (\n value: number,\n locale?: string,\n decimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const text = numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(Math.abs(value));\n const zero = Math.abs(value) < 0.5 * 10 ** -decimals;\n return `${zero ? \"\" : value > 0 ? \"+\" : \"−\"}${text}%`;\n};\n\n/** Any value with `decimals` decimals (indicator panes) */\nexport const formatFixed = (\n value: number,\n decimals: number,\n locale?: string,\n): string =>\n Number.isFinite(value)\n ? numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value)\n : \"–\";\n\n// ------------------------------------------------------------------ times\n\nconst dateFormats = new Map<string, Intl.DateTimeFormat>();\n\n/** Formats shifted times with the UTC getters (the offset is applied before) */\nexport const dateFormat = (\n locale: string | undefined,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat => {\n const key = `${locale ?? \"\"}|${JSON.stringify(options)}`;\n let format = dateFormats.get(key);\n if (!format) {\n const full = { ...options, timeZone: \"UTC\" };\n try {\n format = new Intl.DateTimeFormat(resolveLocale(locale), full);\n } catch {\n format = new Intl.DateTimeFormat(\"en\", full);\n }\n dateFormats.set(key, format);\n }\n return format;\n};\n\n/** Offset of the displayed time from UTC, in minutes, at `time` */\nexport const offsetAt = (time: number, utcOffset: number | undefined) =>\n utcOffset ?? -new Date(Number.isFinite(time) ? time : 0).getTimezoneOffset();\n\n/** Time shifted so that the UTC getters read the displayed time */\nexport const shiftTime = (time: number, utcOffset: number | undefined) =>\n time + offsetAt(time, utcOffset) * MINUTE;\n\n/**\n * Weight of the boundary between two consecutive (shifted) bar times: the\n * largest calendar unit that changes (year 70, month 60, day 50, hours\n * 43-46, minutes 31-34, seconds 21-24, 10 otherwise)\n */\nexport const boundaryWeight = (prev: number, time: number): number => {\n if (!Number.isFinite(prev)) return 70;\n const a = new Date(prev);\n const b = new Date(time);\n if (a.getUTCFullYear() !== b.getUTCFullYear()) return 70;\n if (a.getUTCMonth() !== b.getUTCMonth()) return 60;\n if (a.getUTCDate() !== b.getUTCDate()) return 50;\n const steps: readonly [number, number][] = [\n [12 * HOUR, 46],\n [6 * HOUR, 45],\n [3 * HOUR, 44],\n [HOUR, 43],\n [30 * MINUTE, 34],\n [15 * MINUTE, 33],\n [5 * MINUTE, 32],\n [MINUTE, 31],\n [30_000, 24],\n [15_000, 23],\n [5_000, 22],\n [1_000, 21],\n ];\n for (const [unit, weight] of steps) {\n if (Math.floor(prev / unit) !== Math.floor(time / unit)) return weight;\n }\n return 10;\n};\n\n/** A label of the time axis */\nexport interface TimeTick {\n /** x in CSS pixels */\n x: number;\n text: string;\n /** Larger unit (new day of an intraday chart, new month / year) */\n bold: boolean;\n}\n\n/** Text of a tick of weight `weight` at the shifted time `time` */\nexport const tickText = (\n time: number,\n weight: number,\n locale: string | undefined,\n intraday: boolean,\n): string => {\n if (weight >= 70) return dateFormat(locale, { year: \"numeric\" }).format(time);\n if (weight >= 60) return dateFormat(locale, { month: \"short\" }).format(time);\n if (weight >= 50) {\n return intraday\n ? dateFormat(locale, { month: \"short\", day: \"numeric\" }).format(time)\n : dateFormat(locale, { day: \"numeric\" }).format(time);\n }\n if (weight >= 30)\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n};\n\n/**\n * Picks the time labels: candidates by decreasing weight, each kept when\n * no kept label is closer than `minGap` pixels\n */\nexport const pickTicks = (\n candidates: readonly { x: number; weight: number; time: number }[],\n minGap: number,\n): { x: number; weight: number; time: number }[] => {\n const order = candidates\n .map((_, i) => i)\n .sort((a, b) => candidates[b].weight - candidates[a].weight || a - b);\n const kept: number[] = [];\n const result: { x: number; weight: number; time: number }[] = [];\n for (const i of order) {\n const c = candidates[i];\n // binary search of the kept x positions\n let lo = 0;\n let hi = kept.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (kept[mid] < c.x) lo = mid + 1;\n else hi = mid;\n }\n const left = lo > 0 ? kept[lo - 1] : -Infinity;\n const right = lo < kept.length ? kept[lo] : Infinity;\n if (c.x - left < minGap || right - c.x < minGap) continue;\n kept.splice(lo, 0, c.x);\n result.push(c);\n }\n return result.sort((a, b) => a.x - b.x);\n};\n\n/** Full time of the crosshair label (`Tue 12 Mar '24 14:35`) */\nexport const formatCrosshairTime = (\n shifted: number,\n timeframeMs: number,\n locale: string | undefined,\n): string => {\n const date: Intl.DateTimeFormatOptions = {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n };\n if (timeframeMs >= DAY) return dateFormat(locale, date).format(shifted);\n return dateFormat(locale, {\n ...date,\n hour: \"2-digit\",\n minute: \"2-digit\",\n ...(timeframeMs < MINUTE ? { second: \"2-digit\" } : {}),\n hourCycle: \"h23\",\n }).format(shifted);\n};\n\n/**\n * Time left before a bar closes: `42`, `04:59`, `03:04:59`, `2d 04h` (the\n * day and hour templates replace `{count}`)\n */\nexport const formatCountdown = (\n ms: number,\n units: { days: string; hours: string } = {\n days: \"{count}d\",\n hours: \"{count}h\",\n },\n): string => {\n const s = Math.max(0, Math.floor(ms / 1000));\n const pad = (v: number) => String(v).padStart(2, \"0\");\n if (s >= 86_400) {\n const days = String(Math.floor(s / 86_400));\n const hours = pad(Math.floor((s % 86_400) / 3600));\n return `${units.days.replace(\"{count}\", days)} ${units.hours.replace(\"{count}\", hours)}`;\n }\n if (s >= 3600)\n return `${pad(Math.floor(s / 3600))}:${pad(Math.floor((s % 3600) / 60))}:${pad(s % 60)}`;\n return `${pad(Math.floor(s / 60))}:${pad(s % 60)}`;\n};\n\n/** Typical duration between bars: the median of the last gaps */\nexport const inferTimeframe = (time: ArrayLike<number>, n: number): number => {\n const gaps: number[] = [];\n for (let i = Math.max(1, n - 64); i < n; i++) {\n const d = time[i] - time[i - 1];\n if (d > 0 && Number.isFinite(d)) gaps.push(d);\n }\n if (!gaps.length) return DAY;\n gaps.sort((a, b) => a - b);\n // the smallest frequent gap: weekends and nights make larger ones\n return gaps[Math.floor(gaps.length * 0.25)];\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"format.cjs","names":["sharedNumberFormat","resolveLocale","compactUnits","require_locale","MINUTE","HOUR","DAY","numberFormat","locale","options","detectPrecision","decimals","start","to","from","i","v","values","scaled","priceFormatter","p","precision","format","value","typographicMinus","text","formatVolume","abs","unit","suffix","formatPercent","formatFixed","dateFormats","dateFormat","key","full","offsetOf","offset","time","zoneFormats","zoneOffsets","QUARTER","isTimeZone","zoneFormat","timeZone","zoneOffset","cache","bucket","at","parts","part","local","boundaryWeight","prev","a","b","steps","weight","tickText","intraday","pickTicks","order","candidates","kept","result","c","lo","hi","mid","left","right","minGap","formatCrosshairTime","date","timeframeMs","shifted","formatCountdown","s","ms","pad","days","hours","units","inferTimeframe","gaps","n","d"],"sources":["../../../../../charts/src/engine/trading/format.ts"],"sourcesContent":["// Formatting of prices, volumes and times, and the labels of the time axis.\n// `locale` is resolved by the caller (`resolveLocale`) on hot paths.\n\nimport {\n compactUnits,\n numberFormat as sharedNumberFormat,\n resolveLocale,\n} from \"../locale\";\n\nexport const MINUTE = 60_000;\nexport const HOUR = 3_600_000;\nexport const DAY = 86_400_000;\n\nconst numberFormat = (\n locale: string | undefined,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat => sharedNumberFormat(resolveLocale(locale), options);\n\n/** Decimals needed by the prices (0-8), detected from a sample of them */\nexport const detectPrecision = (\n values: ArrayLike<number>,\n from: number,\n to: number,\n): number => {\n let decimals = 0;\n const start = Math.max(0, to - 300, from);\n for (let i = start; i < to; i++) {\n const v = Math.abs(values[i]);\n if (!Number.isFinite(v)) continue;\n while (decimals < 8) {\n const scaled = v * 10 ** decimals;\n if (Math.abs(scaled - Math.round(scaled)) < 1e-8 * Math.max(1, scaled))\n break;\n decimals++;\n }\n }\n return decimals;\n};\n\n/** Price formatter: fixed decimals, grouped digits of `locale` */\nexport const priceFormatter = (\n precision: number,\n locale: string | undefined,\n): ((value: number) => string) => {\n const p = Math.max(0, Math.min(12, Math.round(precision)));\n const format = numberFormat(locale, {\n minimumFractionDigits: p,\n maximumFractionDigits: p,\n });\n return (value) =>\n Number.isFinite(value) ? typographicMinus(format.format(value)) : \"–\";\n};\n\n/** The minus sign (U+2212) instead of the hyphen-minus of `Intl` */\nexport const typographicMinus = (text: string): string =>\n text.replace(\"-\", \"−\");\n\n/** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */\nexport const formatVolume = (value: number, locale?: string): string => {\n if (!Number.isFinite(value)) return \"–\";\n const format = numberFormat(locale, { maximumFractionDigits: 2 });\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(locale)) {\n // 999,999 shows as 1M, not 1,000k\n if (abs >= unit * 0.999995)\n return typographicMinus(`${format.format(value / unit)}${suffix}`);\n }\n return typographicMinus(format.format(value));\n};\n\n/** `+1.25%` */\nexport const formatPercent = (\n value: number,\n locale?: string,\n decimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const text = numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(Math.abs(value));\n const zero = Math.abs(value) < 0.5 * 10 ** -decimals;\n return `${zero ? \"\" : value > 0 ? \"+\" : \"−\"}${text}%`;\n};\n\n/** Any value with `decimals` decimals (indicator panes) */\nexport const formatFixed = (\n value: number,\n decimals: number,\n locale?: string,\n): string =>\n Number.isFinite(value)\n ? typographicMinus(\n numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value),\n )\n : \"–\";\n\n// ------------------------------------------------------------------ times\n\nconst dateFormats = new Map<string, Intl.DateTimeFormat>();\n\n/** Formats shifted times with the UTC getters (the offset is applied before) */\nexport const dateFormat = (\n locale: string | undefined,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat => {\n const key = `${locale ?? \"\"}|${JSON.stringify(options)}`;\n let format = dateFormats.get(key);\n if (!format) {\n const full = { ...options, timeZone: \"UTC\" };\n try {\n format = new Intl.DateTimeFormat(resolveLocale(locale), full);\n } catch {\n format = new Intl.DateTimeFormat(\"en\", full);\n }\n dateFormats.set(key, format);\n }\n return format;\n};\n\n/** Offset of the displayed time from UTC, in minutes, at `time` */\nexport const offsetAt = (time: number, utcOffset: number | undefined) =>\n utcOffset ?? -new Date(Number.isFinite(time) ? time : 0).getTimezoneOffset();\n\n/** Offset from UTC in minutes: fixed, or a function of the time (time zones) */\nexport type UtcOffset = number | ((time: number) => number);\n\nexport const offsetOf = (offset: UtcOffset, time: number): number =>\n typeof offset === \"number\" ? offset : offset(time);\n\nconst zoneFormats = new Map<string, Intl.DateTimeFormat | null>();\nconst zoneOffsets = new Map<string, Map<number, number>>();\nconst QUARTER = 15 * MINUTE;\n\n/** Whether `timeZone` is a time zone known to `Intl` (`\"UTC\"`, `\"Asia/Shanghai\"`) */\nexport const isTimeZone = (timeZone: string): boolean =>\n zoneFormat(timeZone) !== null;\n\nconst zoneFormat = (timeZone: string) => {\n let format = zoneFormats.get(timeZone);\n if (format === undefined) {\n try {\n format = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n } catch {\n format = null;\n }\n zoneFormats.set(timeZone, format);\n }\n return format;\n};\n\n/**\n * Offset of an IANA time zone from UTC at `time`, in minutes (daylight\n * saving included). Cached per quarter of an hour: zones change their\n * offset on quarter hours, and the time axis asks for every bar.\n */\nexport const zoneOffset = (time: number, timeZone: string): number => {\n const format = zoneFormat(timeZone);\n if (!format || !Number.isFinite(time))\n return -new Date(Number.isFinite(time) ? time : 0).getTimezoneOffset();\n let cache = zoneOffsets.get(timeZone);\n if (!cache) zoneOffsets.set(timeZone, (cache = new Map()));\n const bucket = Math.floor(time / QUARTER);\n let offset = cache.get(bucket);\n if (offset === undefined) {\n const at = bucket * QUARTER;\n const parts: Record<string, number> = {};\n for (const part of format.formatToParts(at))\n if (part.type !== \"literal\") parts[part.type] = Number(part.value);\n const local = Date.UTC(\n parts.year ?? 1970,\n (parts.month ?? 1) - 1,\n parts.day ?? 1,\n (parts.hour ?? 0) % 24,\n parts.minute ?? 0,\n );\n offset = Math.round((local - at) / MINUTE);\n if (cache.size > 50_000) cache.clear();\n cache.set(bucket, offset);\n }\n return offset;\n};\n\n/** Time shifted so that the UTC getters read the displayed time */\nexport const shiftTime = (time: number, utcOffset: number | undefined) =>\n time + offsetAt(time, utcOffset) * MINUTE;\n\n/**\n * Weight of the boundary between two consecutive (shifted) bar times: the\n * largest calendar unit that changes (year 70, month 60, day 50, hours\n * 43-46, minutes 31-34, seconds 21-24, 10 otherwise)\n */\nexport const boundaryWeight = (prev: number, time: number): number => {\n if (!Number.isFinite(prev)) return 70;\n const a = new Date(prev);\n const b = new Date(time);\n if (a.getUTCFullYear() !== b.getUTCFullYear()) return 70;\n if (a.getUTCMonth() !== b.getUTCMonth()) return 60;\n if (a.getUTCDate() !== b.getUTCDate()) return 50;\n const steps: readonly [number, number][] = [\n [12 * HOUR, 46],\n [6 * HOUR, 45],\n [3 * HOUR, 44],\n [HOUR, 43],\n [30 * MINUTE, 34],\n [15 * MINUTE, 33],\n [5 * MINUTE, 32],\n [MINUTE, 31],\n [30_000, 24],\n [15_000, 23],\n [5_000, 22],\n [1_000, 21],\n ];\n for (const [unit, weight] of steps) {\n if (Math.floor(prev / unit) !== Math.floor(time / unit)) return weight;\n }\n return 10;\n};\n\n/** A label of the time axis */\nexport interface TimeTick {\n /** x in CSS pixels */\n x: number;\n text: string;\n /** Larger unit (new day of an intraday chart, new month / year) */\n bold: boolean;\n}\n\n/** Text of a tick of weight `weight` at the shifted time `time` */\nexport const tickText = (\n time: number,\n weight: number,\n locale: string | undefined,\n intraday: boolean,\n): string => {\n if (weight >= 70) return dateFormat(locale, { year: \"numeric\" }).format(time);\n if (weight >= 60) return dateFormat(locale, { month: \"short\" }).format(time);\n if (weight >= 50) {\n return intraday\n ? dateFormat(locale, { month: \"short\", day: \"numeric\" }).format(time)\n : dateFormat(locale, { day: \"numeric\" }).format(time);\n }\n if (weight >= 30)\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n};\n\n/**\n * Picks the time labels: candidates by decreasing weight, each kept when\n * no kept label is closer than `minGap` pixels\n */\nexport const pickTicks = (\n candidates: readonly { x: number; weight: number; time: number }[],\n minGap: number,\n): { x: number; weight: number; time: number }[] => {\n const order = candidates\n .map((_, i) => i)\n .sort((a, b) => candidates[b].weight - candidates[a].weight || a - b);\n const kept: number[] = [];\n const result: { x: number; weight: number; time: number }[] = [];\n for (const i of order) {\n const c = candidates[i];\n // binary search of the kept x positions\n let lo = 0;\n let hi = kept.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (kept[mid] < c.x) lo = mid + 1;\n else hi = mid;\n }\n const left = lo > 0 ? kept[lo - 1] : -Infinity;\n const right = lo < kept.length ? kept[lo] : Infinity;\n if (c.x - left < minGap || right - c.x < minGap) continue;\n kept.splice(lo, 0, c.x);\n result.push(c);\n }\n return result.sort((a, b) => a.x - b.x);\n};\n\n/** Full time of the crosshair label (`Tue 12 Mar '24 14:35`) */\nexport const formatCrosshairTime = (\n shifted: number,\n timeframeMs: number,\n locale: string | undefined,\n): string => {\n const date: Intl.DateTimeFormatOptions = {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n };\n if (timeframeMs >= DAY) return dateFormat(locale, date).format(shifted);\n return dateFormat(locale, {\n ...date,\n hour: \"2-digit\",\n minute: \"2-digit\",\n ...(timeframeMs < MINUTE ? { second: \"2-digit\" } : {}),\n hourCycle: \"h23\",\n }).format(shifted);\n};\n\n/**\n * Time left before a bar closes: `42`, `04:59`, `03:04:59`, `2d 04h` (the\n * day and hour templates replace `{count}`)\n */\nexport const formatCountdown = (\n ms: number,\n units: { days: string; hours: string } = {\n days: \"{count}d\",\n hours: \"{count}h\",\n },\n): string => {\n const s = Math.max(0, Math.floor(ms / 1000));\n const pad = (v: number) => String(v).padStart(2, \"0\");\n if (s >= 86_400) {\n const days = String(Math.floor(s / 86_400));\n const hours = pad(Math.floor((s % 86_400) / 3600));\n return `${units.days.replace(\"{count}\", days)} ${units.hours.replace(\"{count}\", hours)}`;\n }\n if (s >= 3600)\n return `${pad(Math.floor(s / 3600))}:${pad(Math.floor((s % 3600) / 60))}:${pad(s % 60)}`;\n return `${pad(Math.floor(s / 60))}:${pad(s % 60)}`;\n};\n\n/** Typical duration between bars: the median of the last gaps */\nexport const inferTimeframe = (time: ArrayLike<number>, n: number): number => {\n const gaps: number[] = [];\n for (let i = Math.max(1, n - 64); i < n; i++) {\n const d = time[i] - time[i - 1];\n if (d > 0 && Number.isFinite(d)) gaps.push(d);\n }\n if (!gaps.length) return DAY;\n gaps.sort((a, b) => a - b);\n // the smallest frequent gap: weekends and nights make larger ones\n return gaps[Math.floor(gaps.length * 0.25)];\n};\n"],"mappings":"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"}
@@ -5,6 +5,8 @@ export declare const DAY = 86400000;
5
5
  export declare const detectPrecision: (values: ArrayLike<number>, from: number, to: number) => number;
6
6
  /** Price formatter: fixed decimals, grouped digits of `locale` */
7
7
  export declare const priceFormatter: (precision: number, locale: string | undefined) => ((value: number) => string);
8
+ /** The minus sign (U+2212) instead of the hyphen-minus of `Intl` */
9
+ export declare const typographicMinus: (text: string) => string;
8
10
  /** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */
9
11
  export declare const formatVolume: (value: number, locale?: string) => string;
10
12
  /** `+1.25%` */
@@ -15,6 +17,17 @@ export declare const formatFixed: (value: number, decimals: number, locale?: str
15
17
  export declare const dateFormat: (locale: string | undefined, options: Intl.DateTimeFormatOptions) => Intl.DateTimeFormat;
16
18
  /** Offset of the displayed time from UTC, in minutes, at `time` */
17
19
  export declare const offsetAt: (time: number, utcOffset: number | undefined) => number;
20
+ /** Offset from UTC in minutes: fixed, or a function of the time (time zones) */
21
+ export type UtcOffset = number | ((time: number) => number);
22
+ export declare const offsetOf: (offset: UtcOffset, time: number) => number;
23
+ /** Whether `timeZone` is a time zone known to `Intl` (`"UTC"`, `"Asia/Shanghai"`) */
24
+ export declare const isTimeZone: (timeZone: string) => boolean;
25
+ /**
26
+ * Offset of an IANA time zone from UTC at `time`, in minutes (daylight
27
+ * saving included). Cached per quarter of an hour: zones change their
28
+ * offset on quarter hours, and the time axis asks for every bar.
29
+ */
30
+ export declare const zoneOffset: (time: number, timeZone: string) => number;
18
31
  /** Time shifted so that the UTC getters read the displayed time */
19
32
  export declare const shiftTime: (time: number, utcOffset: number | undefined) => number;
20
33
  /**
@@ -5,6 +5,8 @@ export declare const DAY = 86400000;
5
5
  export declare const detectPrecision: (values: ArrayLike<number>, from: number, to: number) => number;
6
6
  /** Price formatter: fixed decimals, grouped digits of `locale` */
7
7
  export declare const priceFormatter: (precision: number, locale: string | undefined) => ((value: number) => string);
8
+ /** The minus sign (U+2212) instead of the hyphen-minus of `Intl` */
9
+ export declare const typographicMinus: (text: string) => string;
8
10
  /** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */
9
11
  export declare const formatVolume: (value: number, locale?: string) => string;
10
12
  /** `+1.25%` */
@@ -15,6 +17,17 @@ export declare const formatFixed: (value: number, decimals: number, locale?: str
15
17
  export declare const dateFormat: (locale: string | undefined, options: Intl.DateTimeFormatOptions) => Intl.DateTimeFormat;
16
18
  /** Offset of the displayed time from UTC, in minutes, at `time` */
17
19
  export declare const offsetAt: (time: number, utcOffset: number | undefined) => number;
20
+ /** Offset from UTC in minutes: fixed, or a function of the time (time zones) */
21
+ export type UtcOffset = number | ((time: number) => number);
22
+ export declare const offsetOf: (offset: UtcOffset, time: number) => number;
23
+ /** Whether `timeZone` is a time zone known to `Intl` (`"UTC"`, `"Asia/Shanghai"`) */
24
+ export declare const isTimeZone: (timeZone: string) => boolean;
25
+ /**
26
+ * Offset of an IANA time zone from UTC at `time`, in minutes (daylight
27
+ * saving included). Cached per quarter of an hour: zones change their
28
+ * offset on quarter hours, and the time axis asks for every bar.
29
+ */
30
+ export declare const zoneOffset: (time: number, timeZone: string) => number;
18
31
  /** Time shifted so that the UTC getters read the displayed time */
19
32
  export declare const shiftTime: (time: number, utcOffset: number | undefined) => number;
20
33
  /**
@@ -16,24 +16,24 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
16
16
  minimumFractionDigits: n,
17
17
  maximumFractionDigits: n
18
18
  });
19
- return (e) => Number.isFinite(e) ? r.format(e) : "–";
20
- }, l = (t, n) => {
19
+ return (e) => Number.isFinite(e) ? l(r.format(e)) : "–";
20
+ }, l = (e) => e.replace("-", "−"), u = (t, n) => {
21
21
  if (!Number.isFinite(t)) return "–";
22
22
  let r = o(n, { maximumFractionDigits: 2 }), i = Math.abs(t);
23
- for (let [a, o] of e(n)) if (i >= a * .999995) return `${r.format(t / a)}${o}`;
24
- return r.format(t);
25
- }, u = (e, t, n = 2) => {
23
+ for (let [a, o] of e(n)) if (i >= a * .999995) return l(`${r.format(t / a)}${o}`);
24
+ return l(r.format(t));
25
+ }, d = (e, t, n = 2) => {
26
26
  if (!Number.isFinite(e)) return "–";
27
27
  let r = o(t, {
28
28
  minimumFractionDigits: n,
29
29
  maximumFractionDigits: n
30
30
  }).format(Math.abs(e));
31
31
  return `${Math.abs(e) < .5 * 10 ** -n ? "" : e > 0 ? "+" : "−"}${r}%`;
32
- }, d = (e, t, n) => Number.isFinite(e) ? o(n, {
32
+ }, f = (e, t, n) => Number.isFinite(e) ? l(o(n, {
33
33
  minimumFractionDigits: t,
34
34
  maximumFractionDigits: t
35
- }).format(e) : "–", f = /* @__PURE__ */ new Map(), p = (e, t) => {
36
- let r = `${e ?? ""}|${JSON.stringify(t)}`, i = f.get(r);
35
+ }).format(e)) : "–", p = /* @__PURE__ */ new Map(), m = (e, t) => {
36
+ let r = `${e ?? ""}|${JSON.stringify(t)}`, i = p.get(r);
37
37
  if (!i) {
38
38
  let a = {
39
39
  ...t,
@@ -44,10 +44,42 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
44
44
  } catch {
45
45
  i = new Intl.DateTimeFormat("en", a);
46
46
  }
47
- f.set(r, i);
47
+ p.set(r, i);
48
48
  }
49
49
  return i;
50
- }, m = (e, t) => t ?? -new Date(Number.isFinite(e) ? e : 0).getTimezoneOffset(), h = (e, t) => e + m(e, t) * r, g = (e, t) => {
50
+ }, h = (e, t) => typeof e == "number" ? e : e(t), g = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Map(), v = 15 * r, y = (e) => b(e) !== null, b = (e) => {
51
+ let t = g.get(e);
52
+ if (t === void 0) {
53
+ try {
54
+ t = new Intl.DateTimeFormat("en-US", {
55
+ timeZone: e,
56
+ hourCycle: "h23",
57
+ year: "numeric",
58
+ month: "numeric",
59
+ day: "numeric",
60
+ hour: "numeric",
61
+ minute: "numeric"
62
+ });
63
+ } catch {
64
+ t = null;
65
+ }
66
+ g.set(e, t);
67
+ }
68
+ return t;
69
+ }, x = (e, t) => {
70
+ let n = b(t);
71
+ if (!n || !Number.isFinite(e)) return -new Date(Number.isFinite(e) ? e : 0).getTimezoneOffset();
72
+ let i = _.get(t);
73
+ i || _.set(t, i = /* @__PURE__ */ new Map());
74
+ let a = Math.floor(e / v), o = i.get(a);
75
+ if (o === void 0) {
76
+ let e = a * v, t = {};
77
+ for (let r of n.formatToParts(e)) r.type !== "literal" && (t[r.type] = Number(r.value));
78
+ let s = Date.UTC(t.year ?? 1970, (t.month ?? 1) - 1, t.day ?? 1, (t.hour ?? 0) % 24, t.minute ?? 0);
79
+ o = Math.round((s - e) / r), i.size > 5e4 && i.clear(), i.set(a, o);
80
+ }
81
+ return o;
82
+ }, S = (e, t) => {
51
83
  if (!Number.isFinite(e)) return 70;
52
84
  let n = new Date(e), a = new Date(t);
53
85
  if (n.getUTCFullYear() !== a.getUTCFullYear()) return 70;
@@ -69,19 +101,19 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
69
101
  ];
70
102
  for (let [n, r] of o) if (Math.floor(e / n) !== Math.floor(t / n)) return r;
71
103
  return 10;
72
- }, _ = (e, t, n, r) => t >= 70 ? p(n, { year: "numeric" }).format(e) : t >= 60 ? p(n, { month: "short" }).format(e) : t >= 50 ? r ? p(n, {
104
+ }, C = (e, t, n, r) => t >= 70 ? m(n, { year: "numeric" }).format(e) : t >= 60 ? m(n, { month: "short" }).format(e) : t >= 50 ? r ? m(n, {
73
105
  month: "short",
74
106
  day: "numeric"
75
- }).format(e) : p(n, { day: "numeric" }).format(e) : t >= 30 ? p(n, {
107
+ }).format(e) : m(n, { day: "numeric" }).format(e) : t >= 30 ? m(n, {
76
108
  hour: "2-digit",
77
109
  minute: "2-digit",
78
110
  hourCycle: "h23"
79
- }).format(e) : p(n, {
111
+ }).format(e) : m(n, {
80
112
  hour: "2-digit",
81
113
  minute: "2-digit",
82
114
  second: "2-digit",
83
115
  hourCycle: "h23"
84
- }).format(e), v = (e, t) => {
116
+ }).format(e), w = (e, t) => {
85
117
  let n = e.map((e, t) => t).sort((t, n) => e[n].weight - e[t].weight || t - n), r = [], i = [];
86
118
  for (let a of n) {
87
119
  let n = e[a], o = 0, s = r.length;
@@ -93,21 +125,21 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
93
125
  n.x - c < t || l - n.x < t || (r.splice(o, 0, n.x), i.push(n));
94
126
  }
95
127
  return i.sort((e, t) => e.x - t.x);
96
- }, y = (e, t, n) => {
128
+ }, T = (e, t, n) => {
97
129
  let r = {
98
130
  weekday: "short",
99
131
  year: "numeric",
100
132
  month: "short",
101
133
  day: "numeric"
102
134
  };
103
- return t >= 864e5 ? p(n, r).format(e) : p(n, {
135
+ return t >= 864e5 ? m(n, r).format(e) : m(n, {
104
136
  ...r,
105
137
  hour: "2-digit",
106
138
  minute: "2-digit",
107
139
  ...t < 6e4 ? { second: "2-digit" } : {},
108
140
  hourCycle: "h23"
109
141
  }).format(e);
110
- }, b = (e, t = {
142
+ }, E = (e, t = {
111
143
  days: "{count}d",
112
144
  hours: "{count}h"
113
145
  }) => {
@@ -117,7 +149,7 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
117
149
  return `${t.days.replace("{count}", e)} ${t.hours.replace("{count}", i)}`;
118
150
  }
119
151
  return n >= 3600 ? `${r(Math.floor(n / 3600))}:${r(Math.floor(n % 3600 / 60))}:${r(n % 60)}` : `${r(Math.floor(n / 60))}:${r(n % 60)}`;
120
- }, x = (e, t) => {
152
+ }, D = (e, t) => {
121
153
  let n = [];
122
154
  for (let r = Math.max(1, t - 64); r < t; r++) {
123
155
  let t = e[r] - e[r - 1];
@@ -126,6 +158,6 @@ var r = 6e4, i = 36e5, a = 864e5, o = (e, r) => t(n(e), r), s = (e, t, n) => {
126
158
  return n.length ? (n.sort((e, t) => e - t), n[Math.floor(n.length * .25)]) : a;
127
159
  };
128
160
  //#endregion
129
- export { a as DAY, i as HOUR, r as MINUTE, g as boundaryWeight, p as dateFormat, s as detectPrecision, b as formatCountdown, y as formatCrosshairTime, d as formatFixed, u as formatPercent, l as formatVolume, x as inferTimeframe, m as offsetAt, v as pickTicks, c as priceFormatter, h as shiftTime, _ as tickText };
161
+ export { a as DAY, i as HOUR, r as MINUTE, S as boundaryWeight, m as dateFormat, s as detectPrecision, E as formatCountdown, T as formatCrosshairTime, f as formatFixed, d as formatPercent, u as formatVolume, D as inferTimeframe, y as isTimeZone, h as offsetOf, w as pickTicks, c as priceFormatter, C as tickText, l as typographicMinus, x as zoneOffset };
130
162
 
131
163
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","names":["sharedNumberFormat","numberFormat$1","MINUTE","HOUR","DAY","numberFormat","resolveLocale","locale","options","detectPrecision","decimals","start","to","from","i","v","values","scaled","priceFormatter","p","precision","format","value","formatVolume","abs","unit","suffix","compactUnits","formatPercent","text","formatFixed","dateFormats","dateFormat","key","full","offsetAt","utcOffset","time","shiftTime","boundaryWeight","prev","a","b","steps","weight","tickText","intraday","pickTicks","order","candidates","kept","result","c","lo","hi","mid","left","right","minGap","formatCrosshairTime","date","timeframeMs","shifted","formatCountdown","s","ms","pad","days","hours","units","inferTimeframe","gaps","n","d"],"sources":["../../../../../charts/src/engine/trading/format.ts"],"sourcesContent":["// Formatting of prices, volumes and times, and the labels of the time axis.\n// `locale` is resolved by the caller (`resolveLocale`) on hot paths.\n\nimport {\n compactUnits,\n numberFormat as sharedNumberFormat,\n resolveLocale,\n} from \"../locale\";\n\nexport const MINUTE = 60_000;\nexport const HOUR = 3_600_000;\nexport const DAY = 86_400_000;\n\nconst numberFormat = (\n locale: string | undefined,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat => sharedNumberFormat(resolveLocale(locale), options);\n\n/** Decimals needed by the prices (0-8), detected from a sample of them */\nexport const detectPrecision = (\n values: ArrayLike<number>,\n from: number,\n to: number,\n): number => {\n let decimals = 0;\n const start = Math.max(0, to - 300, from);\n for (let i = start; i < to; i++) {\n const v = Math.abs(values[i]);\n if (!Number.isFinite(v)) continue;\n while (decimals < 8) {\n const scaled = v * 10 ** decimals;\n if (Math.abs(scaled - Math.round(scaled)) < 1e-8 * Math.max(1, scaled))\n break;\n decimals++;\n }\n }\n return decimals;\n};\n\n/** Price formatter: fixed decimals, grouped digits of `locale` */\nexport const priceFormatter = (\n precision: number,\n locale: string | undefined,\n): ((value: number) => string) => {\n const p = Math.max(0, Math.min(12, Math.round(precision)));\n const format = numberFormat(locale, {\n minimumFractionDigits: p,\n maximumFractionDigits: p,\n });\n return (value) => (Number.isFinite(value) ? format.format(value) : \"–\");\n};\n\n/** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */\nexport const formatVolume = (value: number, locale?: string): string => {\n if (!Number.isFinite(value)) return \"–\";\n const format = numberFormat(locale, { maximumFractionDigits: 2 });\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(locale)) {\n // 999,999 shows as 1M, not 1,000k\n if (abs >= unit * 0.999995)\n return `${format.format(value / unit)}${suffix}`;\n }\n return format.format(value);\n};\n\n/** `+1.25%` */\nexport const formatPercent = (\n value: number,\n locale?: string,\n decimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const text = numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(Math.abs(value));\n const zero = Math.abs(value) < 0.5 * 10 ** -decimals;\n return `${zero ? \"\" : value > 0 ? \"+\" : \"−\"}${text}%`;\n};\n\n/** Any value with `decimals` decimals (indicator panes) */\nexport const formatFixed = (\n value: number,\n decimals: number,\n locale?: string,\n): string =>\n Number.isFinite(value)\n ? numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value)\n : \"–\";\n\n// ------------------------------------------------------------------ times\n\nconst dateFormats = new Map<string, Intl.DateTimeFormat>();\n\n/** Formats shifted times with the UTC getters (the offset is applied before) */\nexport const dateFormat = (\n locale: string | undefined,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat => {\n const key = `${locale ?? \"\"}|${JSON.stringify(options)}`;\n let format = dateFormats.get(key);\n if (!format) {\n const full = { ...options, timeZone: \"UTC\" };\n try {\n format = new Intl.DateTimeFormat(resolveLocale(locale), full);\n } catch {\n format = new Intl.DateTimeFormat(\"en\", full);\n }\n dateFormats.set(key, format);\n }\n return format;\n};\n\n/** Offset of the displayed time from UTC, in minutes, at `time` */\nexport const offsetAt = (time: number, utcOffset: number | undefined) =>\n utcOffset ?? -new Date(Number.isFinite(time) ? time : 0).getTimezoneOffset();\n\n/** Time shifted so that the UTC getters read the displayed time */\nexport const shiftTime = (time: number, utcOffset: number | undefined) =>\n time + offsetAt(time, utcOffset) * MINUTE;\n\n/**\n * Weight of the boundary between two consecutive (shifted) bar times: the\n * largest calendar unit that changes (year 70, month 60, day 50, hours\n * 43-46, minutes 31-34, seconds 21-24, 10 otherwise)\n */\nexport const boundaryWeight = (prev: number, time: number): number => {\n if (!Number.isFinite(prev)) return 70;\n const a = new Date(prev);\n const b = new Date(time);\n if (a.getUTCFullYear() !== b.getUTCFullYear()) return 70;\n if (a.getUTCMonth() !== b.getUTCMonth()) return 60;\n if (a.getUTCDate() !== b.getUTCDate()) return 50;\n const steps: readonly [number, number][] = [\n [12 * HOUR, 46],\n [6 * HOUR, 45],\n [3 * HOUR, 44],\n [HOUR, 43],\n [30 * MINUTE, 34],\n [15 * MINUTE, 33],\n [5 * MINUTE, 32],\n [MINUTE, 31],\n [30_000, 24],\n [15_000, 23],\n [5_000, 22],\n [1_000, 21],\n ];\n for (const [unit, weight] of steps) {\n if (Math.floor(prev / unit) !== Math.floor(time / unit)) return weight;\n }\n return 10;\n};\n\n/** A label of the time axis */\nexport interface TimeTick {\n /** x in CSS pixels */\n x: number;\n text: string;\n /** Larger unit (new day of an intraday chart, new month / year) */\n bold: boolean;\n}\n\n/** Text of a tick of weight `weight` at the shifted time `time` */\nexport const tickText = (\n time: number,\n weight: number,\n locale: string | undefined,\n intraday: boolean,\n): string => {\n if (weight >= 70) return dateFormat(locale, { year: \"numeric\" }).format(time);\n if (weight >= 60) return dateFormat(locale, { month: \"short\" }).format(time);\n if (weight >= 50) {\n return intraday\n ? dateFormat(locale, { month: \"short\", day: \"numeric\" }).format(time)\n : dateFormat(locale, { day: \"numeric\" }).format(time);\n }\n if (weight >= 30)\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n};\n\n/**\n * Picks the time labels: candidates by decreasing weight, each kept when\n * no kept label is closer than `minGap` pixels\n */\nexport const pickTicks = (\n candidates: readonly { x: number; weight: number; time: number }[],\n minGap: number,\n): { x: number; weight: number; time: number }[] => {\n const order = candidates\n .map((_, i) => i)\n .sort((a, b) => candidates[b].weight - candidates[a].weight || a - b);\n const kept: number[] = [];\n const result: { x: number; weight: number; time: number }[] = [];\n for (const i of order) {\n const c = candidates[i];\n // binary search of the kept x positions\n let lo = 0;\n let hi = kept.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (kept[mid] < c.x) lo = mid + 1;\n else hi = mid;\n }\n const left = lo > 0 ? kept[lo - 1] : -Infinity;\n const right = lo < kept.length ? kept[lo] : Infinity;\n if (c.x - left < minGap || right - c.x < minGap) continue;\n kept.splice(lo, 0, c.x);\n result.push(c);\n }\n return result.sort((a, b) => a.x - b.x);\n};\n\n/** Full time of the crosshair label (`Tue 12 Mar '24 14:35`) */\nexport const formatCrosshairTime = (\n shifted: number,\n timeframeMs: number,\n locale: string | undefined,\n): string => {\n const date: Intl.DateTimeFormatOptions = {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n };\n if (timeframeMs >= DAY) return dateFormat(locale, date).format(shifted);\n return dateFormat(locale, {\n ...date,\n hour: \"2-digit\",\n minute: \"2-digit\",\n ...(timeframeMs < MINUTE ? { second: \"2-digit\" } : {}),\n hourCycle: \"h23\",\n }).format(shifted);\n};\n\n/**\n * Time left before a bar closes: `42`, `04:59`, `03:04:59`, `2d 04h` (the\n * day and hour templates replace `{count}`)\n */\nexport const formatCountdown = (\n ms: number,\n units: { days: string; hours: string } = {\n days: \"{count}d\",\n hours: \"{count}h\",\n },\n): string => {\n const s = Math.max(0, Math.floor(ms / 1000));\n const pad = (v: number) => String(v).padStart(2, \"0\");\n if (s >= 86_400) {\n const days = String(Math.floor(s / 86_400));\n const hours = pad(Math.floor((s % 86_400) / 3600));\n return `${units.days.replace(\"{count}\", days)} ${units.hours.replace(\"{count}\", hours)}`;\n }\n if (s >= 3600)\n return `${pad(Math.floor(s / 3600))}:${pad(Math.floor((s % 3600) / 60))}:${pad(s % 60)}`;\n return `${pad(Math.floor(s / 60))}:${pad(s % 60)}`;\n};\n\n/** Typical duration between bars: the median of the last gaps */\nexport const inferTimeframe = (time: ArrayLike<number>, n: number): number => {\n const gaps: number[] = [];\n for (let i = Math.max(1, n - 64); i < n; i++) {\n const d = time[i] - time[i - 1];\n if (d > 0 && Number.isFinite(d)) gaps.push(d);\n }\n if (!gaps.length) return DAY;\n gaps.sort((a, b) => a - b);\n // the smallest frequent gap: weekends and nights make larger ones\n return gaps[Math.floor(gaps.length * 0.25)];\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"format.js","names":["sharedNumberFormat","numberFormat$1","MINUTE","HOUR","DAY","numberFormat","resolveLocale","locale","options","detectPrecision","decimals","start","to","from","i","v","values","scaled","priceFormatter","p","precision","format","value","typographicMinus","text","formatVolume","abs","unit","suffix","compactUnits","formatPercent","formatFixed","dateFormats","dateFormat","key","full","offsetOf","offset","time","zoneFormats","zoneOffsets","QUARTER","isTimeZone","zoneFormat","timeZone","zoneOffset","cache","bucket","at","parts","part","local","boundaryWeight","prev","a","b","steps","weight","tickText","intraday","pickTicks","order","candidates","kept","result","c","lo","hi","mid","left","right","minGap","formatCrosshairTime","date","timeframeMs","shifted","formatCountdown","s","ms","pad","days","hours","units","inferTimeframe","gaps","n","d"],"sources":["../../../../../charts/src/engine/trading/format.ts"],"sourcesContent":["// Formatting of prices, volumes and times, and the labels of the time axis.\n// `locale` is resolved by the caller (`resolveLocale`) on hot paths.\n\nimport {\n compactUnits,\n numberFormat as sharedNumberFormat,\n resolveLocale,\n} from \"../locale\";\n\nexport const MINUTE = 60_000;\nexport const HOUR = 3_600_000;\nexport const DAY = 86_400_000;\n\nconst numberFormat = (\n locale: string | undefined,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat => sharedNumberFormat(resolveLocale(locale), options);\n\n/** Decimals needed by the prices (0-8), detected from a sample of them */\nexport const detectPrecision = (\n values: ArrayLike<number>,\n from: number,\n to: number,\n): number => {\n let decimals = 0;\n const start = Math.max(0, to - 300, from);\n for (let i = start; i < to; i++) {\n const v = Math.abs(values[i]);\n if (!Number.isFinite(v)) continue;\n while (decimals < 8) {\n const scaled = v * 10 ** decimals;\n if (Math.abs(scaled - Math.round(scaled)) < 1e-8 * Math.max(1, scaled))\n break;\n decimals++;\n }\n }\n return decimals;\n};\n\n/** Price formatter: fixed decimals, grouped digits of `locale` */\nexport const priceFormatter = (\n precision: number,\n locale: string | undefined,\n): ((value: number) => string) => {\n const p = Math.max(0, Math.min(12, Math.round(precision)));\n const format = numberFormat(locale, {\n minimumFractionDigits: p,\n maximumFractionDigits: p,\n });\n return (value) =>\n Number.isFinite(value) ? typographicMinus(format.format(value)) : \"–\";\n};\n\n/** The minus sign (U+2212) instead of the hyphen-minus of `Intl` */\nexport const typographicMinus = (text: string): string =>\n text.replace(\"-\", \"−\");\n\n/** `12345678` -> `12.35M` (`1234.57万` in Chinese and Japanese) */\nexport const formatVolume = (value: number, locale?: string): string => {\n if (!Number.isFinite(value)) return \"–\";\n const format = numberFormat(locale, { maximumFractionDigits: 2 });\n const abs = Math.abs(value);\n for (const [unit, suffix] of compactUnits(locale)) {\n // 999,999 shows as 1M, not 1,000k\n if (abs >= unit * 0.999995)\n return typographicMinus(`${format.format(value / unit)}${suffix}`);\n }\n return typographicMinus(format.format(value));\n};\n\n/** `+1.25%` */\nexport const formatPercent = (\n value: number,\n locale?: string,\n decimals = 2,\n): string => {\n if (!Number.isFinite(value)) return \"–\";\n const text = numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(Math.abs(value));\n const zero = Math.abs(value) < 0.5 * 10 ** -decimals;\n return `${zero ? \"\" : value > 0 ? \"+\" : \"−\"}${text}%`;\n};\n\n/** Any value with `decimals` decimals (indicator panes) */\nexport const formatFixed = (\n value: number,\n decimals: number,\n locale?: string,\n): string =>\n Number.isFinite(value)\n ? typographicMinus(\n numberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value),\n )\n : \"–\";\n\n// ------------------------------------------------------------------ times\n\nconst dateFormats = new Map<string, Intl.DateTimeFormat>();\n\n/** Formats shifted times with the UTC getters (the offset is applied before) */\nexport const dateFormat = (\n locale: string | undefined,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat => {\n const key = `${locale ?? \"\"}|${JSON.stringify(options)}`;\n let format = dateFormats.get(key);\n if (!format) {\n const full = { ...options, timeZone: \"UTC\" };\n try {\n format = new Intl.DateTimeFormat(resolveLocale(locale), full);\n } catch {\n format = new Intl.DateTimeFormat(\"en\", full);\n }\n dateFormats.set(key, format);\n }\n return format;\n};\n\n/** Offset of the displayed time from UTC, in minutes, at `time` */\nexport const offsetAt = (time: number, utcOffset: number | undefined) =>\n utcOffset ?? -new Date(Number.isFinite(time) ? time : 0).getTimezoneOffset();\n\n/** Offset from UTC in minutes: fixed, or a function of the time (time zones) */\nexport type UtcOffset = number | ((time: number) => number);\n\nexport const offsetOf = (offset: UtcOffset, time: number): number =>\n typeof offset === \"number\" ? offset : offset(time);\n\nconst zoneFormats = new Map<string, Intl.DateTimeFormat | null>();\nconst zoneOffsets = new Map<string, Map<number, number>>();\nconst QUARTER = 15 * MINUTE;\n\n/** Whether `timeZone` is a time zone known to `Intl` (`\"UTC\"`, `\"Asia/Shanghai\"`) */\nexport const isTimeZone = (timeZone: string): boolean =>\n zoneFormat(timeZone) !== null;\n\nconst zoneFormat = (timeZone: string) => {\n let format = zoneFormats.get(timeZone);\n if (format === undefined) {\n try {\n format = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n });\n } catch {\n format = null;\n }\n zoneFormats.set(timeZone, format);\n }\n return format;\n};\n\n/**\n * Offset of an IANA time zone from UTC at `time`, in minutes (daylight\n * saving included). Cached per quarter of an hour: zones change their\n * offset on quarter hours, and the time axis asks for every bar.\n */\nexport const zoneOffset = (time: number, timeZone: string): number => {\n const format = zoneFormat(timeZone);\n if (!format || !Number.isFinite(time))\n return -new Date(Number.isFinite(time) ? time : 0).getTimezoneOffset();\n let cache = zoneOffsets.get(timeZone);\n if (!cache) zoneOffsets.set(timeZone, (cache = new Map()));\n const bucket = Math.floor(time / QUARTER);\n let offset = cache.get(bucket);\n if (offset === undefined) {\n const at = bucket * QUARTER;\n const parts: Record<string, number> = {};\n for (const part of format.formatToParts(at))\n if (part.type !== \"literal\") parts[part.type] = Number(part.value);\n const local = Date.UTC(\n parts.year ?? 1970,\n (parts.month ?? 1) - 1,\n parts.day ?? 1,\n (parts.hour ?? 0) % 24,\n parts.minute ?? 0,\n );\n offset = Math.round((local - at) / MINUTE);\n if (cache.size > 50_000) cache.clear();\n cache.set(bucket, offset);\n }\n return offset;\n};\n\n/** Time shifted so that the UTC getters read the displayed time */\nexport const shiftTime = (time: number, utcOffset: number | undefined) =>\n time + offsetAt(time, utcOffset) * MINUTE;\n\n/**\n * Weight of the boundary between two consecutive (shifted) bar times: the\n * largest calendar unit that changes (year 70, month 60, day 50, hours\n * 43-46, minutes 31-34, seconds 21-24, 10 otherwise)\n */\nexport const boundaryWeight = (prev: number, time: number): number => {\n if (!Number.isFinite(prev)) return 70;\n const a = new Date(prev);\n const b = new Date(time);\n if (a.getUTCFullYear() !== b.getUTCFullYear()) return 70;\n if (a.getUTCMonth() !== b.getUTCMonth()) return 60;\n if (a.getUTCDate() !== b.getUTCDate()) return 50;\n const steps: readonly [number, number][] = [\n [12 * HOUR, 46],\n [6 * HOUR, 45],\n [3 * HOUR, 44],\n [HOUR, 43],\n [30 * MINUTE, 34],\n [15 * MINUTE, 33],\n [5 * MINUTE, 32],\n [MINUTE, 31],\n [30_000, 24],\n [15_000, 23],\n [5_000, 22],\n [1_000, 21],\n ];\n for (const [unit, weight] of steps) {\n if (Math.floor(prev / unit) !== Math.floor(time / unit)) return weight;\n }\n return 10;\n};\n\n/** A label of the time axis */\nexport interface TimeTick {\n /** x in CSS pixels */\n x: number;\n text: string;\n /** Larger unit (new day of an intraday chart, new month / year) */\n bold: boolean;\n}\n\n/** Text of a tick of weight `weight` at the shifted time `time` */\nexport const tickText = (\n time: number,\n weight: number,\n locale: string | undefined,\n intraday: boolean,\n): string => {\n if (weight >= 70) return dateFormat(locale, { year: \"numeric\" }).format(time);\n if (weight >= 60) return dateFormat(locale, { month: \"short\" }).format(time);\n if (weight >= 50) {\n return intraday\n ? dateFormat(locale, { month: \"short\", day: \"numeric\" }).format(time)\n : dateFormat(locale, { day: \"numeric\" }).format(time);\n }\n if (weight >= 30)\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n return dateFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n }).format(time);\n};\n\n/**\n * Picks the time labels: candidates by decreasing weight, each kept when\n * no kept label is closer than `minGap` pixels\n */\nexport const pickTicks = (\n candidates: readonly { x: number; weight: number; time: number }[],\n minGap: number,\n): { x: number; weight: number; time: number }[] => {\n const order = candidates\n .map((_, i) => i)\n .sort((a, b) => candidates[b].weight - candidates[a].weight || a - b);\n const kept: number[] = [];\n const result: { x: number; weight: number; time: number }[] = [];\n for (const i of order) {\n const c = candidates[i];\n // binary search of the kept x positions\n let lo = 0;\n let hi = kept.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (kept[mid] < c.x) lo = mid + 1;\n else hi = mid;\n }\n const left = lo > 0 ? kept[lo - 1] : -Infinity;\n const right = lo < kept.length ? kept[lo] : Infinity;\n if (c.x - left < minGap || right - c.x < minGap) continue;\n kept.splice(lo, 0, c.x);\n result.push(c);\n }\n return result.sort((a, b) => a.x - b.x);\n};\n\n/** Full time of the crosshair label (`Tue 12 Mar '24 14:35`) */\nexport const formatCrosshairTime = (\n shifted: number,\n timeframeMs: number,\n locale: string | undefined,\n): string => {\n const date: Intl.DateTimeFormatOptions = {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n };\n if (timeframeMs >= DAY) return dateFormat(locale, date).format(shifted);\n return dateFormat(locale, {\n ...date,\n hour: \"2-digit\",\n minute: \"2-digit\",\n ...(timeframeMs < MINUTE ? { second: \"2-digit\" } : {}),\n hourCycle: \"h23\",\n }).format(shifted);\n};\n\n/**\n * Time left before a bar closes: `42`, `04:59`, `03:04:59`, `2d 04h` (the\n * day and hour templates replace `{count}`)\n */\nexport const formatCountdown = (\n ms: number,\n units: { days: string; hours: string } = {\n days: \"{count}d\",\n hours: \"{count}h\",\n },\n): string => {\n const s = Math.max(0, Math.floor(ms / 1000));\n const pad = (v: number) => String(v).padStart(2, \"0\");\n if (s >= 86_400) {\n const days = String(Math.floor(s / 86_400));\n const hours = pad(Math.floor((s % 86_400) / 3600));\n return `${units.days.replace(\"{count}\", days)} ${units.hours.replace(\"{count}\", hours)}`;\n }\n if (s >= 3600)\n return `${pad(Math.floor(s / 3600))}:${pad(Math.floor((s % 3600) / 60))}:${pad(s % 60)}`;\n return `${pad(Math.floor(s / 60))}:${pad(s % 60)}`;\n};\n\n/** Typical duration between bars: the median of the last gaps */\nexport const inferTimeframe = (time: ArrayLike<number>, n: number): number => {\n const gaps: number[] = [];\n for (let i = Math.max(1, n - 64); i < n; i++) {\n const d = time[i] - time[i - 1];\n if (d > 0 && Number.isFinite(d)) gaps.push(d);\n }\n if (!gaps.length) return DAY;\n gaps.sort((a, b) => a - b);\n // the smallest frequent gap: weekends and nights make larger ones\n return gaps[Math.floor(gaps.length * 0.25)];\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- const e=require("./indicators.cjs"),t=require("./chart.cjs");exports.atr=e.atr,exports.bollinger=e.bollinger,exports.createTradingChart=t.createTradingChart,exports.ema=e.ema,exports.heikinAshi=e.heikinAshi,exports.kdj=e.kdj,exports.macd=e.macd,exports.resampleBars=e.resampleBars,exports.rsi=e.rsi,exports.sma=e.sma,exports.vwap=e.vwap,exports.wma=e.wma;
1
+ const e=require("./indicators.cjs"),t=require("./chart.cjs"),n=require("./sync.cjs");exports.atr=e.atr,exports.bollinger=e.bollinger,exports.cci=e.cci,exports.createTradingChart=t.createTradingChart,exports.dmi=e.dmi,exports.donchian=e.donchian,exports.ema=e.ema,exports.heikinAshi=e.heikinAshi,exports.ichimoku=e.ichimoku,exports.kdj=e.kdj,exports.keltner=e.keltner,exports.macd=e.macd,exports.mfi=e.mfi,exports.obv=e.obv,exports.psar=e.psar,exports.resampleBars=e.resampleBars,exports.rsi=e.rsi,exports.sma=e.sma,exports.stochRsi=e.stochRsi,exports.supertrend=e.supertrend,exports.syncCharts=n.syncCharts,exports.volumeProfile=e.volumeProfile,exports.vwap=e.vwap,exports.williamsR=e.williamsR,exports.wma=e.wma;
@@ -1,3 +1,4 @@
1
1
  export type * from './types.cjs';
2
2
  export { createTradingChart } from './chart.cjs';
3
- export { atr, bollinger, ema, heikinAshi, kdj, macd, resampleBars, rsi, sma, vwap, wma, } from './indicators.cjs';
3
+ export { syncCharts } from './sync.cjs';
4
+ export { atr, bollinger, cci, dmi, donchian, ema, heikinAshi, ichimoku, kdj, keltner, macd, mfi, obv, psar, resampleBars, rsi, sma, stochRsi, supertrend, volumeProfile, vwap, williamsR, wma, } from './indicators.cjs';
@@ -1,3 +1,4 @@
1
1
  export type * from './types.js';
2
2
  export { createTradingChart } from './chart.js';
3
- export { atr, bollinger, ema, heikinAshi, kdj, macd, resampleBars, rsi, sma, vwap, wma, } from './indicators.js';
3
+ export { syncCharts } from './sync.js';
4
+ export { atr, bollinger, cci, dmi, donchian, ema, heikinAshi, ichimoku, kdj, keltner, macd, mfi, obv, psar, resampleBars, rsi, sma, stochRsi, supertrend, volumeProfile, vwap, williamsR, wma, } from './indicators.js';
@@ -1,3 +1,4 @@
1
- import { atr as e, bollinger as t, ema as n, heikinAshi as r, kdj as i, macd as a, resampleBars as o, rsi as s, sma as c, vwap as l, wma as u } from "./indicators.js";
2
- import { createTradingChart as d } from "./chart.js";
3
- export { e as atr, t as bollinger, d as createTradingChart, n as ema, r as heikinAshi, i as kdj, a as macd, o as resampleBars, s as rsi, c as sma, l as vwap, u as wma };
1
+ import { atr as e, bollinger as t, cci as n, dmi as r, donchian as i, ema as a, heikinAshi as o, ichimoku as s, kdj as c, keltner as l, macd as u, mfi as d, obv as f, psar as p, resampleBars as m, rsi as h, sma as g, stochRsi as _, supertrend as v, volumeProfile as y, vwap as b, williamsR as x, wma as S } from "./indicators.js";
2
+ import { createTradingChart as C } from "./chart.js";
3
+ import { syncCharts as w } from "./sync.js";
4
+ export { e as atr, t as bollinger, n as cci, C as createTradingChart, r as dmi, i as donchian, a as ema, o as heikinAshi, s as ichimoku, c as kdj, l as keltner, u as macd, d as mfi, f as obv, p as psar, m as resampleBars, h as rsi, g as sma, _ as stochRsi, v as supertrend, w as syncCharts, y as volumeProfile, b as vwap, x as williamsR, S as wma };
@@ -1,2 +1,2 @@
1
- var e=Number.isFinite,t=e=>new Float64Array(e).fill(NaN),n=e=>Math.max(1,Math.floor(e)||1),r=(t,r,i,a,o=0)=>{let s=n(i),c=0,l=0;for(let n=Math.max(0,o-s);n<o;n++){let r=t[n];e(r)&&(c+=r,l++)}for(let n=o;n<r;n++){let r=t[n];if(e(r)&&(c+=r,l++),n>=s){let r=t[n-s];e(r)&&(c-=r,l--)}a[n]=l===s?c/s:NaN}},i=(t,n,r)=>{if(n<r-1)return NaN;let i=0;for(let a=n-r+1;a<=n;a++){let n=t[a];if(!e(n))return NaN;i+=n}return i/r},a=(t,n,r,a,o,s)=>{for(let c=s;c<n;c++){let n=t[c],s=c>0?o[c-1]:NaN;e(n)?e(s)?o[c]=s+a*(n-s):o[c]=i(t,c,r):o[c]=NaN}},o=(e,t,r,i,o=0)=>{let s=n(r);a(e,t,s,2/(s+1),i,o)},s=(e,t,r,i,o=0)=>{let s=n(r);a(e,t,s,1/s,i,o)},c=(t,r,a,o,s=0)=>{let c=n(a),l=c*(c+1)/2,u=n=>{if(n<c-1)return NaN;let r=0;for(let i=0;i<c;i++){let a=t[n-i];if(!e(a))return NaN;r+=(c-i)*a}return r},d=s>0?u(s-1):NaN,f=s>0?i(t,s-1,c)*c:NaN;for(let n=s;n<r;n++){let r=t[n];e(d)&&e(f)&&e(r)?(d=d-f+c*r,f=f+r-(n>=c?t[n-c]:0)):(d=u(n),f=i(t,n,c)*c),o[n]=e(d)?d/l:NaN}},l=(t,r,a,o,s=0)=>{let c=n(a);for(let n=s;n<r;n++){let r=i(t,n,c);if(!e(r)){o[n]=NaN;continue}let a=0;for(let e=n-c+1;e<=n;e++){let n=t[e]-r;a+=n*n}o[n]=Math.sqrt(a/c)}},u=(t,r,i,a,o,s,c=0)=>{let l=n(i);for(let n=c;n<r;n++){if(o[n]=s[n]=NaN,a[n]=NaN,n===0)continue;let r=t[n]-t[n-1];if(e(r)){if(e(o[n-1])&&e(s[n-1]))o[n]=(o[n-1]*(l-1)+Math.max(r,0))/l,s[n]=(s[n-1]*(l-1)+Math.max(-r,0))/l;else if(n>=l){let r=0,i=0,a=!0;for(let o=n-l+1;o<=n;o++){let n=t[o]-t[o-1];if(!e(n)){a=!1;break}n>0?r+=n:i-=n}if(!a)continue;o[n]=r/l,s[n]=i/l}else continue;a[n]=s[n]===0?o[n]===0?50:100:100-100/(1+o[n]/s[n])}}},d=(t,n,r,i,a,o=0)=>{for(let s=o;s<i;s++){let i=t[s]-n[s];if(s===0||!e(r[s-1])){a[s]=i;continue}let o=r[s-1];a[s]=Math.max(i,Math.abs(t[s]-o),Math.abs(n[s]-o))}},f=(t,r,i,a,o,s,c,l,u,d,f=0)=>{let p=n(o),m=n(s),h=n(c);for(let n=f;n<a;n++){if(l[n]=u[n]=d[n]=NaN,n<p-1)continue;let a=-1/0,o=1/0;for(let e=n-p+1;e<=n;e++)t[e]>a&&(a=t[e]),r[e]<o&&(o=r[e]);let s=i[n];if(!e(a)||!e(o)||!e(s))continue;let c=a===o?50:(s-o)/(a-o)*100,f=n>0&&e(l[n-1])?l[n-1]:50,g=n>0&&e(u[n-1])?u[n-1]:50;l[n]=((m-1)*f+c)/m,u[n]=((h-1)*g+l[n])/h,d[n]=3*l[n]-2*u[n]}},p=864e5,m=(e,t,n=0)=>{if(t===`none`)return 0;let r=e+n*6e4,i=Math.floor(r/p);if(t===`day`)return i;if(t===`week`)return Math.floor((i+3)/7);let a=new Date(r);return a.getUTCFullYear()*12+a.getUTCMonth()},h=(t,n,r,i,a,o,s,c,l,u,d,f=0)=>{for(let p=f;p<o;p++){let o=(t[p]+n[p]+r[p])/3,f=e(i[p])?i[p]:0,h=p>0&&(!a||m(a[p],s,c)===m(a[p-1],s,c)),g=h&&e(u[p-1])?u[p-1]:0,_=h&&e(d[p-1])?d[p-1]:0;u[p]=g+(e(o)?o*f:0),d[p]=_+f,l[p]=d[p]>0?u[p]/d[p]:e(o)?o:NaN}},g=(t,n,r,i,a,o,s=0)=>{for(let c=s;c<a;c++){let a=(t[c]+n[c]+r[c]+i[c])/4,s=c>0?o.open[c-1]:NaN,l=c>0?o.close[c-1]:NaN,u=e(s)&&e(l)?(s+l)/2:(t[c]+i[c])/2;o.open[c]=u,o.close[c]=a,o.high[c]=Math.max(n[c],u,a),o.low[c]=Math.min(r[c],u,a)}},_=(e,n)=>{let i=t(e.length);return r(e,e.length,n,i),i},v=(e,n)=>{let r=t(e.length);return o(e,e.length,n,r),r},y=(e,n)=>{let r=t(e.length);return c(e,e.length,n,r),r},b=(e,n=20,i=2)=>{let a=e.length,o=t(a),s=t(a),c=t(a),u=t(a);r(e,a,n,o),l(e,a,n,u);for(let e=0;e<a;e++)s[e]=o[e]+i*u[e],c[e]=o[e]-i*u[e];return{middle:o,upper:s,lower:c}},x=(e,n=12,r=26,i=9)=>{let a=e.length,s=t(a),c=t(a);o(e,a,n,s),o(e,a,r,c);let l=t(a);for(let e=0;e<a;e++)l[e]=s[e]-c[e];let u=t(a);o(l,a,i,u);let d=t(a);for(let e=0;e<a;e++)d[e]=l[e]-u[e];return{macd:l,signal:u,histogram:d}},S=(e,n=14)=>{let r=e.length,i=t(r);return u(e,r,n,i,t(r),t(r)),i},C=(e,n,r,i=9,a=3,o=3)=>{let s=r.length,c=t(s),l=t(s),u=t(s);return f(e,n,r,s,i,a,o,c,l,u),{k:c,d:l,j:u}},w=(e,n,r,i=14)=>{let a=r.length,o=t(a);d(e,n,r,a,o);let c=t(a);return s(o,a,i,c),c},T=(e,n,r,i,a={})=>{let o=r.length,s=t(o);return h(e,n,r,i,a.time??null,o,a.reset??`day`,a.utcOffset??0,s,t(o),t(o)),s},E=e=>{let n=e.close.length,r={open:t(n),high:t(n),low:t(n),close:t(n)};return g(e.open,e.high,e.low,e.close,n,r),r},D={s:1e3,m:6e4,h:36e5,H:36e5,d:p,D:p,w:7*p,W:7*p},O=e=>{if(typeof e==`number`)return e>0?{unit:`ms`,count:e,ms:e}:null;let t=/^(\d+(?:\.\d+)?)([smhHdDwWM])$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);if(!(n>0))return null;let r=t[2];return r===`M`?{unit:`month`,count:n,ms:n*30*p}:{unit:`ms`,count:n*D[r],ms:n*D[r]}},k=(e,t,n=0)=>{let r=n*6e4,i=e+r;if(t.unit===`month`){let e=new Date(i),n=e.getUTCFullYear()*12+e.getUTCMonth(),a=n-n%t.count;return Date.UTC(Math.floor(a/12),a%12,1)-r}if(t.count%(7*p)==0){let e=4*p;return Math.floor((i-e)/t.count)*t.count+e-r}return Math.floor(i/t.count)*t.count-r},A=e=>!Array.isArray(e);function j(e,t,n=0){let r=O(t);if(!r)throw Error(`Invalid timeframe: ${String(t)}`);let i=A(e),a=i?e.close.length:e.length,o=t=>{if(!i)return e[t];let n=e;return{time:n.time[t],open:n.open[t],high:n.high[t],low:n.low[t],close:n.close[t],volume:n.volume?n.volume[t]:void 0}},s=[],c=null;for(let e=0;e<a;e++){let t=o(e),i=k(t.time,r,n);!c||i!==c.time?(c&&s.push(c),c={time:i,open:t.open,high:t.high,low:t.low,close:t.close,volume:t.volume??0}):(t.high>c.high&&(c.high=t.high),t.low<c.low&&(c.low=t.low),c.close=t.close,c.volume=(c.volume??0)+(t.volume??0))}if(c&&s.push(c),!i)return s;let l=s.length,u={time:new Float64Array(l),open:new Float64Array(l),high:new Float64Array(l),low:new Float64Array(l),close:new Float64Array(l),volume:new Float64Array(l)};return s.forEach((e,t)=>{u.time[t]=e.time,u.open[t]=e.open,u.high[t]=e.high,u.low[t]=e.low,u.close[t]=e.close,u.volume[t]=e.volume??0}),u}exports.atr=w,exports.bollinger=b,exports.bucketStart=k,exports.ema=v,exports.emaInto=o,exports.heikinAshi=E,exports.heikinAshiInto=g,exports.kdj=C,exports.kdjInto=f,exports.macd=x,exports.parseTimeframe=O,exports.resampleBars=j,exports.rmaInto=s,exports.rsi=S,exports.rsiInto=u,exports.sessionKey=m,exports.sma=_,exports.smaInto=r,exports.stdevInto=l,exports.trueRangeInto=d,exports.vwap=T,exports.vwapInto=h,exports.wma=y,exports.wmaInto=c;
1
+ const e=require("./format.cjs");var t=Number.isFinite,n=e=>new Float64Array(e).fill(NaN),r=e=>Math.max(1,Math.floor(e)||1),i=(e,n,i,a,o=0)=>{let s=r(i),c=0,l=0;for(let n=Math.max(0,o-s);n<o;n++){let r=e[n];t(r)&&(c+=r,l++)}for(let r=o;r<n;r++){let n=e[r];if(t(n)&&(c+=n,l++),r>=s){let n=e[r-s];t(n)&&(c-=n,l--)}a[r]=l===s?c/s:NaN}},a=(e,n,r)=>{if(n<r-1)return NaN;let i=0;for(let a=n-r+1;a<=n;a++){let n=e[a];if(!t(n))return NaN;i+=n}return i/r},o=(e,n,r,i,o,s)=>{for(let c=s;c<n;c++){let n=e[c],s=c>0?o[c-1]:NaN;t(n)?t(s)?o[c]=s+i*(n-s):o[c]=a(e,c,r):o[c]=NaN}},s=(e,t,n,i,a=0)=>{let s=r(n);o(e,t,s,2/(s+1),i,a)},c=(e,t,n,i,a=0)=>{let s=r(n);o(e,t,s,1/s,i,a)},l=(e,n,i,o,s=0)=>{let c=r(i),l=c*(c+1)/2,u=n=>{if(n<c-1)return NaN;let r=0;for(let i=0;i<c;i++){let a=e[n-i];if(!t(a))return NaN;r+=(c-i)*a}return r},d=s>0?u(s-1):NaN,f=s>0?a(e,s-1,c)*c:NaN;for(let r=s;r<n;r++){let n=e[r];t(d)&&t(f)&&t(n)?(d=d-f+c*n,f=f+n-(r>=c?e[r-c]:0)):(d=u(r),f=a(e,r,c)*c),o[r]=t(d)?d/l:NaN}},u=(e,n,i,o,s=0)=>{let c=r(i);for(let r=s;r<n;r++){let n=a(e,r,c);if(!t(n)){o[r]=NaN;continue}let i=0;for(let t=r-c+1;t<=r;t++){let r=e[t]-n;i+=r*r}o[r]=Math.sqrt(i/c)}},d=(e,n,r,i,a,o)=>{let s=new Int32Array(r+1),c=0,l=0,u=-1,d=(e,t)=>o?e>=t:e<=t,f=n=>{let i=e[n];if(!t(i)){u=n,c=l=0;return}for(;l>c&&d(i,e[s[(l-1)%(r+1)]]);)l--;for(s[l%(r+1)]=n,l++;s[c%(r+1)]<=n-r;)c++};for(let e=Math.max(0,a-r+1);e<a;e++)f(e);for(let t=a;t<n;t++)f(t),i[t]=t<r-1||u>t-r||l===c?NaN:e[s[c%(r+1)]]},f=(e,n,i,a,o,s,c=0)=>{let l=r(i);for(let r=c;r<n;r++){if(o[r]=s[r]=NaN,a[r]=NaN,r===0)continue;let n=e[r]-e[r-1];if(t(n)){if(t(o[r-1])&&t(s[r-1]))o[r]=(o[r-1]*(l-1)+Math.max(n,0))/l,s[r]=(s[r-1]*(l-1)+Math.max(-n,0))/l;else if(r>=l){let n=0,i=0,a=!0;for(let o=r-l+1;o<=r;o++){let r=e[o]-e[o-1];if(!t(r)){a=!1;break}r>0?n+=r:i-=r}if(!a)continue;o[r]=n/l,s[r]=i/l}else continue;a[r]=s[r]===0?o[r]===0?50:100:100-100/(1+o[r]/s[r])}}},p=(e,n,r,i,a,o=0)=>{for(let s=o;s<i;s++){let i=e[s]-n[s];if(s===0||!t(r[s-1])){a[s]=i;continue}let o=r[s-1];a[s]=Math.max(i,Math.abs(e[s]-o),Math.abs(n[s]-o))}},m=(e,n,i,a,o,s,c,l,u,d,f=0)=>{let p=r(o),m=r(s),h=r(c);for(let r=f;r<a;r++){if(l[r]=u[r]=d[r]=NaN,r<p-1)continue;let a=-1/0,o=1/0;for(let t=r-p+1;t<=r;t++)e[t]>a&&(a=e[t]),n[t]<o&&(o=n[t]);let s=i[r];if(!t(a)||!t(o)||!t(s))continue;let c=a===o?50:(s-o)/(a-o)*100,f=r>0&&t(l[r-1])?l[r-1]:50,g=r>0&&t(u[r-1])?u[r-1]:50;l[r]=((m-1)*f+c)/m,u[r]=((h-1)*g+l[r])/h,d[r]=3*l[r]-2*u[r]}},h=864e5,g=(t,n,r=0)=>{if(n===`none`)return 0;let i=t+e.offsetOf(r,t)*6e4,a=Math.floor(i/h);if(n===`day`)return a;if(n===`week`)return Math.floor((a+3)/7);let o=new Date(i);return o.getUTCFullYear()*12+o.getUTCMonth()},_=(e,n,r,i,a,o,s,c,l,u,d,f=0)=>{for(let p=f;p<o;p++){let o=(e[p]+n[p]+r[p])/3,f=t(i[p])?i[p]:0,m=p>0&&(!a||g(a[p],s,c)===g(a[p-1],s,c)),h=m&&t(u[p-1])?u[p-1]:0,_=m&&t(d[p-1])?d[p-1]:0;u[p]=h+(t(o)?o*f:0),d[p]=_+f,l[p]=d[p]>0?u[p]/d[p]:t(o)?o:NaN}},v=(e,n,r,i,a,o,s=0)=>{for(let c=s;c<a;c++){let a=(e[c]+n[c]+r[c]+i[c])/4,s=c>0?o.open[c-1]:NaN,l=c>0?o.close[c-1]:NaN,u=t(s)&&t(l)?(s+l)/2:(e[c]+i[c])/2;o.open[c]=u,o.close[c]=a,o.high[c]=Math.max(n[c],u,a),o.low[c]=Math.min(r[c],u,a)}},y=(e,n,r,i,a=0)=>{for(let o=a;o<r;o++){if(o===0){i[o]=0;continue}let r=t(n[o])?n[o]:0,a=t(i[o-1])?i[o-1]:0,s=e[o]-e[o-1];i[o]=a+(s>0?r:s<0?-r:0)}},b=(e,t,n,r,i,a)=>{for(let o=a;o<r;o++)i[o]=(e[o]+t[o]+n[o])/3},x=(e,n,a,o,s,c,l,u,d=0)=>{let f=r(s);b(e,n,a,o,l,d),i(l,o,f,u,d);for(let e=d;e<o;e++){let n=u[e];if(!t(n)){c[e]=NaN;continue}let r=0;for(let t=e-f+1;t<=e;t++)r+=Math.abs(l[t]-n);r/=f,c[e]=r===0?0:(l[e]-n)/(.015*r)}},S=(e,n,i,a,o,s,c,l,u=0)=>{let f=r(o);d(e,a,f,c,u,!0),d(n,a,f,l,u,!1);for(let e=u;e<a;e++){let n=c[e],r=l[e];s[e]=!t(n)||!t(r)?NaN:n===r?-50:(n-i[e])/(n-r)*-100}},C=(e,n,i,a,o,s,c,l,u=0)=>{let d=r(s);b(e,n,i,o,l,Math.max(0,u-d-1));for(let e=u;e<o;e++){if(e<d){c[e]=NaN;continue}let n=0,r=0,i=!0;for(let o=e-d+1;o<=e;o++){let e=l[o]*(t(a[o])?a[o]:0);if(!t(e)||!t(l[o-1])){i=!1;break}l[o]>l[o-1]?n+=e:l[o]<l[o-1]&&(r+=e)}c[e]=i?r===0?n===0?50:100:100-100/(1+n/r):NaN}},w=(e,n,a,o,s,c,l,u,p,m=0)=>{let h=r(o);f(e,n,a,p.rsi,p.gain,p.loss,m),d(p.rsi,n,h,p.highest,m,!0),d(p.rsi,n,h,p.lowest,m,!1);for(let e=m;e<n;e++){let n=p.highest[e],r=p.lowest[e];p.raw[e]=!t(n)||!t(r)?NaN:n===r?50:(p.rsi[e]-r)/(n-r)*100}i(p.raw,n,s,l,m),i(l,n,c,u,m)},T=(e,n,r,i,a,o,s,l,u,d,f=0)=>{for(let t=f;t<i;t++){if(t===0){d.tr[t]=d.plusDm[t]=d.minusDm[t]=NaN;continue}let i=e[t]-e[t-1],a=n[t-1]-n[t];d.plusDm[t]=i>a&&i>0?i:0,d.minusDm[t]=a>i&&a>0?a:0;let o=r[t-1];d.tr[t]=Math.max(e[t]-n[t],Math.abs(e[t]-o),Math.abs(n[t]-o))}c(d.tr,i,a,d.smoothTr,f),c(d.plusDm,i,a,d.smoothPlus,f),c(d.minusDm,i,a,d.smoothMinus,f);for(let e=f;e<i;e++){let n=d.smoothTr[e];s[e]=n?100*d.smoothPlus[e]/n:NaN,l[e]=n?100*d.smoothMinus[e]/n:NaN;let r=s[e]+l[e];d.dx[e]=t(r)?r===0?0:100*Math.abs(s[e]-l[e])/r:NaN}c(d.dx,i,o,u,f)},E=(e,n,r,i,a,o,s,c,l=0)=>{let{ep:u,af:d,trend:f}=c;for(let c=l;c<r;c++){if(c===0){s[c]=u[c]=d[c]=f[c]=NaN;continue}if(!t(f[c-1])){let r=e[c]+n[c]>=e[c-1]+n[c-1];s[c]=r?Math.min(n[c-1],n[c]):Math.max(e[c-1],e[c]),u[c]=r?Math.max(e[c-1],e[c]):Math.min(n[c-1],n[c]),d[c]=i,f[c]=t(s[c])?r?1:-1:NaN;continue}let r=u[c-1],l=d[c-1],p=s[c-1]+l*(r-s[c-1]),m=c>=2?c-2:c-1;f[c-1]===1?(p=Math.min(p,n[c-1],n[m]),n[c]<p?(f[c]=-1,p=Math.max(r,e[c]),u[c]=n[c],d[c]=i):(f[c]=1,u[c]=Math.max(r,e[c]),d[c]=e[c]>r?Math.min(l+a,o):l)):(p=Math.max(p,e[c-1],e[m]),e[c]>p?(f[c]=1,p=Math.min(r,n[c]),u[c]=e[c],d[c]=i):(f[c]=-1,u[c]=Math.min(r,n[c]),d[c]=n[c]<r?Math.min(l+a,o):l)),s[c]=p}},D=(e,n,r,i,a,o,s,l,u,d=0)=>{let{tr:f,atr:m,upper:h,lower:g}=u;p(e,n,r,i,f,d),c(f,i,a,m,d);for(let a=d;a<i;a++){let i=m[a];if(!t(i)){s[a]=l[a]=h[a]=g[a]=NaN;continue}let c=(e[a]+n[a])/2,u=c+o*i,d=c-o*i,f=a>0?h[a-1]:NaN,p=a>0?g[a-1]:NaN,_=a>0?r[a-1]:NaN;t(p)&&!(d>p||_<p)&&(d=p),t(f)&&!(u<f||_>f)&&(u=f),h[a]=u,g[a]=d;let v=a>0?l[a-1]:NaN,y=t(v)?v===-1?r[a]>u?1:-1:r[a]<d?-1:1:-1;l[a]=y,s[a]=y===1?d:u}},O=(e,t,n,i,a,o,s,c)=>{let l=r(i);d(e,n,l,o,c,!0),d(t,n,l,s,c,!1);for(let e=c;e<n;e++)a[e]=(o[e]+s[e])/2},k=(e,t,n,r,i,a,o,s,c,l,u,d=0)=>{let{highest:f,lowest:p}=u;O(e,t,n,r,o,f,p,d),O(e,t,n,i,s,f,p,d),O(e,t,n,a,l,f,p,d);for(let e=d;e<n;e++)c[e]=(o[e]+s[e])/2},A=(e,t,n,i,a,o,s,c=0)=>{let l=r(i);d(e,n,l,a,c,!0),d(t,n,l,o,c,!1);for(let e=c;e<n;e++)s[e]=(a[e]+o[e])/2},j=(e,t,n,r,i,a,o,l,u,d,f,m=0)=>{s(n,r,i,l,m),p(e,t,n,r,f.tr,m),c(f.tr,r,o,f.atr,m);for(let e=m;e<r;e++)u[e]=l[e]+a*f.atr[e],d[e]=l[e]-a*f.atr[e]},M=(e,t)=>{let r=n(e.length);return i(e,e.length,t,r),r},ee=(e,t)=>{let r=n(e.length);return s(e,e.length,t,r),r},te=(e,t)=>{let r=n(e.length);return l(e,e.length,t,r),r},ne=(e,t=20,r=2)=>{let a=e.length,o=n(a),s=n(a),c=n(a),l=n(a);i(e,a,t,o),u(e,a,t,l);for(let e=0;e<a;e++)s[e]=o[e]+r*l[e],c[e]=o[e]-r*l[e];return{middle:o,upper:s,lower:c}},re=(e,t=12,r=26,i=9)=>{let a=e.length,o=n(a),c=n(a);s(e,a,t,o),s(e,a,r,c);let l=n(a);for(let e=0;e<a;e++)l[e]=o[e]-c[e];let u=n(a);s(l,a,i,u);let d=n(a);for(let e=0;e<a;e++)d[e]=l[e]-u[e];return{macd:l,signal:u,histogram:d}},N=(e,t=14)=>{let r=e.length,i=n(r);return f(e,r,t,i,n(r),n(r)),i},P=(e,t,r,i=9,a=3,o=3)=>{let s=r.length,c=n(s),l=n(s),u=n(s);return m(e,t,r,s,i,a,o,c,l,u),{k:c,d:l,j:u}},F=(e,t,r,i=14)=>{let a=r.length,o=n(a);p(e,t,r,a,o);let s=n(a);return c(o,a,i,s),s},I=(t,r,i,a,o={})=>{let s=i.length,c=n(s),l=o.timeZone;return _(t,r,i,a,o.time??null,s,o.reset??`day`,o.utcOffset??(l?t=>e.zoneOffset(t,l):0),c,n(s),n(s)),c},L=e=>{let t=e.close.length,r={open:n(t),high:n(t),low:n(t),close:n(t)};return v(e.open,e.high,e.low,e.close,t,r),r},R=(e,t)=>{let r=n(e.length);return y(e,t,e.length,r),r},z=(e,t,r,i=20)=>{let a=r.length,o=n(a);return x(e,t,r,a,i,o,n(a),n(a)),o},B=(e,t,r,i=14)=>{let a=r.length,o=n(a);return S(e,t,r,a,i,o,n(a),n(a)),o},V=(e,t,r,i,a=14)=>{let o=r.length,s=n(o);return C(e,t,r,i,o,a,s,n(o)),s},H=(e,t={})=>{let r=e.length,i=n(r),a=n(r);return w(e,r,t.rsiPeriod??14,t.stochPeriod??14,t.kPeriod??3,t.dPeriod??3,i,a,{rsi:n(r),gain:n(r),loss:n(r),highest:n(r),lowest:n(r),raw:n(r)}),{k:i,d:a}},U=(e,t,r,i=14,a=14)=>{let o=r.length,s=n(o),c=n(o),l=n(o);return T(e,t,r,o,i,a,s,c,l,{tr:n(o),plusDm:n(o),minusDm:n(o),smoothTr:n(o),smoothPlus:n(o),smoothMinus:n(o),dx:n(o)}),{plus:s,minus:c,adx:l}},W=(e,t,r={})=>{let i=e.length,a=n(i),o=r.start??.02;return E(e,t,i,o,r.increment??o,r.maximum??.2,a,{ep:n(i),af:n(i),trend:n(i)}),a},G=(e,t,r,i=10,a=3)=>{let o=r.length,s=n(o),c=n(o);return D(e,t,r,o,i,a,s,c,{tr:n(o),atr:n(o),upper:n(o),lower:n(o)}),{value:s,direction:c}},K=(e,t,r={})=>{let i=e.length,a={conversion:n(i),base:n(i),spanA:n(i),spanB:n(i)};return k(e,t,i,r.conversionPeriod??9,r.basePeriod??26,r.spanBPeriod??52,a.conversion,a.base,a.spanA,a.spanB,{highest:n(i),lowest:n(i)}),a},q=(e,t,r,i={})=>{let a=r.length,o={middle:n(a),upper:n(a),lower:n(a)};return j(e,t,r,a,i.period??20,i.multiplier??2,i.atrPeriod??10,o.middle,o.upper,o.lower,{tr:n(a),atr:n(a)}),o},J=(e,t,r=20)=>{let i=e.length,a={upper:n(i),lower:n(i),middle:n(i)};return A(e,t,i,r,a.upper,a.lower,a.middle),a},Y=(e,n={})=>{let r=e.close.length,i=Math.max(0,Math.floor(n.from??0)),a=Math.min(r-1,Math.floor(n.to??r-1)),o=Math.max(1,Math.floor(n.rows??24)),s=1/0,c=-1/0;for(let t=i;t<=a;t++)e.low[t]<s&&(s=e.low[t]),e.high[t]>c&&(c=e.high[t]);let l=new Float64Array(o),u=new Float64Array(o),d={low:s,high:c,step:0,up:l,down:u,total:0,poc:-1,valueAreaFrom:-1,valueAreaTo:-1};if(!t(s)||!t(c))return d;c===s&&(c+=Math.abs(s)*1e-6||1e-6,s-=Math.abs(s)*1e-6||1e-6);let f=(c-s)/o,p=0;for(let n=i;n<=a;n++){let r=e.volume[n],i=e.low[n],a=e.high[n];if(!(r>0)||!t(i)||!t(a))continue;let c=e.close[n]>=e.open[n]?l:u;p+=r;let d=Math.min(o-1,Math.max(0,Math.floor((i-s)/f))),m=Math.min(o-1,Math.max(0,Math.floor((a-s)/f)));if(d===m||a<=i){c[d]+=r;continue}let h=a-i;for(let e=d;e<=m;e++){let t=s+e*f,n=Math.min(a,t+f)-Math.max(i,t);n>0&&(c[e]+=r*n/h)}}if(!(p>0))return{...d,low:s,high:c,step:f};let m=0;for(let e=1;e<o;e++)l[e]+u[e]>l[m]+u[m]&&(m=e);let h=p*Math.min(1,Math.max(0,n.valueArea??.7)),g=m,_=m,v=l[m]+u[m];for(;v<h&&(g>0||_<o-1);){let e=g>0?l[g-1]+u[g-1]:-1;(_<o-1?l[_+1]+u[_+1]:-1)>=e?(_++,v+=l[_]+u[_]):(g--,v+=l[g]+u[g])}return{low:s,high:c,step:f,up:l,down:u,total:p,poc:m,valueAreaFrom:g,valueAreaTo:_}},X={s:1e3,m:6e4,h:36e5,H:36e5,d:h,D:h,w:7*h,W:7*h},Z=e=>{if(typeof e==`number`)return e>0?{unit:`ms`,count:e,ms:e}:null;let t=/^(\d+(?:\.\d+)?)([smhHdDwWM])$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);if(!(n>0))return null;let r=t[2];return r===`M`?{unit:`month`,count:n,ms:n*30*h}:{unit:`ms`,count:n*X[r],ms:n*X[r]}},Q=(t,n,r=0)=>{let i=t+e.offsetOf(r,t)*6e4;if(n.unit===`month`){let e=new Date(i),t=e.getUTCFullYear()*12+e.getUTCMonth();return t-t%n.count}return n.count%(7*h)==0?Math.floor((i-4*h)/n.count):Math.floor(i/n.count)},$=(t,n,r=0)=>{let i=Q(t,n,r),a=n.unit===`month`?Date.UTC(Math.floor(i/12),i%12,1):n.count%(7*h)==0?i*n.count+4*h:i*n.count,o=a-e.offsetOf(r,t)*6e4;return a-e.offsetOf(r,o)*6e4},ie=e=>!Array.isArray(e);function ae(t,n,r=0){let i=Z(n);if(!i)throw Error(`Invalid timeframe: ${String(n)}`);let a=typeof r==`string`?t=>e.zoneOffset(t,r):r,o=ie(t),s=o?t.close.length:t.length,c=e=>{if(!o)return t[e];let n=t;return{time:n.time[e],open:n.open[e],high:n.high[e],low:n.low[e],close:n.close[e],volume:n.volume?n.volume[e]:void 0}},l=[],u=null,d=NaN;for(let e=0;e<s;e++){let t=c(e),n=Q(t.time,i,a);!u||n!==d?(u&&l.push(u),d=n,u={time:$(t.time,i,a),open:t.open,high:t.high,low:t.low,close:t.close,volume:t.volume??0}):(t.high>u.high&&(u.high=t.high),t.low<u.low&&(u.low=t.low),u.close=t.close,u.volume=(u.volume??0)+(t.volume??0))}if(u&&l.push(u),!o)return l;let f=l.length,p={time:new Float64Array(f),open:new Float64Array(f),high:new Float64Array(f),low:new Float64Array(f),close:new Float64Array(f),volume:new Float64Array(f)};return l.forEach((e,t)=>{p.time[t]=e.time,p.open[t]=e.open,p.high[t]=e.high,p.low[t]=e.low,p.close[t]=e.close,p.volume[t]=e.volume??0}),p}exports.atr=F,exports.bollinger=ne,exports.bucketKey=Q,exports.bucketStart=$,exports.cci=z,exports.cciInto=x,exports.dmi=U,exports.dmiInto=T,exports.donchian=J,exports.donchianInto=A,exports.ema=ee,exports.emaInto=s,exports.heikinAshi=L,exports.heikinAshiInto=v,exports.ichimoku=K,exports.ichimokuInto=k,exports.kdj=P,exports.kdjInto=m,exports.keltner=q,exports.keltnerInto=j,exports.macd=re,exports.mfi=V,exports.mfiInto=C,exports.obv=R,exports.obvInto=y,exports.parseTimeframe=Z,exports.psar=W,exports.psarInto=E,exports.resampleBars=ae,exports.rmaInto=c,exports.rsi=N,exports.rsiInto=f,exports.sessionKey=g,exports.sma=M,exports.smaInto=i,exports.stdevInto=u,exports.stochRsi=H,exports.stochRsiInto=w,exports.supertrend=G,exports.supertrendInto=D,exports.trueRangeInto=p,exports.volumeProfile=Y,exports.vwap=I,exports.vwapInto=_,exports.williamsR=B,exports.williamsRInto=S,exports.wma=te,exports.wmaInto=l;
2
2
  //# sourceMappingURL=indicators.cjs.map