!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("ReactDOM"),require("EventEmitterModule"),require("React"));else if("function"==typeof define&&define.amd)define(["ReactDOM","EventEmitterModule","React"],t);else{var n="object"==typeof exports?t(require("ReactDOM"),require("EventEmitterModule"),require("React")):t(e.ReactDOM,e.EventEmitterModule,e.React);for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,(function(e,t,n){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(t,n){t.exports=e},function(e,n){e.exports=t},function(e,t){e.exports=n},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.forView=t.isDomListener=t.isModelListener=t.findHandlerArguments=t.getListeners=t.event=t.on=void 0;const r=n(4),o=n(5),i=n(7);function s(e){const t=e.constructor.prototype._listenersMeta||[],n=[];t.push(...e.dynamicListeners);for(const r of t){let t,o=[];r.methodName?(t=e[r.methodName].bind(e),o=l(e,r.methodName)):(t=r.handler,o=r.handlerArgs);const i={eventType:r.eventType,selector:r.selector,handlerArgs:o,handler:t};n.push(i)}return n}function l(e,t){return(e.constructor.prototype._handlersArguments||[]).filter(e=>e.methodName===t).sort((e,t)=>e.argumentIndex-t.argumentIndex).map(e=>e.eventPropertyPath)}function c(e){return"function"==typeof e.selector&&e.selector.prototype instanceof r.Model}function u(e){return!c(e)}t.on=function(e,t){let n,r;if("function"==typeof e&&"function"==typeof t)throw new Error("invalid call, first argument and second cannot be a function at the same time");if("string"==typeof e){if(n=e,r=t,"string"==typeof r){const e=/^\.[\w-]+$/.test(r),t="window"===r;if(!(e||t))throw new Error(`invalid selector "${r}", selector should be just className like are ".some-class" or "window"`)}}else n=t,r=e;return(e,t,o)=>{e._listenersMeta||(e._listenersMeta=[]);const i={eventType:n,selector:r,methodName:t};e._listenersMeta.push(i)}},t.event=function(e,t,...n){return(r,o,i)=>{r._handlersArguments||(r._handlersArguments=[]);const s={methodName:o,argumentIndex:i,eventPropertyPath:[]};if(e)if("string"==typeof e){const r=[e];t&&r.push(t),n.length&&r.push(...n),s.eventPropertyPath=r}else{const t=e;s.eventPropertyPath=t}else s.eventPropertyPath=[];r._handlersArguments.push(s)}},t.getListeners=s,t.findHandlerArguments=l,t.isModelListener=c,t.isDomListener=u,t.forView=function(e,t){return n=>{o.mvcEvents.on("initView",r=>{r.view instanceof e&&function(e,r){const l=r.emit;r.emit=e=>{throw new Error(`${n.name}: it is forbidden to emit any model event inside the controller constructor. Triggered "${e}"`)};const c=t?t(r):new n(r),d=s(c).filter(u),a=[];for(const t of d){const n=new i.DOMListener({eventType:t.eventType,selector:t.selector,handlerArgs:t.handlerArgs,handler:t.handler,view:e});n.listen(),a.push(n)}o.mvcEvents.once("destroyView",t=>{if(t.view===e){for(const e of a)e.destroy();c.destroy(),a.splice(0)}}),r.emit=l}(r.view,r.model)})}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Model=void 0;const r=n(1);class o extends r.EventEmitter{set(e,t={}){const n={};let r=!1;for(const t in e){const o=e[t];o!==this[t]&&(r=!0,this[t]=o,n[t]=o)}r&&this.emit("change",n,t)}on(e,t){return super.on(e,t)}}t.Model=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.mvcEvents=void 0;const r=n(1);t.mvcEvents=new r.EventEmitter},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.forView=t.event=t.on=t.Controller=t.View=t.Model=t.EventEmitter=t.ReactDOM=t.React=void 0;const s=i(n(2));t.React=s;const l=i(n(0));t.ReactDOM=l;const c=n(1);Object.defineProperty(t,"EventEmitter",{enumerable:!0,get:function(){return c.EventEmitter}});const u=n(3);Object.defineProperty(t,"on",{enumerable:!0,get:function(){return u.on}}),Object.defineProperty(t,"event",{enumerable:!0,get:function(){return u.event}}),Object.defineProperty(t,"forView",{enumerable:!0,get:function(){return u.forView}});const d=n(4);Object.defineProperty(t,"Model",{enumerable:!0,get:function(){return d.Model}});const a=n(11);Object.defineProperty(t,"View",{enumerable:!0,get:function(){return a.View}});const f=n(12);if(Object.defineProperty(t,"Controller",{enumerable:!0,get:function(){return f.Controller}}),"undefined"!=typeof window){const e=window;e.MVC={React:s,ReactDOM:l,EventEmitter:c.EventEmitter,Model:d.Model,View:a.View,Controller:f.Controller,on:u.on,event:u.event,forView:u.forView},e.React||(e.React=s),e.ReactDOM||(e.ReactDOM=l),e.EventEmitter||(e.EventEmitter=c.EventEmitter)}},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.DOMListener=void 0;const s=i(n(0)),l=n(8),c=n(9),u=n(10);t.DOMListener=class{constructor(e){this.realEventType=function(e){if("blur"===e)return"focusout";if("focus"===e)return"focusin";return e}(e.eventType),this.selector=e.selector,this.handlerArgs=e.handlerArgs,this.handler=e.handler,this.view=e.view}listen(){this.domHandler=e=>{this.onDOMEvent(e)},window.addEventListener(this.realEventType,this.domHandler)}destroy(){window.removeEventListener(this.realEventType,this.domHandler),delete this.view,delete this.handler,delete this.domHandler,delete this.handlerArgs}onDOMEvent(e){const t=s.findDOMNode(this.view);if(this.isValidEvent(e,t)){const n=this.getCurrentTarget(e,t),r=this.getHandlerArgs(e,n);this.handler(...r)}}isValidEvent(e,t){return l.isValidTarget({componentEl:t,selector:this.selector,target:e.target})}getHandlerArgs(e,t){return this.handlerArgs.map(n=>this.getHandlerArgument(e,t,n))}getHandlerArgument(e,t,n){if("function"==typeof n){const t=n;return this.getHandlerArgumentByModel(e,t)}return c.getPropertyFromEvent(e,t,n)}getHandlerArgumentByModel(e,t){const n=u.getNearestModelByEvent(e,t);if(!n)throw new Error("cannot find model: "+t.name);return n}getCurrentTarget(e,t){if("function"==typeof this.selector){return t}let n=e.target;const r=this.selector.slice(1);for(;n;){if(n.classList&&n.classList.contains(r))return n;n=n.parentNode}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isValidTarget=void 0,t.isValidTarget=function(e){if("window"===e.selector)return!0;let t,n=e.target,r=!1,o=!1;if("string"==typeof e.selector){const n=e.selector.replace(".","");t=e=>e.classList.contains(n)}else{const n=e.selector;t=e=>e._view instanceof n}for(;n;){if(t(n)&&(o=!0),n===e.componentEl){r=!0;break}n=n.parentElement}return r&&o}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getPropertyFromEvent=void 0,t.getPropertyFromEvent=function(e,t,n){let r=e;for(const e of n){let n=r[e];"currentTarget"===e?n=t:"function"==typeof n&&(n=n.bind(r)),r=n}return r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getNearestModelByEvent=void 0,t.getNearestModelByEvent=function(e,t){let n=e.target;for(;n;){const e=n._view;if(e){const n=e.model;if(n instanceof t)return n}n=n.parentElement}return null}},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.View=void 0;const s=i(n(2)),l=i(n(0)),c=n(5);class u extends s.Component{constructor(e){super(e),this.onChangeModel=this.onChangeModel.bind(this),this.model=e.model,this.state=this.getStateByModel(this.model),this.listenModelChanges(),c.mvcEvents.emit("initView",{view:this,model:this.model})}render(){return this.template(this.model)}componentWillReceiveProps(e){this.stopListenModel(),this.model=e.model,this.listenModelChanges();const t=this.getStateByModel(this.model);this.setState(t)}componentDidMount(){l.findDOMNode(this)._view=this}componentWillUnmount(){this.onDestroy(),c.mvcEvents.emit("destroyView",{view:this,model:this.model});delete l.findDOMNode(this)._view,this.stopListenModel()}onDestroy(){}stopListenModel(){this.model.off("change",this.onChangeModel)}listenModelChanges(){this.model.on("change",this.onChangeModel)}onChangeModel(e){this.setState({...e})}getStateByModel(e){const t={...this.model},n=["_events","_eventsCount","_maxListeners"];for(const e of n)delete t[e];return t}}t.View=u},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Controller=void 0;const r=n(3);t.Controller=class{constructor(e){this.modelListeners=[],this.dynamicListeners=[],this.model=e,this.initModelEvents()}initModelEvents(){const e=r.getListeners(this).filter(e=>r.isModelListener(e));for(const t of e){const e=t.eventType,n=(...e)=>{t.handler(...e)};this.modelListeners.push({eventType:e,handler:n}),this.model.on(e,n)}}on(e,t,n){const o=r.findHandlerArguments(this,n.name);n=n.bind(this),this.dynamicListeners.push({eventType:e,selector:t,handler:n,handlerArgs:o})}destroy(){this.onDestroy();for(const e of this.modelListeners)this.model.removeListener(e.eventType,e.handler);delete this.model}onDestroy(){}}}])})); //# sourceMappingURL=only-mvc.min.js.map