From 05f022486adbca7726b2f5ce2ea34bd8922a7614 Mon Sep 17 00:00:00 2001 From: DominusVilicus Date: Tue, 15 Jan 2019 19:40:51 +1030 Subject: [PATCH 1/9] change renderSync to render --- src/server/create-renderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/create-renderer.js b/src/server/create-renderer.js index 1cfbfb0ddd9..48ef6b26cbe 100644 --- a/src/server/create-renderer.js +++ b/src/server/create-renderer.js @@ -86,7 +86,7 @@ export function createRenderer ({ context.rendered(context) } if (template) { - result = templateRenderer.renderSync(result, context) + result = templateRenderer.render(result, context) } if (err) { cb(err) From 2a86f10a6ea428dd5210a2325ee910db9fad70e2 Mon Sep 17 00:00:00 2001 From: DominusVilicus Date: Tue, 15 Jan 2019 19:43:19 +1030 Subject: [PATCH 2/9] added capability for async render function for template --- src/server/template-renderer/index.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/server/template-renderer/index.js b/src/server/template-renderer/index.js index 269673fb3d7..c5663969673 100644 --- a/src/server/template-renderer/index.js +++ b/src/server/template-renderer/index.js @@ -55,9 +55,13 @@ export default class TemplateRenderer { this.inject = options.inject !== false // if no template option is provided, the renderer is created // as a utility object for rendering assets like preload links and scripts. - this.parsedTemplate = options.template - ? parseTemplate(options.template) - : null + + let template = options.template + + this.parsedTemplate = template + ? typeof template === 'function' + ? template : parseTemplate(template) + : null; // function used to serialize initial state JSON this.serialize = options.serializer || (state => { @@ -89,12 +93,16 @@ export default class TemplateRenderer { } // render synchronously given rendered app content and render context - renderSync (content: string, context: ?Object) { + async render (content: string, context: ?Object) { const template = this.parsedTemplate if (!template) { - throw new Error('renderSync cannot be called without a template.') + throw new Error('render cannot be called without a template.') } context = context || {} + + //if the template is a function, just call the template and return + if(typeof template === 'function') return template(content, context) + if (this.inject) { return ( template.head(context) + From 638fd27ddbaa8b82b50dc8da04bc509071ba20b4 Mon Sep 17 00:00:00 2001 From: DominusVilicus Date: Tue, 15 Jan 2019 19:47:38 +1030 Subject: [PATCH 3/9] Forgot async & await --- src/server/create-renderer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/create-renderer.js b/src/server/create-renderer.js index 48ef6b26cbe..2821aa2c29a 100644 --- a/src/server/create-renderer.js +++ b/src/server/create-renderer.js @@ -81,12 +81,12 @@ export function createRenderer ({ return false }, cb) try { - render(component, write, context, err => { + render(component, write, context, async (err) => { if (context && context.rendered) { context.rendered(context) } if (template) { - result = templateRenderer.render(result, context) + result = await templateRenderer.render(result, context) } if (err) { cb(err) From 3a1b906738299c7eae47a125edd989a70ea95c71 Mon Sep 17 00:00:00 2001 From: DominusVilicus Date: Tue, 15 Jan 2019 22:44:12 +1030 Subject: [PATCH 4/9] feat: added async function for templates --- src/server/create-renderer.js | 7 ++++--- src/server/template-renderer/index.js | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/server/create-renderer.js b/src/server/create-renderer.js index 2821aa2c29a..a1c4780a536 100644 --- a/src/server/create-renderer.js +++ b/src/server/create-renderer.js @@ -23,7 +23,7 @@ export type RenderOptions = { directives?: Object; isUnaryTag?: Function; cache?: RenderCache; - template?: string; + template?: string | Function; inject?: boolean; basedir?: string; shouldPreload?: Function; @@ -81,12 +81,13 @@ export function createRenderer ({ return false }, cb) try { - render(component, write, context, async (err) => { + render(component, write, context, err => { if (context && context.rendered) { context.rendered(context) } if (template) { - result = await templateRenderer.render(result, context) + new Promise(resolve => resolve(templateRenderer.render(result, context))) + .then(res => cb(res)) } if (err) { cb(err) diff --git a/src/server/template-renderer/index.js b/src/server/template-renderer/index.js index c5663969673..8357570d286 100644 --- a/src/server/template-renderer/index.js +++ b/src/server/template-renderer/index.js @@ -11,7 +11,7 @@ import type { ParsedTemplate } from './parse-template' import type { AsyncFileMapper } from './create-async-file-mapper' type TemplateRendererOptions = { - template: ?string; + template?: string | Function; inject?: boolean; clientManifest?: ClientManifest; shouldPreload?: (file: string, type: string) => boolean; @@ -93,7 +93,7 @@ export default class TemplateRenderer { } // render synchronously given rendered app content and render context - async render (content: string, context: ?Object) { + render (content: string, context: ?Object) { const template = this.parsedTemplate if (!template) { throw new Error('render cannot be called without a template.') From 49b0e6a055cb2702d3a86af954eee881d5f4c8f3 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 18 Jan 2019 10:56:49 -0500 Subject: [PATCH 5/9] Update create-renderer.js --- src/server/create-renderer.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/server/create-renderer.js b/src/server/create-renderer.js index a1c4780a536..845a52ba9e4 100644 --- a/src/server/create-renderer.js +++ b/src/server/create-renderer.js @@ -82,15 +82,26 @@ export function createRenderer ({ }, cb) try { render(component, write, context, err => { + if (err) { + return cb(err) + } if (context && context.rendered) { context.rendered(context) } if (template) { - new Promise(resolve => resolve(templateRenderer.render(result, context))) - .then(res => cb(res)) - } - if (err) { - cb(err) + try { + const res = templateRenderer.render(result, context) + if (typeof res !== 'string') { + // function template returning promise + res + .then(html => cb(null, html)) + .catch(cb) + } else { + cb(null, res) + } + } catch (e) { + cb(e) + } } else { cb(null, result) } From f3929f216f362feabb7d8efc2c5319add1df154f Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 18 Jan 2019 11:08:56 -0500 Subject: [PATCH 6/9] Update create-renderer.js --- src/server/create-renderer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/create-renderer.js b/src/server/create-renderer.js index 845a52ba9e4..9ceef883e32 100644 --- a/src/server/create-renderer.js +++ b/src/server/create-renderer.js @@ -23,7 +23,7 @@ export type RenderOptions = { directives?: Object; isUnaryTag?: Function; cache?: RenderCache; - template?: string | Function; + template?: string | (content: string, context: object) => string; inject?: boolean; basedir?: string; shouldPreload?: Function; @@ -131,6 +131,8 @@ export function createRenderer ({ }) } return renderStream + } else if (typeof template === 'function') { + throw new Error(`function template is only supported in renderToString.`) } else { const templateStream = templateRenderer.createStream(context) renderStream.on('error', err => { From a7a324cdbfbbad82da53d650fe2e2e504085ba88 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 18 Jan 2019 11:09:38 -0500 Subject: [PATCH 7/9] Update index.js --- src/server/template-renderer/index.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/server/template-renderer/index.js b/src/server/template-renderer/index.js index 8357570d286..118aa55190b 100644 --- a/src/server/template-renderer/index.js +++ b/src/server/template-renderer/index.js @@ -56,12 +56,12 @@ export default class TemplateRenderer { // if no template option is provided, the renderer is created // as a utility object for rendering assets like preload links and scripts. - let template = options.template - + const { template } = options this.parsedTemplate = template ? typeof template === 'function' - ? template : parseTemplate(template) - : null; + ? template + : parseTemplate(options.template) + : null // function used to serialize initial state JSON this.serialize = options.serializer || (state => { @@ -93,15 +93,16 @@ export default class TemplateRenderer { } // render synchronously given rendered app content and render context - render (content: string, context: ?Object) { + render (content: string, context: ?Object): string | Promise { const template = this.parsedTemplate if (!template) { throw new Error('render cannot be called without a template.') } context = context || {} - //if the template is a function, just call the template and return - if(typeof template === 'function') return template(content, context) + if (typeof template === 'function') { + return template(content, context) + } if (this.inject) { return ( From 1f5415525a957ec066d833fc325c0467241d60ce Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 18 Jan 2019 11:15:53 -0500 Subject: [PATCH 8/9] Update create-renderer.js --- src/server/create-renderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/create-renderer.js b/src/server/create-renderer.js index 9ceef883e32..502b6fa6d1d 100644 --- a/src/server/create-renderer.js +++ b/src/server/create-renderer.js @@ -23,7 +23,7 @@ export type RenderOptions = { directives?: Object; isUnaryTag?: Function; cache?: RenderCache; - template?: string | (content: string, context: object) => string; + template?: string | (content: string, context: any) => string; inject?: boolean; basedir?: string; shouldPreload?: Function; From bcd2fdc542480453a945a08a6bb42721c4d3aa6e Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 18 Jan 2019 11:17:22 -0500 Subject: [PATCH 9/9] Update index.js --- src/server/template-renderer/index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/server/template-renderer/index.js b/src/server/template-renderer/index.js index 118aa55190b..c8927b2de2c 100644 --- a/src/server/template-renderer/index.js +++ b/src/server/template-renderer/index.js @@ -11,7 +11,7 @@ import type { ParsedTemplate } from './parse-template' import type { AsyncFileMapper } from './create-async-file-mapper' type TemplateRendererOptions = { - template?: string | Function; + template?: string | (content: string, context: any) => string; inject?: boolean; clientManifest?: ClientManifest; shouldPreload?: (file: string, type: string) => boolean; @@ -42,7 +42,7 @@ type Resource = { export default class TemplateRenderer { options: TemplateRendererOptions; inject: boolean; - parsedTemplate: ParsedTemplate | null; + parsedTemplate: ParsedTemplate | Function | null; publicPath: string; clientManifest: ClientManifest; preloadFiles: Array; @@ -58,9 +58,9 @@ export default class TemplateRenderer { const { template } = options this.parsedTemplate = template - ? typeof template === 'function' - ? template - : parseTemplate(options.template) + ? typeof template === 'string' + ? parseTemplate(template) + : template : null // function used to serialize initial state JSON