@devexperts/dxcharts-lite 1.0.2 → 2.0.1

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 (258) hide show
  1. package/README.md +2 -2
  2. package/dist/chart/animation/canvas-animation.js +134 -1
  3. package/dist/chart/animation/types/animation.js +43 -1
  4. package/dist/chart/animation/types/color-alpha-animation.d.ts +1 -1
  5. package/dist/chart/animation/types/color-alpha-animation.js +60 -1
  6. package/dist/chart/animation/types/color-transition-animation.d.ts +1 -1
  7. package/dist/chart/animation/types/color-transition-animation.js +86 -1
  8. package/dist/chart/animation/types/viewport-movement-animation.js +63 -1
  9. package/dist/chart/animation/viewport-model-animation.js +20 -1
  10. package/dist/chart/bootstrap.d.ts +51 -48
  11. package/dist/chart/bootstrap.js +449 -1
  12. package/dist/chart/canvas/canvas-bounds-container.d.ts +0 -5
  13. package/dist/chart/canvas/canvas-bounds-container.js +815 -1
  14. package/dist/chart/canvas/canvas-chart-html.js +16 -18
  15. package/dist/chart/canvas/chart-elements.d.ts +1 -4
  16. package/dist/chart/canvas/chart-elements.js +22 -1
  17. package/dist/chart/canvas/cursor.handler.js +122 -1
  18. package/dist/chart/canvas/layout-creator.js +34 -1
  19. package/dist/chart/canvas/y-axis-bounds.container.d.ts +2 -2
  20. package/dist/chart/canvas/y-axis-bounds.container.js +67 -1
  21. package/dist/chart/chart-container.js +1 -1
  22. package/dist/chart/chart.config.d.ts +4 -5
  23. package/dist/chart/chart.config.js +645 -1
  24. package/dist/chart/chart.d.ts +62 -0
  25. package/dist/chart/chart.js +106 -0
  26. package/dist/chart/components/chart/basic-scale.d.ts +2 -2
  27. package/dist/chart/components/chart/basic-scale.js +31 -1
  28. package/dist/chart/components/chart/candle-transformer.functions.js +15 -1
  29. package/dist/chart/components/chart/candle-width-calculator.functions.js +2 -1
  30. package/dist/chart/components/chart/candle.functions.js +44 -1
  31. package/dist/chart/components/chart/chart-area-pan.handler.d.ts +3 -3
  32. package/dist/chart/components/chart/chart-area-pan.handler.js +197 -1
  33. package/dist/chart/components/chart/chart-base.model.js +66 -1
  34. package/dist/chart/components/chart/chart.component.d.ts +7 -3
  35. package/dist/chart/components/chart/chart.component.js +408 -1
  36. package/dist/chart/components/chart/chart.model.d.ts +4 -11
  37. package/dist/chart/components/chart/chart.model.js +954 -1
  38. package/dist/chart/components/chart/data-series.high-low-provider.js +34 -1
  39. package/dist/chart/components/chart/fake-candles.js +97 -1
  40. package/dist/chart/components/chart/price.formatter.js +35 -1
  41. package/dist/chart/components/chart/secondary-chart-colors-pool.js +68 -1
  42. package/dist/chart/components/cross_tool/cross-tool.component.js +85 -1
  43. package/dist/chart/components/cross_tool/cross-tool.drawer.js +32 -1
  44. package/dist/chart/components/cross_tool/cross-tool.model.js +107 -1
  45. package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.js +137 -1
  46. package/dist/chart/components/cross_tool/types/none.drawer.js +3 -1
  47. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.js +28 -1
  48. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.js +24 -1
  49. package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.js +53 -1
  50. package/dist/chart/components/dynamic-objects/dynamic-objects.component.d.ts +13 -0
  51. package/dist/chart/components/dynamic-objects/dynamic-objects.component.js +20 -0
  52. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.d.ts +18 -0
  53. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.js +23 -0
  54. package/dist/chart/components/dynamic-objects/dynamic-objects.model.d.ts +63 -0
  55. package/dist/chart/components/dynamic-objects/dynamic-objects.model.js +136 -0
  56. package/dist/chart/components/events/events-hit-test.drawer.js +63 -1
  57. package/dist/chart/components/events/events.component.js +61 -1
  58. package/dist/chart/components/events/events.drawer.js +195 -1
  59. package/dist/chart/components/events/events.model.js +69 -1
  60. package/dist/chart/components/grid/grid.component.d.ts +2 -2
  61. package/dist/chart/components/grid/grid.component.js +31 -1
  62. package/dist/chart/components/grid/grid.drawer.d.ts +4 -3
  63. package/dist/chart/components/grid/grid.drawer.js +106 -1
  64. package/dist/chart/components/high_low/high-low.component.js +12 -1
  65. package/dist/chart/components/high_low/high-low.drawer.js +126 -1
  66. package/dist/chart/components/highlights/highlights.component.js +46 -1
  67. package/dist/chart/components/highlights/highlights.drawer.js +154 -1
  68. package/dist/chart/components/highlights/highlights.model.js +75 -1
  69. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.d.ts +1 -1
  70. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.js +199 -1
  71. package/dist/chart/components/navigation_map/navigation-map-move.handler.d.ts +2 -2
  72. package/dist/chart/components/navigation_map/navigation-map-move.handler.js +108 -1
  73. package/dist/chart/components/navigation_map/navigation-map.component.js +112 -1
  74. package/dist/chart/components/navigation_map/navigation-map.drawer.js +244 -1
  75. package/dist/chart/components/navigation_map/navigation-map.model.js +33 -2
  76. package/dist/chart/components/pan/chart-pan.component.d.ts +2 -2
  77. package/dist/chart/components/pan/chart-pan.component.js +51 -1
  78. package/dist/chart/components/pane/extent/y-extent-component.d.ts +12 -18
  79. package/dist/chart/components/pane/extent/y-extent-component.js +120 -1
  80. package/dist/chart/components/pane/pane-hit-test.controller.d.ts +2 -2
  81. package/dist/chart/components/pane/pane-hit-test.controller.js +55 -1
  82. package/dist/chart/components/pane/pane-manager.component.d.ts +12 -6
  83. package/dist/chart/components/pane/pane-manager.component.js +149 -1
  84. package/dist/chart/components/pane/pane.component.d.ts +16 -32
  85. package/dist/chart/components/pane/pane.component.js +278 -1
  86. package/dist/chart/components/resizer/bar-resizer.component.js +139 -1
  87. package/dist/chart/components/resizer/bar-resizer.drawer.js +46 -1
  88. package/dist/chart/components/snapshot/snapshot.component.js +48 -1
  89. package/dist/chart/components/volumes/separate-volumes.component.d.ts +6 -10
  90. package/dist/chart/components/volumes/separate-volumes.component.js +63 -1
  91. package/dist/chart/components/volumes/volume-color-resolvers.functions.js +18 -1
  92. package/dist/chart/components/volumes/volumes.component.d.ts +6 -7
  93. package/dist/chart/components/volumes/volumes.component.js +94 -1
  94. package/dist/chart/components/volumes/volumes.drawer.d.ts +5 -12
  95. package/dist/chart/components/volumes/volumes.drawer.js +140 -1
  96. package/dist/chart/components/volumes/volumes.formatter.js +31 -1
  97. package/dist/chart/components/volumes/volumes.model.d.ts +2 -2
  98. package/dist/chart/components/volumes/volumes.model.js +43 -1
  99. package/dist/chart/components/watermark/water-mark.component.js +103 -1
  100. package/dist/chart/components/watermark/water-mark.drawer.js +187 -1
  101. package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +27 -1
  102. package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +187 -1
  103. package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +76 -1
  104. package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +79 -1
  105. package/dist/chart/components/x_axis/time/parser/time-formats.model.js +14 -1
  106. package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +1 -1
  107. package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +143 -1
  108. package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +73 -1
  109. package/dist/chart/components/x_axis/x-axis-draw.functions.js +49 -1
  110. package/dist/chart/components/x_axis/x-axis-labels.drawer.js +70 -1
  111. package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +2 -2
  112. package/dist/chart/components/x_axis/x-axis-labels.generator.js +332 -1
  113. package/dist/chart/components/x_axis/x-axis-labels.model.js +35 -1
  114. package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +2 -2
  115. package/dist/chart/components/x_axis/x-axis-scale.handler.js +60 -1
  116. package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +82 -1
  117. package/dist/chart/components/x_axis/x-axis.component.d.ts +2 -2
  118. package/dist/chart/components/x_axis/x-axis.component.js +119 -1
  119. package/dist/chart/components/y_axis/label-color.functions.js +53 -1
  120. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +4 -4
  121. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +33 -1
  122. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +3 -3
  123. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +67 -1
  124. package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +56 -1
  125. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.d.ts +4 -3
  126. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +96 -1
  127. package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +2 -2
  128. package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +119 -1
  129. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +9 -8
  130. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +201 -1
  131. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +6 -7
  132. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +58 -1
  133. package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +6 -4
  134. package/dist/chart/components/y_axis/y-axis-base-labels.model.js +47 -1
  135. package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +4 -4
  136. package/dist/chart/components/y_axis/y-axis-labels.drawer.js +161 -1
  137. package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +2 -2
  138. package/dist/chart/components/y_axis/y-axis-scale.handler.js +72 -1
  139. package/dist/chart/components/y_axis/y-axis.component.d.ts +32 -41
  140. package/dist/chart/components/y_axis/y-axis.component.js +220 -1
  141. package/dist/chart/components/y_axis/y-axis.drawer.d.ts +9 -12
  142. package/dist/chart/components/y_axis/y-axis.drawer.js +96 -1
  143. package/dist/chart/components/y_axis/y-axis.model.d.ts +10 -17
  144. package/dist/chart/components/y_axis/y-axis.model.js +34 -1
  145. package/dist/chart/drawers/chart-background.drawer.js +69 -1
  146. package/dist/chart/drawers/chart-type-drawers/area.drawer.js +69 -1
  147. package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +57 -1
  148. package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +84 -1
  149. package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +162 -1
  150. package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +57 -1
  151. package/dist/chart/drawers/chart-type-drawers/line.drawer.js +38 -1
  152. package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +19 -1
  153. package/dist/chart/drawers/clear-canvas.drawer.js +14 -1
  154. package/dist/chart/drawers/composite.drawer.js +67 -1
  155. package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +50 -1
  156. package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +35 -1
  157. package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +16 -1
  158. package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +106 -1
  159. package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +23 -1
  160. package/dist/chart/drawers/data-series-drawers/linear.drawer.js +19 -1
  161. package/dist/chart/drawers/data-series-drawers/points.drawer.js +19 -1
  162. package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +7 -1
  163. package/dist/chart/drawers/data-series-drawers/text.drawer.js +25 -1
  164. package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +35 -1
  165. package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +22 -1
  166. package/dist/chart/drawers/data-series.drawer.d.ts +5 -7
  167. package/dist/chart/drawers/data-series.drawer.js +56 -1
  168. package/dist/chart/drawers/drawing-manager.d.ts +1 -1
  169. package/dist/chart/drawers/drawing-manager.js +177 -1
  170. package/dist/chart/drawers/ht-data-series.drawer.js +37 -1
  171. package/dist/chart/events/event-bus.js +73 -1
  172. package/dist/chart/events/events.js +3 -1
  173. package/dist/chart/inputhandlers/candle-tap.handler.js +46 -1
  174. package/dist/chart/inputhandlers/chart-resize.handler.js +98 -1
  175. package/dist/chart/inputhandlers/cross-event-producer.component.js +67 -1
  176. package/dist/chart/inputhandlers/hover-producer.component.d.ts +2 -2
  177. package/dist/chart/inputhandlers/hover-producer.component.js +228 -1
  178. package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +2 -2
  179. package/dist/chart/inputhandlers/main-canvas-touch.handler.js +80 -1
  180. package/dist/chart/inputlisteners/canvas-input-listener.component.js +629 -1
  181. package/dist/chart/model/baseline.model.js +88 -1
  182. package/dist/chart/model/bounds.model.js +1 -1
  183. package/dist/chart/model/candle-hover.js +70 -1
  184. package/dist/chart/model/candle-series-high-low.provider.js +45 -1
  185. package/dist/chart/model/candle-series.model.d.ts +3 -3
  186. package/dist/chart/model/candle-series.model.js +245 -1
  187. package/dist/chart/model/candle.model.js +69 -1
  188. package/dist/chart/model/canvas.model.js +228 -1
  189. package/dist/chart/model/chart-base-element.js +129 -1
  190. package/dist/chart/model/compare-series-hover.js +25 -1
  191. package/dist/chart/model/data-series-view.d.ts +5 -5
  192. package/dist/chart/model/data-series-view.js +111 -1
  193. package/dist/chart/model/data-series.config.js +14 -1
  194. package/dist/chart/model/data-series.model.d.ts +4 -4
  195. package/dist/chart/model/data-series.model.js +281 -1
  196. package/dist/chart/model/date-time.formatter.js +151 -1
  197. package/dist/chart/model/hit-test-canvas.model.d.ts +1 -1
  198. package/dist/chart/model/hit-test-canvas.model.js +256 -1
  199. package/dist/chart/model/main-candle-series.model.d.ts +1 -1
  200. package/dist/chart/model/main-candle-series.model.js +29 -1
  201. package/dist/chart/model/scale.model.d.ts +3 -2
  202. package/dist/chart/model/scale.model.js +316 -1
  203. package/dist/chart/model/scaling/auto-scale.model.d.ts +2 -4
  204. package/dist/chart/model/scaling/auto-scale.model.js +91 -1
  205. package/dist/chart/model/scaling/constrait.functions.js +61 -1
  206. package/dist/chart/model/scaling/lock-ratio.model.js +17 -1
  207. package/dist/chart/model/scaling/move-chart.functions.js +22 -1
  208. package/dist/chart/model/scaling/viewport.model.d.ts +2 -2
  209. package/dist/chart/model/scaling/viewport.model.js +279 -1
  210. package/dist/chart/model/scaling/x-zooming.functions.js +35 -1
  211. package/dist/chart/model/time-zone.model.js +109 -1
  212. package/dist/chart/model/visual-candle.js +134 -1
  213. package/dist/chart/utils/__tests__/array.utils.test.js +135 -1
  214. package/dist/chart/utils/__tests__/math.utils.test.js +14 -1
  215. package/dist/chart/utils/__tests__/object.utils.test.js +11 -1
  216. package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +29 -1
  217. package/dist/chart/utils/array.utils.d.ts +1 -1
  218. package/dist/chart/utils/array.utils.js +269 -1
  219. package/dist/chart/utils/auto-period-detector.utils.js +39 -1
  220. package/dist/chart/utils/candles-generator-ts.utils.js +20 -1
  221. package/dist/chart/utils/candles-generator.utils.js +161 -1
  222. package/dist/chart/utils/candles.utils.js +42 -1
  223. package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +144 -1
  224. package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +51 -1
  225. package/dist/chart/utils/canvas/canvas-text-functions.utils.js +156 -1
  226. package/dist/chart/utils/color.utils.js +31 -1
  227. package/dist/chart/utils/device/browser.utils.js +10 -1
  228. package/dist/chart/utils/device/device-detector.utils.js +24 -1
  229. package/dist/chart/utils/device/device-pixel-ratio.utils.js +21 -1
  230. package/dist/chart/utils/device/touchpad.utils.js +91 -1
  231. package/dist/chart/utils/dom.utils.js +15 -1
  232. package/dist/chart/utils/function.utils.js +16 -1
  233. package/dist/chart/utils/linkedList.utils.d.ts +28 -0
  234. package/dist/chart/utils/linkedList.utils.js +138 -0
  235. package/dist/chart/utils/math.utils.js +115 -1
  236. package/dist/chart/utils/merge.utils.js +56 -1
  237. package/dist/chart/utils/object.utils.js +43 -1
  238. package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
  239. package/dist/chart/utils/{perfomance → performance}/debounce.utils.js +7 -1
  240. package/dist/chart/utils/performance/memoize.utils.js +74 -0
  241. package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
  242. package/dist/chart/utils/performance/throttle.utils.js +26 -0
  243. package/dist/chart/utils/price-increments.utils.d.ts +1 -0
  244. package/dist/chart/utils/price-increments.utils.js +127 -1
  245. package/dist/chart/utils/uuid.utils.js +4 -1
  246. package/dist/dxchart.min.js +9 -12
  247. package/dist/index.d.ts +3 -3
  248. package/dist/index.js +20 -1
  249. package/package.json +4 -4
  250. package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
  251. package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
  252. package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
  253. package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
  254. /package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +0 -0
  255. /package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +0 -0
  256. /package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +0 -0
  257. /package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +0 -0
  258. /package/dist/chart/utils/{perfomance → performance}/throttle.utils.d.ts +0 -0
