gambit
Version:
A hyper-thin library to help building API driven redux apps
114 lines (87 loc) • 4.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = wrappedStateFactory;
var _invariant = require('invariant');
var _invariant2 = _interopRequireDefault(_invariant);
var _immutable = require('immutable');
var _dict = require('./dict');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var alteringMethods = ['updateIn', 'deleteIn', 'delete', 'update', 'merge', 'mergeIn', 'mergeWith', 'mergeDeepWith', 'mergeDeep', 'mergeIn', 'mergeDeepIn']; /* eslint-disable max-len */
function confirmInteger(args, _ref) {
var key = _ref.key;
var target = _ref.target;
var type = _ref.type;
if (!Array.isArray(args)) {
args = [args];
}
args.forEach(function (argument) {
(0, _invariant2.default)(typeof argument !== 'string' || isNaN(parseInt(argument, 10)) || argument.length !== parseInt(argument, 10).toString().length, (0, _dict.integerAsString)(type, argument, key, args));
});
}
function confirmNotUndefined(setKey, setValue, _ref2) {
var key = _ref2.key;
var target = _ref2.target;
setKey = Array.isArray(setKey) ? setKey : [setKey];
(0, _invariant2.default)(typeof setValue !== 'undefined', (0, _dict.valueUndefined)(setKey, key));
}
function confirmKeyNotUndefined(setKey, _ref3) {
var key = _ref3.key;
var type = _ref3.type;
setKey = Array.isArray(setKey) ? setKey : [setKey];
(0, _invariant2.default)(setKey.indexOf(undefined) === -1 && setKey.indexOf('undefined') === -1, (0, _dict.keyUndefined)(setKey, key));
}
function confirmCorrectCall(name, setKey, _ref4) {
var key = _ref4.key;
var type = _ref4.type;
if (Array.isArray(setKey)) {
(0, _invariant2.default)(name === 'setIn' || name === 'getIn', (0, _dict.keyIsArray)(setKey, key, type));
}
if (!Array.isArray(setKey)) {
(0, _invariant2.default)(name === 'set' || name === 'get', (0, _dict.keyIsntArray)(setKey, key, type));
}
}
function wrappedStateFactory(stateObj, _ref5) {
var key = _ref5.key;
var strictMode = _ref5.strictMode;
var self = wrappedStateFactory;
var handler = {
get: function get(target, name) {
if (name === 'isProxied') {
return true;
}
return function () {
try {
if (name === 'set' || name === 'setIn') {
if (strictMode) {
confirmInteger(arguments.length <= 0 ? undefined : arguments[0], { key: key, target: target, type: 'set' });
confirmNotUndefined(arguments.length <= 0 ? undefined : arguments[0], arguments.length <= 1 ? undefined : arguments[1], { key: key, target: target, type: 'set' });
confirmKeyNotUndefined(arguments.length <= 0 ? undefined : arguments[0], { key: key, target: target, type: 'set' });
confirmCorrectCall(name, arguments.length <= 0 ? undefined : arguments[0], { key: key, type: 'set' });
}
return self(target[name].apply(target, arguments), { key: key, strictMode: strictMode });
}
if (alteringMethods.indexOf(name) !== -1) {
return self(target[name].apply(target, arguments), { key: key, strictMode: strictMode });
}
if (name === 'get' || name === 'getIn') {
if (strictMode) {
confirmInteger(arguments.length <= 0 ? undefined : arguments[0], { key: key, target: target, type: 'get' });
confirmKeyNotUndefined(arguments.length <= 0 ? undefined : arguments[0], { key: key, target: target, type: 'get' });
confirmCorrectCall(name, arguments.length <= 0 ? undefined : arguments[0], { key: key, type: 'get' });
}
return target[name].apply(target, arguments);
}
} catch (e) {
console.warn(e);
}
return target[name].apply(target, arguments);
};
}
};
if (_immutable.Map.isMap(stateObj) && !stateObj.isProxied && typeof Proxy !== 'undefined') {
return new Proxy(stateObj, handler);
}
return stateObj;
}