@visactor/vseed 0.5.5 → 0.5.6

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 (215) hide show
  1. package/dist/cjs/index.cjs +2 -2
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/esm/builder/register/all.js +3 -1
  4. package/dist/esm/builder/register/all.js.map +1 -1
  5. package/dist/esm/builder/register/chartType/hierarchySankey.d.ts +4 -0
  6. package/dist/esm/builder/register/chartType/hierarchySankey.js +9 -0
  7. package/dist/esm/builder/register/chartType/hierarchySankey.js.map +1 -0
  8. package/dist/esm/builder/register/chartType/index.d.ts +2 -0
  9. package/dist/esm/builder/register/chartType/index.js +2 -0
  10. package/dist/esm/builder/register/chartType/sankey.d.ts +1 -0
  11. package/dist/esm/builder/register/chartType/sankey.js +9 -0
  12. package/dist/esm/builder/register/chartType/sankey.js.map +1 -0
  13. package/dist/esm/dataReshape/constant.d.ts +2 -0
  14. package/dist/esm/dataReshape/constant.js +3 -1
  15. package/dist/esm/dataReshape/constant.js.map +1 -1
  16. package/dist/esm/dataReshape/unfoldDimensions.js +8 -2
  17. package/dist/esm/dataReshape/unfoldDimensions.js.map +1 -1
  18. package/dist/esm/index.d.ts +1 -1
  19. package/dist/esm/index.js +1 -1
  20. package/dist/esm/pipeline/advanced/chart/pipeline/hierarchySankey.d.ts +2 -0
  21. package/dist/esm/pipeline/advanced/chart/pipeline/hierarchySankey.js +33 -0
  22. package/dist/esm/pipeline/advanced/chart/pipeline/hierarchySankey.js.map +1 -0
  23. package/dist/esm/pipeline/advanced/chart/pipeline/index.d.ts +2 -0
  24. package/dist/esm/pipeline/advanced/chart/pipeline/index.js +2 -0
  25. package/dist/esm/pipeline/advanced/chart/pipeline/sankey.d.ts +2 -0
  26. package/dist/esm/pipeline/advanced/chart/pipeline/sankey.js +33 -0
  27. package/dist/esm/pipeline/advanced/chart/pipeline/sankey.js.map +1 -0
  28. package/dist/esm/pipeline/advanced/chart/pipes/config/hierarchySankey.d.ts +2 -0
  29. package/dist/esm/pipeline/advanced/chart/pipes/config/hierarchySankey.js +27 -0
  30. package/dist/esm/pipeline/advanced/chart/pipes/config/hierarchySankey.js.map +1 -0
  31. package/dist/esm/pipeline/advanced/chart/pipes/config/index.d.ts +2 -0
  32. package/dist/esm/pipeline/advanced/chart/pipes/config/index.js +2 -0
  33. package/dist/esm/pipeline/advanced/chart/pipes/config/index.js.map +1 -1
  34. package/dist/esm/pipeline/advanced/chart/pipes/config/sankey.d.ts +2 -0
  35. package/dist/esm/pipeline/advanced/chart/pipes/config/sankey.js +27 -0
  36. package/dist/esm/pipeline/advanced/chart/pipes/config/sankey.js.map +1 -0
  37. package/dist/esm/pipeline/advanced/chart/pipes/encoding/index.d.ts +1 -0
  38. package/dist/esm/pipeline/advanced/chart/pipes/encoding/index.js +1 -0
  39. package/dist/esm/pipeline/advanced/chart/pipes/encoding/sankey.d.ts +3 -0
  40. package/dist/esm/pipeline/advanced/chart/pipes/encoding/sankey.js +83 -0
  41. package/dist/esm/pipeline/advanced/chart/pipes/encoding/sankey.js.map +1 -0
  42. package/dist/esm/pipeline/spec/chart/pipeline/hierarchySankey.d.ts +1 -0
  43. package/dist/esm/pipeline/spec/chart/pipeline/hierarchySankey.js +39 -0
  44. package/dist/esm/pipeline/spec/chart/pipeline/hierarchySankey.js.map +1 -0
  45. package/dist/esm/pipeline/spec/chart/pipeline/index.d.ts +2 -0
  46. package/dist/esm/pipeline/spec/chart/pipeline/index.js +2 -0
  47. package/dist/esm/pipeline/spec/chart/pipeline/sankey.d.ts +1 -0
  48. package/dist/esm/pipeline/spec/chart/pipeline/sankey.js +39 -0
  49. package/dist/esm/pipeline/spec/chart/pipeline/sankey.js.map +1 -0
  50. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchy.js +5 -2
  51. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchy.js.map +1 -1
  52. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchySankey.d.ts +4 -0
  53. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchySankey.js +136 -0
  54. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchySankey.js.map +1 -0
  55. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.d.ts +1 -0
  56. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.js +1 -1
  57. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.js.map +1 -1
  58. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchySankey.d.ts +2 -0
  59. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchySankey.js +44 -0
  60. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchySankey.js.map +1 -0
  61. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotSankey.d.ts +2 -0
  62. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotSankey.js +50 -0
  63. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotSankey.js.map +1 -0
  64. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetSankey.d.ts +16 -0
  65. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetSankey.js +97 -0
  66. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetSankey.js.map +1 -0
  67. package/dist/esm/pipeline/spec/chart/pipes/dataset/index.d.ts +4 -0
  68. package/dist/esm/pipeline/spec/chart/pipes/dataset/index.js +4 -0
  69. package/dist/esm/pipeline/spec/chart/pipes/init/circlePacking.js +1 -1
  70. package/dist/esm/pipeline/spec/chart/pipes/init/circlePacking.js.map +1 -1
  71. package/dist/esm/pipeline/spec/chart/pipes/init/hierarchySankey.d.ts +2 -0
  72. package/dist/esm/pipeline/spec/chart/pipes/init/hierarchySankey.js +32 -0
  73. package/dist/esm/pipeline/spec/chart/pipes/init/hierarchySankey.js.map +1 -0
  74. package/dist/esm/pipeline/spec/chart/pipes/init/index.d.ts +2 -0
  75. package/dist/esm/pipeline/spec/chart/pipes/init/index.js +2 -0
  76. package/dist/esm/pipeline/spec/chart/pipes/init/sankey.d.ts +2 -0
  77. package/dist/esm/pipeline/spec/chart/pipes/init/sankey.js +33 -0
  78. package/dist/esm/pipeline/spec/chart/pipes/init/sankey.js.map +1 -0
  79. package/dist/esm/pipeline/spec/chart/pipes/init/sunburst.js +1 -1
  80. package/dist/esm/pipeline/spec/chart/pipes/init/sunburst.js.map +1 -1
  81. package/dist/esm/pipeline/spec/chart/pipes/init/treeMap.js +1 -1
  82. package/dist/esm/pipeline/spec/chart/pipes/init/treeMap.js.map +1 -1
  83. package/dist/esm/pipeline/spec/chart/pipes/label/index.d.ts +2 -0
  84. package/dist/esm/pipeline/spec/chart/pipes/label/index.js +2 -0
  85. package/dist/esm/pipeline/spec/chart/pipes/label/label.js.map +1 -1
  86. package/dist/esm/pipeline/spec/chart/pipes/label/labelHierarchySankey.d.ts +17 -0
  87. package/dist/esm/pipeline/spec/chart/pipes/label/labelHierarchySankey.js +92 -0
  88. package/dist/esm/pipeline/spec/chart/pipes/label/labelHierarchySankey.js.map +1 -0
  89. package/dist/esm/pipeline/spec/chart/pipes/label/labelSankey.d.ts +2 -0
  90. package/dist/esm/pipeline/spec/chart/pipes/label/labelSankey.js +78 -0
  91. package/dist/esm/pipeline/spec/chart/pipes/label/labelSankey.js.map +1 -0
  92. package/dist/esm/pipeline/spec/chart/pipes/label/labelTreeMapLeaf.js +4 -4
  93. package/dist/esm/pipeline/spec/chart/pipes/label/labelTreeMapLeaf.js.map +1 -1
  94. package/dist/esm/pipeline/spec/chart/pipes/legend/pivotColorLegend.js +1 -1
  95. package/dist/esm/pipeline/spec/chart/pipes/legend/pivotColorLegend.js.map +1 -1
  96. package/dist/esm/pipeline/spec/chart/pipes/legend/pivotDiscreteLegend.js +1 -1
  97. package/dist/esm/pipeline/spec/chart/pipes/legend/pivotDiscreteLegend.js.map +1 -1
  98. package/dist/esm/pipeline/spec/chart/pipes/markStyle/index.d.ts +1 -0
  99. package/dist/esm/pipeline/spec/chart/pipes/markStyle/index.js +1 -0
  100. package/dist/esm/pipeline/spec/chart/pipes/markStyle/sankeyInteractive.d.ts +2 -0
  101. package/dist/esm/pipeline/spec/chart/pipes/markStyle/sankeyInteractive.js +33 -0
  102. package/dist/esm/pipeline/spec/chart/pipes/markStyle/sankeyInteractive.js.map +1 -0
  103. package/dist/esm/pipeline/spec/chart/pipes/tooltip/index.d.ts +2 -0
  104. package/dist/esm/pipeline/spec/chart/pipes/tooltip/index.js +2 -0
  105. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipHierarchySankey.d.ts +2 -0
  106. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipHierarchySankey.js +150 -0
  107. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipHierarchySankey.js.map +1 -0
  108. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipSankey.d.ts +2 -0
  109. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipSankey.js +75 -0
  110. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipSankey.js.map +1 -0
  111. package/dist/esm/pipeline/utils/chatType.d.ts +2 -0
  112. package/dist/esm/pipeline/utils/chatType.js +3 -1
  113. package/dist/esm/pipeline/utils/chatType.js.map +1 -1
  114. package/dist/esm/pipeline/utils/constant.d.ts +2 -0
  115. package/dist/esm/pipeline/utils/constant.js +2 -0
  116. package/dist/esm/pipeline/utils/constant.js.map +1 -1
  117. package/dist/esm/pipeline/utils/measures/typeGuard.js +1 -1
  118. package/dist/esm/pipeline/utils/measures/typeGuard.js.map +1 -1
  119. package/dist/esm/theme/dark/dark.js +3 -1
  120. package/dist/esm/theme/dark/dark.js.map +1 -1
  121. package/dist/esm/theme/dark/hierarchy.d.ts +132 -0
  122. package/dist/esm/theme/dark/hierarchy.js +3 -1
  123. package/dist/esm/theme/dark/hierarchy.js.map +1 -1
  124. package/dist/esm/theme/light/hierarchy.d.ts +132 -0
  125. package/dist/esm/theme/light/hierarchy.js +3 -1
  126. package/dist/esm/theme/light/hierarchy.js.map +1 -1
  127. package/dist/esm/theme/light/light.js +3 -1
  128. package/dist/esm/theme/light/light.js.map +1 -1
  129. package/dist/esm/types/chartType/area/zArea.d.ts +4 -0
  130. package/dist/esm/types/chartType/areaPercent/zAreaPercent.d.ts +4 -0
  131. package/dist/esm/types/chartType/bar/zBar.d.ts +4 -0
  132. package/dist/esm/types/chartType/barParallel/zBarParallel.d.ts +4 -0
  133. package/dist/esm/types/chartType/barPercent/zBarPercent.d.ts +4 -0
  134. package/dist/esm/types/chartType/boxPlot/zBoxPlot.d.ts +4 -0
  135. package/dist/esm/types/chartType/circlePacking/zCirclePacking.d.ts +2 -0
  136. package/dist/esm/types/chartType/column/zColumn.d.ts +4 -0
  137. package/dist/esm/types/chartType/columnParallel/zColumnParallel.d.ts +4 -0
  138. package/dist/esm/types/chartType/columnPercent/zColumnPercent.d.ts +4 -0
  139. package/dist/esm/types/chartType/donut/zDonut.d.ts +4 -0
  140. package/dist/esm/types/chartType/dualAxis/zDualAxis.d.ts +2 -0
  141. package/dist/esm/types/chartType/funnel/zFunnel.d.ts +4 -0
  142. package/dist/esm/types/chartType/heatmap/zHeatmap.d.ts +2 -0
  143. package/dist/esm/types/chartType/hierarchySankey/hierarchySankey.d.ts +92 -0
  144. package/dist/esm/types/chartType/hierarchySankey/hierarchySankey.js +0 -0
  145. package/dist/esm/types/chartType/hierarchySankey/index.d.ts +2 -0
  146. package/dist/esm/types/chartType/hierarchySankey/index.js +1 -0
  147. package/dist/esm/types/chartType/hierarchySankey/zHierarchySankey.d.ts +422 -0
  148. package/dist/esm/types/chartType/hierarchySankey/zHierarchySankey.js +20 -0
  149. package/dist/esm/types/chartType/hierarchySankey/zHierarchySankey.js.map +1 -0
  150. package/dist/esm/types/chartType/histogram/zHistogram.d.ts +4 -0
  151. package/dist/esm/types/chartType/index.d.ts +2 -0
  152. package/dist/esm/types/chartType/index.js +2 -0
  153. package/dist/esm/types/chartType/line/zLine.d.ts +4 -0
  154. package/dist/esm/types/chartType/pie/zPie.d.ts +4 -0
  155. package/dist/esm/types/chartType/pivotTable/zPivotTable.d.ts +2 -0
  156. package/dist/esm/types/chartType/raceBar/zRaceBar.d.ts +4 -0
  157. package/dist/esm/types/chartType/raceColumn/zRaceColumn.d.ts +4 -0
  158. package/dist/esm/types/chartType/raceDonut/zRaceDonut.d.ts +4 -0
  159. package/dist/esm/types/chartType/raceLine/zRaceLine.d.ts +4 -0
  160. package/dist/esm/types/chartType/racePie/zRacePie.d.ts +4 -0
  161. package/dist/esm/types/chartType/raceScatter/zRaceScatter.d.ts +4 -0
  162. package/dist/esm/types/chartType/radar/zRadar.d.ts +4 -0
  163. package/dist/esm/types/chartType/rose/zRose.d.ts +4 -0
  164. package/dist/esm/types/chartType/roseParallel/zRoseParallel.d.ts +4 -0
  165. package/dist/esm/types/chartType/sankey/index.d.ts +2 -0
  166. package/dist/esm/types/chartType/sankey/index.js +1 -0
  167. package/dist/esm/types/chartType/sankey/sankey.d.ts +91 -0
  168. package/dist/esm/types/chartType/sankey/sankey.js +0 -0
  169. package/dist/esm/types/chartType/sankey/zSankey.d.ts +422 -0
  170. package/dist/esm/types/chartType/sankey/zSankey.js +20 -0
  171. package/dist/esm/types/chartType/sankey/zSankey.js.map +1 -0
  172. package/dist/esm/types/chartType/scatter/zScatter.d.ts +4 -0
  173. package/dist/esm/types/chartType/sunburst/zSunburst.d.ts +2 -0
  174. package/dist/esm/types/chartType/table/zTable.d.ts +2 -0
  175. package/dist/esm/types/chartType/treeMap/zTreeMap.d.ts +2 -0
  176. package/dist/esm/types/properties/chartType/chartType.d.ts +3 -1
  177. package/dist/esm/types/properties/chartType/chartType.js +2 -0
  178. package/dist/esm/types/properties/chartType/chartType.js.map +1 -1
  179. package/dist/esm/types/properties/config/config.d.ts +602 -0
  180. package/dist/esm/types/properties/config/config.js +4 -0
  181. package/dist/esm/types/properties/config/config.js.map +1 -1
  182. package/dist/esm/types/properties/config/hierarchySankey.d.ts +303 -0
  183. package/dist/esm/types/properties/config/hierarchySankey.js +18 -0
  184. package/dist/esm/types/properties/config/hierarchySankey.js.map +1 -0
  185. package/dist/esm/types/properties/config/index.d.ts +2 -0
  186. package/dist/esm/types/properties/config/index.js +2 -0
  187. package/dist/esm/types/properties/config/sankey.d.ts +303 -0
  188. package/dist/esm/types/properties/config/sankey.js +18 -0
  189. package/dist/esm/types/properties/config/sankey.js.map +1 -0
  190. package/dist/esm/types/properties/datasetReshapeInfo/datasetReshapeInfo.d.ts +2 -0
  191. package/dist/esm/types/properties/datasetReshapeInfo/zDatasetReshapeInfo.d.ts +4 -0
  192. package/dist/esm/types/properties/datasetReshapeInfo/zDatasetReshapeInfo.js +2 -0
  193. package/dist/esm/types/properties/datasetReshapeInfo/zDatasetReshapeInfo.js.map +1 -1
  194. package/dist/esm/types/properties/dimensions/index.d.ts +1 -0
  195. package/dist/esm/types/properties/dimensions/sankeyDimension.d.ts +15 -0
  196. package/dist/esm/types/properties/dimensions/sankeyDimension.js +0 -0
  197. package/dist/esm/types/properties/dimensions/zDimensions.d.ts +6 -0
  198. package/dist/esm/types/properties/encoding/dimensionEncoding.d.ts +3 -1
  199. package/dist/esm/types/properties/encoding/encoding.d.ts +8 -0
  200. package/dist/esm/types/properties/encoding/zDimensionEncoding.d.ts +4 -0
  201. package/dist/esm/types/properties/encoding/zDimensionEncoding.js +6 -2
  202. package/dist/esm/types/properties/encoding/zDimensionEncoding.js.map +1 -1
  203. package/dist/esm/types/properties/encoding/zEncoding.d.ts +4 -0
  204. package/dist/esm/types/properties/encoding/zEncoding.js +5 -1
  205. package/dist/esm/types/properties/encoding/zEncoding.js.map +1 -1
  206. package/dist/esm/types/properties/measures/index.d.ts +1 -0
  207. package/dist/esm/types/properties/measures/sankeyMeasure.d.ts +11 -0
  208. package/dist/esm/types/properties/measures/sankeyMeasure.js +0 -0
  209. package/dist/esm/types/properties/theme/customTheme.d.ts +3752 -2548
  210. package/dist/esm/types/vseed.d.ts +2 -2
  211. package/dist/esm/types/zVseed.js +3 -1
  212. package/dist/esm/types/zVseed.js.map +1 -1
  213. package/dist/umd/index.js +1303 -185
  214. package/dist/umd/index.js.map +1 -1
  215. package/package.json +1 -1
