1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, '__esModule', { value: true });
|
4 |
|
5 | var tslib = require('tslib');
|
6 | var React = require('react');
|
7 | var context = require('../context');
|
8 |
|
9 | function _interopNamespace(e) {
|
10 | if (e && e.__esModule) return e;
|
11 | var n = Object.create(null);
|
12 | if (e) {
|
13 | for (var k in e) {
|
14 | n[k] = e[k];
|
15 | }
|
16 | }
|
17 | n["default"] = e;
|
18 | return Object.freeze(n);
|
19 | }
|
20 |
|
21 | var React__namespace = _interopNamespace(React);
|
22 |
|
23 | function makeDefaultQueryInfo() {
|
24 | return {
|
25 | seen: false,
|
26 | observable: null
|
27 | };
|
28 | }
|
29 | var RenderPromises = (function () {
|
30 | function RenderPromises() {
|
31 | this.queryPromises = new Map();
|
32 | this.queryInfoTrie = new Map();
|
33 | this.stopped = false;
|
34 | }
|
35 | RenderPromises.prototype.stop = function () {
|
36 | if (!this.stopped) {
|
37 | this.queryPromises.clear();
|
38 | this.queryInfoTrie.clear();
|
39 | this.stopped = true;
|
40 | }
|
41 | };
|
42 | RenderPromises.prototype.registerSSRObservable = function (observable) {
|
43 | if (this.stopped)
|
44 | return;
|
45 | this.lookupQueryInfo(observable.options).observable = observable;
|
46 | };
|
47 | RenderPromises.prototype.getSSRObservable = function (props) {
|
48 | return this.lookupQueryInfo(props).observable;
|
49 | };
|
50 | RenderPromises.prototype.addQueryPromise = function (queryInstance, finish) {
|
51 | if (!this.stopped) {
|
52 | var info = this.lookupQueryInfo(queryInstance.getOptions());
|
53 | if (!info.seen) {
|
54 | this.queryPromises.set(queryInstance.getOptions(), new Promise(function (resolve) {
|
55 | resolve(queryInstance.fetchData());
|
56 | }));
|
57 | return null;
|
58 | }
|
59 | }
|
60 | return finish ? finish() : null;
|
61 | };
|
62 | RenderPromises.prototype.addObservableQueryPromise = function (obsQuery) {
|
63 | return this.addQueryPromise({
|
64 | getOptions: function () { return obsQuery.options; },
|
65 | fetchData: function () { return new Promise(function (resolve) {
|
66 | var sub = obsQuery.subscribe({
|
67 | next: function (result) {
|
68 | if (!result.loading) {
|
69 | resolve();
|
70 | sub.unsubscribe();
|
71 | }
|
72 | },
|
73 | error: function () {
|
74 | resolve();
|
75 | sub.unsubscribe();
|
76 | },
|
77 | complete: function () {
|
78 | resolve();
|
79 | },
|
80 | });
|
81 | }); },
|
82 | });
|
83 | };
|
84 | RenderPromises.prototype.hasPromises = function () {
|
85 | return this.queryPromises.size > 0;
|
86 | };
|
87 | RenderPromises.prototype.consumeAndAwaitPromises = function () {
|
88 | var _this = this;
|
89 | var promises = [];
|
90 | this.queryPromises.forEach(function (promise, queryInstance) {
|
91 | _this.lookupQueryInfo(queryInstance).seen = true;
|
92 | promises.push(promise);
|
93 | });
|
94 | this.queryPromises.clear();
|
95 | return Promise.all(promises);
|
96 | };
|
97 | RenderPromises.prototype.lookupQueryInfo = function (props) {
|
98 | var queryInfoTrie = this.queryInfoTrie;
|
99 | var query = props.query, variables = props.variables;
|
100 | var varMap = queryInfoTrie.get(query) || new Map();
|
101 | if (!queryInfoTrie.has(query))
|
102 | queryInfoTrie.set(query, varMap);
|
103 | var variablesString = JSON.stringify(variables);
|
104 | var info = varMap.get(variablesString) || makeDefaultQueryInfo();
|
105 | if (!varMap.has(variablesString))
|
106 | varMap.set(variablesString, info);
|
107 | return info;
|
108 | };
|
109 | return RenderPromises;
|
110 | }());
|
111 |
|
112 | function getDataFromTree(tree, context) {
|
113 | if (context === void 0) { context = {}; }
|
114 | return getMarkupFromTree({
|
115 | tree: tree,
|
116 | context: context,
|
117 | renderFunction: require('react-dom/server').renderToStaticMarkup
|
118 | });
|
119 | }
|
120 | function getMarkupFromTree(_a) {
|
121 | var tree = _a.tree, _b = _a.context, context$1 = _b === void 0 ? {} : _b, _c = _a.renderFunction, renderFunction = _c === void 0 ? require('react-dom/server').renderToStaticMarkup : _c;
|
122 | var renderPromises = new RenderPromises();
|
123 | function process() {
|
124 | var ApolloContext = context.getApolloContext();
|
125 | return new Promise(function (resolve) {
|
126 | var element = React__namespace.createElement(ApolloContext.Provider, { value: tslib.__assign(tslib.__assign({}, context$1), { renderPromises: renderPromises }) }, tree);
|
127 | resolve(renderFunction(element));
|
128 | }).then(function (html) {
|
129 | return renderPromises.hasPromises()
|
130 | ? renderPromises.consumeAndAwaitPromises().then(process)
|
131 | : html;
|
132 | }).finally(function () {
|
133 | renderPromises.stop();
|
134 | });
|
135 | }
|
136 | return Promise.resolve().then(process);
|
137 | }
|
138 |
|
139 | function renderToStringWithData(component) {
|
140 | return getMarkupFromTree({
|
141 | tree: component,
|
142 | renderFunction: require('react-dom/server').renderToString
|
143 | });
|
144 | }
|
145 |
|
146 | exports.RenderPromises = RenderPromises;
|
147 | exports.getDataFromTree = getDataFromTree;
|
148 | exports.getMarkupFromTree = getMarkupFromTree;
|
149 | exports.renderToStringWithData = renderToStringWithData;
|
150 |
|