@thoughtspot/visual-embed-sdk 1.27.0-alpha.0 → 1.27.0-loggers

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.
Files changed (178) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/auth.d.ts.map +1 -1
  3. package/cjs/src/auth.js +5 -4
  4. package/cjs/src/auth.js.map +1 -1
  5. package/cjs/src/embed/app.d.ts +1 -1
  6. package/cjs/src/embed/app.d.ts.map +1 -1
  7. package/cjs/src/embed/app.js +3 -2
  8. package/cjs/src/embed/app.js.map +1 -1
  9. package/cjs/src/embed/app.spec.js +5 -4
  10. package/cjs/src/embed/app.spec.js.map +1 -1
  11. package/cjs/src/embed/base.d.ts.map +1 -1
  12. package/cjs/src/embed/base.js +5 -2
  13. package/cjs/src/embed/base.js.map +1 -1
  14. package/cjs/src/embed/base.spec.js +3 -2
  15. package/cjs/src/embed/base.spec.js.map +1 -1
  16. package/cjs/src/embed/embed.spec.js +2 -1
  17. package/cjs/src/embed/embed.spec.js.map +1 -1
  18. package/cjs/src/embed/embedConfig.d.ts +2 -1
  19. package/cjs/src/embed/embedConfig.d.ts.map +1 -1
  20. package/cjs/src/embed/embedConfig.js +2 -0
  21. package/cjs/src/embed/embedConfig.js.map +1 -1
  22. package/cjs/src/embed/events.spec.js +3 -2
  23. package/cjs/src/embed/events.spec.js.map +1 -1
  24. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  25. package/cjs/src/embed/liveboard.js.map +1 -1
  26. package/cjs/src/embed/sage.d.ts +1 -1
  27. package/cjs/src/embed/sage.d.ts.map +1 -1
  28. package/cjs/src/embed/sage.js.map +1 -1
  29. package/cjs/src/embed/search.d.ts +1 -1
  30. package/cjs/src/embed/search.d.ts.map +1 -1
  31. package/cjs/src/embed/search.js +2 -3
  32. package/cjs/src/embed/search.js.map +1 -1
  33. package/cjs/src/embed/ts-embed.d.ts +0 -1
  34. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  35. package/cjs/src/embed/ts-embed.js +13 -13
  36. package/cjs/src/embed/ts-embed.js.map +1 -1
  37. package/cjs/src/embed/ts-embed.spec.js +27 -26
  38. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  39. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  40. package/cjs/src/mixpanel-service.js +2 -1
  41. package/cjs/src/mixpanel-service.js.map +1 -1
  42. package/cjs/src/react/index.spec.js +2 -2
  43. package/cjs/src/react/index.spec.js.map +1 -1
  44. package/cjs/src/types.d.ts +25 -1
  45. package/cjs/src/types.d.ts.map +1 -1
  46. package/cjs/src/types.js +12 -1
  47. package/cjs/src/types.js.map +1 -1
  48. package/cjs/src/utils/authService/authService.d.ts.map +1 -1
  49. package/cjs/src/utils/authService/authService.js +3 -2
  50. package/cjs/src/utils/authService/authService.js.map +1 -1
  51. package/cjs/src/utils/authService/authService.spec.js +3 -2
  52. package/cjs/src/utils/authService/authService.spec.js.map +1 -1
  53. package/cjs/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  54. package/cjs/src/utils/authService/tokenizedAuthService.js +2 -1
  55. package/cjs/src/utils/authService/tokenizedAuthService.js.map +1 -1
  56. package/cjs/src/utils/logger.d.ts +18 -0
  57. package/cjs/src/utils/logger.d.ts.map +1 -0
  58. package/cjs/src/utils/logger.js +78 -0
  59. package/cjs/src/utils/logger.js.map +1 -0
  60. package/cjs/src/utils/logger.spec.d.ts +25 -0
  61. package/cjs/src/utils/logger.spec.d.ts.map +1 -0
  62. package/cjs/src/utils/logger.spec.js +80 -0
  63. package/cjs/src/utils/logger.spec.js.map +1 -0
  64. package/dist/src/auth.d.ts.map +1 -1
  65. package/dist/src/embed/app.d.ts +1 -1
  66. package/dist/src/embed/app.d.ts.map +1 -1
  67. package/dist/src/embed/base.d.ts.map +1 -1
  68. package/dist/src/embed/embedConfig.d.ts +2 -1
  69. package/dist/src/embed/embedConfig.d.ts.map +1 -1
  70. package/dist/src/embed/liveboard.d.ts.map +1 -1
  71. package/dist/src/embed/sage.d.ts +1 -1
  72. package/dist/src/embed/sage.d.ts.map +1 -1
  73. package/dist/src/embed/search.d.ts +1 -1
  74. package/dist/src/embed/search.d.ts.map +1 -1
  75. package/dist/src/embed/ts-embed.d.ts +0 -1
  76. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  77. package/dist/src/mixpanel-service.d.ts.map +1 -1
  78. package/dist/src/types.d.ts +25 -1
  79. package/dist/src/types.d.ts.map +1 -1
  80. package/dist/src/utils/authService/authService.d.ts.map +1 -1
  81. package/dist/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  82. package/dist/src/utils/logger.d.ts +18 -0
  83. package/dist/src/utils/logger.d.ts.map +1 -0
  84. package/dist/src/utils/logger.spec.d.ts +25 -0
  85. package/dist/src/utils/logger.spec.d.ts.map +1 -0
  86. package/dist/tsembed-react.es.js +17309 -33
  87. package/dist/tsembed-react.js +17309 -33
  88. package/dist/tsembed.es.js +17635 -353
  89. package/dist/tsembed.js +32458 -15176
  90. package/dist/visual-embed-sdk-react-full.d.ts +27 -24
  91. package/dist/visual-embed-sdk-react.d.ts +27 -24
  92. package/dist/visual-embed-sdk.d.ts +27 -24
  93. package/lib/package.json +1 -1
  94. package/lib/src/auth.d.ts.map +1 -1
  95. package/lib/src/auth.js +5 -4
  96. package/lib/src/auth.js.map +1 -1
  97. package/lib/src/embed/app.d.ts +1 -1
  98. package/lib/src/embed/app.d.ts.map +1 -1
  99. package/lib/src/embed/app.js +3 -2
  100. package/lib/src/embed/app.js.map +1 -1
  101. package/lib/src/embed/app.spec.js +5 -4
  102. package/lib/src/embed/app.spec.js.map +1 -1
  103. package/lib/src/embed/base.d.ts.map +1 -1
  104. package/lib/src/embed/base.js +6 -3
  105. package/lib/src/embed/base.js.map +1 -1
  106. package/lib/src/embed/base.spec.js +3 -2
  107. package/lib/src/embed/base.spec.js.map +1 -1
  108. package/lib/src/embed/embed.spec.js +2 -1
  109. package/lib/src/embed/embed.spec.js.map +1 -1
  110. package/lib/src/embed/embedConfig.d.ts +2 -1
  111. package/lib/src/embed/embedConfig.d.ts.map +1 -1
  112. package/lib/src/embed/embedConfig.js +2 -0
  113. package/lib/src/embed/embedConfig.js.map +1 -1
  114. package/lib/src/embed/events.spec.js +3 -2
  115. package/lib/src/embed/events.spec.js.map +1 -1
  116. package/lib/src/embed/liveboard.d.ts.map +1 -1
  117. package/lib/src/embed/liveboard.js.map +1 -1
  118. package/lib/src/embed/sage.d.ts +1 -1
  119. package/lib/src/embed/sage.d.ts.map +1 -1
  120. package/lib/src/embed/sage.js.map +1 -1
  121. package/lib/src/embed/search.d.ts +1 -1
  122. package/lib/src/embed/search.d.ts.map +1 -1
  123. package/lib/src/embed/search.js +2 -3
  124. package/lib/src/embed/search.js.map +1 -1
  125. package/lib/src/embed/ts-embed.d.ts +0 -1
  126. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  127. package/lib/src/embed/ts-embed.js +13 -13
  128. package/lib/src/embed/ts-embed.js.map +1 -1
  129. package/lib/src/embed/ts-embed.spec.js +27 -26
  130. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  131. package/lib/src/mixpanel-service.d.ts.map +1 -1
  132. package/lib/src/mixpanel-service.js +2 -1
  133. package/lib/src/mixpanel-service.js.map +1 -1
  134. package/lib/src/react/index.spec.js +2 -2
  135. package/lib/src/react/index.spec.js.map +1 -1
  136. package/lib/src/types.d.ts +25 -1
  137. package/lib/src/types.d.ts.map +1 -1
  138. package/lib/src/types.js +11 -0
  139. package/lib/src/types.js.map +1 -1
  140. package/lib/src/utils/authService/authService.d.ts.map +1 -1
  141. package/lib/src/utils/authService/authService.js +3 -2
  142. package/lib/src/utils/authService/authService.js.map +1 -1
  143. package/lib/src/utils/authService/authService.spec.js +3 -2
  144. package/lib/src/utils/authService/authService.spec.js.map +1 -1
  145. package/lib/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  146. package/lib/src/utils/authService/tokenizedAuthService.js +2 -1
  147. package/lib/src/utils/authService/tokenizedAuthService.js.map +1 -1
  148. package/lib/src/utils/logger.d.ts +18 -0
  149. package/lib/src/utils/logger.d.ts.map +1 -0
  150. package/lib/src/utils/logger.js +73 -0
  151. package/lib/src/utils/logger.js.map +1 -0
  152. package/lib/src/utils/logger.spec.d.ts +25 -0
  153. package/lib/src/utils/logger.spec.d.ts.map +1 -0
  154. package/lib/src/utils/logger.spec.js +57 -0
  155. package/lib/src/utils/logger.spec.js.map +1 -0
  156. package/lib/src/visual-embed-sdk.d.ts +27 -24
  157. package/package.json +1 -1
  158. package/src/auth.ts +5 -4
  159. package/src/embed/app.spec.ts +5 -4
  160. package/src/embed/app.ts +4 -3
  161. package/src/embed/base.spec.ts +3 -2
  162. package/src/embed/base.ts +10 -3
  163. package/src/embed/embed.spec.ts +2 -1
  164. package/src/embed/embedConfig.ts +2 -0
  165. package/src/embed/events.spec.ts +3 -2
  166. package/src/embed/liveboard.ts +4 -4
  167. package/src/embed/sage.ts +1 -1
  168. package/src/embed/search.ts +3 -4
  169. package/src/embed/ts-embed.spec.ts +27 -26
  170. package/src/embed/ts-embed.ts +19 -19
  171. package/src/mixpanel-service.ts +2 -1
  172. package/src/react/index.spec.tsx +2 -2
  173. package/src/types.ts +26 -0
  174. package/src/utils/authService/authService.spec.ts +3 -2
  175. package/src/utils/authService/authService.ts +4 -2
  176. package/src/utils/authService/tokenizedAuthService.ts +2 -1
  177. package/src/utils/logger.spec.ts +67 -0
  178. package/src/utils/logger.ts +87 -0
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  import isEqual from 'lodash/isEqual';
11
+ import { logger } from '../utils/logger';
11
12
  import { getAuthenticationToken } from '../authToken';
