app-state-utils
Version:
A set of utilities for state management in web apps, integrates well with front-end state management libraries like redux and vuex, and can be used on server side as well. It defines methods for mutating keys and values in a conventional javascript object
96 lines (83 loc) • 14.7 kB
JavaScript
;var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.logState=void 0;var _typeof2=_interopRequireDefault(require("@babel/runtime/helpers/typeof"));/**
* @author Peter Collins - https://github.com/onepetercollins
*
* @fileoverview : Exports a function: logState(state, payload)
*
* @function logState : To log current state or a selected part of it to the console for inspection.
*
* @param {Object} state Current state.
* @param {Object} payload { name: String, child: Array }
* @param {String} payload.name Name of the key to log or second object in the nesting hieriarchy.
* @param {Array} payload.child Array of strings pointing to the nested value to log.
* @returns {Function} (local function) (payload) => : Current app state, it does not alter the state.
*/
var logState=function logState(state,payload){
/**
* @param {Object} payload { name: String, child: Array }
* @param {String} payload.name Name of the key to log or second object in the nesting hieriarchy.
* @param {Array} payload.child Array of strings pointing to the nested value to log.
* @returns {Object} { state } : Current app state, it does not alter the state.
*/
return function(){var payloadInherited=arguments.length>0&&arguments[0]!==undefined?arguments[0]:payload||{name:null,child:[]};
var currentState=JSON.parse(JSON.stringify(state));
var name=payloadInherited.name,child=payloadInherited.child;
var nameField=name;
var children=child;
var testArray=state?Array.from(state):null;
var snapshots=[];
var date=new Date();
var pathString="state.".concat(nameField);
if((0,_typeof2.default)(state)!=='object'||state[state.length-1]===testArray.pop()&&typeof testArray.pop()!=="undefined"){
console.error("[state] must be a valid javascript object");
return state;
}
if((0,_typeof2.default)(children)==="object")/* check if 'children' is an empty array and nullify it */{
if(children.length===0&&typeof children[children.length-1]==="undefined"){
children=null;
}
}
if(!payloadInherited.name){
console.log("\n app state @ ".concat(date.getHours(),":").concat(date.getMinutes(),":").concat(date.getSeconds()));
console.log(state);
return state;
}else{
if(!children&&!currentState.hasOwnProperty(nameField)){
console.error("The referenced property '".concat(nameField,"' does not exist in current state."));
return state;
}else if(!children&¤tState.hasOwnProperty(nameField))/* log state to console */{
console.log("\n \n app state @ ".concat(
date.getHours(),":").concat(date.getMinutes(),":").concat(date.getSeconds(),"\n \n ").concat(
pathString," :\n "));
console.log(state[nameField]);
return state;
}else if(children.length){
for(var index=0;index<children.length;index++){
if(!snapshots.length){
pathString+=".".concat(children[index]);
if(index===children.length-1){
console.log("\n \n app state @ ".concat(
date.getHours(),":").concat(date.getMinutes(),":").concat(date.getSeconds(),"\n \n ").concat(
pathString," :\n "));
console.log(state[nameField][children[index]]);
}else{
snapshots.push(state[nameField][children[index]]);
}
}else{
pathString+=".".concat(children[index]);
if(index!==children.length-1){
snapshots.push(snapshots[snapshots.length-1][children[index]]);
}else{
snapshots.push(snapshots[snapshots.length-1][children[index]]);
console.log("\n \n app state @ ".concat(
date.getHours(),":").concat(date.getMinutes(),":").concat(date.getSeconds(),"\n \n ").concat(
pathString," :\n "));
console.log(snapshots[snapshots.length-1]);
}
}
}
return state;
}
}
};
};exports.logState=logState;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxvZ1N0YXRlLmpzIl0sIm5hbWVzIjpbImxvZ1N0YXRlIiwic3RhdGUiLCJwYXlsb2FkIiwicGF5bG9hZEluaGVyaXRlZCIsIm5hbWUiLCJjaGlsZCIsImN1cnJlbnRTdGF0ZSIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsIm5hbWVGaWVsZCIsImNoaWxkcmVuIiwidGVzdEFycmF5IiwiQXJyYXkiLCJmcm9tIiwic25hcHNob3RzIiwiZGF0ZSIsIkRhdGUiLCJwYXRoU3RyaW5nIiwibGVuZ3RoIiwicG9wIiwiY29uc29sZSIsImVycm9yIiwibG9nIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImhhc093blByb3BlcnR5IiwiaW5kZXgiLCJwdXNoIl0sIm1hcHBpbmdzIjoiK1BBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRVEsR0FBTUEsQ0FBQUEsUUFBUSxDQUFHLFFBQVhBLENBQUFBLFFBQVcsQ0FBQ0MsS0FBRCxDQUFRQyxPQUFSLENBQW9COztBQUV6QztBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUksTUFBTyxXQUFtRSxJQUF6REMsQ0FBQUEsZ0JBQXlELDJEQUF0Q0QsT0FBTyxFQUFJLENBQUVFLElBQUksQ0FBRSxJQUFSLENBQWNDLEtBQUssQ0FBRSxFQUFyQixDQUEyQjtBQUN0RSxHQUFJQyxDQUFBQSxZQUFZLENBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXRCxJQUFJLENBQUNFLFNBQUwsQ0FBZVIsS0FBZixDQUFYLENBQW5CO0FBQ0EsR0FBTUcsQ0FBQUEsSUFBTixDQUFzQkQsZ0JBQXRCLENBQU1DLElBQU4sQ0FBWUMsS0FBWixDQUFzQkYsZ0JBQXRCLENBQVlFLEtBQVo7QUFDQSxHQUFJSyxDQUFBQSxTQUFTLENBQUdOLElBQWhCO0FBQ0EsR0FBSU8sQ0FBQUEsUUFBUSxDQUFHTixLQUFmO0FBQ0EsR0FBSU8sQ0FBQUEsU0FBUyxD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TCxDQUFpQkMsUUFBUSxDQUFDaUIsS0FBRCxDQUF6QixDQUFmO0FBQ0g7QUFDSixDQVpELElBWU87QUFDSFYsVUFBVSxhQUFRUCxRQUFRLENBQUNpQixLQUFELENBQWhCLENBQVY7O0FBRUEsR0FBSUEsS0FBSyxHQUFNakIsUUFBUSxDQUFDUSxNQUFULENBQWtCLENBQWpDLENBQXFDO0FBQ2pDSixTQUFTLENBQUNjLElBQVYsQ0FBZWQsU0FBUyxDQUFDQSxTQUFTLENBQUNJLE1BQVYsQ0FBbUIsQ0FBcEIsQ0FBVCxDQUFnQ1IsUUFBUSxDQUFDaUIsS0FBRCxDQUF4QyxDQUFmO0FBQ0gsQ0FGRCxJQUVPO0FBQ0hiLFNBQVMsQ0FBQ2MsSUFBVixDQUFlZCxTQUFTLENBQUNBLFNBQVMsQ0FBQ0ksTUFBVixDQUFtQixDQUFwQixDQUFULENBQWdDUixRQUFRLENBQUNpQixLQUFELENBQXhDLENBQWY7O0FBRUFQLE9BQU8sQ0FBQ0UsR0FBUjtBQUNxQlAsSUFBSSxDQUFDUSxRQUFMLEVBRHJCLGFBQ3dDUixJQUFJLENBQUNTLFVBQUwsRUFEeEMsYUFDNkRULElBQUksQ0FBQ1UsVUFBTCxFQUQ3RDtBQUVTUixVQUZUOztBQUlBRyxPQUFPLENBQUNFLEdBQVIsQ0FBWVIsU0FBUyxDQUFDQSxTQUFTLENBQUNJLE1BQVYsQ0FBbUIsQ0FBcEIsQ0FBckI7QUFDSDtBQUNKO0FBQ0o7QUFDRCxNQUFPbEIsQ0FBQUEsS0FBUDtBQUNIO0FBQ0o7QUFDSixDQXJFRDtBQXNFSCxDQS9FTyxDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBhdXRob3IgUGV0ZXIgQ29sbGlucyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9vbmVwZXRlcmNvbGxpbnNcclxuICogXHJcbiAqIEBmaWxlb3ZlcnZpZXcgOiBFeHBvcnRzIGEgZnVuY3Rpb246IGxvZ1N0YXRlKHN0YXRlLCBwYXlsb2FkKVxyXG4gKiBcclxuICogQGZ1bmN0aW9uIGxvZ1N0YXRlIDogVG8gbG9nIGN1cnJlbnQgc3RhdGUgb3IgYSBzZWxlY3RlZCBwYXJ0IG9mIGl0IHRvIHRoZSBjb25zb2xlIGZvciBpbnNwZWN0aW9uLlxyXG4gKiBcclxuICogQHBhcmFtICAge09iamVjdH0gICBzdGF0ZSBDdXJyZW50IHN0YXRlLlxyXG4gKiBAcGFyYW0gICB7T2JqZWN0fSAgIHBheWxvYWQgeyBuYW1lOiBTdHJpbmcsIGNoaWxkOiBBcnJheSB9XHJcbiAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgcGF5bG9hZC5uYW1lIE5hbWUgb2YgdGhlIGtleSB0byBsb2cgb3Igc2Vjb25kIG9iamVjdCBpbiB0aGUgbmVzdGluZyBoaWVyaWFyY2h5LlxyXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgIHBheWxvYWQuY2hpbGQgQXJyYXkgb2Ygc3RyaW5ncyBwb2ludGluZyB0byB0aGUgbmVzdGVkIHZhbHVlIHRvIGxvZy5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSAobG9jYWwgZnVuY3Rpb24pIChwYXlsb2FkKSA9PiA6IEN1cnJlbnQgYXBwIHN0YXRlLCBpdCBkb2VzIG5vdCBhbHRlciB0aGUgc3RhdGUuXHJcbiAqL1xyXG5cclxuIGV4cG9ydCBjb25zdCBsb2dTdGF0ZSA9IChzdGF0ZSwgcGF5bG9hZCkgPT4ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtICAge09iamVjdH0gcGF5bG9hZCB7IG5hbWU6IFN0cmluZywgY2hpbGQ6IEFycmF5IH1cclxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd9IHBheWxvYWQubmFtZSBOYW1lIG9mIHRoZSBrZXkgdG8gbG9nIG9yIHNlY29uZCBvYmplY3QgaW4gdGhlIG5lc3RpbmcgaGllcmlhcmNoeS5cclxuICAgICAqIEBwYXJhbSAgIHtBcnJheX0gIHBheWxvYWQuY2hpbGQgQXJyYXkgb2Ygc3RyaW5ncyBwb2ludGluZyB0byB0aGUgbmVzdGVkIHZhbHVlIHRvIGxvZy5cclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHsgc3RhdGUgfSA6IEN1cnJlbnQgYXBwIHN0YXRlLCBpdCBkb2VzIG5vdCBhbHRlciB0aGUgc3RhdGUuXHJcbiAgICAgKi9cclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHBheWxvYWRJbmhlcml0ZWQgPSBwYXlsb2FkIHx8IHsgbmFtZTogbnVsbCwgY2hpbGQ6IFtdIH0pIHtcclxuICAgICAgICBsZXQgY3VycmVudFN0YXRlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xyXG4gICAgICAgIGxldCB7IG5hbWUsIGNoaWxkIH0gPSBwYXlsb2FkSW5oZXJpdGVkO1xyXG4gICAgICAgIGxldCBuYW1lRmllbGQgPSBuYW1lO1xyXG4gICAgICAgIGxldCBjaGlsZHJlbiA9IGNoaWxkO1xyXG4gICAgICAgIGxldCB0ZXN0QXJyYXkgPSBzdGF0ZSA/IEFycmF5LmZyb20oc3RhdGUpIDogbnVsbFxyXG4gICAgICAgIGxldCBzbmFwc2hvdHMgPSBbXTtcclxuICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBgc3RhdGUuJHtuYW1lRmllbGR9YDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZSAhPT0gJ29iamVjdCcgfHwgKHN0YXRlW3N0YXRlLmxlbmd0aCAtIDFdID09PSB0ZXN0QXJyYXkucG9wKCkgJiYgdHlwZW9mIHRlc3RBcnJheS5wb3AoKSAhPT0gXCJ1bmRlZmluZWRcIikpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW3N0YXRlXSBtdXN0IGJlIGEgdmFsaWQgamF2YXNjcmlwdCBvYmplY3RgKTtcclxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09IFwib2JqZWN0XCIpIC8qIGNoZWNrIGlmICdjaGlsZHJlbicgaXMgYW4gZW1wdHkgYXJyYXkgYW5kIG51bGxpZnkgaXQgKi8ge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHR5cGVvZiBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXBheWxvYWRJbmhlcml0ZWQubmFtZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgXFxuIGFwcCBzdGF0ZSBAICR7ZGF0ZS5nZXRIb3VycygpfToke2RhdGUuZ2V0TWludXRlcygpfToke2RhdGUuZ2V0U2Vjb25kcygpfWApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhzdGF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghY2hpbGRyZW4gJiYgIWN1cnJlbnRTdGF0ZS5oYXNPd25Qcm9wZXJ0eShuYW1lRmllbGQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBUaGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSAnJHtuYW1lRmllbGR9JyBkb2VzIG5vdCBleGlzdCBpbiBjdXJyZW50IHN0YXRlLmApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGlsZHJlbiAmJiBjdXJyZW50U3RhdGUuaGFzT3duUHJvcGVydHkobmFtZUZpZWxkKSkgLyogbG9nIHN0YXRlIHRvIGNvbnNvbGUgKi8ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFxyXG4gICAgICAgICAgICAgICAgICAgIFxcbiBhcHAgc3RhdGUgQCAke2RhdGUuZ2V0SG91cnMoKX06JHtkYXRlLmdldE1pbnV0ZXMoKX06JHtkYXRlLmdldFNlY29uZHMoKX1cclxuICAgICAgICAgICAgICAgICAgICBcXG4gJHtwYXRoU3RyaW5nfSA6XHJcbiAgICAgICAgICAgICAgICBgKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0YXRlW25hbWVGaWVsZF0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc25hcHNob3RzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoU3RyaW5nICs9IGAuJHtjaGlsZHJlbltpbmRleF19YDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gKGNoaWxkcmVuLmxlbmd0aCAtIDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxuIGFwcCBzdGF0ZSBAICR7ZGF0ZS5nZXRIb3VycygpfToke2RhdGUuZ2V0TWludXRlcygpfToke2RhdGUuZ2V0U2Vjb25kcygpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAke3BhdGhTdHJpbmd9IDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coc3RhdGVbbmFtZUZpZWxkXVtjaGlsZHJlbltpbmRleF1dKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90cy5wdXNoKHN0YXRlW25hbWVGaWVsZF1bY2hpbGRyZW5baW5kZXhdXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoU3RyaW5nICs9IGAuJHtjaGlsZHJlbltpbmRleF19YDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gKGNoaWxkcmVuLmxlbmd0aCAtIDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdHMucHVzaChzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdW2NoaWxkcmVuW2luZGV4XV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3RzLnB1c2goc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXVtjaGlsZHJlbltpbmRleF1dKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxuIGFwcCBzdGF0ZSBAICR7ZGF0ZS5nZXRIb3VycygpfToke2RhdGUuZ2V0TWludXRlcygpfToke2RhdGUuZ2V0U2Vjb25kcygpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAke3BhdGhTdHJpbmd9IDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19