aboutsummaryrefslogtreecommitdiff
path: root/node_modules/vue/src/server/create-renderer.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/vue/src/server/create-renderer.js')
-rw-r--r--node_modules/vue/src/server/create-renderer.js120
1 files changed, 120 insertions, 0 deletions
diff --git a/node_modules/vue/src/server/create-renderer.js b/node_modules/vue/src/server/create-renderer.js
new file mode 100644
index 00000000..c045a426
--- /dev/null
+++ b/node_modules/vue/src/server/create-renderer.js
@@ -0,0 +1,120 @@
+/* @flow */
+
+import RenderStream from './render-stream'
+import { createWriteFunction } from './write'
+import { createRenderFunction } from './render'
+import { createPromiseCallback } from './util'
+import TemplateRenderer from './template-renderer/index'
+import type { ClientManifest } from './template-renderer/index'
+
+export type Renderer = {
+ renderToString: (component: Component, context: any, cb: any) => ?Promise<string>;
+ renderToStream: (component: Component, context?: Object) => stream$Readable;
+};
+
+type RenderCache = {
+ get: (key: string, cb?: Function) => string | void;
+ set: (key: string, val: string) => void;
+ has?: (key: string, cb?: Function) => boolean | void;
+};
+
+export type RenderOptions = {
+ modules?: Array<(vnode: VNode) => ?string>;
+ directives?: Object;
+ isUnaryTag?: Function;
+ cache?: RenderCache;
+ template?: string;
+ inject?: boolean;
+ basedir?: string;
+ shouldPreload?: Function;
+ shouldPrefetch?: Function;
+ clientManifest?: ClientManifest;
+ runInNewContext?: boolean | 'once';
+};
+
+export function createRenderer ({
+ modules = [],
+ directives = {},
+ isUnaryTag = (() => false),
+ template,
+ inject,
+ cache,
+ shouldPreload,
+ shouldPrefetch,
+ clientManifest
+}: RenderOptions = {}): Renderer {
+ const render = createRenderFunction(modules, directives, isUnaryTag, cache)
+ const templateRenderer = new TemplateRenderer({
+ template,
+ inject,
+ shouldPreload,
+ shouldPrefetch,
+ clientManifest
+ })
+
+ return {
+ renderToString (
+ component: Component,
+ context: any,
+ cb: any
+ ): ?Promise<string> {
+ if (typeof context === 'function') {
+ cb = context
+ context = {}
+ }
+ if (context) {
+ templateRenderer.bindRenderFns(context)
+ }
+
+ // no callback, return Promise
+ let promise
+ if (!cb) {
+ ({ promise, cb } = createPromiseCallback())
+ }
+
+ let result = ''
+ const write = createWriteFunction(text => {
+ result += text
+ return false
+ }, cb)
+ try {
+ render(component, write, context, err => {
+ if (template) {
+ result = templateRenderer.renderSync(result, context)
+ }
+ if (err) {
+ cb(err)
+ } else {
+ cb(null, result)
+ }
+ })
+ } catch (e) {
+ cb(e)
+ }
+
+ return promise
+ },
+
+ renderToStream (
+ component: Component,
+ context?: Object
+ ): stream$Readable {
+ if (context) {
+ templateRenderer.bindRenderFns(context)
+ }
+ const renderStream = new RenderStream((write, done) => {
+ render(component, write, context, done)
+ })
+ if (!template) {
+ return renderStream
+ } else {
+ const templateStream = templateRenderer.createStream(context)
+ renderStream.on('error', err => {
+ templateStream.emit('error', err)
+ })
+ renderStream.pipe(templateStream)
+ return templateStream
+ }
+ }
+ }
+}