diff --git a/package-lock.json b/package-lock.json index 063dd91..ff3f768 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@splitsoftware/splitio-react", - "version": "1.13.1-rc.0", + "version": "1.13.1-rc.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@splitsoftware/splitio-react", - "version": "1.13.1-rc.0", + "version": "1.13.1-rc.1", "license": "Apache-2.0", "dependencies": { - "@splitsoftware/splitio": "10.28.1-rc.2", + "@splitsoftware/splitio": "10.28.1-rc.4", "memoize-one": "^5.1.1", "shallowequal": "^1.1.0", "tslib": "^2.3.1" @@ -1548,11 +1548,11 @@ } }, "node_modules/@splitsoftware/splitio": { - "version": "10.28.1-rc.2", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-10.28.1-rc.2.tgz", - "integrity": "sha512-UwRlu3aBY/e2cDQUxDXZCnLisleOCSUgCQSIN8gGdAKO9QQHG1Vt2cxsxMIGRIIBWUIuuUJ2phVKHM/0M2ZPhw==", + "version": "10.28.1-rc.4", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-10.28.1-rc.4.tgz", + "integrity": "sha512-H8uKor+tv7u8VyKoRUIGggrRcSCjocydRU8b091U/+U2kwd5FOf5rLpyBbc0Pp+JJIaqXIIi49PV+r8RFkc9SQ==", "dependencies": { - "@splitsoftware/splitio-commons": "1.17.1-rc.1", + "@splitsoftware/splitio-commons": "1.17.1-rc.3", "@types/google.analytics": "0.0.40", "@types/ioredis": "^4.28.0", "bloom-filters": "^3.0.0", @@ -1568,9 +1568,9 @@ } }, "node_modules/@splitsoftware/splitio-commons": { - "version": "1.17.1-rc.1", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-1.17.1-rc.1.tgz", - "integrity": "sha512-mmDcWW2iyqQF/FzLgPoRA3KXpvswk/sDIhQGWTg3WPkapnA+e4WXb+U/TSGGB/Ig88NlM76FlxMDkrHnBayDXg==", + "version": "1.17.1-rc.3", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-1.17.1-rc.3.tgz", + "integrity": "sha512-cPjTdDtYHejjefNvyNUZrvhYSwe6ElWoCdU5l05XmMMHv4TJiDVWMP3opes6FulI0hYKjC6za0gqlR3H+kXEUg==", "dependencies": { "tslib": "^2.3.1" }, @@ -12035,11 +12035,11 @@ } }, "@splitsoftware/splitio": { - "version": "10.28.1-rc.2", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-10.28.1-rc.2.tgz", - "integrity": "sha512-UwRlu3aBY/e2cDQUxDXZCnLisleOCSUgCQSIN8gGdAKO9QQHG1Vt2cxsxMIGRIIBWUIuuUJ2phVKHM/0M2ZPhw==", + "version": "10.28.1-rc.4", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-10.28.1-rc.4.tgz", + "integrity": "sha512-H8uKor+tv7u8VyKoRUIGggrRcSCjocydRU8b091U/+U2kwd5FOf5rLpyBbc0Pp+JJIaqXIIi49PV+r8RFkc9SQ==", "requires": { - "@splitsoftware/splitio-commons": "1.17.1-rc.1", + "@splitsoftware/splitio-commons": "1.17.1-rc.3", "@types/google.analytics": "0.0.40", "@types/ioredis": "^4.28.0", "bloom-filters": "^3.0.0", @@ -12051,9 +12051,9 @@ } }, "@splitsoftware/splitio-commons": { - "version": "1.17.1-rc.1", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-1.17.1-rc.1.tgz", - "integrity": "sha512-mmDcWW2iyqQF/FzLgPoRA3KXpvswk/sDIhQGWTg3WPkapnA+e4WXb+U/TSGGB/Ig88NlM76FlxMDkrHnBayDXg==", + "version": "1.17.1-rc.3", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-1.17.1-rc.3.tgz", + "integrity": "sha512-cPjTdDtYHejjefNvyNUZrvhYSwe6ElWoCdU5l05XmMMHv4TJiDVWMP3opes6FulI0hYKjC6za0gqlR3H+kXEUg==", "requires": { "tslib": "^2.3.1" } diff --git a/package.json b/package.json index 2b8fc3f..504c27c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@splitsoftware/splitio-react", - "version": "1.13.1-rc.0", + "version": "1.13.1-rc.1", "description": "A React library to easily integrate and use Split JS SDK", "main": "lib/index.js", "module": "es/index.js", @@ -63,7 +63,7 @@ }, "homepage": "https://github.com/splitio/react-client#readme", "dependencies": { - "@splitsoftware/splitio": "10.28.1-rc.2", + "@splitsoftware/splitio": "10.28.1-rc.4", "memoize-one": "^5.1.1", "shallowequal": "^1.1.0", "tslib": "^2.3.1" diff --git a/src/SplitFactory.tsx b/src/SplitFactory.tsx index 1636100..82e9f6e 100644 --- a/src/SplitFactory.tsx +++ b/src/SplitFactory.tsx @@ -61,6 +61,7 @@ export class SplitFactory extends React.Component(null); const factory = React.useMemo(() => { - return propFactory || (configFactory && config === configFactory.config ? configFactory : null); + return propFactory ? + propFactory : + configFactory && config === configFactory.config ? + configFactory : + config && config.preloadedData ? + getSplitFactory(config) : + null; }, [config, propFactory, configFactory]); const client = factory ? getSplitClient(factory) : null; @@ -37,6 +43,7 @@ export function SplitFactoryProvider(props: ISplitFactoryProps) { React.useEffect(() => { if (config) { const factory = getSplitFactory(config); + factory.init(); return () => { destroySplitFactory(factory); diff --git a/src/__tests__/SplitFactoryProvider.test.tsx b/src/__tests__/SplitFactoryProvider.test.tsx index 61cd932..21a9c41 100644 --- a/src/__tests__/SplitFactoryProvider.test.tsx +++ b/src/__tests__/SplitFactoryProvider.test.tsx @@ -38,6 +38,30 @@ describe('SplitFactoryProvider', () => { ); }); + test('passes ready from cache props to the child if initialized with a config with preloaded data.', () => { + const configWithPreloadedData = { ...sdkBrowser, preloadedData: {} }; + let internalFactory; + + render( + + {({ factory, client, isReady, isReadyFromCache, hasTimedout, isTimedout, isDestroyed, lastUpdate }: ISplitFactoryChildProps) => { + internalFactory = factory; + expect(factory).toBeDefined(); + expect(client).toBeDefined(); + expect(isReady).toBe(false); + expect(isReadyFromCache).toBe(true); + expect(hasTimedout).toBe(false); + expect(isTimedout).toBe(false); + expect(isDestroyed).toBe(false); + expect(lastUpdate).toBe(0); + return null; + }} + + ); + + expect(internalFactory.init).toBeCalledTimes(1); + }); + test('passes ready props to the child if initialized with a ready factory.', async () => { const outerFactory = SplitSdk(sdkBrowser); (outerFactory as any).client().__emitter__.emit(Event.SDK_READY_FROM_CACHE); @@ -99,6 +123,7 @@ describe('SplitFactoryProvider', () => { ); const innerFactory = (SplitSdk as jest.Mock).mock.results.slice(-1)[0].value; + expect(innerFactory.init).toBeCalledTimes(1); act(() => (innerFactory as any).client().__emitter__.emit(Event.SDK_READY_TIMED_OUT)); act(() => (innerFactory as any).client().__emitter__.emit(Event.SDK_READY_FROM_CACHE)); act(() => (innerFactory as any).client().__emitter__.emit(Event.SDK_READY)); diff --git a/src/__tests__/testUtils/mockSplitSdk.ts b/src/__tests__/testUtils/mockSplitSdk.ts index db5fffe..fc9c0fd 100644 --- a/src/__tests__/testUtils/mockSplitSdk.ts +++ b/src/__tests__/testUtils/mockSplitSdk.ts @@ -37,7 +37,7 @@ export function mockSdk() { function mockClient(_key: SplitIO.SplitKey, _trafficType?: string) { // Readiness let isReady = false; - let isReadyFromCache = false; + let isReadyFromCache = config.preloadedData ? true : false; let hasTimedout = false; let isDestroyed = false; let lastUpdate = 0; @@ -147,6 +147,15 @@ export function mockSdk() { return Promise.all(Object.keys(__clients__).map(instanceId => __clients__[instanceId].destroy())); }); + // SDK internal modules + const modules = { + settings: Object.assign({ + version: jsSdkVersion, + }, config), + isPure: undefined, + } + if (__updateModules) __updateModules(modules); + // SDK factory const factory = { client, @@ -154,13 +163,10 @@ export function mockSdk() { destroy, __names__: names, __clients__, - settings: Object.assign({ - version: jsSdkVersion, - }, config), + settings: modules.settings, + init: modules.isPure ? jest.fn() : undefined }; - if (__updateModules) __updateModules(factory); - return factory; }); diff --git a/src/utils.ts b/src/utils.ts index 5915875..c73167f 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -26,6 +26,7 @@ export interface IClientWithContext extends SplitIO.IBrowserClient { */ export interface IFactoryWithClients extends SplitIO.IBrowserSDK { config: SplitIO.IBrowserSettings; + init(): void; } // exported for testing purposes @@ -38,6 +39,7 @@ export function getSplitFactory(config: SplitIO.IBrowserSettings) { // @ts-expect-error. 2nd param is not part of type definitions. Used to overwrite the SDK version const newFactory = SplitSdk(config, (modules) => { modules.settings.version = VERSION; + modules.isPure = true; }) as IFactoryWithClients; newFactory.config = config; __factories.set(config, newFactory);