12
13
  import { AnswerService } from '../utils/graphql/answerService/answerService';
13
14
  import {
@@ -198,7 +199,7 @@ export class TsEmbed {
198
199
  error,
199
200
  });
200
201
  // Log error
201
- console.error(error);
202
+ logger.error(error);
202
203
  }
203
204
 
204
205
  /**
@@ -282,7 +283,7 @@ export class TsEmbed {
282
283
  this.executeCallbacks(EmbedEvent.Error, {
283
284
  offlineWarning,
284
285
  });
285
- console.warn(offlineWarning);
286
+ logger.warn(offlineWarning);
286
287
  };
287
288
  window.addEventListener('offline', offlineEventListener);
288
289
 
@@ -502,6 +503,9 @@ export class TsEmbed {
502
503
  queryParams[Param.ShowInsertToSlide] = insertInToSlide;
503
504
  }
504
505
 
506
+ queryParams[Param.OverrideNativeConsole] = true;
507
+ queryParams[Param.ClientLogLevel] = this.embedConfig.logLevel;
508
+
505
509
  return queryParams;
506
510
  }
507
511
 
@@ -952,10 +956,10 @@ export class TsEmbed {
952
956
  });
953
957
  } catch (e) {
954
958
  eventPort.postMessage({ error: e });
955
- console.log(e);
959
+ logger.log(e);
956
960
  }
957
961
  } else {
958
- console.log('Event Port is not defined');
962
+ logger.log('Event Port is not defined');
959
963
  }
960
964
  }
961
965
 
@@ -983,10 +987,6 @@ export class TsEmbed {
983
987
  return this;
984
988
  }
985
989
 
986
- public getIframeSrc(): string {
987
- return '';
988
- }
989
-
990
990
  protected handleRenderForPrerender() {
991
991
  this.render();
992
992
  }
@@ -998,7 +998,7 @@ export class TsEmbed {
998
998
  */
