diff --git a/package-lock.json b/package-lock.json index bf45b65..c2f787a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@puzzle-js/client-lib", - "version": "1.4.4", + "version": "1.4.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 67df270..41b54d2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@puzzle-js/client-lib", "main": "dist/index.js", - "version": "1.4.4", + "version": "1.4.5", "author": "", "license": "MIT", "repository": { diff --git a/src/core.ts b/src/core.ts index 53a7e80..c796dbb 100644 --- a/src/core.ts +++ b/src/core.ts @@ -31,6 +31,11 @@ export class Core extends Module { }); } + const forcedFragments = Core.__pageConfiguration.fragments.filter(i => i.clientAsync && i.clientAsyncForce); + if (forcedFragments.length) { + forcedFragments.forEach(fragment => Core.renderAsyncFragment(fragment.name)); + } + if (this.isIntersectionObserverSupported()) { const asyncFragments = Core.__pageConfiguration.fragments.some(i => i.clientAsync); diff --git a/src/types.ts b/src/types.ts index fd3d958..e195524 100644 --- a/src/types.ts +++ b/src/types.ts @@ -31,6 +31,7 @@ export interface IPageFragmentConfig { name: string; chunked: boolean; clientAsync: boolean; + clientAsyncForce: boolean | undefined; asyncDecentralized: boolean; attributes: { [name: string]: string }; source: string | undefined; diff --git a/test/core.spec.ts b/test/core.spec.ts index ce20ba8..6c7e177 100644 --- a/test/core.spec.ts +++ b/test/core.spec.ts @@ -202,6 +202,60 @@ describe('Module - Core', () => { }, chunked: true, clientAsync: true, + clientAsyncForce: undefined, + source: undefined, + asyncDecentralized: false + }], + page: 'page', + peers: [] + } as IPageLibConfiguration; + + const fragmentContainer = global.window.document.createElement('div'); + fragmentContainer.setAttribute('puzzle-fragment', 'test'); + global.window.document.body.appendChild(fragmentContainer); + + const fetchStub = global.fetch as SinonStub; + const stubAsyncRenderResponse = sandbox.stub(Core as any, "asyncRenderResponse").resolves(); + + Core.config(JSON.stringify(config)); + await Core.renderAsyncFragment('test'); + await Core.renderAsyncFragment('test'); + + expect(fetchStub.calledOnce).to.eq(true); + expect(fetchStub.getCall(0).lastArg.headers).to.haveOwnProperty("originalurl"); + expect(stubAsyncRenderResponse.calledOnce).to.eq(true); + }); + + it('should render forced async fragment', async () => { + const assets = [ + { + name: 'bundle1', + dependent: ['vendor1'], + preLoaded: false, + link: 'bundle1.js', + fragment: 'test', + loadMethod: RESOURCE_LOADING_TYPE.ON_PAGE_RENDER, + type: RESOURCE_TYPE.JS + } + ] as IPageLibAsset[]; + const dependencies = [ + { + name: 'vendor1', + link: 'vendor1.js', + preLoaded: false + } + ] as IPageLibDependency[]; + const config = { + dependencies, + assets, + fragments: [{ + name: 'test', + attributes: { + if: "false" + }, + chunked: true, + clientAsync: true, + clientAsyncForce: true, source: undefined, asyncDecentralized: false }],