@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.
- package/cjs/package.json +1 -1
- package/cjs/src/auth.d.ts.map +1 -1
- package/cjs/src/auth.js +5 -4
- package/cjs/src/auth.js.map +1 -1
- package/cjs/src/embed/app.d.ts +1 -1
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +3 -2
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +5 -4
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts.map +1 -1
- package/cjs/src/embed/base.js +5 -2
- package/cjs/src/embed/base.js.map +1 -1
- package/cjs/src/embed/base.spec.js +3 -2
- package/cjs/src/embed/base.spec.js.map +1 -1
- package/cjs/src/embed/embed.spec.js +2 -1
- package/cjs/src/embed/embed.spec.js.map +1 -1
- package/cjs/src/embed/embedConfig.d.ts +2 -1
- package/cjs/src/embed/embedConfig.d.ts.map +1 -1
- package/cjs/src/embed/embedConfig.js +2 -0
- package/cjs/src/embed/embedConfig.js.map +1 -1
- package/cjs/src/embed/events.spec.js +3 -2
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/sage.d.ts +1 -1
- package/cjs/src/embed/sage.d.ts.map +1 -1
- package/cjs/src/embed/sage.js.map +1 -1
- package/cjs/src/embed/search.d.ts +1 -1
- package/cjs/src/embed/search.d.ts.map +1 -1
- package/cjs/src/embed/search.js +2 -3
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +0 -1
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +13 -13
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +27 -26
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/mixpanel-service.d.ts.map +1 -1
- package/cjs/src/mixpanel-service.js +2 -1
- package/cjs/src/mixpanel-service.js.map +1 -1
- package/cjs/src/react/index.spec.js +2 -2
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/types.d.ts +25 -1
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +12 -1
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/authService/authService.d.ts.map +1 -1
- package/cjs/src/utils/authService/authService.js +3 -2
- package/cjs/src/utils/authService/authService.js.map +1 -1
- package/cjs/src/utils/authService/authService.spec.js +3 -2
- package/cjs/src/utils/authService/authService.spec.js.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.js +2 -1
- package/cjs/src/utils/authService/tokenizedAuthService.js.map +1 -1
- package/cjs/src/utils/logger.d.ts +18 -0
- package/cjs/src/utils/logger.d.ts.map +1 -0
- package/cjs/src/utils/logger.js +78 -0
- package/cjs/src/utils/logger.js.map +1 -0
- package/cjs/src/utils/logger.spec.d.ts +25 -0
- package/cjs/src/utils/logger.spec.d.ts.map +1 -0
- package/cjs/src/utils/logger.spec.js +80 -0
- package/cjs/src/utils/logger.spec.js.map +1 -0
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +1 -1
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/embedConfig.d.ts +2 -1
- package/dist/src/embed/embedConfig.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/sage.d.ts +1 -1
- package/dist/src/embed/sage.d.ts.map +1 -1
- package/dist/src/embed/search.d.ts +1 -1
- package/dist/src/embed/search.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +0 -1
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/mixpanel-service.d.ts.map +1 -1
- package/dist/src/types.d.ts +25 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/authService/authService.d.ts.map +1 -1
- package/dist/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
- package/dist/src/utils/logger.d.ts +18 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.spec.d.ts +25 -0
- package/dist/src/utils/logger.spec.d.ts.map +1 -0
- package/dist/tsembed-react.es.js +17309 -33
- package/dist/tsembed-react.js +17309 -33
- package/dist/tsembed.es.js +17635 -353
- package/dist/tsembed.js +32458 -15176
- package/dist/visual-embed-sdk-react-full.d.ts +27 -24
- package/dist/visual-embed-sdk-react.d.ts +27 -24
- package/dist/visual-embed-sdk.d.ts +27 -24
- package/lib/package.json +1 -1
- package/lib/src/auth.d.ts.map +1 -1
- package/lib/src/auth.js +5 -4
- package/lib/src/auth.js.map +1 -1
- package/lib/src/embed/app.d.ts +1 -1
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +3 -2
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +5 -4
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +6 -3
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/base.spec.js +3 -2
- package/lib/src/embed/base.spec.js.map +1 -1
- package/lib/src/embed/embed.spec.js +2 -1
- package/lib/src/embed/embed.spec.js.map +1 -1
- package/lib/src/embed/embedConfig.d.ts +2 -1
- package/lib/src/embed/embedConfig.d.ts.map +1 -1
- package/lib/src/embed/embedConfig.js +2 -0
- package/lib/src/embed/embedConfig.js.map +1 -1
- package/lib/src/embed/events.spec.js +3 -2
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/sage.d.ts +1 -1
- package/lib/src/embed/sage.d.ts.map +1 -1
- package/lib/src/embed/sage.js.map +1 -1
- package/lib/src/embed/search.d.ts +1 -1
- package/lib/src/embed/search.d.ts.map +1 -1
- package/lib/src/embed/search.js +2 -3
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +0 -1
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +13 -13
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +27 -26
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/mixpanel-service.d.ts.map +1 -1
- package/lib/src/mixpanel-service.js +2 -1
- package/lib/src/mixpanel-service.js.map +1 -1
- package/lib/src/react/index.spec.js +2 -2
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/types.d.ts +25 -1
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +11 -0
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/authService/authService.d.ts.map +1 -1
- package/lib/src/utils/authService/authService.js +3 -2
- package/lib/src/utils/authService/authService.js.map +1 -1
- package/lib/src/utils/authService/authService.spec.js +3 -2
- package/lib/src/utils/authService/authService.spec.js.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.js +2 -1
- package/lib/src/utils/authService/tokenizedAuthService.js.map +1 -1
- package/lib/src/utils/logger.d.ts +18 -0
- package/lib/src/utils/logger.d.ts.map +1 -0
- package/lib/src/utils/logger.js +73 -0
- package/lib/src/utils/logger.js.map +1 -0
- package/lib/src/utils/logger.spec.d.ts +25 -0
- package/lib/src/utils/logger.spec.d.ts.map +1 -0
- package/lib/src/utils/logger.spec.js +57 -0
- package/lib/src/utils/logger.spec.js.map +1 -0
- package/lib/src/visual-embed-sdk.d.ts +27 -24
- package/package.json +1 -1
- package/src/auth.ts +5 -4
- package/src/embed/app.spec.ts +5 -4
- package/src/embed/app.ts +4 -3
- package/src/embed/base.spec.ts +3 -2
- package/src/embed/base.ts +10 -3
- package/src/embed/embed.spec.ts +2 -1
- package/src/embed/embedConfig.ts +2 -0
- package/src/embed/events.spec.ts +3 -2
- package/src/embed/liveboard.ts +4 -4
- package/src/embed/sage.ts +1 -1
- package/src/embed/search.ts +3 -4
- package/src/embed/ts-embed.spec.ts +27 -26
- package/src/embed/ts-embed.ts +19 -19
- package/src/mixpanel-service.ts +2 -1
- package/src/react/index.spec.tsx +2 -2
- package/src/types.ts +26 -0
- package/src/utils/authService/authService.spec.ts +3 -2
- package/src/utils/authService/authService.ts +4 -2
- package/src/utils/authService/tokenizedAuthService.ts +2 -1
- package/src/utils/logger.spec.ts +67 -0
- package/src/utils/logger.ts +87 -0
package/src/embed/ts-embed.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
959
|
+
logger.log(e);
|
|
956
960
|
}
|
|
957
961
|
} else {
|
|
958
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1090
|
+
logger.warn(
|
|
1091
1091
|
`${this.embedComponentType} was pre-rendered with `
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1180
|
+
logger.warn('PreRender should be called before hiding it using hidePreRender.');
|
|
1181
1181
|
return;
|
|
1182
1182
|
}
|
|
1183
1183
|
const preRenderHideStyles = {
|
package/src/mixpanel-service.ts
CHANGED
|
@@ -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
|
-
|
|
81
|
+
logger.error('Error initializing mixpanel', e);
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
84
|
|
package/src/react/index.spec.tsx
CHANGED
|
@@ -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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|