You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
5.3 KiB
158 lines
5.3 KiB
4 months ago
|
'use strict';
|
||
|
|
||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||
|
|
||
|
var tslib = require('tslib');
|
||
|
var React = require('rehackt');
|
||
|
var context = require('../context');
|
||
|
var server = require('react-dom/server');
|
||
|
|
||
|
function _interopNamespace(e) {
|
||
|
if (e && e.__esModule) return e;
|
||
|
var n = Object.create(null);
|
||
|
if (e) {
|
||
|
for (var k in e) {
|
||
|
n[k] = e[k];
|
||
|
}
|
||
|
}
|
||
|
n["default"] = e;
|
||
|
return Object.freeze(n);
|
||
|
}
|
||
|
|
||
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
||
|
|
||
|
function makeDefaultQueryInfo() {
|
||
|
return {
|
||
|
seen: false,
|
||
|
observable: null,
|
||
|
};
|
||
|
}
|
||
|
var RenderPromises = (function () {
|
||
|
function RenderPromises() {
|
||
|
this.queryPromises = new Map();
|
||
|
this.queryInfoTrie = new Map();
|
||
|
this.stopped = false;
|
||
|
}
|
||
|
RenderPromises.prototype.stop = function () {
|
||
|
if (!this.stopped) {
|
||
|
this.queryPromises.clear();
|
||
|
this.queryInfoTrie.clear();
|
||
|
this.stopped = true;
|
||
|
}
|
||
|
};
|
||
|
RenderPromises.prototype.registerSSRObservable = function (observable) {
|
||
|
if (this.stopped)
|
||
|
return;
|
||
|
this.lookupQueryInfo(observable.options).observable = observable;
|
||
|
};
|
||
|
RenderPromises.prototype.getSSRObservable = function (props) {
|
||
|
return this.lookupQueryInfo(props).observable;
|
||
|
};
|
||
|
RenderPromises.prototype.addQueryPromise = function (queryInstance, finish) {
|
||
|
if (!this.stopped) {
|
||
|
var info = this.lookupQueryInfo(queryInstance.getOptions());
|
||
|
if (!info.seen) {
|
||
|
this.queryPromises.set(queryInstance.getOptions(), new Promise(function (resolve) {
|
||
|
resolve(queryInstance.fetchData());
|
||
|
}));
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
return finish ? finish() : null;
|
||
|
};
|
||
|
RenderPromises.prototype.addObservableQueryPromise = function (obsQuery) {
|
||
|
return this.addQueryPromise({
|
||
|
getOptions: function () { return obsQuery.options; },
|
||
|
fetchData: function () {
|
||
|
return new Promise(function (resolve) {
|
||
|
var sub = obsQuery.subscribe({
|
||
|
next: function (result) {
|
||
|
if (!result.loading) {
|
||
|
resolve();
|
||
|
sub.unsubscribe();
|
||
|
}
|
||
|
},
|
||
|
error: function () {
|
||
|
resolve();
|
||
|
sub.unsubscribe();
|
||
|
},
|
||
|
complete: function () {
|
||
|
resolve();
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
},
|
||
|
});
|
||
|
};
|
||
|
RenderPromises.prototype.hasPromises = function () {
|
||
|
return this.queryPromises.size > 0;
|
||
|
};
|
||
|
RenderPromises.prototype.consumeAndAwaitPromises = function () {
|
||
|
var _this = this;
|
||
|
var promises = [];
|
||
|
this.queryPromises.forEach(function (promise, queryInstance) {
|
||
|
_this.lookupQueryInfo(queryInstance).seen = true;
|
||
|
promises.push(promise);
|
||
|
});
|
||
|
this.queryPromises.clear();
|
||
|
return Promise.all(promises);
|
||
|
};
|
||
|
RenderPromises.prototype.lookupQueryInfo = function (props) {
|
||
|
var queryInfoTrie = this.queryInfoTrie;
|
||
|
var query = props.query, variables = props.variables;
|
||
|
var varMap = queryInfoTrie.get(query) || new Map();
|
||
|
if (!queryInfoTrie.has(query))
|
||
|
queryInfoTrie.set(query, varMap);
|
||
|
var variablesString = JSON.stringify(variables);
|
||
|
var info = varMap.get(variablesString) || makeDefaultQueryInfo();
|
||
|
if (!varMap.has(variablesString))
|
||
|
varMap.set(variablesString, info);
|
||
|
return info;
|
||
|
};
|
||
|
return RenderPromises;
|
||
|
}());
|
||
|
|
||
|
function getDataFromTree(tree, context) {
|
||
|
if (context === void 0) { context = {}; }
|
||
|
return getMarkupFromTree({
|
||
|
tree: tree,
|
||
|
context: context,
|
||
|
renderFunction: server.renderToStaticMarkup,
|
||
|
});
|
||
|
}
|
||
|
function getMarkupFromTree(_a) {
|
||
|
var tree = _a.tree, _b = _a.context, context$1 = _b === void 0 ? {} : _b,
|
||
|
_c = _a.renderFunction,
|
||
|
renderFunction = _c === void 0 ? server.renderToStaticMarkup : _c;
|
||
|
var renderPromises = new RenderPromises();
|
||
|
function process() {
|
||
|
var ApolloContext = context.getApolloContext();
|
||
|
return new Promise(function (resolve) {
|
||
|
var element = React__namespace.createElement(ApolloContext.Provider, { value: tslib.__assign(tslib.__assign({}, context$1), { renderPromises: renderPromises }) }, tree);
|
||
|
resolve(renderFunction(element));
|
||
|
})
|
||
|
.then(function (html) {
|
||
|
return renderPromises.hasPromises() ?
|
||
|
renderPromises.consumeAndAwaitPromises().then(process)
|
||
|
: html;
|
||
|
})
|
||
|
.finally(function () {
|
||
|
renderPromises.stop();
|
||
|
});
|
||
|
}
|
||
|
return Promise.resolve().then(process);
|
||
|
}
|
||
|
|
||
|
function renderToStringWithData(component) {
|
||
|
return getMarkupFromTree({
|
||
|
tree: component,
|
||
|
renderFunction: server.renderToString,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
exports.RenderPromises = RenderPromises;
|
||
|
exports.getDataFromTree = getDataFromTree;
|
||
|
exports.getMarkupFromTree = getMarkupFromTree;
|
||
|
exports.renderToStringWithData = renderToStringWithData;
|
||
|
//# sourceMappingURL=ssr.cjs.map
|