From 0b5898859411d4e32d6eb7be3f6a5c9209fb62d5 Mon Sep 17 00:00:00 2001 From: yinstardev Date: Fri, 2 May 2025 16:20:48 +0530 Subject: [PATCH 1/8] Do not merge --- src/embed/base.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/embed/base.ts b/src/embed/base.ts index be19d011..98b58bd5 100644 --- a/src/embed/base.ts +++ b/src/embed/base.ts @@ -197,7 +197,9 @@ export const createAndSetInitPromise = (): void => { }); }; -createAndSetInitPromise(); +if (typeof window !== 'undefined') { + createAndSetInitPromise(); +} export const getInitPromise = (): Promise< From 46b659faede1dd36a8c6a80aac7788875e0b3c08 Mon Sep 17 00:00:00 2001 From: yinstardev Date: Fri, 2 May 2025 16:30:59 +0530 Subject: [PATCH 2/8] storvaluein window --- src/utils.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 974d7eb7..a772a607 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -354,6 +354,10 @@ export function storeValueInWindow( value: T, options: { ignoreIfAlreadyExists?: boolean } = {}, ): T { + if (typeof window === 'undefined') { + return value; + } + if (!window[sdkWindowKey]) { (window as any)[sdkWindowKey] = {}; } @@ -371,8 +375,12 @@ export function storeValueInWindow( * @param key - The key whose value needs to be retrieved. * @returns The stored value or `undefined` if the key is not found. */ -export const getValueFromWindow = - (key: string): T => (window as any)?.[sdkWindowKey]?.[key]; +export const getValueFromWindow = (key: string): T | undefined => { + if (typeof window === 'undefined') { + return undefined; + } + return (window as any)?.[sdkWindowKey]?.[key]; +}; /** * Resets the key if it exists in the `window` object under the `_tsEmbedSDK` key. @@ -380,7 +388,10 @@ export const getValueFromWindow = * @param key - Key to reset * @returns - boolean indicating if the key was reset */ -export function resetValueFromWindow(key: string): boolean { +export function resetValueFromWindow(key: string): boolean { + if (typeof window === 'undefined') { + return false; + } if (key in window[sdkWindowKey]) { delete (window as any)[sdkWindowKey][key]; return true; From 2ca548d29066074bf546acd9fc4c6a1f1d579447 Mon Sep 17 00:00:00 2001 From: yinstardev Date: Fri, 2 May 2025 16:36:22 +0530 Subject: [PATCH 3/8] loglevel undefined --- src/embed/base.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/embed/base.ts b/src/embed/base.ts index 98b58bd5..6ac80845 100644 --- a/src/embed/base.ts +++ b/src/embed/base.ts @@ -229,6 +229,10 @@ export const getIsInitCalled = (): boolean => !!getValueFromWindow(initFlagKey)? * @group Authentication / Init */ export const init = (embedConfig: EmbedConfig): AuthEventEmitter => { + if (typeof window === 'undefined') { + return; + } + sanity(embedConfig); resetAllCachedServices(); embedConfig = setEmbedConfig( From d2519d6f2efc19cba508ad55a72db9881f1cdd49 Mon Sep 17 00:00:00 2001 From: yinstardev Date: Fri, 2 May 2025 16:38:46 +0530 Subject: [PATCH 4/8] loglevel undefined --- src/embed/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/embed/base.ts b/src/embed/base.ts index 6ac80845..a93ab24a 100644 --- a/src/embed/base.ts +++ b/src/embed/base.ts @@ -230,7 +230,7 @@ export const getIsInitCalled = (): boolean => !!getValueFromWindow(initFlagKey)? */ export const init = (embedConfig: EmbedConfig): AuthEventEmitter => { if (typeof window === 'undefined') { - return; + return {} as AuthEventEmitter; } sanity(embedConfig); From dac2cc52d4939a8cdb0ddb7e5064fe89462bc859 Mon Sep 17 00:00:00 2001 From: yinstardev Date: Fri, 2 May 2025 16:46:21 +0530 Subject: [PATCH 5/8] util fn --- src/embed/base.ts | 6 +++--- src/utils.ts | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/embed/base.ts b/src/embed/base.ts index a93ab24a..4a12eb54 100644 --- a/src/embed/base.ts +++ b/src/embed/base.ts @@ -33,7 +33,7 @@ import { import '../utils/with-resolvers-polyfill'; import { uploadMixpanelEvent, MIXPANEL_EVENT } from '../mixpanel-service'; import { getEmbedConfig, setEmbedConfig } from './embedConfig'; -import { getQueryParamString, getValueFromWindow, storeValueInWindow } from '../utils'; +import { getQueryParamString, getValueFromWindow, isBrowser, storeValueInWindow } from '../utils'; import { resetAllCachedServices } from '../utils/resetServices'; const CONFIG_DEFAULTS: Partial = { @@ -197,7 +197,7 @@ export const createAndSetInitPromise = (): void => { }); }; -if (typeof window !== 'undefined') { +if (isBrowser()) { createAndSetInitPromise(); } @@ -229,7 +229,7 @@ export const getIsInitCalled = (): boolean => !!getValueFromWindow(initFlagKey)? * @group Authentication / Init */ export const init = (embedConfig: EmbedConfig): AuthEventEmitter => { - if (typeof window === 'undefined') { + if (!isBrowser()) { return {} as AuthEventEmitter; } diff --git a/src/utils.ts b/src/utils.ts index a772a607..578e45a2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -354,7 +354,7 @@ export function storeValueInWindow( value: T, options: { ignoreIfAlreadyExists?: boolean } = {}, ): T { - if (typeof window === 'undefined') { + if (!isBrowser()) { return value; } @@ -376,7 +376,7 @@ export function storeValueInWindow( * @returns The stored value or `undefined` if the key is not found. */ export const getValueFromWindow = (key: string): T | undefined => { - if (typeof window === 'undefined') { + if (!isBrowser()) { return undefined; } return (window as any)?.[sdkWindowKey]?.[key]; @@ -388,8 +388,8 @@ export const getValueFromWindow = (key: string): T | undefined => { * @param key - Key to reset * @returns - boolean indicating if the key was reset */ -export function resetValueFromWindow(key: string): boolean { - if (typeof window === 'undefined') { +export function resetValueFromWindow(key: string): boolean { + if (!isBrowser()) { return false; } if (key in window[sdkWindowKey]) { @@ -398,3 +398,5 @@ export function resetValueFromWindow(key: string): boolean { } return false; } + +export const isBrowser = () => typeof window !== 'undefined'; \ No newline at end of file From e3806b555c960d7a622a98322a4edaee8f841698 Mon Sep 17 00:00:00 2001 From: yinstardev Date: Fri, 2 May 2025 17:02:24 +0530 Subject: [PATCH 6/8] ut cov --- src/embed/base.spec.ts | 17 +++++++++++++++++ src/utils.spec.ts | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/embed/base.spec.ts b/src/embed/base.spec.ts index eb431cf5..43739d14 100644 --- a/src/embed/base.spec.ts +++ b/src/embed/base.spec.ts @@ -506,4 +506,21 @@ describe('Init tests', () => { }); expect(resetService.resetAllCachedServices).toBeCalled(); }); + + test('returns empty object when not in browser environment', () => { + const originalWindow = global.window; + + // Delete window to simulate non-browser environment + // @ts-ignore + delete global.window; + + const result = base.init({ + thoughtSpotHost, + authType: index.AuthType.None, + }); + + expect(result).toEqual({}); + + global.window = originalWindow; + }); }); diff --git a/src/utils.spec.ts b/src/utils.spec.ts index 0d9a0c6e..bf3c3975 100644 --- a/src/utils.spec.ts +++ b/src/utils.spec.ts @@ -13,6 +13,7 @@ import { isUndefined, storeValueInWindow, getValueFromWindow, + isBrowser, } from './utils'; import { RuntimeFilterOp } from './types'; @@ -294,3 +295,22 @@ describe('unit test for utils', () => { }); }); }); + +describe('isBrowser', () => { + test('returns true when window is defined', () => { + // In Jest's JSDOM environment, window is defined + expect(isBrowser()).toBe(true); + }); + + test('returns false when window is undefined', () => { + const originalWindow = global.window; + + // Simulate non-browser environment by setting window to undefined + // @ts-ignore + delete global.window; + + expect(isBrowser()).toBe(false); + + global.window = originalWindow; + }); +}); From 79ffe841d00f7da05cd73504f6bbfabe2f718709 Mon Sep 17 00:00:00 2001 From: yinstardev Date: Fri, 2 May 2025 17:04:46 +0530 Subject: [PATCH 7/8] ut cov --- src/embed/base.spec.ts | 1 - src/utils.spec.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/embed/base.spec.ts b/src/embed/base.spec.ts index 43739d14..da2b3508 100644 --- a/src/embed/base.spec.ts +++ b/src/embed/base.spec.ts @@ -511,7 +511,6 @@ describe('Init tests', () => { const originalWindow = global.window; // Delete window to simulate non-browser environment - // @ts-ignore delete global.window; const result = base.init({ diff --git a/src/utils.spec.ts b/src/utils.spec.ts index bf3c3975..8b977631 100644 --- a/src/utils.spec.ts +++ b/src/utils.spec.ts @@ -306,7 +306,6 @@ describe('isBrowser', () => { const originalWindow = global.window; // Simulate non-browser environment by setting window to undefined - // @ts-ignore delete global.window; expect(isBrowser()).toBe(false); From 1dbfaab8ac8e5b52d3bb2b3905a4a18083f31d2e Mon Sep 17 00:00:00 2001 From: yinstardev Date: Fri, 2 May 2025 17:17:14 +0530 Subject: [PATCH 8/8] ut-coverage increase --- src/utils.spec.ts | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/utils.spec.ts b/src/utils.spec.ts index 8b977631..8223c824 100644 --- a/src/utils.spec.ts +++ b/src/utils.spec.ts @@ -14,6 +14,7 @@ import { storeValueInWindow, getValueFromWindow, isBrowser, + resetValueFromWindow, } from './utils'; import { RuntimeFilterOp } from './types'; @@ -293,6 +294,57 @@ describe('unit test for utils', () => { test('Return undefined if key is not found', () => { expect(getValueFromWindow('notFound')).toBe(undefined); }); + + test('storeValueInWindow returns value when not in browser environment', () => { + const originalWindow = global.window; + delete global.window; + + const testValue = 'test-non-browser'; + const result = storeValueInWindow('testKey', testValue); + + expect(result).toBe(testValue); + + global.window = originalWindow; + }); + + test('getValueFromWindow returns undefined when not in browser environment', () => { + const originalWindow = global.window; + delete global.window; + + const result = getValueFromWindow('anyKey'); + + expect(result).toBeUndefined(); + + global.window = originalWindow; + }); + }); + + describe('resetValueFromWindow', () => { + test('returns true when key exists and is reset', () => { + storeValueInWindow('testResetKey', 'value-to-reset'); + + const result = resetValueFromWindow('testResetKey'); + + expect(result).toBe(true); + expect(getValueFromWindow('testResetKey')).toBeUndefined(); + }); + + test('returns false when key does not exist', () => { + const result = resetValueFromWindow('nonExistentKey'); + + expect(result).toBe(false); + }); + + test('returns false when not in browser environment', () => { + const originalWindow = global.window; + delete global.window; + + const result = resetValueFromWindow('anyKey'); + + expect(result).toBe(false); + + global.window = originalWindow; + }); }); });