@sentropic/dataviz-core 0.1.0 → 0.2.0
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.
- package/dist/aggregate.d.ts +4 -4
- package/dist/aggregate.d.ts.map +1 -1
- package/dist/aggregate.js +13 -7
- package/dist/aggregate.js.map +1 -1
- package/dist/analytics.d.ts +105 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +323 -0
- package/dist/analytics.js.map +1 -0
- package/dist/categorical.d.ts +84 -0
- package/dist/categorical.d.ts.map +1 -0
- package/dist/categorical.js +158 -0
- package/dist/categorical.js.map +1 -0
- package/dist/describe.d.ts +11 -0
- package/dist/describe.d.ts.map +1 -0
- package/dist/describe.js +26 -0
- package/dist/describe.js.map +1 -0
- package/dist/distribution.d.ts +109 -0
- package/dist/distribution.d.ts.map +1 -0
- package/dist/distribution.js +231 -0
- package/dist/distribution.js.map +1 -0
- package/dist/fields.d.ts +53 -0
- package/dist/fields.d.ts.map +1 -0
- package/dist/fields.js +108 -0
- package/dist/fields.js.map +1 -0
- package/dist/geo.d.ts +151 -0
- package/dist/geo.d.ts.map +1 -0
- package/dist/geo.js +300 -0
- package/dist/geo.js.map +1 -0
- package/dist/index.d.ts +22 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/dist/kpi.d.ts +35 -0
- package/dist/kpi.d.ts.map +1 -0
- package/dist/kpi.js +40 -0
- package/dist/kpi.js.map +1 -0
- package/dist/model.d.ts +4 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +4 -0
- package/dist/model.js.map +1 -1
- package/dist/partOfWhole.d.ts +159 -0
- package/dist/partOfWhole.d.ts.map +1 -0
- package/dist/partOfWhole.js +260 -0
- package/dist/partOfWhole.js.map +1 -0
- package/dist/pivot.d.ts +31 -0
- package/dist/pivot.d.ts.map +1 -0
- package/dist/pivot.js +121 -0
- package/dist/pivot.js.map +1 -0
- package/dist/pivotAdvanced.d.ts +47 -0
- package/dist/pivotAdvanced.d.ts.map +1 -0
- package/dist/pivotAdvanced.js +208 -0
- package/dist/pivotAdvanced.js.map +1 -0
- package/dist/serialize.d.ts +15 -3
- package/dist/serialize.d.ts.map +1 -1
- package/dist/serialize.js +55 -20
- package/dist/serialize.js.map +1 -1
- package/dist/store.d.ts +17 -4
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +120 -15
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Categorical/combo chart data contracts.
|
|
3
|
+
*
|
|
4
|
+
* This is the rendering-agnostic series model that DS chart components can
|
|
5
|
+
* consume or adapt for grouped bars, stacked bars, line/area combos, 100 %
|
|
6
|
+
* stacks, Pareto views and diverging bars.
|
|
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 resolveMeasures(model, inputs) {
|
|
14
|
+
return inputs.map((input) => {
|
|
15
|
+
const id = typeof input === 'string' ? input : input.id;
|
|
16
|
+
const measure = findMeasure(model, id);
|
|
17
|
+
if (!measure) {
|
|
18
|
+
throw new Error(`Unknown categorical measure: ${id}`);
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
measure,
|
|
22
|
+
mark: typeof input === 'string' ? 'bar' : (input.mark ?? 'bar'),
|
|
23
|
+
axis: typeof input === 'string' ? 'left' : (input.axis ?? 'left'),
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function assertDimension(model, id, role) {
|
|
28
|
+
if (!findDimension(model, id)) {
|
|
29
|
+
throw new Error(`Unknown ${role} dimension: ${id}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function resolveMeasure(model, id, role) {
|
|
33
|
+
const measure = findMeasure(model, id);
|
|
34
|
+
if (!measure) {
|
|
35
|
+
throw new Error(`Unknown ${role} measure: ${id}`);
|
|
36
|
+
}
|
|
37
|
+
return measure;
|
|
38
|
+
}
|
|
39
|
+
function uniqueKeys(data, field) {
|
|
40
|
+
const seen = new Set();
|
|
41
|
+
const keys = [];
|
|
42
|
+
for (const row of data) {
|
|
43
|
+
const key = cellKey(row[field]);
|
|
44
|
+
if (!seen.has(key)) {
|
|
45
|
+
seen.add(key);
|
|
46
|
+
keys.push(key);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return keys;
|
|
50
|
+
}
|
|
51
|
+
function normalizeStacked100(series) {
|
|
52
|
+
const categoryCount = series[0]?.values.length ?? 0;
|
|
53
|
+
for (let index = 0; index < categoryCount; index += 1) {
|
|
54
|
+
const total = series.reduce((sum, item) => sum + item.values[index], 0);
|
|
55
|
+
for (const item of series) {
|
|
56
|
+
item.values[index] = total === 0 ? 0 : item.values[index] / total;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function buildCategoricalSeries(model, data, config) {
|
|
61
|
+
if (!findDimension(model, config.category)) {
|
|
62
|
+
throw new Error(`Unknown categorical category dimension: ${config.category}`);
|
|
63
|
+
}
|
|
64
|
+
if (config.series !== undefined && !findDimension(model, config.series)) {
|
|
65
|
+
throw new Error(`Unknown categorical series dimension: ${config.series}`);
|
|
66
|
+
}
|
|
67
|
+
const measures = resolveMeasures(model, config.measures);
|
|
68
|
+
const categories = uniqueKeys(data, config.category);
|
|
69
|
+
const mode = config.mode ?? 'grouped';
|
|
70
|
+
const output = [];
|
|
71
|
+
if (config.series === undefined) {
|
|
72
|
+
for (const item of measures) {
|
|
73
|
+
output.push({
|
|
74
|
+
id: `measure:${item.measure.id}`,
|
|
75
|
+
label: item.measure.label,
|
|
76
|
+
measureId: item.measure.id,
|
|
77
|
+
mark: item.mark,
|
|
78
|
+
axis: item.axis,
|
|
79
|
+
values: categories.map((category) => aggregate([...data].filter((row) => cellKey(row[config.category]) === category), item.measure)),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const seriesKeys = uniqueKeys(data, config.series);
|
|
85
|
+
for (const seriesKey of seriesKeys) {
|
|
86
|
+
for (const item of measures) {
|
|
87
|
+
output.push({
|
|
88
|
+
id: `series:${seriesKey}:${item.measure.id}`,
|
|
89
|
+
label: `${seriesKey} · ${item.measure.label}`,
|
|
90
|
+
measureId: item.measure.id,
|
|
91
|
+
seriesKey,
|
|
92
|
+
seriesLabel: seriesKey,
|
|
93
|
+
mark: item.mark,
|
|
94
|
+
axis: item.axis,
|
|
95
|
+
values: categories.map((category) => aggregate([...data].filter((row) => cellKey(row[config.category]) === category &&
|
|
96
|
+
cellKey(row[config.series]) === seriesKey), item.measure)),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (mode === 'stacked-100') {
|
|
102
|
+
normalizeStacked100(output);
|
|
103
|
+
}
|
|
104
|
+
return { categories, mode, series: output };
|
|
105
|
+
}
|
|
106
|
+
export function buildParetoModel(model, data, config) {
|
|
107
|
+
assertDimension(model, config.category, 'Pareto category');
|
|
108
|
+
const measure = resolveMeasure(model, config.measure, 'Pareto');
|
|
109
|
+
const categories = uniqueKeys(data, config.category);
|
|
110
|
+
const indexed = categories.map((category, index) => ({
|
|
111
|
+
key: category,
|
|
112
|
+
label: category,
|
|
113
|
+
value: aggregate([...data].filter((row) => cellKey(row[config.category]) === category), measure),
|
|
114
|
+
index,
|
|
115
|
+
}));
|
|
116
|
+
indexed.sort((a, b) => b.value - a.value || a.index - b.index);
|
|
117
|
+
const total = indexed.reduce((sum, item) => sum + item.value, 0);
|
|
118
|
+
let cumulativeValue = 0;
|
|
119
|
+
const items = indexed.map((item, index) => {
|
|
120
|
+
cumulativeValue += item.value;
|
|
121
|
+
return {
|
|
122
|
+
key: item.key,
|
|
123
|
+
label: item.label,
|
|
124
|
+
value: item.value,
|
|
125
|
+
rank: index + 1,
|
|
126
|
+
cumulativeValue,
|
|
127
|
+
cumulativePercent: total === 0 ? 0 : cumulativeValue / total,
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
return { categoryId: config.category, measureId: measure.id, total, items };
|
|
131
|
+
}
|
|
132
|
+
function directionFor(value) {
|
|
133
|
+
if (value > 0)
|
|
134
|
+
return 'positive';
|
|
135
|
+
if (value < 0)
|
|
136
|
+
return 'negative';
|
|
137
|
+
return 'neutral';
|
|
138
|
+
}
|
|
139
|
+
export function buildDivergingBarModel(model, data, config) {
|
|
140
|
+
assertDimension(model, config.category, 'diverging bar category');
|
|
141
|
+
const measure = resolveMeasure(model, config.measure, 'diverging bar');
|
|
142
|
+
const categories = uniqueKeys(data, config.category);
|
|
143
|
+
const items = categories.map((category) => {
|
|
144
|
+
const value = aggregate([...data].filter((row) => cellKey(row[config.category]) === category), measure);
|
|
145
|
+
return {
|
|
146
|
+
key: category,
|
|
147
|
+
label: category,
|
|
148
|
+
value,
|
|
149
|
+
start: Math.min(0, value),
|
|
150
|
+
end: Math.max(0, value),
|
|
151
|
+
direction: directionFor(value),
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
const values = items.map((item) => item.value);
|
|
155
|
+
const domain = values.length === 0 ? [0, 0] : [Math.min(0, ...values), Math.max(0, ...values)];
|
|
156
|
+
return { categoryId: config.category, measureId: measure.id, baseline: 0, domain, items };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=categorical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categorical.js","sourceRoot":"","sources":["../src/categorical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locale-neutral labels for core BI state.
|
|
3
|
+
*
|
|
4
|
+
* These helpers produce stable text for adapter-owned presentation such as
|
|
5
|
+
* FilterPill values. They intentionally avoid framework and design-system
|
|
6
|
+
* imports so React, Svelte and Vue share exactly the same wording.
|
|
7
|
+
*/
|
|
8
|
+
import type { Dimension } from './model.js';
|
|
9
|
+
import type { FilterSpec } from './store.js';
|
|
10
|
+
export declare function describeFilterSpec(spec: FilterSpec, _dimension?: Dimension): string;
|
|
11
|
+
//# sourceMappingURL=describe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,CAcnF"}
|
package/dist/describe.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locale-neutral labels for core BI state.
|
|
3
|
+
*
|
|
4
|
+
* These helpers produce stable text for adapter-owned presentation such as
|
|
5
|
+
* FilterPill values. They intentionally avoid framework and design-system
|
|
6
|
+
* imports so React, Svelte and Vue share exactly the same wording.
|
|
7
|
+
*/
|
|
8
|
+
export function describeFilterSpec(spec, _dimension) {
|
|
9
|
+
switch (spec.kind) {
|
|
10
|
+
case 'include':
|
|
11
|
+
return spec.values.join(', ');
|
|
12
|
+
case 'exclude':
|
|
13
|
+
return `≠ ${spec.values.join(', ')}`;
|
|
14
|
+
case 'range': {
|
|
15
|
+
const { min, max } = spec;
|
|
16
|
+
if (min !== undefined && max !== undefined)
|
|
17
|
+
return `${min} – ${max}`;
|
|
18
|
+
if (min !== undefined)
|
|
19
|
+
return `≥ ${min}`;
|
|
20
|
+
if (max !== undefined)
|
|
21
|
+
return `≤ ${max}`;
|
|
22
|
+
return 'tous';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=describe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,UAAU,kBAAkB,CAAC,IAAgB,EAAE,UAAsB;IACzE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,SAAS;YACZ,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAC1B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,GAAG,GAAG,MAAM,GAAG,EAAE,CAAC;YACrE,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,KAAK,GAAG,EAAE,CAAC;YACzC,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,KAAK,GAAG,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distribution and statistical chart data contracts.
|
|
3
|
+
*
|
|
4
|
+
* These builders cover rendering-neutral inputs for histograms, box plots,
|
|
5
|
+
* categorical/calendar heatmaps, bullet charts and gauges.
|
|
6
|
+
*/
|
|
7
|
+
import type { DataModel, Row } from './model.js';
|
|
8
|
+
export interface HistogramConfig {
|
|
9
|
+
value: string;
|
|
10
|
+
bins?: number;
|
|
11
|
+
domain?: readonly [number, number];
|
|
12
|
+
}
|
|
13
|
+
export interface HistogramBin {
|
|
14
|
+
index: number;
|
|
15
|
+
x0: number;
|
|
16
|
+
x1: number;
|
|
17
|
+
count: number;
|
|
18
|
+
}
|
|
19
|
+
export interface HistogramModel {
|
|
20
|
+
valueId: string;
|
|
21
|
+
domain: [number, number];
|
|
22
|
+
bins: HistogramBin[];
|
|
23
|
+
}
|
|
24
|
+
export interface BoxPlotConfig {
|
|
25
|
+
value: string;
|
|
26
|
+
group?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface BoxPlotGroup {
|
|
29
|
+
key: string;
|
|
30
|
+
label: string;
|
|
31
|
+
count: number;
|
|
32
|
+
min: number;
|
|
33
|
+
q1: number;
|
|
34
|
+
median: number;
|
|
35
|
+
q3: number;
|
|
36
|
+
max: number;
|
|
37
|
+
outliers: number[];
|
|
38
|
+
}
|
|
39
|
+
export interface BoxPlotModel {
|
|
40
|
+
valueId: string;
|
|
41
|
+
groups: BoxPlotGroup[];
|
|
42
|
+
}
|
|
43
|
+
export interface HeatmapConfig {
|
|
44
|
+
x: string;
|
|
45
|
+
y: string;
|
|
46
|
+
measure: string;
|
|
47
|
+
}
|
|
48
|
+
export interface HeatmapCell {
|
|
49
|
+
xKey: string;
|
|
50
|
+
yKey: string;
|
|
51
|
+
value: number;
|
|
52
|
+
}
|
|
53
|
+
export interface HeatmapModel {
|
|
54
|
+
xKeys: string[];
|
|
55
|
+
yKeys: string[];
|
|
56
|
+
cells: HeatmapCell[];
|
|
57
|
+
}
|
|
58
|
+
export interface BulletChartConfig {
|
|
59
|
+
value: string;
|
|
60
|
+
target: string;
|
|
61
|
+
category?: string;
|
|
62
|
+
label?: string;
|
|
63
|
+
ranges?: readonly number[];
|
|
64
|
+
}
|
|
65
|
+
export interface BulletChartDatum {
|
|
66
|
+
key: string;
|
|
67
|
+
label: string;
|
|
68
|
+
value: number;
|
|
69
|
+
target: number;
|
|
70
|
+
ranges?: number[];
|
|
71
|
+
}
|
|
72
|
+
export interface BulletChartModel {
|
|
73
|
+
label: string;
|
|
74
|
+
valueId: string;
|
|
75
|
+
targetId: string;
|
|
76
|
+
data: BulletChartDatum[];
|
|
77
|
+
}
|
|
78
|
+
export type GaugeChartTone = 'neutral' | 'info' | 'success' | 'warning' | 'error' | 'category1' | 'category2' | 'category3' | 'category4' | 'category5' | 'category6' | 'category7' | 'category8';
|
|
79
|
+
export type GaugeChartFormat = 'number' | 'percent';
|
|
80
|
+
export interface GaugeChartThreshold {
|
|
81
|
+
value: number;
|
|
82
|
+
tone: GaugeChartTone;
|
|
83
|
+
}
|
|
84
|
+
export interface GaugeChartConfig {
|
|
85
|
+
value: string;
|
|
86
|
+
label?: string;
|
|
87
|
+
min?: number;
|
|
88
|
+
max?: number;
|
|
89
|
+
thresholds?: readonly GaugeChartThreshold[];
|
|
90
|
+
format?: GaugeChartFormat;
|
|
91
|
+
unit?: string;
|
|
92
|
+
}
|
|
93
|
+
export interface GaugeChartModel {
|
|
94
|
+
label: string;
|
|
95
|
+
valueId: string;
|
|
96
|
+
value: number;
|
|
97
|
+
displayValue: number;
|
|
98
|
+
min: number;
|
|
99
|
+
max: number;
|
|
100
|
+
thresholds?: GaugeChartThreshold[];
|
|
101
|
+
format: GaugeChartFormat;
|
|
102
|
+
unit?: string;
|
|
103
|
+
}
|
|
104
|
+
export declare function buildHistogramModel(model: DataModel, data: readonly Row[], config: HistogramConfig): HistogramModel;
|
|
105
|
+
export declare function buildBoxPlotModel(model: DataModel, data: readonly Row[], config: BoxPlotConfig): BoxPlotModel;
|
|
106
|
+
export declare function buildHeatmapModel(model: DataModel, data: readonly Row[], config: HeatmapConfig): HeatmapModel;
|
|
107
|
+
export declare function buildBulletChartModel(model: DataModel, data: readonly Row[], config: BulletChartConfig): BulletChartModel;
|
|
108
|
+
export declare function buildGaugeChartModel(model: DataModel, data: readonly Row[], config: GaugeChartConfig): GaugeChartModel;
|
|
109
|
+
//# sourceMappingURL=distribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distribution.d.ts","sourceRoot":"","sources":["../src/distribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distribution and statistical chart data contracts.
|
|
3
|
+
*
|
|
4
|
+
* These builders cover rendering-neutral inputs for histograms, box plots,
|
|
5
|
+
* categorical/calendar heatmaps, bullet charts and gauges.
|
|
6
|
+
*/
|
|
7
|
+
import { aggregate, extractNumbers } from './aggregate.js';
|
|
8
|
+
import { findDimension, findMeasure } from './model.js';
|
|
9
|
+
function cellKey(value) {
|
|
10
|
+
return value == null ? 'null' : String(value);
|
|
11
|
+
}
|
|
12
|
+
function assertDimension(model, id, role) {
|
|
13
|
+
if (!findDimension(model, id)) {
|
|
14
|
+
throw new Error(`Unknown ${role} dimension: ${id}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function assertValueField(model, id, role) {
|
|
18
|
+
if (!findMeasure(model, id) && !findDimension(model, id)) {
|
|
19
|
+
throw new Error(`Unknown ${role} value field: ${id}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function resolveMeasure(model, id, role) {
|
|
23
|
+
const measure = findMeasure(model, id);
|
|
24
|
+
if (!measure) {
|
|
25
|
+
throw new Error(`Unknown ${role} measure: ${id}`);
|
|
26
|
+
}
|
|
27
|
+
return measure;
|
|
28
|
+
}
|
|
29
|
+
function finiteNumbers(values, role) {
|
|
30
|
+
if (values === undefined)
|
|
31
|
+
return undefined;
|
|
32
|
+
const out = [...values];
|
|
33
|
+
if (out.some((value) => !Number.isFinite(value))) {
|
|
34
|
+
throw new Error(`${role} must be finite`);
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
function assertDomain(min, max, role) {
|
|
39
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || min > max) {
|
|
40
|
+
throw new Error(`${role} domain must be finite and ordered`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function clamp(value, min, max) {
|
|
44
|
+
return Math.min(max, Math.max(min, value));
|
|
45
|
+
}
|
|
46
|
+
function uniqueKeys(rows, field) {
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
const keys = [];
|
|
49
|
+
for (const row of rows) {
|
|
50
|
+
const key = cellKey(row[field]);
|
|
51
|
+
if (!seen.has(key)) {
|
|
52
|
+
seen.add(key);
|
|
53
|
+
keys.push(key);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return keys;
|
|
57
|
+
}
|
|
58
|
+
function groupRows(rows, field) {
|
|
59
|
+
const groups = new Map();
|
|
60
|
+
for (const row of rows) {
|
|
61
|
+
const key = cellKey(row[field]);
|
|
62
|
+
const bucket = groups.get(key);
|
|
63
|
+
if (bucket) {
|
|
64
|
+
bucket.push(row);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
groups.set(key, [row]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return groups;
|
|
71
|
+
}
|
|
72
|
+
export function buildHistogramModel(model, data, config) {
|
|
73
|
+
assertValueField(model, config.value, 'histogram');
|
|
74
|
+
const binCount = config.bins ?? 10;
|
|
75
|
+
if (!Number.isInteger(binCount) || binCount <= 0) {
|
|
76
|
+
throw new Error('Histogram bins must be a positive integer');
|
|
77
|
+
}
|
|
78
|
+
const values = extractNumbers([...data], config.value);
|
|
79
|
+
if (values.length === 0) {
|
|
80
|
+
return { valueId: config.value, domain: [Number.NaN, Number.NaN], bins: [] };
|
|
81
|
+
}
|
|
82
|
+
const min = config.domain?.[0] ?? Math.min(...values);
|
|
83
|
+
const max = config.domain?.[1] ?? Math.max(...values);
|
|
84
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || min > max) {
|
|
85
|
+
throw new Error('Histogram domain must be finite and ordered');
|
|
86
|
+
}
|
|
87
|
+
if (min === max) {
|
|
88
|
+
return {
|
|
89
|
+
valueId: config.value,
|
|
90
|
+
domain: [min, max],
|
|
91
|
+
bins: [{ index: 0, x0: min, x1: max, count: values.length }],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const width = (max - min) / binCount;
|
|
95
|
+
const counts = Array.from({ length: binCount }, () => 0);
|
|
96
|
+
for (const value of values) {
|
|
97
|
+
if (value < min || value > max)
|
|
98
|
+
continue;
|
|
99
|
+
const index = Math.min(Math.floor((value - min) / width), binCount - 1);
|
|
100
|
+
counts[index] += 1;
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
valueId: config.value,
|
|
104
|
+
domain: [min, max],
|
|
105
|
+
bins: counts.map((count, index) => ({
|
|
106
|
+
index,
|
|
107
|
+
x0: min + index * width,
|
|
108
|
+
x1: index === binCount - 1 ? max : min + (index + 1) * width,
|
|
109
|
+
count,
|
|
110
|
+
})),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function quantile(sorted, p) {
|
|
114
|
+
if (sorted.length === 0)
|
|
115
|
+
return Number.NaN;
|
|
116
|
+
const position = (sorted.length - 1) * p;
|
|
117
|
+
const base = Math.floor(position);
|
|
118
|
+
const rest = position - base;
|
|
119
|
+
const current = sorted[base];
|
|
120
|
+
const next = sorted[base + 1] ?? current;
|
|
121
|
+
return current + rest * (next - current);
|
|
122
|
+
}
|
|
123
|
+
function boxGroup(key, rows, valueField) {
|
|
124
|
+
const values = extractNumbers([...rows], valueField).sort((a, b) => a - b);
|
|
125
|
+
const min = values[0] ?? Number.NaN;
|
|
126
|
+
const max = values[values.length - 1] ?? Number.NaN;
|
|
127
|
+
const q1 = quantile(values, 0.25);
|
|
128
|
+
const median = quantile(values, 0.5);
|
|
129
|
+
const q3 = quantile(values, 0.75);
|
|
130
|
+
const iqr = q3 - q1;
|
|
131
|
+
const lowerFence = q1 - 1.5 * iqr;
|
|
132
|
+
const upperFence = q3 + 1.5 * iqr;
|
|
133
|
+
return {
|
|
134
|
+
key,
|
|
135
|
+
label: key,
|
|
136
|
+
count: values.length,
|
|
137
|
+
min,
|
|
138
|
+
q1,
|
|
139
|
+
median,
|
|
140
|
+
q3,
|
|
141
|
+
max,
|
|
142
|
+
outliers: values.filter((value) => value < lowerFence || value > upperFence),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export function buildBoxPlotModel(model, data, config) {
|
|
146
|
+
assertValueField(model, config.value, 'box plot');
|
|
147
|
+
if (config.group !== undefined) {
|
|
148
|
+
assertDimension(model, config.group, 'box plot group');
|
|
149
|
+
}
|
|
150
|
+
const groups = config.group === undefined
|
|
151
|
+
? [boxGroup('All', data, config.value)]
|
|
152
|
+
: Array.from(groupRows(data, config.group), ([key, rows]) => boxGroup(key, rows, config.value));
|
|
153
|
+
return { valueId: config.value, groups };
|
|
154
|
+
}
|
|
155
|
+
export function buildHeatmapModel(model, data, config) {
|
|
156
|
+
assertDimension(model, config.x, 'heatmap x');
|
|
157
|
+
assertDimension(model, config.y, 'heatmap y');
|
|
158
|
+
const measure = resolveMeasure(model, config.measure, 'heatmap');
|
|
159
|
+
const xKeys = uniqueKeys(data, config.x);
|
|
160
|
+
const yKeys = uniqueKeys(data, config.y);
|
|
161
|
+
const cells = [];
|
|
162
|
+
for (const yKey of yKeys) {
|
|
163
|
+
for (const xKey of xKeys) {
|
|
164
|
+
cells.push({
|
|
165
|
+
xKey,
|
|
166
|
+
yKey,
|
|
167
|
+
value: aggregate([...data].filter((row) => cellKey(row[config.x]) === xKey && cellKey(row[config.y]) === yKey), measure),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { xKeys, yKeys, cells };
|
|
172
|
+
}
|
|
173
|
+
export function buildBulletChartModel(model, data, config) {
|
|
174
|
+
const valueMeasure = resolveMeasure(model, config.value, 'bullet value');
|
|
175
|
+
const targetMeasure = resolveMeasure(model, config.target, 'bullet target');
|
|
176
|
+
if (config.category !== undefined) {
|
|
177
|
+
assertDimension(model, config.category, 'bullet category');
|
|
178
|
+
}
|
|
179
|
+
const ranges = finiteNumbers(config.ranges, 'Bullet ranges');
|
|
180
|
+
const groups = config.category === undefined
|
|
181
|
+
? new Map([['All', [...data]]])
|
|
182
|
+
: groupRows(data, config.category);
|
|
183
|
+
return {
|
|
184
|
+
label: config.label ?? valueMeasure.label,
|
|
185
|
+
valueId: config.value,
|
|
186
|
+
targetId: config.target,
|
|
187
|
+
data: Array.from(groups, ([key, rows]) => {
|
|
188
|
+
const datum = {
|
|
189
|
+
key,
|
|
190
|
+
label: key,
|
|
191
|
+
value: aggregate([...rows], valueMeasure),
|
|
192
|
+
target: aggregate([...rows], targetMeasure),
|
|
193
|
+
};
|
|
194
|
+
if (ranges !== undefined)
|
|
195
|
+
datum.ranges = ranges;
|
|
196
|
+
return datum;
|
|
197
|
+
}),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
export function buildGaugeChartModel(model, data, config) {
|
|
201
|
+
const valueMeasure = resolveMeasure(model, config.value, 'gauge value');
|
|
202
|
+
const min = config.min ?? 0;
|
|
203
|
+
const max = config.max ?? 100;
|
|
204
|
+
assertDomain(min, max, 'Gauge');
|
|
205
|
+
const thresholds = config.thresholds === undefined
|
|
206
|
+
? undefined
|
|
207
|
+
: [...config.thresholds]
|
|
208
|
+
.map((threshold) => {
|
|
209
|
+
if (!Number.isFinite(threshold.value)) {
|
|
210
|
+
throw new Error('Gauge threshold values must be finite');
|
|
211
|
+
}
|
|
212
|
+
return { ...threshold };
|
|
213
|
+
})
|
|
214
|
+
.sort((a, b) => a.value - b.value);
|
|
215
|
+
const value = aggregate([...data], valueMeasure);
|
|
216
|
+
const out = {
|
|
217
|
+
label: config.label ?? valueMeasure.label,
|
|
218
|
+
valueId: config.value,
|
|
219
|
+
value,
|
|
220
|
+
displayValue: Number.isFinite(value) ? clamp(value, min, max) : value,
|
|
221
|
+
min,
|
|
222
|
+
max,
|
|
223
|
+
format: config.format ?? 'number',
|
|
224
|
+
};
|
|
225
|
+
if (thresholds !== undefined)
|
|
226
|
+
out.thresholds = thresholds;
|
|
227
|
+
if (config.unit !== undefined)
|
|
228
|
+
out.unit = config.unit;
|
|
229
|
+
return out;
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=distribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../src/distribution.ts"],"names":[],"mappings":"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"}
|
package/dist/fields.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-pane view models.
|
|
3
|
+
*
|
|
4
|
+
* The core owns BI semantics (dimension/measure, folders, hierarchies, stable
|
|
5
|
+
* field ids). Framework packages can render these models with DS primitives
|
|
6
|
+
* such as TreeView and Tag without duplicating field logic.
|
|
7
|
+
*/
|
|
8
|
+
import type { Aggregation, DataModel, DimensionType } from './model.js';
|
|
9
|
+
export type FieldKind = 'dimension' | 'measure';
|
|
10
|
+
export type FieldId = `${FieldKind}:${string}`;
|
|
11
|
+
export type FieldPillTone = 'neutral' | 'info' | 'success' | 'warning' | 'error';
|
|
12
|
+
export interface FieldDescriptor {
|
|
13
|
+
id: FieldId;
|
|
14
|
+
sourceId: string;
|
|
15
|
+
kind: FieldKind;
|
|
16
|
+
label: string;
|
|
17
|
+
folder?: string;
|
|
18
|
+
role: DimensionType | Aggregation;
|
|
19
|
+
type?: DimensionType;
|
|
20
|
+
aggregation?: Aggregation;
|
|
21
|
+
hierarchy?: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface FieldPaneNode {
|
|
24
|
+
id: string;
|
|
25
|
+
label: string;
|
|
26
|
+
children?: FieldPaneNode[];
|
|
27
|
+
disabled?: boolean;
|
|
28
|
+
field?: FieldDescriptor;
|
|
29
|
+
}
|
|
30
|
+
export interface FieldPaneTree {
|
|
31
|
+
nodes: FieldPaneNode[];
|
|
32
|
+
defaultExpandedIds: string[];
|
|
33
|
+
}
|
|
34
|
+
export interface FieldPaneOptions {
|
|
35
|
+
includeDimensions?: boolean;
|
|
36
|
+
includeMeasures?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface FieldPillModel {
|
|
39
|
+
id: FieldId;
|
|
40
|
+
label: string;
|
|
41
|
+
detail: string;
|
|
42
|
+
kind: FieldKind;
|
|
43
|
+
tone: FieldPillTone;
|
|
44
|
+
}
|
|
45
|
+
export declare function fieldId(kind: FieldKind, sourceId: string): FieldId;
|
|
46
|
+
export declare function parseFieldId(id: string): {
|
|
47
|
+
kind: FieldKind;
|
|
48
|
+
sourceId: string;
|
|
49
|
+
} | undefined;
|
|
50
|
+
export declare function listFields(model: DataModel): FieldDescriptor[];
|
|
51
|
+
export declare function buildFieldPaneTree(model: DataModel, options?: FieldPaneOptions): FieldPaneTree;
|
|
52
|
+
export declare function fieldToPill(field: FieldDescriptor): FieldPillModel;
|
|
53
|
+
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAChD,MAAM,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;AAC/C,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,GAAG,WAAW,CAAC;IAClC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM1F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,eAAe,EAAE,CA6B9D;AAqCD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,gBAAqB,GAC7B,aAAa,CAgCf;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CAmBlE"}
|