@atlaskit/dynamic-table 14.11.2 → 14.11.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/dynamic-table
2
2
 
3
+ ## 14.11.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [`a486e54d1ef`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a486e54d1ef) - Improved performance of built-in table sorting for stateful dynamic tables
8
+
3
9
  ## 14.11.2
4
10
 
5
11
  ### Patch Changes
@@ -29,7 +29,7 @@ var _tableHead = _interopRequireDefault(require("./table-head"));
29
29
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
30
30
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
31
31
  var packageName = "@atlaskit/dynamic-table";
32
- var packageVersion = "14.11.2";
32
+ var packageVersion = "14.11.3";
33
33
  function toggleSortOrder(currentSortOrder) {
34
34
  switch (currentSortOrder) {
35
35
  case _constants.DESC:
@@ -23,6 +23,17 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
23
23
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
24
24
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
25
25
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
26
+ var getSortingCellValue = function getSortingCellValue(cells, head, sortKey) {
27
+ for (var i = 0; i < cells.length; i++) {
28
+ var _head$cells$i;
29
+ if (head.cells[i] && ((_head$cells$i = head.cells[i]) === null || _head$cells$i === void 0 ? void 0 : _head$cells$i.key) === sortKey) {
30
+ var _cells$i;
31
+ return (_cells$i = cells[i]) === null || _cells$i === void 0 ? void 0 : _cells$i.key;
32
+ }
33
+ }
34
+ return undefined;
35
+ };
36
+
26
37
  // sort all rows based on sort key and order
27
38
  var getSortedRows = function getSortedRows(head, rows, sortKey, sortOrder) {
28
39
  if (!sortKey || !head) {
@@ -31,16 +42,13 @@ var getSortedRows = function getSortedRows(head, rows, sortKey, sortOrder) {
31
42
  if (!rows) {
32
43
  return [];
33
44
  }
45
+ var modifier = sortOrder === _constants.ASC ? 1 : -1;
34
46
 
35
- // return value which will be used for sorting
36
- var getSortingCellValue = function getSortingCellValue(cells) {
37
- for (var i = 0; i < cells.length; i++) {
38
- if (head.cells[i] && head.cells[i].key === sortKey) {
39
- return cells[i].key;
40
- }
41
- }
42
- return undefined;
43
- };
47
+ // Re-initialising an I18n Collator on every sort is performance intensive, thus constructed outside
48
+ var collator = new Intl.Collator(undefined, {
49
+ numeric: true,
50
+ sensitivity: 'accent'
51
+ });
44
52
 
45
53
  // Get copy of rows to avoid sorting prop in place
46
54
  var sortableRows = Array.from(rows);
@@ -48,11 +56,8 @@ var getSortedRows = function getSortedRows(head, rows, sortKey, sortOrder) {
48
56
  // Reorder rows in table based on sorting cell value
49
57
  // Algorithm will sort numerics or strings, but not both
50
58
  return sortableRows.sort(function (a, b) {
51
- var valA = getSortingCellValue(a.cells);
52
- var valB = getSortingCellValue(b.cells);
53
-
54
- // modifier used for sorting type (ascending or descending)
55
- var modifier = sortOrder === _constants.ASC ? 1 : -1;
59
+ var valA = getSortingCellValue(a.cells, head, sortKey);
60
+ var valB = getSortingCellValue(b.cells, head, sortKey);
56
61
  if (valA === undefined || valB === undefined) {
57
62
  return modifier;
58
63
  }
@@ -72,13 +77,8 @@ var getSortedRows = function getSortedRows(head, rows, sortKey, sortOrder) {
72
77
  return 1;
73
78
  }
74
79
  }
75
-
76
- // Sort strings using localeCompare
77
80
  if (typeof valA === 'string' && typeof valB === 'string') {
78
- return modifier * valA.localeCompare(valB, undefined, {
79
- sensitivity: 'accent',
80
- numeric: true
81
- });
81
+ return modifier * collator.compare(valA, valB);
82
82
  }
83
83
  if (!valA && valA !== 0 || valA < valB) {
84
84
  return -modifier;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/dynamic-table",
3
- "version": "14.11.2",
3
+ "version": "14.11.3",
4
4
  "sideEffects": false
5
5
  }
@@ -14,7 +14,7 @@ import ManagedPagination from './managed-pagination';
14
14
  import RankableTableBody from './rankable/body';
15
15
  import TableHead from './table-head';
16
16
  const packageName = "@atlaskit/dynamic-table";
17
- const packageVersion = "14.11.2";
17
+ const packageVersion = "14.11.3";
18
18
  function toggleSortOrder(currentSortOrder) {
19
19
  switch (currentSortOrder) {
20
20
  case DESC:
@@ -3,6 +3,17 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import React from 'react';
4
4
  import { ASC } from '../internal/constants';
5
5
  import { getPageRows, validateSortKey } from '../internal/helpers';
6
+ const getSortingCellValue = (cells, head, sortKey) => {
7
+ for (let i = 0; i < cells.length; i++) {
8
+ var _head$cells$i;
9
+ if (head.cells[i] && ((_head$cells$i = head.cells[i]) === null || _head$cells$i === void 0 ? void 0 : _head$cells$i.key) === sortKey) {
10
+ var _cells$i;
11
+ return (_cells$i = cells[i]) === null || _cells$i === void 0 ? void 0 : _cells$i.key;
12
+ }
13
+ }
14
+ return undefined;
15
+ };
16
+
6
17
  // sort all rows based on sort key and order
7
18
  const getSortedRows = (head, rows, sortKey, sortOrder) => {
8
19
  if (!sortKey || !head) {
@@ -11,16 +22,13 @@ const getSortedRows = (head, rows, sortKey, sortOrder) => {
11
22
  if (!rows) {
12
23
  return [];
13
24
  }
25
+ const modifier = sortOrder === ASC ? 1 : -1;
14
26
 
15
- // return value which will be used for sorting
16
- const getSortingCellValue = cells => {
17
- for (let i = 0; i < cells.length; i++) {
18
- if (head.cells[i] && head.cells[i].key === sortKey) {
19
- return cells[i].key;
20
- }
21
- }
22
- return undefined;
23
- };
27
+ // Re-initialising an I18n Collator on every sort is performance intensive, thus constructed outside
28
+ const collator = new Intl.Collator(undefined, {
29
+ numeric: true,
30
+ sensitivity: 'accent'
31
+ });
24
32
 
25
33
  // Get copy of rows to avoid sorting prop in place
26
34
  const sortableRows = Array.from(rows);
@@ -28,11 +36,8 @@ const getSortedRows = (head, rows, sortKey, sortOrder) => {
28
36
  // Reorder rows in table based on sorting cell value
29
37
  // Algorithm will sort numerics or strings, but not both
30
38
  return sortableRows.sort((a, b) => {
31
- const valA = getSortingCellValue(a.cells);
32
- const valB = getSortingCellValue(b.cells);
33
-
34
- // modifier used for sorting type (ascending or descending)
35
- const modifier = sortOrder === ASC ? 1 : -1;
39
+ const valA = getSortingCellValue(a.cells, head, sortKey);
40
+ const valB = getSortingCellValue(b.cells, head, sortKey);
36
41
  if (valA === undefined || valB === undefined) {
37
42
  return modifier;
38
43
  }
@@ -52,13 +57,8 @@ const getSortedRows = (head, rows, sortKey, sortOrder) => {
52
57
  return 1;
53
58
  }
54
59
  }
55
-
56
- // Sort strings using localeCompare
57
60
  if (typeof valA === 'string' && typeof valB === 'string') {
58
- return modifier * valA.localeCompare(valB, undefined, {
59
- sensitivity: 'accent',
60
- numeric: true
61
- });
61
+ return modifier * collator.compare(valA, valB);
62
62
  }
63
63
  if (!valA && valA !== 0 || valA < valB) {
64
64
  return -modifier;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/dynamic-table",
3
- "version": "14.11.2",
3
+ "version": "14.11.3",
4
4
  "sideEffects": false
5
5
  }
@@ -22,7 +22,7 @@ import ManagedPagination from './managed-pagination';
22
22
  import RankableTableBody from './rankable/body';
23
23
  import TableHead from './table-head';
24
24
  var packageName = "@atlaskit/dynamic-table";
25
- var packageVersion = "14.11.2";
25
+ var packageVersion = "14.11.3";
26
26
  function toggleSortOrder(currentSortOrder) {
27
27
  switch (currentSortOrder) {
28
28
  case DESC:
@@ -16,6 +16,17 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
16
16
  import React from 'react';
17
17
  import { ASC } from '../internal/constants';
18
18
  import { getPageRows, validateSortKey } from '../internal/helpers';
19
+ var getSortingCellValue = function getSortingCellValue(cells, head, sortKey) {
20
+ for (var i = 0; i < cells.length; i++) {
21
+ var _head$cells$i;
22
+ if (head.cells[i] && ((_head$cells$i = head.cells[i]) === null || _head$cells$i === void 0 ? void 0 : _head$cells$i.key) === sortKey) {
23
+ var _cells$i;
24
+ return (_cells$i = cells[i]) === null || _cells$i === void 0 ? void 0 : _cells$i.key;
25
+ }
26
+ }
27
+ return undefined;
28
+ };
29
+
19
30
  // sort all rows based on sort key and order
20
31
  var getSortedRows = function getSortedRows(head, rows, sortKey, sortOrder) {
21
32
  if (!sortKey || !head) {
@@ -24,16 +35,13 @@ var getSortedRows = function getSortedRows(head, rows, sortKey, sortOrder) {
24
35
  if (!rows) {
25
36
  return [];
26
37
  }
38
+ var modifier = sortOrder === ASC ? 1 : -1;
27
39
 
28
- // return value which will be used for sorting
29
- var getSortingCellValue = function getSortingCellValue(cells) {
30
- for (var i = 0; i < cells.length; i++) {
31
- if (head.cells[i] && head.cells[i].key === sortKey) {
32
- return cells[i].key;
33
- }
34
- }
35
- return undefined;
36
- };
40
+ // Re-initialising an I18n Collator on every sort is performance intensive, thus constructed outside
41
+ var collator = new Intl.Collator(undefined, {
42
+ numeric: true,
43
+ sensitivity: 'accent'
44
+ });
37
45
 
38
46
  // Get copy of rows to avoid sorting prop in place
39
47
  var sortableRows = Array.from(rows);
@@ -41,11 +49,8 @@ var getSortedRows = function getSortedRows(head, rows, sortKey, sortOrder) {
41
49
  // Reorder rows in table based on sorting cell value
42
50
  // Algorithm will sort numerics or strings, but not both
43
51
  return sortableRows.sort(function (a, b) {
44
- var valA = getSortingCellValue(a.cells);
45
- var valB = getSortingCellValue(b.cells);
46
-
47
- // modifier used for sorting type (ascending or descending)
48
- var modifier = sortOrder === ASC ? 1 : -1;
52
+ var valA = getSortingCellValue(a.cells, head, sortKey);
53
+ var valB = getSortingCellValue(b.cells, head, sortKey);
49
54
  if (valA === undefined || valB === undefined) {
50
55
  return modifier;
51
56
  }
@@ -65,13 +70,8 @@ var getSortedRows = function getSortedRows(head, rows, sortKey, sortOrder) {
65
70
  return 1;
66
71
  }
67
72
  }
68
-
69
- // Sort strings using localeCompare
70
73
  if (typeof valA === 'string' && typeof valB === 'string') {
71
- return modifier * valA.localeCompare(valB, undefined, {
72
- sensitivity: 'accent',
73
- numeric: true
74
- });
74
+ return modifier * collator.compare(valA, valB);
75
75
  }
76
76
  if (!valA && valA !== 0 || valA < valB) {
77
77
  return -modifier;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/dynamic-table",
3
- "version": "14.11.2",
3
+ "version": "14.11.3",
4
4
  "sideEffects": false
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/dynamic-table",
3
- "version": "14.11.2",
3
+ "version": "14.11.3",
4
4
  "description": "A dynamic table displays rows of data with built-in pagination, sorting, and re-ordering functionality.",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -41,7 +41,7 @@
41
41
  "@atlaskit/pagination": "^14.4.0",
42
42
  "@atlaskit/spinner": "^15.5.0",
43
43
  "@atlaskit/theme": "^12.5.0",
44
- "@atlaskit/tokens": "^1.11.0",
44
+ "@atlaskit/tokens": "^1.14.0",
45
45
  "@babel/runtime": "^7.0.0",
46
46
  "@emotion/react": "^11.7.1",
47
47
  "react-beautiful-dnd": "^12.1.1"
@@ -0,0 +1,215 @@
1
+ ## API Report File for "@atlaskit/dynamic-table"
2
+
3
+ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4
+
5
+ ```ts
6
+
7
+ import noop from '@atlaskit/ds-lib/noop';
8
+ import { default as React_2 } from 'react';
9
+ import { Ref } from 'react';
10
+ import { UIAnalyticsEvent } from '@atlaskit/analytics-next';
11
+ import { WithAnalyticsEventsProps } from '@atlaskit/analytics-next';
12
+ import { WithContextProps } from '@atlaskit/analytics-next';
13
+
14
+ // @public
15
+ class DynamicTable extends React_2.Component<StatefulProps, State> {
16
+ // (undocumented)
17
+ static defaultProps: {
18
+ defaultPage: number;
19
+ isLoading: boolean;
20
+ isFixedSize: boolean;
21
+ isRankable: boolean;
22
+ onSetPage: typeof noop;
23
+ onSort: typeof noop;
24
+ rowsPerPage: number;
25
+ };
26
+ // (undocumented)
27
+ onRankEndHandler: (params: RankEnd) => void;
28
+ // (undocumented)
29
+ onRankEndIfExistsHandler: (params: RankEnd) => void;
30
+ // (undocumented)
31
+ onSetPageHandler: (page: number, analyticsEvent?: UIAnalyticsEvent) => void;
32
+ // (undocumented)
33
+ onSortHandler: ({ key, item, sortOrder }: any, analyticsEvent?: UIAnalyticsEvent) => void;
34
+ // (undocumented)
35
+ render(): JSX.Element;
36
+ // (undocumented)
37
+ state: {
38
+ page: number | undefined;
39
+ sortKey: string | undefined;
40
+ sortOrder: SortOrderType | undefined;
41
+ rows: RowType[] | undefined;
42
+ };
43
+ // (undocumented)
44
+ UNSAFE_componentWillReceiveProps(newProps: StatefulProps): void;
45
+ }
46
+ export default DynamicTable;
47
+
48
+ // @public (undocumented)
49
+ export const DynamicTableStateless: React_2.ForwardRefExoticComponent<Pick<Pick<Omit<StatelessProps, keyof WithAnalyticsEventsProps>, "caption" | "emptyView" | "head" | "highlightedRowIndex" | "label" | "loadingSpinnerSize" | "onPageRowsUpdate" | "rows" | "sortKey" | "sortOrder" | "testId" | "totalRows"> & Partial<Pick<Omit<StatelessProps, keyof WithAnalyticsEventsProps>, "isFixedSize" | "isLoading" | "isRankable" | "isRankingDisabled" | "onRankEnd" | "onRankStart" | "onSetPage" | "onSort" | "page" | "paginationi18n" | "rowsPerPage">> & Partial<Pick<{
50
+ isLoading: boolean;
51
+ isFixedSize: boolean;
52
+ rowsPerPage: number;
53
+ onSetPage: typeof noop;
54
+ onSort: typeof noop;
55
+ page: number;
56
+ isRankable: boolean;
57
+ isRankingDisabled: boolean;
58
+ onRankStart: typeof noop;
59
+ onRankEnd: typeof noop;
60
+ paginationi18n: {
61
+ prev: string;
62
+ next: string;
63
+ label: string;
64
+ pageLabel: string;
65
+ };
66
+ }, never>> & React_2.RefAttributes<any> & WithContextProps, "analyticsContext" | "caption" | "emptyView" | "head" | "highlightedRowIndex" | "isFixedSize" | "isLoading" | "isRankable" | "isRankingDisabled" | "key" | "label" | "loadingSpinnerSize" | "onPageRowsUpdate" | "onRankEnd" | "onRankStart" | "onSetPage" | "onSort" | "page" | "paginationi18n" | "rows" | "rowsPerPage" | "sortKey" | "sortOrder" | "testId" | "totalRows"> & React_2.RefAttributes<any>>;
67
+
68
+ // @public (undocumented)
69
+ interface HeadCellType extends RowCellType {
70
+ isSortable?: boolean;
71
+ shouldTruncate?: boolean;
72
+ width?: number;
73
+ }
74
+
75
+ // @public (undocumented)
76
+ interface HeadType {
77
+ // (undocumented)
78
+ cells: Array<HeadCellType>;
79
+ }
80
+
81
+ // @public (undocumented)
82
+ interface I18nShape {
83
+ label: string;
84
+ next: string;
85
+ pageLabel?: string;
86
+ prev: string;
87
+ }
88
+
89
+ // @public (undocumented)
90
+ type LoadingSpinnerSizeType = 'large' | 'small';
91
+
92
+ // @public (undocumented)
93
+ interface RankEnd {
94
+ // (undocumented)
95
+ destination?: RankEndLocation;
96
+ // (undocumented)
97
+ sourceIndex: number;
98
+ // (undocumented)
99
+ sourceKey: string;
100
+ }
101
+
102
+ // @public (undocumented)
103
+ interface RankEndLocation {
104
+ // (undocumented)
105
+ afterKey?: string;
106
+ // (undocumented)
107
+ beforeKey?: string;
108
+ // (undocumented)
109
+ index: number;
110
+ }
111
+
112
+ // @public (undocumented)
113
+ interface RankStart {
114
+ // (undocumented)
115
+ index: number;
116
+ // (undocumented)
117
+ key: string;
118
+ }
119
+
120
+ // @public (undocumented)
121
+ interface RowCellType {
122
+ colSpan?: number;
123
+ content?: React_2.ReactNode | string;
124
+ key?: number | string;
125
+ testId?: string;
126
+ }
127
+
128
+ // @public (undocumented)
129
+ interface RowType extends React_2.ComponentPropsWithoutRef<'tr'> {
130
+ // (undocumented)
131
+ cells: Array<RowCellType>;
132
+ isHighlighted?: boolean;
133
+ // (undocumented)
134
+ key?: string;
135
+ onClick?: React_2.MouseEventHandler;
136
+ onKeyPress?: React_2.KeyboardEventHandler;
137
+ // (undocumented)
138
+ ref?: Ref<HTMLTableRowElement>;
139
+ testId?: string;
140
+ }
141
+
142
+ // @public
143
+ type SortOrderType = 'ASC' | 'DESC';
144
+
145
+ // @public (undocumented)
146
+ interface State {
147
+ // (undocumented)
148
+ page?: number;
149
+ // (undocumented)
150
+ rows?: RowType[];
151
+ // (undocumented)
152
+ sortKey?: string;
153
+ // (undocumented)
154
+ sortOrder?: SortOrderType;
155
+ }
156
+
157
+ // @public (undocumented)
158
+ interface StatefulProps extends WithAnalyticsEventsProps {
159
+ caption?: React_2.ReactNode;
160
+ defaultPage?: number;
161
+ defaultSortKey?: string;
162
+ defaultSortOrder?: SortOrderType;
163
+ emptyView?: React_2.ReactElement<any>;
164
+ head?: HeadType;
165
+ highlightedRowIndex?: number | number[];
166
+ isFixedSize?: boolean;
167
+ isLoading?: boolean;
168
+ isRankable?: boolean;
169
+ isRankingDisabled?: boolean;
170
+ label?: string;
171
+ loadingSpinnerSize?: LoadingSpinnerSizeType;
172
+ onPageRowsUpdate?: (pageRows: Array<RowType>) => void;
173
+ onRankEnd?: (rankEnd: RankEnd) => void;
174
+ onRankStart?: (rankStart: RankStart) => void;
175
+ onSetPage?: (page: number, UIAnalyticsEvent?: UIAnalyticsEvent) => void;
176
+ onSort?: (data: any, UIAnalyticsEvent?: UIAnalyticsEvent) => void;
177
+ page?: number;
178
+ paginationi18n?: I18nShape;
179
+ rows?: Array<RowType>;
180
+ rowsPerPage?: number;
181
+ sortKey?: string;
182
+ sortOrder?: SortOrderType;
183
+ testId?: string;
184
+ }
185
+
186
+ // @public (undocumented)
187
+ interface StatelessProps extends WithAnalyticsEventsProps {
188
+ caption?: React_2.ReactNode;
189
+ emptyView?: React_2.ReactElement<any>;
190
+ head?: HeadType;
191
+ highlightedRowIndex?: number | number[];
192
+ isFixedSize?: boolean;
193
+ isLoading?: boolean;
194
+ isRankable?: boolean;
195
+ isRankingDisabled?: boolean;
196
+ label?: string;
197
+ loadingSpinnerSize?: LoadingSpinnerSizeType;
198
+ onPageRowsUpdate?: (pageRows: Array<RowType>) => void;
199
+ onRankEnd?: (rankEnd: RankEnd, uiAnalyticsEvent?: UIAnalyticsEvent) => void;
200
+ onRankStart?: (rankStart: RankStart) => void;
201
+ onSetPage?: (page: number, UIAnalyticsEvent?: UIAnalyticsEvent) => void;
202
+ onSort?: (data: any, UIAnalyticsEvent?: UIAnalyticsEvent) => void;
203
+ page?: number;
204
+ paginationi18n?: I18nShape;
205
+ rows?: Array<RowType>;
206
+ rowsPerPage?: number;
207
+ sortKey?: string;
208
+ sortOrder?: SortOrderType;
209
+ testId?: string;
210
+ totalRows?: number;
211
+ }
212
+
213
+ // (No @packageDocumentation comment for this package)
214
+
215
+ ```