@@ -3,4 +3,112 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{getTimezoneOffset as n}from"date-fns-tz";import{ReplaySubject as s}from"rxjs";import{memoize as f}from"../utils/perfomance/memoize.utils";import{dateTimeFormatterFactory as c}from"./date-time.formatter";export const memoizedTZOffset=f(n),getTimezoneOffset=(r,e)=>new Date(e).getTimezoneOffset()*60*1e3+memoizedTZOffset(r,e);export class TimeZoneModel{constructor(e){this.config=e,this.timeZoneChangedSubject=new s,this.currentTzOffset=t=>this.getOffset(this.config.timezone,t),this.formatterCache={},this.getOffset=(t,i)=>getTimezoneOffset(t,i),this.dateTimeFormatterFactory=this.initFormatterFactory(this.config.dateFormatter)}setTimeZone(e){this.config.timezone=e,this.formatterCache={},this.timeZoneChangedSubject.next(e)}observeTimeZoneChanged(){return this.timeZoneChangedSubject.asObservable()}initFormatterFactory(e){let t;if(e&&typeof e=="function")t=e;else if(e&&e.createFormatterFunction&&typeof e.createFormatterFunction=="function"){const i=e.createFormatterFunction;t=o=>i(o).bind(e)}else t=c(this.config,this.tzOffset);return t}getFormatterFactory(){return this.dateTimeFormatterFactory}getDateTimeFormatter(e){return this.formatterCache[e]===void 0&&(this.formatterCache[e]=this.dateTimeFormatterFactory(e)),this.formatterCache[e]}tzOffset(e){const t=o=>-new Date(o).getTimezoneOffset()*a;let i;return e?i=o=>memoizedTZOffset(e,o):i=t,o=>new Date(+o+i(o)-t(o))}}const a=60*1e3;
6
+ import { getTimezoneOffset as getTimezoneOffsetDateFnsTz } from 'date-fns-tz';
7
+ import { ReplaySubject } from 'rxjs';
8
+ import { memoize } from '../utils/performance/memoize.utils';
9
+ import { dateTimeFormatterFactory } from './date-time.formatter';
10
+ export const memoizedTZOffset = memoize(getTimezoneOffsetDateFnsTz);
11
+ export const getTimezoneOffset = (timezone, time) => {
12
+ // we must pass time here, because we can have daylight saving time, otherwise we will get wrong offset
13
+ const localOffset = new Date(time).getTimezoneOffset() * 60 * 1000;
14
+ return localOffset + memoizedTZOffset(timezone, time);
15
+ };
16
+ export class TimeZoneModel {
17
+ constructor(config) {
18
+ this.config = config;
19
+ this.timeZoneChangedSubject = new ReplaySubject();
20
+ this.currentTzOffset = (time) => this.getOffset(this.config.timezone, time);
21
+ this.formatterCache = {};
22
+ /**
23
+ * Calculates the offset of a given timezone from the local timezone.
24
+ * @private
25
+ * @param {string} timezone - The timezone to calculate the offset for.
26
+ */
27
+ this.getOffset = (timezone, time) => getTimezoneOffset(timezone, time);
28
+ this.dateTimeFormatterFactory = this.initFormatterFactory(this.config.dateFormatter);
29
+ }
30
+ /**
31
+ * Sets the timezone for the configuration and updates the current timezone offset.
32
+ * @param {string} timeZone - The timezone to set.
33
+ * @returns {void}
34
+ */
35
+ setTimeZone(timeZone) {
36
+ this.config.timezone = timeZone;
37
+ this.formatterCache = {};
38
+ this.timeZoneChangedSubject.next(timeZone);
39
+ }
40
+ /**
41
+ * Returns an Observable that emits a string value when the time zone is changed.
42
+ * The Observable is created from the timeZoneChangedSubject Subject.
43
+ * @returns {Observable<string>} An Observable that emits a string value when the time zone is changed.
44
+ */
45
+ observeTimeZoneChanged() {
46
+ return this.timeZoneChangedSubject.asObservable();
47
+ }
48
+ /**
49
+ * Initializes a DateTimeFormatterFactory object.
50
+ * @param {DateFormatter} [dateFormatter] - Optional DateFormatter object.
51
+ * @returns {DateTimeFormatterFactory} - Returns a DateTimeFormatterFactory object.
52
+ * If a plain function is provided as the dateFormatter parameter, it will be used as a date formatter without applying UTC datetime override for candles more than 1d period.
53
+ * If a custom date formatter exists, it will be used for datetime formatting applying optionally UTC datetime override for candles more than 1d period.
54
+ * If no dateFormatter is provided, a default DateTimeFormatterFactory object will be returned.
55
+ */
56
+ initFormatterFactory(dateFormatter) {
57
+ let result;
58
+ if (dateFormatter && typeof dateFormatter === 'function') {
59
+ // backward compatibility - if date formatter is a plain function then there is no need to use UTC datetime
60
+ // override for candles more than 1d period
61
+ result = dateFormatter;
62
+ }
63
+ else if (dateFormatter &&
64
+ dateFormatter.createFormatterFunction &&
65
+ typeof dateFormatter.createFormatterFunction === 'function') {
66
+ // if custom date formatter exists we use it for datetime formatting applying optionally
67
+ // UTC datetime override for candles more than 1d period
68
+ const createFormatter = dateFormatter.createFormatterFunction;
69
+ result = (pattern) => createFormatter(pattern).bind(dateFormatter);
70
+ }
71
+ else {
72
+ result = dateTimeFormatterFactory(this.config, this.tzOffset);
73
+ }
74
+ return result;
75
+ }
76
+ /**
77
+ * Returns the DateTimeFormatterFactory instance used by this class.
78
+ *
79
+ * @returns {DateTimeFormatterFactory} The DateTimeFormatterFactory instance used by this class.
80
+ */
81
+ getFormatterFactory() {
82
+ return this.dateTimeFormatterFactory;
83
+ }
84
+ getDateTimeFormatter(format) {
85
+ if (this.formatterCache[format] === undefined) {
86
+ this.formatterCache[format] = this.dateTimeFormatterFactory(format);
87
+ }
88
+ return this.formatterCache[format];
89
+ }
90
+ /**
91
+ * Gets the timezone offset value in milliseconds
92
+ * @param {string} timezone name
93
+ * @returns {function(time:Number):Date}
94
+ */
95
+ tzOffset(timezone) {
96
+ // we must pass time here, because we can have daylight saving time, otherwise we will get wrong offset
97
+ const localOffset = (time) => -new Date(time).getTimezoneOffset() * timeMultiplier;
98
+ let offset;
99
+ if (!timezone) {
100
+ offset = localOffset;
101
+ }
102
+ else {
103
+ // we must pass time here, because we can have daylight saving time, otherwise we will get wrong offset
104
+ offset = (time) => memoizedTZOffset(timezone, time);
105
+ }
106
+ // In JS Date object is created with local tz offset,
107
+ // so we have to subtract localOffset from current time
108
+ return time => {
109
+ return new Date(+time + offset(time) - localOffset(time));
110
+ };
111
+ }
112
+ }
113
+ // 1 hour in milliseconds
114
+ const timeMultiplier = 60 * 1000;
@@ -3,4 +3,137 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{floorToDPR as s,roundToDPR as l}from"../utils/device/device-pixel-ratio.utils";import{VisualSeriesPoint as u}from"./data-series.model";export default class y extends u{constructor(t,o,h,i,n,r,e,d,a=!1,c=!1,Y=!1){super(t,i),this.startUnit=t-o/2,this.width=o,this.open=h,this.high=n,this.low=r,this.name=e,this.candle=d,this.hasBorder=a,this.isActive=c,this.isHollow=Y}bodyHeight(t){return s(Math.abs(t.toY(this.open)-t.toY(this.close)))}candleHeight(t){return s(Math.abs(t.toY(this.high)-t.toY(this.low)))}bodyAsVLine(t){if(this.width<2)return[this.centerUnit,this.yLineStart(t),this.width,this.candleHeight(t)]}bodyRect(t){return[this.startUnit,this.yBodyStart(t),this.width,this.bodyHeight(t)]}getCandle(){return this.candle}yBodyKeyPoints(t){const o=s(t.toY(this.high)),h=s(t.toY(this.low)),i=s(t.toY(this.open)),n=s(t.toY(this.close)),[r,e]=i>n?[n,i]:[i,n],[d,a]=o>h?[h,o]:[o,h];return[d,r,e,a]}yLineEnd(t){return s(Math.max(t.toY(this.high),t.toY(this.low)))}yLineStart(t){return s(Math.min(t.toY(this.high),t.toY(this.low)))}yBodyStart(t){return s(Math.min(t.toY(this.open),t.toY(this.close)))}yBodyEnd(t){return s(Math.max(t.toY(this.open),t.toY(this.close)))}xCenter(t){return this.x(t)}xStart(t){return l(t.toX(this.startUnit))}}
6
+ import { floorToDPR, roundToDPR } from '../utils/device/device-pixel-ratio.utils';
7
+ import { VisualSeriesPoint } from './data-series.model';
8
+ /**
9
+ * Candle's visual representation. Candle's coordinates are adjusted by .5 unit to prevent anti-aliasing effect for
10
+ * lines with 1px width
11
+ *
12
+ * @param x wick location on X-axis
13
+ * @param width candle's width
14
+ * @param op open price location on Y axis
15
+ * @param cl close price location on Y axis
16
+ * @param lineStart wick's top location on Y axis
17
+ * @param lineEnd wick's bottom location on Y axis
18
+ * @param name candle's direction: up | down | none
19
+ * @param candle original candle
20
+ * @param hasBorder flag denoting if border should be drawn
21
+ * @constructor
22
+ */
23
+ export default class VisualCandle extends VisualSeriesPoint {
24
+ constructor(x, width, open, close, high, low, name, candle, hasBorder = false, isActive = false, isHollow = false) {
25
+ super(x, close);
26
+ this.startUnit = x - width / 2;
27
+ this.width = width;
28
+ this.open = open;
29
+ this.high = high;
30
+ this.low = low;
31
+ this.name = name;
32
+ this.candle = candle;
33
+ this.hasBorder = hasBorder;
34
+ this.isActive = isActive;
35
+ this.isHollow = isHollow;
36
+ }
37
+ /**
38
+ * Calculates the height of the body of a viewable element.
39
+ * @param {Viewable} viewable - The viewable element.
40
+ * @returns {Pixel} - The height of the body in pixels.
41
+ */
42
+ bodyHeight(viewable) {
43
+ return floorToDPR(Math.abs(viewable.toY(this.open) - viewable.toY(this.close)));
44
+ }
45
+ /**
46
+ * Calculates the height of a candle in pixels based on the high and low values of the candle and the viewable area.
47
+ *
48
+ * @param {Viewable} viewable - The viewable area object.
49
+ * @returns {Pixel} - The height of the candle in pixels.
50
+ */
51
+ candleHeight(viewable) {
52
+ return floorToDPR(Math.abs(viewable.toY(this.high) - viewable.toY(this.low)));
53
+ }
54
+ /**
55
+ * Returns coordinates of vertical line used to draw candle's body in case of small candle width
56
+ * @returns {[x,y,x2,y2]}
57
+ */
58
+ bodyAsVLine(viewable) {
59
+ if (this.width < 2) {
60
+ return [this.centerUnit, this.yLineStart(viewable), this.width, this.candleHeight(viewable)];
61
+ }
62
+ }
63
+ /**
64
+ * Returns rectangle used to draw candles' body
65
+ * @returns {[x,y,width,height]}
66
+ */
67
+ bodyRect(viewable) {
68
+ // candle is drawn using wick as center
69
+ return [this.startUnit, this.yBodyStart(viewable), this.width, this.bodyHeight(viewable)];
70
+ }
71
+ /**
72
+ * Returns the current candle object.
73
+ *
74
+ * @returns {Candle} The current candle object.
75
+ */
76
+ getCandle() {
77
+ return this.candle;
78
+ }
79
+ /**
80
+ * Returns candle Y points in ascending order
81
+ */
82
+ yBodyKeyPoints(viewable) {
83
+ const highY = floorToDPR(viewable.toY(this.high));
84
+ const lowY = floorToDPR(viewable.toY(this.low));
85
+ const openY = floorToDPR(viewable.toY(this.open));
86
+ const closeY = floorToDPR(viewable.toY(this.close));
87
+ const [bodyStart, bodyEnd] = openY > closeY ? [closeY, openY] : [openY, closeY];
88
+ const [lineStart, lineEnd] = highY > lowY ? [lowY, highY] : [highY, lowY];
89
+ return [lineStart, bodyStart, bodyEnd, lineEnd];
90
+ }
91
+ /**
92
+ * Calculates the y-coordinate of the end of a line segment that is within the viewable area.
93
+ * @param {Viewable} viewable - The viewable area object.
94
+ * @returns {Pixel} - The y-coordinate of the end of the line segment in pixels.
95
+ */
96
+ yLineEnd(viewable) {
97
+ return floorToDPR(Math.max(viewable.toY(this.high), viewable.toY(this.low)));
98
+ }
99
+ /**
100
+ * Returns the pixel value of the starting point of the y-axis line on the given viewable area.
101
+ * @param {Viewable} viewable - The viewable area to calculate the pixel value on.
102
+ * @returns {Pixel} - The pixel value of the starting point of the y-axis line.
103
+ */
104
+ yLineStart(viewable) {
105
+ return floorToDPR(Math.min(viewable.toY(this.high), viewable.toY(this.low)));
106
+ }
107
+ /**
108
+ * Calculates the starting y-coordinate of the body of a viewable object.
109
+ * @param {Viewable} viewable - The viewable object for which the starting y-coordinate of the body is to be calculated.
110
+ * @returns {Pixel} - The starting y-coordinate of the body of the viewable object.
111
+ */
112
+ yBodyStart(viewable) {
113
+ return floorToDPR(Math.min(viewable.toY(this.open), viewable.toY(this.close)));
114
+ }
115
+ /**
116
+ * Calculates the maximum pixel value of the y-coordinate of the viewable object's end point and the open and close values of the current object.
117
+ * @param {Viewable} viewable - The viewable object whose end point is to be compared with the open and close values of the current object.
118
+ * @returns {Pixel} - The maximum pixel value of the y-coordinate of the viewable object's end point and the open and close values of the current object.
119
+ */
120
+ yBodyEnd(viewable) {
121
+ return floorToDPR(Math.max(viewable.toY(this.open), viewable.toY(this.close)));
122
+ }
123
+ /**
124
+ * Calculates the x-coordinate of the center of a viewable object in pixels.
125
+ * @param {Viewable} viewable - The viewable object whose center is to be calculated.
126
+ * @returns {Pixel} - The x-coordinate of the center of the viewable object in pixels.
127
+ */
128
+ xCenter(viewable) {
129
+ return this.x(viewable);
130
+ }
131
+ /**
132
+ * Returns the starting pixel position of a viewable object
133
+ * @param {Viewable} viewable - The viewable object to get the starting pixel position from
134
+ * @returns {Pixel} - The starting pixel position of the viewable object
135
+ */
136
+ xStart(viewable) {
137
+ return roundToDPR(viewable.toX(this.startUnit));
138
+ }
139
+ }
@@ -3,4 +3,138 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{moveInArrayMutable as c,reorderArray as a,slice2DArray as s,arrayIntersect as n,eqeqeq as l}from"../array.utils";describe("array functions",()=>{describe("Intersection of arrays",()=>{it("Intersection of [1, 2, 3, 1] and [1, 2, 4, 5, 6] should be [1, 2]",()=>{const r=n([1,2,3,1],[1,2,4,5,6]);expect(r).toEqual([1,2])}),it("Intersection of [1, 2, 3] and [4, 5, 6] should be an empty array",()=>{const r=n([1,2,3],[4,5,6]);expect(r).toEqual([])}),it("Intersection of [1, 2, 2, 3] and [1, 1, 2, 2, 4, 5] with duplicates should be [1, 2, 2]",()=>{const r=n([1,2,2,3],[1,1,2,2,4,5],l,!1);expect(r).toEqual([1,2,2])}),it("Intersection of [] and [1, 1, 2] should be []",()=>{const r=n([],[1,1,2]);expect(r).toEqual([])}),it("Intersection of [1, 1, 2] and [] should be []",()=>{const r=n([1,1,2],[]);expect(r).toEqual([])}),it("Intersection with custom comparison function",()=>{const o=n([{id:1},{id:2},{id:3}],[{id:2},{id:4},{id:6}],(i,u)=>i.id===u.id);expect(o).toEqual([{id:2}])}),it("Intersection of arrays of strings",()=>{const r=n(["apple","banana","orange","pear"],["banana","orange","grape","kiwi"]);expect(r).toEqual(["banana","orange"])})}),describe("slice 2D array",()=>{it("should correctly slice arrays with correct indexes",()=>{const t=[[1,2],[3,4]],e=s(t,1,2);expect(e.toString()).toBe([[2],[3]].toString());const r=s(t,0,1);expect(r.toString()).toBe([[1,2]].toString());const o=s(t,2,3);expect(o.toString()).toBe([[3,4]].toString());const i=s(t,0,3);expect(i.toString()).toBe([[1,2],[3,4]].toString())}),it("should corrercly slice arrays with exceeding indexes",()=>{const t=[[1,2],[3,4]],e=s(t,-2,0);expect(e.toString()).toBe([[1]].toString());const r=s(t,3,4);expect(r.toString()).toBe([[4]].toString());const o=s(t,-2,4);expect(o.toString()).toBe([[1,2],[3,4]].toString())})}),describe("reorder array",()=>{it("Reorders source array according to newOrder",()=>{const t=["1","2","3"],e=a(t,["3","1"]);expect(e.toString()).toBe(["3","2","1"].toString());const r=a(t,["3","1","2"]);expect(r.toString()).toBe(["3","1","2"].toString());const o=a(t,["3"]);expect(o.toString()).toBe(["1","2","3"].toString())}),it("should return the reordered array even if newOrder contains duplicates",()=>{const t=["1","2","3"],e=["2","1","2"];expect(a(t,e)).toEqual(["2","1","3"])}),it("should return the reordered array even if newOrder contains extra elements",()=>{const t=["1","2","3"],e=["6","2","1","5"];expect(a(t,e)).toEqual(["2","1","3"])})}),describe("moveInArrayMutable",()=>{it("should move an item from start to end",()=>{const e=c([1,2,3,4,5],1,3);expect(e).toEqual([1,3,4,2,5])}),it("should move an item from end to start",()=>{const e=c([1,2,3,4,5],4,1);expect(e).toEqual([1,5,2,3,4])}),it("should move an item to the same position",()=>{const e=c([1,2,3,4,5],2,2);expect(e).toEqual([1,2,3,4,5])}),it("should clamp from and to if start and end are out of bounds",()=>{const e=c([1,2,3,4,5],-1,6);expect(e).toEqual([2,3,4,5,1])}),it("should return the same array if start and end are the same",()=>{const e=c([1,2,3,4,5],2,2);expect(e).toEqual([1,2,3,4,5])}),it("should return the same array if we try to move first element outside left bound",()=>{const e=c([1,2,3,4,5],0,-1);expect(e).toEqual([1,2,3,4,5])})})});
6
+ import { moveInArrayMutable, reorderArray, slice2DArray, arrayIntersect, eqeqeq } from '../array.utils';
7
+ describe('array functions', () => {
8
+ describe('Intersection of arrays', () => {
9
+ it('Intersection of [1, 2, 3, 1] and [1, 2, 4, 5, 6] should be [1, 2]', () => {
10
+ const source = [1, 2, 3, 1];
11
+ const target = [1, 2, 4, 5, 6];
12
+ const result = arrayIntersect(source, target);
13
+ expect(result).toEqual([1, 2]);
14
+ });
15
+ it('Intersection of [1, 2, 3] and [4, 5, 6] should be an empty array', () => {
16
+ const source = [1, 2, 3];
17
+ const target = [4, 5, 6];
18
+ const result = arrayIntersect(source, target);
19
+ expect(result).toEqual([]);
20
+ });
21
+ it('Intersection of [1, 2, 2, 3] and [1, 1, 2, 2, 4, 5] with duplicates should be [1, 2, 2]', () => {
22
+ const source = [1, 2, 2, 3];
23
+ const target = [1, 1, 2, 2, 4, 5];
24
+ const result = arrayIntersect(source, target, eqeqeq, false);
25
+ expect(result).toEqual([1, 2, 2]);
26
+ });
27
+ it('Intersection of [] and [1, 1, 2] should be []', () => {
28
+ const source = [];
29
+ const target = [1, 1, 2];
30
+ const result = arrayIntersect(source, target);
31
+ expect(result).toEqual([]);
32
+ });
33
+ it('Intersection of [1, 1, 2] and [] should be []', () => {
34
+ const source = [1, 1, 2];
35
+ const target = [];
36
+ const result = arrayIntersect(source, target);
37
+ expect(result).toEqual([]);
38
+ });
39
+ it('Intersection with custom comparison function', () => {
40
+ const source = [{ id: 1 }, { id: 2 }, { id: 3 }];
41
+ const target = [{ id: 2 }, { id: 4 }, { id: 6 }];
42
+ const compareFn = (a, b) => a.id === b.id;
43
+ const result = arrayIntersect(source, target, compareFn);
44
+ expect(result).toEqual([{ id: 2 }]);
45
+ });
46
+ it('Intersection of arrays of strings', () => {
47
+ const source = ['apple', 'banana', 'orange', 'pear'];
48
+ const target = ['banana', 'orange', 'grape', 'kiwi'];
49
+ const result = arrayIntersect(source, target);
50
+ expect(result).toEqual(['banana', 'orange']);
51
+ });
52
+ });
53
+ describe('slice 2D array', () => {
54
+ it('should correctly slice arrays with correct indexes', () => {
55
+ const array = [
56
+ [1, 2],
57
+ [3, 4],
58
+ ];
59
+ const result = slice2DArray(array, 1, 2);
60
+ expect(result.toString()).toBe([[2], [3]].toString());
61
+ const result2 = slice2DArray(array, 0, 1);
62
+ expect(result2.toString()).toBe([[1, 2]].toString());
63
+ const result3 = slice2DArray(array, 2, 3);
64
+ expect(result3.toString()).toBe([[3, 4]].toString());
65
+ const result4 = slice2DArray(array, 0, 3);
66
+ expect(result4.toString()).toBe([
67
+ [1, 2],
68
+ [3, 4],
69
+ ].toString());
70
+ });
71
+ it('should corrercly slice arrays with exceeding indexes', () => {
72
+ const array = [
73
+ [1, 2],
74
+ [3, 4],
75
+ ];
76
+ const result = slice2DArray(array, -2, 0);
77
+ expect(result.toString()).toBe([[1]].toString());
78
+ const result2 = slice2DArray(array, 3, 4);
79
+ expect(result2.toString()).toBe([[4]].toString());
80
+ const result3 = slice2DArray(array, -2, 4);
81
+ expect(result3.toString()).toBe([
82
+ [1, 2],
83
+ [3, 4],
84
+ ].toString());
85
+ });
86
+ });
87
+ describe('reorder array', () => {
88
+ it('Reorders source array according to newOrder', () => {
89
+ const array = ['1', '2', '3'];
90
+ const result1 = reorderArray(array, ['3', '1']);
91
+ expect(result1.toString()).toBe(['3', '2', '1'].toString());
92
+ const result2 = reorderArray(array, ['3', '1', '2']);
93
+ expect(result2.toString()).toBe(['3', '1', '2'].toString());
94
+ const result3 = reorderArray(array, ['3']);
95
+ expect(result3.toString()).toBe(['1', '2', '3'].toString());
96
+ });
97
+ it('should return the reordered array even if newOrder contains duplicates', () => {
98
+ const source = ['1', '2', '3'];
99
+ const newOrder = ['2', '1', '2'];
100
+ expect(reorderArray(source, newOrder)).toEqual(['2', '1', '3']);
101
+ });
102
+ it('should return the reordered array even if newOrder contains extra elements', () => {
103
+ const source = ['1', '2', '3'];
104
+ const newOrder = ['6', '2', '1', '5'];
105
+ expect(reorderArray(source, newOrder)).toEqual(['2', '1', '3']);
106
+ });
107
+ });
108
+ describe('moveInArrayMutable', () => {
109
+ it('should move an item from start to end', () => {
110
+ const arr = [1, 2, 3, 4, 5];
111
+ const result = moveInArrayMutable(arr, 1, 3);
112
+ expect(result).toEqual([1, 3, 4, 2, 5]);
113
+ });
114
+ it('should move an item from end to start', () => {
115
+ const arr = [1, 2, 3, 4, 5];
116
+ const result = moveInArrayMutable(arr, 4, 1);
117
+ expect(result).toEqual([1, 5, 2, 3, 4]);
118
+ });
119
+ it('should move an item to the same position', () => {
120
+ const arr = [1, 2, 3, 4, 5];
121
+ const result = moveInArrayMutable(arr, 2, 2);
122
+ expect(result).toEqual([1, 2, 3, 4, 5]);
123
+ });
124
+ it('should clamp from and to if start and end are out of bounds', () => {
125
+ const arr = [1, 2, 3, 4, 5];
126
+ const result = moveInArrayMutable(arr, -1, 6);
127
+ expect(result).toEqual([2, 3, 4, 5, 1]);
128
+ });
129
+ it('should return the same array if start and end are the same', () => {
130
+ const arr = [1, 2, 3, 4, 5];
131
+ const result = moveInArrayMutable(arr, 2, 2);
132
+ expect(result).toEqual([1, 2, 3, 4, 5]);
133
+ });
134
+ it('should return the same array if we try to move first element outside left bound', () => {
135
+ const arr = [1, 2, 3, 4, 5];
136
+ const result = moveInArrayMutable(arr, 0, -1);
137
+ expect(result).toEqual([1, 2, 3, 4, 5]);
138
+ });
139
+ });
140
+ });
@@ -3,4 +3,17 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{clamp as e}from"../math.utils";describe("math.utils",()=>{describe("clamp",()=>{it("should return the value if it is within the range",()=>{expect(e(5,0,10)).toEqual(5)}),it("should return the min value if the value is less than the min",()=>{expect(e(-5,0,10)).toEqual(0)}),it("should return the max value if the value is more than the max",()=>{expect(e(15,0,10)).toEqual(10)})})});
6
+ import { clamp } from '../math.utils';
7
+ describe('math.utils', () => {
8
+ describe('clamp', () => {
9
+ it('should return the value if it is within the range', () => {
10
+ expect(clamp(5, 0, 10)).toEqual(5);
11
+ });
12
+ it('should return the min value if the value is less than the min', () => {
13
+ expect(clamp(-5, 0, 10)).toEqual(0);
14
+ });
15
+ it('should return the max value if the value is more than the max', () => {
16
+ expect(clamp(15, 0, 10)).toEqual(10);
17
+ });
18
+ });
19
+ });
@@ -3,4 +3,14 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{deepEqual as e}from"../object.utils";describe("object",()=>{describe("deepEqual",()=>{it("should deeply compare objects",()=>{expect(e({},{})).toBeTruthy(),expect(e({a:{foo:1}},{a:{foo:1}})).toBeTruthy(),expect(e({a:{foo:1}},{a:{foo:2}})).toBeFalsy(),expect(e({a:{foo:1}},{a:{bar:1}})).toBeFalsy()})})});
6
+ import { deepEqual } from '../object.utils';
7
+ describe('object', () => {
8
+ describe('deepEqual', () => {
9
+ it('should deeply compare objects', () => {
10
+ expect(deepEqual({}, {})).toBeTruthy();
11
+ expect(deepEqual({ a: { foo: 1 } }, { a: { foo: 1 } })).toBeTruthy(); //eslint-disable-line
12
+ expect(deepEqual({ a: { foo: 1 } }, { a: { foo: 2 } })).toBeFalsy(); //eslint-disable-line
13
+ expect(deepEqual({ a: { foo: 1 } }, { a: { bar: 1 } })).toBeFalsy(); //eslint-disable-line
14
+ });
15
+ });
16
+ });
@@ -3,4 +3,32 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{PriceIncrementsUtils as t}from"../price-increments.utils";describe("PriceIncrementsUtils",()=>{describe("autoDetectIncrementOfValueRange",()=>{it("should return increment=0.01 for range=0",()=>{const e=t.autoDetectIncrementOfValueRange(0);expect(e).toBeCloseTo(.01,10)}),it("should return increment=10 for range=6300.02931",()=>{const e=t.autoDetectIncrementOfValueRange(6300.02931);expect(e).toBeCloseTo(10,10)}),it("should return increment=1 for range=124.14",()=>{const e=t.autoDetectIncrementOfValueRange(124.14);expect(e).toBeCloseTo(1,10)}),it("should return increment=0.01 for range=5",()=>{const e=t.autoDetectIncrementOfValueRange(5);expect(e).toBeCloseTo(.01,10)}),it("should return increment=0.001 for range=0.5",()=>{const e=t.autoDetectIncrementOfValueRange(.5);expect(e).toBeCloseTo(.001,10)}),it("should return increment=0.00001 for range=0.0018",()=>{const e=t.autoDetectIncrementOfValueRange(.0018);expect(e).toBeCloseTo(1e-5,10)})})});
6
+ import { PriceIncrementsUtils } from '../price-increments.utils';
7
+ describe('PriceIncrementsUtils', () => {
8
+ describe('autoDetectIncrementOfValueRange', () => {
9
+ it('should return increment=0.01 for range=0', () => {
10
+ const result = PriceIncrementsUtils.autoDetectIncrementOfValueRange(0);
11
+ expect(result).toBeCloseTo(0.01, 10);
12
+ });
13
+ it('should return increment=10 for range=6300.02931', () => {
14
+ const result = PriceIncrementsUtils.autoDetectIncrementOfValueRange(6300.02931);
15
+ expect(result).toBeCloseTo(10, 10);
16
+ });
17
+ it('should return increment=1 for range=124.14', () => {
18
+ const result = PriceIncrementsUtils.autoDetectIncrementOfValueRange(124.14);
19
+ expect(result).toBeCloseTo(1, 10);
20
+ });
21
+ it('should return increment=0.01 for range=5', () => {
22
+ const result = PriceIncrementsUtils.autoDetectIncrementOfValueRange(5);
23
+ expect(result).toBeCloseTo(0.01, 10);
24
+ });
25
+ it('should return increment=0.001 for range=0.5', () => {
26
+ const result = PriceIncrementsUtils.autoDetectIncrementOfValueRange(0.5);
27
+ expect(result).toBeCloseTo(0.001, 10);
28
+ });
29
+ it('should return increment=0.00001 for range=0.0018', () => {
30
+ const result = PriceIncrementsUtils.autoDetectIncrementOfValueRange(0.0018);
31
+ expect(result).toBeCloseTo(0.00001, 10);
32
+ });
33
+ });
34
+ });
@@ -50,7 +50,7 @@ type ItemFinder<T> = (item: T) => boolean;
50
50
  */
51
51
  export declare function replaceInArray<T>(arr: Array<T>, itemFinder: ItemFinder<T>, replace: T): T[];
52
52
  export declare const uniqueArray: <T extends string | number>(arr: T[]) => T[];
53
- export declare const groupBy: <T, KT extends T[keyof T] extends string | number ? T[keyof T] : never>(array: T[], key: keyof T) => Record<KT, T[]>;
53
+ export declare const groupBy: <T, K extends keyof T, KV extends T[K] extends string | number ? T[K] : never>(array: T[], key: K) => Record<KV, T[]>;
54
54
  /**
55
55
  * Inserts *something* between every two elements in the source array
56
56
  * Example: interleave(['first', 'second', 'third'], 'bar') => ['first', 'bar', 'second', 'bar', 'third']