solid-recharts 1.0.0 → 2.0.0-beta.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 (488) hide show
  1. package/package.json +4 -6
  2. package/src/animation/AnimatedItems.tsx +4 -2
  3. package/src/animation/CSSTransitionAnimate.tsx +39 -41
  4. package/src/animation/JavascriptAnimate.tsx +41 -45
  5. package/src/cartesian/Area.tsx +4 -4
  6. package/src/cartesian/AreaRevealShape.tsx +1 -1
  7. package/src/cartesian/Bar.tsx +21 -33
  8. package/src/cartesian/BarStack.tsx +5 -5
  9. package/src/cartesian/Brush.tsx +15 -19
  10. package/src/cartesian/CartesianAxis.tsx +4 -4
  11. package/src/cartesian/CartesianGrid.tsx +5 -5
  12. package/src/cartesian/ErrorBar.tsx +7 -9
  13. package/src/cartesian/Funnel.tsx +3 -3
  14. package/src/cartesian/GraphicalItemClipPath.tsx +1 -1
  15. package/src/cartesian/Line.tsx +16 -18
  16. package/src/cartesian/LineDrawShape.tsx +13 -14
  17. package/src/cartesian/ReferenceArea.tsx +4 -4
  18. package/src/cartesian/ReferenceDot.tsx +4 -4
  19. package/src/cartesian/ReferenceLine.tsx +4 -4
  20. package/src/cartesian/RenderedTicksReporter.tsx +17 -19
  21. package/src/cartesian/Scatter.tsx +3 -3
  22. package/src/cartesian/XAxis.tsx +1 -1
  23. package/src/cartesian/YAxis.tsx +33 -35
  24. package/src/cartesian/ZAxis.tsx +2 -3
  25. package/src/chart/AreaChart.tsx +1 -1
  26. package/src/chart/BarChart.tsx +1 -1
  27. package/src/chart/CartesianChart.tsx +3 -4
  28. package/src/chart/CategoricalChart.tsx +5 -5
  29. package/src/chart/ComposedChart.tsx +1 -1
  30. package/src/chart/FunnelChart.tsx +1 -1
  31. package/src/chart/LineChart.tsx +1 -1
  32. package/src/chart/PieChart.tsx +3 -4
  33. package/src/chart/PolarChart.tsx +3 -4
  34. package/src/chart/RadarChart.tsx +3 -4
  35. package/src/chart/RadialBarChart.tsx +3 -7
  36. package/src/chart/RechartsWrapper.tsx +24 -14
  37. package/src/chart/Sankey.tsx +6 -9
  38. package/src/chart/ScatterChart.tsx +1 -1
  39. package/src/chart/SunburstChart.tsx +4 -5
  40. package/src/chart/Treemap.tsx +4 -5
  41. package/src/component/ActivePoints.tsx +6 -6
  42. package/src/component/Cell.tsx +5 -23
  43. package/src/component/Cursor.tsx +3 -3
  44. package/src/component/DefaultLegendContent.tsx +6 -8
  45. package/src/component/DefaultTooltipContent.tsx +10 -14
  46. package/src/component/Dots.tsx +5 -5
  47. package/src/component/Label.tsx +10 -13
  48. package/src/component/LabelList.tsx +7 -12
  49. package/src/component/Legend.tsx +21 -26
  50. package/src/component/ResponsiveContainer.tsx +49 -52
  51. package/src/component/Text.tsx +5 -5
  52. package/src/component/Tooltip.tsx +18 -21
  53. package/src/component/TooltipBoundingBox.tsx +16 -18
  54. package/src/component/responsiveContainerUtils.ts +1 -1
  55. package/src/container/ClipPathProvider.tsx +3 -3
  56. package/src/container/Layer.tsx +5 -5
  57. package/src/container/RootSurface.tsx +1 -1
  58. package/src/container/Surface.tsx +6 -5
  59. package/src/context/ErrorBarContext.tsx +2 -2
  60. package/src/context/PanoramaContext.tsx +2 -2
  61. package/src/context/RegisterGraphicalItemId.tsx +2 -4
  62. package/src/context/chartDataContext.tsx +23 -26
  63. package/src/context/chartLayoutContext.tsx +12 -16
  64. package/src/polar/Pie.tsx +12 -13
  65. package/src/polar/PolarAngleAxis.tsx +3 -3
  66. package/src/polar/PolarGrid.tsx +5 -5
  67. package/src/polar/PolarRadiusAxis.tsx +3 -3
  68. package/src/polar/Radar.tsx +3 -3
  69. package/src/polar/RadialBar.tsx +3 -3
  70. package/src/shape/Cross.tsx +5 -5
  71. package/src/shape/Curve.tsx +7 -6
  72. package/src/shape/Dot.tsx +4 -4
  73. package/src/shape/Polygon.tsx +5 -5
  74. package/src/shape/Rectangle.tsx +20 -22
  75. package/src/shape/Sector.tsx +5 -5
  76. package/src/shape/Symbols.tsx +5 -5
  77. package/src/shape/Trapezoid.tsx +27 -29
  78. package/src/state/RechartsStoreProvider.tsx +3 -5
  79. package/src/state/ReportChartProps.tsx +6 -8
  80. package/src/state/ReportEventSettings.tsx +6 -8
  81. package/src/state/ReportMainChartProps.tsx +9 -11
  82. package/src/state/ReportPolarOptions.tsx +13 -15
  83. package/src/state/SetLegendPayload.ts +1 -1
  84. package/src/state/SetTooltipEntrySettings.tsx +1 -1
  85. package/src/state/brushSlice.ts +8 -10
  86. package/src/state/cartesianAxisSlice.ts +38 -46
  87. package/src/state/chartDataSlice.ts +23 -29
  88. package/src/state/errorBarSlice.ts +16 -22
  89. package/src/state/eventSettingsSlice.ts +9 -11
  90. package/src/state/graphicalItemsSlice.ts +13 -17
  91. package/src/state/layoutSlice.ts +19 -27
  92. package/src/state/legendSlice.ts +18 -24
  93. package/src/state/optionsSlice.ts +6 -8
  94. package/src/state/polarAxisSlice.ts +13 -21
  95. package/src/state/polarOptionsSlice.ts +14 -16
  96. package/src/state/referenceElementsSlice.ts +19 -25
  97. package/src/state/registerInStore.ts +13 -15
  98. package/src/state/renderedTicksSlice.ts +7 -11
  99. package/src/state/rootPropsSlice.ts +14 -16
  100. package/src/state/tooltipSlice.ts +95 -115
  101. package/src/state/unregisterOnCleanup.ts +20 -5
  102. package/src/state/zIndexSlice.ts +42 -50
  103. package/src/synchronisation/useChartSynchronisation.tsx +217 -213
  104. package/src/util/ActiveShapeUtils.tsx +2 -2
  105. package/src/util/BarUtils.tsx +3 -5
  106. package/src/util/FunnelUtils.tsx +1 -1
  107. package/src/util/RadialBarUtils.tsx +3 -4
  108. package/src/util/createCartesianCharts.tsx +1 -1
  109. package/src/util/createPolarCharts.tsx +1 -1
  110. package/src/util/svgPropertiesAndEvents.ts +1 -1
  111. package/src/util/tooltip/translate.ts +2 -2
  112. package/src/util/types.ts +2 -2
  113. package/src/zIndex/ZIndexLayer.tsx +68 -39
  114. package/src/zIndex/ZIndexPortal.tsx +25 -29
  115. package/test/_data.ts +408 -0
  116. package/test/animation/AnimationController.typed.spec.ts +53 -0
  117. package/test/animation/AnimationControllerImpl.spec.ts +271 -0
  118. package/test/animation/CSSTransitionAnimate.timing.spec.tsx +473 -0
  119. package/test/animation/JavascriptAnimate.spec.tsx +62 -0
  120. package/test/animation/RechartsAnimation.spec.ts +636 -0
  121. package/test/animation/easing.spec.ts +218 -0
  122. package/test/animation/legacyAnimationLengthChange.spec.tsx +803 -0
  123. package/test/animation/matchBy.spec.ts +467 -0
  124. package/test/animation/mockAnimationController.ts +40 -0
  125. package/test/animation/mockControllerAnimationManager.ts +143 -0
  126. package/test/animation/mockTimeoutController.ts +114 -0
  127. package/test/animation/timeoutController.spec.ts +138 -0
  128. package/test/animation/useAnimationStartSnapshot.spec.ts +147 -0
  129. package/test/animation/util.spec.ts +28 -0
  130. package/test/cartesian/Area.animation.spec.tsx +363 -0
  131. package/test/cartesian/Area.range.spec.tsx +54 -0
  132. package/test/cartesian/Area.spec.tsx +1202 -0
  133. package/test/cartesian/Area.stacked.render.spec.tsx +69 -0
  134. package/test/cartesian/Area.typed.spec.tsx +209 -0
  135. package/test/cartesian/Axis.integration.spec.tsx +158 -0
  136. package/test/cartesian/Bar/Bar.csstransition.spec.tsx +299 -0
  137. package/test/cartesian/Bar/Bar.spec.tsx +2314 -0
  138. package/test/cartesian/Bar/Bar.typed.spec.tsx +192 -0
  139. package/test/cartesian/Bar.animation.spec.tsx +426 -0
  140. package/test/cartesian/Bar.stackDomain.spec.tsx +66 -0
  141. package/test/cartesian/Bar.stacked.render.spec.tsx +53 -0
  142. package/test/cartesian/Bar.truncateByDomain.spec.tsx +237 -0
  143. package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +336 -0
  144. package/test/cartesian/BarStack.spec.tsx +91 -0
  145. package/test/cartesian/Brush.keyboard.spec.tsx +88 -0
  146. package/test/cartesian/Brush.panorama.spec.tsx +41 -0
  147. package/test/cartesian/Brush.props.spec.tsx +63 -0
  148. package/test/cartesian/Brush.render.spec.tsx +117 -0
  149. package/test/cartesian/Brush.spec.tsx +522 -0
  150. package/test/cartesian/Brush.stacked.spec.tsx +221 -0
  151. package/test/cartesian/CartesianAxis.render.spec.tsx +50 -0
  152. package/test/cartesian/CartesianAxis.spec.tsx +396 -0
  153. package/test/cartesian/CartesianGrid.render.spec.tsx +39 -0
  154. package/test/cartesian/CartesianGrid.spec.tsx +2103 -0
  155. package/test/cartesian/ErrorBar.render.spec.tsx +69 -0
  156. package/test/cartesian/ErrorBar.spec.tsx +2414 -0
  157. package/test/cartesian/Funnel.animation.spec.tsx +241 -0
  158. package/test/cartesian/Funnel.spec.tsx +226 -0
  159. package/test/cartesian/Funnel.typed.spec.tsx +221 -0
  160. package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +627 -0
  161. package/test/cartesian/GraphicalItemClipPath.spec.tsx +427 -0
  162. package/test/cartesian/Line.animation.spec.tsx +643 -0
  163. package/test/cartesian/Line.sparseAnimationPath.spec.tsx +98 -0
  164. package/test/cartesian/Line.spec.tsx +471 -0
  165. package/test/cartesian/Line.typed.spec.tsx +152 -0
  166. package/test/cartesian/ReferenceArea.render.spec.tsx +63 -0
  167. package/test/cartesian/ReferenceArea.spec.tsx +663 -0
  168. package/test/cartesian/ReferenceArea.typed.spec.tsx +74 -0
  169. package/test/cartesian/ReferenceDot.render.spec.tsx +55 -0
  170. package/test/cartesian/ReferenceDot.spec.tsx +462 -0
  171. package/test/cartesian/ReferenceDot.typed.spec.tsx +76 -0
  172. package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +184 -0
  173. package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +744 -0
  174. package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +74 -0
  175. package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +399 -0
  176. package/test/cartesian/ReferenceLine.render.spec.tsx +134 -0
  177. package/test/cartesian/Scatter.animation.spec.tsx +381 -0
  178. package/test/cartesian/Scatter.render.spec.tsx +61 -0
  179. package/test/cartesian/Scatter.spec.tsx +406 -0
  180. package/test/cartesian/Scatter.typed.spec.tsx +153 -0
  181. package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +336 -0
  182. package/test/cartesian/XAxis/XAxis.brush.spec.tsx +266 -0
  183. package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +872 -0
  184. package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +86 -0
  185. package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +127 -0
  186. package/test/cartesian/XAxis/XAxis.hide.spec.tsx +106 -0
  187. package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +336 -0
  188. package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +1466 -0
  189. package/test/cartesian/XAxis/XAxis.padding.spec.tsx +758 -0
  190. package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +65 -0
  191. package/test/cartesian/XAxis/XAxis.state.spec.tsx +355 -0
  192. package/test/cartesian/XAxis/XAxis.tick.spec.tsx +493 -0
  193. package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +233 -0
  194. package/test/cartesian/XAxis/XAxis.type.spec.tsx +107 -0
  195. package/test/cartesian/XAxis/XAxis.typed.spec.tsx +102 -0
  196. package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +265 -0
  197. package/test/cartesian/XAxis.tickFormatter.spec.tsx +54 -0
  198. package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +230 -0
  199. package/test/cartesian/YAxis/YAxis.7362.spec.tsx +104 -0
  200. package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +88 -0
  201. package/test/cartesian/YAxis/YAxis.label.spec.tsx +219 -0
  202. package/test/cartesian/YAxis/YAxis.spec.tsx +1595 -0
  203. package/test/cartesian/YAxis/YAxis.tick.spec.tsx +428 -0
  204. package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +54 -0
  205. package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +263 -0
  206. package/test/cartesian/YAxis/YAxis.type.spec.tsx +107 -0
  207. package/test/cartesian/YAxis/YAxis.typed.spec.tsx +102 -0
  208. package/test/cartesian/ZAxis.spec.tsx +300 -0
  209. package/test/cartesian/ZAxis.typed.spec.tsx +33 -0
  210. package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +5 -0
  211. package/test/cartesian/axisLineAndStroke.spec.tsx +72 -0
  212. package/test/cartesian/getCartesianPosition.spec.ts +907 -0
  213. package/test/cartesian/getEquidistantTicks.spec.ts +88 -0
  214. package/test/cartesian/getTicks.spec.ts +378 -0
  215. package/test/cartesian/miscFeatureGaps.spec.tsx +89 -0
  216. package/test/cartesian/useAnimatedLineLength.spec.ts +168 -0
  217. package/test/chart/AccessibilityLayer.spec.tsx +569 -0
  218. package/test/chart/AccessibilityScans.spec.tsx +286 -0
  219. package/test/chart/AreaChart.spec.tsx +409 -0
  220. package/test/chart/AreaChart.stacked.spec.tsx +1407 -0
  221. package/test/chart/AreaChart.typed.spec.tsx +39 -0
  222. package/test/chart/BarChart.spec.tsx +3719 -0
  223. package/test/chart/BarChart.typed.spec.tsx +60 -0
  224. package/test/chart/CategoricalChart.spec.tsx +255 -0
  225. package/test/chart/ComposedChart.spec.tsx +199 -0
  226. package/test/chart/ComposedChart.typed.spec.tsx +39 -0
  227. package/test/chart/FunnelChart.spec.tsx +215 -0
  228. package/test/chart/FunnelChart.typed.spec.tsx +39 -0
  229. package/test/chart/LineChart.multiseries.spec.tsx +50 -0
  230. package/test/chart/LineChart.smoke.spec.tsx +50 -0
  231. package/test/chart/LineChart.spec.tsx +930 -0
  232. package/test/chart/LineChart.typed.spec.tsx +39 -0
  233. package/test/chart/NicheChartTooltip.spec.tsx +81 -0
  234. package/test/chart/PieChart.spec.tsx +793 -0
  235. package/test/chart/PieChart.typed.spec.tsx +39 -0
  236. package/test/chart/RadarChart.spec.tsx +530 -0
  237. package/test/chart/RadarChart.typed.spec.tsx +39 -0
  238. package/test/chart/RadialBarChart.5966.spec.tsx +48 -0
  239. package/test/chart/RadialBarChart.spec.tsx +679 -0
  240. package/test/chart/RadialBarChart.typed.spec.tsx +39 -0
  241. package/test/chart/RechartsWrapper.spec.tsx +83 -0
  242. package/test/chart/Sankey.content.spec.tsx +46 -0
  243. package/test/chart/Sankey.spec.tsx +952 -0
  244. package/test/chart/Sankey.typed.spec.tsx +29 -0
  245. package/test/chart/ScatterChart.spec.tsx +2613 -0
  246. package/test/chart/ScatterChart.typed.spec.tsx +39 -0
  247. package/test/chart/SunburstChart.spec.tsx +146 -0
  248. package/test/chart/Treemap.animation.spec.tsx +52 -0
  249. package/test/chart/Treemap.spec.tsx +1003 -0
  250. package/test/chart/Treemap.typed.spec.tsx +26 -0
  251. package/test/chart/chartEvents.spec.tsx +127 -0
  252. package/test/chart/responsive.spec.tsx +620 -0
  253. package/test/component/Cell.render.spec.tsx +155 -0
  254. package/test/component/Cell.spec.tsx +12 -0
  255. package/test/component/Cursor.spec.tsx +186 -0
  256. package/test/component/DefaultTooltipContent.spec.tsx +102 -0
  257. package/test/component/Label.render.spec.tsx +63 -0
  258. package/test/component/Label.spec.tsx +686 -0
  259. package/test/component/Label.typed.spec.tsx +46 -0
  260. package/test/component/LabelList.spec.tsx +188 -0
  261. package/test/component/Legend.itemSorter.spec.tsx +704 -0
  262. package/test/component/Legend.render.spec.tsx +92 -0
  263. package/test/component/Legend.spec.tsx +2213 -0
  264. package/test/component/Legend.typed.spec.tsx +22 -0
  265. package/test/component/ResponsiveContainer.spec.tsx +523 -0
  266. package/test/component/ResponsiveContainerDataTest.spec.tsx +51 -0
  267. package/test/component/Text.spec.tsx +415 -0
  268. package/test/component/Text.typed.spec.tsx +46 -0
  269. package/test/component/Tooltip/ActiveDot.spec.tsx +370 -0
  270. package/test/component/Tooltip/Tooltip.animation.spec.tsx +209 -0
  271. package/test/component/Tooltip/Tooltip.content.spec.tsx +128 -0
  272. package/test/component/Tooltip/Tooltip.formatter.spec.tsx +152 -0
  273. package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +79 -0
  274. package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +165 -0
  275. package/test/component/Tooltip/Tooltip.offset.spec.tsx +113 -0
  276. package/test/component/Tooltip/Tooltip.state.spec.tsx +74 -0
  277. package/test/component/Tooltip/Tooltip.sync.spec.tsx +639 -0
  278. package/test/component/Tooltip/defaultIndex.spec.tsx +227 -0
  279. package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +138 -0
  280. package/test/component/Tooltip/itemSorter.spec.tsx +2815 -0
  281. package/test/component/Tooltip/tooltipEventType.spec.tsx +344 -0
  282. package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +41 -0
  283. package/test/component/Tooltip/tooltipTestHelpers.tsx +162 -0
  284. package/test/component/Tooltip.defaultIndex.spec.tsx +48 -0
  285. package/test/component/Tooltip.hover.spec.tsx +61 -0
  286. package/test/component/Tooltip.item.spec.tsx +54 -0
  287. package/test/component/Tooltip.keyboard.spec.tsx +51 -0
  288. package/test/component/Tooltip.payload.spec.tsx +1716 -0
  289. package/test/component/Tooltip.touch.spec.tsx +39 -0
  290. package/test/component/Tooltip.visibility.spec.tsx +1889 -0
  291. package/test/component/TooltipBoundingBox.spec.tsx +89 -0
  292. package/test/component/responsiveContainerUtils.spec.ts +205 -0
  293. package/test/container/ClipPath.spec.tsx +602 -0
  294. package/test/container/chartDimensions.spec.tsx +368 -0
  295. package/test/context/chartLayoutContext.spec.tsx +378 -0
  296. package/test/helper/ExpectAxisDomain.tsx +27 -0
  297. package/test/helper/assertNotNull.ts +6 -0
  298. package/test/helper/assertZIndexLayerOrder.ts +19 -0
  299. package/test/helper/createSelectorTestCase.tsx +176 -0
  300. package/test/helper/expectAnimatedPieAngles.ts +100 -0
  301. package/test/helper/expectAnimatedPiePaths.ts +78 -0
  302. package/test/helper/expectAreaCurve.ts +15 -0
  303. package/test/helper/expectAxisTicks.ts +48 -0
  304. package/test/helper/expectBars.ts +54 -0
  305. package/test/helper/expectFunctionReturning.ts +58 -0
  306. package/test/helper/expectLabel.ts +32 -0
  307. package/test/helper/expectLastCalledWith.ts +48 -0
  308. package/test/helper/expectLine.ts +20 -0
  309. package/test/helper/expectPieSectors.ts +80 -0
  310. package/test/helper/expectScale.ts +37 -0
  311. package/test/helper/expectScatterPoints.ts +52 -0
  312. package/test/helper/expectStackGroups.ts +144 -0
  313. package/test/helper/mockAxes.ts +22 -0
  314. package/test/helper/mockGetBoundingClientRect.ts +66 -0
  315. package/test/helper/mockHTMLElementProperty.ts +19 -0
  316. package/test/helper/mockTouchingElement.ts +27 -0
  317. package/test/helper/offsetHelpers.ts +19 -0
  318. package/test/helper/parameterizedTestCases.tsx +99 -0
  319. package/test/helper/produceState.ts +32 -0
  320. package/test/helper/selectorTestHelpers.tsx +63 -0
  321. package/test/helper/trim.spec.ts +35 -0
  322. package/test/helper/trim.ts +11 -0
  323. package/test/hooks/useActiveTooltipDataPoints.spec.tsx +358 -0
  324. package/test/hooks/useAxisDomain.spec.tsx +361 -0
  325. package/test/hooks/useAxisScale.spec.tsx +283 -0
  326. package/test/hooks/useAxisTicks.spec.tsx +130 -0
  327. package/test/hooks/useOffset.spec.tsx +248 -0
  328. package/test/hooks/useTooltipStateHooks.spec.tsx +109 -0
  329. package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +135 -0
  330. package/test/polar/Pie/Pie.spec.tsx +784 -0
  331. package/test/polar/Pie/Pie.typed.spec.tsx +78 -0
  332. package/test/polar/Pie.animation.spec.tsx +529 -0
  333. package/test/polar/PieWithLegend.animation.spec.tsx +142 -0
  334. package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +76 -0
  335. package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +2079 -0
  336. package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +102 -0
  337. package/test/polar/PolarAngleAxis.render.spec.tsx +79 -0
  338. package/test/polar/PolarGrid.render.spec.tsx +75 -0
  339. package/test/polar/PolarGrid.spec.tsx +918 -0
  340. package/test/polar/PolarLegendPerRow.render.spec.tsx +85 -0
  341. package/test/polar/PolarRadiusAxis.events.spec.tsx +65 -0
  342. package/test/polar/PolarRadiusAxis.render.spec.tsx +52 -0
  343. package/test/polar/PolarRadiusAxis.spec.tsx +991 -0
  344. package/test/polar/PolarRadiusAxis.typed.spec.tsx +84 -0
  345. package/test/polar/PolarTooltipLegend.render.spec.tsx +80 -0
  346. package/test/polar/Radar.animation.spec.tsx +570 -0
  347. package/test/polar/Radar.render.spec.tsx +71 -0
  348. package/test/polar/Radar.spec.tsx +265 -0
  349. package/test/polar/Radar.typed.spec.tsx +119 -0
  350. package/test/polar/RadialBar/RadialBar.spec.tsx +1521 -0
  351. package/test/polar/RadialBar/RadialBar.typed.spec.tsx +132 -0
  352. package/test/polar/RadialBar.animation.spec.tsx +375 -0
  353. package/test/polar/RadialBar.render.spec.tsx +66 -0
  354. package/test/polar/RadialBar.stacked.spec.tsx +57 -0
  355. package/test/setup.ts +84 -0
  356. package/test/shape/ActiveShape.spec.tsx +181 -0
  357. package/test/shape/Cross.spec.tsx +60 -0
  358. package/test/shape/Cross.typed.spec.tsx +26 -0
  359. package/test/shape/Curve.spec.tsx +368 -0
  360. package/test/shape/Curve.typed.spec.tsx +69 -0
  361. package/test/shape/Dot.spec.tsx +73 -0
  362. package/test/shape/Dot.typed.spec.tsx +30 -0
  363. package/test/shape/Polygon.spec.tsx +357 -0
  364. package/test/shape/Polygon.typed.spec.tsx +28 -0
  365. package/test/shape/Rectangle.animation.spec.tsx +451 -0
  366. package/test/shape/Rectangle.spec.tsx +68 -0
  367. package/test/shape/Rectangle.typed.spec.tsx +24 -0
  368. package/test/shape/Sector.spec.tsx +76 -0
  369. package/test/shape/Sector.typed.spec.tsx +24 -0
  370. package/test/shape/Symbols.spec.tsx +43 -0
  371. package/test/shape/Symbols.typed.spec.tsx +24 -0
  372. package/test/shape/Trapezoid.spec.tsx +50 -0
  373. package/test/shape/Trapezoid.typed.spec.tsx +24 -0
  374. package/test/shape/__snapshots__/Cross.spec.tsx.snap +62 -0
  375. package/test/shape/__snapshots__/Curve.spec.tsx.snap +460 -0
  376. package/test/shape/__snapshots__/Polygon.spec.tsx.snap +58 -0
  377. package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +117 -0
  378. package/test/shape/__snapshots__/Sector.spec.tsx.snap +71 -0
  379. package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +64 -0
  380. package/test/state/chartDataSlice.spec.ts +53 -0
  381. package/test/state/createCollectionActions.spec.ts +87 -0
  382. package/test/state/createSelector.spec.ts +158 -0
  383. package/test/state/externalEventsMiddleware.spec.ts +178 -0
  384. package/test/state/graphicalItemsSlice.spec.ts +92 -0
  385. package/test/state/hooks.spec.tsx +68 -0
  386. package/test/state/legendSlice.spec.ts +44 -0
  387. package/test/state/mouseEventsMiddleware.spec.ts +75 -0
  388. package/test/state/optionsSlice.spec.ts +19 -0
  389. package/test/state/referenceElementsSlice.spec.ts +84 -0
  390. package/test/state/registerInStore.spec.tsx +101 -0
  391. package/test/state/selectors/areaSelectors.spec.tsx +77 -0
  392. package/test/state/selectors/axisSelectors.spec.tsx +1418 -0
  393. package/test/state/selectors/barStackSelectors.spec.tsx +752 -0
  394. package/test/state/selectors/brushSelectors.spec.tsx +30 -0
  395. package/test/state/selectors/cartesianAxisSlice.spec.ts +96 -0
  396. package/test/state/selectors/combineNiceTicks.spec.ts +207 -0
  397. package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +61 -0
  398. package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +39 -0
  399. package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +56 -0
  400. package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +123 -0
  401. package/test/state/selectors/combiners/combineRealScaleType.spec.ts +80 -0
  402. package/test/state/selectors/containerSelectors.spec.tsx +168 -0
  403. package/test/state/selectors/dataSelectors.spec.tsx +136 -0
  404. package/test/state/selectors/legendSelectors.spec.tsx +113 -0
  405. package/test/state/selectors/lineSelectors.spec.tsx +60 -0
  406. package/test/state/selectors/pieSelectors.spec.tsx +72 -0
  407. package/test/state/selectors/radarSelectors.spec.tsx +496 -0
  408. package/test/state/selectors/rootPropsSelectors.spec.tsx +169 -0
  409. package/test/state/selectors/scatterSelectors.spec.tsx +47 -0
  410. package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +234 -0
  411. package/test/state/selectors/selectAllAxes.spec.tsx +18 -0
  412. package/test/state/selectors/selectAxisDomain.spec.tsx +21 -0
  413. package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +19 -0
  414. package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +22 -0
  415. package/test/state/selectors/selectAxisScale.spec.tsx +91 -0
  416. package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +503 -0
  417. package/test/state/selectors/selectBaseAxis.spec.tsx +56 -0
  418. package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +57 -0
  419. package/test/state/selectors/selectChartOffset.spec.tsx +26 -0
  420. package/test/state/selectors/selectDisplayedData.spec.tsx +282 -0
  421. package/test/state/selectors/selectIsTooltipActive.spec.tsx +231 -0
  422. package/test/state/selectors/selectNumericalDomain.spec.tsx +21 -0
  423. package/test/state/selectors/selectRealScaleType.spec.tsx +19 -0
  424. package/test/state/selectors/selectStackGroups.spec.tsx +322 -0
  425. package/test/state/selectors/selectXAxisPosition.spec.tsx +22 -0
  426. package/test/state/selectors/selectYAxisPosition.spec.tsx +22 -0
  427. package/test/state/selectors/selectorMemoization.spec.tsx +136 -0
  428. package/test/state/selectors/selectors.spec.tsx +1613 -0
  429. package/test/state/throttling.spec.ts +200 -0
  430. package/test/state/zIndexSlice.spec.ts +85 -0
  431. package/test/synchronisation/useChartSynchronisation.spec.tsx +225 -0
  432. package/test/util/BarUtils.spec.ts +39 -0
  433. package/test/util/CartesianUtils/CartesianUtils.spec.ts +261 -0
  434. package/test/util/CartesianUtils/rectWithPoints.spec.ts +48 -0
  435. package/test/util/ChartUtils/ChartUtils.spec.ts +491 -0
  436. package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +136 -0
  437. package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +133 -0
  438. package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +97 -0
  439. package/test/util/ChartUtils/getStackedData.spec.ts +416 -0
  440. package/test/util/ChartUtils/truncateByDomain.spec.ts +70 -0
  441. package/test/util/DataUtils.spec.ts +385 -0
  442. package/test/util/DomUtils.spec.tsx +117 -0
  443. package/test/util/FunnelUtils.spec.tsx +70 -0
  444. package/test/util/Global.spec.ts +11 -0
  445. package/test/util/LRUCache.spec.ts +81 -0
  446. package/test/util/LogUtils.spec.ts +45 -0
  447. package/test/util/PolarUtils.spec.ts +66 -0
  448. package/test/util/ReduceCssCalcPrototype.spec.ts +141 -0
  449. package/test/util/ShallowEqual.spec.ts +102 -0
  450. package/test/util/TickUtils.spec.ts +29 -0
  451. package/test/util/createChartHelpers.spec.tsx +210 -0
  452. package/test/util/cursor/getCursorPoints.spec.ts +136 -0
  453. package/test/util/cursor/getCursorRectangle.spec.ts +50 -0
  454. package/test/util/cursor/getRadialCursorPoints.spec.ts +36 -0
  455. package/test/util/errorValue.spec.ts +69 -0
  456. package/test/util/getEveryNth.spec.ts +39 -0
  457. package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +51 -0
  458. package/test/util/getRelativeCoordinate.spec.ts +250 -0
  459. package/test/util/getSliced.spec.ts +45 -0
  460. package/test/util/isDomainSpecifiedByUser.spec.ts +207 -0
  461. package/test/util/isWellBehavedNumber.spec.ts +54 -0
  462. package/test/util/payload/getUniqPayload.spec.ts +56 -0
  463. package/test/util/propsAreEqual.spec.ts +75 -0
  464. package/test/util/round.spec.ts +112 -0
  465. package/test/util/scale/arithmetic.spec.ts +61 -0
  466. package/test/util/scale/createCategoricalInverse.spec.ts +84 -0
  467. package/test/util/scale/getNiceTickValues.spec.ts +421 -0
  468. package/test/util/scale/getTickValuesFixedDomain.spec.ts +155 -0
  469. package/test/util/svgPropertiesAndEvents.spec.tsx +206 -0
  470. package/test/util/svgPropertiesNoEvents.spec.tsx +228 -0
  471. package/test/util/tooltip/translate.spec.ts +396 -0
  472. package/test/util/useAnimationId.spec.tsx +59 -0
  473. package/test/util/useElementOffset.spec.tsx +173 -0
  474. package/test/util/usePrefersReducedMotion.spec.ts +54 -0
  475. package/test/util/useUniqueId.spec.ts +99 -0
  476. package/test/utils/diagnostics-allowlist.ts +18 -0
  477. package/test/utils/diagnostics.ts +58 -0
  478. package/test/zIndex/AllZIndexPortals.spec.tsx +83 -0
  479. package/test/zIndex/DefaultZIndexes.spec.ts +80 -0
  480. package/test/zIndex/DynamicZIndex.spec.tsx +102 -0
  481. package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +125 -0
  482. package/test/zIndex/componentZIndex.spec.tsx +255 -0
  483. package/test/zIndex/getZIndexFromUnknown.spec.ts +51 -0
  484. package/test/zIndex/multiChartZIndexIsolation.spec.tsx +90 -0
  485. package/test/zIndex/zIndexSelectors.spec.ts +172 -0
  486. package/test-results/.last-run.json +4 -0
  487. package/tsconfig.json +11 -0
  488. package/src/util/DirectPortal.tsx +0 -107
