@sentropic/dataviz-core 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/aggregate.d.ts +4 -4
  2. package/dist/aggregate.d.ts.map +1 -1
  3. package/dist/aggregate.js +13 -7
  4. package/dist/aggregate.js.map +1 -1
  5. package/dist/analytics.d.ts +105 -0
  6. package/dist/analytics.d.ts.map +1 -0
  7. package/dist/analytics.js +323 -0
  8. package/dist/analytics.js.map +1 -0
  9. package/dist/categorical.d.ts +84 -0
  10. package/dist/categorical.d.ts.map +1 -0
  11. package/dist/categorical.js +158 -0
  12. package/dist/categorical.js.map +1 -0
  13. package/dist/describe.d.ts +11 -0
  14. package/dist/describe.d.ts.map +1 -0
  15. package/dist/describe.js +26 -0
  16. package/dist/describe.js.map +1 -0
  17. package/dist/distribution.d.ts +109 -0
  18. package/dist/distribution.d.ts.map +1 -0
  19. package/dist/distribution.js +231 -0
  20. package/dist/distribution.js.map +1 -0
  21. package/dist/fields.d.ts +53 -0
  22. package/dist/fields.d.ts.map +1 -0
  23. package/dist/fields.js +108 -0
  24. package/dist/fields.js.map +1 -0
  25. package/dist/geo.d.ts +151 -0
  26. package/dist/geo.d.ts.map +1 -0
  27. package/dist/geo.js +300 -0
  28. package/dist/geo.js.map +1 -0
  29. package/dist/index.d.ts +22 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +13 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/kpi.d.ts +35 -0
  34. package/dist/kpi.d.ts.map +1 -0
  35. package/dist/kpi.js +40 -0
  36. package/dist/kpi.js.map +1 -0
  37. package/dist/model.d.ts +4 -0
  38. package/dist/model.d.ts.map +1 -1
  39. package/dist/model.js +4 -0
  40. package/dist/model.js.map +1 -1
  41. package/dist/partOfWhole.d.ts +159 -0
  42. package/dist/partOfWhole.d.ts.map +1 -0
  43. package/dist/partOfWhole.js +260 -0
  44. package/dist/partOfWhole.js.map +1 -0
  45. package/dist/pivot.d.ts +31 -0
  46. package/dist/pivot.d.ts.map +1 -0
  47. package/dist/pivot.js +121 -0
  48. package/dist/pivot.js.map +1 -0
  49. package/dist/pivotAdvanced.d.ts +47 -0
  50. package/dist/pivotAdvanced.d.ts.map +1 -0
  51. package/dist/pivotAdvanced.js +208 -0
  52. package/dist/pivotAdvanced.js.map +1 -0
  53. package/dist/serialize.d.ts +15 -3
  54. package/dist/serialize.d.ts.map +1 -1
  55. package/dist/serialize.js +55 -20
  56. package/dist/serialize.js.map +1 -1
  57. package/dist/store.d.ts +17 -4
  58. package/dist/store.d.ts.map +1 -1
  59. package/dist/store.js +120 -15
  60. package/dist/store.js.map +1 -1
  61. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6,10 +6,21 @@
6
6
  * bookmark serialisation. Zero framework / design-system dependencies.
7
7
  */
8
8
  export { isDimensionType, isAggregation, isDimension, isMeasure, isDataModel, validateModel, assertModel, findDimension, findMeasure, } from './model.js';
