@cubejs-client/react 0.30.30 → 0.30.60

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/index.d.ts CHANGED
@@ -240,6 +240,7 @@ declare module '@cubejs-client/react' {
240
240
 
241
241
  meta: Meta | undefined;
242
242
  metaError?: Error | null;
243
+ richMetaError?: Error | null;
243
244
  metaErrorStack?: string | null;
244
245
  isFetchingMeta: boolean;
245
246
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cubejs-client/react",
3
- "version": "0.30.30",
3
+ "version": "0.30.60",
4
4
  "author": "Cube Dev, Inc.",
5
5
  "license": "MIT",
6
6
  "engines": {},
@@ -24,10 +24,8 @@
24
24
  ],
25
25
  "dependencies": {
26
26
  "@babel/runtime": "^7.1.2",
27
- "@cubejs-client/core": "^0.30.29",
28
- "anser": "^2.0.1",
27
+ "@cubejs-client/core": "^0.30.60",
29
28
  "core-js": "^3.6.5",
30
- "html-entities": "^2.3.2",
31
29
  "ramda": "^0.27.0"
32
30
  },
33
31
  "devDependencies": {
@@ -44,5 +42,5 @@
44
42
  "peerDependencies": {
45
43
  "react": ">=16.10.2"
46
44
  },
47
- "gitHead": "21d664e571c93dc4bde75ee744f0cdd20a590bff"
45
+ "gitHead": "7ec87645cf0063257e527a83ea91f77551ad607c"
48
46
  }