@@ -0,0 +1,39 @@
1
+ import { backgroundColor, color, colorAdapter, colorLegend, datasetHierarchySankey, datasetPivotHierarchySankey, discreteLegend, fontFamilyTheme, initHierarchySankey, initPivot, labelHierarchySankey, linearColor, pivotAdapter, pivotColorLegend, pivotColumnDimensions, pivotDiscreteLegend, pivotGridStyle, pivotHideIndicatorName, pivotIndicators, pivotIndicatorsAsCol, pivotRowDimensions, pivotTitle, sankeyInteractive, tooltipHierarchySankey } from "../pipes/index.js";
2
+ const hierarchySankey = [
3
+ fontFamilyTheme,
4
+ initHierarchySankey,
5
+ datasetHierarchySankey,
6
+ colorAdapter(color, linearColor),
7
+ backgroundColor,
8
+ colorAdapter(discreteLegend, colorLegend),
9
+ tooltipHierarchySankey,
10
+ labelHierarchySankey,
11
+ sankeyInteractive
12
+ ];
13
+ const pivotHierarchySankey = [
14
+ initPivot,
15
+ pivotGridStyle,
16
+ pivotIndicatorsAsCol,
17
+ pivotHideIndicatorName,
18
+ datasetPivotHierarchySankey,
19
+ pivotIndicators([
20
+ fontFamilyTheme,
21
+ initHierarchySankey,
22
+ datasetHierarchySankey,
23
+ colorAdapter(color, linearColor),
24
+ backgroundColor,
25
+ tooltipHierarchySankey,
26
+ labelHierarchySankey,
27
+ sankeyInteractive
28
+ ]),
29
+ pivotRowDimensions,
30
+ pivotColumnDimensions,
31
+ pivotTitle,
32
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
33
+ ];
34
+ const hierarchySankeySpecPipeline = [
35
+ pivotAdapter(hierarchySankey, pivotHierarchySankey)
36
+ ];
37
+ export { hierarchySankeySpecPipeline };
38
+
39
+ //# sourceMappingURL=hierarchySankey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipeline/hierarchySankey.js","sources":["../../../../../../src/pipeline/spec/chart/pipeline/hierarchySankey.ts"],"sourcesContent":["import type { PivotChartSpecPipeline, VChartSpecPipeline } from 'src/types'\nimport {\n backgroundColor,\n color,\n colorAdapter,\n colorLegend,\n datasetHierarchySankey,\n datasetPivotHierarchySankey,\n discreteLegend,\n fontFamilyTheme,\n initHierarchySankey,\n initPivot,\n labelHierarchySankey,\n linearColor,\n pivotAdapter,\n pivotColorLegend,\n pivotColumnDimensions,\n pivotDiscreteLegend,\n pivotGridStyle,\n pivotHideIndicatorName,\n pivotIndicators,\n pivotIndicatorsAsCol,\n pivotRowDimensions,\n pivotTitle,\n sankeyInteractive,\n tooltipHierarchySankey,\n} from '../pipes'\n\nconst hierarchySankey: VChartSpecPipeline = [\n fontFamilyTheme,\n initHierarchySankey,\n datasetHierarchySankey,\n colorAdapter(color, linearColor),\n backgroundColor,\n colorAdapter(discreteLegend, colorLegend),\n tooltipHierarchySankey,\n labelHierarchySankey,\n sankeyInteractive,\n]\n\nconst pivotHierarchySankey: PivotChartSpecPipeline = [\n initPivot,\n pivotGridStyle,\n pivotIndicatorsAsCol,\n pivotHideIndicatorName,\n datasetPivotHierarchySankey,\n pivotIndicators([\n fontFamilyTheme,\n initHierarchySankey,\n datasetHierarchySankey,\n colorAdapter(color, linearColor),\n backgroundColor,\n tooltipHierarchySankey,\n labelHierarchySankey,\n sankeyInteractive,\n ]),\n pivotRowDimensions,\n pivotColumnDimensions,\n pivotTitle,\n colorAdapter(pivotDiscreteLegend, pivotColorLegend),\n]\n\nexport const hierarchySankeySpecPipeline = [pivotAdapter(hierarchySankey, pivotHierarchySankey)]\n"],"names":["hierarchySankey","fontFamilyTheme","initHierarchySankey","datasetHierarchySankey","colorAdapter","color","linearColor","backgroundColor","discreteLegend","colorLegend","tooltipHierarchySankey","labelHierarchySankey","sankeyInteractive","pivotHierarchySankey","initPivot","pivotGridStyle","pivotIndicatorsAsCol","pivotHideIndicatorName","datasetPivotHierarchySankey","pivotIndicators","pivotRowDimensions","pivotColumnDimensions","pivotTitle","pivotDiscreteLegend","pivotColorLegend","hierarchySankeySpecPipeline","pivotAdapter"],"mappings":";AA4BA,MAAMA,kBAAsC;IAC1CC;IACAC;IACAC;IACAC,aAAaC,OAAOC;IACpBC;IACAH,aAAaI,gBAAgBC;IAC7BC;IACAC;IACAC;CACD;AAED,MAAMC,uBAA+C;IACnDC;IACAC;IACAC;IACAC;IACAC;IACAC,gBAAgB;QACdlB;QACAC;QACAC;QACAC,aAAaC,OAAOC;QACpBC;QACAG;QACAC;QACAC;KACD;IACDQ;IACAC;IACAC;IACAlB,aAAamB,qBAAqBC;CACnC;AAEM,MAAMC,8BAA8B;IAACC,aAAa1B,iBAAiBa;CAAsB"}
@@ -27,3 +27,5 @@ export { histogramSpecPipeline } from './histogram';
27
27
  export { treeMapSpecPipeline } from './treeMap';
