Skip to content
This repository was archived by the owner on May 17, 2019. It is now read-only.

Commit 1775201

Browse files
rtsaofusion-bot[bot]
authored andcommitted
Move SSR body template into DI system
#291
1 parent f20c2f4 commit 1775201

File tree

5 files changed

+81
-45
lines changed

5 files changed

+81
-45
lines changed

src/base-app.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@
88

99
import {createPlugin} from './create-plugin';
1010
import {createToken, TokenType, TokenImpl} from './create-token';
11-
import {ElementToken, RenderToken, SSRDeciderToken} from './tokens';
12-
import {SSRDecider} from './plugins/ssr';
11+
import {
12+
ElementToken,
13+
RenderToken,
14+
SSRDeciderToken,
15+
SSRBodyTemplateToken,
16+
} from './tokens';
17+
import {SSRDecider, SSRBodyTemplate} from './plugins/ssr';
1318

1419
import type {aliaser, cleanupFn, FusionPlugin, Token} from './types.js';
1520

@@ -22,6 +27,7 @@ class FusionApp {
2227
el && this.register(ElementToken, el);
2328
render && this.register(RenderToken, render);
2429
this.register(SSRDeciderToken, SSRDecider);
30+
this.register(SSRBodyTemplateToken, SSRBodyTemplate);
2531
}
2632

2733
// eslint-disable-next-line

src/plugins/ssr.js

Lines changed: 56 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@
88

99
import {createPlugin} from '../create-plugin';
1010
import {escape, consumeSanitizedHTML} from '../sanitization';
11-
import type {Context, SSRDecider as SSRDeciderService} from '../types.js';
11+
import type {
12+
Context,
13+
SSRDecider as SSRDeciderService,
14+
SSRBodyTemplate as SSRBodyTemplateService,
15+
} from '../types.js';
1216