@@ -15,7 +15,7 @@ import {
15
15
 
16
16
  import QueryRenderer from './QueryRenderer.jsx';
17
17
  import CubeContext from './CubeContext';
18
- import { generateAnsiHTML, removeEmpty } from './utils';
18
+ import { removeEmpty } from './utils';
19
19
 
20
20
  const granularities = [
21
21
  { name: undefined, title: 'w/o grouping' },
@@ -148,20 +148,23 @@ export default class QueryBuilder extends React.Component {
148
148
 
149
149
  let meta;
150
150
  let metaError = null;
151
+ let richMetaError = null;
151
152
  let metaErrorStack = null;
152
153
 
153
154
  try {
154
155
  this.setState({ isFetchingMeta: true });
155
156
  meta = await this.cubejsApi().meta();
156
157
  } catch (error) {
157
- metaError = error;
158
+ metaError = error.response?.plainError || error;
159
+ richMetaError = error;
158
160
  metaErrorStack = error.response?.stack?.replace(error.message || '', '') || '';
159
161
  }
160
162
 
161
163
  this.setState(
162
164
  {
163
165
  meta,
164
- metaError: metaError ? new Error(generateAnsiHTML(metaError.message || metaError.toString())) : null,
166
+ metaError: metaError ? new Error(metaError.message || metaError.toString()) : null,
167
+ richMetaError,
165
168
  metaErrorStack,
166
169
  isFetchingMeta: false,
167
170
  },
@@ -248,6 +251,7 @@ export default class QueryBuilder extends React.Component {
248
251
  const {
249
252
  meta,
250
253
  metaError,
254
+ richMetaError,
251
255
  query,
252
256
  queryError,
253
257
  chartType,
@@ -339,6 +343,7 @@ export default class QueryBuilder extends React.Component {
339
343
  return {
340
344
  meta,
341
345
  metaError,
346
+ richMetaError,
342
347
  metaErrorStack,
343
348
  query,
344
349
  error: queryError, // Match same name as QueryRenderer prop
@@ -518,7 +523,8 @@ export default class QueryBuilder extends React.Component {
518
523
  }
519
524
  } catch (error) {
520
525
  this.setState({
521
- queryError: new Error(generateAnsiHTML(error.message || error.toString())),
526
+ queryError: new Error(error.response?.plainError || error.message),
527
+ richQueryError: new Error(error.message || error.toString())
522
528
  });
523
529
  }
524
530
  }
@@ -3,7 +3,6 @@ import { equals, toPairs, fromPairs } from 'ramda';
3
3
  import { isQueryPresent } from '@cubejs-client/core';
4
4
 
5
5
  import CubeContext from './CubeContext';
6
- import { generateAnsiHTML } from './utils';
7
6
 
8
7
  export default class QueryRenderer extends React.Component {
9
8
  // @deprected use `isQueryPresent` from `@cubejs-client/core`
@@ -136,7 +135,7 @@ export default class QueryRenderer extends React.Component {
136
135
  const { render } = this.props;
137
136
 
138
137
  const loadState = {
139
- error: error ? new Error(generateAnsiHTML(error.message || error.toString())) : null,
138
+ error: error ? new Error(error.response?.plainError || error.message || error.toString()) : null,
140
139
  resultSet: queries ? (resultSet || {}) : resultSet,
141
140
  loadingState: { isLoading },
142
141
  sqlQuery
@@ -3,10 +3,11 @@ import { isQueryPresent, areQueriesEqual } from '@cubejs-client/core';
3
3
 
4
4
  import CubeContext from '../CubeContext';
5
5
  import useDeepCompareMemoize from './deep-compare-memoize';
6
+ import { useIsMounted } from './is-mounted';
6
7
 
7
8
  export function useCubeQuery(query, options = {}) {
8
9
  const mutexRef = useRef({});
9
- const isMounted = useRef(true);
10
+ const isMounted = useIsMounted();
10
11
  const [currentQuery, setCurrentQuery] = useState(null);
11
12
  const [isLoading, setLoading] = useState(false);
12
13
  const [resultSet, setResultSet] = useState(null);
@@ -40,29 +41,23 @@ export function useCubeQuery(query, options = {}) {
40
41
  progressCallback,
41
42
  });
42
43
 
43
- if (isMounted.current) {
44
+ if (isMounted()) {
44
45
  setResultSet(response);
45
46
  setProgress(null);
46
47
  }
47
48
  } catch (error) {
48
- if (isMounted.current) {
49
+ if (isMounted()) {
49
50
  setError(error);
50
51
  setResultSet(null);
51
52
  setProgress(null);
52
53
  }
53
54
  }
54
55
 
55
- if (isMounted.current) {
56
+ if (isMounted()) {
56
57
  setLoading(false);
57
58
  }
58
59
  }
59
60
 
60
- useEffect(() => {
61
- return () => {
62
- isMounted.current = false;
63
- };
64
- }, []);
65
-
66
61
  useEffect(() => {
67
62
  const { skip = false, resetResultSetOnChange } = options;
68
63
 
@@ -99,7 +94,7 @@ export function useCubeQuery(query, options = {}) {
99
94
  progressCallback,
100
95
  },
101
96
  (e, result) => {
102
- if (isMounted.current) {
97
+ if (isMounted()) {
103
98
  if (e) {
104
99
  setError(e);
105
100
  } else {
@@ -114,7 +109,7 @@ export function useCubeQuery(query, options = {}) {
114
109
  await fetch();
115
110
  }
116
111
  } catch (e) {
117
- if (isMounted.current) {
112
+ if (isMounted()) {
118
113
  setError(e);
119
114
  setResultSet(null);
120
115
  setLoading(false);
package/src/utils.js CHANGED
@@ -1,81 +1,3 @@
1
- import Anser from 'anser';
2
- import { encode } from 'html-entities';
3
-
4
- const colors = {
5
- reset: 'orange',
6
- black: 'black',
7
- red: 'red',
8
- green: 'green',
9
- yellow: 'orange',
10
- blue: 'blue',
11
- magenta: 'magenta',
12
- cyan: 'cyan',
13
- gray: 'gray',
14
- lightgrey: 'lightgrey',
15
- darkgrey: 'darkgrey',
16
- };
17
-
18
- const anserMap = {
19
- 'ansi-bright-black': 'black',
20
- 'ansi-bright-yellow': 'yellow',
21
- 'ansi-yellow': 'yellow',
22
- 'ansi-bright-green': 'green',
23
- 'ansi-green': 'green',
24
- 'ansi-bright-cyan': 'cyan',
25
- 'ansi-cyan': 'cyan',
26
- 'ansi-bright-red': 'red',
27
- 'ansi-red': 'red',
28
- 'ansi-bright-magenta': 'magenta',
29
- 'ansi-magenta': 'magenta',
30
- 'ansi-white': 'darkgrey',
31
- };
32
-
33
- export function generateAnsiHTML(txt) {
34
- const arr = new Anser().ansiToJson(encode(txt), {
35
- use_classes: true,
36
- });
37
-
38
- let result = '';
39
- let open = false;
40
- for (let index = 0; index < arr.length; ++index) {
41
- const c = arr[index];
42
- const { content } = c;
43
- const { fg } = c;
44
-
45
- const contentParts = content.split('\n');
46
- for (let j = 0; j < contentParts.length; ++j) {
47
- if (!open) {
48
- result += '<span data-ansi-line="true">';
49
- open = true;
50
- }
51
- const part = contentParts[j].replace('\r', '');
52
- const color = colors[anserMap[fg]];
53
-
54
- if (color != null) {
55
- result += `<span style="color: ${color};">${part}</span>`;
56
- } else {
57
- if (fg != null) {
58
- console.log('Missing color mapping: ', fg);
59
- }
60
-
61
- result += `<span>${part}</span>`;
62
- }
63
-
64
- if (j < contentParts.length - 1) {
65
- result += '</span>';
66
- open = false;
67
- result += '<br/>';
68
- }
69
- }
70
- }
71
-
72
- if (open) {
73
- result += '</span>';
74
- }
75
-
76
- return result;
77
- }
78
-
79
1
  export function removeEmpty(obj) {
80
2
  if (typeof obj !== 'object') {
81
3
  return obj;