9
- export { createDashboardStore, specToPredicate, applyFilters } from './store.js';
9
+ export { fieldId, parseFieldId, listFields, buildFieldPaneTree, fieldToPill, } from './fields.js';
10
+ // Descriptions
11
+ export { describeFilterSpec } from './describe.js';
12
+ export { buildPivotTable } from './pivot.js';
13
+ export { buildKpiCards } from './kpi.js';
14
+ export { buildCategoricalSeries, buildParetoModel, buildDivergingBarModel, } from './categorical.js';
15
+ export { buildPartWholeModel, buildPartWholeHierarchy, buildWaterfallModel, buildFlowModel, buildRadarModel, buildRoseModel, buildMekkoModel, buildPackedBubbleModel, } from './partOfWhole.js';
16
+ export { buildHistogramModel, buildBoxPlotModel, buildHeatmapModel, buildBulletChartModel, buildGaugeChartModel, } from './distribution.js';
17
+ export { buildAdvancedPivotTable } from './pivotAdvanced.js';
18
+ export { buildReferenceLineModel, buildPercentileBandModel, buildTrendLineModel, buildForecastModel, buildErrorBarsModel, buildAnalyticsClusterModel, } from './analytics.js';
19
+ export { buildGeoPointModel, buildChoroplethModel, buildGeoFlowModel, buildGeoHexbinModel, buildGeoClusterModel, buildGeoDensityModel, buildGeoJsonLayerModel, } from './geo.js';
20
+ export { createDashboardStore, specToPredicate, applyFilters, isFilterSpec } from './store.js';
10
21
  export { sourcesFor, applyCrossfilter } from './crossfilter.js';
11
22
  // Aggregate
12
23
  export { groupBy, aggregate, aggregateValues, extractNumbers, groupAggregate, } from './aggregate.js';
13
24
  // Serialize
14
- export { isFilterSpec, serializeFilters, deserializeFilters } from './serialize.js';
25
+ export { serializeFilters, deserializeFilters, serializeDrill, deserializeDrill, } from './serialize.js';
15
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC;AAYpB,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIjF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,YAAY;AACZ,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC;AAapB,OAAO,EACL,OAAO,EACP,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AASnD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAS7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAoBzC,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAiC1B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,EACf,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAsB1B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAoB7D,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AA8BxB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAYlB,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/F,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,YAAY;AACZ,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
package/dist/kpi.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ /**
2
+ * KPI card data contracts.
3
+ *
4
+ * The core computes the BI values; framework adapters render these with DS
5
+ * primitives such as Card, Badge, ProgressBar and Sparkline.
6
+ */
7
+ import type { DataModel, Row } from './model.js';
8
+ export interface KpiCardConfig {
9
+ id: string;
10
+ label?: string;
11
+ measure: string;
12
+ goal?: number;
13
+ sparklineDimension?: string;
14
+ }
15
+ export interface KpiBuildOptions {
16
+ comparisonData?: readonly Row[];
17
+ }
18
+ export interface KpiSparklinePoint {
19
+ key: string;
20
+ value: number;
21
+ }
22
+ export interface KpiCard {
23
+ id: string;
24
+ label: string;
25
+ measureId: string;
26
+ value: number;
27
+ comparisonValue?: number;
28
+ delta?: number;
29
+ deltaPercent?: number;
30
+ goal?: number;
31
+ progress?: number;
32
+ sparkline?: KpiSparklinePoint[];
33
+ }
34
+ export declare function buildKpiCards(model: DataModel, data: readonly Row[], configs: readonly KpiCardConfig[], options?: KpiBuildOptions): KpiCard[];
35
+ //# sourceMappingURL=kpi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kpi.d.ts","sourceRoot":"","sources":["../src/kpi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,OAAO,EAAE,SAAS,aAAa,EAAE,EACjC,OAAO,GAAE,eAAoB,GAC5B,OAAO,EAAE,CAmCX"}
package/dist/kpi.js ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * KPI card data contracts.
3
+ *
4
+ * The core computes the BI values; framework adapters render these with DS
5
+ * primitives such as Card, Badge, ProgressBar and Sparkline.
6
+ */
7
+ import { aggregate, groupAggregate } from './aggregate.js';
8
+ import { findDimension, findMeasure } from './model.js';
9
+ export function buildKpiCards(model, data, configs, options = {}) {
10
+ return configs.map((config) => {
11
+ const measure = findMeasure(model, config.measure);
12
+ if (!measure) {
13
+ throw new Error(`Unknown KPI measure: ${config.measure}`);
14
+ }
15
+ const card = {
16
+ id: config.id,
17
+ label: config.label ?? measure.label,
18
+ measureId: measure.id,
19
+ value: aggregate([...data], measure),
20
+ };
21
+ if (options.comparisonData !== undefined) {
22
+ const comparisonValue = aggregate([...options.comparisonData], measure);
23
+ card.comparisonValue = comparisonValue;
24
+ card.delta = card.value - comparisonValue;
25
+ card.deltaPercent = comparisonValue === 0 ? Number.NaN : card.delta / comparisonValue;
26
+ }
27
+ if (config.goal !== undefined) {
28
+ card.goal = config.goal;
29
+ card.progress = config.goal === 0 ? Number.NaN : card.value / config.goal;
30
+ }
31
+ if (config.sparklineDimension !== undefined) {
32
+ if (!findDimension(model, config.sparklineDimension)) {
33
+ throw new Error(`Unknown KPI sparkline dimension: ${config.sparklineDimension}`);
34
+ }
35
+ card.sparkline = groupAggregate([...data], config.sparklineDimension, measure);
36
+ }
37
+ return card;
38
+ });
39
+ }
40
+ //# sourceMappingURL=kpi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kpi.js","sourceRoot":"","sources":["../src/kpi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAiCxD,MAAM,UAAU,aAAa,CAC3B,KAAgB,EAChB,IAAoB,EACpB,OAAiC,EACjC,UAA2B,EAAE;IAE7B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAY;YACpB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;YACpC,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC;SACrC,CAAC;QAEF,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,eAAe,GAAG,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;YACxE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC;YAC1C,IAAI,CAAC,YAAY,GAAG,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC;QACxF,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5E,CAAC;QAED,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/model.d.ts CHANGED
@@ -18,6 +18,8 @@ export interface Dimension {
18
18
  id: string;
19
19
  label: string;
20
20
  type: DimensionType;
21
+ /** Optional field-pane folder/group label. */
22
+ folder?: string;
21
23
  /**
22
24
  * Optional drill-down path, ordered from coarse to fine, e.g.
23
25
  * `['country', 'region', 'city']`. Each entry is a dimension id.
@@ -29,6 +31,8 @@ export interface Measure {
29
31
  id: string;
30
32
  label: string;
31
33
  aggregation: Aggregation;
34
+ /** Optional field-pane folder/group label. */
35
+ folder?: string;
32
36
  }
