react-imported-component
Version:
I will import your component, and help to handle it
78 lines (77 loc) • 2.59 kB
JavaScript
import { checkStream, clearStream, defaultStream } from './stream';
import { markerOverlap } from './utils';
var LOADABLE_MARKS = new Map();
export var consumeMark = function (stream, marks) {
if (stream === void 0) { stream = defaultStream; }
checkStream(stream);
if (marks && marks.length) {
marks.forEach(function (a) { return (stream.marks[a] = true); });
}
};
export var assignLoadableMark = function (mark, loadable) {
LOADABLE_MARKS.set(JSON.stringify(mark), { mark: mark, loadable: loadable });
};
/**
* returns marks used in the stream
* @param stream
*/
export var getUsedMarks = function (stream) {
if (stream === void 0) { stream = defaultStream; }
return (stream ? Object.keys(stream.marks) : []);
};
/**
* SSR
* @returns list or marks used
*/
export var drainHydrateMarks = function (stream) {
if (stream === void 0) { stream = defaultStream; }
checkStream(stream);
var marks = getUsedMarks(stream);
clearStream(stream);
return marks;
};
/**
* Loads a given marks/chunks
* @see returns a promise for a given marks only. In order to await all requests currently in flight use {@link waitForMarks}
* @param marks
* @returns a resolution promise
*/
export var rehydrateMarks = function (marks) {
var rehydratedMarks = marks || global.___REACT_DEFERRED_COMPONENT_MARKS || [];
var tasks = [];
var usedMarks = new Set();
LOADABLE_MARKS.forEach(function (_a) {
var mark = _a.mark, loadable = _a.loadable;
if (markerOverlap(mark, rehydratedMarks)) {
mark.forEach(function (m) { return usedMarks.add(m); });
tasks.push(loadable.load());
}
});
rehydratedMarks.forEach(function (m) {
if (!usedMarks.has(m)) {
throw new Error("react-imported-component: unknown mark(" + m + ") has been used. Client and Server should have the same babel configuration.");
}
});
return Promise.all(tasks);
};
/**
* waits for the given marks to load
* @param marks
*/
export var waitForMarks = function (marks) {
var tasks = [];
LOADABLE_MARKS.forEach(function (_a) {
var mark = _a.mark, loadable = _a.loadable;
if (markerOverlap(mark, marks)) {
tasks.push(loadable.resolution);
}
});
return Promise.all(tasks);
};
/**
* @returns a <script> tag with all used marks
*/
export var printDrainHydrateMarks = function (stream) {
checkStream(stream);
return "<script>window.___REACT_DEFERRED_COMPONENT_MARKS=" + JSON.stringify(drainHydrateMarks(stream)) + ";</script>";
};