Skip to content

Commit

Permalink
fix(localize): reset storage correctly
Browse files Browse the repository at this point in the history
long running imports were polluting newly reset storage
  • Loading branch information
dereli authored and Joren Broekema committed Jun 1, 2021
1 parent 989f24b commit 5ca3d27
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
5 changes: 5 additions & 0 deletions .changeset/mighty-cars-grow.md
Original file line number Diff line number Diff line change
@@ -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.
10 changes: 8 additions & 2 deletions packages/localize/src/LocalizeManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
},
);
}
Expand Down
24 changes: 24 additions & 0 deletions packages/localize/test/LocalizeManager.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,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(
Expand Down

0 comments on commit 5ca3d27

Please sign in to comment.