1317
const SSRDecider = createPlugin({
1418
provides: () => {
@@ -27,12 +31,62 @@ const SSRDecider = createPlugin({
2731
});
2832
export {SSRDecider};
2933

34+
const SSRBodyTemplate = createPlugin({
35+
provides: () => {
36+
return ctx => {
37+
const {htmlAttrs, bodyAttrs, title, head, body} = ctx.template;
38+
const safeAttrs = Object.keys(htmlAttrs)
39+
.map(attrKey => {
40+
return ` ${escape(attrKey)}="${escape(htmlAttrs[attrKey])}"`;
41+
})
42+
.join('');
43+
44+
const safeBodyAttrs = Object.keys(bodyAttrs)
45+
.map(attrKey => {
46+
return ` ${escape(attrKey)}="${escape(bodyAttrs[attrKey])}"`;
47+
})
48+
.join('');
49+
50+
const safeTitle = escape(title);
51+
// $FlowFixMe
52+
const safeHead = head.map(consumeSanitizedHTML).join('');
53+
// $FlowFixMe
54+
const safeBody = body.map(consumeSanitizedHTML).join('');
55+
56+
const preloadHintLinks = getPreloadHintLinks(ctx);
57+
const coreGlobals = getCoreGlobals(ctx);
58+
const chunkScripts = getChunkScripts(ctx);
59+
const bundleSplittingBootstrap = [
60+
preloadHintLinks,
61+
coreGlobals,
62+
chunkScripts,
63+
].join('');
64+
65+
return [
66+
'<!doctype html>',
67+
`<html${safeAttrs}>`,
68+
`<head>`,
69+
`<meta charset="utf-8" />`,
70+
`<title>${safeTitle}</title>`,
71+
`${bundleSplittingBootstrap}${safeHead}`,
72+
`</head>`,
73+
`<body${safeBodyAttrs}>${ctx.rendered}${safeBody}</body>`,
74+
'</html>',
75+
].join('');
76+
};
77+
},
78+
});
79+
80+
export {SSRBodyTemplate};
81+
3082
export default function createSSRPlugin({
3183
element,
3284
ssrDecider,
85+
ssrBodyTemplate,
3386
}: {
3487
element: any,
3588
ssrDecider: SSRDeciderService,
89+
ssrBodyTemplate: SSRBodyTemplateService,
3690
}) {
3791
return async function ssrPlugin(ctx: Context, next: () => Promise<void>) {
3892
if (!ssrDecider(ctx)) return next();
@@ -57,45 +111,7 @@ export default function createSSRPlugin({
57111
return;
58112
}
59113

60-
const {htmlAttrs, bodyAttrs, title, head, body} = ctx.template;
61-
const safeAttrs = Object.keys(htmlAttrs)
62-
.map(attrKey => {
63-
return ` ${escape(attrKey)}="${escape(htmlAttrs[attrKey])}"`;
64-
})
65-
.join('');
66-
67-
const safeBodyAttrs = Object.keys(bodyAttrs)
68-
.map(attrKey => {
69-
return ` ${escape(attrKey)}="${escape(bodyAttrs[attrKey])}"`;
70-
})
71-
.join('');
72-
73-
const safeTitle = escape(title);
74-
// $FlowFixMe
75-
const safeHead = head.map(consumeSanitizedHTML).join('');
76-
// $FlowFixMe
77-
const safeBody = body.map(consumeSanitizedHTML).join('');
78-
79-
const preloadHintLinks = getPreloadHintLinks(ctx);
80-
const coreGlobals = getCoreGlobals(ctx);
81-
const chunkScripts = getChunkScripts(ctx);
82-
const bundleSplittingBootstrap = [
83-
preloadHintLinks,
84-
coreGlobals,
85-
chunkScripts,
86-
].join('');
87-
88-
ctx.body = [
89-
'<!doctype html>',
90-
`<html${safeAttrs}>`,
91-
`<head>`,
92-
`<meta charset="utf-8" />`,
93-
`<title>${safeTitle}</title>`,
94-
`${bundleSplittingBootstrap}${safeHead}`,
95-
`</head>`,
96-
`<body${safeBodyAttrs}>${ctx.rendered}${safeBody}</body>`,
97-
'</html>',
98-
].join('');
114+
ctx.body = ssrBodyTemplate(ctx);
99115
};
100116
}
101117

src/server-app.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ import {compose} from './compose.js';
1010
import Timing, {TimingToken} from './plugins/timing';
1111
import BaseApp from './base-app';
1212
import serverRenderer from './plugins/server-renderer';
13-
import {RenderToken, ElementToken, SSRDeciderToken} from './tokens';
13+
import {
14+
RenderToken,
15+
ElementToken,
16+
SSRDeciderToken,
17+
SSRBodyTemplateToken,
18+
} from './tokens';
1419
import ssrPlugin from './plugins/ssr';
1520
import contextMiddleware from './plugins/server-context.js';
1621

@@ -25,7 +30,11 @@ export default function(): typeof BaseApp {
2530
this.middleware(contextMiddleware);
2631
this.register(TimingToken, Timing);
2732
this.middleware(
28-
{element: ElementToken, ssrDecider: SSRDeciderToken},
33+
{
34+
element: ElementToken,
35+
ssrDecider: SSRDeciderToken,
36+
ssrBodyTemplate: SSRBodyTemplateToken,
37+
},
2938
ssrPlugin
3039
);
3140
}

src/tokens.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
*/
88

99
import {createToken} from './create-token';
10-
import type {SSRDecider, Token} from './types.js';
10+
import type {SSRDecider, SSRBodyTemplate, Token} from './types.js';
1111

1212
export const RenderToken = createToken('RenderToken');
1313
export const ElementToken = createToken('ElementToken');
1414
export const SSRDeciderToken: Token<SSRDecider> = createToken(
1515
'SSRDeciderToken'
1616
);
1717
export const HttpServerToken = createToken('HttpServerToken');
18+
export const SSRBodyTemplateToken: Token<SSRBodyTemplate> = createToken(
19+
'SSRBodyTemplateToken'
20+
);

src/types.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,5 @@ export type aliaser<TToken> = {
5959
};
6060

6161
export type cleanupFn = (thing: any) => Promise<void>;
62+
63+
export type SSRBodyTemplate = Context => $PropertyType<Context, 'body'>;

0 commit comments

Comments
 (0)