@visactor/vchart 2.1.0-alpha.5 → 2.1.0-alpha.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 (204) hide show
  1. package/build/es5/index.js +1 -1
  2. package/build/index.es.js +344 -227
  3. package/build/index.js +344 -227
  4. package/build/index.min.js +2 -2
  5. package/build/tsconfig.tsbuildinfo +1 -1
  6. package/cjs/chart/base/base-chart.d.ts +1 -0
  7. package/cjs/chart/base/base-chart.js +10 -2
  8. package/cjs/chart/base/base-chart.js.map +1 -1
  9. package/cjs/chart/gauge/gauge-transformer.js +3 -2
  10. package/cjs/chart/gauge/gauge-transformer.js.map +1 -1
  11. package/cjs/chart/polar/polar-transformer.js +1 -1
  12. package/cjs/chart/polar/polar-transformer.js.map +1 -1
  13. package/cjs/chart/polar/progress-like/progress-like-transformer.js +1 -1
  14. package/cjs/chart/polar/progress-like/progress-like-transformer.js.map +1 -1
  15. package/cjs/chart/progress/circular/circular-progress-transformer.js +3 -2
  16. package/cjs/chart/progress/circular/circular-progress-transformer.js.map +1 -1
  17. package/cjs/chart/progress/linear/linear-progress-transformer.js +1 -1
  18. package/cjs/chart/progress/linear/linear-progress-transformer.js.map +1 -1
  19. package/cjs/chart/radar/radar-transformer.js +3 -2
  20. package/cjs/chart/radar/radar-transformer.js.map +1 -1
  21. package/cjs/chart/range-area/range-area-transformer.js +2 -2
  22. package/cjs/chart/range-area/range-area-transformer.js.map +1 -1
  23. package/cjs/chart/rose/rose-transformer.js +2 -1
  24. package/cjs/chart/rose/rose-transformer.js.map +1 -1
  25. package/cjs/component/axis/polar/band-axis.d.ts +2 -0
  26. package/cjs/component/axis/polar/band-axis.js +3 -0
  27. package/cjs/component/axis/polar/band-axis.js.map +1 -1
  28. package/cjs/component/axis/polar/linear-axis.js +3 -0
  29. package/cjs/component/axis/polar/linear-axis.js.map +1 -1
  30. package/cjs/component/indicator/indicator.js +2 -2
  31. package/cjs/component/indicator/indicator.js.map +1 -1
  32. package/cjs/component/indicator/util.d.ts +4 -3
  33. package/cjs/component/indicator/util.js +1 -1
  34. package/cjs/component/indicator/util.js.map +1 -1
  35. package/cjs/core/expression-function.js +1 -1
  36. package/cjs/core/factory.js +1 -1
  37. package/cjs/core/index.js +1 -1
  38. package/cjs/data/data-view-utils.js +1 -1
  39. package/cjs/data/initialize.js +1 -1
  40. package/cjs/data/register.js +1 -1
  41. package/cjs/data/transforms/box-plot.d.ts +4 -1
  42. package/cjs/data/transforms/box-plot.js +3 -3
  43. package/cjs/data/transforms/box-plot.js.map +1 -1
  44. package/cjs/data/transforms/correlation-center.d.ts +11 -4
  45. package/cjs/data/transforms/correlation-center.js +3 -2
  46. package/cjs/data/transforms/correlation-center.js.map +1 -1
  47. package/cjs/data/transforms/correlation.d.ts +18 -15
  48. package/cjs/data/transforms/correlation.js +22 -17
  49. package/cjs/data/transforms/correlation.js.map +1 -1
  50. package/cjs/data/transforms/funnel.d.ts +10 -8
  51. package/cjs/data/transforms/funnel.js +4 -3
  52. package/cjs/data/transforms/funnel.js.map +1 -1
  53. package/cjs/data/transforms/lookup.d.ts +3 -3
  54. package/cjs/data/transforms/lookup.js +12 -7
  55. package/cjs/data/transforms/lookup.js.map +1 -1
  56. package/cjs/data/transforms/map.d.ts +8 -2
  57. package/cjs/data/transforms/map.js +9 -6
  58. package/cjs/data/transforms/map.js.map +1 -1
  59. package/cjs/data/transforms/sankey.d.ts +12 -4
  60. package/cjs/data/transforms/sankey.js +18 -13
  61. package/cjs/data/transforms/sankey.js.map +1 -1
  62. package/cjs/data/transforms/stack-split.d.ts +2 -1
  63. package/cjs/data/transforms/stack-split.js +1 -1
  64. package/cjs/data/transforms/stack-split.js.map +1 -1
  65. package/cjs/data/transforms/treemap.d.ts +5 -3
  66. package/cjs/data/transforms/treemap.js +7 -6
  67. package/cjs/data/transforms/treemap.js.map +1 -1
  68. package/cjs/data/transforms/venn.d.ts +4 -2
  69. package/cjs/data/transforms/venn.js +4 -4
  70. package/cjs/data/transforms/venn.js.map +1 -1
  71. package/cjs/data/transforms/waterfall.d.ts +4 -2
  72. package/cjs/data/transforms/waterfall.js +7 -7
  73. package/cjs/data/transforms/waterfall.js.map +1 -1
  74. package/cjs/series/base/base-series.js +2 -2
  75. package/cjs/series/base/base-series.js.map +1 -1
  76. package/cjs/series/box-plot/box-plot.js +2 -2
  77. package/cjs/series/box-plot/box-plot.js.map +1 -1
  78. package/cjs/series/correlation/correlation.js +13 -11
  79. package/cjs/series/correlation/correlation.js.map +1 -1
  80. package/cjs/series/dot/dot.d.ts +11 -0
  81. package/cjs/series/dot/dot.js +16 -1
  82. package/cjs/series/dot/dot.js.map +1 -1
  83. package/cjs/series/funnel/funnel.js +5 -8
  84. package/cjs/series/funnel/funnel.js.map +1 -1
  85. package/cjs/series/map/map.js +3 -3
  86. package/cjs/series/map/map.js.map +1 -1
  87. package/cjs/series/polar/progress-like/progress-like.d.ts +2 -0
  88. package/cjs/series/polar/progress-like/progress-like.js +16 -1
  89. package/cjs/series/polar/progress-like/progress-like.js.map +1 -1
  90. package/cjs/series/polar/rose-like/rose-like.d.ts +2 -0
  91. package/cjs/series/polar/rose-like/rose-like.js +15 -1
  92. package/cjs/series/polar/rose-like/rose-like.js.map +1 -1
  93. package/cjs/series/progress/circular/circular.js +2 -1
  94. package/cjs/series/progress/circular/circular.js.map +1 -1
  95. package/cjs/series/progress/linear/linear.js +3 -1
  96. package/cjs/series/progress/linear/linear.js.map +1 -1
  97. package/cjs/series/sankey/sankey.js +35 -33
  98. package/cjs/series/sankey/sankey.js.map +1 -1
  99. package/cjs/series/treemap/treemap.js +23 -20
  100. package/cjs/series/treemap/treemap.js.map +1 -1
  101. package/cjs/series/venn/venn.js +2 -2
  102. package/cjs/series/venn/venn.js.map +1 -1
  103. package/cjs/series/waterfall/waterfall.js +26 -20
  104. package/cjs/series/waterfall/waterfall.js.map +1 -1
  105. package/esm/chart/base/base-chart.d.ts +1 -0
  106. package/esm/chart/base/base-chart.js +9 -2
  107. package/esm/chart/base/base-chart.js.map +1 -1
  108. package/esm/chart/gauge/gauge-transformer.js +3 -2
  109. package/esm/chart/gauge/gauge-transformer.js.map +1 -1
  110. package/esm/chart/polar/polar-transformer.js +1 -1
  111. package/esm/chart/polar/polar-transformer.js.map +1 -1
  112. package/esm/chart/polar/progress-like/progress-like-transformer.js +1 -1
  113. package/esm/chart/polar/progress-like/progress-like-transformer.js.map +1 -1
  114. package/esm/chart/progress/circular/circular-progress-transformer.js +3 -2
  115. package/esm/chart/progress/circular/circular-progress-transformer.js.map +1 -1
  116. package/esm/chart/progress/linear/linear-progress-transformer.js +1 -1
  117. package/esm/chart/progress/linear/linear-progress-transformer.js.map +1 -1
  118. package/esm/chart/radar/radar-transformer.js +3 -2
  119. package/esm/chart/radar/radar-transformer.js.map +1 -1
  120. package/esm/chart/range-area/range-area-transformer.js +2 -2
  121. package/esm/chart/range-area/range-area-transformer.js.map +1 -1
  122. package/esm/chart/rose/rose-transformer.js +2 -1
  123. package/esm/chart/rose/rose-transformer.js.map +1 -1
  124. package/esm/component/axis/polar/band-axis.d.ts +2 -0
  125. package/esm/component/axis/polar/band-axis.js +3 -0
  126. package/esm/component/axis/polar/band-axis.js.map +1 -1
  127. package/esm/component/axis/polar/linear-axis.js +3 -0
  128. package/esm/component/axis/polar/linear-axis.js.map +1 -1
  129. package/esm/component/indicator/indicator.js +2 -2
  130. package/esm/component/indicator/indicator.js.map +1 -1
  131. package/esm/component/indicator/util.d.ts +4 -3
  132. package/esm/component/indicator/util.js +2 -2
  133. package/esm/component/indicator/util.js.map +1 -1
  134. package/esm/core/expression-function.js +1 -1
  135. package/esm/core/factory.js +1 -1
  136. package/esm/core/index.js +1 -1
  137. package/esm/data/data-view-utils.js +1 -1
  138. package/esm/data/initialize.js +1 -1
  139. package/esm/data/register.js +1 -1
  140. package/esm/data/transforms/box-plot.d.ts +4 -1
  141. package/esm/data/transforms/box-plot.js +4 -4
  142. package/esm/data/transforms/box-plot.js.map +1 -1
  143. package/esm/data/transforms/correlation-center.d.ts +11 -4
  144. package/esm/data/transforms/correlation-center.js +4 -2
  145. package/esm/data/transforms/correlation-center.js.map +1 -1
  146. package/esm/data/transforms/correlation.d.ts +18 -15
  147. package/esm/data/transforms/correlation.js +13 -8
  148. package/esm/data/transforms/correlation.js.map +1 -1
  149. package/esm/data/transforms/funnel.d.ts +10 -8
  150. package/esm/data/transforms/funnel.js +5 -3
  151. package/esm/data/transforms/funnel.js.map +1 -1
  152. package/esm/data/transforms/lookup.d.ts +3 -3
  153. package/esm/data/transforms/lookup.js +12 -6
  154. package/esm/data/transforms/lookup.js.map +1 -1
  155. package/esm/data/transforms/map.d.ts +8 -2
  156. package/esm/data/transforms/map.js +11 -6
  157. package/esm/data/transforms/map.js.map +1 -1
  158. package/esm/data/transforms/sankey.d.ts +12 -4
  159. package/esm/data/transforms/sankey.js +19 -14
  160. package/esm/data/transforms/sankey.js.map +1 -1
  161. package/esm/data/transforms/stack-split.d.ts +2 -1
  162. package/esm/data/transforms/stack-split.js +2 -2
  163. package/esm/data/transforms/stack-split.js.map +1 -1
  164. package/esm/data/transforms/treemap.d.ts +5 -3
  165. package/esm/data/transforms/treemap.js +8 -5
  166. package/esm/data/transforms/treemap.js.map +1 -1
  167. package/esm/data/transforms/venn.d.ts +4 -2
  168. package/esm/data/transforms/venn.js +5 -3
  169. package/esm/data/transforms/venn.js.map +1 -1
  170. package/esm/data/transforms/waterfall.d.ts +4 -2
  171. package/esm/data/transforms/waterfall.js +7 -8
  172. package/esm/data/transforms/waterfall.js.map +1 -1
  173. package/esm/series/base/base-series.js +2 -2
  174. package/esm/series/base/base-series.js.map +1 -1
  175. package/esm/series/box-plot/box-plot.js +2 -2
  176. package/esm/series/box-plot/box-plot.js.map +1 -1
  177. package/esm/series/correlation/correlation.js +13 -11
  178. package/esm/series/correlation/correlation.js.map +1 -1
  179. package/esm/series/dot/dot.d.ts +11 -0
  180. package/esm/series/dot/dot.js +17 -0
  181. package/esm/series/dot/dot.js.map +1 -1
  182. package/esm/series/funnel/funnel.js +5 -8
  183. package/esm/series/funnel/funnel.js.map +1 -1
  184. package/esm/series/map/map.js +3 -3
  185. package/esm/series/map/map.js.map +1 -1
  186. package/esm/series/polar/progress-like/progress-like.d.ts +2 -0
  187. package/esm/series/polar/progress-like/progress-like.js +17 -0
  188. package/esm/series/polar/progress-like/progress-like.js.map +1 -1
  189. package/esm/series/polar/rose-like/rose-like.d.ts +2 -0
  190. package/esm/series/polar/rose-like/rose-like.js +16 -0
  191. package/esm/series/polar/rose-like/rose-like.js.map +1 -1
  192. package/esm/series/progress/circular/circular.js +2 -1
  193. package/esm/series/progress/circular/circular.js.map +1 -1
  194. package/esm/series/progress/linear/linear.js +3 -1
  195. package/esm/series/progress/linear/linear.js.map +1 -1
  196. package/esm/series/sankey/sankey.js +35 -33
  197. package/esm/series/sankey/sankey.js.map +1 -1
  198. package/esm/series/treemap/treemap.js +23 -20
  199. package/esm/series/treemap/treemap.js.map +1 -1
  200. package/esm/series/venn/venn.js +2 -2
  201. package/esm/series/venn/venn.js.map +1 -1
  202. package/esm/series/waterfall/waterfall.js +26 -20
  203. package/esm/series/waterfall/waterfall.js.map +1 -1
  204. package/package.json +10 -10
