@dark-engine/platform-server
Version:
Dark renderer for server
66 lines (65 loc) • 2.43 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
exports.inject = exports.roots = exports.render = void 0;
const core_1 = require('@dark-engine/core');
const dom_1 = require('../dom');
const utils_1 = require('../utils');
const isBrowser = (0, utils_1.detectIsBrowser)();
const roots = new Map();
exports.roots = roots;
const raf = isBrowser && requestAnimationFrame.bind(this);
const caf = isBrowser && cancelAnimationFrame.bind(this);
const spawn = raf;
let isInjected = false;
function inject() {
core_1.platform.createElement = dom_1.createNativeElement;
core_1.platform.toggle = dom_1.toggle;
core_1.platform.raf = raf;
core_1.platform.caf = caf;
core_1.platform.spawn = spawn;
core_1.platform.commit = dom_1.commit;
core_1.platform.finishCommit = dom_1.finishCommit;
core_1.platform.detectIsDynamic = core_1.trueFn;
isInjected = true;
}
exports.inject = inject;
function render(element, container, hydrate) {
!isInjected && inject();
if (process.env.NODE_ENV !== 'production') {
if (!(container instanceof Element) && !(container instanceof Document)) {
(0, utils_1.illegal)(`The render receives a valid element as container!`);
}
}
const isMounted = !(0, core_1.detectIsUndefined)(roots.get(container));
const isHydration = (0, core_1.detectIsFunction)(hydrate);
let rootId = null;
if (!isMounted) {
rootId = roots.size;
roots.set(container, rootId);
!isHydration && (0, utils_1.removeContent)(container);
} else {
rootId = roots.get(container);
}
const $scope = (0, core_1.$$scope)(rootId);
if ($scope?.getIsInsertionEffect()) return;
const callback = () => {
(0, core_1.setRootId)(rootId);
const $scope = (0, core_1.$$scope)();
const rootFiber = $scope.getRoot();
const isUpdate = Boolean(rootFiber);
const fiber = new core_1.Fiber().mutate({
el: container,
inst: new core_1.TagVirtualNode(core_1.ROOT, {}, (0, core_1.flatten)([element || (0, core_1.createReplacer)()])),
alt: rootFiber,
tag: isUpdate ? core_1.UPDATE_EFFECT_TAG : core_1.CREATE_EFFECT_TAG,
});
$scope.resetMount();
$scope.setWorkInProgress(fiber);
$scope.setIsHydration(isHydration);
$scope.setUnitOfWork(fiber);
isHydration && hydrate();
};
core_1.scheduler.schedule(callback, { priority: core_1.TaskPriority.NORMAL });
}
exports.render = render;
//# sourceMappingURL=render.js.map