999
999
  public preRender(showPreRenderByDefault = false): TsEmbed {
1000
1000
  if (!this.viewConfig.preRenderId) {
1001
- console.error('PreRender id is required for preRender');
1001
+ logger.error('PreRender id is required for preRender');
1002
1002
  return this;
1003
1003
  }
1004
1004
  this.isPreRendered = true;
@@ -1047,7 +1047,7 @@ export class TsEmbed {
1047
1047
  this.insertedDomEl?.parentNode.removeChild(this.insertedDomEl);
1048
1048
  this.unsubscribeToEvents();
1049
1049
  } catch (e) {
1050
- console.log('Error destroying TS Embed', e);
1050
+ logger.log('Error destroying TS Embed', e);
1051
1051
  }
1052
1052
  }
1053
1053
 
@@ -1087,13 +1087,13 @@ export class TsEmbed {
1087
1087
  !isUndefined(viewConfig[key])
1088
1088
  && !isEqual(viewConfig[key], preRenderedObject.viewConfig[key])
1089
1089
  ) {
1090
- console.warn(
1090
+ logger.warn(
1091
1091
  `${this.embedComponentType} was pre-rendered with `
1092
- + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1093
- + `but a different value "${JSON.stringify(viewConfig[key])}" `
1094
- + 'was passed to the Embed component. '
1095
- + 'The new value provided is ignored, the value provided during '
1096
- + 'preRender is used.',
1092
+ + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1093
+ + `but a different value "${JSON.stringify(viewConfig[key])}" `
1094
+ + 'was passed to the Embed component. '
1095
+ + 'The new value provided is ignored, the value provided during '
1096
+ + 'preRender is used.',
1097
1097
  );
1098
1098
  }
1099
1099
  });