@@ -1,4 +1,11 @@
1
- export declare const correlationCenter: (data: any, options: any) => {
2
- [x: string]: any;
3
- [x: number]: any;
4
- };
1
+ type CorrelationCenterOptionValue<T> = T | (() => T);
2
+ type CorrelationCenterData = Array<{
3
+ latestData: Array<Record<string, unknown>>;
4
+ }>;
5
+ export interface ICorrelationCenterOpt {
6
+ keyword: CorrelationCenterOptionValue<string>;
7
+ categoryField: CorrelationCenterOptionValue<string>;
8
+ }
9
+ export declare const correlationCenter: (data: CorrelationCenterData, options: ICorrelationCenterOpt) => Record<string, unknown> | [
10
+ ];
11
+ export {};
@@ -1,10 +1,12 @@
1
- import { isArray } from "@visactor/vutils";
1
+ import { isArray, isFunction } from "@visactor/vutils";
2
2
 
3
3
  import { DEFAULT_DATA_INDEX, DEFAULT_DATA_SERIES_FIELD } from "../../constant/data";
4
4
 
5
+ const resolveOptionValue = option => isFunction(option) ? option() : option;
6
+
5
7
  export const correlationCenter = (data, options) => {
6
8
  if (!data || !isArray(data)) return [];
7
- const {keyword: keyword, categoryField: categoryField} = options, nodeInfo = data[0].latestData[0];
9
+ const keyword = resolveOptionValue(options.keyword), categoryField = resolveOptionValue(options.categoryField), nodeInfo = data[0].latestData[0];
8
10
  return {
9
11
  [categoryField]: keyword,
10
12
  [DEFAULT_DATA_INDEX]: null == nodeInfo ? void 0 : nodeInfo[DEFAULT_DATA_INDEX],
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/transforms/correlation-center.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAS,EAAE,OAAY,EAAE,EAAE;IAC3D,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC3B,OAAO,EAAE,CAAC;KACX;IAED,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAE3C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEvC,MAAM,UAAU,GAAG;QACjB,CAAC,aAAa,CAAC,EAAE,OAAO;QACxB,CAAC,kBAAkB,CAAC,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,kBAAkB,CAAC;QACpD,CAAC,yBAAyB,CAAC,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,yBAAyB,CAAC;KACnE,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC","file":"correlation-center.js","sourcesContent":["import { isArray } from '@visactor/vutils';\nimport { DEFAULT_DATA_INDEX, DEFAULT_DATA_SERIES_FIELD } from '../../constant/data';\n\nexport const correlationCenter = (data: any, options: any) => {\n if (!data || !isArray(data)) {\n return [];\n }\n\n const { keyword, categoryField } = options;\n\n const nodeInfo = data[0].latestData[0];\n\n const centerInfo = {\n [categoryField]: keyword,\n [DEFAULT_DATA_INDEX]: nodeInfo?.[DEFAULT_DATA_INDEX],\n [DEFAULT_DATA_SERIES_FIELD]: nodeInfo?.[DEFAULT_DATA_SERIES_FIELD]\n };\n\n return centerInfo;\n};\n"]}
1
+ {"version":3,"sources":["../src/data/transforms/correlation-center.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAUpF,MAAM,kBAAkB,GAAG,CAAI,MAAuC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAA2B,EAC3B,OAA8B,EACA,EAAE;IAChC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC3B,OAAO,EAAE,CAAC;KACX;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEvC,MAAM,UAAU,GAAG;QACjB,CAAC,aAAa,CAAC,EAAE,OAAO;QACxB,CAAC,kBAAkB,CAAC,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,kBAAkB,CAAC;QACpD,CAAC,yBAAyB,CAAC,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,yBAAyB,CAAC;KACnE,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC","file":"correlation-center.js","sourcesContent":["import { isArray, isFunction } from '@visactor/vutils';\nimport { DEFAULT_DATA_INDEX, DEFAULT_DATA_SERIES_FIELD } from '../../constant/data';\n\ntype CorrelationCenterOptionValue<T> = T | (() => T);\ntype CorrelationCenterData = Array<{ latestData: Array<Record<string, unknown>> }>;\n\nexport interface ICorrelationCenterOpt {\n keyword: CorrelationCenterOptionValue<string>;\n categoryField: CorrelationCenterOptionValue<string>;\n}\n\nconst resolveOptionValue = <T>(option: CorrelationCenterOptionValue<T>) => (isFunction(option) ? option() : option);\n\nexport const correlationCenter = (\n data: CorrelationCenterData,\n options: ICorrelationCenterOpt\n): Record<string, unknown> | [] => {\n if (!data || !isArray(data)) {\n return [];\n }\n\n const keyword = resolveOptionValue(options.keyword);\n const categoryField = resolveOptionValue(options.categoryField);\n\n const nodeInfo = data[0].latestData[0];\n\n const centerInfo = {\n [categoryField]: keyword,\n [DEFAULT_DATA_INDEX]: nodeInfo?.[DEFAULT_DATA_INDEX],\n [DEFAULT_DATA_SERIES_FIELD]: nodeInfo?.[DEFAULT_DATA_SERIES_FIELD]\n };\n\n return centerInfo;\n};\n"]}
@@ -1,17 +1,20 @@
1
+ type CorrelationOptionValue<T> = T | (() => T);
1
2
  export interface ICorrelationOpt {
2
- field: string;
3
- radiusField?: string;
4
- radiusRange?: [number, number];
5
- center?: [string | number, string | number];
6
- startAngle?: number;
7
- endAngle?: number;
8
- innerRadius?: string | number;
9
- outerRadius?: string | number;
3
+ view: () => {
4
+ x0: number;
5
+ x1: number;
6
+ y0: number;
7
+ y1: number;
8
+ };
9
+ field: CorrelationOptionValue<string>;
10
+ radiusField?: CorrelationOptionValue<string | undefined>;
11
+ radiusRange?: CorrelationOptionValue<[number, number] | undefined>;
12
+ center?: CorrelationOptionValue<[string | number, string | number] | undefined>;
13
+ startAngle?: CorrelationOptionValue<number | undefined>;
14
+ endAngle?: CorrelationOptionValue<number | undefined>;
15
+ innerRadius?: CorrelationOptionValue<string | number | undefined>;
16
+ outerRadius?: CorrelationOptionValue<string | number | undefined>;
10
17
  }
11
- export interface CircularRelationItem {
12
- x: number;
13
- y: number;
14
- size: number;
15
- datum: any;
16
- }
17
- export declare const correlation: (data: any, options: any) => any;
18
+ export type CircularRelationItem = Record<string, unknown>;
19
+ export declare const correlation: (data: unknown, options: ICorrelationOpt) => unknown;
20
+ export {};
@@ -1,20 +1,22 @@
1
- import { isNil, isNumber, degreeToRadian, isArray, field as getFieldAccessor, extent, toPercent } from "@visactor/vutils";
1
+ import { isNil, isNumber, degreeToRadian, isArray, isFunction, field as getFieldAccessor, extent, toPercent } from "@visactor/vutils";
2
2
 
3
3
  import { CORRELATION_X, CORRELATION_Y, CORRELATION_SIZE } from "../../constant/correlation";
4
4
 
5
+ const resolveOptionValue = option => isFunction(option) ? option() : option;
6
+
5
7
  export const correlation = (data, options) => {
6
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
8
+ var _a, _b, _c, _d, _e, _f, _g, _h;
7
9
  if (!data || !(null == options ? void 0 : options.view) || !isArray(data)) return data;
8
- const viewBox = options.view();
10
+ const dataList = data, viewBox = options.view();
9
11
  if (viewBox.x1 - viewBox.x0 == 0 || viewBox.y1 - viewBox.y0 == 0 || viewBox.x1 - viewBox.x0 == -1 / 0 || viewBox.x1 - viewBox.x0 == 1 / 0 || viewBox.y1 - viewBox.y0 == -1 / 0 || viewBox.y1 - viewBox.y0 == 1 / 0) return data;
10
- const startAngle = degreeToRadian(null !== (_a = options.startAngle) && void 0 !== _a ? _a : -90), endAngle = degreeToRadian(null !== (_b = options.endAngle) && void 0 !== _b ? _b : 270), maxRadius = Math.max((viewBox.x1 - viewBox.x0) / 2, (viewBox.y1 - viewBox.y0) / 2), innerRadius = toPercent(null !== (_c = options.innerRadius) && void 0 !== _c ? _c : 0, maxRadius), outerRadius = toPercent(options.outerRadius, maxRadius), center = [ isNumber(null === (_d = options.center) || void 0 === _d ? void 0 : _d[0]) ? options.center[0] : viewBox.x0 + toPercent(null !== (_f = null === (_e = options.center) || void 0 === _e ? void 0 : _e[0]) && void 0 !== _f ? _f : "50%", viewBox.x1 - viewBox.x0), isNumber(null === (_g = options.center) || void 0 === _g ? void 0 : _g[1]) ? options.center[1] : viewBox.y0 + toPercent(null !== (_j = null === (_h = options.center) || void 0 === _h ? void 0 : _h[1]) && void 0 !== _j ? _j : "50%", viewBox.y1 - viewBox.y0) ], fieldAccessor = getFieldAccessor(options.field), values = data.map(fieldAccessor), [min, max] = extent(values), radiusScale = min === max ? val => (innerRadius + outerRadius) / 2 : val => innerRadius + (outerRadius - innerRadius) * (val - min) / (max - min), sizeAccessor = isNil(options.radiusField) ? fieldAccessor : getFieldAccessor(options.radiusField), defaultSize = null !== (_l = null === (_k = null == options ? void 0 : options.radiusRange) || void 0 === _k ? void 0 : _k[1]) && void 0 !== _l ? _l : 5;
12
+ const startAngle = degreeToRadian(null !== (_a = resolveOptionValue(options.startAngle)) && void 0 !== _a ? _a : -90), endAngle = degreeToRadian(null !== (_b = resolveOptionValue(options.endAngle)) && void 0 !== _b ? _b : 270), maxRadius = Math.max((viewBox.x1 - viewBox.x0) / 2, (viewBox.y1 - viewBox.y0) / 2), innerRadius = toPercent(null !== (_c = resolveOptionValue(options.innerRadius)) && void 0 !== _c ? _c : 0, maxRadius), outerRadius = toPercent(resolveOptionValue(options.outerRadius), maxRadius), centerOption = resolveOptionValue(options.center), center = [ isNumber(null == centerOption ? void 0 : centerOption[0]) ? centerOption[0] : viewBox.x0 + toPercent(null !== (_d = null == centerOption ? void 0 : centerOption[0]) && void 0 !== _d ? _d : "50%", viewBox.x1 - viewBox.x0), isNumber(null == centerOption ? void 0 : centerOption[1]) ? centerOption[1] : viewBox.y0 + toPercent(null !== (_e = null == centerOption ? void 0 : centerOption[1]) && void 0 !== _e ? _e : "50%", viewBox.y1 - viewBox.y0) ], fieldAccessor = getFieldAccessor(resolveOptionValue(options.field)), values = dataList.map(fieldAccessor), [min, max] = extent(values), radiusScale = min === max ? val => (innerRadius + outerRadius) / 2 : val => innerRadius + (outerRadius - innerRadius) * (val - min) / (max - min), radiusField = resolveOptionValue(options.radiusField), radiusRange = resolveOptionValue(options.radiusRange), sizeAccessor = isNil(radiusField) ? fieldAccessor : getFieldAccessor(radiusField), defaultSize = null !== (_f = null == radiusRange ? void 0 : radiusRange[1]) && void 0 !== _f ? _f : 5;
11
13
  let sizeScale = datum => defaultSize;
12
14
  if (sizeAccessor) {
13
- const [minSize, maxSize] = sizeAccessor !== fieldAccessor ? extent(data.map(sizeAccessor)) : [ min, max ], minR = null !== (_o = null === (_m = options.radiusRange) || void 0 === _m ? void 0 : _m[0]) && void 0 !== _o ? _o : 5, maxR = null !== (_q = null === (_p = options.radiusRange) || void 0 === _p ? void 0 : _p[1]) && void 0 !== _q ? _q : 5;
15
+ const [minSize, maxSize] = sizeAccessor !== fieldAccessor ? extent(dataList.map(sizeAccessor)) : [ min, max ], minR = null !== (_g = null == radiusRange ? void 0 : radiusRange[0]) && void 0 !== _g ? _g : 5, maxR = null !== (_h = null == radiusRange ? void 0 : radiusRange[1]) && void 0 !== _h ? _h : 5;
14
16
  minSize !== maxSize && (sizeScale = datum => minR + (maxR - minR) * (sizeAccessor(datum) - minSize) / (maxSize - minSize));
15
17
  }
16
- const minAngle = Math.min(startAngle, endAngle), maxAngle = Math.max(startAngle, endAngle), angles = getPartialAngles(minAngle, maxAngle, data.length), res = [], searchAngle = (maxAngle - minAngle) / 60;
17
- return data.forEach(((datum, index) => {
18
+ const minAngle = Math.min(startAngle, endAngle), maxAngle = Math.max(startAngle, endAngle), angles = getPartialAngles(minAngle, maxAngle, dataList.length), res = [], searchAngle = (maxAngle - minAngle) / 60;
19
+ return dataList.forEach(((datum, index) => {
18
20
  const radius = radiusScale(values[index]), size = sizeScale(datum);
19
21
  let x, y, angle = angles[index];
20
22
  for (let i = 0; i < 60 && (x = center[0] + radius * Math.cos(angle), y = center[1] + radius * Math.sin(angle),
@@ -41,5 +43,8 @@ const getPartialAngles = (minAngle, maxAngle, count) => {
41
43
  startAngle = -1 === stepSign ? maxAngle - offsetAngle : minAngle + offsetAngle,
42
44
  stepIndex >= 2 && (stepAngle /= 2, stepCount *= 2));
43
45
  return res;
44
- }, hasOverlap = (item, arr) => !(!arr || !arr.length) && arr.some((entry => Math.pow(item.x - entry.x, 2) + Math.pow(item.y - entry.y, 2) < Math.pow(item.size + entry.size, 2)));
46
+ }, hasOverlap = (item, arr) => !(!arr || !arr.length) && arr.some((entry => {
47
+ const x = entry.x, y = entry.y, size = entry.size;
48
+ return Math.pow(item.x - x, 2) + Math.pow(item.y - y, 2) < Math.pow(item.size + size, 2);
49
+ }));
45
50
  //# sourceMappingURL=correlation.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/transforms/correlation.ts"],"names":[],"mappings":"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","file":"correlation.js","sourcesContent":["import {\n isNil,\n isNumber,\n degreeToRadian,\n isArray,\n field as getFieldAccessor,\n extent,\n toPercent\n} from '@visactor/vutils';\nimport { CORRELATION_X, CORRELATION_Y, CORRELATION_SIZE } from '../../constant/correlation';\n\nexport interface ICorrelationOpt {\n field: string;\n radiusField?: string;\n radiusRange?: [number, number];\n center?: [string | number, string | number];\n startAngle?: number;\n endAngle?: number;\n innerRadius?: string | number;\n outerRadius?: string | number;\n}\n\nexport interface CircularRelationItem {\n x: number;\n y: number;\n size: number;\n datum: any;\n}\n\nexport const correlation = (data: any, options: any) => {\n if (!data || !options?.view || !isArray(data)) {\n return data;\n }\n\n const viewBox = options.view();\n\n if (\n viewBox.x1 - viewBox.x0 === 0 ||\n viewBox.y1 - viewBox.y0 === 0 ||\n viewBox.x1 - viewBox.x0 === -Infinity ||\n viewBox.x1 - viewBox.x0 === Infinity ||\n viewBox.y1 - viewBox.y0 === -Infinity ||\n viewBox.y1 - viewBox.y0 === Infinity\n ) {\n return data;\n }\n\n const startAngle = degreeToRadian(options.startAngle ?? -90);\n const endAngle = degreeToRadian(options.endAngle ?? 270);\n const maxRadius = Math.max((viewBox.x1 - viewBox.x0) / 2, (viewBox.y1 - viewBox.y0) / 2);\n const innerRadius = toPercent(options.innerRadius ?? 0, maxRadius);\n const outerRadius = toPercent(options.outerRadius, maxRadius);\n\n const center = [\n isNumber(options.center?.[0])\n ? options.center[0]\n : viewBox.x0 + toPercent(options.center?.[0] ?? '50%', viewBox.x1 - viewBox.x0),\n isNumber(options.center?.[1])\n ? options.center[1]\n : viewBox.y0 + toPercent(options.center?.[1] ?? '50%', viewBox.y1 - viewBox.y0)\n ] as [number, number];\n const fieldAccessor = getFieldAccessor(options.field);\n const values = data.map(fieldAccessor);\n const [min, max] = extent(values);\n const radiusScale =\n min === max\n ? (val: number) => (innerRadius + outerRadius) / 2\n : (val: number) => innerRadius + ((outerRadius - innerRadius) * (val - min)) / (max - min);\n\n const sizeAccessor = !isNil(options.radiusField) ? getFieldAccessor(options.radiusField) : fieldAccessor;\n const defaultSize = options?.radiusRange?.[1] ?? 5;\n let sizeScale = (datum: any) => defaultSize;\n\n if (sizeAccessor) {\n const [minSize, maxSize] = sizeAccessor !== fieldAccessor ? extent(data.map(sizeAccessor)) : [min, max];\n const minR = options.radiusRange?.[0] ?? 5;\n const maxR = options.radiusRange?.[1] ?? 5;\n\n if (minSize !== maxSize) {\n sizeScale = (datum: any) => minR + ((maxR - minR) * (sizeAccessor(datum) - minSize)) / (maxSize - minSize);\n }\n }\n\n const minAngle = Math.min(startAngle, endAngle);\n const maxAngle = Math.max(startAngle, endAngle);\n const angles = getPartialAngles(minAngle, maxAngle, data.length);\n\n const res: CircularRelationItem[] = [];\n const searchStep = 60;\n const searchAngle = (maxAngle - minAngle) / searchStep;\n\n data.forEach((datum, index) => {\n const radius = radiusScale(values[index] as number);\n const size = sizeScale(datum);\n let x: number;\n let y: number;\n let angle = angles[index];\n\n for (let i = 0; i < searchStep; i++) {\n x = center[0] + radius * Math.cos(angle);\n y = center[1] + radius * Math.sin(angle);\n\n if (\n hasOverlap({ x, y, size }, res) ||\n x - size < viewBox.x0 ||\n x + size > viewBox.x1 ||\n y - size < viewBox.y0 ||\n y + size > viewBox.y1\n ) {\n if (i < searchStep - 1) {\n angle += searchAngle;\n\n if (angle > maxAngle) {\n angle = minAngle;\n } else if (angle < minAngle) {\n angle = maxAngle;\n }\n }\n continue;\n } else {\n break;\n }\n }\n\n res.push({ [CORRELATION_X]: x, [CORRELATION_Y]: y, [CORRELATION_SIZE]: size, ...datum });\n });\n return res;\n};\n\nconst getPartialAngles = (minAngle: number, maxAngle: number, count: number) => {\n let offsetAngle = 0;\n let stepCount = Math.max(Math.ceil((2 * (maxAngle - minAngle)) / Math.PI), 2);\n let stepAngle = (maxAngle - minAngle) / stepCount;\n let stepIndex = 0;\n let stepSign = 1;\n let i = 0;\n let j = 0;\n const res: number[] = [];\n let startAngle = minAngle;\n\n while (i < count) {\n if (j < stepCount) {\n res.push(startAngle + (j % 2 ? Math.floor(j / 2) + Math.floor(stepCount / 2) : j / 2) * stepAngle * stepSign);\n j++;\n }\n\n i++;\n\n if (j === stepCount) {\n j = 0;\n stepIndex += 1;\n stepSign *= -1;\n\n if (offsetAngle === 0) {\n offsetAngle = stepAngle / 2;\n } else {\n offsetAngle /= 2;\n }\n startAngle = stepSign === -1 ? maxAngle - offsetAngle : minAngle + offsetAngle;\n\n if (stepIndex >= 2) {\n stepAngle /= 2;\n stepCount *= 2;\n }\n }\n }\n\n return res;\n};\n\nconst hasOverlap = (item: Omit<CircularRelationItem, 'datum'>, arr: CircularRelationItem[]) => {\n if (!arr || !arr.length) {\n return false;\n }\n\n return arr.some(entry => {\n return Math.pow(item.x - entry.x, 2) + Math.pow(item.y - entry.y, 2) < Math.pow(item.size + entry.size, 2);\n });\n};\n"]}
1
+ {"version":3,"sources":["../src/data/transforms/correlation.ts"],"names":[],"mappings":"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","file":"correlation.js","sourcesContent":["import {\n isNil,\n isNumber,\n degreeToRadian,\n isArray,\n isFunction,\n field as getFieldAccessor,\n extent,\n toPercent\n} from '@visactor/vutils';\nimport { CORRELATION_X, CORRELATION_Y, CORRELATION_SIZE } from '../../constant/correlation';\n\ntype CorrelationOptionValue<T> = T | (() => T);\ntype CorrelationDatum = Record<string, unknown>;\n\nexport interface ICorrelationOpt {\n view: () => { x0: number; x1: number; y0: number; y1: number };\n field: CorrelationOptionValue<string>;\n radiusField?: CorrelationOptionValue<string | undefined>;\n radiusRange?: CorrelationOptionValue<[number, number] | undefined>;\n center?: CorrelationOptionValue<[string | number, string | number] | undefined>;\n startAngle?: CorrelationOptionValue<number | undefined>;\n endAngle?: CorrelationOptionValue<number | undefined>;\n innerRadius?: CorrelationOptionValue<string | number | undefined>;\n outerRadius?: CorrelationOptionValue<string | number | undefined>;\n}\n\ninterface CorrelationLayoutItem {\n x: number;\n y: number;\n size: number;\n}\n\nexport type CircularRelationItem = Record<string, unknown>;\n\nconst resolveOptionValue = <T>(option: CorrelationOptionValue<T>) => (isFunction(option) ? option() : option);\n\nexport const correlation = (data: unknown, options: ICorrelationOpt) => {\n if (!data || !options?.view || !isArray(data)) {\n return data;\n }\n const dataList = data as CorrelationDatum[];\n\n const viewBox = options.view();\n\n if (\n viewBox.x1 - viewBox.x0 === 0 ||\n viewBox.y1 - viewBox.y0 === 0 ||\n viewBox.x1 - viewBox.x0 === -Infinity ||\n viewBox.x1 - viewBox.x0 === Infinity ||\n viewBox.y1 - viewBox.y0 === -Infinity ||\n viewBox.y1 - viewBox.y0 === Infinity\n ) {\n return data;\n }\n\n const startAngle = degreeToRadian(resolveOptionValue(options.startAngle) ?? -90);\n const endAngle = degreeToRadian(resolveOptionValue(options.endAngle) ?? 270);\n const maxRadius = Math.max((viewBox.x1 - viewBox.x0) / 2, (viewBox.y1 - viewBox.y0) / 2);\n const innerRadius = toPercent(resolveOptionValue(options.innerRadius) ?? 0, maxRadius);\n const outerRadius = toPercent(resolveOptionValue(options.outerRadius), maxRadius);\n const centerOption = resolveOptionValue(options.center);\n\n const center = [\n isNumber(centerOption?.[0])\n ? centerOption[0]\n : viewBox.x0 + toPercent(centerOption?.[0] ?? '50%', viewBox.x1 - viewBox.x0),\n isNumber(centerOption?.[1])\n ? centerOption[1]\n : viewBox.y0 + toPercent(centerOption?.[1] ?? '50%', viewBox.y1 - viewBox.y0)\n ] as [number, number];\n const fieldAccessor = getFieldAccessor(resolveOptionValue(options.field));\n const values = dataList.map(fieldAccessor);\n const [min, max] = extent(values);\n const radiusScale =\n min === max\n ? (val: number) => (innerRadius + outerRadius) / 2\n : (val: number) => innerRadius + ((outerRadius - innerRadius) * (val - min)) / (max - min);\n\n const radiusField = resolveOptionValue(options.radiusField);\n const radiusRange = resolveOptionValue(options.radiusRange);\n const sizeAccessor = !isNil(radiusField) ? getFieldAccessor(radiusField) : fieldAccessor;\n const defaultSize = radiusRange?.[1] ?? 5;\n let sizeScale = (datum: CorrelationDatum) => defaultSize;\n\n if (sizeAccessor) {\n const [minSize, maxSize] = sizeAccessor !== fieldAccessor ? extent(dataList.map(sizeAccessor)) : [min, max];\n const minR = radiusRange?.[0] ?? 5;\n const maxR = radiusRange?.[1] ?? 5;\n\n if (minSize !== maxSize) {\n sizeScale = (datum: CorrelationDatum) =>\n minR + ((maxR - minR) * (sizeAccessor(datum) - minSize)) / (maxSize - minSize);\n }\n }\n\n const minAngle = Math.min(startAngle, endAngle);\n const maxAngle = Math.max(startAngle, endAngle);\n const angles = getPartialAngles(minAngle, maxAngle, dataList.length);\n\n const res: CircularRelationItem[] = [];\n const searchStep = 60;\n const searchAngle = (maxAngle - minAngle) / searchStep;\n\n dataList.forEach((datum, index) => {\n const radius = radiusScale(values[index] as number);\n const size = sizeScale(datum);\n let x: number;\n let y: number;\n let angle = angles[index];\n\n for (let i = 0; i < searchStep; i++) {\n x = center[0] + radius * Math.cos(angle);\n y = center[1] + radius * Math.sin(angle);\n\n if (\n hasOverlap({ x, y, size }, res) ||\n x - size < viewBox.x0 ||\n x + size > viewBox.x1 ||\n y - size < viewBox.y0 ||\n y + size > viewBox.y1\n ) {\n if (i < searchStep - 1) {\n angle += searchAngle;\n\n if (angle > maxAngle) {\n angle = minAngle;\n } else if (angle < minAngle) {\n angle = maxAngle;\n }\n }\n continue;\n } else {\n break;\n }\n }\n\n res.push({ [CORRELATION_X]: x, [CORRELATION_Y]: y, [CORRELATION_SIZE]: size, ...datum });\n });\n return res;\n};\n\nconst getPartialAngles = (minAngle: number, maxAngle: number, count: number) => {\n let offsetAngle = 0;\n let stepCount = Math.max(Math.ceil((2 * (maxAngle - minAngle)) / Math.PI), 2);\n let stepAngle = (maxAngle - minAngle) / stepCount;\n let stepIndex = 0;\n let stepSign = 1;\n let i = 0;\n let j = 0;\n const res: number[] = [];\n let startAngle = minAngle;\n\n while (i < count) {\n if (j < stepCount) {\n res.push(startAngle + (j % 2 ? Math.floor(j / 2) + Math.floor(stepCount / 2) : j / 2) * stepAngle * stepSign);\n j++;\n }\n\n i++;\n\n if (j === stepCount) {\n j = 0;\n stepIndex += 1;\n stepSign *= -1;\n\n if (offsetAngle === 0) {\n offsetAngle = stepAngle / 2;\n } else {\n offsetAngle /= 2;\n }\n startAngle = stepSign === -1 ? maxAngle - offsetAngle : minAngle + offsetAngle;\n\n if (stepIndex >= 2) {\n stepAngle /= 2;\n stepCount *= 2;\n }\n }\n }\n\n return res;\n};\n\nconst hasOverlap = (item: CorrelationLayoutItem, arr: CircularRelationItem[]) => {\n if (!arr || !arr.length) {\n return false;\n }\n\n return arr.some(entry => {\n const x = entry.x as number;\n const y = entry.y as number;\n const size = entry.size as number;\n return Math.pow(item.x - x, 2) + Math.pow(item.y - y, 2) < Math.pow(item.size + size, 2);\n });\n};\n"]}
@@ -1,6 +1,7 @@
1
1
  import type { DataView } from '@visactor/vdataset';
2
+ type FunnelOptionValue<T> = T | (() => T);
2
3
  export interface IFunnelOpt {
3
- valueField: string;
4
+ valueField: FunnelOptionValue<string>;
4
5
  asTransformRatio: string;
5
6
  asReachRatio: string;
6
7
  asHeightRatio: string;
@@ -10,12 +11,12 @@ export interface IFunnelOpt {
10
11
  asCurrentValue: string;
11
12
  asLastValue: string;
12
13
  asNextValue: string;
13
- isCone?: boolean;
14
- heightVisual?: boolean;
15
- range?: {
16
- min: number;
17
- max: number;
18
- };
14
+ isCone?: FunnelOptionValue<boolean | undefined>;
15
+ heightVisual?: FunnelOptionValue<boolean | undefined>;
16
+ range?: FunnelOptionValue<{
17
+ min?: number;
18
+ max?: number;
19
+ } | undefined>;
19
20
  }
20
21
  export declare const funnel: (originData: Array<DataView>, op: IFunnelOpt) => {
21
22
  dataSet: import("@visactor/vdataset").DataSet;
@@ -43,4 +44,5 @@ export declare const funnel: (originData: Array<DataView>, op: IFunnelOpt) => {
43
44
  export interface IFunnelTransformOpt {
44
45
  asIsTransformLevel: string;
45
46
  }
46
- export declare const funnelTransform: (originData: Array<DataView>, op: IFunnelTransformOpt) => any;
47
+ export declare const funnelTransform: (originData: Array<DataView>, op: IFunnelTransformOpt) => Record<string, unknown>[];
48
+ export {};
@@ -1,10 +1,12 @@
1
- import { isValidNumber } from "@visactor/vutils";
1
+ import { isFunction, isValidNumber } from "@visactor/vutils";
2
+
3
+ const resolveOptionValue = option => isFunction(option) ? option() : option;
2
4
 
3
5
  export const funnel = (originData, op) => {
4
- var _a, _b;
6
+ var _a, _b, _c, _d;
5
7
  const data = originData.map((datum => Object.assign({}, datum)));
6
8
  if (!data || 0 === data.length) return data;
7
- const {valueField: valueField, asTransformRatio: asTransformRatio, asReachRatio: asReachRatio, asHeightRatio: asHeightRatio, asValueRatio: asValueRatio, asNextValueRatio: asNextValueRatio, asLastValueRatio: asLastValueRatio, asLastValue: asLastValue, asCurrentValue: asCurrentValue, asNextValue: asNextValue, heightVisual: heightVisual = !1, isCone: isCone = !0, range: range} = op, max = data.reduce(((m, d) => Math.max(m, Number.parseFloat(d[valueField]) || -1 / 0)), -1 / 0), min = data.reduce(((m, d) => Math.min(m, Number.parseFloat(d[valueField]) || 1 / 0)), 1 / 0), rangeArr = [ null !== (_a = null == range ? void 0 : range.min) && void 0 !== _a ? _a : min, null !== (_b = null == range ? void 0 : range.max) && void 0 !== _b ? _b : max ];
9
+ const {asTransformRatio: asTransformRatio, asReachRatio: asReachRatio, asHeightRatio: asHeightRatio, asValueRatio: asValueRatio, asNextValueRatio: asNextValueRatio, asLastValueRatio: asLastValueRatio, asLastValue: asLastValue, asCurrentValue: asCurrentValue, asNextValue: asNextValue} = op, valueField = resolveOptionValue(op.valueField), heightVisual = null !== (_a = resolveOptionValue(op.heightVisual)) && void 0 !== _a && _a, isCone = null === (_b = resolveOptionValue(op.isCone)) || void 0 === _b || _b, range = resolveOptionValue(op.range), max = data.reduce(((m, d) => Math.max(m, Number.parseFloat(d[valueField]) || -1 / 0)), -1 / 0), min = data.reduce(((m, d) => Math.min(m, Number.parseFloat(d[valueField]) || 1 / 0)), 1 / 0), rangeArr = [ null !== (_c = null == range ? void 0 : range.min) && void 0 !== _c ? _c : min, null !== (_d = null == range ? void 0 : range.max) && void 0 !== _d ? _d : max ];
8
10
  return data.forEach(((d, i) => {
9
11
  var _a, _b;
10
12
  const currentValue = Number.parseFloat(d[valueField]), lastValue = Number.parseFloat(null === (_a = data[i - 1]) || void 0 === _a ? void 0 : _a[valueField]), nextValue = Number.parseFloat(null === (_b = data[i + 1]) || void 0 === _b ? void 0 : _b[valueField]), transformRatio = isValidNumber(nextValue * currentValue) && 0 !== currentValue ? nextValue / currentValue : 0, reachRatio = isValidNumber(currentValue * lastValue) && 0 !== lastValue ? currentValue / lastValue : 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/transforms/funnel.ts"],"names":[],"mappings":"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","file":"funnel.js","sourcesContent":["import type { DataView } from '@visactor/vdataset';\nimport { isValidNumber } from '@visactor/vutils';\n\nexport interface IFunnelOpt {\n valueField: string;\n /** 转化率(当前层到下一层的比例) **/\n asTransformRatio: string;\n /** 到达率 (上一层到当前层的比例)*/\n asReachRatio: string;\n /** 高度轴占总量的比例 **/\n asHeightRatio: string;\n /** 当前值大小占比 */\n asValueRatio: string;\n /** 上一层值大小占比 */\n asLastValueRatio: string;\n /** 下一层值大小占比 */\n asNextValueRatio: string;\n /** 当前层的值 */\n asCurrentValue: string;\n /** 上一层的值 **/\n asLastValue: string;\n /** 下一层的值 **/\n asNextValue: string;\n\n /** 最底层漏斗是否为锥形 */\n isCone?: boolean;\n /** 高度是否进行数据映射 **/\n heightVisual?: boolean;\n\n /** 数值范围 */\n range?: { min: number; max: number };\n}\n\nexport const funnel = (originData: Array<DataView>, op: IFunnelOpt) => {\n const data = originData.map(datum => ({ ...datum }));\n if (!data || data.length === 0) {\n return data;\n }\n const {\n valueField,\n asTransformRatio,\n asReachRatio,\n asHeightRatio,\n asValueRatio,\n asNextValueRatio,\n asLastValueRatio,\n asLastValue,\n asCurrentValue,\n asNextValue,\n heightVisual = false,\n isCone = true,\n range\n } = op;\n\n const max = data.reduce((m, d) => Math.max(m, Number.parseFloat(d[valueField]) || -Infinity), -Infinity);\n const min = data.reduce((m, d) => Math.min(m, Number.parseFloat(d[valueField]) || Infinity), Infinity);\n const rangeArr = [range?.min ?? min, range?.max ?? max];\n\n data.forEach((d, i) => {\n const currentValue: number = Number.parseFloat(d[valueField]);\n const lastValue: number = Number.parseFloat(data[i - 1]?.[valueField]);\n const nextValue: number = Number.parseFloat(data[i + 1]?.[valueField]);\n\n const transformRatio =\n !isValidNumber(nextValue * currentValue) || currentValue === 0 ? 0 : nextValue / currentValue;\n const reachRatio = !isValidNumber(currentValue * lastValue) || lastValue === 0 ? 0 : currentValue / lastValue;\n\n asLastValue && (d[asLastValue] = lastValue);\n asNextValue && (d[asNextValue] = nextValue);\n asTransformRatio && (d[asTransformRatio] = transformRatio);\n asReachRatio && (d[asReachRatio] = i === 0 ? 1 : reachRatio);\n asHeightRatio && (d[asHeightRatio] = heightVisual === true ? transformRatio : 1 / data.length);\n asValueRatio && (d[asValueRatio] = currentValue / rangeArr[1]);\n asNextValueRatio &&\n (d[asNextValueRatio] = i === data.length - 1 ? (isCone ? 0 : d[asValueRatio]) : nextValue / rangeArr[1]);\n asLastValueRatio && (d[asLastValueRatio] = i === 0 ? 1 : lastValue / rangeArr[1]);\n asCurrentValue && (d[asCurrentValue] = currentValue);\n });\n\n return data;\n};\n\nexport interface IFunnelTransformOpt {\n asIsTransformLevel: string;\n}\n\nexport const funnelTransform = (originData: Array<DataView>, op: IFunnelTransformOpt) => {\n const data = originData[0]?.latestData?.map((datum: any) => ({ ...datum }));\n if (!data || data.length === 0) {\n return data;\n }\n data.shift();\n data.forEach((d: any) => {\n d[op.asIsTransformLevel] = true;\n });\n return data;\n};\n"]}
1
+ {"version":3,"sources":["../src/data/transforms/funnel.ts"],"names":[],"mappings":"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","file":"funnel.js","sourcesContent":["import type { DataView } from '@visactor/vdataset';\nimport { isFunction, isValidNumber } from '@visactor/vutils';\n\ntype FunnelOptionValue<T> = T | (() => T);\n\nexport interface IFunnelOpt {\n valueField: FunnelOptionValue<string>;\n /** 转化率(当前层到下一层的比例) **/\n asTransformRatio: string;\n /** 到达率 (上一层到当前层的比例)*/\n asReachRatio: string;\n /** 高度轴占总量的比例 **/\n asHeightRatio: string;\n /** 当前值大小占比 */\n asValueRatio: string;\n /** 上一层值大小占比 */\n asLastValueRatio: string;\n /** 下一层值大小占比 */\n asNextValueRatio: string;\n /** 当前层的值 */\n asCurrentValue: string;\n /** 上一层的值 **/\n asLastValue: string;\n /** 下一层的值 **/\n asNextValue: string;\n\n /** 最底层漏斗是否为锥形 */\n isCone?: FunnelOptionValue<boolean | undefined>;\n /** 高度是否进行数据映射 **/\n heightVisual?: FunnelOptionValue<boolean | undefined>;\n\n /** 数值范围 */\n range?: FunnelOptionValue<{ min?: number; max?: number } | undefined>;\n}\n\nconst resolveOptionValue = <T>(option: FunnelOptionValue<T>) => (isFunction(option) ? option() : option);\n\nexport const funnel = (originData: Array<DataView>, op: IFunnelOpt) => {\n const data = originData.map(datum => ({ ...datum }));\n if (!data || data.length === 0) {\n return data;\n }\n const {\n asTransformRatio,\n asReachRatio,\n asHeightRatio,\n asValueRatio,\n asNextValueRatio,\n asLastValueRatio,\n asLastValue,\n asCurrentValue,\n asNextValue,\n } = op;\n const valueField = resolveOptionValue(op.valueField);\n const heightVisual = resolveOptionValue(op.heightVisual) ?? false;\n const isCone = resolveOptionValue(op.isCone) ?? true;\n const range = resolveOptionValue(op.range);\n\n const max = data.reduce((m, d) => Math.max(m, Number.parseFloat(d[valueField]) || -Infinity), -Infinity);\n const min = data.reduce((m, d) => Math.min(m, Number.parseFloat(d[valueField]) || Infinity), Infinity);\n const rangeArr = [range?.min ?? min, range?.max ?? max];\n\n data.forEach((d, i) => {\n const currentValue: number = Number.parseFloat(d[valueField]);\n const lastValue: number = Number.parseFloat(data[i - 1]?.[valueField]);\n const nextValue: number = Number.parseFloat(data[i + 1]?.[valueField]);\n\n const transformRatio =\n !isValidNumber(nextValue * currentValue) || currentValue === 0 ? 0 : nextValue / currentValue;\n const reachRatio = !isValidNumber(currentValue * lastValue) || lastValue === 0 ? 0 : currentValue / lastValue;\n\n asLastValue && (d[asLastValue] = lastValue);\n asNextValue && (d[asNextValue] = nextValue);\n asTransformRatio && (d[asTransformRatio] = transformRatio);\n asReachRatio && (d[asReachRatio] = i === 0 ? 1 : reachRatio);\n asHeightRatio && (d[asHeightRatio] = heightVisual === true ? transformRatio : 1 / data.length);\n asValueRatio && (d[asValueRatio] = currentValue / rangeArr[1]);\n asNextValueRatio &&\n (d[asNextValueRatio] = i === data.length - 1 ? (isCone ? 0 : d[asValueRatio]) : nextValue / rangeArr[1]);\n asLastValueRatio && (d[asLastValueRatio] = i === 0 ? 1 : lastValue / rangeArr[1]);\n asCurrentValue && (d[asCurrentValue] = currentValue);\n });\n\n return data;\n};\n\nexport interface IFunnelTransformOpt {\n asIsTransformLevel: string;\n}\n\nexport const funnelTransform = (originData: Array<DataView>, op: IFunnelTransformOpt) => {\n const data: Array<Record<string, unknown>> | undefined = originData[0]?.latestData?.map(\n (datum: Record<string, unknown>) => ({ ...datum })\n );\n if (!data || data.length === 0) {\n return data;\n }\n data.shift();\n data.forEach(d => {\n d[op.asIsTransformLevel] = true;\n });\n return data;\n};\n"]}
@@ -3,10 +3,10 @@ import type { Datum } from '../../typings';
3
3
  export interface ILookUpOpt {
4
4
  from: () => object[];
5
5
  key: string;
6
- fields: string;
6
+ fields: string | (() => string);
7
7
  values?: string[];
8
8
  as?: string[];
9
- default?: any;
10
- set?: (A: Datum, B: Datum) => void;
9
+ default?: unknown;
10
+ set?: (A: Datum, B?: Datum) => void;
11
11
  }
12
12
  export declare const lookup: (data: Array<DataView>, opt: ILookUpOpt) => DataView[];
@@ -1,22 +1,28 @@
1
1
  import { isFunction, isNil, isValid } from "@visactor/vutils";
2
2
 
3
+ const resolveOptionValue = option => isFunction(option) ? option() : option;
4
+
3
5
  export const lookup = (data, opt) => {
4
- if (!opt.from || !opt.from()) return data;
5
- const fields = opt.fields, key = opt.key, values = opt.values, defaultValue = opt.default, as = opt.as || [ fields ], index = opt.from().reduce((function(map, obj) {
6
- return obj[fields] && map.set(obj[fields], obj), map;
6
+ var _a;
7
+ const fromData = null === (_a = opt.from) || void 0 === _a ? void 0 : _a.call(opt);
8
+ if (!fromData) return data;
9
+ const fields = (option = opt.fields, isFunction(option) ? option() : option);
10
+ var option;
11
+ const key = opt.key, values = opt.values, defaultValue = opt.default, as = opt.as || [ fields ], index = fromData.reduce((function(map, obj) {
12
+ return obj[fields] && map.set(`${obj[fields]}`, obj), map;
7
13
  }), new Map);
8
14
  let set;
9
15
  if (isFunction(opt.set)) set = function(d) {
10
- const v = index.get(d[key]);
16
+ const v = index.get(`${d[key]}`);
11
17
  opt.set(d, v);
12
18
  }; else if (values) {
13
19
  const m = values.length;
14
20
  set = function(d) {
15
- const v = index.get(d[key]);
21
+ const v = index.get(`${d[key]}`);
16
22
  if (isNil(v)) for (let i = 0; i < m; ++i) d[as[i]] = defaultValue; else for (let i = 0; i < m; ++i) d[as[i]] = v[values[i]];
17
23
  };
18
24
  } else set = function(d) {
19
- const v = index.get(d[key]);
25
+ const v = index.get(`${d[key]}`);
20
26
  d[as[0]] = isValid(v) ? v : defaultValue;
21
27
  };
22
28
  return 0 === data.length ? [] : data.map((d => (set(d), d)));
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/transforms/lookup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAc9D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAqB,EAAE,GAAe,EAAE,EAAE;IAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE;QAC5B,OAAO,IAAI,CAAC;KACb;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC;IACjC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,GAAwB,EAAE,GAAG;QACrE,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE;YACf,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3B;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,IAAI,GAAG,EAAkB,CAAC,CAAC;IAE9B,IAAI,GAAqB,CAAC;IAC1B,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACvB,GAAG,GAAG,UAAU,CAAM;YACpB,MAAM,CAAC,GAAI,KAA6B,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChB,CAAC,CAAC;KACH;SAAM,IAAI,MAAM,EAAE;QACjB,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,GAAG,GAAG,UAAU,CAAM;YACpB,MAAM,CAAC,GAAI,KAA6B,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;gBACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;oBAC1B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;iBACzB;aACF;iBAAM;gBACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;oBAC1B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBACzB;aACF;QACH,CAAC,CAAC;KACH;SAAM;QACL,GAAG,GAAG,UAAU,CAAM;YACpB,MAAM,CAAC,GAAI,KAA6B,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QAC3C,CAAC,CAAC;KACH;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO,EAAE,CAAC;KACX;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAClB,GAAG,CAAC,CAAC,CAAC,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","file":"lookup.js","sourcesContent":["import type { DataView } from '@visactor/vdataset';\nimport { isFunction, isNil, isValid } from '@visactor/vutils';\nimport type { Datum } from '../../typings';\n\nexport interface ILookUpOpt {\n from: () => object[];\n key: string;\n // 暂时不支持Multi-field lookup\n fields: string;\n values?: string[];\n as?: string[];\n default?: any;\n set?: (A: Datum, B: Datum) => void;\n}\n\nexport const lookup = (data: Array<DataView>, opt: ILookUpOpt) => {\n if (!opt.from || !opt.from()) {\n return data;\n }\n\n const fields = opt.fields;\n const key = opt.key;\n const values = opt.values;\n const defaultValue = opt.default;\n const as = opt.as || [fields];\n const index = opt.from().reduce(function (map: Map<string, object>, obj) {\n if (obj[fields]) {\n map.set(obj[fields], obj);\n }\n return map;\n }, new Map<string, object>());\n\n let set: (d: any) => void;\n if (isFunction(opt.set)) {\n set = function (d: any) {\n const v = (index as Map<string, object>).get(d[key]);\n opt.set(d, v);\n };\n } else if (values) {\n const m = values.length;\n set = function (d: any) {\n const v = (index as Map<string, object>).get(d[key]);\n if (isNil(v)) {\n for (let i = 0; i < m; ++i) {\n d[as[i]] = defaultValue;\n }\n } else {\n for (let i = 0; i < m; ++i) {\n d[as[i]] = v[values[i]];\n }\n }\n };\n } else {\n set = function (d: any) {\n const v = (index as Map<string, object>).get(d[key]);\n d[as[0]] = isValid(v) ? v : defaultValue;\n };\n }\n\n if (data.length === 0) {\n return [];\n }\n return data.map(d => {\n set(d);\n return d;\n });\n};\n"]}
1
+ {"version":3,"sources":["../src/data/transforms/lookup.ts"],"names":[],"mappings":"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","file":"lookup.js","sourcesContent":["import type { DataView } from '@visactor/vdataset';\nimport { isFunction, isNil, isValid } from '@visactor/vutils';\nimport type { Datum } from '../../typings';\n\nexport interface ILookUpOpt {\n from: () => object[];\n key: string;\n // 暂时不支持Multi-field lookup\n fields: string | (() => string);\n values?: string[];\n as?: string[];\n default?: unknown;\n set?: (A: Datum, B?: Datum) => void;\n}\n\nconst resolveOptionValue = <T>(option: T | (() => T)) => (isFunction(option) ? option() : option);\n\nexport const lookup = (data: Array<DataView>, opt: ILookUpOpt) => {\n const fromData = opt.from?.();\n if (!fromData) {\n return data;\n }\n\n const fields = resolveOptionValue(opt.fields);\n const key = opt.key;\n const values = opt.values;\n const defaultValue = opt.default;\n const as = opt.as || [fields];\n const index = (fromData as Array<Record<string, unknown>>).reduce(function (\n map: Map<string, Record<string, unknown>>,\n obj\n ) {\n if (obj[fields]) {\n map.set(`${obj[fields]}`, obj);\n }\n return map;\n }, new Map<string, Record<string, unknown>>());\n\n let set: (d: Record<string, unknown>) => void;\n if (isFunction(opt.set)) {\n set = function (d: Record<string, unknown>) {\n const v = index.get(`${d[key]}`);\n opt.set(d as Datum, v as Datum);\n };\n } else if (values) {\n const m = values.length;\n set = function (d: Record<string, unknown>) {\n const v = index.get(`${d[key]}`);\n if (isNil(v)) {\n for (let i = 0; i < m; ++i) {\n d[as[i]] = defaultValue;\n }\n } else {\n for (let i = 0; i < m; ++i) {\n d[as[i]] = v[values[i]];\n }\n }\n };\n } else {\n set = function (d: Record<string, unknown>) {\n const v = index.get(`${d[key]}`);\n d[as[0]] = isValid(v) ? v : defaultValue;\n };\n }\n\n if (data.length === 0) {\n return [];\n }\n return (data as unknown as Array<Record<string, unknown>>).map(d => {\n set(d);\n return d;\n }) as unknown as Array<DataView>;\n};\n"]}
@@ -1,6 +1,12 @@
1
1
  import type { GeoSourceType } from '../../typings/geo';
2
2
  export interface IMapOpt {
3
- nameMap: Record<string, string>;
3
+ nameMap: Record<string, unknown>;
4
4
  nameProperty: string;
5
5
  }
6
- export declare const map: (data: GeoSourceType, opt: IMapOpt) => any;
6
+ type MapFeature = {
7
+ properties?: Record<string, unknown>;
8
+ [key: string]: unknown;
9
+ };
10
+ type MapOption = IMapOpt | (() => IMapOpt);
11
+ export declare const map: (data: GeoSourceType, opt: MapOption) => MapFeature[];
12
+ export {};
@@ -1,9 +1,14 @@
1
1
  import { DEFAULT_DATA_INDEX, DEFAULT_MAP_LOOK_UP_KEY } from "../../constant/data";
2
2
 
3
- export const map = (data, opt) => (data.features && data.features.forEach(((f, index) => {
4
- var _a;
5
- f[DEFAULT_DATA_INDEX] = index;
6
- const name = null === (_a = f.properties) || void 0 === _a ? void 0 : _a[opt.nameProperty];
7
- opt.nameMap && opt.nameMap[name] ? f[DEFAULT_MAP_LOOK_UP_KEY] = opt.nameMap[name] : f[DEFAULT_MAP_LOOK_UP_KEY] = name;
8
- })), data.features);
3
+ import { isFunction } from "@visactor/vutils";
4
+
5
+ export const map = (data, opt) => {
6
+ const options = isFunction(opt) ? opt() : opt, features = data.features;
7
+ return features && features.forEach(((f, index) => {
8
+ var _a, _b;
9
+ f[DEFAULT_DATA_INDEX] = index;
10
+ const name = null === (_a = f.properties) || void 0 === _a ? void 0 : _a[options.nameProperty], mappedName = null === (_b = options.nameMap) || void 0 === _b ? void 0 : _b[`${name}`];
11
+ f[DEFAULT_MAP_LOOK_UP_KEY] = mappedName || name;
12
+ })), features;
13
+ };
9
14
  //# sourceMappingURL=map.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/transforms/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AASlF,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAmB,EAAE,GAAY,EAAE,EAAE;IACvD,IAAI,IAAI,CAAC,QAAQ,EAAE;QACjB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,KAAa,EAAE,EAAE;;YAC9C,CAAC,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAA,CAAC,CAAC,UAAU,0CAAG,GAAG,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACpC,CAAC,CAAC,uBAAuB,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAChD;iBAAM;gBACL,CAAC,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC;aACnC;QACH,CAAC,CAAC,CAAC;KACJ;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC,CAAC","file":"map.js","sourcesContent":["import { DEFAULT_DATA_INDEX, DEFAULT_MAP_LOOK_UP_KEY } from '../../constant/data';\nimport { PREFIX } from '../../constant/base';\nimport type { GeoSourceType } from '../../typings/geo';\n\nexport interface IMapOpt {\n nameMap: Record<string, string>;\n nameProperty: string;\n}\n\nexport const map = (data: GeoSourceType, opt: IMapOpt) => {\n if (data.features) {\n data.features.forEach((f: any, index: number) => {\n f[DEFAULT_DATA_INDEX] = index;\n const name = f.properties?.[opt.nameProperty];\n if (opt.nameMap && opt.nameMap[name]) {\n f[DEFAULT_MAP_LOOK_UP_KEY] = opt.nameMap[name];\n } else {\n f[DEFAULT_MAP_LOOK_UP_KEY] = name;\n }\n });\n }\n return data.features;\n};\n"]}
1
+ {"version":3,"sources":["../src/data/transforms/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAElF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAa9C,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAmB,EAAE,GAAc,EAAE,EAAE;IACzD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,MAAM,QAAQ,GAAI,IAAoC,CAAC,QAAQ,CAAC;IAChE,IAAI,QAAQ,EAAE;QACZ,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAa,EAAE,EAAE;;YACpC,CAAC,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAA,CAAC,CAAC,UAAU,0CAAG,OAAO,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,MAAA,OAAO,CAAC,OAAO,0CAAG,GAAG,IAAI,EAAE,CAAC,CAAC;YAChD,IAAI,UAAU,EAAE;gBACd,CAAC,CAAC,uBAAuB,CAAC,GAAG,UAAU,CAAC;aACzC;iBAAM;gBACL,CAAC,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC;aACnC;QACH,CAAC,CAAC,CAAC;KACJ;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC","file":"map.js","sourcesContent":["import { DEFAULT_DATA_INDEX, DEFAULT_MAP_LOOK_UP_KEY } from '../../constant/data';\nimport type { GeoSourceType } from '../../typings/geo';\nimport { isFunction } from '@visactor/vutils';\n\nexport interface IMapOpt {\n nameMap: Record<string, unknown>;\n nameProperty: string;\n}\n\ntype MapFeature = {\n properties?: Record<string, unknown>;\n [key: string]: unknown;\n};\ntype MapOption = IMapOpt | (() => IMapOpt);\n\nexport const map = (data: GeoSourceType, opt: MapOption) => {\n const options = isFunction(opt) ? opt() : opt;\n const features = (data as { features?: MapFeature[] }).features;\n if (features) {\n features.forEach((f, index: number) => {\n f[DEFAULT_DATA_INDEX] = index;\n const name = f.properties?.[options.nameProperty];\n const mappedName = options.nameMap?.[`${name}`];\n if (mappedName) {\n f[DEFAULT_MAP_LOOK_UP_KEY] = mappedName;\n } else {\n f[DEFAULT_MAP_LOOK_UP_KEY] = name;\n }\n });\n }\n return features;\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { SankeyOptions, SankeyData } from '@visactor/vlayouts';
1
+ import { type SankeyOptions, type SankeyData } from '@visactor/vlayouts';
2
2
  export interface ISankeyOpt extends SankeyOptions {
3
3
  targetField: string;
4
4
  sourceField: string;
@@ -10,10 +10,18 @@ export interface ISankeyOpt extends SankeyOptions {
10
10
  y1: number;
11
11
  };
12
12
  }
13
- export declare const collectHierarchyField: (set: Set<any>, data: any[], field: string) => void;
14
- export declare const sankeyFormat: (data: any[]) => SankeyData[];
15
- export declare const sankeyLayout: (data: SankeyData[], op: ISankeyOpt) => {
13
+ type SankeyLayoutOption = ISankeyOpt | (() => ISankeyOpt);
14
+ type SankeyFormatDatum = Record<string, unknown> & {
15
+ id?: 'links' | 'nodes';
16
+ values?: unknown;
17
+ latestData?: SankeyData[];
18
+ children?: SankeyFormatDatum[];
19
+ };
20
+ export declare const collectHierarchyField: <T>(set: Set<T>, data: SankeyFormatDatum[], field: string) => void;
21
+ export declare const sankeyFormat: (data: SankeyFormatDatum[]) => SankeyData[];
22
+ export declare const sankeyLayout: (data: SankeyData[], op: SankeyLayoutOption) => {
16
23
  nodes: import("@visactor/vlayouts").SankeyNodeElement[];
17
24
  links: import("@visactor/vlayouts").SankeyLinkElement[];
18
25
  columns: import("@visactor/vlayouts").SankeyNodeElement[][];
19
26
  }[];
27
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { SankeyLayout } from "@visactor/vlayouts";
2
2
 
3
- import { isArray, isNil } from "@visactor/vutils";
3
+ import { isArray, isFunction, isNil } from "@visactor/vutils";
4
4
 
5
5
  export const collectHierarchyField = (set, data, field) => {
6
6
  data.forEach((obj => {
@@ -24,19 +24,24 @@ export const sankeyFormat = data => {
24
24
  };
25
25
 
26
26
  export const sankeyLayout = (data, op) => {
27
- if (!data || !(null == op ? void 0 : op.view) || !data.length) return [];
28
- const view = op.view();
27
+ const options = isFunction(op) ? op() : op;
28
+ if (!data || !(null == options ? void 0 : options.view) || !data.length) return [];
29
+ const view = options.view();
29
30
  if (view.x1 - view.x0 == 0 || view.y1 - view.y0 == 0 || view.x1 - view.x0 == -1 / 0 || view.x1 - view.x0 == 1 / 0 || view.y1 - view.y0 == -1 / 0 || view.y1 - view.y0 == 1 / 0) return [];
30
- const originalData = data[0];
31
- if (("source" !== op.sourceField || "target" !== op.targetField || "value" !== op.valueField) && originalData.links) {
32
- const updatedData = [];
33
- originalData.links.forEach((datum => {
34
- const updatedDatum = {};
35
- for (const key in datum) key === op.sourceField ? updatedDatum.source = datum[op.sourceField] : key === op.targetField ? updatedDatum.target = datum[op.targetField] : key === op.valueField ? updatedDatum.value = datum[op.valueField] : updatedDatum[key] = datum[key];
36
- updatedData.push(updatedDatum);
37
- })), originalData.links = updatedData;
38
- }
39
- const layout = new SankeyLayout(op), result = [];
40
- return result.push(layout.layout(originalData, view)), result;
31
+ const originalData = data[0], layoutData = normalizeSankeyData(originalData, options), layout = new SankeyLayout(options), result = [];
32
+ return result.push(layout.layout(layoutData, view)), result;
33
+ };
34
+
35
+ const normalizeSankeyData = (data, options) => {
36
+ if ("source" === options.sourceField && "target" === options.targetField && "value" === options.valueField) return data;
37
+ const links = data.links;
38
+ return links ? Object.assign(Object.assign({}, data), {
39
+ links: links.map((link => {
40
+ const updatedLink = {};
41
+ return Object.keys(link).forEach((key => {
42
+ key === options.sourceField ? updatedLink.source = link[options.sourceField] : key === options.targetField ? updatedLink.target = link[options.targetField] : key === options.valueField ? updatedLink.value = link[options.valueField] : updatedLink[key] = link[key];
43
+ })), updatedLink;
44
+ }))
45
+ }) : data;
41
46
  };
42
47
  //# sourceMappingURL=sankey.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/transforms/sankey.ts"],"names":[],"mappings":"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","file":"sankey.js","sourcesContent":["import type { SankeyOptions, SankeyData } from '@visactor/vlayouts';\nimport { SankeyLayout } from '@visactor/vlayouts';\nimport { isArray, isNil } from '@visactor/vutils';\n\nexport interface ISankeyOpt extends SankeyOptions {\n targetField: string;\n sourceField: string;\n valueField: string;\n view: () => { x0: number; x1: number; y0: number; y1: number };\n}\n\nexport const collectHierarchyField = (set: Set<any>, data: any[], field: string) => {\n data.forEach((obj: any) => {\n if (!isNil(obj[field])) {\n set.add(obj[field]);\n }\n\n if (obj.children && obj.children.length > 0) {\n collectHierarchyField(set, obj.children, field); // 递归处理子节点\n }\n });\n};\n\nexport const sankeyFormat = (data: any[]): SankeyData[] => {\n if (!data || !isArray(data)) {\n return [] as SankeyData[];\n }\n\n if (data.length > 1) {\n /**\n * data structure for Fengshen:\n * [{id:’nodes’, values:[xxx]},{id:’links’, values:[xxx]}]\n */\n const updateData: SankeyData = {\n links: [],\n nodes: []\n };\n data.forEach((datum: any) => {\n if (datum.id === 'links' || datum.id === 'nodes') {\n updateData[datum.id] = datum.values;\n }\n });\n return [updateData];\n }\n /**\n * data structure:\n * [{nodes: [xxx], links: [xxx]}]\n */\n if (data[0]?.latestData) {\n return data[0].latestData;\n }\n return data;\n};\n\nexport const sankeyLayout = (data: SankeyData[], op: ISankeyOpt) => {\n if (!data || !op?.view || !data.length) {\n return [];\n }\n\n const view = op.view();\n\n if (\n view.x1 - view.x0 === 0 ||\n view.y1 - view.y0 === 0 ||\n view.x1 - view.x0 === -Infinity ||\n view.x1 - view.x0 === Infinity ||\n view.y1 - view.y0 === -Infinity ||\n view.y1 - view.y0 === Infinity\n ) {\n return [];\n }\n\n const originalData = data[0];\n\n if (op.sourceField !== 'source' || op.targetField !== 'target' || op.valueField !== 'value') {\n if ((originalData as any).links) {\n const updatedData: {}[] = [];\n\n (originalData as any).links.forEach((datum: any) => {\n const updatedDatum: any = {};\n for (const key in datum) {\n if (key === op.sourceField) {\n updatedDatum.source = datum[op.sourceField];\n } else if (key === op.targetField) {\n updatedDatum.target = datum[op.targetField];\n } else if (key === op.valueField) {\n updatedDatum.value = datum[op.valueField];\n } else {\n updatedDatum[key] = datum[key];\n }\n }\n updatedData.push(updatedDatum);\n });\n (originalData as any).links = updatedData;\n }\n }\n\n const layout = new SankeyLayout(op);\n\n const result = [];\n\n result.push(layout.layout(originalData, view));\n\n return result;\n};\n"]}
1
+ {"version":3,"sources":["../src/data/transforms/sankey.ts"],"names":[],"mappings":"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","file":"sankey.js","sourcesContent":["import { SankeyLayout, type SankeyOptions, type SankeyData } from '@visactor/vlayouts';\nimport { isArray, isFunction, isNil } from '@visactor/vutils';\n\nexport interface ISankeyOpt extends SankeyOptions {\n targetField: string;\n sourceField: string;\n valueField: string;\n view: () => { x0: number; x1: number; y0: number; y1: number };\n}\n\ntype SankeyLayoutOption = ISankeyOpt | (() => ISankeyOpt);\ntype SankeyFormatDatum = Record<string, unknown> & {\n id?: 'links' | 'nodes';\n values?: unknown;\n latestData?: SankeyData[];\n children?: SankeyFormatDatum[];\n};\n\nexport const collectHierarchyField = <T>(set: Set<T>, data: SankeyFormatDatum[], field: string) => {\n data.forEach(obj => {\n if (!isNil(obj[field])) {\n set.add(obj[field] as T);\n }\n\n if (obj.children && obj.children.length > 0) {\n collectHierarchyField(set, obj.children, field); // 递归处理子节点\n }\n });\n};\n\nexport const sankeyFormat = (data: SankeyFormatDatum[]): SankeyData[] => {\n if (!data || !isArray(data)) {\n return [] as SankeyData[];\n }\n\n if (data.length > 1) {\n /**\n * data structure for Fengshen:\n * [{id:’nodes’, values:[xxx]},{id:’links’, values:[xxx]}]\n */\n const updateData: SankeyData = {\n links: [],\n nodes: []\n };\n data.forEach(datum => {\n if (datum.id === 'links' || datum.id === 'nodes') {\n (updateData as Record<string, unknown>)[datum.id] = datum.values;\n }\n });\n return [updateData];\n }\n /**\n * data structure:\n * [{nodes: [xxx], links: [xxx]}]\n */\n if (data[0]?.latestData) {\n return data[0].latestData;\n }\n return data as unknown as SankeyData[];\n};\n\nexport const sankeyLayout = (data: SankeyData[], op: SankeyLayoutOption) => {\n const options = isFunction(op) ? op() : op;\n if (!data || !options?.view || !data.length) {\n return [];\n }\n\n const view = options.view();\n\n if (\n view.x1 - view.x0 === 0 ||\n view.y1 - view.y0 === 0 ||\n view.x1 - view.x0 === -Infinity ||\n view.x1 - view.x0 === Infinity ||\n view.y1 - view.y0 === -Infinity ||\n view.y1 - view.y0 === Infinity\n ) {\n return [];\n }\n\n const originalData = data[0];\n const layoutData = normalizeSankeyData(originalData, options);\n\n const layout = new SankeyLayout(options);\n\n const result = [];\n\n result.push(layout.layout(layoutData, view));\n\n return result;\n};\n\nconst normalizeSankeyData = (data: SankeyData, options: ISankeyOpt): SankeyData => {\n if (\n options.sourceField === 'source' &&\n options.targetField === 'target' &&\n options.valueField === 'value'\n ) {\n return data;\n }\n\n const links = (data as { links?: Array<Record<string, unknown>> }).links;\n if (!links) {\n return data;\n }\n\n return {\n ...data,\n links: links.map(link => {\n const updatedLink: Record<string, unknown> = {};\n Object.keys(link).forEach(key => {\n if (key === options.sourceField) {\n updatedLink.source = link[options.sourceField];\n } else if (key === options.targetField) {\n updatedLink.target = link[options.targetField];\n } else if (key === options.valueField) {\n updatedLink.value = link[options.valueField];\n } else {\n updatedLink[key] = link[key];\n }\n });\n return updatedLink;\n })\n } as unknown as SankeyData;\n};\n"]}
@@ -3,4 +3,5 @@ import type { DataView } from '@visactor/vdataset';
3
3
  export interface IStackOption {
4
4
  fields: string[];
5
5
  }
6
- export declare const stackSplit: (data: Array<DataView>, op: IStackOption) => ISeriesStackDataNode;
6
+ export type StackOption = IStackOption | (() => IStackOption);
7
+ export declare const stackSplit: (data: Array<DataView>, op: StackOption) => ISeriesStackDataNode;
@@ -1,9 +1,9 @@
1
- import { isNil } from "@visactor/vutils";
1
+ import { isFunction, isNil } from "@visactor/vutils";
2
2
 
3
3
  export const stackSplit = (data, op) => {
4
4
  const result = {
5
5
  nodes: {}
6
- }, {fields: fields} = op;
6
+ }, {fields: fields} = isFunction(op) ? op() : op;
7
7
  if (!(null == fields ? void 0 : fields.length)) return result;
8
8
  const lastFieldIndex = fields.length - 1;
9
9
  let nextNode, leaf, temp = result;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data/transforms/stack-split.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAQzC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAqB,EAAE,EAAgB,EAAE,EAAE;IACpE,MAAM,MAAM,GAAqB;QAC/B,KAAK,EAAE,EAAE;KACV,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACtB,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA,EAAE;QACnB,OAAO,MAAM,CAAC;KACf;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,GAAyB,MAAM,CAAC;IACxC,IAAI,QAA8B,CAAC;IACnC,IAAI,IAA0B,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;QAChB,EAAE,CAAC,UAAU;YACX,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAQ,EAAE,EAAE;gBACjC,IAAI,GAAG,MAAM,CAAC;gBACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACtC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACpB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChB,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE;wBACb,MAAM;qBACP;oBACD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;wBACnB,IAAI,CAAC,KAAK,cAAc,EAAE;4BACxB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;yBACjC;6BAAM;4BACL,QAAQ,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;4BACzB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;yBAC3B;qBACF;oBACD,IAAI,CAAC,KAAK,cAAc,EAAE;wBACxB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAyB,CAAC;wBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBACrB;yBAAM;wBACL,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAyB,CAAC;qBAC/C;iBACF;YACH,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","file":"stack-split.js","sourcesContent":["import type { ISeriesStackData, ISeriesStackDataLeaf, ISeriesStackDataNode } from '../../series/interface';\nimport { isNil } from '@visactor/vutils';\nimport type { DataView } from '@visactor/vdataset';\nimport type { Datum } from '../../typings';\n\nexport interface IStackOption {\n fields: string[];\n}\n\nexport const stackSplit = (data: Array<DataView>, op: IStackOption) => {\n const result: ISeriesStackData = {\n nodes: {}\n };\n const { fields } = op;\n if (!fields?.length) {\n return result;\n }\n const lastFieldIndex = fields.length - 1;\n let temp: ISeriesStackDataNode = result;\n let nextNode: ISeriesStackDataNode;\n let leaf: ISeriesStackDataLeaf;\n data.forEach(dv => {\n dv.latestData &&\n dv.latestData.forEach((d: Datum) => {\n temp = result;\n for (let i = 0; i < fields.length; i++) {\n const f = fields[i];\n const fV = d[f];\n if (isNil(fV)) {\n break;\n }\n temp.groupField = f;\n if (!temp.nodes[fV]) {\n if (i === lastFieldIndex) {\n temp.nodes[fV] = { values: [] };\n } else {\n nextNode = { nodes: {} };\n temp.nodes[fV] = nextNode;\n }\n }\n if (i === lastFieldIndex) {\n leaf = temp.nodes[fV] as ISeriesStackDataLeaf;\n leaf.values.push(d);\n } else {\n temp = temp.nodes[fV] as ISeriesStackDataNode;\n }\n }\n });\n });\n return result;\n};\n"]}
1
+ {"version":3,"sources":["../src/data/transforms/stack-split.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAUrD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAqB,EAAE,EAAe,EAAE,EAAE;IACnE,MAAM,MAAM,GAAqB;QAC/B,KAAK,EAAE,EAAE;KACV,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA,EAAE;QACnB,OAAO,MAAM,CAAC;KACf;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,GAAyB,MAAM,CAAC;IACxC,IAAI,QAA8B,CAAC;IACnC,IAAI,IAA0B,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;QAChB,EAAE,CAAC,UAAU;YACX,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAQ,EAAE,EAAE;gBACjC,IAAI,GAAG,MAAM,CAAC;gBACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACtC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACpB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChB,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE;wBACb,MAAM;qBACP;oBACD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;wBACnB,IAAI,CAAC,KAAK,cAAc,EAAE;4BACxB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;yBACjC;6BAAM;4BACL,QAAQ,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;4BACzB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;yBAC3B;qBACF;oBACD,IAAI,CAAC,KAAK,cAAc,EAAE;wBACxB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAyB,CAAC;wBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBACrB;yBAAM;wBACL,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAyB,CAAC;qBAC/C;iBACF;YACH,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","file":"stack-split.js","sourcesContent":["import type { ISeriesStackData, ISeriesStackDataLeaf, ISeriesStackDataNode } from '../../series/interface';\nimport { isFunction, isNil } from '@visactor/vutils';\nimport type { DataView } from '@visactor/vdataset';\nimport type { Datum } from '../../typings';\n\nexport interface IStackOption {\n fields: string[];\n}\n\nexport type StackOption = IStackOption | (() => IStackOption);\n\nexport const stackSplit = (data: Array<DataView>, op: StackOption) => {\n const result: ISeriesStackData = {\n nodes: {}\n };\n const { fields } = isFunction(op) ? op() : op;\n if (!fields?.length) {\n return result;\n }\n const lastFieldIndex = fields.length - 1;\n let temp: ISeriesStackDataNode = result;\n let nextNode: ISeriesStackDataNode;\n let leaf: ISeriesStackDataLeaf;\n data.forEach(dv => {\n dv.latestData &&\n dv.latestData.forEach((d: Datum) => {\n temp = result;\n for (let i = 0; i < fields.length; i++) {\n const f = fields[i];\n const fV = d[f];\n if (isNil(fV)) {\n break;\n }\n temp.groupField = f;\n if (!temp.nodes[fV]) {\n if (i === lastFieldIndex) {\n temp.nodes[fV] = { values: [] };\n } else {\n nextNode = { nodes: {} };\n temp.nodes[fV] = nextNode;\n }\n }\n if (i === lastFieldIndex) {\n leaf = temp.nodes[fV] as ISeriesStackDataLeaf;\n leaf.values.push(d);\n } else {\n temp = temp.nodes[fV] as ISeriesStackDataNode;\n }\n }\n });\n });\n return result;\n};\n"]}
@@ -1,5 +1,5 @@
1
- import type { TreemapNodeElement, TreemapOptions } from '@visactor/vlayouts';
2
- export declare const treemapLayout: (data: Array<any>, op: TreemapOptions & {
1
+ import { type TreemapNodeElement, type TreemapOptions } from '@visactor/vlayouts';
2
+ interface ITreemapLayoutOptions extends TreemapOptions {
3
3
  getViewBox: () => {
4
4
  x0: number;
5
5
  x1: number;
@@ -7,4 +7,6 @@ export declare const treemapLayout: (data: Array<any>, op: TreemapOptions & {
7
7
  y1: number;
8
8
  };
9
9
  nameField: string;
10
- }) => TreemapNodeElement[];
10
+ }
11
+ export declare const treemapLayout: (data: Array<Record<string, unknown>>, op: ITreemapLayoutOptions | (() => ITreemapLayoutOptions)) => TreemapNodeElement[];
12
+ export {};