respond-framework
Version:
create as fast you think
56 lines (55 loc) • 1.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.mergePrevState = mergePrevState;
var _getSessionState = require("./helpers/getSessionState.js");
var _reduce = require("./plugins/reduce.js");
var _reserved = require("./reserved.js");
const hydrateModules = (state, system) => {
const {
replayState,
baseState
} = system;
const {
status
} = replayState;
switch (status) {
case 'replay':
case 'reload':
{
hydrate(state, baseState); // baseState is standard server hydration if available + replayTools
(0, _reduce.default)(state, state.events.init());
}
case 'hmr':
{
hydrate(state, baseState); // baseState is HMR prevState + replayTools, as last event will be replayed on top of it
break;
}
case 'session':
{
const [curr, prev] = (0, _getSessionState.getSessionState)(state.respond); // we couldn't getSessionState at the beginning in getSystemState, as we must wait until all models/events are created for reviver to function correctly here
hydrate(state, curr);
mergePrevState(state, prev);
break;
}
}
};
var _default = exports.default = hydrateModules;
const hydrate = (state, baseState = {}) => {
state.moduleKeys.forEach(k => {
// depth-first
if (!baseState[k]) return;
hydrate(state[k], baseState[k]);
delete baseState[k]; // delete to prevent overwriting child modules..
});
Object.assign(state, baseState); // ...so parent receives shallow merge of everything except already assign child modules
};
function mergePrevState(state, prev = {}, parent = {}) {
state.moduleKeys.forEach(k => mergePrevState(state[k], prev[k], prev));
const proto = Object.getPrototypeOf(state);
proto.prevState = Object.assign(Object.create(proto), prev, {
[_reserved._parent]: parent
}); // need to create new object because snapshot has Object.preventExtensions
}