UNPKG

5.8 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4exports.__esModule = true;
5exports.readState = exports.loadPartialStateFromDisk = exports.emitter = exports.configureStore = void 0;
6exports.replaceReducer = replaceReducer;
7exports.store = exports.saveState = exports.savePartialStateToDisk = void 0;
8var _pick2 = _interopRequireDefault(require("lodash/pick"));
9var _redux = require("redux");
10var _gatsbyTelemetry = _interopRequireDefault(require("gatsby-telemetry"));
11var _mett = require("../utils/mett");
12var _reduxThunk = _interopRequireDefault(require("redux-thunk"));
13var rawReducers = _interopRequireWildcard(require("./reducers"));
14var _persist = require("./persist");
15function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17const persistedReduxKeys = [`nodes`, `typeOwners`, `statefulSourcePlugins`, `status`, `components`, `jobsV2`, `staticQueryComponents`, `webpackCompilationHash`, `pageDataStats`, `pages`, `staticQueriesByTemplate`, `pendingPageDataWrites`, `queries`, `html`, `slices`, `slicesByTemplate`];
18const reducers = persistedReduxKeys.reduce((acc, key) => {
19 const rawReducer = rawReducers[key];
20 acc[key] = function (state, action) {
21 if (action.type === `RESTORE_CACHE` && action.payload[key]) {
22 return action.payload[key];
23 } else {
24 return rawReducer(state, action);
25 }
26 };
27 return acc;
28}, rawReducers);
29
30// Create event emitter for actions
31const emitter = (0, _mett.mett)();
32
33// Read old node data from cache.
34exports.emitter = emitter;
35const readState = () => {
36 try {
37 const state = (0, _persist.readFromCache)();
38 if (state.nodes) {
39 // re-create nodesByType
40 state.nodesByType = new Map();
41 state.nodes.forEach(node => {
42 const {
43 type
44 } = node.internal;
45 if (!state.nodesByType.has(type)) {
46 state.nodesByType.set(type, new Map());
47 }
48 // The `.has` and `.set` calls above make this safe
49 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
50 state.nodesByType.get(type).set(node.id, node);
51 });
52 }
53
54 // jsonDataPaths was removed in the per-page-manifest
55 // changes. Explicitly delete it here to cover case where user
56 // runs gatsby the first time after upgrading.
57 delete state[`jsonDataPaths`];
58 _gatsbyTelemetry.default.trackCli(`CACHE_STATUS`, {
59 cacheStatus: `WARM`
60 });
61 return state;
62 } catch (e) {
63 _gatsbyTelemetry.default.trackCli(`CACHE_STATUS`, {
64 cacheStatus: `COLD`
65 });
66 return {};
67 }
68};
69exports.readState = readState;
70/**
71 * Redux middleware handling array of actions
72 */
73const multi = ({
74 dispatch
75}) => next => action => Array.isArray(action) ? action.filter(Boolean).map(dispatch) : next(action);
76const configureStore = initialState => {
77 const store = (0, _redux.createStore)((0, _redux.combineReducers)({
78 ...reducers
79 }), initialState, (0, _redux.applyMiddleware)(_reduxThunk.default, multi));
80 store.dispatch({
81 type: `INIT`
82 });
83 return store;
84};
85exports.configureStore = configureStore;
86const store = configureStore(process.env.GATSBY_WORKER_POOL_WORKER ? {} : readState());
87
88/**
89 * Allows overloading some reducers (e.g. when setting a custom datastore)
90 */
91exports.store = store;
92function replaceReducer(customReducers) {
93 store.replaceReducer((0, _redux.combineReducers)({
94 ...reducers,
95 ...customReducers
96 }));
97}
98
99// Persist state.
100const saveState = () => {
101 if (process.env.GATSBY_DISABLE_CACHE_PERSISTENCE) {
102 // do not persist cache if above env var is set.
103 // this is to temporarily unblock builds that hit the v8.serialize related
104 // Node.js buffer size exceeding kMaxLength fatal crashes
105 return undefined;
106 }
107 const state = store.getState();
108 const sliceOfStateToPersist = (0, _pick2.default)(state, persistedReduxKeys);
109 return (0, _persist.writeToCache)(sliceOfStateToPersist);
110};
111exports.saveState = saveState;
112const savePartialStateToDisk = (slices, optionalPrefix, transformState) => {
113 const state = store.getState();
114 const contents = (0, _pick2.default)(state, slices);
115 const savedContents = transformState ? transformState(contents) : contents;
116 return (0, _persist.writeToCache)(savedContents, slices, optionalPrefix);
117};
118exports.savePartialStateToDisk = savePartialStateToDisk;
119const loadPartialStateFromDisk = (slices, optionalPrefix) => {
120 try {
121 return (0, _persist.readFromCache)(slices, optionalPrefix);
122 } catch (e) {
123 // ignore errors.
124 }
125 return {};
126};
127exports.loadPartialStateFromDisk = loadPartialStateFromDisk;
128store.subscribe(() => {
129 const lastAction = store.getState().lastAction;
130 emitter.emit(lastAction.type, lastAction);
131});
132//# sourceMappingURL=index.js.map
\No newline at end of file