@matthieumordrel/chart-studio 0.1.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/LICENSE +21 -0
- package/README.md +371 -0
- package/dist/core/chart-capabilities.d.ts +60 -0
- package/dist/core/chart-capabilities.d.ts.map +1 -0
- package/dist/core/chart-capabilities.js +55 -0
- package/dist/core/chart-capabilities.js.map +1 -0
- package/dist/core/colors.d.ts +25 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +55 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/config-utils.d.ts +43 -0
- package/dist/core/config-utils.d.ts.map +1 -0
- package/dist/core/config-utils.js +81 -0
- package/dist/core/config-utils.js.map +1 -0
- package/dist/core/date-utils.d.ts +29 -0
- package/dist/core/date-utils.d.ts.map +1 -0
- package/dist/core/date-utils.js +59 -0
- package/dist/core/date-utils.js.map +1 -0
- package/dist/core/define-chart-schema.d.ts +105 -0
- package/dist/core/define-chart-schema.d.ts.map +1 -0
- package/dist/core/define-chart-schema.js +45 -0
- package/dist/core/define-chart-schema.js.map +1 -0
- package/dist/core/formatting.d.ts +47 -0
- package/dist/core/formatting.d.ts.map +1 -0
- package/dist/core/formatting.js +397 -0
- package/dist/core/formatting.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/infer-columns.d.ts +6 -0
- package/dist/core/infer-columns.d.ts.map +1 -0
- package/dist/core/infer-columns.js +513 -0
- package/dist/core/infer-columns.js.map +1 -0
- package/dist/core/metric-utils.d.ts +43 -0
- package/dist/core/metric-utils.d.ts.map +1 -0
- package/dist/core/metric-utils.js +142 -0
- package/dist/core/metric-utils.js.map +1 -0
- package/dist/core/pipeline-data-points.d.ts +23 -0
- package/dist/core/pipeline-data-points.d.ts.map +1 -0
- package/dist/core/pipeline-data-points.js +236 -0
- package/dist/core/pipeline-data-points.js.map +1 -0
- package/dist/core/pipeline-helpers.d.ts +38 -0
- package/dist/core/pipeline-helpers.d.ts.map +1 -0
- package/dist/core/pipeline-helpers.js +98 -0
- package/dist/core/pipeline-helpers.js.map +1 -0
- package/dist/core/pipeline.d.ts +70 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +157 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/types.d.ts +1109 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +15 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/use-chart-options.d.ts +66 -0
- package/dist/core/use-chart-options.d.ts.map +1 -0
- package/dist/core/use-chart-options.js +5 -0
- package/dist/core/use-chart-options.js.map +1 -0
- package/dist/core/use-chart-resolvers.d.ts +14 -0
- package/dist/core/use-chart-resolvers.d.ts.map +1 -0
- package/dist/core/use-chart-resolvers.js +42 -0
- package/dist/core/use-chart-resolvers.js.map +1 -0
- package/dist/core/use-chart.d.ts +47 -0
- package/dist/core/use-chart.d.ts.map +1 -0
- package/dist/core/use-chart.js +266 -0
- package/dist/core/use-chart.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/chart-axis-ticks.d.ts +35 -0
- package/dist/ui/chart-axis-ticks.d.ts.map +1 -0
- package/dist/ui/chart-axis-ticks.js +80 -0
- package/dist/ui/chart-axis-ticks.js.map +1 -0
- package/dist/ui/chart-canvas.d.ts +22 -0
- package/dist/ui/chart-canvas.d.ts.map +1 -0
- package/dist/ui/chart-canvas.js +338 -0
- package/dist/ui/chart-canvas.js.map +1 -0
- package/dist/ui/chart-context.d.ts +89 -0
- package/dist/ui/chart-context.d.ts.map +1 -0
- package/dist/ui/chart-context.js +129 -0
- package/dist/ui/chart-context.js.map +1 -0
- package/dist/ui/chart-date-range-badge.d.ts +14 -0
- package/dist/ui/chart-date-range-badge.d.ts.map +1 -0
- package/dist/ui/chart-date-range-badge.js +31 -0
- package/dist/ui/chart-date-range-badge.js.map +1 -0
- package/dist/ui/chart-date-range-panel.d.ts +25 -0
- package/dist/ui/chart-date-range-panel.d.ts.map +1 -0
- package/dist/ui/chart-date-range-panel.js +126 -0
- package/dist/ui/chart-date-range-panel.js.map +1 -0
- package/dist/ui/chart-date-range.d.ts +14 -0
- package/dist/ui/chart-date-range.d.ts.map +1 -0
- package/dist/ui/chart-date-range.js +38 -0
- package/dist/ui/chart-date-range.js.map +1 -0
- package/dist/ui/chart-debug.d.ts +10 -0
- package/dist/ui/chart-debug.d.ts.map +1 -0
- package/dist/ui/chart-debug.js +127 -0
- package/dist/ui/chart-debug.js.map +1 -0
- package/dist/ui/chart-dropdown.d.ts +35 -0
- package/dist/ui/chart-dropdown.d.ts.map +1 -0
- package/dist/ui/chart-dropdown.js +77 -0
- package/dist/ui/chart-dropdown.js.map +1 -0
- package/dist/ui/chart-filters-panel.d.ts +19 -0
- package/dist/ui/chart-filters-panel.d.ts.map +1 -0
- package/dist/ui/chart-filters-panel.js +47 -0
- package/dist/ui/chart-filters-panel.js.map +1 -0
- package/dist/ui/chart-filters.d.ts +12 -0
- package/dist/ui/chart-filters.d.ts.map +1 -0
- package/dist/ui/chart-filters.js +27 -0
- package/dist/ui/chart-filters.js.map +1 -0
- package/dist/ui/chart-group-by-selector.d.ts +8 -0
- package/dist/ui/chart-group-by-selector.d.ts.map +1 -0
- package/dist/ui/chart-group-by-selector.js +20 -0
- package/dist/ui/chart-group-by-selector.js.map +1 -0
- package/dist/ui/chart-metric-panel.d.ts +18 -0
- package/dist/ui/chart-metric-panel.d.ts.map +1 -0
- package/dist/ui/chart-metric-panel.js +119 -0
- package/dist/ui/chart-metric-panel.js.map +1 -0
- package/dist/ui/chart-metric-selector.d.ts +10 -0
- package/dist/ui/chart-metric-selector.d.ts.map +1 -0
- package/dist/ui/chart-metric-selector.js +28 -0
- package/dist/ui/chart-metric-selector.js.map +1 -0
- package/dist/ui/chart-select.d.ts +25 -0
- package/dist/ui/chart-select.d.ts.map +1 -0
- package/dist/ui/chart-select.js +36 -0
- package/dist/ui/chart-select.js.map +1 -0
- package/dist/ui/chart-source-switcher.d.ts +16 -0
- package/dist/ui/chart-source-switcher.d.ts.map +1 -0
- package/dist/ui/chart-source-switcher.js +32 -0
- package/dist/ui/chart-source-switcher.js.map +1 -0
- package/dist/ui/chart-time-bucket-selector.d.ts +9 -0
- package/dist/ui/chart-time-bucket-selector.d.ts.map +1 -0
- package/dist/ui/chart-time-bucket-selector.js +26 -0
- package/dist/ui/chart-time-bucket-selector.js.map +1 -0
- package/dist/ui/chart-toolbar-overflow.d.ts +29 -0
- package/dist/ui/chart-toolbar-overflow.d.ts.map +1 -0
- package/dist/ui/chart-toolbar-overflow.js +110 -0
- package/dist/ui/chart-toolbar-overflow.js.map +1 -0
- package/dist/ui/chart-toolbar.d.ts +45 -0
- package/dist/ui/chart-toolbar.d.ts.map +1 -0
- package/dist/ui/chart-toolbar.js +45 -0
- package/dist/ui/chart-toolbar.js.map +1 -0
- package/dist/ui/chart-type-selector.d.ts +8 -0
- package/dist/ui/chart-type-selector.d.ts.map +1 -0
- package/dist/ui/chart-type-selector.js +23 -0
- package/dist/ui/chart-type-selector.js.map +1 -0
- package/dist/ui/chart-x-axis-selector.d.ts +8 -0
- package/dist/ui/chart-x-axis-selector.d.ts.map +1 -0
- package/dist/ui/chart-x-axis-selector.js +15 -0
- package/dist/ui/chart-x-axis-selector.js.map +1 -0
- package/dist/ui/index.d.ts +25 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +24 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/theme.css +62 -0
- package/dist/ui/toolbar-types.d.ts +43 -0
- package/dist/ui/toolbar-types.d.ts.map +1 -0
- package/dist/ui/toolbar-types.js +51 -0
- package/dist/ui/toolbar-types.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data transformation pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions that transform raw data into chart-ready format.
|
|
5
|
+
* Pipeline: Raw Data -> Filter -> Bucket by X-axis -> Pivot by groupBy -> Aggregate -> Sort
|
|
6
|
+
*/
|
|
7
|
+
import { getSeriesColor } from './colors.js';
|
|
8
|
+
import { formatChartValue } from './formatting.js';
|
|
9
|
+
import { getMetricLabel } from './metric-utils.js';
|
|
10
|
+
import { buildDataPoints } from './pipeline-data-points.js';
|
|
11
|
+
import { getStringValue } from './pipeline-helpers.js';
|
|
12
|
+
/**
|
|
13
|
+
* Apply active filters to the raw data.
|
|
14
|
+
* Filters are AND-combined across columns and OR-combined within a column.
|
|
15
|
+
*
|
|
16
|
+
* @param data - Raw data items
|
|
17
|
+
* @param columns - Column definitions used to read values
|
|
18
|
+
* @param filters - Active filter state
|
|
19
|
+
* @returns Filtered data items
|
|
20
|
+
*/
|
|
21
|
+
export function applyFilters(data, columns, filters) {
|
|
22
|
+
if (filters.size === 0)
|
|
23
|
+
return [...data];
|
|
24
|
+
return data.filter((item) => {
|
|
25
|
+
for (const [columnId, activeValues] of filters) {
|
|
26
|
+
if (activeValues.size === 0)
|
|
27
|
+
continue;
|
|
28
|
+
const column = columns.find((candidate) => candidate.id === columnId);
|
|
29
|
+
if (!column)
|
|
30
|
+
continue;
|
|
31
|
+
if (!activeValues.has(getStringValue(item, column))) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Apply sorting to transformed data points.
|
|
40
|
+
*
|
|
41
|
+
* @param data - Aggregated chart data points
|
|
42
|
+
* @param sorting - Explicit sort configuration
|
|
43
|
+
* @param isTimeSeries - Whether the X-axis is date-based
|
|
44
|
+
* @returns Sorted chart data points
|
|
45
|
+
*/
|
|
46
|
+
function applySorting(data, sorting, isTimeSeries) {
|
|
47
|
+
if (isTimeSeries) {
|
|
48
|
+
return data.toSorted((a, b) => String(a['xKey']).localeCompare(String(b['xKey'])));
|
|
49
|
+
}
|
|
50
|
+
if (!sorting) {
|
|
51
|
+
return data.toSorted((a, b) => getPointTotal(b) - getPointTotal(a));
|
|
52
|
+
}
|
|
53
|
+
const direction = sorting.direction === 'asc' ? 1 : -1;
|
|
54
|
+
return data.toSorted((a, b) => {
|
|
55
|
+
const aValue = a[sorting.key] ?? 0;
|
|
56
|
+
const bValue = b[sorting.key] ?? 0;
|
|
57
|
+
if (typeof aValue === 'number' && typeof bValue === 'number') {
|
|
58
|
+
return (aValue - bValue) * direction;
|
|
59
|
+
}
|
|
60
|
+
return String(aValue).localeCompare(String(bValue)) * direction;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Sum all numeric series values for a transformed data point.
|
|
65
|
+
*
|
|
66
|
+
* @param point - Transformed chart data point
|
|
67
|
+
* @returns Combined numeric total across series keys
|
|
68
|
+
*/
|
|
69
|
+
function getPointTotal(point) {
|
|
70
|
+
return Object.entries(point)
|
|
71
|
+
.filter(([key]) => key !== 'xLabel' && key !== 'xKey')
|
|
72
|
+
.reduce((sum, [, value]) => sum + (typeof value === 'number' ? value : 0), 0);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Build recharts series definitions from group labels.
|
|
76
|
+
*
|
|
77
|
+
* @param groups - Group labels returned by the pivot step
|
|
78
|
+
* @param metricLabel - Human-readable label for the selected metric
|
|
79
|
+
* @param useShadcn - Whether to use shadcn-compatible color variables
|
|
80
|
+
* @returns Recharts series metadata
|
|
81
|
+
*/
|
|
82
|
+
function buildSeries(groups, metricLabel, useShadcn = true) {
|
|
83
|
+
return groups.map((group, index) => ({
|
|
84
|
+
dataKey: group,
|
|
85
|
+
label: group === 'value' ? metricLabel : group,
|
|
86
|
+
color: getSeriesColor(index, useShadcn),
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Run the full transformation pipeline.
|
|
91
|
+
*
|
|
92
|
+
* Raw Data -> Filter -> Bucket -> Pivot -> Aggregate -> Sort -> Output
|
|
93
|
+
*
|
|
94
|
+
* @param input - Pipeline configuration and source data
|
|
95
|
+
* @returns Transformed data, series metadata, and group labels
|
|
96
|
+
*/
|
|
97
|
+
export function runPipeline(input) {
|
|
98
|
+
const { data, columns, xAxisId, groupById, metric, timeBucket, filters, sorting } = input;
|
|
99
|
+
const xColumn = columns.find((column) => column.id === xAxisId);
|
|
100
|
+
if (!xColumn)
|
|
101
|
+
return { data: [], series: [], groups: [] };
|
|
102
|
+
const groupByColumn = groupById
|
|
103
|
+
? (columns.find((column) => column.id === groupById) ?? null)
|
|
104
|
+
: null;
|
|
105
|
+
const numberColumns = columns.filter((column) => column.type === 'number');
|
|
106
|
+
const filtered = applyFilters(data, columns, filters);
|
|
107
|
+
const { data: points, groups } = buildDataPoints(filtered, xColumn, groupByColumn, metric, numberColumns, timeBucket);
|
|
108
|
+
return {
|
|
109
|
+
data: applySorting(points, sorting, xColumn.type === 'date'),
|
|
110
|
+
series: buildSeries(groups, getMetricLabel(metric, columns)),
|
|
111
|
+
groups,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Extract available filter options from data for every category and boolean
|
|
116
|
+
* column.
|
|
117
|
+
*
|
|
118
|
+
* @param data - Raw data items
|
|
119
|
+
* @param columns - Column definitions
|
|
120
|
+
* @returns Filter metadata and option counts per filterable column
|
|
121
|
+
*/
|
|
122
|
+
export function extractAvailableFilters(data, columns) {
|
|
123
|
+
const filterableColumns = columns.filter((column) => column.type === 'category' || column.type === 'boolean');
|
|
124
|
+
return filterableColumns.map((column) => {
|
|
125
|
+
const counts = new Map();
|
|
126
|
+
for (const item of data) {
|
|
127
|
+
const value = getStringValue(item, column);
|
|
128
|
+
const formattedLabel = formatFilterOptionLabel(item, column);
|
|
129
|
+
const existing = counts.get(value);
|
|
130
|
+
if (existing) {
|
|
131
|
+
counts.set(value, { count: existing.count + 1, label: existing.label });
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
counts.set(value, { count: 1, label: formattedLabel });
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
columnId: column.id,
|
|
138
|
+
label: column.label,
|
|
139
|
+
type: column.type,
|
|
140
|
+
options: [...counts.entries()]
|
|
141
|
+
.toSorted(([, left], [, right]) => right.count - left.count)
|
|
142
|
+
.map(([value, option]) => ({ value, label: option.label, count: option.count })),
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Derive one human-facing filter option label from the typed column value while
|
|
148
|
+
* keeping the underlying filter state keyed by the stable string value.
|
|
149
|
+
*/
|
|
150
|
+
function formatFilterOptionLabel(item, column) {
|
|
151
|
+
return formatChartValue(column.accessor(item), {
|
|
152
|
+
column,
|
|
153
|
+
surface: 'tooltip',
|
|
154
|
+
item,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"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"}
|