UNPKG

5.32 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var tslib = require('tslib');
6var React = require('react');
7var context = require('../context');
8
9function _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
21var React__namespace = /*#__PURE__*/_interopNamespace(React);
22
23function makeDefaultQueryInfo() {
24 return {
25 seen: false,
26 observable: null
27 };
28}
29var 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
112function 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}
120function 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
139function renderToStringWithData(component) {
140 return getMarkupFromTree({
141 tree: component,
142 renderFunction: require('react-dom/server').renderToString
143 });
144}
145
146exports.RenderPromises = RenderPromises;
147exports.getDataFromTree = getDataFromTree;
148exports.getMarkupFromTree = getMarkupFromTree;
149exports.renderToStringWithData = renderToStringWithData;
150//# sourceMappingURL=ssr.cjs.map