UNPKG

gambit

Version:

A hyper-thin library to help building API driven redux apps

114 lines (87 loc) 4.02 kB
'use strict'; 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; }