diff --git a/.changeset/mighty-cars-grow.md b/.changeset/mighty-cars-grow.md new file mode 100644 index 000000000..6756916c5 --- /dev/null +++ b/.changeset/mighty-cars-grow.md @@ -0,0 +1,5 @@ +--- +'@lion/localize': patch +--- + +Fix localize race condition where data was being added while namespace loader promise was no longer in cache. diff --git a/packages/localize/src/LocalizeManager.js b/packages/localize/src/LocalizeManager.js index 29958a018..feb9db563 100644 --- a/packages/localize/src/LocalizeManager.js +++ b/packages/localize/src/LocalizeManager.js @@ -340,8 +340,14 @@ export class LocalizeManager { * @param {Object} obj.default */ obj => { - const data = isLocalizeESModule(obj) ? obj.default : obj; - this.addData(locale, namespace, data); + // add data only if we have the promise in cache + if ( + this.__namespaceLoaderPromisesCache[locale] && + this.__namespaceLoaderPromisesCache[locale][namespace] === loaderPromise + ) { + const data = isLocalizeESModule(obj) ? obj.default : obj; + this.addData(locale, namespace, data); + } }, ); } diff --git a/packages/localize/test/LocalizeManager.test.js b/packages/localize/test/LocalizeManager.test.js index 058db9bab..46d4dc01f 100644 --- a/packages/localize/test/LocalizeManager.test.js +++ b/packages/localize/test/LocalizeManager.test.js @@ -58,6 +58,30 @@ describe('LocalizeManager', () => { expect(document.documentElement.lang).to.equal('en-GB'); }); + it('empties storage after reset() is invoked', async () => { + manager = new LocalizeManager(); + + let deferredResolve; + manager.loadNamespace({ + generic: () => + new Promise(resolve => { + deferredResolve = () => resolve({ greeting: 'Hello!' }); + }), + }); + + const { loadingComplete } = manager; + + manager.reset(); + expect(getProtectedMembers(manager).storage).to.be.empty; + + // @ts-ignore + deferredResolve(); + await loadingComplete; + + // storage still needs to be empty after promise is fulfilled. + expect(getProtectedMembers(manager).storage).to.be.empty; + }); + it('has teardown() method removing all side effects', () => { manager = new LocalizeManager(); const disconnectObserverSpy = sinon.spy(