@@ -1108,7 +1108,7 @@ export class TsEmbed {
1108
1108
  */
1109
1109
  public showPreRender(): void {
1110
1110
  if (!this.viewConfig.preRenderId) {
1111
- console.error('PreRender id is required for preRender');
1111
+ logger.error('PreRender id is required for preRender');
1112
1112
  return;
1113
1113
  }
1114
1114
  if (!this.isPreRenderAvailable()) {
@@ -1157,7 +1157,7 @@ export class TsEmbed {
1157
1157
  */
1158
1158
  public syncPreRenderStyle(): void {
1159
1159
  if (!this.isPreRenderAvailable() || !this.el) {
1160
- console.error('PreRender should be called before using syncPreRenderStyle');
1160
+ logger.error('PreRender should be called before using syncPreRenderStyle');
1161
1161
  return;
1162
1162
  }
1163
1163
  const elBoundingClient = this.el.getBoundingClientRect();
@@ -1177,7 +1177,7 @@ export class TsEmbed {
1177
1177
  public hidePreRender(): void {
1178
1178
  if (!this.isPreRenderAvailable()) {
1179
1179
  // if the embed component is not preRendered , nothing to hide
1180
- console.warn('PreRender should be called before hiding it using hidePreRender.');
1180
+ logger.warn('PreRender should be called before hiding it using hidePreRender.');
1181
1181
  return;
1182
1182
  }
1183
1183
  const preRenderHideStyles = {
@@ -1,4 +1,5 @@
1
1
  import * as mixpanel from 'mixpanel-browser';
2
+ import { logger } from './utils/logger';
2
3
 
3
4
  export const EndPoints = {
4
5
  CONFIG: '/callosum/v1/system/config',
@@ -77,7 +78,7 @@ export function initMixpanel(sessionInfo: any): void {
77
78
  emptyQueue();
78
79
  }
79
80
  } catch (e) {
80
- console.error('Error initializing mixpanel', e);
81
+ logger.error('Error initializing mixpanel', e);
81
82
  }
82
83
  }
83
84
 
@@ -49,7 +49,7 @@ describe('React Components', () => {
49
49
  ),
50
50
  ).toBe(true);
51
51
  expect(getIFrameSrc(container)).toBe(
52
- `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&enableDataPanelV2=false&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true#/embed/answer`,
52
+ `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&overrideConsoleLogs=true&clientLogLevel=ERROR&enableDataPanelV2=false&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true#/embed/answer`,
53
53
  );
54
54
  });
55
55
 
@@ -222,7 +222,7 @@ describe('React Components', () => {
222
222
  ),
223
223
  ).toBe(true);
224
224
  expect(getIFrameSrc(container)).toBe(
225
- `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22]&dataSources=[%22test%22]&searchTokenString=%5Brevenue%5D&executeSearch=true&useLastSelectedSources=false&isSearchEmbed=true#/embed/search-bar-embed`,
225
+ `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22]&overrideConsoleLogs=true&clientLogLevel=ERROR&dataSources=[%22test%22]&searchTokenString=%5Brevenue%5D&executeSearch=true&useLastSelectedSources=false&isSearchEmbed=true#/embed/search-bar-embed`,
226
226
  );
227
227
  });
228
228
  });
package/src/types.ts CHANGED
@@ -546,6 +546,21 @@ export interface EmbedConfig {
546
546
  * @version SDK: 1.26.2 | ThoughtSpot: *
547
547
  */
548
548
  suppressErrorAlerts?: boolean;
549
+
550
+ /**
551
+ * Log level for the SDK.
552
+ * @default LogLevel.ERROR
553
+ *
554
+ * @example
555
+ * ```js
556
+ * init({
557
+ * ...embedConfig,
558
+ * logLevel: LogLevel.SILENT
559
+ * })
560
+ * ```
561
+ * @version SDK: 1.26.3 | ThoughtSpot: 9.10.0.cl
562
+ */
563
+ logLevel?: LogLevel;
549
564
  }
550
565
 
551
566
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
@@ -2817,6 +2832,8 @@ export enum Param {
2817
2832
  HideSearchBarTitle = 'hideSearchBarTitle',
2818
2833
  HideSageAnswerHeader = 'hideSageAnswerHeader',
2819
2834
  HideSearchBar = 'hideSearchBar',
2835
+ ClientLogLevel = 'clientLogLevel',
2836
+ OverrideNativeConsole = 'overrideConsoleLogs',
2820
2837
  }
2821
2838
 
2822
2839
  /**
@@ -3745,3 +3762,12 @@ export interface CustomActionPayload {
3745
3762
  session: SessionInterface;
3746
3763
  vizId?: string;
3747
3764
  }
3765
+
3766
+ export enum LogLevel {
3767
+ SILENT = 'SILENT',
3768
+ ERROR = 'ERROR',
3769
+ WARN = 'WARN',
3770
+ INFO = 'INFO',
3771
+ DEBUG = 'DEBUG',
3772
+ TRACE = 'TRACE',
3773
+ }
@@ -7,6 +7,7 @@ import {
7
7
  verifyTokenService,
8
8
  EndPoints,
9
9
  } from '.';
10
+ import { logger } from '../logger';
10
11
 
11
12
  const thoughtSpotHost = 'http://10.79.135.124:3000';
12
13
 
@@ -74,14 +75,14 @@ describe('Unit test for authService', () => {
74
75
  });
75
76
 
76
77
  test('log error on API failures', async () => {
77
- jest.spyOn(global.console, 'error').mockImplementation(() => undefined);
78
+ jest.spyOn(logger, 'error').mockImplementation(() => undefined);
78
79
  global.fetch = jest.fn(() => Promise.resolve({
79
80
  text: () => Promise.resolve('error'),
80
81
  status: 500,
81
82
  ok: false,
82
83
  }));
83
84
  await fetchSessionInfoService(authVerificationUrl);
84
- expect(global.console.error).toHaveBeenCalledWith('Failure', 'error');
85
+ expect(logger.error).toHaveBeenCalledWith('Failure', 'error');
85
86
  });
86
87
 
87
88
  test('verifyTokenService', async () => {
@@ -1,3 +1,5 @@
1
+ import { logger } from '../logger';
2
+
1
3
  export const EndPoints = {
2
4
  AUTH_VERIFICATION: '/callosum/v1/session/info',
3
5
  SAML_LOGIN_TEMPLATE: (targetUrl: string) => `/callosum/v1/saml/login?targetURLPath=${targetUrl}`,
@@ -18,7 +20,7 @@ export const EndPoints = {
18
20
  function failureLoggedFetch(url: string, options: RequestInit = {}): Promise<Response> {
19
21
  return fetch(url, options).then(async (r) => {
20
22
  if (!r.ok && r.type !== 'opaqueredirect' && r.type !== 'opaque') {
21
- console.error('Failure', await r.text?.());
23
+ logger.error('Failure', await r.text?.());
22
24
  }
23
25
  return r;
24
26
  });
@@ -45,7 +47,7 @@ export async function verifyTokenService(
45
47
  });
46
48
  return res.ok;
47
49
  } catch (e) {
48
- console.error(`Token Verification Service failed : ${e.message}`);
50
+ logger.error(`Token Verification Service failed : ${e.message}`);
49
51
  }
50
52
 
51
53
  return false;
@@ -1,4 +1,5 @@
1
1
  import { tokenizedFetch } from '../../tokenizedFetch';
2
+ import { logger } from '../logger';
2
3
  import { EndPoints } from './authService';
3
4
 
4
5
  /**
@@ -9,7 +10,7 @@ import { EndPoints } from './authService';
9
10
  function tokenisedFailureLoggedFetch(url: string, options: RequestInit = {}): Promise<Response> {
10
11
  return tokenizedFetch(url, options).then(async (r) => {
11
12
  if (!r.ok && r.type !== 'opaqueredirect' && r.type !== 'opaque') {
12
- console.error('Failure', await r.text?.());
13
+ logger.error('Failure', await r.text?.());
13
14
  }
14
15
  return r;
15
16
  });
@@ -0,0 +1,67 @@
1
+ let logger: any;
2
+ let LogLevel: any;
3
+ let setGlobalLogLevelOverride: any;
4
+
5
+ const consoleErrorSpy = jest.spyOn(console, 'error');
6
+ const consoleWarnSpy = jest.spyOn(console, 'warn');
7
+ const consoleInfoSpy = jest.spyOn(console, 'info');
8
+ const consoleDebugSpy = jest.spyOn(console, 'debug');
9
+ const consoleTraceSpy = jest.spyOn(console, 'trace');
10
+
11
+ describe('Logger', () => {
12
+ beforeAll(async () => {
13
+ const a = await import('./logger');
14
+ logger = a.logger;
15
+ LogLevel = a.LogLevel;
16
+ setGlobalLogLevelOverride = a.setGlobalLogLevelOverride;
17
+ });
18
+
19
+ beforeEach(() => {
20
+ // Reset the logger's log level before each test
21
+ setGlobalLogLevelOverride(LogLevel.TRACE);
22
+ logger.setLogLevel(LogLevel.ERROR);
23
+
24
+ consoleErrorSpy.mockRestore();
25
+ consoleWarnSpy.mockRestore();
26
+ consoleInfoSpy.mockRestore();
27
+ consoleDebugSpy.mockRestore();
28
+ consoleTraceSpy.mockRestore();
29
+ });
30
+
31
+ it('should set the log level correctly', () => {
32
+ logger.setLogLevel(LogLevel.INFO);
33
+ expect(logger.getLogLevel()).toBe(LogLevel.INFO);
34
+
35
+ logger.setLogLevel(LogLevel.DEBUG);
36
+ expect(logger.getLogLevel()).toBe(LogLevel.DEBUG);
37
+ });
38
+
39
+ it('should log messages based on the log level', () => {
40
+ logger.setLogLevel(LogLevel.ERROR);
41
+ logger.error('Error message');
42
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
43
+
44
+ logger.warn('Warning message');
45
+ expect(consoleTraceSpy).not.toHaveBeenCalled();
46
+
47
+ logger.setLogLevel(LogLevel.WARN);
48
+ logger.error('Warning message');
49
+ logger.warn('Warning message');
50
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Warning message');
51
+ expect(consoleWarnSpy).toHaveBeenCalledWith('Warning message');
52
+ });
53
+
54
+ it('should log messages with the global log level override', () => {
55
+ setGlobalLogLevelOverride(LogLevel.WARN);
56
+
57
+ logger.error('Error message');
58
+ logger.warn('Warn message');
59
+ logger.info('Info message');
60
+ logger.trace('Trace message');
61
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
62
+ expect(consoleWarnSpy).toHaveBeenCalledWith('Warn message');
63
+ expect(consoleInfoSpy).not.toHaveBeenCalled();
64
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
65
+ expect(consoleTraceSpy).not.toHaveBeenCalled();
66
+ });
67
+ });
@@ -0,0 +1,87 @@
1
+ import { isUndefined, noop } from 'lodash';
2
+ import { LogLevel } from '../types';
3
+
4
+ const logFunctions: {
5
+ [key: string]: (...args: any[]) => void;
6
+ } = {
7
+ [LogLevel.SILENT]: noop,
8
+ [LogLevel.ERROR]: console.error,
9
+ [LogLevel.WARN]: console.warn,
10
+ [LogLevel.INFO]: console.info,
11
+ [LogLevel.DEBUG]: console.debug,
12
+ [LogLevel.TRACE]: console.trace,
13
+ };
14
+
15
+ let globalLogLevelOverride: LogLevel = LogLevel.TRACE;
16
+ const setGlobalLogLevelOverride = (logLevel: LogLevel): void => {
17
+ globalLogLevelOverride = logLevel;
18
+ };
19
+
20
+ const logLevelToNumber: { [key: string]: number } = {
21
+ [LogLevel.SILENT]: 0,
22
+ [LogLevel.ERROR]: 1,
23
+ [LogLevel.WARN]: 2,
24
+ [LogLevel.INFO]: 3,
25
+ [LogLevel.DEBUG]: 4,
26
+ [LogLevel.TRACE]: 5,
27
+ };
28
+ const compareLogLevels = (logLevel1: LogLevel, logLevel2: LogLevel): number => {
29
+ const logLevel1Index = logLevelToNumber[logLevel1];
30
+ const logLevel2Index = logLevelToNumber[logLevel2];
31
+ return logLevel1Index - logLevel2Index;
32
+ };
33
+
34
+ class Logger {
35
+ private logLevel: LogLevel = LogLevel.ERROR;
36
+
37
+ public setLogLevel = (newLogLevel: LogLevel): void => {
38
+ this.logLevel = newLogLevel;
39
+ };
40
+
41
+ public getLogLevel = (): LogLevel => this.logLevel;
42
+
43
+ public canLog(logLevel: LogLevel): boolean {
44
+ if (logLevel === LogLevel.SILENT) return false;
45
+ if (!isUndefined(globalLogLevelOverride)) {
46
+ return compareLogLevels(globalLogLevelOverride, logLevel) >= 0;
47
+ }
48
+ return compareLogLevels(this.logLevel, logLevel) >= 0;
49
+ }
50
+
51
+ public logMessages(args: any[], logLevel: LogLevel): void {
52
+ if (this.canLog(logLevel)) {
53
+ const logFn = logFunctions[logLevel];
54
+ if (logFn) {
55
+ logFn(...args);
56
+ }
57
+ }
58
+ }
59
+
60
+ public log(...args: any[]): void {
61
+ this.info(args);
62
+ }
63
+
64
+ public info(...args: any[]): void {
65
+ this.logMessages(args, LogLevel.INFO);
66
+ }
67
+
68
+ public debug(...args: any[]): void {
69
+ this.logMessages(args, LogLevel.DEBUG);
70
+ }
71
+
72
+ public trace(...args: any[]): void {
73
+ this.logMessages(args, LogLevel.TRACE);
74
+ }
75
+
76
+ public error(...args: any[]): void {
77
+ this.logMessages(args, LogLevel.ERROR);
78
+ }
79
+
80
+ public warn(...args: any[]): void {
81
+ this.logMessages(args, LogLevel.WARN);
82
+ }
83
+ }
84
+
85
+ const logger = new Logger();
86
+
87
+ export { LogLevel, logger, setGlobalLogLevelOverride };