@cubejs-client/react 0.34.60 → 0.35.23

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.
@@ -1,4 +1,4 @@
1
- import React, { createContext, useEffect, useRef, useContext, useState } from 'react';
1
+ import React, { createContext, useRef, useEffect, useContext, useState } from 'react';
2
2
  import { equals, toPairs, fromPairs, uniqBy, prop, indexBy, uniq, pick, clone } from 'ramda';
3
3
  import { isQueryPresent, getQueryMembers, flattenFilters, moveItemInArray, movePivotItem, removeEmptyQueryFields, defaultOrder, ResultSet, validateQuery, defaultHeuristics, areQueriesEqual } from '@cubejs-client/core';
4
4
 
@@ -7,77 +7,66 @@ var CubeContext = /*#__PURE__*/createContext(null);
7
7
  class QueryRenderer extends React.Component {
8
8
  static contextType = CubeContext;
9
9
  static defaultProps = {
10
- cubejsApi: null,
10
+ cubeApi: null,
11
11
  query: null,
12
12
  render: null,
13
13
  queries: null,
14
14
  loadSql: null,
15
15
  updateOnlyOnStateChange: false,
16
16
  resetResultSetOnChange: true
17
- }; // @deprecated use `isQueryPresent` from `@cubejs-client/core`
17
+ };
18
18
 
19
+ // @deprecated use `isQueryPresent` from `@cubejs-client/core`
19
20
  static isQueryPresent(query) {
20
21
  return isQueryPresent(query);
21
22
  }
22
-
23
23
  constructor(props) {
24
24
  super(props);
25
25
  this.state = {};
26
26
  this.mutexObj = {};
27
27
  }
28
-
29
28
  componentDidMount() {
30
29
  const {
31
30
  query,
32
31
  queries
33
32
  } = this.props;
34
-
35
33
  if (query) {
36
34
  this.load(query);
37
35
  }
38
-
39
36
  if (queries) {
40
37
  this.loadQueries(queries);
41
38
  }
42
39
  }
43
-
44
40
  shouldComponentUpdate(nextProps, nextState) {
45
41
  const {
46
42
  query,
47
43
  queries,
48
44
  render,
49
- cubejsApi,
45
+ cubeApi,
50
46
  loadSql,
51
47
  updateOnlyOnStateChange
52
48
  } = this.props;
53
-
54
49
  if (!updateOnlyOnStateChange) {
55
50
  return true;
56
51
  }
57
-
58
- return !equals(nextProps.query, query) || !equals(nextProps.queries, queries) || (nextProps.render == null || render == null) && nextProps.render !== render || nextProps.cubejsApi !== cubejsApi || nextProps.loadSql !== loadSql || !equals(nextState, this.state) || nextProps.updateOnlyOnStateChange !== updateOnlyOnStateChange;
52
+ return !equals(nextProps.query, query) || !equals(nextProps.queries, queries) || (nextProps.render == null || render == null) && nextProps.render !== render || nextProps.cubeApi !== cubeApi || nextProps.loadSql !== loadSql || !equals(nextState, this.state) || nextProps.updateOnlyOnStateChange !== updateOnlyOnStateChange;
59
53
  }
60
-
61
54
  componentDidUpdate(prevProps) {
62
55
  const {
63
56
  query,
64
57
  queries
65
58
  } = this.props;
66
-
67
59
  if (!equals(prevProps.query, query)) {
68
60
  this.load(query);
69
61
  }
70
-
71
62
  if (!equals(prevProps.queries, queries)) {
72
63
  this.loadQueries(queries);
73
64
  }
74
65
  }
