@adaptabletools/adaptable-cjs 20.2.3 → 20.2.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adaptabletools/adaptable-cjs",
3
- "version": "20.2.3",
3
+ "version": "20.2.5",
4
4
  "description": "Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements",
5
5
  "keywords": [
6
6
  "web-components",
@@ -212,7 +212,7 @@ export interface IAdaptable {
212
212
  getGroupRowNodes(config?: {
213
213
  filterFn?: (rowNode: IRowNode) => boolean;
214
214
  }): IRowNode[];
215
- updateRowGroupsExpandedState(layout?: Layout): void;
215
+ updateRowGroupsAndColumnGroupsExpandedState(layout?: Layout): void;
216
216
  getRowsInViewport(): IRowNode[];
217
217
  isGroupRowNode(rowNode: IRowNode): boolean;
218
218
  isRowNodeVisible(rowNode: IRowNode): boolean;
@@ -24,7 +24,7 @@ export interface ExportOptions<TData = any> {
24
24
  /**
25
25
  * User-provided Report Destinations (in addition to those shipped in AdapTable)
26
26
  */
27
- customDestinations?: CustomDestination[];
27
+ customDestinations?: CustomDestination[] | ((context: CustomDestinationsContext) => CustomDestination[]);
28
28
  /**
29
29
  * System Reports to use; leave unset for all, empty array for none
30
30
  *
@@ -104,7 +104,7 @@ export interface SystemReportNamesContext extends BaseContext {
104
104
  */
105
105
  defaultSystemReportNames: SystemReportName[];
106
106
  /**
107
- * Name of the current Layout
107
+ * Name of current Layout
108
108
  */
109
109
  currentLayoutName: string;
110
110
  }
@@ -117,11 +117,11 @@ export interface SystemReportFormatsContext extends BaseContext {
117
117
  */
118
118
  defaultSystemReportFormats: SystemReportFormat[];
119
119
  /**
120
- * Name of the current Layout
120
+ * Name of current Layout
121
121
  */
122
122
  currentLayoutName: string;
123
123
  /**
124
- * Name of the current Report
124
+ * Name of current Report
125
125
  */
126
126
  currentReportName?: ReportNameType;
127
127
  }
@@ -130,19 +130,36 @@ export interface SystemReportFormatsContext extends BaseContext {
130
130
  */
131
131
  export interface SystemExportDestinationsContext extends BaseContext {
132
132
  /**
133
- * Default System Report Formats
133
+ * Default System Export Destinations
134
134
  */
135
135
  defaultSystemExportDestinations: SystemExportDestination[];
136
136
  /**
137
- * Name of the current Layout
137
+ * Name of current Layout
138
+ */
139
+ currentLayoutName: string;
140
+ /**
141
+ * Name of current Report
142
+ */
143
+ currentReportName?: ReportNameType;
144
+ /**
145
+ * Format of current Report
146
+ */
147
+ currentReportFormat?: ReportFormatType;
148
+ }
149
+ /**
150
+ * Context provided to `ExportOptions.customDestinations` callback
151
+ */
152
+ export interface CustomDestinationsContext extends BaseContext {
153
+ /**
154
+ * Name of current Layout
138
155
  */
139
156
  currentLayoutName: string;
140
157
  /**
141
- * Name of the current Report
158
+ * Name of current Report
142
159
  */
143
160
  currentReportName?: ReportNameType;
144
161
  /**
145
- * Format of the current Report
162
+ * Format of current Report
146
163
  */
147
164
  currentReportFormat?: ReportFormatType;
148
165
  }
@@ -7,7 +7,13 @@ export type AggregationColumnValue = string | true | WeightedAverageAggregation;
7
7
  * Defines an Aggregated Column in a Table Layout
8
8
  */
9
9
  export type TableAggregationColumns = {
10
+ /**
11
+ * The Column being Aggretated
12
+ */
10
13
  ColumnId: string;
14
+ /**
15
+ * The type of Aggregation
16
+ */
11
17
  AggFunc: AggregationColumnValue;
12
18
  }[];
13
19
  /**
@@ -80,12 +80,7 @@ export interface LayoutBase extends AdaptableObject {
80
80
  */
81
81
  AutoSizeColumns?: boolean;
82
82
  /**
83
- * Position of the Grand Total Row in the Layout.
84
- * @property {boolean | string} GrandTotalRow
85
- * - 'top' | 'bottom' - Scrollable position at grid edges
86
- * - 'pinnedTop' | 'pinnedBottom' - Fixed position at grid edges
87
- * - true - Same as 'pinnedTop'
88
- * - false/null - Hidden
83
+ * Position of the Grand Total Row in the Layout
89
84
  */
90
85
  GrandTotalRow?: 'top' | 'bottom' | 'pinnedTop' | 'pinnedBottom' | boolean;
91
86
  }
@@ -191,22 +186,28 @@ export type RowGroupValuesWithExceptionKeys = {
191
186
  RowGroupDefaultBehavior: 'expanded' | 'collapsed';
192
187
  } & XOR<{
193
188
  /**
194
- * @deprecated - use GroupKeys instead. Layout.RowGroupValues.GroupKeys[] array allows you
195
- * to configure the row group expand / collapse behaviour for each combination of row grouped columns.
189
+ * @deprecated - use GroupKeys instead which enables listing exceptions on a per Column basis
196
190
  */
197
191
  ExceptionGroupKeys?: any[][];
198
192
  }, {
199
193
  /**
200
- * Allows you to configure the row group expand / collapse behaviour for each combination of row grouped columns.
201
- * The default value is configured via RowGroupDefaultBehavior, but exceptions are configured by the GroupKeys array.
202
- * Each item in the GroupKeys array is a an object with `RowGroupedColumns` and `ExceptionGroupKeys`. Those properties
203
- * configure the collapse/expand exceptions for the specific row group columns.
194
+ * Configures Row Group Expand / Collapse behaviour together with per Column Exceptions
204
195
  */
205
- GroupKeys?: {
206
- RowGroupedColumns: string[];
207
- ExceptionGroupKeys?: any[][];
208
- }[];
196
+ GroupKeys?: GroupKeys[];
209
197
  }>;
198
+ /**
199
+ * Enables setting Row Group behaviour with exceptions
200
+ */
201
+ export interface GroupKeys {
202
+ /**
203
+ * Columns that are Row Grouped
204
+ */
205
+ RowGroupedColumns: string[];
206
+ /**
207
+ * Exceptions to default behaviour, provided as array or arrays
208
+ */
209
+ ExceptionGroupKeys?: any[][];
210
+ }
210
211
  /**
211
212
  * Manages Column Group expand / collapse behaviour, including exceptions
212
213
  */
@@ -22,6 +22,10 @@ export interface ExportApi {
22
22
  * Retrieves available System Export Destinations (configured in Export Options)
23
23
  */
24
24
  getAvailableSystemDestinations(): SystemExportDestination[];
25
+ /**
26
+ * Retrieves available Custom Destinations (configured in Export Options)
27
+ */
28
+ getAvailableCustomDestinations(): CustomDestination[];
25
29
  /**
26
30
  * Retrieves name of currently selected Report
27
31
  */
@@ -60,11 +64,6 @@ export interface ExportApi {
60
64
  * Retrieves all Report Formats that are available
61
65
  */
62
66
  getAllFormats(): ReportFormatType[];
63
- /**
64
- * Retrieves all Custom Destinations from Export Options
65
- * @returns custom destinations
66
- */
67
- getCustomDestinations(): CustomDestination[];
68
67
  /**
69
68
  * Retrieves Destination with the given name
70
69
  * @param destinationName destination to retrieve
@@ -120,10 +119,10 @@ export interface ExportApi {
120
119
  */
121
120
  updateReports(reports: Report[]): Report[];
122
121
  /**
123
- * If the given destination is a Custom one
122
+ * If the given destination is a System one
124
123
  * @param destination destination to check
125
124
  */
126
- isExportDestinationCustom(destinationName: ExportDestinationType): boolean;
125
+ isExportDestinationSystem(destinationName: ExportDestinationType): boolean;
127
126
  /**
128
127
  * Retrieves the Export Destinations that are supported for the given Report Format
129
128
  * @param reportFormat - report format to check
@@ -144,7 +143,7 @@ export interface ExportApi {
144
143
  * @param format - format of the report
145
144
  * @param destination - destination to export to
146
145
  * @param exportConfig - optional export configuration
147
- */
146
+ */
148
147
  exportReport(reportName: ReportNameType, format: ReportFormatType, destination?: ExportDestinationType, exportConfig?: ExportConfig): Promise<void>;
149
148
  /**
150
149
  * Gets the data for the Report with the given Name in the given Format
@@ -19,6 +19,8 @@ export declare class ExportApiImpl extends ApiBase implements ExportApi {
19
19
  getAvailableSystemReports(): SystemReportName[];
20
20
  getAvailableSystemFormats(): SystemReportFormat[];
21
21
  getAvailableSystemDestinations(): SystemExportDestination[];
22
+ getAvailableCustomDestinations(): CustomDestination[];
23
+ isExportDestinationSystem(destinationName: string): boolean;
22
24
  getAllExportDestinations(): ExportDestinationType[];
23
25
  getAllFormats(): ReportFormatType[];
24
26
  getAllReports(): Report[];
@@ -26,8 +28,6 @@ export declare class ExportApiImpl extends ApiBase implements ExportApi {
26
28
  clearReport(): void;
27
29
  selectFormat(reportFormat: ReportFormatType | null): void;
28
30
  clearFormat(): void;
29
- getCustomDestinations(): CustomDestination[];
30
- isExportDestinationCustom(destinationName: string): boolean;
31
31
  getExportDestinationForm(destinationName: string): AdaptableForm<ExportFormContext> | undefined;
32
32
  canExportToExcel(): boolean;
33
33
  canExportToCsv(): boolean;
@@ -42,7 +42,7 @@ class ExportApiImpl extends ApiBase_1.ApiBase {
42
42
  if (this.internalApi.isSystemDestination(destinationName)) {
43
43
  return destinationName;
44
44
  }
45
- return this.getCustomDestinations().find((destination) => destination.name === destinationName);
45
+ return this.getAvailableCustomDestinations().find((destination) => destination.name === destinationName);
46
46
  }
47
47
  getAvailableSystemReports() {
48
48
  const systemReportNamesOption = this.getExportOptions().systemReportNames;
@@ -97,10 +97,26 @@ class ExportApiImpl extends ApiBase_1.ApiBase {
97
97
  return true;
98
98
  });
99
99
  }
100
+ getAvailableCustomDestinations() {
101
+ const customDestinationsOption = this.getExportOptions().customDestinations;
102
+ const customDestinations = typeof customDestinationsOption === 'function'
103
+ ? customDestinationsOption({
104
+ ...this.getAdaptableInternalApi().buildBaseContext(),
105
+ currentLayoutName: this.getLayoutApi().getCurrentLayoutName(),
106
+ currentReportName: this.getExportApi().getCurrentReportName(),
107
+ currentReportFormat: this.getExportApi().getCurrentReportFormat(),
108
+ })
109
+ : customDestinationsOption;
110
+ return customDestinations ?? [];
111
+ }
112
+ isExportDestinationSystem(destinationName) {
113
+ return (destinationName == GeneralConstants_1.DOWNLOAD_EXPORT_DESTINATION ||
114
+ destinationName == GeneralConstants_1.CLIPBOARD_EXPORT_DESTINATION);
115
+ }
100
116
  getAllExportDestinations() {
101
117
  const destinationItems = [
102
118
  ...this.getAvailableSystemDestinations(),
103
- ...this.getCustomDestinations().map((destination) => destination.name),
119
+ ...this.getAvailableCustomDestinations().map((destination) => destination.name),
104
120
  ];
105
121
  return destinationItems;
106
122
  }
@@ -126,15 +142,8 @@ class ExportApiImpl extends ApiBase_1.ApiBase {
126
142
  clearFormat() {
127
143
  this.selectFormat(null);
128
144
  }
129
- getCustomDestinations() {
130
- return this.getExportOptions().customDestinations ?? [];
131
- }
132
- isExportDestinationCustom(destinationName) {
133
- return this.getCustomDestinations().some((destination) => destination.name === destinationName);
134
- }
135
145
  getExportDestinationForm(destinationName) {
136
- return this.getCustomDestinations().find((destination) => destination.name === destinationName)
137
- ?.form;
146
+ return this.getAvailableCustomDestinations().find((destination) => destination.name === destinationName)?.form;
138
147
  }
139
148
  canExportToExcel() {
140
149
  return this._adaptable.canExportToExcel();
@@ -515,7 +515,7 @@ class GridApiImpl extends ApiBase_1.ApiBase {
515
515
  refreshGroupRowNodes() {
516
516
  // see https://www.ag-grid.com/javascript-data-grid/client-side-row-stages/#refreshing-the-client-side-model
517
517
  this.getAgGridApi().refreshClientSideRowModel('group');
518
- this._adaptable.updateRowGroupsExpandedState();
518
+ this._adaptable.updateRowGroupsAndColumnGroupsExpandedState();
519
519
  }
520
520
  isCellEditable(gridCell) {
521
521
  // If not Grid Cell or Column then return false - GridCell.column may be undefined for cells from synthetic columns created by AG Grid (ex. autoGroup columns)
@@ -213,7 +213,7 @@ class ExportInternalApi extends ApiBase_1.ApiBase {
213
213
  this.logWarn(`No report result to send to destination for report '${report.Name}, format '${format}' and destination '${destination}'`);
214
214
  return;
215
215
  }
216
- if (this.getExportApi().isExportDestinationCustom(destination)) {
216
+ if (!this.getExportApi().isExportDestinationSystem(destination)) {
217
217
  this.sendReportToCustomDestination(reportResult, report, format, destination);
218
218
  }
219
219
  if (destination === 'Download') {
@@ -236,9 +236,9 @@ class ExportInternalApi extends ApiBase_1.ApiBase {
236
236
  }
237
237
  }
238
238
  sendReportToCustomDestination(reportResult, report, format, destination) {
239
- const customDestination = this.getOptionsApi()
240
- .getAdaptableOptions()
241
- .exportOptions.customDestinations?.find((cd) => cd.name == destination);
239
+ const customDestination = this.getExportApi()
240
+ .getAvailableCustomDestinations()
241
+ .find((cd) => cd.name == destination);
242
242
  if (customDestination?.form) {
243
243
  this.getAdaptableInternalApi().dispatchReduxAction(PopupRedux.PopupShowForm({
244
244
  Id: 'export-destination-form',
@@ -221,7 +221,7 @@ export declare class AdaptableAgGrid implements IAdaptable {
221
221
  private addSyntheticPrimaryKeyIfMissing;
222
222
  getFirstDisplayedRowNode(): IRowNode;
223
223
  getFirstRowNode(): IRowNode | undefined;
224
- updateRowGroupsExpandedState(layout?: Layout): void;
224
+ updateRowGroupsAndColumnGroupsExpandedState(layout?: Layout): void;
225
225
  isGroupRowNode(rowNode: IRowNode): boolean;
226
226
  getFilteredData(): any[];
227
227
  /**
@@ -1970,7 +1970,7 @@ You need to define at least one Layout!`);
1970
1970
  this.addSyntheticPrimaryKey(dataSource);
1971
1971
  }
1972
1972
  this.agGridAdapter.setGridOption('rowData', dataSource);
1973
- this.updateRowGroupsExpandedState();
1973
+ this.updateRowGroupsAndColumnGroupsExpandedState();
1974
1974
  // this.updateColumnModelAndRefreshGrid();
1975
1975
  }
1976
1976
  getGridData() {
@@ -2013,12 +2013,13 @@ You need to define at least one Layout!`);
2013
2013
  }
2014
2014
  return firstRowNode;
2015
2015
  }
2016
- updateRowGroupsExpandedState(layout) {
2016
+ updateRowGroupsAndColumnGroupsExpandedState(layout) {
2017
2017
  if (!layout) {
2018
2018
  layout = this.api.layoutApi.getCurrentLayout();
2019
2019
  }
2020
2020
  const layoutModel = (0, LayoutHelpers_1.layoutStateToLayoutModel)(layout);
2021
2021
  this.layoutManager.applyRowGroupValues(layoutModel.RowGroupValues, layoutModel.RowGroupedColumns);
2022
+ this.layoutManager.applyColumnGroupCollapseExpandState(layoutModel);
2022
2023
  }
2023
2024
  isGroupRowNode(rowNode) {
2024
2025
  if (!rowNode) {
@@ -2104,7 +2105,7 @@ You need to define at least one Layout!`);
2104
2105
  dataUpdateConfig.callback(transaction);
2105
2106
  }
2106
2107
  resolve(transaction?.add);
2107
- this.updateRowGroupsExpandedState();
2108
+ this.updateRowGroupsAndColumnGroupsExpandedState();
2108
2109
  });
2109
2110
  if (dataUpdateConfig.flushAsync) {
2110
2111
  this.agGridAdapter.getAgGridApi().flushAsyncTransactions();
@@ -2116,7 +2117,7 @@ You need to define at least one Layout!`);
2116
2117
  if (dataUpdateConfig.flushAsync) {
2117
2118
  this.agGridAdapter.getAgGridApi().flushAsyncTransactions();
2118
2119
  }
2119
- this.updateRowGroupsExpandedState();
2120
+ this.updateRowGroupsAndColumnGroupsExpandedState();
2120
2121
  return Promise.resolve(transaction?.add);
2121
2122
  }
2122
2123
  }
@@ -2144,7 +2145,7 @@ You need to define at least one Layout!`);
2144
2145
  dataUpdateConfig.callback(transaction);
2145
2146
  }
2146
2147
  if (transaction?.add) {
2147
- this.updateRowGroupsExpandedState();
2148
+ this.updateRowGroupsAndColumnGroupsExpandedState();
2148
2149
  }
2149
2150
  resolve({
2150
2151
  added: transaction?.add,
@@ -2163,7 +2164,7 @@ You need to define at least one Layout!`);
2163
2164
  addIndex: dataUpdateConfig.addIndex,
2164
2165
  });
2165
2166
  if (transaction?.add) {
2166
- this.updateRowGroupsExpandedState();
2167
+ this.updateRowGroupsAndColumnGroupsExpandedState();
2167
2168
  }
2168
2169
  if (dataUpdateConfig.flushAsync) {
2169
2170
  this.agGridAdapter.getAgGridApi().flushAsyncTransactions();
package/src/env.js CHANGED
@@ -2,6 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = {
4
4
  NEXT_PUBLIC_INFINITE_TABLE_LICENSE_KEY: "StartDate=2021-06-29|EndDate=2030-01-01|Owner=Adaptable|Type=distribution|TS=1624971462479|C=137829811,1004007071,2756196225,1839832928,3994409405,636616862" || '',
5
- PUBLISH_TIMESTAMP: 1750939331799 || Date.now(),
6
- VERSION: "20.2.3" || '--current-version--',
5
+ PUBLISH_TIMESTAMP: 1751286787052 || Date.now(),
6
+ VERSION: "20.2.5" || '--current-version--',
7
7
  };
@@ -226,21 +226,9 @@ class LayoutManager extends LMEmitter_1.LMEmitter {
226
226
  const shouldSkipTriggerChange = options?.skipTriggerChange === true;
227
227
  this._prevFiredLayout = layout;
228
228
  this.currentLayout = layout;
229
- if ((!prevLayout?.RowGroupedColumns || !prevLayout?.RowGroupedColumns.length) &&
230
- layout.RowGroupedColumns &&
231
- layout.RowGroupedColumns.length > 0 &&
232
- layout.RowGroupValues) {
233
- // most likely the user has changed grouping via some AG Grid action
234
- // and we need to make sure the expand/collapse state is applied
235
- // but we want to suspend the listener
236
- // as it would re-trigger another change
237
- const unsupress = this.suspendAgGridListener();
238
- this.applyRowGroupValues(layout.RowGroupValues, layout.RowGroupedColumns);
239
- unsupress();
240
- }
241
- if ((!prevLayout?.RowGroupedColumns || !prevLayout?.RowGroupedColumns.length) &&
242
- layout.RowGroupedColumns &&
229
+ if (layout.RowGroupedColumns &&
243
230
  layout.RowGroupedColumns.length > 0 &&
231
+ (prevLayout?.RowGroupedColumns || []).join(',') !== layout.RowGroupedColumns.join(',') &&
244
232
  layout.RowGroupValues) {
245
233
  // most likely the user has changed grouping via some AG Grid action
246
234
  // and we need to make sure the expand/collapse state is applied
@@ -476,12 +464,24 @@ class LayoutManager extends LMEmitter_1.LMEmitter {
476
464
  });
477
465
  }
478
466
  if (RowGroupedColumns && RowGroupedColumns.length) {
467
+ const LayoutRowGroupedColumns = this.currentLayout?.RowGroupedColumns || this.currentLayout?.PivotGroupedColumns || [];
479
468
  // if it's a new grouping, try and take it
480
- const isGroupingNew = RowGroupedColumns &&
481
- !this.currentLayout?.RowGroupedColumns &&
482
- !this.currentLayout?.PivotGroupedColumns;
469
+ const isGroupingNew = RowGroupedColumns && RowGroupedColumns.join(',') !== LayoutRowGroupedColumns.join(',');
483
470
  if (this.currentLayout?.RowGroupValues) {
484
471
  const currentRowGroupValues = this.currentLayout.RowGroupValues;
472
+ let currentRowGroupValuesGroupKeys = [];
473
+ if (currentRowGroupValues.RowGroupDisplay === 'expanded' ||
474
+ currentRowGroupValues.RowGroupDisplay === 'collapsed') {
475
+ if (Array.isArray(currentRowGroupValues.GroupKeys)) {
476
+ currentRowGroupValuesGroupKeys =
477
+ currentRowGroupValues.GroupKeys.find((item) => {
478
+ return ((item.RowGroupedColumns || []).join(',') === (RowGroupedColumns || []).join(','));
479
+ })?.Values || [];
480
+ }
481
+ else {
482
+ currentRowGroupValuesGroupKeys = currentRowGroupValues.Values || [];
483
+ }
484
+ }
485
485
  if (currentRowGroupValues.RowGroupDisplay === 'always-collapsed') {
486
486
  RowGroupValues = {
487
487
  RowGroupDisplay: 'always-collapsed',
@@ -494,7 +494,7 @@ class LayoutManager extends LMEmitter_1.LMEmitter {
494
494
  }
495
495
  else if (currentRowGroupValues.RowGroupDisplay === 'collapsed') {
496
496
  const ExpandedValues = isGroupingNew
497
- ? currentRowGroupValues.Values || []
497
+ ? currentRowGroupValuesGroupKeys || []
498
498
  : this.getRowGroupNodePathsAs({
499
499
  expanded: true,
500
500
  });
@@ -521,7 +521,7 @@ class LayoutManager extends LMEmitter_1.LMEmitter {
521
521
  }
522
522
  else if (currentRowGroupValues.RowGroupDisplay === 'expanded') {
523
523
  const CollapsedValues = isGroupingNew
524
- ? currentRowGroupValues.Values || []
524
+ ? currentRowGroupValuesGroupKeys || []
525
525
  : this.getRowGroupNodePathsAs({
526
526
  expanded: false,
527
527
  });
@@ -2325,6 +2325,24 @@ export declare const ADAPTABLE_METAMODEL: {
2325
2325
  isOpt?: undefined;
2326
2326
  })[];
2327
2327
  };
2328
+ CustomDestinationsContext: {
2329
+ name: string;
2330
+ kind: string;
2331
+ desc: string;
2332
+ props: ({
2333
+ name: string;
2334
+ kind: string;
2335
+ desc: string;
2336
+ isOpt?: undefined;
2337
+ ref?: undefined;
2338
+ } | {
2339
+ name: string;
2340
+ kind: string;
2341
+ desc: string;
2342
+ isOpt: boolean;
2343
+ ref: string;
2344
+ })[];
2345
+ };
2328
2346
  CustomDisplayFormatter: {
2329
2347
  name: string;
2330
2348
  kind: string;
@@ -3855,6 +3873,22 @@ export declare const ADAPTABLE_METAMODEL: {
3855
3873
  ref: string;
3856
3874
  })[];
3857
3875
  };
3876
+ GroupKeys: {
3877
+ name: string;
3878
+ kind: string;
3879
+ desc: string;
3880
+ props: ({
3881
+ name: string;
3882
+ kind: string;
3883
+ desc: string;
3884
+ isOpt: boolean;
3885
+ } | {
3886
+ name: string;
3887
+ kind: string;
3888
+ desc: string;
3889
+ isOpt?: undefined;
3890
+ })[];
3891
+ };
3858
3892
  HandleFdc3Context: {
3859
3893
  name: string;
3860
3894
  kind: string;