@tanstack/table-core 9.0.0-beta.50 → 9.0.0-beta.52
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/features/column-grouping/createGroupedRowModel.cjs +22 -14
- package/dist/features/column-grouping/createGroupedRowModel.cjs.map +1 -1
- package/dist/features/column-grouping/createGroupedRowModel.d.cts +1 -1
- package/dist/features/column-grouping/createGroupedRowModel.d.ts +1 -1
- package/dist/features/column-grouping/createGroupedRowModel.js +21 -13
- package/dist/features/column-grouping/createGroupedRowModel.js.map +1 -1
- package/dist/features/{aggregation → row-aggregation}/aggregationFns.cjs +93 -48
- package/dist/features/row-aggregation/aggregationFns.cjs.map +1 -0
- package/dist/features/{aggregation → row-aggregation}/aggregationFns.d.cts +2 -2
- package/dist/features/{aggregation → row-aggregation}/aggregationFns.d.ts +2 -2
- package/dist/features/{aggregation → row-aggregation}/aggregationFns.js +82 -37
- package/dist/features/row-aggregation/aggregationFns.js.map +1 -0
- package/dist/features/row-aggregation/rowAggregationFeature.cjs +36 -0
- package/dist/features/row-aggregation/rowAggregationFeature.cjs.map +1 -0
- package/dist/features/row-aggregation/rowAggregationFeature.d.cts +10 -0
- package/dist/features/row-aggregation/rowAggregationFeature.d.ts +10 -0
- package/dist/features/{aggregation/aggregationFeature.js → row-aggregation/rowAggregationFeature.js} +8 -11
- package/dist/features/row-aggregation/rowAggregationFeature.js.map +1 -0
- package/dist/features/{aggregation/aggregationFeature.types.cjs → row-aggregation/rowAggregationFeature.types.cjs} +2 -2
- package/dist/features/row-aggregation/rowAggregationFeature.types.cjs.map +1 -0
- package/dist/features/{aggregation/aggregationFeature.types.d.cts → row-aggregation/rowAggregationFeature.types.d.cts} +8 -8
- package/dist/features/{aggregation/aggregationFeature.types.d.ts → row-aggregation/rowAggregationFeature.types.d.ts} +8 -8
- package/dist/features/{aggregation/aggregationFeature.types.js → row-aggregation/rowAggregationFeature.types.js} +2 -2
- package/dist/features/row-aggregation/rowAggregationFeature.types.js.map +1 -0
- package/dist/features/{aggregation/aggregationFeature.utils.cjs → row-aggregation/rowAggregationFeature.utils.cjs} +37 -6
- package/dist/features/row-aggregation/rowAggregationFeature.utils.cjs.map +1 -0
- package/dist/features/{aggregation/aggregationFeature.utils.d.cts → row-aggregation/rowAggregationFeature.utils.d.cts} +18 -4
- package/dist/features/{aggregation/aggregationFeature.utils.d.ts → row-aggregation/rowAggregationFeature.utils.d.ts} +18 -4
- package/dist/features/{aggregation/aggregationFeature.utils.js → row-aggregation/rowAggregationFeature.utils.js} +37 -7
- package/dist/features/row-aggregation/rowAggregationFeature.utils.js.map +1 -0
- package/dist/features/stockFeatures.cjs +2 -2
- package/dist/features/stockFeatures.cjs.map +1 -1
- package/dist/features/stockFeatures.d.cts +2 -2
- package/dist/features/stockFeatures.d.ts +2 -2
- package/dist/features/stockFeatures.js +2 -2
- package/dist/features/stockFeatures.js.map +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/static-functions.cjs +9 -8
- package/dist/static-functions.d.cts +2 -2
- package/dist/static-functions.d.ts +2 -2
- package/dist/static-functions.js +2 -2
- package/dist/types/Cell.d.cts +2 -2
- package/dist/types/Cell.d.ts +2 -2
- package/dist/types/Column.d.cts +2 -2
- package/dist/types/Column.d.ts +2 -2
- package/dist/types/ColumnDef.d.cts +2 -2
- package/dist/types/ColumnDef.d.ts +2 -2
- package/dist/types/Row.d.cts +2 -2
- package/dist/types/Row.d.ts +2 -2
- package/dist/types/RowModelFns.d.cts +2 -2
- package/dist/types/RowModelFns.d.ts +2 -2
- package/dist/types/TableFeatures.d.cts +2 -2
- package/dist/types/TableFeatures.d.ts +2 -2
- package/dist/types/TableOptions.d.cts +3 -3
- package/dist/types/TableOptions.d.ts +3 -3
- package/dist/worker/initTableWorker.cjs.map +1 -1
- package/dist/worker/initTableWorker.js.map +1 -1
- package/package.json +1 -1
- package/skills/aggregation/SKILL.md +6 -6
- package/skills/api-not-found/SKILL.md +1 -1
- package/skills/client-vs-server/SKILL.md +1 -1
- package/skills/column-faceting/SKILL.md +1 -1
- package/skills/column-filtering/SKILL.md +1 -1
- package/skills/column-ordering/SKILL.md +1 -1
- package/skills/column-pinning/SKILL.md +1 -1
- package/skills/column-resizing/SKILL.md +1 -1
- package/skills/column-sizing/SKILL.md +1 -1
- package/skills/column-visibility/SKILL.md +1 -1
- package/skills/core/SKILL.md +1 -1
- package/skills/custom-features/SKILL.md +1 -1
- package/skills/expanding/SKILL.md +1 -1
- package/skills/global-filtering/SKILL.md +1 -1
- package/skills/grouping/SKILL.md +1 -1
- package/skills/migrate-v8-to-v9/SKILL.md +8 -8
- package/skills/pagination/SKILL.md +1 -1
- package/skills/row-pinning/SKILL.md +1 -1
- package/skills/row-selection/SKILL.md +1 -1
- package/skills/sorting/SKILL.md +1 -1
- package/skills/table-features/SKILL.md +5 -5
- package/skills/typescript/SKILL.md +1 -1
- package/src/features/column-grouping/createGroupedRowModel.ts +49 -12
- package/src/features/{aggregation → row-aggregation}/aggregationFns.ts +81 -43
- package/src/features/{aggregation/aggregationFeature.ts → row-aggregation/rowAggregationFeature.ts} +5 -9
- package/src/features/{aggregation/aggregationFeature.types.ts → row-aggregation/rowAggregationFeature.types.ts} +6 -6
- package/src/features/{aggregation/aggregationFeature.utils.ts → row-aggregation/rowAggregationFeature.utils.ts} +61 -4
- package/src/features/stockFeatures.ts +3 -3
- package/src/index.ts +4 -4
- package/src/static-functions.ts +1 -1
- package/src/types/Cell.ts +2 -2
- package/src/types/Column.ts +2 -2
- package/src/types/ColumnDef.ts +2 -2
- package/src/types/Row.ts +2 -2
- package/src/types/RowModelFns.ts +2 -2
- package/src/types/TableFeatures.ts +2 -2
- package/src/types/TableOptions.ts +3 -3
- package/src/worker/initTableWorker.ts +1 -1
- package/dist/features/aggregation/aggregationFeature.cjs +0 -39
- package/dist/features/aggregation/aggregationFeature.cjs.map +0 -1
- package/dist/features/aggregation/aggregationFeature.d.cts +0 -10
- package/dist/features/aggregation/aggregationFeature.d.ts +0 -10
- package/dist/features/aggregation/aggregationFeature.js.map +0 -1
- package/dist/features/aggregation/aggregationFeature.types.cjs.map +0 -1
- package/dist/features/aggregation/aggregationFeature.types.js.map +0 -1
- package/dist/features/aggregation/aggregationFeature.utils.cjs.map +0 -1
- package/dist/features/aggregation/aggregationFeature.utils.js.map +0 -1
- package/dist/features/aggregation/aggregationFns.cjs.map +0 -1
- package/dist/features/aggregation/aggregationFns.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { constructAggregationFn } from "./
|
|
1
|
+
import { constructAggregationFn } from "./rowAggregationFeature.types.js";
|
|
2
2
|
|
|
3
|
-
//#region src/features/aggregation/aggregationFns.ts
|
|
3
|
+
//#region src/features/row-aggregation/aggregationFns.ts
|
|
4
4
|
function isNumber(value) {
|
|
5
5
|
return typeof value === "number";
|
|
6
6
|
}
|
|
@@ -14,17 +14,9 @@ function getRangeKind(value) {
|
|
|
14
14
|
function compareRangeValues(left, right) {
|
|
15
15
|
return (left instanceof Date ? left.getTime() : left) - (right instanceof Date ? right.getTime() : right);
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
for (let i = 0; i < context.rows.length; i++) {
|
|
21
|
-
const value = context.getValue(context.rows[i]);
|
|
22
|
-
const valueKind = getRangeKind(value);
|
|
23
|
-
if (!valueKind) continue;
|
|
24
|
-
kind ??= valueKind;
|
|
25
|
-
if (valueKind === kind) values.push(value);
|
|
26
|
-
}
|
|
27
|
-
return values;
|
|
17
|
+
/** Comparable representation of a range value; `Date`s compare by time. */
|
|
18
|
+
function toRangeNumber(value) {
|
|
19
|
+
return value instanceof Date ? value.getTime() : value;
|
|
28
20
|
}
|
|
29
21
|
/**
|
|
30
22
|
* Sums numeric selected-row values. Non-number values contribute zero. As in
|
|
@@ -32,9 +24,10 @@ function collectRangeValues(context) {
|
|
|
32
24
|
*/
|
|
33
25
|
const aggregationFn_sum = constructAggregationFn({
|
|
34
26
|
aggregate: (context) => {
|
|
27
|
+
const rows = context.rows;
|
|
35
28
|
let sum = 0;
|
|
36
|
-
for (let i = 0; i <
|
|
37
|
-
const value = context.getValue(
|
|
29
|
+
for (let i = 0; i < rows.length; i++) {
|
|
30
|
+
const value = context.getValue(rows[i]);
|
|
38
31
|
sum += typeof value === "number" ? value : 0;
|
|
39
32
|
}
|
|
40
33
|
return sum;
|
|
@@ -54,9 +47,24 @@ const aggregationFn_sum = constructAggregationFn({
|
|
|
54
47
|
*/
|
|
55
48
|
const aggregationFn_min = constructAggregationFn({
|
|
56
49
|
aggregate: (context) => {
|
|
57
|
-
const
|
|
58
|
-
let
|
|
59
|
-
|
|
50
|
+
const rows = context.rows;
|
|
51
|
+
let kind;
|
|
52
|
+
let result;
|
|
53
|
+
let resultNumber = 0;
|
|
54
|
+
for (let i = 0; i < rows.length; i++) {
|
|
55
|
+
const value = context.getValue(rows[i]);
|
|
56
|
+
const valueKind = getRangeKind(value);
|
|
57
|
+
if (!valueKind || kind !== void 0 && valueKind !== kind) continue;
|
|
58
|
+
const valueNumber = toRangeNumber(value);
|
|
59
|
+
if (kind === void 0) {
|
|
60
|
+
kind = valueKind;
|
|
61
|
+
result = value;
|
|
62
|
+
resultNumber = valueNumber;
|
|
63
|
+
} else if (valueNumber - resultNumber < 0) {
|
|
64
|
+
result = value;
|
|
65
|
+
resultNumber = valueNumber;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
60
68
|
return result;
|
|
61
69
|
},
|
|
62
70
|
merge: ({ subRowResults }) => {
|
|
@@ -80,9 +88,24 @@ const aggregationFn_min = constructAggregationFn({
|
|
|
80
88
|
*/
|
|
81
89
|
const aggregationFn_max = constructAggregationFn({
|
|
82
90
|
aggregate: (context) => {
|
|
83
|
-
const
|
|
84
|
-
let
|
|
85
|
-
|
|
91
|
+
const rows = context.rows;
|
|
92
|
+
let kind;
|
|
93
|
+
let result;
|
|
94
|
+
let resultNumber = 0;
|
|
95
|
+
for (let i = 0; i < rows.length; i++) {
|
|
96
|
+
const value = context.getValue(rows[i]);
|
|
97
|
+
const valueKind = getRangeKind(value);
|
|
98
|
+
if (!valueKind || kind !== void 0 && valueKind !== kind) continue;
|
|
99
|
+
const valueNumber = toRangeNumber(value);
|
|
100
|
+
if (kind === void 0) {
|
|
101
|
+
kind = valueKind;
|
|
102
|
+
result = value;
|
|
103
|
+
resultNumber = valueNumber;
|
|
104
|
+
} else if (valueNumber - resultNumber > 0) {
|
|
105
|
+
result = value;
|
|
106
|
+
resultNumber = valueNumber;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
86
109
|
return result;
|
|
87
110
|
},
|
|
88
111
|
merge: ({ subRowResults }) => {
|
|
@@ -107,15 +130,33 @@ const aggregationFn_max = constructAggregationFn({
|
|
|
107
130
|
*/
|
|
108
131
|
const aggregationFn_extent = constructAggregationFn({
|
|
109
132
|
aggregate: (context) => {
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
let min
|
|
113
|
-
let max
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
133
|
+
const rows = context.rows;
|
|
134
|
+
let kind;
|
|
135
|
+
let min;
|
|
136
|
+
let max;
|
|
137
|
+
let minNumber = 0;
|
|
138
|
+
let maxNumber = 0;
|
|
139
|
+
for (let i = 0; i < rows.length; i++) {
|
|
140
|
+
const value = context.getValue(rows[i]);
|
|
141
|
+
const valueKind = getRangeKind(value);
|
|
142
|
+
if (!valueKind || kind !== void 0 && valueKind !== kind) continue;
|
|
143
|
+
const valueNumber = toRangeNumber(value);
|
|
144
|
+
if (kind === void 0) {
|
|
145
|
+
kind = valueKind;
|
|
146
|
+
min = max = value;
|
|
147
|
+
minNumber = maxNumber = valueNumber;
|
|
148
|
+
} else {
|
|
149
|
+
if (valueNumber - minNumber < 0) {
|
|
150
|
+
min = value;
|
|
151
|
+
minNumber = valueNumber;
|
|
152
|
+
}
|
|
153
|
+
if (valueNumber - maxNumber > 0) {
|
|
154
|
+
max = value;
|
|
155
|
+
maxNumber = valueNumber;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
118
158
|
}
|
|
159
|
+
if (kind === void 0) return [void 0, void 0];
|
|
119
160
|
return [min, max];
|
|
120
161
|
},
|
|
121
162
|
merge: ({ subRowResults }) => {
|
|
@@ -144,10 +185,11 @@ const aggregationFn_extent = constructAggregationFn({
|
|
|
144
185
|
* are ignored; other values retain the legacy unary-plus coercion behavior.
|
|
145
186
|
*/
|
|
146
187
|
const aggregationFn_mean = constructAggregationFn({ aggregate: (context) => {
|
|
188
|
+
const rows = context.rows;
|
|
147
189
|
let count = 0;
|
|
148
190
|
let sum = 0;
|
|
149
|
-
for (let i = 0; i <
|
|
150
|
-
const value = context.getValue(
|
|
191
|
+
for (let i = 0; i < rows.length; i++) {
|
|
192
|
+
const value = context.getValue(rows[i]);
|
|
151
193
|
if (value == null) continue;
|
|
152
194
|
const numberValue = typeof value === "number" ? value : +value;
|
|
153
195
|
if (!Number.isNaN(numberValue)) {
|
|
@@ -162,10 +204,11 @@ const aggregationFn_mean = constructAggregationFn({ aggregate: (context) => {
|
|
|
162
204
|
* for empty inputs or when any value is non-numeric.
|
|
163
205
|
*/
|
|
164
206
|
const aggregationFn_median = constructAggregationFn({ aggregate: (context) => {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
207
|
+
const rows = context.rows;
|
|
208
|
+
if (!rows.length) return void 0;
|
|
209
|
+
const values = new Array(rows.length);
|
|
210
|
+
for (let i = 0; i < rows.length; i++) {
|
|
211
|
+
const value = context.getValue(rows[i]);
|
|
169
212
|
if (typeof value !== "number") return void 0;
|
|
170
213
|
values[i] = value;
|
|
171
214
|
}
|
|
@@ -175,14 +218,16 @@ const aggregationFn_median = constructAggregationFn({ aggregate: (context) => {
|
|
|
175
218
|
} });
|
|
176
219
|
/** Collects distinct row values using JavaScript `Set` semantics. */
|
|
177
220
|
const aggregationFn_unique = constructAggregationFn({ aggregate: (context) => {
|
|
221
|
+
const rows = context.rows;
|
|
178
222
|
const values = /* @__PURE__ */ new Set();
|
|
179
|
-
for (let i = 0; i <
|
|
223
|
+
for (let i = 0; i < rows.length; i++) values.add(context.getValue(rows[i]));
|
|
180
224
|
return Array.from(values);
|
|
181
225
|
} });
|
|
182
226
|
/** Counts distinct row values using JavaScript `Set` semantics. */
|
|
183
227
|
const aggregationFn_uniqueCount = constructAggregationFn({ aggregate: (context) => {
|
|
228
|
+
const rows = context.rows;
|
|
184
229
|
const values = /* @__PURE__ */ new Set();
|
|
185
|
-
for (let i = 0; i <
|
|
230
|
+
for (let i = 0; i < rows.length; i++) values.add(context.getValue(rows[i]));
|
|
186
231
|
return values.size;
|
|
187
232
|
} });
|
|
188
233
|
/** Counts rows, independently of the column's values. */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregationFns.js","names":[],"sources":["../../../src/features/row-aggregation/aggregationFns.ts"],"sourcesContent":["import { constructAggregationFn } from './rowAggregationFeature.types'\n\ntype RangeValue = Date | number\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === 'number'\n}\n\nfunction isValidDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime())\n}\n\nfunction getRangeKind(value: unknown): 'date' | 'number' | undefined {\n if (isNumber(value)) return 'number'\n if (isValidDate(value)) return 'date'\n return undefined\n}\n\nfunction compareRangeValues(left: RangeValue, right: RangeValue) {\n const leftValue = left instanceof Date ? left.getTime() : left\n const rightValue = right instanceof Date ? right.getTime() : right\n return leftValue - rightValue\n}\n\n/** Comparable representation of a range value; `Date`s compare by time. */\nfunction toRangeNumber(value: RangeValue): number {\n return value instanceof Date ? value.getTime() : value\n}\n\n/**\n * Sums numeric selected-row values. Non-number values contribute zero. As in\n * the previous API, `NaN` is a number and therefore propagates through the sum.\n */\nexport const aggregationFn_sum = constructAggregationFn<\n any,\n any,\n unknown,\n number\n>({\n aggregate: (context) => {\n const rows = context.rows\n let sum = 0\n for (let i = 0; i < rows.length; i++) {\n const value = context.getValue(rows[i]!)\n sum += typeof value === 'number' ? value : 0\n }\n return sum\n },\n merge: ({ subRowResults }) => {\n let sum = 0\n for (let i = 0; i < subRowResults.length; i++) {\n const value = subRowResults[i]\n if (isNumber(value)) sum += value\n }\n return sum\n },\n})\n\n/**\n * Finds the minimum numeric or Date value from the selected rows. Invalid value\n * types are ignored; `NaN` preserves the legacy numeric seeding behavior.\n */\nexport const aggregationFn_min = constructAggregationFn<\n any,\n any,\n unknown,\n RangeValue | undefined\n>({\n aggregate: (context) => {\n const rows = context.rows\n let kind: 'date' | 'number' | undefined\n let result: RangeValue | undefined\n let resultNumber = 0\n for (let i = 0; i < rows.length; i++) {\n const value = context.getValue(rows[i]!)\n const valueKind = getRangeKind(value)\n if (!valueKind || (kind !== undefined && valueKind !== kind)) continue\n const valueNumber = toRangeNumber(value as RangeValue)\n if (kind === undefined) {\n kind = valueKind\n result = value as RangeValue\n resultNumber = valueNumber\n } else if (valueNumber - resultNumber < 0) {\n result = value as RangeValue\n resultNumber = valueNumber\n }\n }\n return result\n },\n merge: ({ subRowResults }) => {\n let result: RangeValue | undefined\n let kind: 'date' | 'number' | undefined\n for (let i = 0; i < subRowResults.length; i++) {\n const value = subRowResults[i]\n const valueKind = getRangeKind(value)\n if (!valueKind) continue\n if (value === undefined) continue\n kind ??= valueKind\n if (kind !== valueKind) continue\n if (result === undefined || compareRangeValues(value, result) < 0) {\n result = value\n }\n }\n return result\n },\n})\n\n/**\n * Finds the maximum numeric or Date value from the selected rows. Invalid value\n * types are ignored; `NaN` preserves the legacy numeric seeding behavior.\n */\nexport const aggregationFn_max = constructAggregationFn<\n any,\n any,\n unknown,\n RangeValue | undefined\n>({\n aggregate: (context) => {\n const rows = context.rows\n let kind: 'date' | 'number' | undefined\n let result: RangeValue | undefined\n let resultNumber = 0\n for (let i = 0; i < rows.length; i++) {\n const value = context.getValue(rows[i]!)\n const valueKind = getRangeKind(value)\n if (!valueKind || (kind !== undefined && valueKind !== kind)) continue\n const valueNumber = toRangeNumber(value as RangeValue)\n if (kind === undefined) {\n kind = valueKind\n result = value as RangeValue\n resultNumber = valueNumber\n } else if (valueNumber - resultNumber > 0) {\n result = value as RangeValue\n resultNumber = valueNumber\n }\n }\n return result\n },\n merge: ({ subRowResults }) => {\n let result: RangeValue | undefined\n let kind: 'date' | 'number' | undefined\n for (let i = 0; i < subRowResults.length; i++) {\n const value = subRowResults[i]\n const valueKind = getRangeKind(value)\n if (!valueKind) continue\n if (value === undefined) continue\n kind ??= valueKind\n if (kind !== valueKind) continue\n if (result === undefined || compareRangeValues(value, result) > 0) {\n result = value\n }\n }\n return result\n },\n})\n\n/**\n * Finds the minimum and maximum numeric or Date values from the selected rows.\n * Empty inputs return\n * `[undefined, undefined]`, preserving the previous built-in result shape.\n */\nexport const aggregationFn_extent = constructAggregationFn<\n any,\n any,\n unknown,\n [RangeValue | undefined, RangeValue | undefined]\n>({\n aggregate: (context) => {\n const rows = context.rows\n let kind: 'date' | 'number' | undefined\n let min: RangeValue | undefined\n let max: RangeValue | undefined\n let minNumber = 0\n let maxNumber = 0\n for (let i = 0; i < rows.length; i++) {\n const value = context.getValue(rows[i]!)\n const valueKind = getRangeKind(value)\n if (!valueKind || (kind !== undefined && valueKind !== kind)) continue\n const valueNumber = toRangeNumber(value as RangeValue)\n if (kind === undefined) {\n kind = valueKind\n min = max = value as RangeValue\n minNumber = maxNumber = valueNumber\n } else {\n if (valueNumber - minNumber < 0) {\n min = value as RangeValue\n minNumber = valueNumber\n }\n if (valueNumber - maxNumber > 0) {\n max = value as RangeValue\n maxNumber = valueNumber\n }\n }\n }\n if (kind === undefined) return [undefined, undefined]\n return [min, max]\n },\n merge: ({ subRowResults }) => {\n let result: [RangeValue | undefined, RangeValue | undefined] = [\n undefined,\n undefined,\n ]\n let kind: 'date' | 'number' | undefined\n for (let i = 0; i < subRowResults.length; i++) {\n const extent = subRowResults[i]!\n const min = extent[0]\n const max = extent[1]\n const valueKind = getRangeKind(min)\n if (!valueKind || min === undefined || max === undefined) continue\n kind ??= valueKind\n if (kind !== valueKind) continue\n if (result[0] === undefined) {\n result = [min, max]\n } else {\n if (compareRangeValues(min, result[0]) < 0) {\n result[0] = min\n }\n const currentMax = result[1]\n if (\n currentMax === undefined ||\n compareRangeValues(max, currentMax) > 0\n ) {\n result[1] = max\n }\n }\n }\n return result\n },\n})\n\n/**\n * Averages number and number-like row values. Nullish and non-numeric values\n * are ignored; other values retain the legacy unary-plus coercion behavior.\n */\nexport const aggregationFn_mean = constructAggregationFn<\n any,\n any,\n unknown,\n number | undefined\n>({\n aggregate: (context) => {\n const rows = context.rows\n let count = 0\n let sum = 0\n for (let i = 0; i < rows.length; i++) {\n const value = context.getValue(rows[i]!)\n if (value == null) continue\n const numberValue = typeof value === 'number' ? value : +value\n if (!Number.isNaN(numberValue)) {\n count++\n sum += numberValue\n }\n }\n return count ? sum / count : undefined\n },\n})\n\n/**\n * Computes the median when every row value is a number. Returns `undefined`\n * for empty inputs or when any value is non-numeric.\n */\nexport const aggregationFn_median = constructAggregationFn<\n any,\n any,\n unknown,\n number | undefined\n>({\n aggregate: (context) => {\n const rows = context.rows\n if (!rows.length) return undefined\n const values = new Array<number>(rows.length)\n for (let i = 0; i < rows.length; i++) {\n const value = context.getValue(rows[i]!)\n if (typeof value !== 'number') return undefined\n values[i] = value\n }\n values.sort((a, b) => a - b)\n const mid = Math.floor(values.length / 2)\n return values.length % 2\n ? values[mid]\n : (values[mid - 1]! + values[mid]!) / 2\n },\n})\n\n/** Collects distinct row values using JavaScript `Set` semantics. */\nexport const aggregationFn_unique = constructAggregationFn<\n any,\n any,\n unknown,\n Array<unknown>\n>({\n aggregate: (context) => {\n const rows = context.rows\n const values = new Set<unknown>()\n for (let i = 0; i < rows.length; i++) {\n values.add(context.getValue(rows[i]!))\n }\n return Array.from(values)\n },\n})\n\n/** Counts distinct row values using JavaScript `Set` semantics. */\nexport const aggregationFn_uniqueCount = constructAggregationFn<\n any,\n any,\n unknown,\n number\n>({\n aggregate: (context) => {\n const rows = context.rows\n const values = new Set<unknown>()\n for (let i = 0; i < rows.length; i++) {\n values.add(context.getValue(rows[i]!))\n }\n return values.size\n },\n})\n\n/** Counts rows, independently of the column's values. */\nexport const aggregationFn_count = constructAggregationFn<\n any,\n any,\n unknown,\n number\n>({\n aggregate: ({ rows }) => rows.length,\n merge: ({ subRowResults }) => {\n let count = 0\n for (let i = 0; i < subRowResults.length; i++) {\n const value = subRowResults[i]\n if (isNumber(value)) count += value\n }\n return count\n },\n})\n\n/** Returns the first row's value, including a nullish value. */\nexport const aggregationFn_first = constructAggregationFn<\n any,\n any,\n unknown,\n unknown\n>({\n aggregate: (context) =>\n context.rows[0] ? context.getValue(context.rows[0]) : undefined,\n merge: ({ subRowResults }) => subRowResults[0],\n})\n\n/** Returns the last row's value, including a nullish value. */\nexport const aggregationFn_last = constructAggregationFn<\n any,\n any,\n unknown,\n unknown\n>({\n aggregate: (context) => {\n const row = context.rows[context.rows.length - 1]\n return row ? context.getValue(row) : undefined\n },\n merge: ({ subRowResults }) => subRowResults[subRowResults.length - 1],\n})\n\n/**\n * Full built-in registry. Register individual definitions for tree-shaking.\n *\n * @deprecated Import individual `aggregationFn_*` definitions instead for a\n * smaller bundle. This registry remains available for compatibility.\n */\nexport const aggregationFns = {\n sum: aggregationFn_sum,\n min: aggregationFn_min,\n max: aggregationFn_max,\n extent: aggregationFn_extent,\n mean: aggregationFn_mean,\n median: aggregationFn_median,\n unique: aggregationFn_unique,\n uniqueCount: aggregationFn_uniqueCount,\n count: aggregationFn_count,\n first: aggregationFn_first,\n last: aggregationFn_last,\n}\n\nexport type BuiltInAggregationFn = keyof typeof aggregationFns\n"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const require_utils = require('../../utils.cjs');
|
|
2
|
+
const require_rowAggregationFeature_utils = require('./rowAggregationFeature.utils.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/features/row-aggregation/rowAggregationFeature.ts
|
|
5
|
+
/**
|
|
6
|
+
* Independent aggregation feature for grouped values and root/custom-row totals.
|
|
7
|
+
*/
|
|
8
|
+
const rowAggregationFeature = {
|
|
9
|
+
getDefaultColumnDef: () => ({
|
|
10
|
+
aggregatedCell: ({ column, getValue }) => require_rowAggregationFeature_utils.formatAggregatedCellValue(getValue(), column.columnDef.aggregationFn),
|
|
11
|
+
aggregationFn: "auto",
|
|
12
|
+
maxAggregationDepth: 0
|
|
13
|
+
}),
|
|
14
|
+
getDefaultTableOptions: () => ({ manualAggregation: false }),
|
|
15
|
+
assignCellPrototype: (prototype, table) => {
|
|
16
|
+
require_utils.assignPrototypeAPIs("rowAggregationFeature", prototype, table, { cell_getIsAggregated: { fn: (cell) => require_rowAggregationFeature_utils.cell_getIsAggregated(cell) } });
|
|
17
|
+
},
|
|
18
|
+
assignColumnPrototype: (prototype, table) => {
|
|
19
|
+
require_utils.assignPrototypeAPIs("rowAggregationFeature", prototype, table, {
|
|
20
|
+
column_getAggregationFns: { fn: (column) => require_rowAggregationFeature_utils.column_getAggregationFns(column) },
|
|
21
|
+
column_getAggregationValue: { fn: (column, options) => require_rowAggregationFeature_utils.column_getAggregationValue(column, options) },
|
|
22
|
+
column_getAutoAggregationFn: {
|
|
23
|
+
fn: (column) => require_rowAggregationFeature_utils.column_getAutoAggregationFn(column),
|
|
24
|
+
memoDeps: (column) => [column.table.getCoreRowModel(), column.table._rowModelFns.aggregationFns]
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
initColumnInstanceData: (column) => {
|
|
29
|
+
column._aggregationValueCache = void 0;
|
|
30
|
+
column._resolvedAggregationFnsCache = void 0;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
exports.rowAggregationFeature = rowAggregationFeature;
|
|
36
|
+
//# sourceMappingURL=rowAggregationFeature.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowAggregationFeature.cjs","names":["formatAggregatedCellValue","cell_getIsAggregated","column_getAggregationFns","column_getAggregationValue","column_getAutoAggregationFn"],"sources":["../../../src/features/row-aggregation/rowAggregationFeature.ts"],"sourcesContent":["import { assignPrototypeAPIs } from '../../utils'\nimport {\n cell_getIsAggregated,\n column_getAggregationFns,\n column_getAggregationValue,\n column_getAutoAggregationFn,\n formatAggregatedCellValue,\n} from './rowAggregationFeature.utils'\nimport type { TableFeature } from '../../types/TableFeatures'\n\n/**\n * Independent aggregation feature for grouped values and root/custom-row totals.\n */\nexport const rowAggregationFeature: TableFeature = {\n getDefaultColumnDef: () => ({\n aggregatedCell: ({ column, getValue }: any) =>\n formatAggregatedCellValue(getValue(), column.columnDef.aggregationFn),\n aggregationFn: 'auto',\n maxAggregationDepth: 0,\n }),\n\n getDefaultTableOptions: () => ({\n manualAggregation: false,\n }),\n\n assignCellPrototype: (prototype, table) => {\n assignPrototypeAPIs('rowAggregationFeature', prototype, table, {\n cell_getIsAggregated: {\n fn: (cell) => cell_getIsAggregated(cell),\n },\n })\n },\n\n assignColumnPrototype: (prototype, table) => {\n assignPrototypeAPIs('rowAggregationFeature', prototype, table, {\n column_getAggregationFns: {\n fn: (column) => column_getAggregationFns(column),\n },\n column_getAggregationValue: {\n fn: (column, options) => column_getAggregationValue(column, options),\n },\n column_getAutoAggregationFn: {\n fn: (column) => column_getAutoAggregationFn(column),\n memoDeps: (column) => [\n column.table.getCoreRowModel(),\n column.table._rowModelFns.aggregationFns,\n ],\n },\n })\n },\n\n initColumnInstanceData: (column) => {\n ;(column as any)._aggregationValueCache = undefined\n ;(column as any)._resolvedAggregationFnsCache = undefined\n },\n}\n"],"mappings":";;;;;;;AAaA,MAAa,wBAAsC;CACjD,4BAA4B;EAC1B,iBAAiB,EAAE,QAAQ,eACzBA,8DAA0B,SAAS,GAAG,OAAO,UAAU,aAAa;EACtE,eAAe;EACf,qBAAqB;CACvB;CAEA,+BAA+B,EAC7B,mBAAmB,MACrB;CAEA,sBAAsB,WAAW,UAAU;EACzC,kCAAoB,yBAAyB,WAAW,OAAO,EAC7D,sBAAsB,EACpB,KAAK,SAASC,yDAAqB,IAAI,EACzC,EACF,CAAC;CACH;CAEA,wBAAwB,WAAW,UAAU;EAC3C,kCAAoB,yBAAyB,WAAW,OAAO;GAC7D,0BAA0B,EACxB,KAAK,WAAWC,6DAAyB,MAAM,EACjD;GACA,4BAA4B,EAC1B,KAAK,QAAQ,YAAYC,+DAA2B,QAAQ,OAAO,EACrE;GACA,6BAA6B;IAC3B,KAAK,WAAWC,gEAA4B,MAAM;IAClD,WAAW,WAAW,CACpB,OAAO,MAAM,gBAAgB,GAC7B,OAAO,MAAM,aAAa,cAC5B;GACF;EACF,CAAC;CACH;CAEA,yBAAyB,WAAW;EACjC,AAAC,OAAe,yBAAyB;EACzC,AAAC,OAAe,+BAA+B;CAClD;AACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TableFeature } from "../../types/TableFeatures.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/features/row-aggregation/rowAggregationFeature.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Independent aggregation feature for grouped values and root/custom-row totals.
|
|
6
|
+
*/
|
|
7
|
+
declare const rowAggregationFeature: TableFeature;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { rowAggregationFeature };
|
|
10
|
+
//# sourceMappingURL=rowAggregationFeature.d.cts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TableFeature } from "../../types/TableFeatures.js";
|
|
2
|
+
|
|
3
|
+
//#region src/features/row-aggregation/rowAggregationFeature.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Independent aggregation feature for grouped values and root/custom-row totals.
|
|
6
|
+
*/
|
|
7
|
+
declare const rowAggregationFeature: TableFeature;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { rowAggregationFeature };
|
|
10
|
+
//# sourceMappingURL=rowAggregationFeature.d.ts.map
|
package/dist/features/{aggregation/aggregationFeature.js → row-aggregation/rowAggregationFeature.js}
RENAMED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { assignPrototypeAPIs
|
|
2
|
-
import { cell_getIsAggregated, column_getAggregationFns, column_getAggregationValue, column_getAutoAggregationFn, formatAggregatedCellValue } from "./
|
|
1
|
+
import { assignPrototypeAPIs } from "../../utils.js";
|
|
2
|
+
import { cell_getIsAggregated, column_getAggregationFns, column_getAggregationValue, column_getAutoAggregationFn, formatAggregatedCellValue } from "./rowAggregationFeature.utils.js";
|
|
3
3
|
|
|
4
|
-
//#region src/features/aggregation/
|
|
4
|
+
//#region src/features/row-aggregation/rowAggregationFeature.ts
|
|
5
5
|
/**
|
|
6
6
|
* Independent aggregation feature for grouped values and root/custom-row totals.
|
|
7
7
|
*/
|
|
8
|
-
const
|
|
8
|
+
const rowAggregationFeature = {
|
|
9
9
|
getDefaultColumnDef: () => ({
|
|
10
10
|
aggregatedCell: ({ column, getValue }) => formatAggregatedCellValue(getValue(), column.columnDef.aggregationFn),
|
|
11
11
|
aggregationFn: "auto",
|
|
@@ -13,10 +13,10 @@ const aggregationFeature = {
|
|
|
13
13
|
}),
|
|
14
14
|
getDefaultTableOptions: () => ({ manualAggregation: false }),
|
|
15
15
|
assignCellPrototype: (prototype, table) => {
|
|
16
|
-
assignPrototypeAPIs("
|
|
16
|
+
assignPrototypeAPIs("rowAggregationFeature", prototype, table, { cell_getIsAggregated: { fn: (cell) => cell_getIsAggregated(cell) } });
|
|
17
17
|
},
|
|
18
18
|
assignColumnPrototype: (prototype, table) => {
|
|
19
|
-
assignPrototypeAPIs("
|
|
19
|
+
assignPrototypeAPIs("rowAggregationFeature", prototype, table, {
|
|
20
20
|
column_getAggregationFns: { fn: (column) => column_getAggregationFns(column) },
|
|
21
21
|
column_getAggregationValue: { fn: (column, options) => column_getAggregationValue(column, options) },
|
|
22
22
|
column_getAutoAggregationFn: {
|
|
@@ -28,12 +28,9 @@ const aggregationFeature = {
|
|
|
28
28
|
initColumnInstanceData: (column) => {
|
|
29
29
|
column._aggregationValueCache = void 0;
|
|
30
30
|
column._resolvedAggregationFnsCache = void 0;
|
|
31
|
-
},
|
|
32
|
-
initRowInstanceData: (row) => {
|
|
33
|
-
row._aggregationValuesCache = makeObjectMap();
|
|
34
31
|
}
|
|
35
32
|
};
|
|
36
33
|
|
|
37
34
|
//#endregion
|
|
38
|
-
export {
|
|
39
|
-
//# sourceMappingURL=
|
|
35
|
+
export { rowAggregationFeature };
|
|
36
|
+
//# sourceMappingURL=rowAggregationFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowAggregationFeature.js","names":[],"sources":["../../../src/features/row-aggregation/rowAggregationFeature.ts"],"sourcesContent":["import { assignPrototypeAPIs } from '../../utils'\nimport {\n cell_getIsAggregated,\n column_getAggregationFns,\n column_getAggregationValue,\n column_getAutoAggregationFn,\n formatAggregatedCellValue,\n} from './rowAggregationFeature.utils'\nimport type { TableFeature } from '../../types/TableFeatures'\n\n/**\n * Independent aggregation feature for grouped values and root/custom-row totals.\n */\nexport const rowAggregationFeature: TableFeature = {\n getDefaultColumnDef: () => ({\n aggregatedCell: ({ column, getValue }: any) =>\n formatAggregatedCellValue(getValue(), column.columnDef.aggregationFn),\n aggregationFn: 'auto',\n maxAggregationDepth: 0,\n }),\n\n getDefaultTableOptions: () => ({\n manualAggregation: false,\n }),\n\n assignCellPrototype: (prototype, table) => {\n assignPrototypeAPIs('rowAggregationFeature', prototype, table, {\n cell_getIsAggregated: {\n fn: (cell) => cell_getIsAggregated(cell),\n },\n })\n },\n\n assignColumnPrototype: (prototype, table) => {\n assignPrototypeAPIs('rowAggregationFeature', prototype, table, {\n column_getAggregationFns: {\n fn: (column) => column_getAggregationFns(column),\n },\n column_getAggregationValue: {\n fn: (column, options) => column_getAggregationValue(column, options),\n },\n column_getAutoAggregationFn: {\n fn: (column) => column_getAutoAggregationFn(column),\n memoDeps: (column) => [\n column.table.getCoreRowModel(),\n column.table._rowModelFns.aggregationFns,\n ],\n },\n })\n },\n\n initColumnInstanceData: (column) => {\n ;(column as any)._aggregationValueCache = undefined\n ;(column as any)._resolvedAggregationFnsCache = undefined\n },\n}\n"],"mappings":";;;;;;;AAaA,MAAa,wBAAsC;CACjD,4BAA4B;EAC1B,iBAAiB,EAAE,QAAQ,eACzB,0BAA0B,SAAS,GAAG,OAAO,UAAU,aAAa;EACtE,eAAe;EACf,qBAAqB;CACvB;CAEA,+BAA+B,EAC7B,mBAAmB,MACrB;CAEA,sBAAsB,WAAW,UAAU;EACzC,oBAAoB,yBAAyB,WAAW,OAAO,EAC7D,sBAAsB,EACpB,KAAK,SAAS,qBAAqB,IAAI,EACzC,EACF,CAAC;CACH;CAEA,wBAAwB,WAAW,UAAU;EAC3C,oBAAoB,yBAAyB,WAAW,OAAO;GAC7D,0BAA0B,EACxB,KAAK,WAAW,yBAAyB,MAAM,EACjD;GACA,4BAA4B,EAC1B,KAAK,QAAQ,YAAY,2BAA2B,QAAQ,OAAO,EACrE;GACA,6BAA6B;IAC3B,KAAK,WAAW,4BAA4B,MAAM;IAClD,WAAW,WAAW,CACpB,OAAO,MAAM,gBAAgB,GAC7B,OAAO,MAAM,aAAa,cAC5B;GACF;EACF,CAAC;CACH;CAEA,yBAAyB,WAAW;EACjC,AAAC,OAAe,yBAAyB;EACzC,AAAC,OAAe,+BAA+B;CAClD;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
//#region src/features/aggregation/
|
|
2
|
+
//#region src/features/row-aggregation/rowAggregationFeature.types.ts
|
|
3
3
|
/**
|
|
4
4
|
* Creates a typed context-based aggregation definition for a column or
|
|
5
5
|
* aggregation-function registry.
|
|
@@ -10,4 +10,4 @@ function constructAggregationFn(definition) {
|
|
|
10
10
|
|
|
11
11
|
//#endregion
|
|
12
12
|
exports.constructAggregationFn = constructAggregationFn;
|
|
13
|
-
//# sourceMappingURL=
|
|
13
|
+
//# sourceMappingURL=rowAggregationFeature.types.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowAggregationFeature.types.cjs","names":[],"sources":["../../../src/features/row-aggregation/rowAggregationFeature.types.ts"],"sourcesContent":["import type { BuiltInAggregationFn } from './aggregationFns'\nimport type { Cell } from '../../types/Cell'\nimport type { Column } from '../../types/Column'\nimport type { ColumnDefTemplate } from '../../types/ColumnDef'\nimport type { IsAny, TableFeatures } from '../../types/TableFeatures'\nimport type { Row } from '../../types/Row'\nimport type { Table } from '../../types/Table'\nimport type { CellData, RowData } from '../../types/type-utils'\n\n/** Declaration-merging fallback for named aggregation definitions. */\nexport interface AggregationFns {}\n\n/** Values and table objects available while one aggregation is evaluated. */\nexport interface AggregationContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n> {\n /** The column whose values are being aggregated. */\n column: Column<TFeatures, TData, TValue>\n /** Convenience alias for `column.id`. */\n columnId: string\n /** Maximum relative sub-row depth used to select `rows`. */\n maxDepth: number\n /**\n * Immediate sub-rows for grouped aggregation. This property is omitted\n * for root or caller-supplied-row aggregation. At a terminal grouping level\n * these are the direct data rows; at a nested level they are sub-row groups.\n */\n subRows?: ReadonlyArray<Row<TFeatures, TData>>\n /** Reads this column's value from one of `rows`. */\n getValue: (row: Row<TFeatures, TData>) => TValue\n /**\n * The synthetic grouped row receiving this result. This property is omitted\n * for root or caller-supplied-row aggregation. Its `depth` identifies the\n * grouping level when grouped aggregation needs that distinction.\n */\n groupingRow?: Row<TFeatures, TData>\n /**\n * Unique rows selected at `maxDepth`. Branches that end before `maxDepth`\n * contribute their deepest available row.\n */\n rows: ReadonlyArray<Row<TFeatures, TData>>\n /** The table that owns the column and rows. */\n table: Table<TFeatures, TData>\n}\n\n/** Additional values available when merging nested grouped results. */\nexport interface AggregationMergeContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue,\n TResult,\n> extends AggregationContext<TFeatures, TData, TValue> {\n /** Results produced for each immediate sub-row group, in sub-row order. */\n subRowResults: ReadonlyArray<TResult>\n /** Immediate sub-row groups corresponding to `subRowResults`. */\n subRows: ReadonlyArray<Row<TFeatures, TData>>\n}\n\n/** A context-based aggregation definition and optional grouped-result merge. */\nexport interface AggregationFnDef<\n TFeatures extends TableFeatures = any,\n TData extends RowData = any,\n TValue = unknown,\n TResult = unknown,\n> {\n /** Computes a result directly from the selected `rows`. */\n aggregate: (context: AggregationContext<TFeatures, TData, TValue>) => TResult\n /**\n * Combines already-computed immediate sub-row results. When omitted,\n * nested grouping falls back to `aggregate` over the group's selected rows.\n */\n merge?: (\n context: AggregationMergeContext<TFeatures, TData, TValue, TResult>,\n ) => TResult\n}\n\n/**\n * Creates a typed context-based aggregation definition for a column or\n * aggregation-function registry.\n */\nexport function constructAggregationFn<\n TFeatures extends TableFeatures = any,\n TData extends RowData = any,\n TValue = unknown,\n TResult = unknown,\n>(\n definition: AggregationFnDef<TFeatures, TData, TValue, TResult>,\n): AggregationFnDef<TFeatures, TData, TValue, TResult> {\n return definition\n}\n\n/** Aggregation-definition registry carried by a table feature set. */\nexport interface RowModelFns_Aggregation<\n in out TFeatures extends TableFeatures,\n in out TData extends RowData,\n> {\n aggregationFns: Record<string, AggregationFnDef<TFeatures, TData, any, any>>\n}\n\n/** Named context-based aggregation definitions registered on a feature set. */\nexport type CustomAggregationFns<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = Record<string, AggregationFnDef<TFeatures, TData, any, any>>\n\n/** String names available from a feature set's aggregation registry. */\nexport type ExtractAggregationFnKeys<TFeatures extends TableFeatures> =\n IsAny<TFeatures> extends true\n ? keyof AggregationFns | BuiltInAggregationFn\n : TFeatures extends { aggregationFns: infer TAggregationFns extends object }\n ? Extract<keyof TAggregationFns, string>\n : keyof AggregationFns\n\n/** A registered name, automatic inference, or inline aggregation definition. */\nexport type AggregationFnRef<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n TResult = unknown,\n> =\n | 'auto'\n | ExtractAggregationFnKeys<TFeatures>\n | AggregationFnDef<TFeatures, TData, TValue, TResult>\n\n/** Gives an aggregation reference a stable key in a multiple result. */\nexport interface AggregationFnDescriptor<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n TResult = unknown,\n> {\n /** The named, automatic, or inline definition to execute. */\n aggregationFn: AggregationFnRef<TFeatures, TData, TValue, TResult>\n /** Stable key used in the object returned by a multiple aggregation. */\n id: string\n}\n\n/** One named or explicitly keyed entry in a multiple aggregation option. */\nexport type AggregationFnListItem<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n> =\n | 'auto'\n | ExtractAggregationFnKeys<TFeatures>\n | AggregationFnDescriptor<TFeatures, TData, TValue, any>\n\n/** A scalar aggregation reference or a list that produces a keyed object. */\nexport type AggregationFnOption<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n> =\n | AggregationFnRef<TFeatures, TData, TValue, any>\n | ReadonlyArray<AggregationFnListItem<TFeatures, TData, TValue>>\n\n/** Extracts the result type produced by an aggregation definition. */\nexport type AggregationResultOf<TDefinition> =\n TDefinition extends AggregationFnDef<any, any, any, infer TResult>\n ? TResult\n : unknown\n\ntype RegisteredAggregationDefinition<\n TFeatures extends TableFeatures,\n TKey extends PropertyKey,\n> = TFeatures extends {\n aggregationFns: infer TRegistry extends Record<PropertyKey, unknown>\n}\n ? TKey extends keyof TRegistry\n ? TRegistry[TKey]\n : never\n : never\n\ntype AggregationResultOfRef<TRef, TFeatures extends TableFeatures> =\n TRef extends AggregationFnDef<any, any, any, any>\n ? AggregationResultOf<TRef>\n : TRef extends 'auto'\n ? RegisteredAggregationResult<TFeatures>\n : TRef extends PropertyKey\n ? AggregationResultOf<RegisteredAggregationDefinition<TFeatures, TRef>>\n : unknown\n\ntype AggregationEntryId<TEntry> = TEntry extends string\n ? TEntry\n : TEntry extends { id: infer TId extends string }\n ? TId\n : never\n\ntype AggregationEntryDefinition<TEntry> = TEntry extends {\n aggregationFn: infer TDefinition\n}\n ? TDefinition\n : TEntry\n\n/** Infers the scalar or keyed result produced by an aggregation option. */\nexport type AggregationResult<TOption, TFeatures extends TableFeatures = any> =\n TOption extends ReadonlyArray<infer TEntry>\n ? {\n [TKey in AggregationEntryId<TEntry>]: AggregationResultOfRef<\n AggregationEntryDefinition<Extract<TEntry, TKey | { id: TKey }>>,\n TFeatures\n >\n }\n : AggregationResultOfRef<TOption, TFeatures>\n\ntype RegisteredAggregationResult<TFeatures extends TableFeatures> =\n TFeatures extends {\n aggregationFns: infer TRegistry extends Record<string, unknown>\n }\n ? AggregationResultOf<TRegistry[keyof TRegistry]>\n : unknown\n\n/** Default public result union when a column's precise option is not known. */\nexport type ColumnAggregationValue<TFeatures extends TableFeatures> =\n | RegisteredAggregationResult<TFeatures>\n | Record<string, RegisteredAggregationResult<TFeatures> | undefined>\n | undefined\n\n/** A validated aggregation entry returned by `column.getAggregationFns()`. */\nexport interface ResolvedAggregationFn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> {\n /** Resolved definition, or `undefined` when configuration is invalid. */\n aggregationFn: AggregationFnDef<TFeatures, TData, any, any> | undefined\n /** Key used for a multiple result; scalar inline definitions have no id. */\n id: string | undefined\n}\n\n/** Column-definition options installed by `rowAggregationFeature`. */\nexport interface ColumnDef_Aggregation<\n in out TFeatures extends TableFeatures,\n in out TData extends RowData,\n TValue extends CellData = CellData,\n> {\n /** Renderer used for a grouped row's aggregated cell. */\n aggregatedCell?: ColumnDefTemplate<\n ReturnType<Cell<TFeatures, TData, TValue>['getContext']>\n >\n /**\n * One aggregation reference for a scalar result, or an array for a keyed\n * result object. Inline definitions in an array require an explicit `id`.\n */\n aggregationFn?: AggregationFnOption<TFeatures, TData, TValue>\n /**\n * Maximum relative sub-row depth used for grouped aggregation and cached\n * default totals. `0` selects the supplied root rows, `1` their direct\n * sub-rows, and so on. Defaults to `0`.\n */\n maxAggregationDepth?: number\n /**\n * Optionally supplies a precomputed aggregation value for this column.\n * Return `{ value }` to handle the request, including `{ value: undefined }`;\n * return `undefined` to use the local aggregation fallback.\n */\n getAggregationValue?: (\n context: AggregationValueContext<TFeatures, TData, TValue>,\n ) => AggregationValueResult | undefined\n}\n\n/** Column instance APIs installed by `rowAggregationFeature`. */\nexport interface Column_Aggregation<\n in out TFeatures extends TableFeatures,\n in out TData extends RowData,\n> {\n /** Resolves the configured scalar or multiple aggregation definitions. */\n getAggregationFns: () => ReadonlyArray<\n ResolvedAggregationFn<TFeatures, TData>\n >\n /**\n * Aggregates this column over the default pre-grouped row model, or over a\n * caller-provided array of rows. `options.maxDepth` overrides the column's\n * `maxAggregationDepth`. Explicit-row calls are intentionally not cached.\n */\n getAggregationValue: <TResult = ColumnAggregationValue<TFeatures>>(\n options?: AggregationValueOptions<TFeatures, TData>,\n ) => TResult\n /** Infers `sum` for a numeric first row and `extent` for a Date first row. */\n getAutoAggregationFn: () =>\n | AggregationFnDef<TFeatures, TData, any, any>\n | undefined\n}\n\n/** Options for a caller-requested column aggregation value. */\nexport interface AggregationValueOptions<\n in out TFeatures extends TableFeatures,\n in out TData extends RowData,\n> {\n /** Overrides the column's `maxAggregationDepth` for this request. */\n maxDepth?: number\n /** Rows to aggregate instead of the default pre-grouped row model. */\n rows?: ReadonlyArray<Row<TFeatures, TData>>\n}\n\n/** Cell instance APIs installed by `rowAggregationFeature`. */\nexport interface Cell_Aggregation {\n /** Whether this cell displays an aggregate on a synthetic grouped row. */\n getIsAggregated: () => boolean\n}\n\n/** Internal per-row cache used while grouped aggregates are evaluated. */\nexport interface Row_Aggregation {\n /** Cached aggregate results keyed by column id; created lazily on grouped rows. */\n _aggregationValuesCache?: Record<string, unknown>\n}\n\n/** Values passed to a column-level aggregation-value provider. */\nexport interface AggregationValueContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData = CellData,\n> {\n /** The column whose value was requested. */\n column: Column<TFeatures, TData, TValue>\n /** Maximum relative sub-row depth used for the request. */\n maxDepth: number\n /** Caller-provided rows, or `undefined` for the default row model. */\n rows?: ReadonlyArray<Row<TFeatures, TData>>\n /** The table that owns the column. */\n table: Table<TFeatures, TData>\n}\n\n/** Marks an aggregation-value override as handled. */\nexport interface AggregationValueResult<TResult = unknown> {\n /** The supplied value. `undefined` is still a handled result. */\n value: TResult\n}\n\n/** Table options installed by `rowAggregationFeature`. */\nexport interface TableOptions_Aggregation {\n /**\n * Disables local `column.getAggregationValue()` calculation when a column\n * override does not handle the request. Group values supplied by manually\n * grouped rows remain the responsibility of the data owner.\n */\n manualAggregation?: boolean\n}\n"],"mappings":";;;;;;AAkFA,SAAgB,uBAMd,YACqD;CACrD,OAAO;AACT"}
|
|
@@ -7,7 +7,7 @@ import { Table } from "../../types/Table.cjs";
|
|
|
7
7
|
import { Column } from "../../types/Column.cjs";
|
|
8
8
|
import { IsAny, TableFeatures } from "../../types/TableFeatures.cjs";
|
|
9
9
|
|
|
10
|
-
//#region src/features/aggregation/
|
|
10
|
+
//#region src/features/row-aggregation/rowAggregationFeature.types.d.ts
|
|
11
11
|
/** Declaration-merging fallback for named aggregation definitions. */
|
|
12
12
|
interface AggregationFns {}
|
|
13
13
|
/** Values and table objects available while one aggregation is evaluated. */
|
|
@@ -113,7 +113,7 @@ interface ResolvedAggregationFn<TFeatures extends TableFeatures, TData extends R
|
|
|
113
113
|
/** Key used for a multiple result; scalar inline definitions have no id. */
|
|
114
114
|
id: string | undefined;
|
|
115
115
|
}
|
|
116
|
-
/** Column-definition options installed by `
|
|
116
|
+
/** Column-definition options installed by `rowAggregationFeature`. */
|
|
117
117
|
interface ColumnDef_Aggregation<in out TFeatures extends TableFeatures, in out TData extends RowData, TValue extends CellData = CellData> {
|
|
118
118
|
/** Renderer used for a grouped row's aggregated cell. */
|
|
119
119
|
aggregatedCell?: ColumnDefTemplate<ReturnType<Cell<TFeatures, TData, TValue>['getContext']>>;
|
|
@@ -135,7 +135,7 @@ interface ColumnDef_Aggregation<in out TFeatures extends TableFeatures, in out T
|
|
|
135
135
|
*/
|
|
136
136
|
getAggregationValue?: (context: AggregationValueContext<TFeatures, TData, TValue>) => AggregationValueResult | undefined;
|
|
137
137
|
}
|
|
138
|
-
/** Column instance APIs installed by `
|
|
138
|
+
/** Column instance APIs installed by `rowAggregationFeature`. */
|
|
139
139
|
interface Column_Aggregation<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
140
140
|
/** Resolves the configured scalar or multiple aggregation definitions. */
|
|
141
141
|
getAggregationFns: () => ReadonlyArray<ResolvedAggregationFn<TFeatures, TData>>;
|
|
@@ -155,15 +155,15 @@ interface AggregationValueOptions<in out TFeatures extends TableFeatures, in out
|
|
|
155
155
|
/** Rows to aggregate instead of the default pre-grouped row model. */
|
|
156
156
|
rows?: ReadonlyArray<Row<TFeatures, TData>>;
|
|
157
157
|
}
|
|
158
|
-
/** Cell instance APIs installed by `
|
|
158
|
+
/** Cell instance APIs installed by `rowAggregationFeature`. */
|
|
159
159
|
interface Cell_Aggregation {
|
|
160
160
|
/** Whether this cell displays an aggregate on a synthetic grouped row. */
|
|
161
161
|
getIsAggregated: () => boolean;
|
|
162
162
|
}
|
|
163
163
|
/** Internal per-row cache used while grouped aggregates are evaluated. */
|
|
164
164
|
interface Row_Aggregation {
|
|
165
|
-
/** Cached aggregate results keyed by column id. */
|
|
166
|
-
_aggregationValuesCache
|
|
165
|
+
/** Cached aggregate results keyed by column id; created lazily on grouped rows. */
|
|
166
|
+
_aggregationValuesCache?: Record<string, unknown>;
|
|
167
167
|
}
|
|
168
168
|
/** Values passed to a column-level aggregation-value provider. */
|
|
169
169
|
interface AggregationValueContext<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData> {
|
|
@@ -181,7 +181,7 @@ interface AggregationValueResult<TResult = unknown> {
|
|
|
181
181
|
/** The supplied value. `undefined` is still a handled result. */
|
|
182
182
|
value: TResult;
|
|
183
183
|
}
|
|
184
|
-
/** Table options installed by `
|
|
184
|
+
/** Table options installed by `rowAggregationFeature`. */
|
|
185
185
|
interface TableOptions_Aggregation {
|
|
186
186
|
/**
|
|
187
187
|
* Disables local `column.getAggregationValue()` calculation when a column
|
|
@@ -192,4 +192,4 @@ interface TableOptions_Aggregation {
|
|
|
192
192
|
}
|
|
193
193
|
//#endregion
|
|
194
194
|
export { AggregationContext, AggregationFnDef, AggregationFnDescriptor, AggregationFnListItem, AggregationFnOption, AggregationFnRef, AggregationFns, AggregationMergeContext, AggregationResult, AggregationResultOf, AggregationValueContext, AggregationValueOptions, AggregationValueResult, Cell_Aggregation, ColumnAggregationValue, ColumnDef_Aggregation, Column_Aggregation, CustomAggregationFns, ExtractAggregationFnKeys, ResolvedAggregationFn, RowModelFns_Aggregation, Row_Aggregation, TableOptions_Aggregation, constructAggregationFn };
|
|
195
|
-
//# sourceMappingURL=
|
|
195
|
+
//# sourceMappingURL=rowAggregationFeature.types.d.cts.map
|
|
@@ -7,7 +7,7 @@ import { Table } from "../../types/Table.js";
|
|
|
7
7
|
import { Column } from "../../types/Column.js";
|
|
8
8
|
import { IsAny, TableFeatures } from "../../types/TableFeatures.js";
|
|
9
9
|
|
|
10
|
-
//#region src/features/aggregation/
|
|
10
|
+
//#region src/features/row-aggregation/rowAggregationFeature.types.d.ts
|
|
11
11
|
/** Declaration-merging fallback for named aggregation definitions. */
|
|
12
12
|
interface AggregationFns {}
|
|
13
13
|
/** Values and table objects available while one aggregation is evaluated. */
|
|
@@ -113,7 +113,7 @@ interface ResolvedAggregationFn<TFeatures extends TableFeatures, TData extends R
|
|
|
113
113
|
/** Key used for a multiple result; scalar inline definitions have no id. */
|
|
114
114
|
id: string | undefined;
|
|
115
115
|
}
|
|
116
|
-
/** Column-definition options installed by `
|
|
116
|
+
/** Column-definition options installed by `rowAggregationFeature`. */
|
|
117
117
|
interface ColumnDef_Aggregation<in out TFeatures extends TableFeatures, in out TData extends RowData, TValue extends CellData = CellData> {
|
|
118
118
|
/** Renderer used for a grouped row's aggregated cell. */
|
|
119
119
|
aggregatedCell?: ColumnDefTemplate<ReturnType<Cell<TFeatures, TData, TValue>['getContext']>>;
|
|
@@ -135,7 +135,7 @@ interface ColumnDef_Aggregation<in out TFeatures extends TableFeatures, in out T
|
|
|
135
135
|
*/
|
|
136
136
|
getAggregationValue?: (context: AggregationValueContext<TFeatures, TData, TValue>) => AggregationValueResult | undefined;
|
|
137
137
|
}
|
|
138
|
-
/** Column instance APIs installed by `
|
|
138
|
+
/** Column instance APIs installed by `rowAggregationFeature`. */
|
|
139
139
|
interface Column_Aggregation<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
140
140
|
/** Resolves the configured scalar or multiple aggregation definitions. */
|
|
141
141
|
getAggregationFns: () => ReadonlyArray<ResolvedAggregationFn<TFeatures, TData>>;
|
|
@@ -155,15 +155,15 @@ interface AggregationValueOptions<in out TFeatures extends TableFeatures, in out
|
|
|
155
155
|
/** Rows to aggregate instead of the default pre-grouped row model. */
|
|
156
156
|
rows?: ReadonlyArray<Row<TFeatures, TData>>;
|
|
157
157
|
}
|
|
158
|
-
/** Cell instance APIs installed by `
|
|
158
|
+
/** Cell instance APIs installed by `rowAggregationFeature`. */
|
|
159
159
|
interface Cell_Aggregation {
|
|
160
160
|
/** Whether this cell displays an aggregate on a synthetic grouped row. */
|
|
161
161
|
getIsAggregated: () => boolean;
|
|
162
162
|
}
|
|
163
163
|
/** Internal per-row cache used while grouped aggregates are evaluated. */
|
|
164
164
|
interface Row_Aggregation {
|
|
165
|
-
/** Cached aggregate results keyed by column id. */
|
|
166
|
-
_aggregationValuesCache
|
|
165
|
+
/** Cached aggregate results keyed by column id; created lazily on grouped rows. */
|
|
166
|
+
_aggregationValuesCache?: Record<string, unknown>;
|
|
167
167
|
}
|
|
168
168
|
/** Values passed to a column-level aggregation-value provider. */
|
|
169
169
|
interface AggregationValueContext<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData> {
|
|
@@ -181,7 +181,7 @@ interface AggregationValueResult<TResult = unknown> {
|
|
|
181
181
|
/** The supplied value. `undefined` is still a handled result. */
|
|
182
182
|
value: TResult;
|
|
183
183
|
}
|
|
184
|
-
/** Table options installed by `
|
|
184
|
+
/** Table options installed by `rowAggregationFeature`. */
|
|
185
185
|
interface TableOptions_Aggregation {
|
|
186
186
|
/**
|
|
187
187
|
* Disables local `column.getAggregationValue()` calculation when a column
|
|
@@ -192,4 +192,4 @@ interface TableOptions_Aggregation {
|
|
|
192
192
|
}
|
|
193
193
|
//#endregion
|
|
194
194
|
export { AggregationContext, AggregationFnDef, AggregationFnDescriptor, AggregationFnListItem, AggregationFnOption, AggregationFnRef, AggregationFns, AggregationMergeContext, AggregationResult, AggregationResultOf, AggregationValueContext, AggregationValueOptions, AggregationValueResult, Cell_Aggregation, ColumnAggregationValue, ColumnDef_Aggregation, Column_Aggregation, CustomAggregationFns, ExtractAggregationFnKeys, ResolvedAggregationFn, RowModelFns_Aggregation, Row_Aggregation, TableOptions_Aggregation, constructAggregationFn };
|
|
195
|
-
//# sourceMappingURL=
|
|
195
|
+
//# sourceMappingURL=rowAggregationFeature.types.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region src/features/aggregation/
|
|
1
|
+
//#region src/features/row-aggregation/rowAggregationFeature.types.ts
|
|
2
2
|
/**
|
|
3
3
|
* Creates a typed context-based aggregation definition for a column or
|
|
4
4
|
* aggregation-function registry.
|
|
@@ -9,4 +9,4 @@ function constructAggregationFn(definition) {
|
|
|
9
9
|
|
|
10
10
|
//#endregion
|
|
11
11
|
export { constructAggregationFn };
|
|
12
|
-
//# sourceMappingURL=
|
|
12
|
+
//# sourceMappingURL=rowAggregationFeature.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowAggregationFeature.types.js","names":[],"sources":["../../../src/features/row-aggregation/rowAggregationFeature.types.ts"],"sourcesContent":["import type { BuiltInAggregationFn } from './aggregationFns'\nimport type { Cell } from '../../types/Cell'\nimport type { Column } from '../../types/Column'\nimport type { ColumnDefTemplate } from '../../types/ColumnDef'\nimport type { IsAny, TableFeatures } from '../../types/TableFeatures'\nimport type { Row } from '../../types/Row'\nimport type { Table } from '../../types/Table'\nimport type { CellData, RowData } from '../../types/type-utils'\n\n/** Declaration-merging fallback for named aggregation definitions. */\nexport interface AggregationFns {}\n\n/** Values and table objects available while one aggregation is evaluated. */\nexport interface AggregationContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n> {\n /** The column whose values are being aggregated. */\n column: Column<TFeatures, TData, TValue>\n /** Convenience alias for `column.id`. */\n columnId: string\n /** Maximum relative sub-row depth used to select `rows`. */\n maxDepth: number\n /**\n * Immediate sub-rows for grouped aggregation. This property is omitted\n * for root or caller-supplied-row aggregation. At a terminal grouping level\n * these are the direct data rows; at a nested level they are sub-row groups.\n */\n subRows?: ReadonlyArray<Row<TFeatures, TData>>\n /** Reads this column's value from one of `rows`. */\n getValue: (row: Row<TFeatures, TData>) => TValue\n /**\n * The synthetic grouped row receiving this result. This property is omitted\n * for root or caller-supplied-row aggregation. Its `depth` identifies the\n * grouping level when grouped aggregation needs that distinction.\n */\n groupingRow?: Row<TFeatures, TData>\n /**\n * Unique rows selected at `maxDepth`. Branches that end before `maxDepth`\n * contribute their deepest available row.\n */\n rows: ReadonlyArray<Row<TFeatures, TData>>\n /** The table that owns the column and rows. */\n table: Table<TFeatures, TData>\n}\n\n/** Additional values available when merging nested grouped results. */\nexport interface AggregationMergeContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue,\n TResult,\n> extends AggregationContext<TFeatures, TData, TValue> {\n /** Results produced for each immediate sub-row group, in sub-row order. */\n subRowResults: ReadonlyArray<TResult>\n /** Immediate sub-row groups corresponding to `subRowResults`. */\n subRows: ReadonlyArray<Row<TFeatures, TData>>\n}\n\n/** A context-based aggregation definition and optional grouped-result merge. */\nexport interface AggregationFnDef<\n TFeatures extends TableFeatures = any,\n TData extends RowData = any,\n TValue = unknown,\n TResult = unknown,\n> {\n /** Computes a result directly from the selected `rows`. */\n aggregate: (context: AggregationContext<TFeatures, TData, TValue>) => TResult\n /**\n * Combines already-computed immediate sub-row results. When omitted,\n * nested grouping falls back to `aggregate` over the group's selected rows.\n */\n merge?: (\n context: AggregationMergeContext<TFeatures, TData, TValue, TResult>,\n ) => TResult\n}\n\n/**\n * Creates a typed context-based aggregation definition for a column or\n * aggregation-function registry.\n */\nexport function constructAggregationFn<\n TFeatures extends TableFeatures = any,\n TData extends RowData = any,\n TValue = unknown,\n TResult = unknown,\n>(\n definition: AggregationFnDef<TFeatures, TData, TValue, TResult>,\n): AggregationFnDef<TFeatures, TData, TValue, TResult> {\n return definition\n}\n\n/** Aggregation-definition registry carried by a table feature set. */\nexport interface RowModelFns_Aggregation<\n in out TFeatures extends TableFeatures,\n in out TData extends RowData,\n> {\n aggregationFns: Record<string, AggregationFnDef<TFeatures, TData, any, any>>\n}\n\n/** Named context-based aggregation definitions registered on a feature set. */\nexport type CustomAggregationFns<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = Record<string, AggregationFnDef<TFeatures, TData, any, any>>\n\n/** String names available from a feature set's aggregation registry. */\nexport type ExtractAggregationFnKeys<TFeatures extends TableFeatures> =\n IsAny<TFeatures> extends true\n ? keyof AggregationFns | BuiltInAggregationFn\n : TFeatures extends { aggregationFns: infer TAggregationFns extends object }\n ? Extract<keyof TAggregationFns, string>\n : keyof AggregationFns\n\n/** A registered name, automatic inference, or inline aggregation definition. */\nexport type AggregationFnRef<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n TResult = unknown,\n> =\n | 'auto'\n | ExtractAggregationFnKeys<TFeatures>\n | AggregationFnDef<TFeatures, TData, TValue, TResult>\n\n/** Gives an aggregation reference a stable key in a multiple result. */\nexport interface AggregationFnDescriptor<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n TResult = unknown,\n> {\n /** The named, automatic, or inline definition to execute. */\n aggregationFn: AggregationFnRef<TFeatures, TData, TValue, TResult>\n /** Stable key used in the object returned by a multiple aggregation. */\n id: string\n}\n\n/** One named or explicitly keyed entry in a multiple aggregation option. */\nexport type AggregationFnListItem<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n> =\n | 'auto'\n | ExtractAggregationFnKeys<TFeatures>\n | AggregationFnDescriptor<TFeatures, TData, TValue, any>\n\n/** A scalar aggregation reference or a list that produces a keyed object. */\nexport type AggregationFnOption<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue = unknown,\n> =\n | AggregationFnRef<TFeatures, TData, TValue, any>\n | ReadonlyArray<AggregationFnListItem<TFeatures, TData, TValue>>\n\n/** Extracts the result type produced by an aggregation definition. */\nexport type AggregationResultOf<TDefinition> =\n TDefinition extends AggregationFnDef<any, any, any, infer TResult>\n ? TResult\n : unknown\n\ntype RegisteredAggregationDefinition<\n TFeatures extends TableFeatures,\n TKey extends PropertyKey,\n> = TFeatures extends {\n aggregationFns: infer TRegistry extends Record<PropertyKey, unknown>\n}\n ? TKey extends keyof TRegistry\n ? TRegistry[TKey]\n : never\n : never\n\ntype AggregationResultOfRef<TRef, TFeatures extends TableFeatures> =\n TRef extends AggregationFnDef<any, any, any, any>\n ? AggregationResultOf<TRef>\n : TRef extends 'auto'\n ? RegisteredAggregationResult<TFeatures>\n : TRef extends PropertyKey\n ? AggregationResultOf<RegisteredAggregationDefinition<TFeatures, TRef>>\n : unknown\n\ntype AggregationEntryId<TEntry> = TEntry extends string\n ? TEntry\n : TEntry extends { id: infer TId extends string }\n ? TId\n : never\n\ntype AggregationEntryDefinition<TEntry> = TEntry extends {\n aggregationFn: infer TDefinition\n}\n ? TDefinition\n : TEntry\n\n/** Infers the scalar or keyed result produced by an aggregation option. */\nexport type AggregationResult<TOption, TFeatures extends TableFeatures = any> =\n TOption extends ReadonlyArray<infer TEntry>\n ? {\n [TKey in AggregationEntryId<TEntry>]: AggregationResultOfRef<\n AggregationEntryDefinition<Extract<TEntry, TKey | { id: TKey }>>,\n TFeatures\n >\n }\n : AggregationResultOfRef<TOption, TFeatures>\n\ntype RegisteredAggregationResult<TFeatures extends TableFeatures> =\n TFeatures extends {\n aggregationFns: infer TRegistry extends Record<string, unknown>\n }\n ? AggregationResultOf<TRegistry[keyof TRegistry]>\n : unknown\n\n/** Default public result union when a column's precise option is not known. */\nexport type ColumnAggregationValue<TFeatures extends TableFeatures> =\n | RegisteredAggregationResult<TFeatures>\n | Record<string, RegisteredAggregationResult<TFeatures> | undefined>\n | undefined\n\n/** A validated aggregation entry returned by `column.getAggregationFns()`. */\nexport interface ResolvedAggregationFn<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> {\n /** Resolved definition, or `undefined` when configuration is invalid. */\n aggregationFn: AggregationFnDef<TFeatures, TData, any, any> | undefined\n /** Key used for a multiple result; scalar inline definitions have no id. */\n id: string | undefined\n}\n\n/** Column-definition options installed by `rowAggregationFeature`. */\nexport interface ColumnDef_Aggregation<\n in out TFeatures extends TableFeatures,\n in out TData extends RowData,\n TValue extends CellData = CellData,\n> {\n /** Renderer used for a grouped row's aggregated cell. */\n aggregatedCell?: ColumnDefTemplate<\n ReturnType<Cell<TFeatures, TData, TValue>['getContext']>\n >\n /**\n * One aggregation reference for a scalar result, or an array for a keyed\n * result object. Inline definitions in an array require an explicit `id`.\n */\n aggregationFn?: AggregationFnOption<TFeatures, TData, TValue>\n /**\n * Maximum relative sub-row depth used for grouped aggregation and cached\n * default totals. `0` selects the supplied root rows, `1` their direct\n * sub-rows, and so on. Defaults to `0`.\n */\n maxAggregationDepth?: number\n /**\n * Optionally supplies a precomputed aggregation value for this column.\n * Return `{ value }` to handle the request, including `{ value: undefined }`;\n * return `undefined` to use the local aggregation fallback.\n */\n getAggregationValue?: (\n context: AggregationValueContext<TFeatures, TData, TValue>,\n ) => AggregationValueResult | undefined\n}\n\n/** Column instance APIs installed by `rowAggregationFeature`. */\nexport interface Column_Aggregation<\n in out TFeatures extends TableFeatures,\n in out TData extends RowData,\n> {\n /** Resolves the configured scalar or multiple aggregation definitions. */\n getAggregationFns: () => ReadonlyArray<\n ResolvedAggregationFn<TFeatures, TData>\n >\n /**\n * Aggregates this column over the default pre-grouped row model, or over a\n * caller-provided array of rows. `options.maxDepth` overrides the column's\n * `maxAggregationDepth`. Explicit-row calls are intentionally not cached.\n */\n getAggregationValue: <TResult = ColumnAggregationValue<TFeatures>>(\n options?: AggregationValueOptions<TFeatures, TData>,\n ) => TResult\n /** Infers `sum` for a numeric first row and `extent` for a Date first row. */\n getAutoAggregationFn: () =>\n | AggregationFnDef<TFeatures, TData, any, any>\n | undefined\n}\n\n/** Options for a caller-requested column aggregation value. */\nexport interface AggregationValueOptions<\n in out TFeatures extends TableFeatures,\n in out TData extends RowData,\n> {\n /** Overrides the column's `maxAggregationDepth` for this request. */\n maxDepth?: number\n /** Rows to aggregate instead of the default pre-grouped row model. */\n rows?: ReadonlyArray<Row<TFeatures, TData>>\n}\n\n/** Cell instance APIs installed by `rowAggregationFeature`. */\nexport interface Cell_Aggregation {\n /** Whether this cell displays an aggregate on a synthetic grouped row. */\n getIsAggregated: () => boolean\n}\n\n/** Internal per-row cache used while grouped aggregates are evaluated. */\nexport interface Row_Aggregation {\n /** Cached aggregate results keyed by column id; created lazily on grouped rows. */\n _aggregationValuesCache?: Record<string, unknown>\n}\n\n/** Values passed to a column-level aggregation-value provider. */\nexport interface AggregationValueContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData = CellData,\n> {\n /** The column whose value was requested. */\n column: Column<TFeatures, TData, TValue>\n /** Maximum relative sub-row depth used for the request. */\n maxDepth: number\n /** Caller-provided rows, or `undefined` for the default row model. */\n rows?: ReadonlyArray<Row<TFeatures, TData>>\n /** The table that owns the column. */\n table: Table<TFeatures, TData>\n}\n\n/** Marks an aggregation-value override as handled. */\nexport interface AggregationValueResult<TResult = unknown> {\n /** The supplied value. `undefined` is still a handled result. */\n value: TResult\n}\n\n/** Table options installed by `rowAggregationFeature`. */\nexport interface TableOptions_Aggregation {\n /**\n * Disables local `column.getAggregationValue()` calculation when a column\n * override does not handle the request. Group values supplied by manually\n * grouped rows remain the responsibility of the data owner.\n */\n manualAggregation?: boolean\n}\n"],"mappings":";;;;;AAkFA,SAAgB,uBAMd,YACqD;CACrD,OAAO;AACT"}
|