Skip to content

Commit ca3499b

Browse files
Merge pull request #29 from puzzle-js/feature/client-async-force
Implement client async forced fragments
2 parents 3d74066 + 8103f87 commit ca3499b

File tree

5 files changed

+62
-2
lines changed

5 files changed

+62
-2
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@puzzle-js/client-lib",
33
"main": "dist/index.js",
4-
"version": "1.4.4",
4+
"version": "1.4.5",
55
"author": "<emre.kul@trendyol.com>",
66
"license": "MIT",
77
"repository": {

src/core.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ export class Core extends Module {
3131
});
3232
}
3333

34+
const forcedFragments = Core.__pageConfiguration.fragments.filter(i => i.clientAsync && i.clientAsyncForce);
35+
if (forcedFragments.length) {
36+
forcedFragments.forEach(fragment => Core.renderAsyncFragment(fragment.name));
37+
}
38+
3439
if (this.isIntersectionObserverSupported()) {
3540
const asyncFragments = Core.__pageConfiguration.fragments.some(i => i.clientAsync);
3641

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export interface IPageFragmentConfig {
3131
name: string;
3232
chunked: boolean;
3333
clientAsync: boolean;
34+
clientAsyncForce: boolean | undefined;
3435
asyncDecentralized: boolean;
3536
attributes: { [name: string]: string };
3637
source: string | undefined;

test/core.spec.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,60 @@ describe('Module - Core', () => {
202202
},
203203
chunked: true,
204204
clientAsync: true,
205+
clientAsyncForce: undefined,
206+
source: undefined,
207+
asyncDecentralized: false
208+
}],
209+
page: 'page',
210+
peers: []
211+
} as IPageLibConfiguration;
212+
213+
const fragmentContainer = global.window.document.createElement('div');
214+
fragmentContainer.setAttribute('puzzle-fragment', 'test');
215+
global.window.document.body.appendChild(fragmentContainer);
216+
217+
const fetchStub = global.fetch as SinonStub;
218+
const stubAsyncRenderResponse = sandbox.stub(Core as any, "asyncRenderResponse").resolves();
219+
220+
Core.config(JSON.stringify(config));
221+
await Core.renderAsyncFragment('test');
222+
await Core.renderAsyncFragment('test');
223+
224+
expect(fetchStub.calledOnce).to.eq(true);
225+
expect(fetchStub.getCall(0).lastArg.headers).to.haveOwnProperty("originalurl");
226+
expect(stubAsyncRenderResponse.calledOnce).to.eq(true);
227+
});
228+
229+
it('should render forced async fragment', async () => {
230+
const assets = [
231+
{
232+
name: 'bundle1',
233+
dependent: ['vendor1'],
234+
preLoaded: false,
235+
link: 'bundle1.js',
236+
fragment: 'test',
237+
loadMethod: RESOURCE_LOADING_TYPE.ON_PAGE_RENDER,
238+
type: RESOURCE_TYPE.JS
239+
}
240+
] as IPageLibAsset[];
241+
const dependencies = [
242+
{
243+
name: 'vendor1',
244+
link: 'vendor1.js',
245+
preLoaded: false
246+
}
247+
] as IPageLibDependency[];
248+
const config = {
249+
dependencies,
250+
assets,
251+
fragments: [{
252+
name: 'test',
253+
attributes: {
254+
if: "false"
255+
},
256+
chunked: true,
257+
clientAsync: true,
258+
clientAsyncForce: true,
205259
source: undefined,
206260
asyncDecentralized: false
207261
}],

0 commit comments

Comments
 (0)