UNPKG

respond-framework

Version:
56 lines (55 loc) 1.99 kB
"use strict"; 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 }