minska
Version:
A simple flux like store with reducers and effects
2 lines (1 loc) • 3.55 kB
JavaScript
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.Minska=t.Minska||{})}(this,function(t){"use strict";function n(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function e(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}var r=function(t){return"minska: "+t},i=function(t){return Object.keys(t).map(function(n){return"function"==typeof t[n]}).every(function(t){return t===!0})},s={formatMsg:r,validateObjHasOnlyFunctions:i},o=function(){function t(t,n){for(var e=0;e<n.length;e++){var r=n[e];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(n,e,r){return e&&t(n.prototype,e),r&&t(n,r),n}}(),a=Symbol("state"),u=Symbol("emit"),f=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.state,i=void 0===r?{}:r,o=n.reducers,u=void 0===o?{}:o,f=n.effects,c=void 0===f?{}:f,h=n.onError,l=void 0===h?function(){}:h,d=n.onAction,v=void 0===d?function(){}:d,b=n.onChange,p=void 0===b?function(){}:b;if(e(this,t),!s.validateObjHasOnlyFunctions(u))throw new Error(s.formatMsg("All reducers should be functions."));if(!s.validateObjHasOnlyFunctions(c))throw new Error(s.formatMsg("All effects should be functions."));this[a]=i,this.reducers=u,this.effects=c,this.subscriptions=[],this.events=["onError","onAction","onChange"],this.onError=l,this.onAction=v,this.onChange=p}return o(t,[{key:"send",value:function(t,e){if("string"!=typeof t){var r=new Error(s.formatMsg("Action name must be a string."));throw this[u]("onError",r,this.state),r}if("function"==typeof e){var i=new Error(s.formatMsg("Data must be a serializable value. A function was passed."));throw this[u]("onError",i,this.state),i}this[u]("onAction",t,e,this.state);var o=t.includes(":")?t.split(":")[0]:null,a=this.state;o&&a[o]?a=a[o]:o&&(a={});var f=this.effects[t],c=this.reducers[t];if(!f&&!c){var h=new Error(s.formatMsg("Can't find reducer or effect with name: "+t+"."));throw this[u]("onError",h,this.state),h}if(f)return Promise.resolve(f(this.state,e,this.send.bind(this)));var l=Object.assign({},c(a,e)),d=o?Object.assign({},this.state,n({},o,l)):l;return this[u]("onChange",d,this.state),this.state=d,d}},{key:"subscribe",value:function(t,n,e){if(!this.events.includes(t)){var r=new Error(s.formatMsg(t+" is not a valid event you can subscribe to."));throw this[u]("onError",r,this.state),r}this.subscriptions.push({event:t,id:n,fn:e})}},{key:"unsubscribe",value:function(t){if(!this.subscriptions.find(function(n){return n.id===t})){var n=new Error(s.formatMsg("Can't find subscriber with id \""+t+'".'));throw this[u]("onError",n,this.state),n}this.subscriptions=this.subscriptions.filter(function(n){return n.id!==t})}},{key:u,value:function(t){for(var n=arguments.length,e=Array(n>1?n-1:0),r=1;r<n;r++)e[r-1]=arguments[r];var i=this[t];i&&i.apply(void 0,e),this.subscriptions.filter(function(n){return n.event===t}).forEach(function(t){t.fn.apply(t,e)})}},{key:"state",get:function(){return this[a]},set:function(t){this.onChange(this.state,t),this[a]=t}}]),t}(),c=function(){for(var t=arguments.length,n=Array(t),e=0;e<t;e++)n[e]=arguments[e];return n.reduce(function(t,n){var e=n.namespace,r=e?e+":":"";return Object.keys(n).forEach(function(e){"namespace"!==e&&(t[""+r+e]=n[e])}),t},{})};t.Store=f,t.combine=c,t.utils=s,Object.defineProperty(t,"__esModule",{value:!0})});