75
-
76
- cubejsApi() {
66
+ cubeApi() {
77
67
  // eslint-disable-next-line react/destructuring-assignment
78
- return this.props.cubejsApi || this.context && this.context.cubejsApi;
68
+ return this.props.cubeApi || this.context && this.context.cubeApi;
79
69
  }
80
-
81
70
  load(query) {
82
71
  const {
83
72
  resetResultSetOnChange
@@ -93,28 +82,28 @@ class QueryRenderer extends React.Component {
93
82
  const {
94
83
  loadSql
95
84
  } = this.props;
96
- const cubejsApi = this.cubejsApi();
97
-
85
+ const cubeApi = this.cubeApi();
98
86
  if (query && isQueryPresent(query)) {
99
87
  if (loadSql === 'only') {
100
- cubejsApi.sql(query, {
88
+ cubeApi.sql(query, {
101
89
  mutexObj: this.mutexObj,
102
90
  mutexKey: 'sql'
103
91
  }).then(sqlQuery => this.setState({
104
92
  sqlQuery,
105
93
  error: null,
106
94
  isLoading: false
107
- })).catch(error => this.setState({ ...(resetResultSetOnChange ? {
95
+ })).catch(error => this.setState({
96
+ ...(resetResultSetOnChange ? {
108
97
  resultSet: null
109
98
  } : {}),
110
99
  error,
111
100
  isLoading: false
112
101
  }));
113
102
  } else if (loadSql) {
114
- Promise.all([cubejsApi.sql(query, {
103
+ Promise.all([cubeApi.sql(query, {
115
104
  mutexObj: this.mutexObj,
116
105
  mutexKey: 'sql'
117
- }), cubejsApi.load(query, {
106
+ }), cubeApi.load(query, {
118
107
  mutexObj: this.mutexObj,
119
108
  mutexKey: 'query'
120
109
  })]).then(([sqlQuery, resultSet]) => this.setState({
@@ -122,21 +111,23 @@ class QueryRenderer extends React.Component {
122
111
  resultSet,
123
112
  error: null,
124
113
  isLoading: false
125
- })).catch(error => this.setState({ ...(resetResultSetOnChange ? {
114
+ })).catch(error => this.setState({
115
+ ...(resetResultSetOnChange ? {
126
116
  resultSet: null
127
117
  } : {}),
128
118
  error,
129
119
  isLoading: false
130
120
  }));
131
121
  } else {
132
- cubejsApi.load(query, {
122
+ cubeApi.load(query, {
133
123
  mutexObj: this.mutexObj,
134
124
  mutexKey: 'query'
135
125
  }).then(resultSet => this.setState({
136
126
  resultSet,
137
127
  error: null,
138
128
  isLoading: false
139
- })).catch(error => this.setState({ ...(resetResultSetOnChange ? {
129
+ })).catch(error => this.setState({
130
+ ...(resetResultSetOnChange ? {
140
131
  resultSet: null
141
132
  } : {}),
142
133
  error,
@@ -145,9 +136,8 @@ class QueryRenderer extends React.Component {
145
136
  }
146
137
  }
147
138
  }
148
-
149
139
  loadQueries(queries) {
150
- const cubejsApi = this.cubejsApi();
140
+ const cubeApi = this.cubeApi();
151
141
  const {
152
142
  resetResultSetOnChange
153
143
  } = this.props;
@@ -158,7 +148,7 @@ class QueryRenderer extends React.Component {
158
148
  } : {}),
159
149
  error: null
160
150
  });
161
- const resultPromises = Promise.all(toPairs(queries).map(([name, query]) => cubejsApi.load(query, {
151
+ const resultPromises = Promise.all(toPairs(queries).map(([name, query]) => cubeApi.load(query, {
162
152
  mutexObj: this.mutexObj,
163
153
  mutexKey: name
164
154
  }).then(r => [name, r])));
@@ -166,14 +156,14 @@ class QueryRenderer extends React.Component {
166
156
  resultSet: fromPairs(resultSet),
167
157
  error: null,
168
158
  isLoading: false
169
- })).catch(error => this.setState({ ...(resetResultSetOnChange ? {
159
+ })).catch(error => this.setState({
160
+ ...(resetResultSetOnChange ? {
170
161
  resultSet: null
171
162
  } : {}),
172
163
  error,
173
164
  isLoading: false
174
165
  }));
175
166
  }
176
-
177
167
  render() {
178
168
  const {
179
169
  error,
@@ -193,31 +183,25 @@ class QueryRenderer extends React.Component {
193
183
  },
194
184
  sqlQuery
195
185
  };
196
-
197
186
  if (render) {
198
187
  return render(loadState);
199
188
  }
200
-
201
189
  return null;
202
190
  }
203
-
204
191
  }
205
192
 
206
193
  function _extends() {
207
- _extends = Object.assign || function (target) {
194
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
208
195
  for (var i = 1; i < arguments.length; i++) {
209
196
  var source = arguments[i];
210
-
211
197
  for (var key in source) {
212
198
  if (Object.prototype.hasOwnProperty.call(source, key)) {
213
199
  target[key] = source[key];
214
200
  }
215
201
  }
216
202
  }
217
-
218
203
  return target;
219
204
  };
220
-
221
205
  return _extends.apply(this, arguments);
222
206
  }
223
207
 
@@ -226,9 +210,11 @@ const QueryRendererWithTotals = ({
226
210
  ...restProps
227
211
  }) => /*#__PURE__*/React.createElement(QueryRenderer, _extends({
228
212
  queries: {
229
- totals: { ...query,
213
+ totals: {
214
+ ...query,
230
215
  dimensions: [],
231
- timeDimensions: query.timeDimensions ? query.timeDimensions.map(td => ({ ...td,
216
+ timeDimensions: query.timeDimensions ? query.timeDimensions.map(td => ({
217
+ ...td,
232
218
  granularity: null
233
219
  })) : undefined
234
220
  },
@@ -240,12 +226,10 @@ function removeEmpty(obj) {
240
226
  if (typeof obj !== 'object') {
241
227
  return obj;
242
228
  }
243
-
244
229
  return Object.fromEntries(Object.entries(obj).filter(([, v]) => v != null).map(([k, v]) => {
245
230
  if (Array.isArray(v)) {
246
231
  return [k, v.map(removeEmpty)];
247
232
  }
248
-
249
233
  return [k, typeof v === 'object' ? removeEmpty(v) : v];
250
234
  }));
251
235
  }
@@ -281,7 +265,7 @@ const granularities = [{
281
265
  class QueryBuilder extends React.Component {
282
266
  static contextType = CubeContext;
283
267
  static defaultProps = {
284
- cubejsApi: null,
268
+ cubeApi: null,
285
269
  stateChangeHeuristics: null,
286
270
  disableHeuristics: false,
287
271
  render: null,
@@ -295,29 +279,29 @@ class QueryBuilder extends React.Component {
295
279
  setQuery: null,
296
280
  vizState: null,
297
281
  setVizState: null
298
- }; // This is an anti-pattern, only kept for backward compatibility
299
- // https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#anti-pattern-unconditionally-copying-props-to-state
282
+ };
300
283
 
284
+ // This is an anti-pattern, only kept for backward compatibility
285
+ // https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#anti-pattern-unconditionally-copying-props-to-state
301
286
  static getDerivedStateFromProps(props, state) {
302
287
  if (props.query || props.vizState) {
303
- const nextState = { ...state,
288
+ const nextState = {
289
+ ...state,
304
290
  ...(props.vizState || {})
305
291
  };
306
-
307
292
  if (Array.isArray(props.query)) {
308
293
  throw new Error('Array of queries is not supported.');
309
294
  }
310
-
311
- return { ...nextState,
312
- query: { ...nextState.query,
295
+ return {
296
+ ...nextState,
297
+ query: {
298
+ ...nextState.query,
313
299
  ...(props.query || {})
314
300
  }
315
301
  };
316
302
  }
317
-
318
303
  return null;
319
304
  }
320
-
321
305
  static resolveMember(type, {
322
306
  meta,
323
307
  query
@@ -325,29 +309,27 @@ class QueryBuilder extends React.Component {
325
309
  if (!meta) {
326
310
  return [];
327
311
  }
328
-
329
312
  if (Array.isArray(query)) {
330
313
  return query.reduce((memo, currentQuery) => memo.concat(QueryBuilder.resolveMember(type, {
331
314
  meta,
332
315
  query: currentQuery
333
316
  })), []);
334
317
  }
335
-
336
318
  if (type === 'timeDimensions') {
337
- return (query.timeDimensions || []).map((m, index) => ({ ...m,
338
- dimension: { ...meta.resolveMember(m.dimension, 'dimensions'),
319
+ return (query.timeDimensions || []).map((m, index) => ({
320
+ ...m,
321
+ dimension: {
322
+ ...meta.resolveMember(m.dimension, 'dimensions'),
339
323
  granularities
340
324
  },
341
325
  index
342
326
  }));
343
327
  }
344
-
345
328
  return (query[type] || []).map((m, index) => ({
346
329
  index,
347
330
  ...meta.resolveMember(m, type)
348
331
  }));
349
332
  }
350
-
351
333
  constructor(props) {
352
334
  super(props);
353
335
  this.state = {
@@ -366,12 +348,10 @@ class QueryBuilder extends React.Component {
366
348
  this.mutexObj = {};
367
349
  this.orderMembersOrderKeys = [];
368
350
  }
369
-
370
351
  async componentDidMount() {
371
352
  this.prevContext = this.context;
372
353
  await this.fetchMeta();
373
354
  }
374
-
375
355
  async componentDidUpdate(prevProps) {
376
356
  const {
377
357
  schemaVersion,
@@ -380,16 +360,13 @@ class QueryBuilder extends React.Component {
380
360
  const {
381
361
  meta
382
362
  } = this.state;
383
-
384
- if (this.prevContext?.cubejsApi !== this.context?.cubejsApi) {
363
+ if (this.prevContext?.cubeApi !== this.context?.cubeApi) {
385
364
  this.prevContext = this.context;
386
365
  await this.fetchMeta();
387
366
  }
388
-
389
367
  if (prevProps.schemaVersion !== schemaVersion) {
390
368
  try {
391
- const newMeta = await this.cubejsApi().meta();
392
-
369
+ const newMeta = await this.cubeApi().meta();
393
370
  if (!equals(newMeta, meta) && typeof onSchemaChange === 'function') {
394
371
  onSchemaChange({
395
372
  schemaVersion,
@@ -406,28 +383,24 @@ class QueryBuilder extends React.Component {
406
383
  }
407
384
  }
408
385
  }
409
-
410
386
  fetchMeta = async () => {
411
- if (!this.cubejsApi()) {
387
+ if (!this.cubeApi()) {
412
388
  return;
413
389
  }
414
-
415
390
  let meta;
416
391
  let metaError = null;
417
392
  let richMetaError = null;
418
393
  let metaErrorStack = null;
419
-
420
394
  try {
421
395
  this.setState({
422
396
  isFetchingMeta: true
423
397
  });
424
- meta = await this.cubejsApi().meta();
398
+ meta = await this.cubeApi().meta();
425
399
  } catch (error) {
426
400
  metaError = error.response?.plainError || error;
427
401
  richMetaError = error;
428
402
  metaErrorStack = error.response?.stack?.replace(error.message || '', '') || '';
429
403
  }
430
-
431
404
  this.setState({
432
405
  meta,
433
406
  metaError: metaError ? new Error(metaError.message || metaError.toString()) : null,
@@ -440,41 +413,33 @@ class QueryBuilder extends React.Component {
440
413
  this.updateQuery({});
441
414
  });
442
415
  };
443
-
444
- cubejsApi() {
416
+ cubeApi() {
445
417
  const {
446
- cubejsApi
447
- } = this.props; // eslint-disable-next-line react/destructuring-assignment
448
-
449
- return cubejsApi || this.context && this.context.cubejsApi;
418
+ cubeApi
419
+ } = this.props;
420
+ // eslint-disable-next-line react/destructuring-assignment
421
+ return cubeApi || this.context && this.context.cubeApi;
450
422
  }
451
-
452
423
  getMissingMembers(query, meta) {
453
424
  if (!meta) {
454
425
  return [];
455
426
  }
456
-
457
427
  return getQueryMembers(query).map(member => {
458
428
  const resolvedMember = meta.resolveMember(member, ['measures', 'dimensions', 'segments']);
459
-
460
429
  if (resolvedMember.error) {
461
430
  return member;
462
431
  }
463
-
464
432
  return false;
465
433
  }).filter(Boolean);
466
434
  }
467
-
468
435
  isQueryPresent() {
469
436
  const {
470
437
  query
471
438
  } = this.state;
472
439
  return QueryRenderer.isQueryPresent(query);
473
440
  }
474
-
475
441
  prepareRenderProps(queryRendererProps) {
476
442
  const getName = member => member.name;
477
-
478
443
  const toTimeDimension = member => {
479
444
  const rangeSelection = member.compareDateRange ? {
480
445
  compareDateRange: member.compareDateRange
@@ -487,7 +452,6 @@ class QueryBuilder extends React.Component {
487
452
  ...rangeSelection
488
453
  });
489
454
  };
490
-
491
455
  const toFilter = member => ({
492
456
  member: member.member?.name || member.dimension?.name,
493
457
  operator: member.operator,
@@ -495,7 +459,6 @@ class QueryBuilder extends React.Component {
495
459
  values: member.values
496
460
  })
497
461
  });
498
-
499
462
  const updateMethods = (memberType, toQuery = getName) => ({
500
463
  add: member => {
501
464
  const {
@@ -524,7 +487,6 @@ class QueryBuilder extends React.Component {
524
487
  });
525
488
  }
526
489
  });
527
-
528
490
  const {
529
491
  meta,
530
492
  metaError,
@@ -539,10 +501,12 @@ class QueryBuilder extends React.Component {
539
501
  dryRunResponse,
540
502
  metaErrorStack
541
503
  } = this.state;
542
- const flatFilters = uniqBy(filter => `${prop('member', filter)}${prop('operator', filter)}`, flattenFilters(meta && query.filters || []).map(filter => ({ ...filter,
504
+ const flatFilters = uniqBy(filter => `${prop('member', filter)}${prop('operator', filter)}`, flattenFilters(meta && query.filters || []).map(filter => ({
505
+ ...filter,
543
506
  member: filter.member || filter.dimension
544
507
  })));
545
- const filters = flatFilters.map((m, i) => ({ ...m,
508
+ const filters = flatFilters.map((m, i) => ({
509
+ ...m,
546
510
  dimension: meta.resolveMember(m.member || m.dimension, ['dimensions', 'measures']),
547
511
  operators: meta.filterOperatorsForMember(m.member || m.dimension, ['dimensions', 'measures']),
548
512
  index: i
@@ -564,7 +528,6 @@ class QueryBuilder extends React.Component {
564
528
  segments: [],
565
529
  timeDimensions: []
566
530
  };
567
-
568
531
  if (meta) {
569
532
  availableMeasures = meta.membersForQuery(query, 'measures');
570
533
  availableDimensions = meta.membersForQuery(query, 'dimensions');
@@ -574,17 +537,18 @@ class QueryBuilder extends React.Component {
574
537
  const cubeNames = uniq([...Object.keys(indexedMeasures), ...Object.keys(indexedDimensions)]).sort();
575
538
  availableFilterMembers = cubeNames.map(name => {
576
539
  const cube = indexedMeasures[name] || indexedDimensions[name];
577
- return { ...cube,
540
+ return {
541
+ ...cube,
578
542
  members: [...indexedMeasures[name]?.members, ...indexedDimensions[name]?.members].sort((a, b) => a.shortTitle > b.shortTitle ? 1 : -1)
579
543
  };
580
544
  });
581
545
  }
582
-
583
546
  const activeOrder = Array.isArray(query.order) ? Object.fromEntries(query.order) : query.order;
584
547
  const members = [...measures, ...dimensions, ...timeDimensions.map(({
585
548
  dimension
586
549
  }) => dimension)];
587
- let orderMembers = uniqBy(prop('id'), [// uniqBy prefers first, so these will only be added if not already in the query
550
+ let orderMembers = uniqBy(prop('id'), [
551
+ // uniqBy prefers first, so these will only be added if not already in the query
588
552
  ...members.map(({
589
553
  name,
590
554
  title
@@ -593,19 +557,16 @@ class QueryBuilder extends React.Component {
593
557
  title,
594
558
  order: activeOrder?.[name] || 'none'
595
559
  }))]);
596
-
597
560
  if (this.orderMembersOrderKeys.length !== orderMembers.length) {
598
561
  this.orderMembersOrderKeys = orderMembers.map(({
599
562
  id
600
563
  }) => id);
601
564
  }
602
-
603
565
  if (this.orderMembersOrderKeys.length) {
604
566
  // Preserve order until the members change or manually re-ordered
605
567
  // This is needed so that when an order member becomes active, it doesn't jump to the top of the list
606
568
  orderMembers = (this.orderMembersOrderKeys || []).map(id => orderMembers.find(member => member.id === id)).filter(Boolean);
607
569
  }
608
-
609
570
  return {
610
571
  meta,
611
572
  metaError,
@@ -641,7 +602,8 @@ class QueryBuilder extends React.Component {
641
602
  updateOrder: {
642
603
  set: (memberId, newOrder = 'asc') => {
643
604
  this.updateQuery({
644
- order: orderMembers.map(orderMember => ({ ...orderMember,
605
+ order: orderMembers.map(orderMember => ({
606
+ ...orderMember,
645
607
  order: orderMember.id === memberId ? newOrder : orderMember.order
646
608
  })).reduce((acc, {
647
609
  id,
@@ -658,7 +620,6 @@ class QueryBuilder extends React.Component {
658
620
  if (sourceIndex == null || destinationIndex == null) {
659
621
  return;
660
622
  }
661
-
662
623
  const nextArray = moveItemInArray(orderMembers, sourceIndex, destinationIndex);
663
624
  this.orderMembersOrderKeys = nextArray.map(({
664
625
  id
@@ -688,11 +649,13 @@ class QueryBuilder extends React.Component {
688
649
  limit
689
650
  } = config;
690
651
  this.updateVizState({
691
- pivotConfig: { ...pivotConfig,
652
+ pivotConfig: {
653
+ ...pivotConfig,
692
654
  ...config
693
655
  },
694
656
  ...(limit ? {
695
- query: { ...query,
657
+ query: {
658
+ ...query,
696
659
  limit
697
660
  }
698
661
  } : null)
@@ -706,18 +669,17 @@ class QueryBuilder extends React.Component {
706
669
  ...queryRendererProps
707
670
  };
708
671
  }
709
-
710
672
  updateQuery(queryUpdate) {
711
673
  const {
712
674
  query
713
675
  } = this.state;
714
676
  this.updateVizState({
715
- query: removeEmptyQueryFields({ ...query,
677
+ query: removeEmptyQueryFields({
678
+ ...query,
716
679
  ...queryUpdate
717
680
  })
718
681
  });
719
682
  }
720
-
721
683
  async updateVizState(state) {
722
684
  const {
723
685
  setQuery,
@@ -730,77 +692,75 @@ class QueryBuilder extends React.Component {
730
692
  meta
731
693
  } = this.state;
732
694
  const finalState = this.applyStateChangeHeuristics(state);
733
-
734
695
  if (!finalState.query) {
735
- finalState.query = { ...stateQuery
696
+ finalState.query = {
697
+ ...stateQuery
736
698
  };
737
699
  }
738
-
739
700
  let vizStateSent = null;
740
-
741
701
  const handleVizStateChange = currentState => {
742
702
  const {
743
703
  onVizStateChanged
744
704
  } = this.props;
745
-
746
705
  if (onVizStateChanged) {
747
- const newVizState = pick(['chartType', 'pivotConfig', 'query'], currentState); // Don't run callbacks more than once unless the viz state has changed since last time
748
-
706
+ const newVizState = pick(['chartType', 'pivotConfig', 'query'], currentState);
707
+ // Don't run callbacks more than once unless the viz state has changed since last time
749
708
  if (!vizStateSent || !equals(vizStateSent, newVizState)) {
750
- onVizStateChanged(newVizState); // use clone to make sure we don't save object references
751
-
709
+ onVizStateChanged(newVizState);
710
+ // use clone to make sure we don't save object references
752
711
  vizStateSent = clone(newVizState);
753
712
  }
754
713
  }
755
- }; // deprecated, setters replaced by onVizStateChanged
756
-
714
+ };
757
715
 
716
+ // deprecated, setters replaced by onVizStateChanged
758
717
  const runSetters = currentState => {
759
718
  if (setVizState) {
760
719
  setVizState(pick(['chartType', 'pivotConfig', 'query'], currentState));
761
720
  }
762
-
763
721
  if (currentState.query && setQuery) {
764
722
  setQuery(currentState.query);
765
723
  }
766
724
  };
767
-
768
725
  if (finalState.shouldApplyHeuristicOrder) {
769
726
  finalState.query.order = defaultOrder(finalState.query);
770
727
  }
771
-
772
728
  finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(finalState.query, finalState.pivotConfig !== undefined ? finalState.pivotConfig : statePivotConfig);
773
729
  finalState.missingMembers = this.getMissingMembers(finalState.query, meta);
774
- finalState.chartType = finalState.chartType || state.chartType || chartType; // deprecated
730
+ finalState.chartType = finalState.chartType || state.chartType || chartType;
775
731
 
776
- runSetters({ ...state,
732
+ // deprecated
733
+ runSetters({
734
+ ...state,
777
735
  query: finalState.query
778
- }); // Update optimistically so that UI does not stutter
736
+ });
779
737
 
780
- this.setState({ ...finalState,
738
+ // Update optimistically so that UI does not stutter
739
+ this.setState({
740
+ ...finalState,
781
741
  queryError: null
782
742
  });
783
743
  handleVizStateChange(finalState);
784
744
  const shouldFetchDryRun = !equals(pick(['measures', 'dimensions', 'timeDimensions'], stateQuery), pick(['measures', 'dimensions', 'timeDimensions'], finalState.query));
785
-
786
745
  if (shouldFetchDryRun && isQueryPresent(finalState.query) && finalState.missingMembers.length === 0) {
787
746
  try {
788
- const response = await this.cubejsApi().dryRun(finalState.query, {
747
+ const response = await this.cubeApi().dryRun(finalState.query, {
789
748
  mutexObj: this.mutexObj
790
749
  });
791
-
792
750
  if (finalState.shouldApplyHeuristicOrder) {
793
- finalState.query.order = (response.queryOrder || []).reduce((memo, current) => ({ ...memo,
751
+ finalState.query.order = (response.queryOrder || []).reduce((memo, current) => ({
752
+ ...memo,
794
753
  ...current
795
754
  }), {});
796
755
  }
797
-
798
756
  finalState.pivotConfig = ResultSet.getNormalizedPivotConfig(response.pivotQuery, finalState.pivotConfig);
799
757
  finalState.validatedQuery = this.validatedQuery(finalState);
800
- finalState.dryRunResponse = response; // deprecated
758
+ finalState.dryRunResponse = response;
801
759
 
760
+ // deprecated
802
761
  if (isQueryPresent(stateQuery)) {
803
- runSetters({ ...this.state,
762
+ runSetters({
763
+ ...this.state,
804
764
  ...finalState
805
765
  });
806
766
  }
@@ -811,17 +771,14 @@ class QueryBuilder extends React.Component {
811
771
  });
812
772
  }
813
773
  }
814
-
815
774
  this.setState(finalState, () => handleVizStateChange(this.state));
816
775
  }
817
-
818
776
  validatedQuery(state) {
819
777
  const {
820
778
  query
821
779
  } = state || this.state;
822
780
  return validateQuery(query);
823
781
  }
824
-
825
782
  defaultHeuristics(newState) {
826
783
  const {
827
784
  query,
@@ -833,40 +790,34 @@ class QueryBuilder extends React.Component {
833
790
  sessionGranularity: sessionGranularity || 'day'
834
791
  });
835
792
  }
836
-
837
793
  applyStateChangeHeuristics(newState) {
838
794
  const {
839
795
  stateChangeHeuristics,
840
796
  disableHeuristics
841
797
  } = this.props;
842
-
843
798
  if (disableHeuristics) {
844
799
  return newState;
845
800
  }
846
-
847
801
  return stateChangeHeuristics && stateChangeHeuristics(this.state, newState) || this.defaultHeuristics(newState);
848
802
  }
849
-
850
803
  render() {
851
804
  const {
852
805
  query
853
806
  } = this.state;
854
807
  const {
855
- cubejsApi,
808
+ cubeApi,
856
809
  render,
857
810
  wrapWithQueryRenderer
858
811
  } = this.props;
859
-
860
812
  if (wrapWithQueryRenderer) {
861
813
  return /*#__PURE__*/React.createElement(QueryRenderer, {
862
814
  query: query,
863
- cubejsApi: cubejsApi,
815
+ cubeApi: cubeApi,
864
816
  resetResultSetOnChange: false,
865
817
  render: queryRendererProps => {
866
818
  if (render) {
867
819
  return render(this.prepareRenderProps(queryRendererProps));
868
820
  }
869
-
870
821
  return null;
871
822
  }
872
823
  });
@@ -874,27 +825,18 @@ class QueryBuilder extends React.Component {
874
825
  if (render) {
875
826
  return render(this.prepareRenderProps());
876
827
  }
877
-
878
828
  return null;
879
829
  }
880
830
  }
881
-
882
831
  }
883
832
 
884
833
  function CubeProvider({
885
834
  cubeApi,
886
- cubejsApi,
887
835
  children,
888
836
  options = {}
889
837
  }) {
890
- useEffect(() => {
891
- if (cubejsApi && !cubeApi) {
892
- console.warn('"cubejsApi" is deprecated and will be removed in the following version. Use "cubeApi" instead.');
893
- }
894
- }, [cubeApi, cubejsApi]);
895
838
  return /*#__PURE__*/React.createElement(CubeContext.Provider, {
896
839
  value: {
897
- cubejsApi,
898
840
  cubeApi,
899
841
  options
900
842
  }
@@ -903,11 +845,9 @@ function CubeProvider({
903
845
 
904
846
  function useDeepCompareMemoize(value) {
905
847
  const ref = useRef([]);
906
-
907
848
  if (!equals(value, ref.current)) {
908
849
  ref.current = value;
909
850
  }
910
-
911
851
  return ref.current;
912
852
  }
913
853
 
@@ -934,12 +874,10 @@ function useCubeFetch(method, options = {}) {
934
874
  const {
935
875
  skip = false
936
876
  } = options;
937
-
938
877
  async function load(loadOptions = {}, ignoreSkip = false) {
939
- const cubeApi = options.cubeApi || options.cubejsApi || context?.cubeApi || context?.cubejsApi;
878
+ const cubeApi = options.cubeApi || context?.cubeApi;
940
879
  const query = loadOptions.query || options.query;
941
880
  const queryCondition = method === 'meta' ? true : query && isQueryPresent(query);
942
-
943
881
  if (cubeApi && (ignoreSkip || !skip) && queryCondition) {
944
882
  setError(null);
945
883
  setResponse({
@@ -951,10 +889,8 @@ function useCubeFetch(method, options = {}) {
951
889
  mutexKey: method
952
890
  };
953
891
  const args = method === 'meta' ? [coreOptions] : [query, coreOptions];
954
-
955
892
  try {
956
893
  const response = await cubeApi[method](...args);
957
-
958
894
  if (isMounted()) {
959
895
  setResponse({
960
896
  response,
@@ -972,24 +908,26 @@ function useCubeFetch(method, options = {}) {
972
908
  }
973
909
  }
974
910
  }
975
-
976
911
  useEffect(() => {
977
912
  load();
978
913
  }, useDeepCompareMemoize([Object.keys(options.query?.order || {}), options, context]));
979
- return { ...response,
914
+ return {
915
+ ...response,
980
916
  error,
981
917
  refetch: options => load(options, true)
982
918
  };
983
919
  }
984
920
 
985
921
  function useCubeSql(query, options = {}) {
986
- return useCubeFetch('sql', { ...options,
922
+ return useCubeFetch('sql', {
923
+ ...options,
987
924
  query
988
925
  });
989
926
  }
990
927
 
991
928
  function useDryRun(query, options = {}) {
992
- return useCubeFetch('dryRun', { ...options,
929
+ return useCubeFetch('dryRun', {
930
+ ...options,
993
931
  query
994
932
  });
995
933
  }
@@ -998,7 +936,8 @@ function useLazyDryRun(query, options = {}) {
998
936
  const {
999
937
  refetch,
1000
938
  ...result
1001
- } = useCubeFetch('dryRun', { ...options,
939
+ } = useCubeFetch('dryRun', {
940
+ ...options,
1002
941
  query,
1003
942
  skip: true
1004
943
  });
@@ -1015,34 +954,22 @@ function useCubeQuery(query, options = {}) {
1015
954
  const [error, setError] = useState(null);
1016
955
  const context = useContext(CubeContext);
1017
956
  let subscribeRequest = null;
1018
-
1019
957
  const progressCallback = ({
1020
958
  progressResponse
1021
959
  }) => setProgress(progressResponse);
1022
-
1023
- useEffect(() => {
1024
- if (options.cubejsApi && !options.cubeApi) {
1025
- console.warn('"cubejsApi" is deprecated and will be removed in the following version. Use "cubeApi" instead.');
1026
- }
1027
- }, [options.cubeApi, options.cubejsApi]);
1028
-
1029
960
  async function fetch() {
1030
961
  const {
1031
962
  resetResultSetOnChange
1032
963
  } = options;
1033
- const cubeApi = options.cubeApi || options.cubejsApi || context?.cubeApi || context?.cubejsApi;
1034
-
964
+ const cubeApi = options.cubeApi || context?.cubeApi;
1035
965
  if (!cubeApi) {
1036
966
  throw new Error('Cube API client is not provided');
1037
967
  }
1038
-
1039
968
  if (resetResultSetOnChange) {
1040
969
  setResultSet(null);
1041
970
  }
1042
-
1043
971
  setError(null);
1044
972
  setLoading(true);
1045
-
1046
973
  try {
1047
974
  const response = await cubeApi.load(query, {
1048
975
  mutexObj: mutexRef.current,
@@ -1050,7 +977,6 @@ function useCubeQuery(query, options = {}) {
1050
977
  progressCallback,
1051
978
  castNumerics: Boolean(typeof options.castNumerics === 'boolean' ? options.castNumerics : context?.options?.castNumerics)
1052
979
  });
1053
-
1054
980
  if (isMounted()) {
1055
981
  setResultSet(response);
1056
982
  setProgress(null);
@@ -1062,42 +988,34 @@ function useCubeQuery(query, options = {}) {
1062
988
  setProgress(null);
1063
989
  }
1064
990
  }
1065
-
1066
991
  if (isMounted()) {
1067
992
  setLoading(false);
1068
993
  }
1069
994
  }
1070
-
1071
995
  useEffect(() => {
1072
996
  const {
1073
997
  skip = false,
1074
998
  resetResultSetOnChange
1075
999
  } = options;
1076
- const cubeApi = options.cubeApi || options.cubejsApi || context?.cubeApi || context?.cubejsApi;
1077
-
1000
+ const cubeApi = options.cubeApi || context?.cubeApi;
1078
1001
  if (!cubeApi) {
1079
1002
  throw new Error('Cube API client is not provided');
1080
1003
  }
1081
-
1082
1004
  async function loadQuery() {
1083
1005
  if (!skip && isQueryPresent(query)) {
1084
1006
  if (!areQueriesEqual(currentQuery, query)) {
1085
1007
  if (resetResultSetOnChange == null || resetResultSetOnChange) {
1086
1008
  setResultSet(null);
1087
1009
  }
1088
-
1089
1010
  setCurrentQuery(query);
1090
1011
  }
1091
-
1092
1012
  setError(null);
1093
1013
  setLoading(true);
1094
-
1095
1014
  try {
1096
1015
  if (subscribeRequest) {
1097
1016
  await subscribeRequest.unsubscribe();
1098
1017
  subscribeRequest = null;
1099
1018
  }
1100
-
1101
1019
  if (options.subscribe) {
1102
1020
  subscribeRequest = cubeApi.subscribe(query, {
1103
1021
  mutexObj: mutexRef.current,
@@ -1110,7 +1028,6 @@ function useCubeQuery(query, options = {}) {
1110
1028
  } else {
1111
1029
  setResultSet(result);
1112
1030
  }
1113
-
1114
1031
  setLoading(false);
1115
1032
  setProgress(null);
1116
1033
  }
@@ -1128,7 +1045,6 @@ function useCubeQuery(query, options = {}) {
1128
1045
  }
1129
1046
  }
1130
1047
  }
1131
-
1132
1048
  loadQuery();
1133
1049
  return () => {
1134
1050
  if (subscribeRequest) {