@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.
Files changed (160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +371 -0
  3. package/dist/core/chart-capabilities.d.ts +60 -0
  4. package/dist/core/chart-capabilities.d.ts.map +1 -0
  5. package/dist/core/chart-capabilities.js +55 -0
  6. package/dist/core/chart-capabilities.js.map +1 -0
  7. package/dist/core/colors.d.ts +25 -0
  8. package/dist/core/colors.d.ts.map +1 -0
  9. package/dist/core/colors.js +55 -0
  10. package/dist/core/colors.js.map +1 -0
  11. package/dist/core/config-utils.d.ts +43 -0
  12. package/dist/core/config-utils.d.ts.map +1 -0
  13. package/dist/core/config-utils.js +81 -0
  14. package/dist/core/config-utils.js.map +1 -0
  15. package/dist/core/date-utils.d.ts +29 -0
  16. package/dist/core/date-utils.d.ts.map +1 -0
  17. package/dist/core/date-utils.js +59 -0
  18. package/dist/core/date-utils.js.map +1 -0
  19. package/dist/core/define-chart-schema.d.ts +105 -0
  20. package/dist/core/define-chart-schema.d.ts.map +1 -0
  21. package/dist/core/define-chart-schema.js +45 -0
  22. package/dist/core/define-chart-schema.js.map +1 -0
  23. package/dist/core/formatting.d.ts +47 -0
  24. package/dist/core/formatting.d.ts.map +1 -0
  25. package/dist/core/formatting.js +397 -0
  26. package/dist/core/formatting.js.map +1 -0
  27. package/dist/core/index.d.ts +17 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/index.js +13 -0
  30. package/dist/core/index.js.map +1 -0
  31. package/dist/core/infer-columns.d.ts +6 -0
  32. package/dist/core/infer-columns.d.ts.map +1 -0
  33. package/dist/core/infer-columns.js +513 -0
  34. package/dist/core/infer-columns.js.map +1 -0
  35. package/dist/core/metric-utils.d.ts +43 -0
  36. package/dist/core/metric-utils.d.ts.map +1 -0
  37. package/dist/core/metric-utils.js +142 -0
  38. package/dist/core/metric-utils.js.map +1 -0
  39. package/dist/core/pipeline-data-points.d.ts +23 -0
  40. package/dist/core/pipeline-data-points.d.ts.map +1 -0
  41. package/dist/core/pipeline-data-points.js +236 -0
  42. package/dist/core/pipeline-data-points.js.map +1 -0
  43. package/dist/core/pipeline-helpers.d.ts +38 -0
  44. package/dist/core/pipeline-helpers.d.ts.map +1 -0
  45. package/dist/core/pipeline-helpers.js +98 -0
  46. package/dist/core/pipeline-helpers.js.map +1 -0
  47. package/dist/core/pipeline.d.ts +70 -0
  48. package/dist/core/pipeline.d.ts.map +1 -0
  49. package/dist/core/pipeline.js +157 -0
  50. package/dist/core/pipeline.js.map +1 -0
  51. package/dist/core/types.d.ts +1109 -0
  52. package/dist/core/types.d.ts.map +1 -0
  53. package/dist/core/types.js +15 -0
  54. package/dist/core/types.js.map +1 -0
  55. package/dist/core/use-chart-options.d.ts +66 -0
  56. package/dist/core/use-chart-options.d.ts.map +1 -0
  57. package/dist/core/use-chart-options.js +5 -0
  58. package/dist/core/use-chart-options.js.map +1 -0
  59. package/dist/core/use-chart-resolvers.d.ts +14 -0
  60. package/dist/core/use-chart-resolvers.d.ts.map +1 -0
  61. package/dist/core/use-chart-resolvers.js +42 -0
  62. package/dist/core/use-chart-resolvers.js.map +1 -0
  63. package/dist/core/use-chart.d.ts +47 -0
  64. package/dist/core/use-chart.d.ts.map +1 -0
  65. package/dist/core/use-chart.js +266 -0
  66. package/dist/core/use-chart.js.map +1 -0
  67. package/dist/index.d.ts +36 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +36 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/ui/chart-axis-ticks.d.ts +35 -0
  72. package/dist/ui/chart-axis-ticks.d.ts.map +1 -0
  73. package/dist/ui/chart-axis-ticks.js +80 -0
  74. package/dist/ui/chart-axis-ticks.js.map +1 -0
  75. package/dist/ui/chart-canvas.d.ts +22 -0
  76. package/dist/ui/chart-canvas.d.ts.map +1 -0
  77. package/dist/ui/chart-canvas.js +338 -0
  78. package/dist/ui/chart-canvas.js.map +1 -0
  79. package/dist/ui/chart-context.d.ts +89 -0
  80. package/dist/ui/chart-context.d.ts.map +1 -0
  81. package/dist/ui/chart-context.js +129 -0
  82. package/dist/ui/chart-context.js.map +1 -0
  83. package/dist/ui/chart-date-range-badge.d.ts +14 -0
  84. package/dist/ui/chart-date-range-badge.d.ts.map +1 -0
  85. package/dist/ui/chart-date-range-badge.js +31 -0
  86. package/dist/ui/chart-date-range-badge.js.map +1 -0
  87. package/dist/ui/chart-date-range-panel.d.ts +25 -0
  88. package/dist/ui/chart-date-range-panel.d.ts.map +1 -0
  89. package/dist/ui/chart-date-range-panel.js +126 -0
  90. package/dist/ui/chart-date-range-panel.js.map +1 -0
  91. package/dist/ui/chart-date-range.d.ts +14 -0
  92. package/dist/ui/chart-date-range.d.ts.map +1 -0
  93. package/dist/ui/chart-date-range.js +38 -0
  94. package/dist/ui/chart-date-range.js.map +1 -0
  95. package/dist/ui/chart-debug.d.ts +10 -0
  96. package/dist/ui/chart-debug.d.ts.map +1 -0
  97. package/dist/ui/chart-debug.js +127 -0
  98. package/dist/ui/chart-debug.js.map +1 -0
  99. package/dist/ui/chart-dropdown.d.ts +35 -0
  100. package/dist/ui/chart-dropdown.d.ts.map +1 -0
  101. package/dist/ui/chart-dropdown.js +77 -0
  102. package/dist/ui/chart-dropdown.js.map +1 -0
  103. package/dist/ui/chart-filters-panel.d.ts +19 -0
  104. package/dist/ui/chart-filters-panel.d.ts.map +1 -0
  105. package/dist/ui/chart-filters-panel.js +47 -0
  106. package/dist/ui/chart-filters-panel.js.map +1 -0
  107. package/dist/ui/chart-filters.d.ts +12 -0
  108. package/dist/ui/chart-filters.d.ts.map +1 -0
  109. package/dist/ui/chart-filters.js +27 -0
  110. package/dist/ui/chart-filters.js.map +1 -0
  111. package/dist/ui/chart-group-by-selector.d.ts +8 -0
  112. package/dist/ui/chart-group-by-selector.d.ts.map +1 -0
  113. package/dist/ui/chart-group-by-selector.js +20 -0
  114. package/dist/ui/chart-group-by-selector.js.map +1 -0
  115. package/dist/ui/chart-metric-panel.d.ts +18 -0
  116. package/dist/ui/chart-metric-panel.d.ts.map +1 -0
  117. package/dist/ui/chart-metric-panel.js +119 -0
  118. package/dist/ui/chart-metric-panel.js.map +1 -0
  119. package/dist/ui/chart-metric-selector.d.ts +10 -0
  120. package/dist/ui/chart-metric-selector.d.ts.map +1 -0
  121. package/dist/ui/chart-metric-selector.js +28 -0
  122. package/dist/ui/chart-metric-selector.js.map +1 -0
  123. package/dist/ui/chart-select.d.ts +25 -0
  124. package/dist/ui/chart-select.d.ts.map +1 -0
  125. package/dist/ui/chart-select.js +36 -0
  126. package/dist/ui/chart-select.js.map +1 -0
  127. package/dist/ui/chart-source-switcher.d.ts +16 -0
  128. package/dist/ui/chart-source-switcher.d.ts.map +1 -0
  129. package/dist/ui/chart-source-switcher.js +32 -0
  130. package/dist/ui/chart-source-switcher.js.map +1 -0
  131. package/dist/ui/chart-time-bucket-selector.d.ts +9 -0
  132. package/dist/ui/chart-time-bucket-selector.d.ts.map +1 -0
  133. package/dist/ui/chart-time-bucket-selector.js +26 -0
  134. package/dist/ui/chart-time-bucket-selector.js.map +1 -0
  135. package/dist/ui/chart-toolbar-overflow.d.ts +29 -0
  136. package/dist/ui/chart-toolbar-overflow.d.ts.map +1 -0
  137. package/dist/ui/chart-toolbar-overflow.js +110 -0
  138. package/dist/ui/chart-toolbar-overflow.js.map +1 -0
  139. package/dist/ui/chart-toolbar.d.ts +45 -0
  140. package/dist/ui/chart-toolbar.d.ts.map +1 -0
  141. package/dist/ui/chart-toolbar.js +45 -0
  142. package/dist/ui/chart-toolbar.js.map +1 -0
  143. package/dist/ui/chart-type-selector.d.ts +8 -0
  144. package/dist/ui/chart-type-selector.d.ts.map +1 -0
  145. package/dist/ui/chart-type-selector.js +23 -0
  146. package/dist/ui/chart-type-selector.js.map +1 -0
  147. package/dist/ui/chart-x-axis-selector.d.ts +8 -0
  148. package/dist/ui/chart-x-axis-selector.d.ts.map +1 -0
  149. package/dist/ui/chart-x-axis-selector.js +15 -0
  150. package/dist/ui/chart-x-axis-selector.js.map +1 -0
  151. package/dist/ui/index.d.ts +25 -0
  152. package/dist/ui/index.d.ts.map +1 -0
  153. package/dist/ui/index.js +24 -0
  154. package/dist/ui/index.js.map +1 -0
  155. package/dist/ui/theme.css +62 -0
  156. package/dist/ui/toolbar-types.d.ts +43 -0
  157. package/dist/ui/toolbar-types.d.ts.map +1 -0
  158. package/dist/ui/toolbar-types.js +51 -0
  159. package/dist/ui/toolbar-types.js.map +1 -0
  160. 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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"}