33
37
  /** The full declarative model of a dataset. */
34
38
  export interface DataModel {
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,6DAA6D;AAC7D,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEpD,mDAAmD;AACnD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAEvC,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;AAEtD,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAElE,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,8BAA8B;AAC9B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAMD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAU9D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAK1D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAK9D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CA+CxD;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAMvD;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEjF;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE7E"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,6DAA6D;AAC7D,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEpD,mDAAmD;AACnD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAEvC,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;AAEtD,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAElE,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,8BAA8B;AAC9B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAMD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAW9D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAM1D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAK9D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CA+CxD;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAMvD;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEjF;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE7E"}
package/dist/model.js CHANGED
@@ -24,6 +24,8 @@ export function isDimension(value) {
24
24
  return false;
25
25
  if (!isDimensionType(d.type))
26
26
  return false;
27
+ if (d.folder !== undefined && !isNonEmptyString(d.folder))
28
+ return false;
27
29
  if (d.hierarchy !== undefined) {
28
30
  if (!Array.isArray(d.hierarchy))
29
31
  return false;
@@ -38,6 +40,8 @@ export function isMeasure(value) {
38
40
  const m = value;
39
41
  if (!isNonEmptyString(m.id) || !isNonEmptyString(m.label))
40
42
  return false;
43
+ if (m.folder !== undefined && !isNonEmptyString(m.folder))
44
+ return false;
41
45
  return isAggregation(m.aggregation);
42
46
  }
43
47
  export function isDataModel(value) {
package/dist/model.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuCH,MAAM,eAAe,GAA6B,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAC7E,MAAM,YAAY,GAA2B,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAEnF,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,YAAkC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9C,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7E,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAgB;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAErC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS;YAAE,SAAS;QAClD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,4CAA4C,GAAG,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,KAAgB;IAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,EAAU;IACxD,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,KAAgB,EAAE,EAAU;IACtD,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Part-of-whole, waterfall and flow data contracts.
3
+ *
4
+ * These builders stay rendering-agnostic while covering the data shapes needed
5
+ * by pie/donut/funnel, treemap/sunburst, waterfall, sankey/chord, radar and
6
+ * rose, Mekko and packed bubble renderers.
7
+ */
8
+ import type { DataModel, Row } from './model.js';
9
+ export type PartWholeSort = 'input' | 'value-asc' | 'value-desc';
10
+ export interface PartWholeConfig {
11
+ category: string;
12
+ measure: string;
13
+ sort?: PartWholeSort;
14
+ }
15
+ export interface PartWholeItem {
16
+ key: string;
17
+ label: string;
18
+ value: number;
19
+ percent: number;
20
+ cumulativeValue: number;
21
+ cumulativePercent: number;
22
+ }
23
+ export interface PartWholeModel {
24
+ total: number;
25
+ items: PartWholeItem[];
26
+ }
27
+ export interface PartWholeHierarchyConfig {
28
+ hierarchy: string[];
29
+ measure: string;
30
+ }
31
+ export interface PartWholeNode {
32
+ key: string;
33
+ label: string;
34
+ value: number;
35
+ children?: PartWholeNode[];
36
+ }
37
+ export interface WaterfallConfig {
38
+ category: string;
39
+ measure: string;
40
+ totalLabel?: string;
41
+ }
42
+ export interface WaterfallStep {
43
+ key: string;
44
+ label: string;
45
+ kind: 'delta' | 'total';
46
+ delta: number;
47
+ start: number;
48
+ end: number;
49
+ }
50
+ export interface WaterfallModel {
51
+ total: number;
52
+ steps: WaterfallStep[];
53
+ }
54
+ export interface FlowConfig {
55
+ source: string;
56
+ target: string;
57
+ measure: string;
58
+ }
59
+ export interface FlowNode {
60
+ id: string;
61
+ label: string;
62
+ }
63
+ export interface FlowLink {
64
+ id: string;
65
+ source: string;
66
+ target: string;
67
+ value: number;
68
+ }
69
+ export interface FlowModel {
70
+ nodes: FlowNode[];
71
+ links: FlowLink[];
72
+ }
73
+ export interface RadarConfig {
74
+ axes: string[];
75
+ series?: string;
76
+ }
77
+ export interface RadarAxis {
78
+ id: string;
79
+ label: string;
80
+ }
81
+ export interface RadarPoint {
82
+ axisId: string;
83
+ label: string;
84
+ value: number;
85
+ }
86
+ export interface RadarSeries {
87
+ key: string;
88
+ label: string;
89
+ points: RadarPoint[];
90
+ }
91
+ export interface RadarModel {
92
+ axes: RadarAxis[];
93
+ series: RadarSeries[];
94
+ }
95
+ export interface RoseConfig {
96
+ category: string;
97
+ measure: string;
98
+ }
99
+ export interface RoseSector {
100
+ key: string;
101
+ label: string;
102
+ value: number;
103
+ percent: number;
104
+ startAngle: number;
105
+ endAngle: number;
106
+ }
107
+ export interface RoseModel {
108
+ total: number;
109
+ sectors: RoseSector[];
110
+ }
111
+ export interface MekkoConfig {
112
+ category: string;
113
+ series: string;
114
+ measure: string;
115
+ }
116
+ export interface MekkoSegment {
117
+ key: string;
118
+ label: string;
119
+ value: number;
120
+ percent: number;
121
+ }
122
+ export interface MekkoColumn {
123
+ key: string;
124
+ label: string;
125
+ value: number;
126
+ width: number;
127
+ start: number;
128
+ end: number;
129
+ segments: MekkoSegment[];
130
+ }
131
+ export interface MekkoModel {
132
+ total: number;
133
+ columns: MekkoColumn[];
134
+ }
135
+ export interface PackedBubbleConfig {
136
+ category: string;
137
+ measure: string;
138
+ sort?: PartWholeSort;
139
+ }
140
+ export interface PackedBubble {
141
+ key: string;
142
+ label: string;
143
+ value: number;
144
+ percent: number;
145
+ radius: number;
146
+ }
147
+ export interface PackedBubbleModel {
148
+ total: number;
149
+ bubbles: PackedBubble[];
150
+ }
151
+ export declare function buildPartWholeModel(model: DataModel, data: readonly Row[], config: PartWholeConfig): PartWholeModel;
152
+ export declare function buildPartWholeHierarchy(model: DataModel, data: readonly Row[], config: PartWholeHierarchyConfig): PartWholeNode;
153
+ export declare function buildWaterfallModel(model: DataModel, data: readonly Row[], config: WaterfallConfig): WaterfallModel;
154
+ export declare function buildFlowModel(model: DataModel, data: readonly Row[], config: FlowConfig): FlowModel;
155
+ export declare function buildRadarModel(model: DataModel, data: readonly Row[], config: RadarConfig): RadarModel;
156
+ export declare function buildRoseModel(model: DataModel, data: readonly Row[], config: RoseConfig): RoseModel;
157
+ export declare function buildMekkoModel(model: DataModel, data: readonly Row[], config: MekkoConfig): MekkoModel;
158
+ export declare function buildPackedBubbleModel(model: DataModel, data: readonly Row[], config: PackedBubbleConfig): PackedBubbleModel;
159
+ //# sourceMappingURL=partOfWhole.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partOfWhole.d.ts","sourceRoot":"","sources":["../src/partOfWhole.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Part-of-whole, waterfall and flow data contracts.
3
+ *
4
+ * These builders stay rendering-agnostic while covering the data shapes needed
5
+ * by pie/donut/funnel, treemap/sunburst, waterfall, sankey/chord, radar and
6
+ * rose, Mekko and packed bubble renderers.
7
+ */
8
+ import { aggregate } from './aggregate.js';
9
+ import { findDimension, findMeasure } from './model.js';
10
+ function cellKey(value) {
11
+ return value == null ? 'null' : String(value);
12
+ }
13
+ function pathKey(path) {
14
+ return path.join('\u001f');
15
+ }
16
+ function assertDimension(model, id, role) {
17
+ if (!findDimension(model, id)) {
18
+ throw new Error(`Unknown ${role} dimension: ${id}`);
19
+ }
20
+ }
21
+ function resolveMeasure(model, id, role) {
22
+ const measure = findMeasure(model, id);
23
+ if (!measure) {
24
+ throw new Error(`Unknown ${role} measure: ${id}`);
25
+ }
26
+ return measure;
27
+ }
28
+ function groupRows(rows, dimensionId) {
29
+ const groups = new Map();
30
+ for (const row of rows) {
31
+ const key = cellKey(row[dimensionId]);
32
+ const bucket = groups.get(key);
33
+ if (bucket) {
34
+ bucket.push(row);
35
+ }
36
+ else {
37
+ groups.set(key, [row]);
38
+ }
39
+ }
40
+ return groups;
41
+ }
42
+ function sortItems(items, sort) {
43
+ if (sort === 'input')
44
+ return items;
45
+ return [...items].sort((a, b) => {
46
+ const left = Number.isFinite(a.value) ? a.value : Number.NEGATIVE_INFINITY;
47
+ const right = Number.isFinite(b.value) ? b.value : Number.NEGATIVE_INFINITY;
48
+ return sort === 'value-desc' ? right - left : left - right;
49
+ });
50
+ }
51
+ export function buildPartWholeModel(model, data, config) {
52
+ assertDimension(model, config.category, 'part-whole category');
53
+ const measure = resolveMeasure(model, config.measure, 'part-whole');
54
+ const items = Array.from(groupRows(data, config.category), ([key, rows]) => ({
55
+ key,
56
+ label: key,
57
+ value: aggregate(rows, measure),
58
+ percent: 0,
59
+ cumulativeValue: 0,
60
+ cumulativePercent: 0,
61
+ }));
62
+ const total = items.reduce((sum, item) => sum + item.value, 0);
63
+ const sorted = sortItems(items, config.sort ?? 'input');
64
+ let cumulative = 0;
65
+ for (const item of sorted) {
66
+ cumulative += item.value;
67
+ item.percent = total === 0 ? Number.NaN : item.value / total;
68
+ item.cumulativeValue = cumulative;
69
+ item.cumulativePercent = total === 0 ? Number.NaN : cumulative / total;
70
+ }
71
+ return { total, items: sorted };
72
+ }
73
+ function buildHierarchyNode(rows, dimensions, measure, depth, path) {
74
+ const key = path.length === 0 ? 'root' : pathKey(path);
75
+ const label = path.length === 0 ? 'Total' : path[path.length - 1];
76
+ const node = {
77
+ key,
78
+ label,
79
+ value: aggregate([...rows], measure),
80
+ };
81
+ if (depth < dimensions.length) {
82
+ const children = Array.from(groupRows(rows, dimensions[depth]), ([childKey, childRows]) => buildHierarchyNode(childRows, dimensions, measure, depth + 1, [...path, childKey]));
83
+ node.children = children;
84
+ }
85
+ return node;
86
+ }
87
+ export function buildPartWholeHierarchy(model, data, config) {
88
+ if (config.hierarchy.length === 0) {
89
+ throw new Error('Part-whole hierarchy requires at least one dimension');
90
+ }
91
+ for (const dimensionId of config.hierarchy) {
92
+ assertDimension(model, dimensionId, 'part-whole hierarchy');
93
+ }
94
+ const measure = resolveMeasure(model, config.measure, 'part-whole hierarchy');
95
+ return buildHierarchyNode(data, config.hierarchy, measure, 0, []);
96
+ }
97
+ export function buildWaterfallModel(model, data, config) {
98
+ assertDimension(model, config.category, 'waterfall category');
99
+ const measure = resolveMeasure(model, config.measure, 'waterfall');
100
+ const steps = [];
101
+ let cumulative = 0;
102
+ for (const [key, rows] of groupRows(data, config.category)) {
103
+ const delta = aggregate(rows, measure);
104
+ const start = cumulative;
105
+ cumulative += delta;
106
+ steps.push({ key, label: key, kind: 'delta', delta, start, end: cumulative });
107
+ }
108
+ steps.push({
109
+ key: 'total',
110
+ label: config.totalLabel ?? 'Total',
111
+ kind: 'total',
112
+ delta: cumulative,
113
+ start: 0,
114
+ end: cumulative,
115
+ });
116
+ return { total: cumulative, steps };
117
+ }
118
+ export function buildFlowModel(model, data, config) {
119
+ assertDimension(model, config.source, 'flow source');
120
+ assertDimension(model, config.target, 'flow target');
121
+ const measure = resolveMeasure(model, config.measure, 'flow');
122
+ const nodes = new Map();
123
+ const linkRows = new Map();
124
+ const ensureNode = (id) => {
125
+ if (!nodes.has(id)) {
126
+ nodes.set(id, { id, label: id });
127
+ }
128
+ };
129
+ for (const row of data) {
130
+ const source = cellKey(row[config.source]);
131
+ const target = cellKey(row[config.target]);
132
+ ensureNode(source);
133
+ ensureNode(target);
134
+ const id = pathKey([source, target]);
135
+ const link = linkRows.get(id);
136
+ if (link) {
137
+ link.rows.push(row);
138
+ }
139
+ else {
140
+ linkRows.set(id, { source, target, rows: [row] });
141
+ }
142
+ }
143
+ return {
144
+ nodes: [...nodes.values()],
145
+ links: Array.from(linkRows, ([id, link]) => ({
146
+ id,
147
+ source: link.source,
148
+ target: link.target,
149
+ value: aggregate(link.rows, measure),
150
+ })),
151
+ };
152
+ }
153
+ export function buildRadarModel(model, data, config) {
154
+ if (config.axes.length === 0) {
155
+ throw new Error('Radar requires at least one measure axis');
156
+ }
157
+ if (config.series !== undefined) {
158
+ assertDimension(model, config.series, 'radar series');
159
+ }
160
+ const measures = config.axes.map((axis) => resolveMeasure(model, axis, 'radar axis'));
161
+ const groups = config.series === undefined
162
+ ? new Map([['All', [...data]]])
163
+ : groupRows(data, config.series);
164
+ return {
165
+ axes: measures.map((measure) => ({ id: measure.id, label: measure.label })),
166
+ series: Array.from(groups, ([key, rows]) => ({
167
+ key,
168
+ label: key,
169
+ points: measures.map((measure) => ({
170
+ axisId: measure.id,
171
+ label: measure.label,
172
+ value: aggregate(rows, measure),
173
+ })),
174
+ })),
175
+ };
176
+ }
177
+ export function buildRoseModel(model, data, config) {
178
+ assertDimension(model, config.category, 'rose category');
179
+ const measure = resolveMeasure(model, config.measure, 'rose');
180
+ const rawSectors = Array.from(groupRows(data, config.category), ([key, rows]) => ({
181
+ key,
182
+ label: key,
183
+ value: aggregate(rows, measure),
184
+ }));
185
+ const total = rawSectors.reduce((sum, sector) => sum + sector.value, 0);
186
+ let angle = 0;
187
+ const sectors = rawSectors.map((sector) => {
188
+ const percent = total === 0 ? Number.NaN : sector.value / total;
189
+ const startAngle = angle;
190
+ angle += total === 0 ? 0 : percent * 360;
191
+ return { ...sector, percent, startAngle, endAngle: angle };
192
+ });
193
+ return { total, sectors };
194
+ }
195
+ export function buildMekkoModel(model, data, config) {
196
+ assertDimension(model, config.category, 'Mekko category');
197
+ assertDimension(model, config.series, 'Mekko series');
198
+ const measure = resolveMeasure(model, config.measure, 'Mekko');
199
+ const categoryGroups = groupRows(data, config.category);
200
+ const rawColumns = Array.from(categoryGroups, ([key, rows]) => {
201
+ const value = aggregate(rows, measure);
202
+ return {
203
+ key,
204
+ label: key,
205
+ value,
206
+ rows,
207
+ };
208
+ });
209
+ const total = rawColumns.reduce((sum, column) => sum + column.value, 0);
210
+ let offset = 0;
211
+ const columns = rawColumns.map((column) => {
212
+ const width = total === 0 ? 0 : column.value / total;
213
+ const start = offset;
214
+ offset += width;
215
+ const segments = Array.from(groupRows(column.rows, config.series), ([key, rows]) => {
216
+ const value = aggregate(rows, measure);
217
+ return {
218
+ key,
219
+ label: key,
220
+ value,
221
+ percent: column.value === 0 ? Number.NaN : value / column.value,
222
+ };
223
+ });
224
+ return {
225
+ key: column.key,
226
+ label: column.label,
227
+ value: column.value,
228
+ width,
229
+ start,
230
+ end: offset,
231
+ segments,
232
+ };
233
+ });
234
+ return { total, columns };
235
+ }
236
+ export function buildPackedBubbleModel(model, data, config) {
237
+ assertDimension(model, config.category, 'packed bubble category');
238
+ const measure = resolveMeasure(model, config.measure, 'packed bubble');
239
+ const items = Array.from(groupRows(data, config.category), ([key, rows]) => ({
240
+ key,
241
+ label: key,
242
+ value: aggregate(rows, measure),
243
+ percent: 0,
244
+ cumulativeValue: 0,
245
+ cumulativePercent: 0,
246
+ }));
247
+ const total = items.reduce((sum, item) => sum + item.value, 0);
248
+ const sorted = sortItems(items, config.sort ?? 'input');
249
+ return {
250
+ total,
251
+ bubbles: sorted.map((item) => ({
252
+ key: item.key,
253
+ label: item.label,
254
+ value: item.value,
255
+ percent: total === 0 ? Number.NaN : item.value / total,
256
+ radius: Math.sqrt(Math.max(0, item.value) / Math.PI),
257
+ })),
258
+ };
259
+ }
260
+ //# sourceMappingURL=partOfWhole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partOfWhole.js","sourceRoot":"","sources":["../src/partOfWhole.ts"],"names":[],"mappings":"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"}