Browse Source

[editor] Switch to Axios for executor API logic in editor v2

Johan Ahlen 5 years ago
parent
commit
9c31deb093

+ 39 - 25
desktop/core/src/desktop/js/api/apiUtilsV2.ts → desktop/core/src/desktop/js/api/utils.ts

@@ -14,21 +14,23 @@
 // See the License for the specific language governing permissions and
 // See the License for the specific language governing permissions and
 // limitations under the License.
 // limitations under the License.
 
 
-import $ from 'jquery';
-import hueUtils from 'utils/hueUtils';
+import axios, { AxiosResponse, AxiosTransformer } from 'axios';
+import qs from 'qs';
+
 import { CancellablePromise } from './cancellablePromise';
 import { CancellablePromise } from './cancellablePromise';
+import hueUtils from 'utils/hueUtils';
 
 
-export const successResponseIsError = (response?: {
+export const successResponseIsError = (responseData?: {
   traceback?: string;
   traceback?: string;
   status?: number;
   status?: number;
   code?: number;
   code?: number;
 }): boolean => {
 }): boolean => {
   return (
   return (
-    typeof response !== 'undefined' &&
-    (typeof response.traceback !== 'undefined' ||
-      (typeof response.status !== 'undefined' && response.status !== 0) ||
-      response.code === 503 ||
-      response.code === 500)
+    typeof responseData !== 'undefined' &&
+    (typeof responseData.traceback !== 'undefined' ||
+      (typeof responseData.status !== 'undefined' && responseData.status !== 0) ||
+      responseData.code === 503 ||
+      responseData.code === 500)
   );
   );
 };
 };
 
 
@@ -74,17 +76,21 @@ export const extractErrorMessage = (
   return UNKNOWN_ERROR_MESSAGE;
   return UNKNOWN_ERROR_MESSAGE;
 };
 };
 
 
