Skip to content

Commit f261284

Browse files
committed
include lib so we don't have to build it
1 parent 5f47016 commit f261284

File tree

6 files changed

+212
-1
lines changed

6 files changed

+212
-1
lines changed

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
node_modules
2-
lib

lib/createSlicer.js

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
exports['default'] = createSlicer;
7+
8+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
9+
10+
var _getSubsetJs = require('./getSubset.js');
11+
12+
var _getSubsetJs2 = _interopRequireDefault(_getSubsetJs);
13+
14+
var _utilTypeOfJs = require('./util/typeOf.js');
15+
16+
var _utilTypeOfJs2 = _interopRequireDefault(_utilTypeOfJs);
17+
18+
/**
19+
* @description
20+
* createSlicer inspects the typeof paths and returns an appropriate slicer function.
21+
*
22+
* @param {String|String[]} [paths] The paths argument supplied to persistState.
23+
*
24+
* @return {Function} A slicer function, which returns the subset to store when called with Redux's store state.
25+
*/
26+
27+
function createSlicer(paths) {
28+
switch ((0, _utilTypeOfJs2['default'])(paths)) {
29+
case 'void':
30+
return function (state) {
31+
return state;
32+
};
33+
case 'string':
34+
return function (state) {
35+
return (0, _getSubsetJs2['default'])(state, [paths]);
36+
};
37+
case 'array':
38+
return function (state) {
39+
return (0, _getSubsetJs2['default'])(state, paths);
40+
};
41+
default:
42+
return console.error('Invalid paths argument, should be of type String, Array or Void');
43+
}
44+
}
45+
46+
module.exports = exports['default'];

lib/getSubset.js

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* @description
3+
* getSubset returns an object with the same structure as the original object passed in,
4+
* but contains only the specified keys and only if that key has a truth-y value.
5+
*
6+
* @param {Object} obj The object from which to create a subset.
7+
* @param {String[]} paths An array of (top-level) keys that should be included in the subset.
8+
*
9+
* @return {Object} An object that contains the specified keys with truth-y values
10+
*/
11+
"use strict";
12+
13+
Object.defineProperty(exports, "__esModule", {
14+
value: true
15+
});
16+
exports["default"] = getSubset;
17+
18+
function getSubset(obj, paths) {
19+
var subset = {};
20+
21+
paths.forEach(function (key) {
22+
var slice = obj[key];
23+
if (slice) subset[key] = slice;
24+
});
25+
26+
return subset;
27+
}
28+
29+
module.exports = exports["default"];

lib/persistState.js

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
7+
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
8+
9+
exports['default'] = persistState;
10+
11+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
12+
13+
var _createSlicerJs = require('./createSlicer.js');
14+
15+
var _createSlicerJs2 = _interopRequireDefault(_createSlicerJs);
16+
17+
var _utilMergeStateJs = require('./util/mergeState.js');
18+
19+
var _utilMergeStateJs2 = _interopRequireDefault(_utilMergeStateJs);
20+
21+
/**
22+
* @description
23+
* persistState is a Store Enhancer that syncs (a subset of) store state to localStorage.
24+
*
25+
* @param {String|String[]} [paths] Specify keys to sync with localStorage, if left undefined the whole store is persisted
26+
* @param {Object} [config] Optional config object
27+
* @param {String} [config.key="redux"] String used as localStorage key
28+
* @param {Function} [config.slicer] (paths) => (state) => subset. A function that returns a subset
29+
* of store state that should be persisted to localStorage
30+
* @param {Function} [config.serialize=JSON.stringify] (subset) => serializedData. Called just before persisting to
31+
* localStorage. Should transform the subset into a format that can be stored.
32+
* @param {Function} [config.deserialize=JSON.parse] (persistedData) => subset. Called directly after retrieving
33+
* persistedState from localStorage. Should transform the data into the format expected by your application
34+
*
35+
* @return {Function} An enhanced store
36+
*/
37+
38+
function persistState(paths, config) {
39+
var cfg = _extends({
40+
key: 'redux',
41+
merge: _utilMergeStateJs2['default'],
42+
slicer: _createSlicerJs2['default'],
43+
serialize: JSON.stringify,
44+
deserialize: JSON.parse
45+
}, config);
46+
47+
var key = cfg.key;
48+
var merge = cfg.merge;
49+
var slicer = cfg.slicer;
50+
var serialize = cfg.serialize;
51+
var deserialize = cfg.deserialize;
52+
53+
return function (next) {
54+
return function (reducer, initialState, enhancer) {
55+
if (typeof initialState === 'function' && typeof enhancer === 'undefined') {
56+
enhancer = initialState;
57+
initialState = undefined;
58+
}
59+
60+
var persistedState = undefined;
61+
var finalInitialState = undefined;
62+
63+
try {
64+
persistedState = deserialize(localStorage.getItem(key));
65+
finalInitialState = merge(initialState, persistedState);
66+
} catch (e) {
67+
console.warn('Failed to retrieve initialize state from localStorage:', e);
68+
}
69+
70+
var store = next(reducer, finalInitialState, enhancer);
71+
var slicerFn = slicer(paths);
72+
73+
store.subscribe(function () {
74+
var state = store.getState();
75+
var subset = slicerFn(state);
76+
77+
try {
78+
localStorage.setItem(key, serialize(subset));
79+
} catch (e) {
80+
console.warn('Unable to persist state to localStorage:', e);
81+
}
82+
});
83+
84+
return store;
85+
};
86+
};
87+
}
88+
89+
module.exports = exports['default'];

lib/util/mergeState.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
7+
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
8+
9+
exports["default"] = mergeState;
10+
11+
function mergeState(initialState, persistedState) {
12+
return persistedState ? _extends({}, initialState, persistedState) : initialState;
13+
}
14+
15+
module.exports = exports["default"];

lib/util/typeOf.js

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
exports['default'] = typeOf;
7+
var _isArray = Array.isArray || (Array.isArray = function (a) {
8+
return '' + a !== a && ({}).toString.call(a) === '[object Array]';
9+
});
10+
11+
/**
12+
* @description
13+
* typeof method that
14+
* 1. groups all false-y & empty values as void
15+
* 2. distinguishes between object and array
16+
*
17+
* @param {*} thing The thing to inspect
18+
*
19+
* @return {String} Actionable type classification
20+
*/
21+
22+
function typeOf(thing) {
23+
if (!thing) return 'void';
24+
25+
if (_isArray(thing)) {
26+
if (!thing.length) return 'void';
27+
return 'array';
28+
}
29+
30+
return typeof thing;
31+
}
32+
33+
module.exports = exports['default'];

0 commit comments

Comments
 (0)