diff --git a/package-lock.json b/package-lock.json index 1dabe72..b4ae1fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@puzzle-js/client-lib", - "version": "1.6.1", + "version": "1.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d484951..a38b202 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@puzzle-js/client-lib", "main": "dist/index.js", - "version": "1.6.1", + "version": "1.6.2", "author": "", "license": "MIT", "repository": { diff --git a/src/assetHelper.ts b/src/assetHelper.ts index 555a028..c7ef90e 100644 --- a/src/assetHelper.ts +++ b/src/assetHelper.ts @@ -37,6 +37,10 @@ export class AssetHelper { scriptTag.onload = () => { this.promises[asset.name].resolve(); }; + + scriptTag.onerror = () => { + this.promises[asset.name].reject(); + }; } else { this.promises[asset.name].resolve(); } @@ -58,6 +62,9 @@ export class AssetHelper { linkTag.onload = () => { this.promises[asset.name].resolve(); }; + linkTag.onerror = () => { + this.promises[asset.name].reject(); + }; window.document.head.appendChild(linkTag); } @@ -71,17 +78,21 @@ export class AssetHelper { } for (let i = 0, p: any = Promise.resolve(); i < assets.length; i++) { - p = p.then(() => new Promise(resolve => { + p = p.then(() => new Promise((resolve, reject) => { const asset = assets[i]; if (asset.type === RESOURCE_TYPE.JS) { const assetLoading = AssetHelper.loadJs(asset); assetLoading.then(() => { resolve(null); + }).catch(() => { + reject(null); }); } else if (asset.type === RESOURCE_TYPE.CSS) { const assetLoading = AssetHelper.loadCSS(asset); assetLoading.then(() => { resolve(null); + }).catch(() => { + reject(null); }); } } @@ -89,6 +100,10 @@ export class AssetHelper { if (callback && assets.length - 1 === i) { callback(); } + }).catch(() => { + if (callback && assets.length - 1 === i) { + callback(); + } }); } } diff --git a/test/assetHelper.spec.ts b/test/assetHelper.spec.ts index ad00c4a..cafaac5 100644 --- a/test/assetHelper.spec.ts +++ b/test/assetHelper.spec.ts @@ -130,6 +130,65 @@ describe('Module - Asset Helper', () => { }); }); + it('should call given callback when js asset has an error', async (done) => { + // arrange + const spy = sinon.spy(); + const assets: IPageLibAsset[] = [ + { + name: faker.lorem.word(), + loadMethod: RESOURCE_LOADING_TYPE.ON_FRAGMENT_RENDER, + fragment: faker.lorem.word(), + dependent: [], + type: RESOURCE_TYPE.JS, + link: faker.lorem.word(), + preLoaded: false, + defer: true, + } + ]; + + // act + await AssetHelper.loadAssetSeries(assets, spy); + + AssetHelper.promises[assets[0].name].reject(); + + // assert + expect(global.window.document.body.children.length).to.eq(1); + + setTimeout(() => { + expect(spy.calledOnce).to.eq(true); + done(); + }); + }); + + it('should call given callback when css asset has an error', async (done) => { + // arrange + const spy = sinon.spy(); + const assets: IPageLibAsset[] = [ + { + name: faker.lorem.word(), + loadMethod: RESOURCE_LOADING_TYPE.ON_FRAGMENT_RENDER, + fragment: faker.lorem.word(), + dependent: [], + type: RESOURCE_TYPE.CSS, + link: faker.lorem.word(), + preLoaded: false + } + ]; + + // act + await AssetHelper.loadAssetSeries(assets, spy); + + AssetHelper.promises[assets[0].name].reject(); + + // assert + expect(global.window.document.head.children.length).to.eq(1); + + setTimeout(() => { + expect(spy.calledOnce).to.eq(true); + done(); + }); + }); + it('should call given callback if assets length is 0', async (done) => { // arrange const spy = sinon.spy();