28
28
  export { sunburstSpecPipeline } from './sunburst';
29
29
  export { circlePackingSpecPipeline } from './circlePacking';
30
+ export { hierarchySankeySpecPipeline } from './hierarchySankey';
31
+ export { sankeySpecPipeline } from './sankey';
@@ -27,3 +27,5 @@ export { histogramSpecPipeline } from "./histogram.js";
27
27
  export { treeMapSpecPipeline } from "./treeMap.js";
28
28
  export { sunburstSpecPipeline } from "./sunburst.js";
29
29
  export { circlePackingSpecPipeline } from "./circlePacking.js";
30
+ export { hierarchySankeySpecPipeline } from "./hierarchySankey.js";
31
+ export { sankeySpecPipeline } from "./sankey.js";
@@ -0,0 +1 @@
1
+ export declare const sankeySpecPipeline: import("../../../../types").SpecPipe[];
@@ -0,0 +1,39 @@
1
+ import { backgroundColor, color, colorAdapter, colorLegend, datasetPivotSankey, datasetSankey, discreteLegend, fontFamilyTheme, initPivot, initSankey, labelSankey, linearColor, pivotAdapter, pivotColorLegend, pivotColumnDimensions, pivotDiscreteLegend, pivotGridStyle, pivotHideIndicatorName, pivotIndicators, pivotIndicatorsAsCol, pivotRowDimensions, pivotTitle, sankeyInteractive, tooltipSankey } from "../pipes/index.js";
2
+ const sankey = [
3
+ fontFamilyTheme,
4
+ initSankey,
5
+ datasetSankey,
6
+ colorAdapter(color, linearColor),
7
+ backgroundColor,
8
+ colorAdapter(discreteLegend, colorLegend),
9
+ tooltipSankey,
10
+ labelSankey,
11
+ sankeyInteractive
12
+ ];
13
+ const pivotSankey = [
14
+ initPivot,
15
+ pivotGridStyle,
16
+ pivotIndicatorsAsCol,
17
+ pivotHideIndicatorName,
18
+ datasetPivotSankey,
19
+ pivotIndicators([
20
+ fontFamilyTheme,
21
+ initSankey,
22
+ datasetSankey,
23
+ colorAdapter(color, linearColor),
24
+ backgroundColor,
25
+ tooltipSankey,
26
+ labelSankey,
27
+ sankeyInteractive
28
+ ]),
29
+ pivotRowDimensions,
30
+ pivotColumnDimensions,
31
+ pivotTitle,
32
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
33
+ ];
34
+ const sankeySpecPipeline = [
35
+ pivotAdapter(sankey, pivotSankey)
36
+ ];
37
+ export { sankeySpecPipeline };
38
+
39
+ //# sourceMappingURL=sankey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipeline/sankey.js","sources":["../../../../../../src/pipeline/spec/chart/pipeline/sankey.ts"],"sourcesContent":["import type { PivotChartSpecPipeline, VChartSpecPipeline } from 'src/types'\nimport {\n backgroundColor,\n color,\n colorAdapter,\n colorLegend,\n datasetSankey,\n datasetPivotSankey,\n discreteLegend,\n fontFamilyTheme,\n initSankey,\n initPivot,\n labelSankey,\n linearColor,\n pivotAdapter,\n pivotColorLegend,\n pivotColumnDimensions,\n pivotDiscreteLegend,\n pivotGridStyle,\n pivotHideIndicatorName,\n pivotIndicators,\n pivotIndicatorsAsCol,\n pivotRowDimensions,\n pivotTitle,\n sankeyInteractive,\n tooltipSankey,\n} from '../pipes'\n\nconst sankey: VChartSpecPipeline = [\n fontFamilyTheme,\n initSankey,\n datasetSankey,\n colorAdapter(color, linearColor),\n backgroundColor,\n colorAdapter(discreteLegend, colorLegend),\n tooltipSankey,\n labelSankey,\n sankeyInteractive,\n]\n\nconst pivotSankey: PivotChartSpecPipeline = [\n initPivot,\n pivotGridStyle,\n pivotIndicatorsAsCol,\n pivotHideIndicatorName,\n datasetPivotSankey,\n pivotIndicators([\n fontFamilyTheme,\n initSankey,\n datasetSankey,\n colorAdapter(color, linearColor),\n backgroundColor,\n tooltipSankey,\n labelSankey,\n sankeyInteractive,\n ]),\n pivotRowDimensions,\n pivotColumnDimensions,\n pivotTitle,\n colorAdapter(pivotDiscreteLegend, pivotColorLegend),\n]\n\nexport const sankeySpecPipeline = [pivotAdapter(sankey, pivotSankey)]\n"],"names":["sankey","fontFamilyTheme","initSankey","datasetSankey","colorAdapter","color","linearColor","backgroundColor","discreteLegend","colorLegend","tooltipSankey","labelSankey","sankeyInteractive","pivotSankey","initPivot","pivotGridStyle","pivotIndicatorsAsCol","pivotHideIndicatorName","datasetPivotSankey","pivotIndicators","pivotRowDimensions","pivotColumnDimensions","pivotTitle","pivotDiscreteLegend","pivotColorLegend","sankeySpecPipeline","pivotAdapter"],"mappings":";AA4BA,MAAMA,SAA6B;IACjCC;IACAC;IACAC;IACAC,aAAaC,OAAOC;IACpBC;IACAH,aAAaI,gBAAgBC;IAC7BC;IACAC;IACAC;CACD;AAED,MAAMC,cAAsC;IAC1CC;IACAC;IACAC;IACAC;IACAC;IACAC,gBAAgB;QACdlB;QACAC;QACAC;QACAC,aAAaC,OAAOC;QACpBC;QACAG;QACAC;QACAC;KACD;IACDQ;IACAC;IACAC;IACAlB,aAAamB,qBAAqBC;CACnC;AAEM,MAAMC,qBAAqB;IAACC,aAAa1B,QAAQa;CAAa"}
@@ -44,10 +44,13 @@ const buildTree = (dataset, hierarchyFields, foldInfo, unfoldInfo, measureKeys =
44
44
  for(let i = 0; i < hierarchyFields.length; i++){
45
45
  const field = hierarchyFields[i];
46
46
  const value = String(datum[field]);
47
- let child = currentNode.children.find((c)=>c.name === value);
47
+ const nodeName = field === measureId && measureName && void 0 !== datum[measureName] ? String(datum[measureName]) : value;
48
+ let child = currentNode.children.find((c)=>String(c[field]) === value);
48
49
  if (!child) {
49
50
  child = {
50
- name: value,
51
+ name: nodeName,
52
+ key: value,
53
+ field,
51
54
  children: []
52
55
  };
53
56
  for(let j = 0; j <= i; j++)child[hierarchyFields[j]] = datum[hierarchyFields[j]];
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/dataset/datasetHierarchy.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/dataset/datasetHierarchy.ts"],"sourcesContent":["import { findAllMeasures } from 'src/pipeline/utils'\nimport type { VChartSpecPipe, Datum, FoldInfo, UnfoldInfo } from 'src/types'\n\nexport const datasetHierarchy: VChartSpecPipe = (spec, context) => {\n const result = { ...spec }\n const { advancedVSeed } = context\n const { datasetReshapeInfo, dataset, measures } = advancedVSeed\n const { foldInfo, unfoldInfo } = datasetReshapeInfo[0]\n\n // 1. 获取 hierarchy encoding 对应的字段\n // 在 advanced pipeline 中,encodingForHierarchy 已经确保了 dimensions 被正确映射到 'hierarchy' 通道\n const hierarchyFields = (advancedVSeed.encoding as Datum)?.hierarchy || []\n\n const measureKeys = findAllMeasures(measures).map((m) => m.id)\n\n // 2. 如果没有 hierarchy 字段,直接返回原始数据(虽然这可能导致图表无法正确渲染,但比报错好)\n if (!hierarchyFields.length) {\n result.data = [{ id: 'data', values: dataset }]\n return result\n }\n\n // 3. 构建树形结构\n const tree = buildTree(dataset, hierarchyFields, foldInfo, unfoldInfo, measureKeys)\n\n result.data = [\n {\n id: 'data',\n values: tree,\n },\n ]\n\n return result\n}\n\n/**\n * @description 将平铺的数据集构建为树形结构\n * @param dataset 平铺的数据集\n * @param hierarchyFields 层级字段列表\n * @param measureValueField 指标值字段名\n * @param measureIdField 指标ID字段名\n */\nexport const buildTree = (\n dataset: Datum[],\n hierarchyFields: string[],\n foldInfo: FoldInfo,\n unfoldInfo: UnfoldInfo,\n measureKeys: string[] = [],\n) => {\n const { measureValue, measureId, measureName } = foldInfo\n const { encodingColor, encodingColorId } = unfoldInfo\n\n // 统一管理需要 Set 收集 → join('+') 的字段\n const collectFields = [measureId, measureName, encodingColor, encodingColorId].filter(Boolean) as string[]\n\n const root: Datum = { name: 'root', children: [] }\n\n dataset.forEach((datum) => {\n let currentNode = root\n\n // 遍历层级字段,构建路径\n for (let i = 0; i < hierarchyFields.length; i++) {\n const field = hierarchyFields[i]\n const value = String(datum[field])\n\n let child = currentNode.children.find((c: Datum) => c.name === value)\n\n if (!child) {\n child = { name: value, children: [] }\n for (let j = 0; j <= i; j++) {\n child[hierarchyFields[j]] = datum[hierarchyFields[j]]\n }\n currentNode.children.push(child)\n }\n\n currentNode = child\n }\n\n // 叶子节点:首次访问时初始化\n if (!currentNode.isLeaf) {\n Object.assign(currentNode, datum)\n currentNode.isLeaf = true\n\n // 初始化数值累加器\n if (measureValue) currentNode[measureValue] = 0\n measureKeys.forEach((key) => {\n currentNode[key] = 0\n })\n\n // 初始化 Set 收集器\n collectFields.forEach((field) => {\n currentNode[`_set_${field}`] = new Set()\n })\n }\n\n // 聚合 measureValue\n if (measureValue && datum[measureValue] !== undefined) {\n currentNode[measureValue] += Number(datum[measureValue])\n }\n\n // 聚合各个 measure\n measureKeys.forEach((key) => {\n if (datum[key] !== undefined) {\n currentNode[key] = (currentNode[key] || 0) + Number(datum[key])\n }\n })\n\n // 收集需要 join 的字段值\n collectFields.forEach((field) => {\n if (datum[field]) currentNode[`_set_${field}`].add(datum[field])\n })\n\n // 更新 value 字段\n if (measureValue) {\n currentNode.value = currentNode[measureValue]\n }\n })\n\n // 将 Set 转为 '+' 拼接的字符串\n const flattenSets = (node: Datum) => {\n collectFields.forEach((field) => {\n const setKey = `_set_${field}`\n if (node[setKey]) {\n node[field] = Array.from(node[setKey]).join('+')\n delete node[setKey]\n }\n })\n }\n\n // 从子节点的 '+' 字符串中收集所有唯一值,合并到父节点\n const mergeCollectFieldsFromChildren = (node: Datum) => {\n collectFields.forEach((field) => {\n const merged = new Set<string>()\n node.children.forEach((child: Datum) => {\n if (child[field]) {\n child[field].split('+').forEach((v: string) => merged.add(v))\n }\n })\n if (merged.size > 0) {\n node[field] = Array.from(merged).join('+')\n }\n })\n }\n\n // 后序遍历:自底向上聚合\n const aggregate = (node: Datum): number => {\n if (node.isLeaf) {\n flattenSets(node)\n return node.value || 0\n }\n\n if (!node.children?.length) {\n return node.value || 0\n }\n\n let sum = 0\n node.children.forEach((child: Datum) => {\n sum += aggregate(child)\n measureKeys.forEach((key) => {\n node[key] = (node[key] || 0) + (child[key] || 0)\n })\n })\n\n node.value = sum\n if (measureValue) node[measureValue] = sum\n\n mergeCollectFieldsFromChildren(node)\n\n return sum\n }\n\n root.children.forEach(aggregate)\n\n return root.children\n}\n"],"names":["datasetHierarchy","spec","context","result","advancedVSeed","datasetReshapeInfo","dataset","measures","foldInfo","unfoldInfo","hierarchyFields","measureKeys","findAllMeasures","m","tree","buildTree","measureValue","measureId","measureName","encodingColor","encodingColorId","collectFields","Boolean","root","datum","currentNode","i","field","value","String","child","c","j","Object","key","Set","undefined","Number","flattenSets","node","setKey","Array","mergeCollectFieldsFromChildren","merged","v","aggregate","sum"],"mappings":";AAGO,MAAMA,mBAAmC,CAACC,MAAMC;IACrD,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,kBAAkB,EAAEC,OAAO,EAAEC,QAAQ,EAAE,GAAGH;IAClD,MAAM,EAAEI,QAAQ,EAAEC,UAAU,EAAE,GAAGJ,kBAAkB,CAAC,EAAE;IAItD,MAAMK,kBAAmBN,cAAc,QAAQ,EAAY,aAAa,EAAE;IAE1E,MAAMO,cAAcC,gBAAgBL,UAAU,GAAG,CAAC,CAACM,IAAMA,EAAE,EAAE;IAG7D,IAAI,CAACH,gBAAgB,MAAM,EAAE;QAC3BP,OAAO,IAAI,GAAG;YAAC;gBAAE,IAAI;gBAAQ,QAAQG;YAAQ;SAAE;QAC/C,OAAOH;IACT;IAGA,MAAMW,OAAOC,UAAUT,SAASI,iBAAiBF,UAAUC,YAAYE;IAEvER,OAAO,IAAI,GAAG;QACZ;YACE,IAAI;YACJ,QAAQW;QACV;KACD;IAED,OAAOX;AACT;AASO,MAAMY,YAAY,CACvBT,SACAI,iBACAF,UACAC,YACAE,cAAwB,EAAE;IAE1B,MAAM,EAAEK,YAAY,EAAEC,SAAS,EAAEC,WAAW,EAAE,GAAGV;IACjD,MAAM,EAAEW,aAAa,EAAEC,eAAe,EAAE,GAAGX;IAG3C,MAAMY,gBAAgB;QAACJ;QAAWC;QAAaC;QAAeC;KAAgB,CAAC,MAAM,CAACE;IAEtF,MAAMC,OAAc;QAAE,MAAM;QAAQ,UAAU,EAAE;IAAC;IAEjDjB,QAAQ,OAAO,CAAC,CAACkB;QACf,IAAIC,cAAcF;QAGlB,IAAK,IAAIG,IAAI,GAAGA,IAAIhB,gBAAgB,MAAM,EAAEgB,IAAK;YAC/C,MAAMC,QAAQjB,eAAe,CAACgB,EAAE;YAChC,MAAME,QAAQC,OAAOL,KAAK,CAACG,MAAM;YAEjC,IAAIG,QAAQL,YAAY,QAAQ,CAAC,IAAI,CAAC,CAACM,IAAaA,EAAE,IAAI,KAAKH;YAE/D,IAAI,CAACE,OAAO;gBACVA,QAAQ;oBAAE,MAAMF;oBAAO,UAAU,EAAE;gBAAC;gBACpC,IAAK,IAAII,IAAI,GAAGA,KAAKN,GAAGM,IACtBF,KAAK,CAACpB,eAAe,CAACsB,EAAE,CAAC,GAAGR,KAAK,CAACd,eAAe,CAACsB,EAAE,CAAC;gBAEvDP,YAAY,QAAQ,CAAC,IAAI,CAACK;YAC5B;YAEAL,cAAcK;QAChB;QAGA,IAAI,CAACL,YAAY,MAAM,EAAE;YACvBQ,OAAO,MAAM,CAACR,aAAaD;YAC3BC,YAAY,MAAM,GAAG;YAGrB,IAAIT,cAAcS,WAAW,CAACT,aAAa,GAAG;YAC9CL,YAAY,OAAO,CAAC,CAACuB;gBACnBT,WAAW,CAACS,IAAI,GAAG;YACrB;YAGAb,cAAc,OAAO,CAAC,CAACM;gBACrBF,WAAW,CAAC,CAAC,KAAK,EAAEE,OAAO,CAAC,GAAG,IAAIQ;YACrC;QACF;QAGA,IAAInB,gBAAgBQ,AAAwBY,WAAxBZ,KAAK,CAACR,aAAa,EACrCS,WAAW,CAACT,aAAa,IAAIqB,OAAOb,KAAK,CAACR,aAAa;QAIzDL,YAAY,OAAO,CAAC,CAACuB;YACnB,IAAIV,AAAeY,WAAfZ,KAAK,CAACU,IAAI,EACZT,WAAW,CAACS,IAAI,GAAIT,AAAAA,CAAAA,WAAW,CAACS,IAAI,IAAI,KAAKG,OAAOb,KAAK,CAACU,IAAI;QAElE;QAGAb,cAAc,OAAO,CAAC,CAACM;YACrB,IAAIH,KAAK,CAACG,MAAM,EAAEF,WAAW,CAAC,CAAC,KAAK,EAAEE,OAAO,CAAC,CAAC,GAAG,CAACH,KAAK,CAACG,MAAM;QACjE;QAGA,IAAIX,cACFS,YAAY,KAAK,GAAGA,WAAW,CAACT,aAAa;IAEjD;IAGA,MAAMsB,cAAc,CAACC;QACnBlB,cAAc,OAAO,CAAC,CAACM;YACrB,MAAMa,SAAS,CAAC,KAAK,EAAEb,OAAO;YAC9B,IAAIY,IAAI,CAACC,OAAO,EAAE;gBAChBD,IAAI,CAACZ,MAAM,GAAGc,MAAM,IAAI,CAACF,IAAI,CAACC,OAAO,EAAE,IAAI,CAAC;gBAC5C,OAAOD,IAAI,CAACC,OAAO;YACrB;QACF;IACF;IAGA,MAAME,iCAAiC,CAACH;QACtClB,cAAc,OAAO,CAAC,CAACM;YACrB,MAAMgB,SAAS,IAAIR;YACnBI,KAAK,QAAQ,CAAC,OAAO,CAAC,CAACT;gBACrB,IAAIA,KAAK,CAACH,MAAM,EACdG,KAAK,CAACH,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,CAACiB,IAAcD,OAAO,GAAG,CAACC;YAE9D;YACA,IAAID,OAAO,IAAI,GAAG,GAChBJ,IAAI,CAACZ,MAAM,GAAGc,MAAM,IAAI,CAACE,QAAQ,IAAI,CAAC;QAE1C;IACF;IAGA,MAAME,YAAY,CAACN;QACjB,IAAIA,KAAK,MAAM,EAAE;YACfD,YAAYC;YACZ,OAAOA,KAAK,KAAK,IAAI;QACvB;QAEA,IAAI,CAACA,KAAK,QAAQ,EAAE,QAClB,OAAOA,KAAK,KAAK,IAAI;QAGvB,IAAIO,MAAM;QACVP,KAAK,QAAQ,CAAC,OAAO,CAAC,CAACT;YACrBgB,OAAOD,UAAUf;YACjBnB,YAAY,OAAO,CAAC,CAACuB;gBACnBK,IAAI,CAACL,IAAI,GAAIK,AAAAA,CAAAA,IAAI,CAACL,IAAI,IAAI,KAAMJ,CAAAA,KAAK,CAACI,IAAI,IAAI;YAChD;QACF;QAEAK,KAAK,KAAK,GAAGO;QACb,IAAI9B,cAAcuB,IAAI,CAACvB,aAAa,GAAG8B;QAEvCJ,+BAA+BH;QAE/B,OAAOO;IACT;IAEAvB,KAAK,QAAQ,CAAC,OAAO,CAACsB;IAEtB,OAAOtB,KAAK,QAAQ;AACtB"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/dataset/datasetHierarchy.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/dataset/datasetHierarchy.ts"],"sourcesContent":["import { findAllMeasures } from 'src/pipeline/utils'\nimport type { VChartSpecPipe, Datum, FoldInfo, UnfoldInfo } from 'src/types'\n\nexport const datasetHierarchy: VChartSpecPipe = (spec, context) => {\n const result = { ...spec }\n const { advancedVSeed } = context\n const { datasetReshapeInfo, dataset, measures } = advancedVSeed\n const { foldInfo, unfoldInfo } = datasetReshapeInfo[0]\n\n // 1. 获取 hierarchy encoding 对应的字段\n // 在 advanced pipeline 中,encodingForHierarchy 已经确保了 dimensions 被正确映射到 'hierarchy' 通道\n const hierarchyFields = (advancedVSeed.encoding as Datum)?.hierarchy || []\n\n const measureKeys = findAllMeasures(measures).map((m) => m.id)\n\n // 2. 如果没有 hierarchy 字段,直接返回原始数据(虽然这可能导致图表无法正确渲染,但比报错好)\n if (!hierarchyFields.length) {\n result.data = [{ id: 'data', values: dataset }]\n return result\n }\n\n // 3. 构建树形结构\n const tree = buildTree(dataset, hierarchyFields, foldInfo, unfoldInfo, measureKeys)\n\n result.data = [\n {\n id: 'data',\n values: tree,\n },\n ]\n\n return result\n}\n\n/**\n * @description 将平铺的数据集构建为树形结构\n * @param dataset 平铺的数据集\n * @param hierarchyFields 层级字段列表\n * @param measureValueField 指标值字段名\n * @param measureIdField 指标ID字段名\n */\nexport const buildTree = (\n dataset: Datum[],\n hierarchyFields: string[],\n foldInfo: FoldInfo,\n unfoldInfo: UnfoldInfo,\n measureKeys: string[] = [],\n) => {\n const { measureValue, measureId, measureName } = foldInfo\n const { encodingColor, encodingColorId } = unfoldInfo\n\n // 统一管理需要 Set 收集 → join('+') 的字段\n const collectFields = [measureId, measureName, encodingColor, encodingColorId].filter(Boolean) as string[]\n\n const root: Datum = { name: 'root', children: [] }\n\n dataset.forEach((datum) => {\n let currentNode = root\n\n // 遍历层级字段,构建路径\n for (let i = 0; i < hierarchyFields.length; i++) {\n const field = hierarchyFields[i]\n const value = String(datum[field])\n const nodeName =\n field === measureId && measureName && datum[measureName] !== undefined ? String(datum[measureName]) : value\n\n let child = currentNode.children.find((c: Datum) => String(c[field]) === value)\n\n if (!child) {\n child = { name: nodeName, key: value, field, children: [] }\n for (let j = 0; j <= i; j++) {\n child[hierarchyFields[j]] = datum[hierarchyFields[j]]\n }\n currentNode.children.push(child)\n }\n\n currentNode = child\n }\n\n // 叶子节点:首次访问时初始化\n if (!currentNode.isLeaf) {\n Object.assign(currentNode, datum)\n currentNode.isLeaf = true\n\n // 初始化数值累加器\n if (measureValue) currentNode[measureValue] = 0\n measureKeys.forEach((key) => {\n currentNode[key] = 0\n })\n\n // 初始化 Set 收集器\n collectFields.forEach((field) => {\n currentNode[`_set_${field}`] = new Set()\n })\n }\n\n // 聚合 measureValue\n if (measureValue && datum[measureValue] !== undefined) {\n currentNode[measureValue] += Number(datum[measureValue])\n }\n\n // 聚合各个 measure\n measureKeys.forEach((key) => {\n if (datum[key] !== undefined) {\n currentNode[key] = (currentNode[key] || 0) + Number(datum[key])\n }\n })\n\n // 收集需要 join 的字段值\n collectFields.forEach((field) => {\n if (datum[field]) currentNode[`_set_${field}`].add(datum[field])\n })\n\n // 更新 value 字段\n if (measureValue) {\n currentNode.value = currentNode[measureValue]\n }\n })\n\n // 将 Set 转为 '+' 拼接的字符串\n const flattenSets = (node: Datum) => {\n collectFields.forEach((field) => {\n const setKey = `_set_${field}`\n if (node[setKey]) {\n node[field] = Array.from(node[setKey]).join('+')\n delete node[setKey]\n }\n })\n }\n\n // 从子节点的 '+' 字符串中收集所有唯一值,合并到父节点\n const mergeCollectFieldsFromChildren = (node: Datum) => {\n collectFields.forEach((field) => {\n const merged = new Set<string>()\n node.children.forEach((child: Datum) => {\n if (child[field]) {\n child[field].split('+').forEach((v: string) => merged.add(v))\n }\n })\n if (merged.size > 0) {\n node[field] = Array.from(merged).join('+')\n }\n })\n }\n\n // 后序遍历:自底向上聚合\n const aggregate = (node: Datum): number => {\n if (node.isLeaf) {\n flattenSets(node)\n return node.value || 0\n }\n\n if (!node.children?.length) {\n return node.value || 0\n }\n\n let sum = 0\n node.children.forEach((child: Datum) => {\n sum += aggregate(child)\n measureKeys.forEach((key) => {\n node[key] = (node[key] || 0) + (child[key] || 0)\n })\n })\n\n node.value = sum\n if (measureValue) node[measureValue] = sum\n\n mergeCollectFieldsFromChildren(node)\n\n return sum\n }\n\n root.children.forEach(aggregate)\n\n return root.children\n}\n"],"names":["datasetHierarchy","spec","context","result","advancedVSeed","datasetReshapeInfo","dataset","measures","foldInfo","unfoldInfo","hierarchyFields","measureKeys","findAllMeasures","m","tree","buildTree","measureValue","measureId","measureName","encodingColor","encodingColorId","collectFields","Boolean","root","datum","currentNode","i","field","value","String","nodeName","undefined","child","c","j","Object","key","Set","Number","flattenSets","node","setKey","Array","mergeCollectFieldsFromChildren","merged","v","aggregate","sum"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Datum, FoldInfo, UnfoldInfo, VChartSpecPipe } from '../../../../../types';
2
+ export declare const datasetHierarchySankey: VChartSpecPipe;
3
+ export declare const buildHierarchySankeyNodes: (dataset: Datum[], hierarchyFields: string[], foldInfo: FoldInfo, unfoldInfo: UnfoldInfo, measureKeys: string[]) => any;
4
+ export declare const getHierarchySankeyNodesFromSpec: (spec: Record<string, any>, fallback?: Datum[]) => Record<string | number, any>[];
@@ -0,0 +1,136 @@
1
+ import { findAllMeasures } from "../../../../utils/index.js";
2
+ import { Separator } from "../../../../../dataReshape/constant.js";
3
+ const datasetHierarchySankey = (spec, context)=>{
4
+ const result = {
5
+ ...spec
6
+ };
7
+ const { advancedVSeed } = context;
8
+ const { dataset, datasetReshapeInfo, measures } = advancedVSeed;
9
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
10
+ const hierarchyFields = advancedVSeed.encoding?.hierarchy || [];
11
+ const measureKeys = findAllMeasures(measures).map((m)=>m.id);
12
+ const nodes = buildHierarchySankeyNodes(dataset, hierarchyFields, foldInfo, unfoldInfo, measureKeys);
13
+ result.data = [
14
+ {
15
+ id: 'data',
16
+ values: [
17
+ {
18
+ nodes
19
+ }
20
+ ]
21
+ }
22
+ ];
23
+ return result;
24
+ };
25
+ const buildHierarchySankeyNodes = (dataset, hierarchyFields, foldInfo, unfoldInfo, measureKeys)=>{
26
+ if (!hierarchyFields.length) return dataset;
27
+ const { measureValue, measureId, measureName } = foldInfo;
28
+ const { encodingColor, encodingColorId } = unfoldInfo;
29
+ const collectFields = [
30
+ measureId,
31
+ measureName,
32
+ encodingColor,
33
+ encodingColorId
34
+ ].filter(Boolean);
35
+ const root = {
36
+ name: 'root',
37
+ children: []
38
+ };
39
+ dataset.forEach((datum)=>{
40
+ let currentNode = root;
41
+ for(let i = 0; i < hierarchyFields.length; i++){
42
+ const field = hierarchyFields[i];
43
+ const value = String(datum[field]);
44
+ const nodeName = field === measureId && measureName && void 0 !== datum[measureName] ? String(datum[measureName]) : value;
45
+ let child = currentNode.children.find((c)=>c.name === nodeName);
46
+ if (!child) {
47
+ const pathValues = hierarchyFields.slice(0, i + 1).map((key)=>String(datum[key]));
48
+ child = {
49
+ field: field,
50
+ key: nodeName,
51
+ name: nodeName,
52
+ color: nodeName,
53
+ path: pathValues.join(Separator),
54
+ children: []
55
+ };
56
+ for(let j = 0; j <= i; j++)child[hierarchyFields[j]] = datum[hierarchyFields[j]];
57
+ currentNode.children.push(child);
58
+ }
59
+ currentNode = child;
60
+ }
61
+ if (!currentNode.isLeaf) {
62
+ Object.assign(currentNode, datum);
63
+ currentNode.isLeaf = true;
64
+ if (measureValue) currentNode[measureValue] = 0;
65
+ measureKeys.forEach((key)=>{
66
+ currentNode[key] = 0;
67
+ });
68
+ collectFields.forEach((field)=>{
69
+ currentNode[`_set_${field}`] = new Set();
70
+ });
71
+ }
72
+ if (measureValue && void 0 !== datum[measureValue]) currentNode[measureValue] += Number(datum[measureValue]);
73
+ measureKeys.forEach((key)=>{
74
+ if (void 0 !== datum[key]) currentNode[key] = (currentNode[key] || 0) + Number(datum[key]);
75
+ });
76
+ collectFields.forEach((field)=>{
77
+ if (datum[field]) currentNode[`_set_${field}`].add(datum[field]);
78
+ });
79
+ if (measureValue) currentNode.value = currentNode[measureValue];
80
+ });
81
+ const flattenSets = (node)=>{
82
+ collectFields.forEach((field)=>{
83
+ const setKey = `_set_${field}`;
84
+ if (node[setKey]) {
85
+ node[field] = Array.from(node[setKey]).join('+');
86
+ delete node[setKey];
87
+ }
88
+ });
89
+ };
90
+ const mergeCollectFieldsFromChildren = (node)=>{
91
+ collectFields.forEach((field)=>{
92
+ const merged = new Set();
93
+ node.children.forEach((child)=>{
94
+ if (child[field]) child[field].split('+').forEach((v)=>merged.add(v));
95
+ });
96
+ if (merged.size > 0) node[field] = Array.from(merged).join('+');
97
+ });
98
+ };
99
+ const aggregate = (node)=>{
100
+ if (node.isLeaf) {
101
+ flattenSets(node);
102
+ node.outDegree = 0;
103
+ return node.value || 0;
104
+ }
105
+ if (!node.children?.length) {
106
+ node.outDegree = 0;
107
+ return node.value || 0;
108
+ }
109
+ let sum = 0;
110
+ node.children.forEach((child)=>{
111
+ sum += aggregate(child);
112
+ measureKeys.forEach((key)=>{
113
+ node[key] = (node[key] || 0) + (child[key] || 0);
114
+ });
115
+ });
116
+ node.value = sum;
117
+ if (measureValue) node[measureValue] = sum;
118
+ node.outDegree = node.children.length;
119
+ mergeCollectFieldsFromChildren(node);
120
+ return sum;
121
+ };
122
+ const fillInDegree = (node, parent)=>{
123
+ node.inDegree = parent ? 1 : 0;
124
+ node.children?.forEach((child)=>fillInDegree(child, node));
125
+ };
126
+ root.children.forEach(aggregate);
127
+ root.children.forEach((child)=>fillInDegree(child));
128
+ return root.children;
129
+ };
130
+ const getHierarchySankeyNodesFromSpec = (spec, fallback = [])=>{
131
+ const nodes = spec.data?.[0]?.values?.[0]?.nodes;
132
+ return Array.isArray(nodes) ? nodes : fallback;
133
+ };
134
+ export { buildHierarchySankeyNodes, datasetHierarchySankey, getHierarchySankeyNodesFromSpec };
135
+
136
+ //# sourceMappingURL=datasetHierarchySankey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/dataset/datasetHierarchySankey.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/dataset/datasetHierarchySankey.ts"],"sourcesContent":["import { findAllMeasures } from 'src/pipeline/utils'\nimport { Separator } from 'src/dataReshape/constant'\nimport type { Datum, FoldInfo, UnfoldInfo, VChartSpecPipe } from 'src/types'\n\nexport const datasetHierarchySankey: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as Record<string, any>\n const { advancedVSeed } = context\n const { dataset, datasetReshapeInfo, measures } = advancedVSeed\n const { foldInfo, unfoldInfo } = datasetReshapeInfo[0]\n const hierarchyFields = (advancedVSeed.encoding as Datum)?.hierarchy || []\n const measureKeys = findAllMeasures(measures).map((m) => m.id)\n const nodes = buildHierarchySankeyNodes(dataset as Datum[], hierarchyFields, foldInfo, unfoldInfo, measureKeys)\n\n result.data = [\n {\n id: 'data',\n values: [\n {\n nodes,\n },\n ],\n },\n ]\n\n return result as any\n}\n\nexport const buildHierarchySankeyNodes = (\n dataset: Datum[],\n hierarchyFields: string[],\n foldInfo: FoldInfo,\n unfoldInfo: UnfoldInfo,\n measureKeys: string[],\n) => {\n if (!hierarchyFields.length) {\n return dataset\n }\n\n const { measureValue, measureId, measureName } = foldInfo\n const { encodingColor, encodingColorId } = unfoldInfo\n const collectFields = [measureId, measureName, encodingColor, encodingColorId].filter(Boolean) as string[]\n\n const root: Datum = { name: 'root', children: [] }\n\n dataset.forEach((datum) => {\n let currentNode = root\n\n for (let i = 0; i < hierarchyFields.length; i++) {\n const field = hierarchyFields[i]\n const value = String(datum[field])\n const nodeName =\n field === measureId && measureName && datum[measureName] !== undefined ? String(datum[measureName]) : value\n let child = currentNode.children.find((c: Datum) => c.name === nodeName)\n\n if (!child) {\n const pathValues = hierarchyFields.slice(0, i + 1).map((key) => String(datum[key]))\n child = {\n field: field,\n key: nodeName,\n name: nodeName,\n color: nodeName,\n path: pathValues.join(Separator),\n children: [],\n }\n for (let j = 0; j <= i; j++) {\n child[hierarchyFields[j]] = datum[hierarchyFields[j]]\n }\n currentNode.children.push(child)\n }\n\n currentNode = child\n }\n\n if (!currentNode.isLeaf) {\n Object.assign(currentNode, datum)\n currentNode.isLeaf = true\n\n if (measureValue) currentNode[measureValue] = 0\n measureKeys.forEach((key) => {\n currentNode[key] = 0\n })\n\n collectFields.forEach((field) => {\n currentNode[`_set_${field}`] = new Set()\n })\n }\n\n if (measureValue && datum[measureValue] !== undefined) {\n currentNode[measureValue] += Number(datum[measureValue])\n }\n\n measureKeys.forEach((key) => {\n if (datum[key] !== undefined) {\n currentNode[key] = (currentNode[key] || 0) + Number(datum[key])\n }\n })\n\n collectFields.forEach((field) => {\n if (datum[field]) currentNode[`_set_${field}`].add(datum[field])\n })\n\n if (measureValue) {\n currentNode.value = currentNode[measureValue]\n }\n })\n\n const flattenSets = (node: Datum) => {\n collectFields.forEach((field) => {\n const setKey = `_set_${field}`\n if (node[setKey]) {\n node[field] = Array.from(node[setKey]).join('+')\n delete node[setKey]\n }\n })\n }\n\n const mergeCollectFieldsFromChildren = (node: Datum) => {\n collectFields.forEach((field) => {\n const merged = new Set<string>()\n node.children.forEach((child: Datum) => {\n if (child[field]) {\n child[field].split('+').forEach((v: string) => merged.add(v))\n }\n })\n if (merged.size > 0) {\n node[field] = Array.from(merged).join('+')\n }\n })\n }\n\n const aggregate = (node: Datum): number => {\n if (node.isLeaf) {\n flattenSets(node)\n node.outDegree = 0\n return node.value || 0\n }\n\n if (!node.children?.length) {\n node.outDegree = 0\n return node.value || 0\n }\n\n let sum = 0\n node.children.forEach((child: Datum) => {\n sum += aggregate(child)\n measureKeys.forEach((key) => {\n node[key] = (node[key] || 0) + (child[key] || 0)\n })\n })\n\n node.value = sum\n if (measureValue) node[measureValue] = sum\n node.outDegree = node.children.length\n mergeCollectFieldsFromChildren(node)\n\n return sum\n }\n\n const fillInDegree = (node: Datum, parent?: Datum) => {\n node.inDegree = parent ? 1 : 0\n node.children?.forEach((child: Datum) => fillInDegree(child, node))\n }\n\n root.children.forEach(aggregate)\n root.children.forEach((child: Datum) => fillInDegree(child))\n\n return root.children\n}\n\nexport const getHierarchySankeyNodesFromSpec = (spec: Record<string, any>, fallback: Datum[] = []) => {\n const nodes = spec.data?.[0]?.values?.[0]?.nodes\n return Array.isArray(nodes) ? (nodes as Datum[]) : fallback\n}\n"],"names":["datasetHierarchySankey","spec","context","result","advancedVSeed","dataset","datasetReshapeInfo","measures","foldInfo","unfoldInfo","hierarchyFields","measureKeys","findAllMeasures","m","nodes","buildHierarchySankeyNodes","measureValue","measureId","measureName","encodingColor","encodingColorId","collectFields","Boolean","root","datum","currentNode","i","field","value","String","nodeName","undefined","child","c","pathValues","key","Separator","j","Object","Set","Number","flattenSets","node","setKey","Array","mergeCollectFieldsFromChildren","merged","v","aggregate","sum","fillInDegree","parent","getHierarchySankeyNodesFromSpec","fallback"],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  import type { PivotChartSpecPipe } from '../../../../../types';
2
2
  export declare const datasetPivotHierarchy: PivotChartSpecPipe;
3
+ export declare function groupByDimensions<T extends Record<string, any>>(data: T[], dimKeys: string[]): any[];
@@ -67,6 +67,6 @@ function groupByDimensions(data, dimKeys) {
67
67
  });
68
68
  return result;
69
69
  }
70
- export { datasetPivotHierarchy };
70
+ export { datasetPivotHierarchy, groupByDimensions };
71
71
 
72
72
  //# sourceMappingURL=datasetPivotHierarchy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.ts"],"sourcesContent":["import { findAllMeasures } from 'src/pipeline/utils'\nimport type { PivotChartSpecPipe, Datum } from 'src/types'\nimport { buildTree } from './datasetHierarchy'\nimport { omit } from 'remeda'\n\nexport const datasetPivotHierarchy: PivotChartSpecPipe = (spec, context) => {\n const result = { ...spec }\n const { advancedVSeed } = context\n const { dataset, datasetReshapeInfo, measures } = advancedVSeed\n const measureKeys = findAllMeasures(measures).map((m) => m.id)\n\n const hierarchyFields = (advancedVSeed.encoding as Datum)?.hierarchy || []\n const rows = (advancedVSeed.encoding as Datum)?.row || []\n const columns = (advancedVSeed.encoding as Datum)?.column || []\n const pivotDims = [...rows, ...columns]\n const records = dataset.reduce(\n (pre, cur, index) => {\n const id = datasetReshapeInfo[index].id\n const { foldInfo, unfoldInfo } = datasetReshapeInfo[index]\n\n if (pivotDims.length > 0) {\n const groupedDataset = groupByDimensions(cur as Datum[], pivotDims) as Datum[]\n pre[id] = groupedDataset.flatMap((data) => {\n const root = {\n ...data,\n children: buildTree(data.children as Datum[], hierarchyFields, foldInfo, unfoldInfo, measureKeys),\n }\n const rootProps = omit(root, ['children'])\n const rootTree = root.children.map((child: Datum) => ({\n ...child,\n ...rootProps,\n }))\n return rootTree\n })\n } else {\n const tree = buildTree(cur as Datum[], hierarchyFields, foldInfo, unfoldInfo, measureKeys)\n pre[id] = tree\n }\n\n return pre\n },\n {} as Record<string, any>,\n )\n\n return {\n ...result,\n records: records,\n }\n}\n\nfunction groupByDimensions<T extends Record<string, any>>(data: T[], dimKeys: string[]): any[] {\n if (dimKeys.length === 0) {\n return data\n }\n\n // 用所有 dimKeys 的值拼接成复合 key\n const buckets = new Map<string, { dimValues: Record<string, any>; items: T[] }>()\n\n for (const item of data) {\n const compositeKey = dimKeys.map((k) => String(item[k])).join('\\x00')\n\n if (!buckets.has(compositeKey)) {\n const dimValues: Record<string, any> = {}\n for (const k of dimKeys) {\n dimValues[k] = item[k]\n }\n buckets.set(compositeKey, { dimValues, items: [] })\n }\n buckets.get(compositeKey)!.items.push(item)\n }\n\n const result: any[] = []\n for (const [, { dimValues, items }] of buckets) {\n result.push({\n ...dimValues, // 平铺所有维度 key:value\n children: items,\n })\n }\n\n return result\n}\n"],"names":["datasetPivotHierarchy","spec","context","result","advancedVSeed","dataset","datasetReshapeInfo","measures","measureKeys","findAllMeasures","m","hierarchyFields","rows","columns","pivotDims","records","pre","cur","index","id","foldInfo","unfoldInfo","groupedDataset","groupByDimensions","data","root","buildTree","rootProps","omit","rootTree","child","tree","dimKeys","buckets","Map","item","compositeKey","k","String","dimValues","items"],"mappings":";;;AAKO,MAAMA,wBAA4C,CAACC,MAAMC;IAC9D,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,OAAO,EAAEC,kBAAkB,EAAEC,QAAQ,EAAE,GAAGH;IAClD,MAAMI,cAAcC,gBAAgBF,UAAU,GAAG,CAAC,CAACG,IAAMA,EAAE,EAAE;IAE7D,MAAMC,kBAAmBP,cAAc,QAAQ,EAAY,aAAa,EAAE;IAC1E,MAAMQ,OAAQR,cAAc,QAAQ,EAAY,OAAO,EAAE;IACzD,MAAMS,UAAWT,cAAc,QAAQ,EAAY,UAAU,EAAE;IAC/D,MAAMU,YAAY;WAAIF;WAASC;KAAQ;IACvC,MAAME,UAAUV,QAAQ,MAAM,CAC5B,CAACW,KAAKC,KAAKC;QACT,MAAMC,KAAKb,kBAAkB,CAACY,MAAM,CAAC,EAAE;QACvC,MAAM,EAAEE,QAAQ,EAAEC,UAAU,EAAE,GAAGf,kBAAkB,CAACY,MAAM;QAE1D,IAAIJ,UAAU,MAAM,GAAG,GAAG;YACxB,MAAMQ,iBAAiBC,kBAAkBN,KAAgBH;YACzDE,GAAG,CAACG,GAAG,GAAGG,eAAe,OAAO,CAAC,CAACE;gBAChC,MAAMC,OAAO;oBACX,GAAGD,IAAI;oBACP,UAAUE,UAAUF,KAAK,QAAQ,EAAab,iBAAiBS,UAAUC,YAAYb;gBACvF;gBACA,MAAMmB,YAAYC,KAAKH,MAAM;oBAAC;iBAAW;gBACzC,MAAMI,WAAWJ,KAAK,QAAQ,CAAC,GAAG,CAAC,CAACK,QAAkB;wBACpD,GAAGA,KAAK;wBACR,GAAGH,SAAS;oBACd;gBACA,OAAOE;YACT;QACF,OAAO;YACL,MAAME,OAAOL,UAAUT,KAAgBN,iBAAiBS,UAAUC,YAAYb;YAC9EQ,GAAG,CAACG,GAAG,GAAGY;QACZ;QAEA,OAAOf;IACT,GACA,CAAC;IAGH,OAAO;QACL,GAAGb,MAAM;QACT,SAASY;IACX;AACF;AAEA,SAASQ,kBAAiDC,IAAS,EAAEQ,OAAiB;IACpF,IAAIA,AAAmB,MAAnBA,QAAQ,MAAM,EAChB,OAAOR;IAIT,MAAMS,UAAU,IAAIC;IAEpB,KAAK,MAAMC,QAAQX,KAAM;QACvB,MAAMY,eAAeJ,QAAQ,GAAG,CAAC,CAACK,IAAMC,OAAOH,IAAI,CAACE,EAAE,GAAG,IAAI,CAAC;QAE9D,IAAI,CAACJ,QAAQ,GAAG,CAACG,eAAe;YAC9B,MAAMG,YAAiC,CAAC;YACxC,KAAK,MAAMF,KAAKL,QACdO,SAAS,CAACF,EAAE,GAAGF,IAAI,CAACE,EAAE;YAExBJ,QAAQ,GAAG,CAACG,cAAc;gBAAEG;gBAAW,OAAO,EAAE;YAAC;QACnD;QACAN,QAAQ,GAAG,CAACG,cAAe,KAAK,CAAC,IAAI,CAACD;IACxC;IAEA,MAAMhC,SAAgB,EAAE;IACxB,KAAK,MAAM,GAAG,EAAEoC,SAAS,EAAEC,KAAK,EAAE,CAAC,IAAIP,QACrC9B,OAAO,IAAI,CAAC;QACV,GAAGoC,SAAS;QACZ,UAAUC;IACZ;IAGF,OAAOrC;AACT"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.ts"],"sourcesContent":["import { findAllMeasures } from 'src/pipeline/utils'\nimport type { PivotChartSpecPipe, Datum } from 'src/types'\nimport { buildTree } from './datasetHierarchy'\nimport { omit } from 'remeda'\n\nexport const datasetPivotHierarchy: PivotChartSpecPipe = (spec, context) => {\n const result = { ...spec }\n const { advancedVSeed } = context\n const { dataset, datasetReshapeInfo, measures } = advancedVSeed\n const measureKeys = findAllMeasures(measures).map((m) => m.id)\n\n const hierarchyFields = (advancedVSeed.encoding as Datum)?.hierarchy || []\n const rows = (advancedVSeed.encoding as Datum)?.row || []\n const columns = (advancedVSeed.encoding as Datum)?.column || []\n const pivotDims = [...rows, ...columns]\n const records = dataset.reduce(\n (pre, cur, index) => {\n const id = datasetReshapeInfo[index].id\n const { foldInfo, unfoldInfo } = datasetReshapeInfo[index]\n\n if (pivotDims.length > 0) {\n const groupedDataset = groupByDimensions(cur as Datum[], pivotDims) as Datum[]\n pre[id] = groupedDataset.flatMap((data) => {\n const root = {\n ...data,\n children: buildTree(data.children as Datum[], hierarchyFields, foldInfo, unfoldInfo, measureKeys),\n }\n const rootProps = omit(root, ['children'])\n const rootTree = root.children.map((child: Datum) => ({\n ...child,\n ...rootProps,\n }))\n return rootTree\n })\n } else {\n const tree = buildTree(cur as Datum[], hierarchyFields, foldInfo, unfoldInfo, measureKeys)\n pre[id] = tree\n }\n\n return pre\n },\n {} as Record<string, any>,\n )\n\n return {\n ...result,\n records: records,\n }\n}\n\nexport function groupByDimensions<T extends Record<string, any>>(data: T[], dimKeys: string[]): any[] {\n if (dimKeys.length === 0) {\n return data\n }\n\n // 用所有 dimKeys 的值拼接成复合 key\n const buckets = new Map<string, { dimValues: Record<string, any>; items: T[] }>()\n\n for (const item of data) {\n const compositeKey = dimKeys.map((k) => String(item[k])).join('\\x00')\n\n if (!buckets.has(compositeKey)) {\n const dimValues: Record<string, any> = {}\n for (const k of dimKeys) {\n dimValues[k] = item[k]\n }\n buckets.set(compositeKey, { dimValues, items: [] })\n }\n buckets.get(compositeKey)!.items.push(item)\n }\n\n const result: any[] = []\n for (const [, { dimValues, items }] of buckets) {\n result.push({\n ...dimValues, // 平铺所有维度 key:value\n children: items,\n })\n }\n\n return result\n}\n"],"names":["datasetPivotHierarchy","spec","context","result","advancedVSeed","dataset","datasetReshapeInfo","measures","measureKeys","findAllMeasures","m","hierarchyFields","rows","columns","pivotDims","records","pre","cur","index","id","foldInfo","unfoldInfo","groupedDataset","groupByDimensions","data","root","buildTree","rootProps","omit","rootTree","child","tree","dimKeys","buckets","Map","item","compositeKey","k","String","dimValues","items"],"mappings":";;;AAKO,MAAMA,wBAA4C,CAACC,MAAMC;IAC9D,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,OAAO,EAAEC,kBAAkB,EAAEC,QAAQ,EAAE,GAAGH;IAClD,MAAMI,cAAcC,gBAAgBF,UAAU,GAAG,CAAC,CAACG,IAAMA,EAAE,EAAE;IAE7D,MAAMC,kBAAmBP,cAAc,QAAQ,EAAY,aAAa,EAAE;IAC1E,MAAMQ,OAAQR,cAAc,QAAQ,EAAY,OAAO,EAAE;IACzD,MAAMS,UAAWT,cAAc,QAAQ,EAAY,UAAU,EAAE;IAC/D,MAAMU,YAAY;WAAIF;WAASC;KAAQ;IACvC,MAAME,UAAUV,QAAQ,MAAM,CAC5B,CAACW,KAAKC,KAAKC;QACT,MAAMC,KAAKb,kBAAkB,CAACY,MAAM,CAAC,EAAE;QACvC,MAAM,EAAEE,QAAQ,EAAEC,UAAU,EAAE,GAAGf,kBAAkB,CAACY,MAAM;QAE1D,IAAIJ,UAAU,MAAM,GAAG,GAAG;YACxB,MAAMQ,iBAAiBC,kBAAkBN,KAAgBH;YACzDE,GAAG,CAACG,GAAG,GAAGG,eAAe,OAAO,CAAC,CAACE;gBAChC,MAAMC,OAAO;oBACX,GAAGD,IAAI;oBACP,UAAUE,UAAUF,KAAK,QAAQ,EAAab,iBAAiBS,UAAUC,YAAYb;gBACvF;gBACA,MAAMmB,YAAYC,KAAKH,MAAM;oBAAC;iBAAW;gBACzC,MAAMI,WAAWJ,KAAK,QAAQ,CAAC,GAAG,CAAC,CAACK,QAAkB;wBACpD,GAAGA,KAAK;wBACR,GAAGH,SAAS;oBACd;gBACA,OAAOE;YACT;QACF,OAAO;YACL,MAAME,OAAOL,UAAUT,KAAgBN,iBAAiBS,UAAUC,YAAYb;YAC9EQ,GAAG,CAACG,GAAG,GAAGY;QACZ;QAEA,OAAOf;IACT,GACA,CAAC;IAGH,OAAO;QACL,GAAGb,MAAM;QACT,SAASY;IACX;AACF;AAEO,SAASQ,kBAAiDC,IAAS,EAAEQ,OAAiB;IAC3F,IAAIA,AAAmB,MAAnBA,QAAQ,MAAM,EAChB,OAAOR;IAIT,MAAMS,UAAU,IAAIC;IAEpB,KAAK,MAAMC,QAAQX,KAAM;QACvB,MAAMY,eAAeJ,QAAQ,GAAG,CAAC,CAACK,IAAMC,OAAOH,IAAI,CAACE,EAAE,GAAG,IAAI,CAAC;QAE9D,IAAI,CAACJ,QAAQ,GAAG,CAACG,eAAe;YAC9B,MAAMG,YAAiC,CAAC;YACxC,KAAK,MAAMF,KAAKL,QACdO,SAAS,CAACF,EAAE,GAAGF,IAAI,CAACE,EAAE;YAExBJ,QAAQ,GAAG,CAACG,cAAc;gBAAEG;gBAAW,OAAO,EAAE;YAAC;QACnD;QACAN,QAAQ,GAAG,CAACG,cAAe,KAAK,CAAC,IAAI,CAACD;IACxC;IAEA,MAAMhC,SAAgB,EAAE;IACxB,KAAK,MAAM,GAAG,EAAEoC,SAAS,EAAEC,KAAK,EAAE,CAAC,IAAIP,QACrC9B,OAAO,IAAI,CAAC;QACV,GAAGoC,SAAS;QACZ,UAAUC;IACZ;IAGF,OAAOrC;AACT"}
@@ -0,0 +1,2 @@
1
+ import type { PivotChartSpecPipe } from '../../../../../types';
2
+ export declare const datasetPivotHierarchySankey: PivotChartSpecPipe;
@@ -0,0 +1,44 @@
1
+ import { findAllMeasures } from "../../../../utils/index.js";
2
+ import { buildHierarchySankeyNodes } from "./datasetHierarchySankey.js";
3
+ import { groupByDimensions } from "./datasetPivotHierarchy.js";
4
+ const datasetPivotHierarchySankey = (spec, context)=>{
5
+ const result = {
6
+ ...spec
7
+ };
8
+ const { advancedVSeed } = context;
9
+ const { dataset, datasetReshapeInfo, measures } = advancedVSeed;
10
+ const measureKeys = findAllMeasures(measures).map((m)=>m.id);
11
+ const hierarchyFields = advancedVSeed.encoding?.hierarchy || [];
12
+ const rows = advancedVSeed.encoding?.row || [];
13
+ const columns = advancedVSeed.encoding?.column || [];
14
+ const pivotDims = [
15
+ ...rows,
16
+ ...columns
17
+ ];
18
+ const records = dataset.reduce((pre, cur, index)=>{
19
+ const id = datasetReshapeInfo[index].id;
20
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[index];
21
+ if (pivotDims.length > 0) {
22
+ const groupedDataset = groupByDimensions(cur, pivotDims);
23
+ pre[id] = groupedDataset.map((data)=>({
24
+ ...Object.fromEntries(pivotDims.map((dim)=>[
25
+ dim,
26
+ data[dim]
27
+ ])),
28
+ nodes: buildHierarchySankeyNodes(data.children, hierarchyFields, foldInfo, unfoldInfo, measureKeys)
29
+ }));
30
+ } else pre[id] = [
31
+ {
32
+ nodes: buildHierarchySankeyNodes(cur, hierarchyFields, foldInfo, unfoldInfo, measureKeys)
33
+ }
34
+ ];
35
+ return pre;
36
+ }, {});
37
+ return {
38
+ ...result,
39
+ records
40
+ };
41
+ };
42
+ export { datasetPivotHierarchySankey };
43
+
44
+ //# sourceMappingURL=datasetPivotHierarchySankey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/dataset/datasetPivotHierarchySankey.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchySankey.ts"],"sourcesContent":["import { findAllMeasures } from 'src/pipeline/utils'\nimport type { Datum, PivotChartSpecPipe } from 'src/types'\nimport { buildHierarchySankeyNodes } from './datasetHierarchySankey'\nimport { groupByDimensions } from './datasetPivotHierarchy'\n\nexport const datasetPivotHierarchySankey: PivotChartSpecPipe = (spec, context) => {\n const result = { ...spec }\n const { advancedVSeed } = context\n const { dataset, datasetReshapeInfo, measures } = advancedVSeed\n const measureKeys = findAllMeasures(measures).map((m) => m.id)\n\n const hierarchyFields = (advancedVSeed.encoding as Datum)?.hierarchy || []\n const rows = (advancedVSeed.encoding as Datum)?.row || []\n const columns = (advancedVSeed.encoding as Datum)?.column || []\n const pivotDims = [...rows, ...columns]\n const records = dataset.reduce(\n (pre, cur, index) => {\n const id = datasetReshapeInfo[index].id\n const { foldInfo, unfoldInfo } = datasetReshapeInfo[index]\n\n if (pivotDims.length > 0) {\n const groupedDataset = groupByDimensions(cur as Datum[], pivotDims) as Datum[]\n pre[id] = groupedDataset.map((data) => ({\n ...Object.fromEntries(pivotDims.map((dim) => [dim, data[dim]])),\n nodes: buildHierarchySankeyNodes(\n data.children as Datum[],\n hierarchyFields,\n foldInfo,\n unfoldInfo,\n measureKeys,\n ),\n }))\n } else {\n pre[id] = [\n {\n nodes: buildHierarchySankeyNodes(cur as Datum[], hierarchyFields, foldInfo, unfoldInfo, measureKeys),\n },\n ]\n }\n\n return pre\n },\n {} as Record<string, any>,\n )\n\n return {\n ...result,\n records,\n }\n}\n"],"names":["datasetPivotHierarchySankey","spec","context","result","advancedVSeed","dataset","datasetReshapeInfo","measures","measureKeys","findAllMeasures","m","hierarchyFields","rows","columns","pivotDims","records","pre","cur","index","id","foldInfo","unfoldInfo","groupedDataset","groupByDimensions","data","Object","dim","buildHierarchySankeyNodes"],"mappings":";;;AAKO,MAAMA,8BAAkD,CAACC,MAAMC;IACpE,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,OAAO,EAAEC,kBAAkB,EAAEC,QAAQ,EAAE,GAAGH;IAClD,MAAMI,cAAcC,gBAAgBF,UAAU,GAAG,CAAC,CAACG,IAAMA,EAAE,EAAE;IAE7D,MAAMC,kBAAmBP,cAAc,QAAQ,EAAY,aAAa,EAAE;IAC1E,MAAMQ,OAAQR,cAAc,QAAQ,EAAY,OAAO,EAAE;IACzD,MAAMS,UAAWT,cAAc,QAAQ,EAAY,UAAU,EAAE;IAC/D,MAAMU,YAAY;WAAIF;WAASC;KAAQ;IACvC,MAAME,UAAUV,QAAQ,MAAM,CAC5B,CAACW,KAAKC,KAAKC;QACT,MAAMC,KAAKb,kBAAkB,CAACY,MAAM,CAAC,EAAE;QACvC,MAAM,EAAEE,QAAQ,EAAEC,UAAU,EAAE,GAAGf,kBAAkB,CAACY,MAAM;QAE1D,IAAIJ,UAAU,MAAM,GAAG,GAAG;YACxB,MAAMQ,iBAAiBC,kBAAkBN,KAAgBH;YACzDE,GAAG,CAACG,GAAG,GAAGG,eAAe,GAAG,CAAC,CAACE,OAAU;oBACtC,GAAGC,OAAO,WAAW,CAACX,UAAU,GAAG,CAAC,CAACY,MAAQ;4BAACA;4BAAKF,IAAI,CAACE,IAAI;yBAAC,EAAE;oBAC/D,OAAOC,0BACLH,KAAK,QAAQ,EACbb,iBACAS,UACAC,YACAb;gBAEJ;QACF,OACEQ,GAAG,CAACG,GAAG,GAAG;YACR;gBACE,OAAOQ,0BAA0BV,KAAgBN,iBAAiBS,UAAUC,YAAYb;YAC1F;SACD;QAGH,OAAOQ;IACT,GACA,CAAC;IAGH,OAAO;QACL,GAAGb,MAAM;QACTY;IACF;AACF"}
@@ -0,0 +1,2 @@
1
+ import type { PivotChartSpecPipe } from '../../../../../types';
2
+ export declare const datasetPivotSankey: PivotChartSpecPipe;
@@ -0,0 +1,50 @@
1
+ import { buildSankeyData } from "./datasetSankey.js";
2
+ import { groupByDimensions } from "./datasetPivotHierarchy.js";
3
+ const datasetPivotSankey = (spec, context)=>{
4
+ const result = {
5
+ ...spec
6
+ };
7
+ const { advancedVSeed } = context;
8
+ const { dataset, datasetReshapeInfo } = advancedVSeed;
9
+ const rows = advancedVSeed.encoding?.row || [];
10
+ const columns = advancedVSeed.encoding?.column || [];
11
+ const sourceFields = advancedVSeed.encoding?.source || [];
12
+ const targetFields = advancedVSeed.encoding?.target || [];
13
+ const pivotDims = [
14
+ ...rows,
15
+ ...columns
16
+ ];
17
+ const records = dataset.reduce((pre, cur, index)=>{
18
+ const reshapeInfo = datasetReshapeInfo[index];
19
+ const id = reshapeInfo.id;
20
+ const { foldInfo, unfoldInfo } = reshapeInfo;
21
+ if (pivotDims.length > 0) {
22
+ const groupedDataset = groupByDimensions(cur, pivotDims);
23
+ pre[id] = groupedDataset.map((data)=>({
24
+ ...Object.fromEntries(pivotDims.map((dim)=>[
25
+ dim,
26
+ data[dim]
27
+ ])),
28
+ ...buildSankeyData(data.children || [], unfoldInfo.encodingSource || 'source', unfoldInfo.encodingTarget || 'target', foldInfo.measureValue, {
29
+ foldInfo,
30
+ sourceFields,
31
+ targetFields
32
+ })
33
+ }));
34
+ } else pre[id] = [
35
+ buildSankeyData(cur, unfoldInfo.encodingSource || 'source', unfoldInfo.encodingTarget || 'target', foldInfo.measureValue, {
36
+ foldInfo,
37
+ sourceFields,
38
+ targetFields
39
+ })
40
+ ];
41
+ return pre;
42
+ }, {});
43
+ return {
44
+ ...result,
45
+ records
46
+ };
47
+ };
48
+ export { datasetPivotSankey };
49
+
50
+ //# sourceMappingURL=datasetPivotSankey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/dataset/datasetPivotSankey.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/dataset/datasetPivotSankey.ts"],"sourcesContent":["import type { Datum, PivotChartSpecPipe } from 'src/types'\nimport { buildSankeyData } from './datasetSankey'\nimport { groupByDimensions } from './datasetPivotHierarchy'\n\nexport const datasetPivotSankey: PivotChartSpecPipe = (spec, context) => {\n const result = { ...spec }\n const { advancedVSeed } = context\n const { dataset, datasetReshapeInfo } = advancedVSeed\n const rows = (advancedVSeed.encoding as Datum)?.row || []\n const columns = (advancedVSeed.encoding as Datum)?.column || []\n const sourceFields = (advancedVSeed.encoding as Datum)?.source || []\n const targetFields = (advancedVSeed.encoding as Datum)?.target || []\n const pivotDims = [...rows, ...columns]\n\n const records = dataset.reduce(\n (pre, cur, index) => {\n const reshapeInfo = datasetReshapeInfo[index]\n const id = reshapeInfo.id\n const { foldInfo, unfoldInfo } = reshapeInfo\n\n if (pivotDims.length > 0) {\n const groupedDataset = groupByDimensions(cur as Datum[], pivotDims) as Datum[]\n pre[id] = groupedDataset.map((data) => ({\n ...Object.fromEntries(pivotDims.map((dim) => [dim, data[dim]])),\n ...buildSankeyData(\n (data.children || []) as Datum[],\n unfoldInfo.encodingSource || 'source',\n unfoldInfo.encodingTarget || 'target',\n foldInfo.measureValue,\n {\n foldInfo,\n sourceFields,\n targetFields,\n },\n ),\n }))\n } else {\n pre[id] = [\n buildSankeyData(\n cur as Datum[],\n unfoldInfo.encodingSource || 'source',\n unfoldInfo.encodingTarget || 'target',\n foldInfo.measureValue,\n {\n foldInfo,\n sourceFields,\n targetFields,\n },\n ),\n ]\n }\n\n return pre\n },\n {} as Record<string, any>,\n )\n\n return {\n ...result,\n records,\n }\n}\n"],"names":["datasetPivotSankey","spec","context","result","advancedVSeed","dataset","datasetReshapeInfo","rows","columns","sourceFields","targetFields","pivotDims","records","pre","cur","index","reshapeInfo","id","foldInfo","unfoldInfo","groupedDataset","groupByDimensions","data","Object","dim","buildSankeyData"],"mappings":";;AAIO,MAAMA,qBAAyC,CAACC,MAAMC;IAC3D,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,OAAO,EAAEC,kBAAkB,EAAE,GAAGF;IACxC,MAAMG,OAAQH,cAAc,QAAQ,EAAY,OAAO,EAAE;IACzD,MAAMI,UAAWJ,cAAc,QAAQ,EAAY,UAAU,EAAE;IAC/D,MAAMK,eAAgBL,cAAc,QAAQ,EAAY,UAAU,EAAE;IACpE,MAAMM,eAAgBN,cAAc,QAAQ,EAAY,UAAU,EAAE;IACpE,MAAMO,YAAY;WAAIJ;WAASC;KAAQ;IAEvC,MAAMI,UAAUP,QAAQ,MAAM,CAC5B,CAACQ,KAAKC,KAAKC;QACT,MAAMC,cAAcV,kBAAkB,CAACS,MAAM;QAC7C,MAAME,KAAKD,YAAY,EAAE;QACzB,MAAM,EAAEE,QAAQ,EAAEC,UAAU,EAAE,GAAGH;QAEjC,IAAIL,UAAU,MAAM,GAAG,GAAG;YACxB,MAAMS,iBAAiBC,kBAAkBP,KAAgBH;YACzDE,GAAG,CAACI,GAAG,GAAGG,eAAe,GAAG,CAAC,CAACE,OAAU;oBACtC,GAAGC,OAAO,WAAW,CAACZ,UAAU,GAAG,CAAC,CAACa,MAAQ;4BAACA;4BAAKF,IAAI,CAACE,IAAI;yBAAC,EAAE;oBAC/D,GAAGC,gBACAH,KAAK,QAAQ,IAAI,EAAE,EACpBH,WAAW,cAAc,IAAI,UAC7BA,WAAW,cAAc,IAAI,UAC7BD,SAAS,YAAY,EACrB;wBACEA;wBACAT;wBACAC;oBACF,EACD;gBACH;QACF,OACEG,GAAG,CAACI,GAAG,GAAG;YACRQ,gBACEX,KACAK,WAAW,cAAc,IAAI,UAC7BA,WAAW,cAAc,IAAI,UAC7BD,SAAS,YAAY,EACrB;gBACEA;gBACAT;gBACAC;YACF;SAEH;QAGH,OAAOG;IACT,GACA,CAAC;IAGH,OAAO;QACL,GAAGV,MAAM;QACTS;IACF;AACF"}
@@ -0,0 +1,16 @@
1
+ import type { Datum, FoldInfo, VChartSpecPipe } from '../../../../../types';
2
+ type SankeyDataOptions = {
3
+ foldInfo?: Pick<FoldInfo, 'measureId' | 'measureName'>;
4
+ sourceFields?: string[];
5
+ targetFields?: string[];
6
+ };
7
+ export declare const buildSankeyData: (dataset: Datum[], sourceField: string, targetField: string, valueField: string, options?: SankeyDataOptions) => {
8
+ nodes: Record<string, string | number>[];
9
+ links: ({
10
+ source: number;
11
+ target: number;
12
+ value: number;
13
+ } & Record<string, string | number>)[];
14
+ };
15
+ export declare const datasetSankey: VChartSpecPipe;
16
+ export {};
@@ -0,0 +1,97 @@
1
+ import { ColorEncoding, Separator } from "../../../../../dataReshape/index.js";
2
+ const getNodeInfo = (datum, encodedField, sourceFields, foldInfo)=>{
3
+ const id = String(datum[encodedField] ?? '');
4
+ if (!sourceFields.length) return {
5
+ id,
6
+ nodeName: id
7
+ };
8
+ const nodeName = sourceFields.map((field)=>{
9
+ const value = String(datum[field] ?? '');
10
+ return field === foldInfo?.measureId && foldInfo.measureName && void 0 !== datum[foldInfo.measureName] ? String(datum[foldInfo.measureName]) : value;
11
+ }).join(Separator);
12
+ return {
13
+ id,
14
+ nodeName: nodeName || id
15
+ };
16
+ };
17
+ const buildSankeyData = (dataset, sourceField, targetField, valueField, options = {})=>{
18
+ const nodeIndexMap = new Map();
19
+ const nodeNameMap = new Map();
20
+ const nodeColorMap = new Map();
21
+ const linksMap = new Map();
22
+ const { foldInfo, sourceFields = [], targetFields = [] } = options;
23
+ const ensureNode = (node)=>{
24
+ const { id, nodeName } = node;
25
+ if (!nodeIndexMap.has(id)) {
26
+ nodeIndexMap.set(id, nodeIndexMap.size);
27
+ nodeNameMap.set(id, nodeName);
28
+ }
29
+ return nodeIndexMap.get(id);
30
+ };
31
+ dataset.forEach((datum)=>{
32
+ const sourceNode = getNodeInfo(datum, sourceField, sourceFields, foldInfo);
33
+ const targetNode = getNodeInfo(datum, targetField, targetFields, foldInfo);
34
+ const rawValue = Number(datum[valueField] ?? 0);
35
+ const colorCategory = datum[ColorEncoding];
36
+ const colorCategoryValue = null == colorCategory || '' === colorCategory ? void 0 : String(colorCategory);
37
+ if (!sourceNode.id || !targetNode.id || Number.isNaN(rawValue)) return;
38
+ const source = ensureNode(sourceNode);
39
+ const target = ensureNode(targetNode);
40
+ if (!nodeColorMap.has(sourceNode.id) && colorCategoryValue) nodeColorMap.set(sourceNode.id, colorCategoryValue);
41
+ if (!nodeColorMap.has(targetNode.id) && colorCategoryValue) nodeColorMap.set(targetNode.id, colorCategoryValue);
42
+ const linkKey = `${source}__${target}`;
43
+ const prev = linksMap.get(linkKey);
44
+ if (prev) prev.value += rawValue;
45
+ else {
46
+ const linkDatum = {
47
+ source,
48
+ target,
49
+ value: rawValue,
50
+ sourceNodeName: sourceNode.nodeName,
51
+ targetNodeName: targetNode.nodeName
52
+ };
53
+ if (colorCategoryValue) linkDatum[ColorEncoding] = colorCategoryValue;
54
+ linksMap.set(linkKey, linkDatum);
55
+ }
56
+ });
57
+ const nodes = Array.from(nodeIndexMap.entries()).sort((a, b)=>a[1] - b[1]).map(([id])=>{
58
+ const nodeDatum = {
59
+ id,
60
+ nodeName: nodeNameMap.get(id) || id
61
+ };
62
+ const nodeColor = nodeColorMap.get(id);
63
+ if (nodeColor) nodeDatum[ColorEncoding] = nodeColor;
64
+ return nodeDatum;
65
+ });
66
+ return {
67
+ nodes,
68
+ links: Array.from(linksMap.values())
69
+ };
70
+ };
71
+ const datasetSankey = (spec, context)=>{
72
+ const result = {
73
+ ...spec
74
+ };
75
+ const { advancedVSeed } = context;
76
+ const { dataset = [], datasetReshapeInfo } = advancedVSeed;
77
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
78
+ const sourceFields = advancedVSeed.encoding?.source || [];
79
+ const targetFields = advancedVSeed.encoding?.target || [];
80
+ const graphData = buildSankeyData(dataset, unfoldInfo.encodingSource || 'source', unfoldInfo.encodingTarget || 'target', foldInfo.measureValue, {
81
+ foldInfo,
82
+ sourceFields,
83
+ targetFields
84
+ });
85
+ result.data = [
86
+ {
87
+ id: 'data',
88
+ values: [
89
+ graphData
90
+ ]
91
+ }
92
+ ];
93
+ return result;
94
+ };
95
+ export { buildSankeyData, datasetSankey };
96
+
97
+ //# sourceMappingURL=datasetSankey.js.map