-export const simplePost = <T, U>(
+export const post = <T, U = unknown>(
   url: string,
   url: string,
   data?: U,
   data?: U,
-  options?: { dataType?: string; silenceErrors?: boolean; ignoreSuccessErrors?: boolean }
+  options?: {
+    silenceErrors?: boolean;
+    ignoreSuccessErrors?: boolean;
+    transformResponse?: AxiosTransformer;
+  }
 ): CancellablePromise<T> =>
 ): CancellablePromise<T> =>
   new CancellablePromise((resolve, reject, onCancel) => {
   new CancellablePromise((resolve, reject, onCancel) => {
-    const handleErrorResponse = (data: never): void => {
-      const errorMessage = extractErrorMessage(data);
+    const handleErrorResponse = (response: AxiosResponse<T>): void => {
+      const errorMessage = extractErrorMessage(response.data);
       reject(errorMessage);
       reject(errorMessage);
       if (!options || !options.silenceErrors) {
       if (!options || !options.silenceErrors) {
-        hueUtils.logError(data);
+        hueUtils.logError(response.data);
         if (errorMessage.indexOf('AuthorizationException') === -1) {
         if (errorMessage.indexOf('AuthorizationException') === -1) {
           $(document).trigger('error', errorMessage);
           $(document).trigger('error', errorMessage);
         }
         }
@@ -92,25 +98,33 @@ export const simplePost = <T, U>(
       reject(errorMessage);
       reject(errorMessage);
     };
     };
 
 
-    const request = $.post({
-      url: url,
-      data: data,
-      dataType: options && options.dataType
-    })
-      .done(data => {
-        if ((!options || !options.ignoreSuccessErrors) && successResponseIsError(data)) {
-          handleErrorResponse(data as never);
+    const cancelTokenSource = axios.CancelToken.source();
+    let completed = false;
+
+    axios
+      .post<T>(url, qs.stringify(data), {
+        cancelToken: cancelTokenSource.token,
+        transformResponse: options && options.transformResponse
+      })
+      .then(response => {
+        if ((!options || !options.ignoreSuccessErrors) && successResponseIsError(response.data)) {
+          handleErrorResponse(response);
         } else {
         } else {
-          resolve(data);
+          resolve(response.data);
         }
         }
       })
       })
-      .fail(err => {
-        handleErrorResponse(err as never);
+      .catch(err => {
+        handleErrorResponse(err);
+      })
+      .finally(() => {
+        completed = true;
       });
       });
 
 
     if (onCancel) {
     if (onCancel) {
       onCancel(() => {
       onCancel(() => {
-        cancelActiveRequest(request);
+        if (!completed) {
+          cancelTokenSource.cancel();
+        }
       });
       });
     }
     }
   });
   });

+ 0 - 0
desktop/core/src/desktop/js/apps/notebook2/apiUtils.ts → desktop/core/src/desktop/js/apps/notebook2/api.ts


+ 1 - 1
desktop/core/src/desktop/js/apps/notebook2/components/ExecutableActions.vue

@@ -81,7 +81,7 @@
   import Component from 'vue-class-component';
   import Component from 'vue-class-component';
   import { Prop, Watch } from 'vue-property-decorator';
   import { Prop, Watch } from 'vue-property-decorator';
 
 
-  import { Session } from 'apps/notebook2/execution/apiUtils';
+  import { Session } from 'apps/notebook2/execution/api';
   import { EXECUTABLE_UPDATED_EVENT, EXECUTION_STATUS } from 'apps/notebook2/execution/executable';
   import { EXECUTABLE_UPDATED_EVENT, EXECUTION_STATUS } from 'apps/notebook2/execution/executable';
   import sessionManager from 'apps/notebook2/execution/sessionManager';
   import sessionManager from 'apps/notebook2/execution/sessionManager';
 
 

+ 1 - 1
desktop/core/src/desktop/js/apps/notebook2/components/aceEditor/AceEditor.vue

@@ -39,7 +39,7 @@
   import AceAutocomplete from './autocomplete/AceAutocomplete.vue';
   import AceAutocomplete from './autocomplete/AceAutocomplete.vue';
   import AceGutterHandler from './AceGutterHandler';
   import AceGutterHandler from './AceGutterHandler';
   import AceLocationHandler from './AceLocationHandler';
   import AceLocationHandler from './AceLocationHandler';
-  import { formatSql } from 'apps/notebook2/apiUtils';
+  import { formatSql } from 'apps/notebook2/api';
   import Executor from 'apps/notebook2/execution/executor';
   import Executor from 'apps/notebook2/execution/executor';
   import SubscriptionTracker from 'components/utils/SubscriptionTracker';
   import SubscriptionTracker from 'components/utils/SubscriptionTracker';
   import {
   import {

+ 26 - 28
desktop/core/src/desktop/js/apps/notebook2/execution/apiUtils.ts → desktop/core/src/desktop/js/apps/notebook2/execution/api.ts

@@ -14,18 +14,7 @@
 // See the License for the specific language governing permissions and
 // See the License for the specific language governing permissions and
 // limitations under the License.
 // limitations under the License.
 
 
-import { extractErrorMessage, simplePost, successResponseIsError } from 'api/apiUtilsV2';
-import {
-  CANCEL_STATEMENT_API,
-  CHECK_STATUS_API,
-  CLOSE_SESSION_API,
-  CLOSE_STATEMENT_API,
-  CREATE_SESSION_API,
-  EXECUTE_API_PREFIX,
-  FETCH_RESULT_DATA_API,
-  FETCH_RESULT_SIZE_API,
-  GET_LOGS_API
-} from 'api/urls';
+import { extractErrorMessage, post, successResponseIsError } from 'api/utils';
 import Executable, {
 import Executable, {
   ExecutableContext,
   ExecutableContext,
   EXECUTION_STATUS
   EXECUTION_STATUS
@@ -147,6 +136,16 @@ export interface AuthRequest {
   message?: string;
   message?: string;
 }
 }
 
 
+const CANCEL_STATEMENT_API = '/notebook/api/cancel_statement';
+const CHECK_STATUS_API = '/notebook/api/check_status';
+const CLOSE_SESSION_API = '/notebook/api/close_session';
+const CLOSE_STATEMENT_API = '/notebook/api/close_statement';
+const CREATE_SESSION_API = '/notebook/api/create_session';
+const EXECUTE_API_PREFIX = '/notebook/api/execute/';
+const FETCH_RESULT_DATA_API = '/notebook/api/fetch_result_data';
+const FETCH_RESULT_SIZE_API = '/notebook/api/fetch_result_size';
+const GET_LOGS_API = '/notebook/api/get_logs';
+
 export const createSession = async (options: {
 export const createSession = async (options: {
   type: string;
   type: string;
   properties?: SessionProperty[];
   properties?: SessionProperty[];
@@ -156,7 +155,7 @@ export const createSession = async (options: {
     session: JSON.stringify({ type: options.type, properties: options.properties || [] })
     session: JSON.stringify({ type: options.type, properties: options.properties || [] })
   };
   };
 
 
-  const responsePromise = simplePost<
+  const responsePromise = post<
     {
     {
       session?: Session;
       session?: Session;
       status: number;
       status: number;
@@ -190,7 +189,7 @@ export const closeSession = async (options: {
     session: JSON.stringify(options.session)
     session: JSON.stringify(options.session)
   };
   };
 
 
-  await simplePost<void, { session: string }>(CLOSE_SESSION_API, data, {
+  await post<void, { session: string }>(CLOSE_SESSION_API, data, {
     silenceErrors: !!options.silenceErrors
     silenceErrors: !!options.silenceErrors
   });
   });
 };
 };
@@ -202,7 +201,7 @@ export const executeStatement = async (options: ExecuteApiOptions): Promise<Exec
   const data = (await executable.toContext()) as ExecuteData;
   const data = (await executable.toContext()) as ExecuteData;
   data.executable = executable.toJson();
   data.executable = executable.toJson();
 
 
-  const executePromise = simplePost<
+  const executePromise = post<
     {
     {
       handle: ExecutionHandle;
       handle: ExecutionHandle;
       history_id?: number;
       history_id?: number;
@@ -258,7 +257,7 @@ export const executeStatement = async (options: ExecuteApiOptions): Promise<Exec
 export const cancelStatement = async (options: ExecuteApiOptions): Promise<void> => {
 export const cancelStatement = async (options: ExecuteApiOptions): Promise<void> => {
   const data = await options.executable.toContext();
   const data = await options.executable.toContext();
 
 
-  await simplePost<void, ExecutableContext>(CANCEL_STATEMENT_API, data, {
+  await post<void, ExecutableContext>(CANCEL_STATEMENT_API, data, {
     silenceErrors: !!options.silenceErrors
     silenceErrors: !!options.silenceErrors
   });
   });
 };
 };
@@ -268,7 +267,7 @@ export const closeStatement = async (options: ExecuteApiOptions): Promise<void>
     return;
     return;
   }
   }
   const data = { operationId: options.executable.operationId };
   const data = { operationId: options.executable.operationId };
-  await simplePost<void, { operationId: string }>(CLOSE_STATEMENT_API, data, {
+  await post<void, { operationId: string }>(CLOSE_STATEMENT_API, data, {
     silenceErrors: !!options.silenceErrors
     silenceErrors: !!options.silenceErrors
   });
   });
 };
 };
@@ -281,7 +280,7 @@ export const checkExecutionStatus = async (
   }
   }
 
 
   const data = { operationId: options.executable.operationId };
   const data = { operationId: options.executable.operationId };
-  const responsePromise = simplePost<
+  const responsePromise = post<
     {
     {
       query_status?: ExecuteStatusApiResponse;
       query_status?: ExecuteStatusApiResponse;
       status: number;
       status: number;
@@ -317,17 +316,16 @@ export const fetchResults = async (options: {
   data.rows = options.rows;
   data.rows = options.rows;
   data.startOver = options.startOver;
   data.startOver = options.startOver;
 
 
-  const responsePromise = simplePost<string, FetchResultData>(FETCH_RESULT_DATA_API, data, {
+  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+  // @ts-ignore
+  const transformResponse = (response: unknown) => JSON.bigdataParse(response).result;
+
+  const responsePromise = post<ResultApiResponse>(FETCH_RESULT_DATA_API, data, {
     silenceErrors: !!options.silenceErrors,
     silenceErrors: !!options.silenceErrors,
-    dataType: 'text'
+    transformResponse
   });
   });
 
 
-  options.executable.addCancellable(responsePromise);
-  const response = await (responsePromise as Promise<string>);
-  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
-  // @ts-ignore
-  const parsed = JSON.bigdataParse(response);
-  return parsed.result as ResultApiResponse;
+  return responsePromise;
 };
 };
 
 
 export const fetchResultSize = async (
 export const fetchResultSize = async (
@@ -335,7 +333,7 @@ export const fetchResultSize = async (
 ): Promise<ResultSizeApiResponse> => {
 ): Promise<ResultSizeApiResponse> => {
   const data = await options.executable.toContext();
   const data = await options.executable.toContext();
 
 
-  const responsePromise = simplePost<
+  const responsePromise = post<
     {
     {
       result: ResultSizeApiResponse;
       result: ResultSizeApiResponse;
     },
     },
@@ -361,7 +359,7 @@ export const fetchLogs = async (options: {
   data.jobs = options.jobs && JSON.stringify(options.jobs);
   data.jobs = options.jobs && JSON.stringify(options.jobs);
   data.from = options.from || 0;
   data.from = options.from || 0;
 
 
-  const responsePromise = simplePost<
+  const responsePromise = post<
     {
     {
       logs: string;
       logs: string;
       isFullLogs: boolean;
       isFullLogs: boolean;

+ 1 - 1
desktop/core/src/desktop/js/apps/notebook2/execution/executable.ts

@@ -23,7 +23,7 @@ import {
   ExecuteApiResponse,
   ExecuteApiResponse,
   ExecutionHandle,
   ExecutionHandle,
   ExecutionHistory
   ExecutionHistory
-} from 'apps/notebook2/execution/apiUtils';
+} from 'apps/notebook2/execution/api';
 import ExecutionResult from 'apps/notebook2/execution/executionResult';
 import ExecutionResult from 'apps/notebook2/execution/executionResult';
 import { hueWindow } from 'types/types';
 import { hueWindow } from 'types/types';
 import hueAnalytics from 'utils/hueAnalytics';
 import hueAnalytics from 'utils/hueAnalytics';

+ 1 - 1
desktop/core/src/desktop/js/apps/notebook2/execution/executionLogs.ts

@@ -14,7 +14,7 @@
 // See the License for the specific language governing permissions and
 // See the License for the specific language governing permissions and
 // limitations under the License.
 // limitations under the License.
 
 
-import { ExecutionJob, fetchLogs } from 'apps/notebook2/execution/apiUtils';
+import { ExecutionJob, fetchLogs } from 'apps/notebook2/execution/api';
 import huePubSub from 'utils/huePubSub';
 import huePubSub from 'utils/huePubSub';
 import Executable, { EXECUTION_STATUS } from './executable';
 import Executable, { EXECUTION_STATUS } from './executable';
 
 

+ 1 - 1
desktop/core/src/desktop/js/apps/notebook2/execution/executionResult.ts

@@ -20,7 +20,7 @@ import {
   ResultApiResponse,
   ResultApiResponse,
   ResultMeta,
   ResultMeta,
   ResultSizeApiResponse
   ResultSizeApiResponse
-} from 'apps/notebook2/execution/apiUtils';
+} from 'apps/notebook2/execution/api';
 import { Observable } from 'knockout';
 import { Observable } from 'knockout';
 import * as ko from 'knockout';
 import * as ko from 'knockout';
 
 

+ 13 - 13
desktop/core/src/desktop/js/apps/notebook2/execution/sessionManager.test.ts

@@ -16,10 +16,10 @@
 
 
 import { CancellablePromise } from 'api/cancellablePromise';
 import { CancellablePromise } from 'api/cancellablePromise';
 import { CLOSE_SESSION_API } from 'api/urls';
 import { CLOSE_SESSION_API } from 'api/urls';
-import { AuthRequest, Session, SessionProperty } from './apiUtils';
+import { AuthRequest, Session, SessionProperty } from './api';
 
 
-import * as ApiUtils from './apiUtils';
-import * as ApiUtilsV2 from 'api/apiUtilsV2';
+import * as ExecutionApi from './api';
+import * as ApiUtils from 'api/utils';
 import sessionManager from './sessionManager';
 import sessionManager from './sessionManager';
 
 
 describe('sessionManager.ts', () => {
 describe('sessionManager.ts', () => {
@@ -44,7 +44,7 @@ describe('sessionManager.ts', () => {
       }
       }
       return sessionCount[type]++;
       return sessionCount[type]++;
     };
     };
-    spy = jest.spyOn(ApiUtils, 'createSession').mockImplementation(
+    spy = jest.spyOn(ExecutionApi, 'createSession').mockImplementation(
       async (options: {
       async (options: {
         type: string;
         type: string;
         properties?: SessionProperty[];
         properties?: SessionProperty[];
@@ -82,7 +82,7 @@ describe('sessionManager.ts', () => {
 
 
     expect((await sessionManager.getAllSessions()).length).toEqual(0);
     expect((await sessionManager.getAllSessions()).length).toEqual(0);
     expect(sessionManager.hasSession('impala')).toBeFalsy();
     expect(sessionManager.hasSession('impala')).toBeFalsy();
-    expect(ApiUtils.createSession).toHaveBeenCalledWith(sessionDetails);
+    expect(ExecutionApi.createSession).toHaveBeenCalledWith(sessionDetails);
   });
   });
 
 
   it('should keep one sessions instance per type', async () => {
   it('should keep one sessions instance per type', async () => {
@@ -98,7 +98,7 @@ describe('sessionManager.ts', () => {
 
 
     expect((await sessionManager.getAllSessions()).length).toEqual(1);
     expect((await sessionManager.getAllSessions()).length).toEqual(1);
     expect(sessionManager.hasSession('impala')).toBeTruthy();
     expect(sessionManager.hasSession('impala')).toBeTruthy();
-    expect(ApiUtils.createSession).toHaveBeenCalledTimes(1);
+    expect(ExecutionApi.createSession).toHaveBeenCalledTimes(1);
   });
   });
 
 
   it('should keep track of multiple instance per type', async () => {
   it('should keep track of multiple instance per type', async () => {
@@ -115,7 +115,7 @@ describe('sessionManager.ts', () => {
     expect((await sessionManager.getAllSessions()).length).toEqual(2);
     expect((await sessionManager.getAllSessions()).length).toEqual(2);
     expect(sessionManager.hasSession('impala')).toBeTruthy();
     expect(sessionManager.hasSession('impala')).toBeTruthy();
     expect(sessionManager.hasSession('hive')).toBeTruthy();
     expect(sessionManager.hasSession('hive')).toBeTruthy();
-    expect(ApiUtils.createSession).toHaveBeenCalledTimes(2);
+    expect(ExecutionApi.createSession).toHaveBeenCalledTimes(2);
   });
   });
 
 
   it('should stop tracking sessions when closed', async () => {
   it('should stop tracking sessions when closed', async () => {
@@ -135,7 +135,7 @@ describe('sessionManager.ts', () => {
     //     }
     //     }
     // Close the session
     // Close the session
 
 
-    const postSpy = jest.spyOn(ApiUtilsV2, 'simplePost').mockImplementation(
+    const postSpy = jest.spyOn(ApiUtils, 'post').mockImplementation(
       (
       (
         url: string,
         url: string,
         data: unknown,
         data: unknown,
@@ -154,8 +154,8 @@ describe('sessionManager.ts', () => {
     await sessionManager.closeSession(session);
     await sessionManager.closeSession(session);
 
 
     expect(sessionManager.hasSession('impala')).toBeFalsy();
     expect(sessionManager.hasSession('impala')).toBeFalsy();
-    expect(ApiUtils.createSession).toHaveBeenCalledTimes(1);
-    expect(ApiUtilsV2.simplePost).toHaveBeenCalledTimes(1);
+    expect(ExecutionApi.createSession).toHaveBeenCalledTimes(1);
+    expect(ApiUtils.post).toHaveBeenCalledTimes(1);
     postSpy.mockClear();
     postSpy.mockClear();
   });
   });
 
 
@@ -169,7 +169,7 @@ describe('sessionManager.ts', () => {
     expect(sessionManager.hasSession('impala')).toBeTruthy();
     expect(sessionManager.hasSession('impala')).toBeTruthy();
 
 
     // Restart the session
     // Restart the session
-    const postSpy = jest.spyOn(ApiUtilsV2, 'simplePost').mockImplementation(
+    const postSpy = jest.spyOn(ApiUtils, 'post').mockImplementation(
       (): CancellablePromise<unknown> =>
       (): CancellablePromise<unknown> =>
         new CancellablePromise(resolve => {
         new CancellablePromise(resolve => {
           resolve();
           resolve();
@@ -180,8 +180,8 @@ describe('sessionManager.ts', () => {
     expect(session.session_id).toEqual('impala_1');
     expect(session.session_id).toEqual('impala_1');
     expect(sessionManager.hasSession('impala')).toBeTruthy();
     expect(sessionManager.hasSession('impala')).toBeTruthy();
 
 
-    expect(ApiUtils.createSession).toHaveBeenCalledTimes(2);
-    expect(ApiUtilsV2.simplePost).toHaveBeenCalledTimes(1);
+    expect(ExecutionApi.createSession).toHaveBeenCalledTimes(2);
+    expect(ApiUtils.post).toHaveBeenCalledTimes(1);
     postSpy.mockClear();
     postSpy.mockClear();
   });
   });
 });
 });

+ 1 - 1
desktop/core/src/desktop/js/apps/notebook2/execution/sessionManager.ts

@@ -20,7 +20,7 @@ import {
   createSession,
   createSession,
   Session,
   Session,
   SessionProperty
   SessionProperty
-} from 'apps/notebook2/execution/apiUtils';
+} from 'apps/notebook2/execution/api';
 import huePubSub from 'utils/huePubSub';
 import huePubSub from 'utils/huePubSub';
 
 
 class SessionManager {
 class SessionManager {

+ 4 - 4
desktop/core/src/desktop/js/apps/notebook2/execution/sqlExecutable.test.ts

@@ -21,7 +21,7 @@ import Executor from 'apps/notebook2/execution/executor';
 import SqlExecutable from './sqlExecutable';
 import SqlExecutable from './sqlExecutable';
 import { EXECUTION_STATUS } from './executable';
 import { EXECUTION_STATUS } from './executable';
 import sessionManager from './sessionManager';
 import sessionManager from './sessionManager';
-import * as ApiUtils from 'api/apiUtilsV2';
+import * as ApiUtils from 'api/utils';
 import { ParsedSqlStatement } from 'parse/sqlStatementsParser';
 import { ParsedSqlStatement } from 'parse/sqlStatementsParser';
 
 
 describe('sqlExecutable.js', () => {
 describe('sqlExecutable.js', () => {
@@ -100,7 +100,7 @@ describe('sqlExecutable.js', () => {
       statusResolve = resolve;
       statusResolve = resolve;
     });
     });
 
 
-    jest.spyOn(ApiUtils, 'simplePost').mockImplementation(
+    jest.spyOn(ApiUtils, 'post').mockImplementation(
       (url: string): CancellablePromise<unknown> => {
       (url: string): CancellablePromise<unknown> => {
         currentApiHit++;
         currentApiHit++;
         if (url.indexOf(CREATE_SESSION_API) !== -1) {
         if (url.indexOf(CREATE_SESSION_API) !== -1) {
@@ -159,7 +159,7 @@ describe('sqlExecutable.js', () => {
   //       })
   //       })
   //   );
   //   );
   //
   //
-  //   jest.spyOn(ApiUtils, 'simplePost').mockImplementation(url => {
+  //   jest.spyOn(ApiUtils, 'post').mockImplementation(url => {
   //     expect(url).toEqual('/notebook/api/execute/impala');
   //     expect(url).toEqual('/notebook/api/execute/impala');
   //     return simplePostDeferred;
   //     return simplePostDeferred;
   //   });
   //   });
@@ -182,7 +182,7 @@ describe('sqlExecutable.js', () => {
   //
   //
   //   const simplePostExeuteDeferred = $.Deferred();
   //   const simplePostExeuteDeferred = $.Deferred();
   //   const simplePostCancelDeferred = $.Deferred();
   //   const simplePostCancelDeferred = $.Deferred();
-  //   jest.spyOn(ApiUtils, 'simplePost').mockImplementation(url => {
+  //   jest.spyOn(ApiUtils, 'post').mockImplementation(url => {
   //     if (url === '/notebook/api/execute/impala') {
   //     if (url === '/notebook/api/execute/impala') {
   //       return simplePostExeuteDeferred;
   //       return simplePostExeuteDeferred;
   //     } else if (url === '/notebook/api/cancel_statement') {
   //     } else if (url === '/notebook/api/cancel_statement') {

+ 1 - 1
desktop/core/src/desktop/js/apps/notebook2/execution/sqlExecutable.ts

@@ -14,7 +14,7 @@
 // See the License for the specific language governing permissions and
 // See the License for the specific language governing permissions and
 // limitations under the License.
 // limitations under the License.
 
 
-import { ExecuteApiResponse, executeStatement } from 'apps/notebook2/execution/apiUtils';
+import { ExecuteApiResponse, executeStatement } from 'apps/notebook2/execution/api';
 import Executable, { ExecutableRaw } from 'apps/notebook2/execution/executable';
 import Executable, { ExecutableRaw } from 'apps/notebook2/execution/executable';
 import { ExecutionError } from 'apps/notebook2/execution/executionLogs';
 import { ExecutionError } from 'apps/notebook2/execution/executionLogs';
 import Executor from 'apps/notebook2/execution/executor';
 import Executor from 'apps/notebook2/execution/executor';

+ 1 - 1
desktop/core/src/desktop/js/components/SqlText.vue

@@ -28,7 +28,7 @@
   import Component from 'vue-class-component';
   import Component from 'vue-class-component';
   import { Prop, Watch } from 'vue-property-decorator';
   import { Prop, Watch } from 'vue-property-decorator';
 
 
-  import { formatSql } from 'apps/notebook2/apiUtils';
+  import { formatSql } from 'apps/notebook2/api';
   import { hueLocalStorage } from 'utils/storageUtils';
   import { hueLocalStorage } from 'utils/storageUtils';
 
 
   interface Ace {
   interface Ace {

+ 1 - 1
desktop/core/src/desktop/js/utils/hueUtils.ts

@@ -291,7 +291,7 @@ export const getSearchParameter = (
   return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
   return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
 };
 };
 
 
-export const logError = (error: string): void => {
+export const logError = (error: unknown): void => {
   if (typeof window.console !== 'undefined' && typeof window.console.error !== 'undefined') {
   if (typeof window.console !== 'undefined' && typeof window.console.error !== 'undefined') {
     if (typeof error !== 'undefined') {
     if (typeof error !== 'undefined') {
       console.error(error);
       console.error(error);