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.
157 lines
5.3 KiB
157 lines
5.3 KiB
'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
|
|
|