@@ -0,0 +1,133 @@
1
+ // Port of recharts 3.8.1 test/util/ChartUtils/appendOffsetOfLegend.spec.tsx (commit 7a23854).
2
+ // Harness deltas: dropped the `vi.mock('.../ReactUtils')` (Solid ChartUtils does not
3
+ // import ReactUtils); `OffsetVertical & OffsetHorizontal` → the local `OffsetSides` shape
4
+ // (ChartUtils' offset type; not exported).
5
+ import { describe, it, expect } from "vitest";
6
+ import { appendOffsetOfLegend } from "../../../src/util/ChartUtils";
7
+ import { Size } from "../../../src/util/types";
8
+ import { LegendSettings } from "../../../src/state/legendSlice";
9
+
10
+ type OffsetSides = { top: number; right: number; bottom: number; left: number };
11
+
12
+ const emptyOffset: OffsetSides = {
13
+ top: 1,
14
+ right: 2,
15
+ bottom: 9,
16
+ left: 5,
17
+ };
18
+
19
+ describe("appendOffsetOfLegend", () => {
20
+ it("should add extra space for a vertical legend", () => {
21
+ const settings: LegendSettings = {
22
+ verticalAlign: "bottom",
23
+ layout: "vertical",
24
+ align: "left",
25
+ itemSorter: "value",
26
+ };
27
+ const size: Size = {
28
+ width: 100,
29
+ height: 200,
30
+ };
31
+ const result = appendOffsetOfLegend(emptyOffset, settings, size);
32
+ expect(result).toEqual({
33
+ ...emptyOffset,
34
+ left: 105,
35
+ });
36
+ });
37
+
38
+ it("should add extra space for a horizontal legend, middle aligned", () => {
39
+ const settings: LegendSettings = {
40
+ layout: "horizontal",
41
+ verticalAlign: "middle",
42
+ align: "left",
43
+ itemSorter: "value",
44
+ };
45
+ const size: Size = {
46
+ width: 100,
47
+ height: 200,
48
+ };
49
+ const result = appendOffsetOfLegend(emptyOffset, settings, size);
50
+ expect(result).toEqual({
51
+ ...emptyOffset,
52
+ left: 105,
53
+ });
54
+ });
55
+
56
+ it("should not modify the original offset that was passed as an argument", () => {
57
+ const clone: OffsetSides = { ...emptyOffset };
58
+ const settings: LegendSettings = {
59
+ layout: "horizontal",
60
+ verticalAlign: "middle",
61
+ align: "left",
62
+ itemSorter: "value",
63
+ };
64
+ const size: Size = {
65
+ width: 100,
66
+ height: 200,
67
+ };
68
+ appendOffsetOfLegend(emptyOffset, settings, size);
69
+
70
+ expect(emptyOffset).toEqual(clone);
71
+ });
72
+
73
+ it("should add extra space for a horizontal legend", () => {
74
+ const settings: LegendSettings = {
75
+ align: "left",
76
+ layout: "horizontal",
77
+ verticalAlign: "bottom",
78
+ itemSorter: "value",
79
+ };
80
+ const size: Size = {
81
+ width: 100,
82
+ height: 200,
83
+ };
84
+ const result = appendOffsetOfLegend(emptyOffset, settings, size);
85
+ expect(result).toEqual({ ...emptyOffset, bottom: 209 });
86
+ });
87
+
88
+ it("should add extra space for a vertical legend, center aligned", () => {
89
+ const settings: LegendSettings = {
90
+ align: "center",
91
+ layout: "vertical",
92
+ verticalAlign: "bottom",
93
+ itemSorter: "value",
94
+ };
95
+ const size: Size = {
96
+ width: 100,
97
+ height: 200,
98
+ };
99
+ const result = appendOffsetOfLegend(emptyOffset, settings, size);
100
+ expect(result).toEqual({ ...emptyOffset, bottom: 209 });
101
+ });
102
+
103
+ it("should do nothing for vertical legend with align: center", () => {
104
+ const settings: LegendSettings = {
105
+ align: "center",
106
+ layout: "vertical",
107
+ verticalAlign: "middle",
108
+ itemSorter: "value",
109
+ };
110
+ const size: Size = {
111
+ width: 100,
112
+ height: 200,
113
+ };
114
+ const result = appendOffsetOfLegend(emptyOffset, settings, size);
115
+ expect(result).toEqual(emptyOffset);
116
+ });
117
+
118
+ it("should add space for horizontal legend with verticalAlign: middle and align:left", () => {
119
+ const settings: LegendSettings = {
120
+ align: "left",
121
+ layout: "horizontal",
122
+ verticalAlign: "middle",
123
+ itemSorter: "value",
124
+ };
125
+ const size: Size = {
126
+ width: 100,
127
+ height: 200,
128
+ };
129
+
130
+ const result = appendOffsetOfLegend(emptyOffset, settings, size);
131
+ expect(result).toEqual({ ...emptyOffset, left: 105 });
132
+ });
133
+ });
@@ -0,0 +1,97 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { getCateCoordinateOfLine } from "../../../src/util/ChartUtils";
3
+ import { RechartsScale } from "../../../src/util/scale/RechartsScale";
4
+
5
+ // @ts-expect-error incomplete mock data
6
+ const mockScale: RechartsScale = { map: (v: number) => v * 2 };
7
+
8
+ describe("getCateCoordinateOfLine", () => {
9
+ describe("numerical axis", () => {
10
+ it("should return null when passed empty params", () => {
11
+ // @ts-expect-error incomplete mock data
12
+ const actual = getCateCoordinateOfLine({
13
+ axis: { scale: mockScale },
14
+ });
15
+ expect(actual).toBeNull();
16
+ });
17
+
18
+ it("should return scaled value", () => {
19
+ // @ts-expect-error incomplete mock data
20
+ const actual = getCateCoordinateOfLine({
21
+ axis: { scale: mockScale },
22
+ entry: { x: 1 },
23
+ dataKey: "x",
24
+ });
25
+ expect(actual).toBe(2);
26
+ });
27
+
28
+ it("should use axis.dataKey if the root dataKey is undefined", () => {
29
+ // @ts-expect-error incomplete mock data
30
+ const actual = getCateCoordinateOfLine({
31
+ axis: { scale: mockScale, dataKey: "x" },
32
+ entry: { x: 1 },
33
+ });
34
+ expect(actual).toBe(2);
35
+ });
36
+
37
+ it("should use root dataKey if two dataKeys are defined", () => {
38
+ // @ts-expect-error incomplete mock data
39
+ const actual = getCateCoordinateOfLine({
40
+ axis: { scale: mockScale, dataKey: "x" },
41
+ entry: { x: 1, y: 3 },
42
+ dataKey: "y",
43
+ });
44
+ expect(actual).toBe(6);
45
+ });
46
+ });
47
+
48
+ describe("category axis", () => {
49
+ it("should return null if there are no ticks", () => {
50
+ // @ts-expect-error incomplete mock data
51
+ const actual = getCateCoordinateOfLine({
52
+ axis: { type: "category", scale: mockScale },
53
+ ticks: [],
54
+ });
55
+ expect(actual).toBeNull();
56
+ });
57
+
58
+ it("should return first tick coordinate with half of bandSize added, if axis.dataKey is undefined", () => {
59
+ // @ts-expect-error incomplete mock data
60
+ const actual = getCateCoordinateOfLine({
61
+ axis: { type: "category", scale: mockScale },
62
+ bandSize: 2,
63
+ index: 0,
64
+ ticks: [{ coordinate: 8, index: 0, value: "foo" }],
65
+ });
66
+ expect(actual).toBe(9);
67
+ });
68
+
69
+ it("should follow axis.dataKey -> ticks.value -> tick.coordinate and return that", () => {
70
+ // @ts-expect-error incomplete mock data
71
+ const actual = getCateCoordinateOfLine({
72
+ axis: { type: "category", dataKey: "foo", scale: mockScale },
73
+ bandSize: 4,
74
+ entry: { foo: "bar" },
75
+ ticks: [
76
+ { coordinate: 8, index: 0, value: "foo" },
77
+ { coordinate: 16, index: 1, value: "bar" },
78
+ ],
79
+ });
80
+ expect(actual).toBe(18);
81
+ });
82
+
83
+ it("should not match NaN tick values and should fall back to the indexed tick", () => {
84
+ const actual = getCateCoordinateOfLine({
85
+ axis: { type: "category", dataKey: "foo", scale: mockScale },
86
+ bandSize: 4,
87
+ entry: { foo: NaN },
88
+ index: 0,
89
+ ticks: [
90
+ { coordinate: 8, index: 0, value: "fallback" },
91
+ { coordinate: 16, index: 1, value: NaN },
92
+ ],
93
+ });
94
+ expect(actual).toBe(10);
95
+ });
96
+ });
97
+ });
@@ -0,0 +1,416 @@
1
+ import type { Series, SeriesPoint } from "d3-shape";
2
+ import { getStackedData, offsetSign } from "../../../src/util/ChartUtils";
3
+ import type { StackOffsetType } from "../../../src/util/types";
4
+
5
+ // Ported from recharts 3.8.1 test/util/ChartUtils/getStackedData.spec.ts.
6
+ // Deviation from the reference: array index accesses carry `!` and the
7
+ // function-form dataKeys are typed `(o: any)` to satisfy this port's stricter
8
+ // tsconfig (`noUncheckedIndexedAccess`) and `DataKey<unknown>` stack-key type.
9
+
10
+ export function createSeries(
11
+ key: string,
12
+ index: number,
13
+ data: Array<SeriesPoint<Record<string, unknown>>> = [],
14
+ ): Series<Record<string, unknown>, string> {
15
+ return Object.assign(data, { key, index });
16
+ }
17
+
18
+ export function createSeriesPoint(
19
+ first: number,
20
+ second: number,
21
+ data: Record<string, unknown>,
22
+ ): SeriesPoint<Record<string, unknown>> {
23
+ return Object.assign([], { data, 0: first, 1: second });
24
+ }
25
+
26
+ const mockData = [
27
+ {
28
+ name: "Page A",
29
+ uv: 590,
30
+ pv: 800,
31
+ amt: 1400,
32
+ },
33
+ {
34
+ name: "Page B",
35
+ uv: 868,
36
+ pv: 967,
37
+ amt: 1506,
38
+ },
39
+ ];
40
+
41
+ const dataWithNegativeNumbers = [
42
+ {
43
+ name: "Page A",
44
+ uv: 4000,
45
+ pv: 2400,
46
+ amt: 2400,
47
+ },
48
+ {
49
+ name: "Page B",
50
+ uv: -3000,
51
+ pv: 1398,
52
+ amt: 2210,
53
+ },
54
+ {
55
+ name: "Page C",
56
+ uv: -2000,
57
+ pv: -9800,
58
+ amt: 2290,
59
+ },
60
+ {
61
+ name: "Page D",
62
+ uv: 2780,
63
+ pv: 3908,
64
+ amt: 2000,
65
+ },
66
+ {
67
+ name: "Page E",
68
+ uv: -1890,
69
+ pv: 4800,
70
+ amt: 2181,
71
+ },
72
+ {
73
+ name: "Page F",
74
+ uv: 2390,
75
+ pv: -3800,
76
+ amt: 2500,
77
+ },
78
+ {
79
+ name: "Page G",
80
+ uv: 3490,
81
+ pv: 4300,
82
+ amt: 2100,
83
+ },
84
+ ];
85
+
86
+ /**
87
+ * If you see one of these tests failing with a message "serializes to the same string",
88
+ * that is because the d3-shape library assigns arbitrary property keys to an array.
89
+ *
90
+ * Jest doesn't like that. When it compares the two arrays it can see that it has extra property,
91
+ * and if that extra property is different then it fails.
92
+ * But when printing the array, it only prints the usual array elements, and ignores the extra properties.
93
+ * Therefore, the "serializes to the same string" problem.
94
+ *
95
+ * So when you see that error, try to compare the other properties, like `Series.key` and `SeriesPoint.data`.
96
+ * Or print them with console.log, that will show the difference.
97
+ */
98
+ describe("getStackedData", () => {
99
+ it("should return empty array if there is no data", () => {
100
+ expect(getStackedData([], [], "none")).toEqual([]);
101
+ });
102
+
103
+ it("should return empty array if there is some data but no data keys", () => {
104
+ expect(getStackedData([{ x: 1 }], [], "none")).toEqual([]);
105
+ });
106
+
107
+ it("should return one empty array for each dataKey even if it is not part of the data", () => {
108
+ const result = getStackedData([], ["x", "y", "z"], "none");
109
+ const expected = [createSeries("x", 0), createSeries("y", 1), createSeries("z", 2)];
110
+ expect(result).toEqual(expected);
111
+ });
112
+
113
+ it("should return one empty array for each data key even if it is not part of the data", () => {
114
+ const result = getStackedData([], ["x", "y", "z"], "none");
115
+ const expected = [createSeries("x", 0), createSeries("y", 1), createSeries("z", 2)];
116
+ expect(result).toEqual(expected);
117
+ });
118
+
119
+ const allOffsets: StackOffsetType[] = [
120
+ "expand",
121
+ "none",
122
+ "positive",
123
+ "sign",
124
+ "silhouette",
125
+ "wiggle",
126
+ ];
127
+ describe.each(allOffsets)("with offset %s", (offset) => {
128
+ it("should stack numerical data", () => {
129
+ const dataKeys = ["uv", "pv"];
130
+ const result = getStackedData(mockData, dataKeys, offset);
131
+ expect(result).toHaveLength(dataKeys.length);
132
+ result.forEach((series) => {
133
+ expect(series).toHaveLength(mockData.length);
134
+ series.forEach((point) => {
135
+ expect(point[0]).toEqual(expect.any(Number));
136
+ expect(point[1]).toEqual(expect.any(Number));
137
+ expect(point[0]).not.toBeNaN();
138
+ expect(point[1]).not.toBeNaN();
139
+ });
140
+ });
141
+ });
142
+
143
+ it("should stack data when dataKey is a function", () => {
144
+ const dataKeys = [(o: any) => o.uv + 100, (o: any) => o.pv - 100];
145
+ const result = getStackedData(mockData, dataKeys, offset);
146
+ expect(result).toHaveLength(dataKeys.length);
147
+ result.forEach((series) => {
148
+ expect(series).toHaveLength(mockData.length);
149
+ series.forEach((point) => {
150
+ expect(point[0]).toEqual(expect.any(Number));
151
+ expect(point[1]).toEqual(expect.any(Number));
152
+ expect(point[0]).not.toBeNaN();
153
+ expect(point[1]).not.toBeNaN();
154
+ });
155
+ });
156
+ });
157
+ });
158
+
159
+ it("should stack numerical data with offset: none", () => {
160
+ const result = getStackedData(mockData, ["uv", "pv"], "none");
161
+ const firstSeries = createSeries("uv", 0, [
162
+ createSeriesPoint(0, 590, mockData[0]!), // first bar is always from 0 to its value, 'uv' data point
163
+ createSeriesPoint(0, 868, mockData[1]!), // first bar is always from 0 to its value, 'uv' data point from second object
164
+ ]);
165
+ const secondSeries = createSeries("pv", 1, [
166
+ createSeriesPoint(590, 1390, mockData[0]!), // second bar adds the 'pv' value on top of the 'uv' value 590 + 800 = 1390
167
+ createSeriesPoint(868, 1835, mockData[1]!), // second bar adds the 'pv' value on top of the 'uv' value 868 + 967 = 1835
168
+ ]);
169
+ const expected = [firstSeries, secondSeries];
170
+ expect(result).toEqual(expected);
171
+ });
172
+
173
+ it("should stack numerical data with offset: sign", () => {
174
+ const result = getStackedData(dataWithNegativeNumbers, ["uv", "pv"], "sign");
175
+ const uvSeries = createSeries("uv", 0, [
176
+ createSeriesPoint(0, 4000, dataWithNegativeNumbers[0]!),
177
+ createSeriesPoint(0, -3000, dataWithNegativeNumbers[1]!),
178
+ createSeriesPoint(0, -2000, dataWithNegativeNumbers[2]!),
179
+ createSeriesPoint(0, 2780, dataWithNegativeNumbers[3]!),
180
+ createSeriesPoint(0, -1890, dataWithNegativeNumbers[4]!),
181
+ createSeriesPoint(0, 2390, dataWithNegativeNumbers[5]!),
182
+ createSeriesPoint(0, 3490, dataWithNegativeNumbers[6]!),
183
+ ]);
184
+ const pvSeries = createSeries("pv", 1, [
185
+ createSeriesPoint(4000, 6400, dataWithNegativeNumbers[0]!),
186
+ createSeriesPoint(0, 1398, dataWithNegativeNumbers[1]!),
187
+ createSeriesPoint(-2000, -11800, dataWithNegativeNumbers[2]!),
188
+ createSeriesPoint(2780, 6688, dataWithNegativeNumbers[3]!),
189
+ createSeriesPoint(0, 4800, dataWithNegativeNumbers[4]!),
190
+ createSeriesPoint(0, -3800, dataWithNegativeNumbers[5]!),
191
+ createSeriesPoint(3490, 7790, dataWithNegativeNumbers[6]!),
192
+ ]);
193
+ const expected = [uvSeries, pvSeries];
194
+ expect(result).toEqual(expected);
195
+ });
196
+
197
+ it("with offset: positive should ignore all negative data points", () => {
198
+ const dataKeys = ["uv", "pv"];
199
+ const result = getStackedData(dataWithNegativeNumbers, dataKeys, "positive");
200
+ const uvSeries = createSeries("uv", 0, [
201
+ createSeriesPoint(0, 4000, dataWithNegativeNumbers[0]!),
202
+ createSeriesPoint(0, 0, dataWithNegativeNumbers[1]!),
203
+ createSeriesPoint(0, 0, dataWithNegativeNumbers[2]!),
204
+ createSeriesPoint(0, 2780, dataWithNegativeNumbers[3]!),
205
+ createSeriesPoint(0, 0, dataWithNegativeNumbers[4]!),
206
+ createSeriesPoint(0, 2390, dataWithNegativeNumbers[5]!),
207
+ createSeriesPoint(0, 3490, dataWithNegativeNumbers[6]!),
208
+ ]);
209
+ const pvSeries = createSeries("pv", 1, [
210
+ createSeriesPoint(4000, 6400, dataWithNegativeNumbers[0]!),
211
+ createSeriesPoint(0, 1398, dataWithNegativeNumbers[1]!),
212
+ createSeriesPoint(0, 0, dataWithNegativeNumbers[2]!),
213
+ createSeriesPoint(2780, 6688, dataWithNegativeNumbers[3]!),
214
+ createSeriesPoint(0, 4800, dataWithNegativeNumbers[4]!),
215
+ createSeriesPoint(0, 0, dataWithNegativeNumbers[5]!),
216
+ createSeriesPoint(3490, 7790, dataWithNegativeNumbers[6]!),
217
+ ]);
218
+ const expected = [uvSeries, pvSeries];
219
+ expect(result).toEqual(expected);
220
+ });
221
+
222
+ it("should stack data when dataKey is a function with offset: none", () => {
223
+ const result = getStackedData(
224
+ mockData,
225
+ [(o: any) => o.uv + 100, (o: any) => o.pv - 100],
226
+ "none",
227
+ );
228
+ const firstSeries = createSeries("uv", 0, [
229
+ createSeriesPoint(0, 690, mockData[0]!),
230
+ createSeriesPoint(0, 968, mockData[1]!),
231
+ ]);
232
+ const secondSeries = createSeries("pv", 1, [
233
+ createSeriesPoint(690, 1390, mockData[0]!),
234
+ createSeriesPoint(968, 1835, mockData[1]!),
235
+ ]);
236
+ const expected = [firstSeries, secondSeries];
237
+ /*
238
+ * Direct comparison with .toEqual doesn't work because the `key` property is a function
239
+ * and jest always rejects when comparing functions.
240
+ */
241
+ expect(result).toHaveLength(expected.length);
242
+ expect(result[0]).toHaveLength(firstSeries.length);
243
+ expect(result[1]).toHaveLength(secondSeries.length);
244
+ result[0]!.forEach((point, index) => {
245
+ expect(point).toEqual(firstSeries[index]);
246
+ });
247
+ result[1]!.forEach((point, index) => {
248
+ expect(point).toEqual(secondSeries[index]);
249
+ });
250
+ });
251
+
252
+ test("offset: positive should turn data that are not numbers to zero", () => {
253
+ const mockCategoryData = [
254
+ {
255
+ name: "x",
256
+ },
257
+ {
258
+ name: "y",
259
+ },
260
+ {
261
+ name: "z",
262
+ },
263
+ ];
264
+ const result = getStackedData(mockCategoryData, ["x"], "positive");
265
+ const expected = [
266
+ createSeries("x", 0, [
267
+ createSeriesPoint(0, 0, mockCategoryData[0]!),
268
+ createSeriesPoint(0, 0, mockCategoryData[1]!),
269
+ createSeriesPoint(0, 0, mockCategoryData[2]!),
270
+ ]),
271
+ ];
272
+ expect(result).toEqual(expected);
273
+ });
274
+
275
+ test("offset: sign should turn data that are not numbers to zero", () => {
276
+ const mockCategoryData = [
277
+ {
278
+ name: "x",
279
+ },
280
+ {
281
+ name: "",
282
+ },
283
+ {
284
+ name: NaN,
285
+ },
286
+ {
287
+ name: function anon() {
288
+ return 0;
289
+ },
290
+ },
291
+ ];
292
+ const result = getStackedData(mockCategoryData, ["x"], "sign");
293
+ const expected = [
294
+ createSeries("x", 0, [
295
+ createSeriesPoint(0, 0, mockCategoryData[0]!),
296
+ createSeriesPoint(0, 0, mockCategoryData[1]!),
297
+ createSeriesPoint(0, 0, mockCategoryData[2]!),
298
+ createSeriesPoint(0, 0, mockCategoryData[3]!),
299
+ ]),
300
+ ];
301
+ expect(result).toEqual(expected);
302
+ });
303
+
304
+ test("offsetSign should mutate data in place", () => {
305
+ const data = [
306
+ createSeries("", 0, [
307
+ createSeriesPoint(0, 1, {}),
308
+ createSeriesPoint(0, 2, {}),
309
+ createSeriesPoint(0, -5, {}),
310
+ ]),
311
+ createSeries("", 1, [
312
+ createSeriesPoint(0, -1, {}),
313
+ createSeriesPoint(0, 2, {}),
314
+ createSeriesPoint(0, -5, {}),
315
+ ]),
316
+ ];
317
+ const expected = [
318
+ createSeries("", 0, [
319
+ createSeriesPoint(0, 1, {}),
320
+ createSeriesPoint(0, 2, {}),
321
+ createSeriesPoint(0, -5, {}),
322
+ ]),
323
+ createSeries("", 1, [
324
+ createSeriesPoint(0, -1, {}),
325
+ createSeriesPoint(2, 4, {}),
326
+ createSeriesPoint(-5, -10, {}),
327
+ ]),
328
+ ];
329
+ offsetSign(data, []);
330
+ expect(data).toEqual(expected);
331
+ });
332
+
333
+ test("stacking numbers encoded as strings produces numbers", () => {
334
+ const data = [
335
+ { name: "A", uv: "1", pv: "2" },
336
+ { name: "B", uv: "3", pv: "4" },
337
+ ];
338
+ const result = getStackedData(data, ["uv", "pv"], "none");
339
+ const expected = [
340
+ createSeries("uv", 0, [createSeriesPoint(0, 1, data[0]!), createSeriesPoint(0, 3, data[1]!)]),
341
+ createSeries("pv", 1, [createSeriesPoint(1, 3, data[0]!), createSeriesPoint(3, 7, data[1]!)]),
342
+ ];
343
+ expect(result).toEqual(expected);
344
+ });
345
+
346
+ test("stacking strings that are not numbers produces NaN - this is a bug if you ask me, we should reject non-numerical data", () => {
347
+ const data = [
348
+ { name: "A", uv: "a", pv: "b" },
349
+ { name: "B", uv: "c", pv: "d" },
350
+ ];
351
+ const result = getStackedData(data, ["uv", "pv"], "none");
352
+ const expected = [
353
+ createSeries("uv", 0, [
354
+ createSeriesPoint(0, NaN, data[0]!),
355
+ createSeriesPoint(0, NaN, data[1]!),
356
+ ]),
357
+ createSeries("pv", 1, [
358
+ createSeriesPoint(0, NaN, data[0]!),
359
+ createSeriesPoint(0, NaN, data[1]!),
360
+ ]),
361
+ ];
362
+ expect(result).toEqual(expected);
363
+ });
364
+
365
+ it("should stack ranged data", () => {
366
+ const displayedData = [
367
+ {
368
+ key1: [100, 200],
369
+ key2: [150, 250],
370
+ key3: [200, 300],
371
+ },
372
+ {
373
+ key1: [120, 180],
374
+ key2: [130, 230],
375
+ key3: [170, 270],
376
+ },
377
+ {
378
+ key1: [90, 160],
379
+ key2: [110, 210],
380
+ key3: [140, 240],
381
+ },
382
+ {
383
+ key1: [80, 140],
384
+ key2: [100, 200],
385
+ key3: [130, 220],
386
+ },
387
+ ];
388
+ const result = getStackedData(displayedData, ["key1", "key2", "key3"], "none");
389
+ const firstSeries = createSeries("key1", 0, [
390
+ createSeriesPoint(100, 200, displayedData[0]!), // with ranged data, first point is the range start, second point is the range end
391
+ createSeriesPoint(120, 180, displayedData[1]!), // and so on for each data point in the `key1` series
392
+ createSeriesPoint(90, 160, displayedData[2]!),
393
+ createSeriesPoint(80, 140, displayedData[3]!),
394
+ ]);
395
+ const secondSeries = createSeries("key2", 1, [
396
+ /*
397
+ * Second series starts where the data defined it: key2: [150, 250]
398
+ * This means from 150 to 250! it will overlap the first bar - but this is a choice of the user.
399
+ */
400
+ createSeriesPoint(150, 250, displayedData[0]!),
401
+ // likewise for all other data points
402
+ createSeriesPoint(130, 230, displayedData[1]!),
403
+ createSeriesPoint(110, 210, displayedData[2]!),
404
+ createSeriesPoint(100, 200, displayedData[3]!),
405
+ ]);
406
+ const thirdSeries = createSeries("key3", 2, [
407
+ // the for the third series - it just follows the ranged data as is, does not attempt to stack on top of previous series
408
+ createSeriesPoint(200, 300, displayedData[0]!),
409
+ createSeriesPoint(170, 270, displayedData[1]!),
410
+ createSeriesPoint(140, 240, displayedData[2]!),
411
+ createSeriesPoint(130, 220, displayedData[3]!),
412
+ ]);
413
+ const expected = [firstSeries, secondSeries, thirdSeries];
414
+ expect(result).toEqual(expected);
415
+ });
416
+ });