vendor/assets/javascripts/dist/stimulus.umd.js in stimulusjs-rails-1.0.0 vs vendor/assets/javascripts/dist/stimulus.umd.js in stimulusjs-rails-1.1.1
- old
+ new
@@ -1,5 +1,1754 @@
/*
-Stimulus 1.0.1
-Copyright © 2018 Basecamp, LLC
+Stimulus 1.1.1
+Copyright © 2019 Basecamp, LLC
*/
-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Stimulus=e():t.Stimulus=e()}("undefined"!=typeof self?self:this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=0)}([function(t,e,n){"use strict";function r(t){throw new Error(t)}function o(t){return"window"==t?window:"document"==t?document:void 0}function i(t){return t==window?"window":t==document?"document":void 0}function c(t,e,n){u(t,e).add(n)}function s(t,e,n){u(t,e).delete(n),a(t,e)}function u(t,e){var n=t.get(e);return n||(n=new Set,t.set(e,n)),n}function a(t,e){var n=t.get(e);null!=n&&0==n.size&&t.delete(e)}function l(t){return t.toString().replace(/([A-Z])/g,function(t,e){return"-"+e.toLowerCase()})}function f(t,e){return"["+t+'~="'+e+'"]'}function h(t){return{identifier:t.identifier,controllerConstructor:p(t.controllerConstructor)}}function p(t){var e=I(t);return e.bless(),e}function d(t){var e=t.prototype;m(t).forEach(function(t){return b(e,(n={},n[t+"Target"]={get:function(){var e=this.targets.find(t);if(e)return e;throw new Error('Missing target element "'+this.identifier+"."+t+'"')}},n[t+"Targets"]={get:function(){return this.targets.findAll(t)}},n["has"+v(t)+"Target"]={get:function(){return this.targets.has(t)}},n));var n})}function m(t){var e=y(t);return Array.from(e.reduce(function(t,e){return g(e).forEach(function(e){return t.add(e)}),t},new Set))}function y(t){for(var e=[];t;)e.push(t),t=Object.getPrototypeOf(t);return e}function g(t){var e=t.targets;return Array.isArray(e)?e:[]}function b(t,e){Object.keys(e).forEach(function(n){if(!(n in t)){var r=e[n];Object.defineProperty(t,n,r)}})}function v(t){return t.charAt(0).toUpperCase()+t.slice(1)}Object.defineProperty(e,"__esModule",{value:!0});var E=function(){function t(t,e,n){this.context=t,this.descriptor=e,this.eventTarget=n}return t.prototype.connect=function(){this.eventTarget.addEventListener(this.eventName,this,!1)},t.prototype.disconnect=function(){this.eventTarget.removeEventListener(this.eventName,this,!1)},t.prototype.hasSameDescriptorAs=function(t){return null!=t&&t.descriptor.isEqualTo(this.descriptor)},t.prototype.handleEvent=function(t){this.willBeInvokedByEvent(t)&&this.invokeWithEvent(t)},Object.defineProperty(t.prototype,"eventName",{get:function(){return this.descriptor.eventName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"method",{get:function(){var t=this.controller[this.methodName];if("function"==typeof t)return t;throw new Error('Action "'+this.descriptor+'" references undefined method "'+this.methodName+'"')},enumerable:!0,configurable:!0}),t.prototype.invokeWithEvent=function(t){try{this.method.call(this.controller,t)}catch(e){this.context.handleError(e,'invoking action "'+this.descriptor+'"',{event:t})}},t.prototype.willBeInvokedByEvent=function(t){var e=t.target;return this.element===e||(!(e instanceof Element&&this.element.contains(e))||this.scope.containsElement(e))},Object.defineProperty(t.prototype,"controller",{get:function(){return this.context.controller},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"methodName",{get:function(){return this.descriptor.methodName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"scope",{get:function(){return this.context.scope},enumerable:!0,configurable:!0}),t}(),A=/^((.+?)(@(window|document))?->)?(.+?)#(.+)$/,O=function(){function t(t,e,n,r){this.identifier=t,this.eventName=e,this.methodName=n,this.eventTarget=r}return t.forOptions=function(e){return new t(e.identifier||r("Missing identifier in action descriptor"),e.eventName||r("Missing event name in action descriptor"),e.methodName||r("Missing method name in action descriptor"),e.eventTarget||r("Missing event target in action descriptor"))},t.forElementWithInlineDescriptorString=function(e,n){try{var r=this.parseOptionsFromInlineActionDescriptorString(n);return r.eventName=r.eventName||this.getDefaultEventNameForElement(e),r.eventTarget=r.eventTarget||e,t.forOptions(r)}catch(t){throw new Error('Bad action descriptor "'+n+'": '+t.message)}},t.parseOptionsFromInlineActionDescriptorString=function(t){var e=t.trim(),n=e.match(A)||r("Invalid action descriptor syntax");return{identifier:n[5],eventName:n[2],methodName:n[6],eventTarget:o(n[4])}},t.getDefaultEventNameForElement=function(t){return this.defaultEventNames[t.tagName.toLowerCase()](t)},Object.defineProperty(t.prototype,"eventTargetName",{get:function(){return i(this.eventTarget)},enumerable:!0,configurable:!0}),t.prototype.isEqualTo=function(t){return null!=t&&t.identifier==this.identifier&&t.eventName==this.eventName&&t.methodName==this.methodName&&t.eventTarget==this.eventTarget},t.prototype.toString=function(){var t=this.eventTargetName?"@"+this.eventTargetName:"";return""+this.eventName+t+"->"+this.identifier+"#"+this.methodName},t.defaultEventNames={a:function(t){return"click"},button:function(t){return"click"},form:function(t){return"submit"},input:function(t){return"submit"==t.getAttribute("type")?"click":"change"},select:function(t){return"change"},textarea:function(t){return"change"}},t}(),N=function(){function t(t){this.context=t,this.started=!1,this.actions=new Set}return t.prototype.start=function(){this.started||(this.started=!0,this.connectActions())},t.prototype.stop=function(){this.started&&(this.disconnectActions(),this.started=!1)},t.prototype.add=function(t){this.actions.has(t)||(t.connect(),this.actions.add(t))},t.prototype.delete=function(t){this.actions.has(t)&&(this.actions.delete(t),t.disconnect())},t.prototype.connectActions=function(){this.actions.forEach(function(t){return t.connect()})},t.prototype.disconnectActions=function(){this.actions.forEach(function(t){return t.disconnect()})},t}(),j=function(){function t(){this.valuesByKey=new Map}return Object.defineProperty(t.prototype,"values",{get:function(){return Array.from(this.valuesByKey.values()).reduce(function(t,e){return t.concat(Array.from(e))},[])},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){return Array.from(this.valuesByKey.values()).reduce(function(t,e){return t+e.size},0)},enumerable:!0,configurable:!0}),t.prototype.add=function(t,e){c(this.valuesByKey,t,e)},t.prototype.delete=function(t,e){s(this.valuesByKey,t,e)},t.prototype.has=function(t,e){var n=this.valuesByKey.get(t);return null!=n&&n.has(e)},t.prototype.hasKey=function(t){return this.valuesByKey.has(t)},t.prototype.hasValue=function(t){return Array.from(this.valuesByKey.values()).some(function(e){return e.has(t)})},t.prototype.getValuesForKey=function(t){var e=this.valuesByKey.get(t);return e?Array.from(e):[]},t.prototype.getKeysForValue=function(t){return Array.from(this.valuesByKey).filter(function(e){e[0];return e[1].has(t)}).map(function(t){var e=t[0];t[1];return e})},t}(),w=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),P=function(t){function e(){var e=t.call(this)||this;return e.keysByValue=new Map,e}return w(e,t),Object.defineProperty(e.prototype,"values",{get:function(){return Array.from(this.keysByValue.keys())},enumerable:!0,configurable:!0}),e.prototype.add=function(e,n){t.prototype.add.call(this,e,n),c(this.keysByValue,n,e)},e.prototype.delete=function(e,n){t.prototype.delete.call(this,e,n),s(this.keysByValue,n,e)},e.prototype.hasValue=function(t){return this.keysByValue.has(t)},e.prototype.getKeysForValue=function(t){var e=this.keysByValue.get(t);return e?Array.from(e):[]},e}(j),T=function(){function t(t,e){var n=this;this.element=t,this.started=!1,this.delegate=e,this.elements=new Set,this.mutationObserver=new MutationObserver(function(t){return n.processMutations(t)})}return t.prototype.start=function(){this.started||(this.mutationObserver.observe(this.element,{attributes:!0,childList:!0,subtree:!0}),this.started=!0,this.refresh())},t.prototype.stop=function(){this.started&&(this.mutationObserver.takeRecords(),this.mutationObserver.disconnect(),this.started=!1)},t.prototype.refresh=function(){if(this.started){for(var t=new Set(this.matchElementsInTree()),e=0,n=Array.from(this.elements);e<n.length;e++){var r=n[e];t.has(r)||this.removeElement(r)}for(var o=0,i=Array.from(t);o<i.length;o++){var r=i[o];this.addElement(r)}}},t.prototype.processMutations=function(t){for(var e=0,n=t;e<n.length;e++){var r=n[e];this.processMutation(r)}},t.prototype.processMutation=function(t){"attributes"==t.type?this.processAttributeChange(t.target,t.attributeName):"childList"==t.type&&(this.processRemovedNodes(t.removedNodes),this.processAddedNodes(t.addedNodes))},t.prototype.processAttributeChange=function(t,e){var n=t;this.elements.has(n)?this.delegate.elementAttributeChanged&&this.matchElement(n)?this.delegate.elementAttributeChanged(n,e):this.removeElement(n):this.matchElement(n)&&this.addElement(n)},t.prototype.processRemovedNodes=function(t){for(var e=0,n=Array.from(t);e<n.length;e++){var r=n[e];this.processNode(r,this.removeElement)}},t.prototype.processAddedNodes=function(t){for(var e=0,n=Array.from(t);e<n.length;e++){var r=n[e];this.processNode(r,this.addElement)}},t.prototype.matchElement=function(t){return this.delegate.matchElement(t)},t.prototype.matchElementsInTree=function(t){return void 0===t&&(t=this.element),this.delegate.matchElementsInTree(t)},t.prototype.processNode=function(t,e){var n=this.elementFromNode(t);if(n)for(var r=0,o=this.matchElementsInTree(n);r<o.length;r++){var i=o[r];e.call(this,i)}},t.prototype.elementFromNode=function(t){if(t.nodeType==Node.ELEMENT_NODE)return t},t.prototype.addElement=function(t){this.elements.has(t)||(this.elements.add(t),this.delegate.elementMatched&&this.delegate.elementMatched(t))},t.prototype.removeElement=function(t){this.elements.has(t)&&(this.elements.delete(t),this.delegate.elementUnmatched&&this.delegate.elementUnmatched(t))},t}(),F=(function(){function t(t,e,n){this.attributeName=e,this.delegate=n,this.elementObserver=new T(t,this)}Object.defineProperty(t.prototype,"element",{get:function(){return this.elementObserver.element},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"selector",{get:function(){return"["+this.attributeName+"]"},enumerable:!0,configurable:!0}),t.prototype.start=function(){this.elementObserver.start()},t.prototype.stop=function(){this.elementObserver.stop()},t.prototype.matchElement=function(t){return t.hasAttribute(this.attributeName)},t.prototype.matchElementsInTree=function(t){var e=this.matchElement(t)?[t]:[],n=Array.from(t.querySelectorAll(this.selector));return e.concat(n)},t.prototype.elementMatched=function(t){this.delegate.elementMatchedAttribute&&this.delegate.elementMatchedAttribute(t,this.attributeName)},t.prototype.elementUnmatched=function(t){this.delegate.elementUnmatchedAttribute&&this.delegate.elementUnmatchedAttribute(t,this.attributeName)},t.prototype.elementAttributeChanged=function(t,e){this.delegate.elementAttributeValueChanged&&this.attributeName==e&&this.delegate.elementAttributeValueChanged(t,e)}}(),function(){function t(t,e,n){this.attributeName=e,this.delegate=n,this.elementObserver=new T(t,this),this.tokensByElement=new P}return Object.defineProperty(t.prototype,"started",{get:function(){return this.elementObserver.started},enumerable:!0,configurable:!0}),t.prototype.start=function(){this.elementObserver.start()},t.prototype.stop=function(){this.elementObserver.stop()},t.prototype.refresh=function(){this.elementObserver.refresh()},Object.defineProperty(t.prototype,"element",{get:function(){return this.elementObserver.element},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"selector",{get:function(){return"["+this.attributeName+"]"},enumerable:!0,configurable:!0}),t.prototype.getElementsMatchingToken=function(t){return this.tokensByElement.getKeysForValue(t)},t.prototype.matchElement=function(t){return t.hasAttribute(this.attributeName)},t.prototype.matchElementsInTree=function(t){var e=this.matchElement(t)?[t]:[],n=Array.from(t.querySelectorAll(this.selector));return e.concat(n)},t.prototype.elementMatched=function(t){for(var e=Array.from(this.readTokenSetForElement(t)),n=0,r=e;n<r.length;n++){var o=r[n];this.elementMatchedToken(t,o)}},t.prototype.elementUnmatched=function(t){for(var e=this.getTokensForElement(t),n=0,r=e;n<r.length;n++){var o=r[n];this.elementUnmatchedToken(t,o)}},t.prototype.elementAttributeChanged=function(t){for(var e=this.readTokenSetForElement(t),n=0,r=Array.from(e);n<r.length;n++){var o=r[n];this.elementMatchedToken(t,o)}for(var i=0,c=this.getTokensForElement(t);i<c.length;i++){var o=c[i];e.has(o)||this.elementUnmatchedToken(t,o)}},t.prototype.elementMatchedToken=function(t,e){this.tokensByElement.has(t,e)||(this.tokensByElement.add(t,e),this.delegate.elementMatchedTokenForAttribute&&this.delegate.elementMatchedTokenForAttribute(t,e,this.attributeName))},t.prototype.elementUnmatchedToken=function(t,e){this.tokensByElement.has(t,e)&&(this.tokensByElement.delete(t,e),this.delegate.elementUnmatchedTokenForAttribute&&this.delegate.elementUnmatchedTokenForAttribute(t,e,this.attributeName))},t.prototype.getTokensForElement=function(t){return this.tokensByElement.getValuesForKey(t)},t.prototype.readTokenSetForElement=function(t){for(var e=new Set,n=t.getAttribute(this.attributeName)||"",r=0,o=n.split(/\s+/);r<o.length;r++){var i=o[r];i.length&&e.add(i)}return e},t}()),k=function(){function t(t,e){this.context=t,this.delegate=e,this.tokenListObserver=new F(this.element,this.attributeName,this),this.connectedActions=new j}return Object.defineProperty(t.prototype,"scope",{get:function(){return this.context.scope},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"schema",{get:function(){return this.context.schema},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"attributeName",{get:function(){return this.schema.actionAttribute},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.scope.identifier},enumerable:!0,configurable:!0}),t.prototype.start=function(){this.tokenListObserver.start()},t.prototype.stop=function(){this.tokenListObserver.stop()},t.prototype.elementMatchedTokenForAttribute=function(t,e,n){if(this.scope.containsElement(t)){var r=this.buildActionForElementWithDescriptorString(t,e);r&&(this.connectedActions.add(t,r),this.delegate.inlineActionConnected(r))}},t.prototype.elementUnmatchedTokenForAttribute=function(t,e,n){var r=this.getConnectedActionForElementWithDescriptorString(t,e);r&&(this.connectedActions.delete(t,r),this.delegate.inlineActionDisconnected(r))},t.prototype.getConnectedActionForElementWithDescriptorString=function(t,e){var n=this.buildActionForElementWithDescriptorString(t,e);if(n){return this.connectedActions.getValuesForKey(t).find(function(t){return t.hasSameDescriptorAs(n)})}},t.prototype.buildActionForElementWithDescriptorString=function(t,e){try{var n=O.forElementWithInlineDescriptorString(t,e);if(n.identifier==this.identifier)return new E(this.context,n,n.eventTarget)}catch(n){this.context.handleError(n,'parsing descriptor string "'+e+'"',{element:t})}},t}(),x=function(){function t(t){this.scope=t}return Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.scope.identifier},enumerable:!0,configurable:!0}),t.prototype.get=function(t){return t=this.getFormattedKey(t),this.element.getAttribute(t)},t.prototype.set=function(t,e){return t=this.getFormattedKey(t),this.element.setAttribute(t,e),this.get(t)},t.prototype.has=function(t){return t=this.getFormattedKey(t),this.element.hasAttribute(t)},t.prototype.delete=function(t){return!!this.has(t)&&(t=this.getFormattedKey(t),this.element.removeAttribute(t),!0)},t.prototype.getFormattedKey=function(t){return"data-"+this.identifier+"-"+l(t)},t}(),B=function(){function t(t){this.scope=t}return Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.scope.identifier},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"schema",{get:function(){return this.scope.schema},enumerable:!0,configurable:!0}),t.prototype.has=function(t){return null!=this.find(t)},t.prototype.find=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=this.getSelectorForTargetNames(t);return this.scope.findElement(n)},t.prototype.findAll=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=this.getSelectorForTargetNames(t);return this.scope.findAllElements(n)},t.prototype.getSelectorForTargetNames=function(t){var e=this;return t.map(function(t){return e.getSelectorForTargetName(t)}).join(", ")},t.prototype.getSelectorForTargetName=function(t){var e=this.identifier+"."+t;return f(this.schema.targetAttribute,e)},t}(),M=function(){function t(t,e,n){this.schema=t,this.identifier=e,this.element=n,this.targets=new B(this),this.data=new x(this)}return t.prototype.findElement=function(t){return this.findAllElements(t)[0]},t.prototype.findAllElements=function(t){var e=this.element.matches(t)?[this.element]:[],n=this.filterElements(Array.from(this.element.querySelectorAll(t)));return e.concat(n)},t.prototype.filterElements=function(t){var e=this;return t.filter(function(t){return e.containsElement(t)})},t.prototype.containsElement=function(t){return t.closest(this.controllerSelector)===this.element},Object.defineProperty(t.prototype,"controllerSelector",{get:function(){return f(this.schema.controllerAttribute,this.identifier)},enumerable:!0,configurable:!0}),t}(),C=function(){function t(t,e){this.module=t,this.scope=new M(this.schema,this.identifier,e),this.actions=new N(this),this.inlineActionObserver=new k(this,this);try{this.controller=new t.controllerConstructor(this),this.controller.initialize()}catch(t){this.handleError(t,"initializing controller")}}return t.prototype.connect=function(){this.actions.start(),this.inlineActionObserver.start();try{this.controller.connect()}catch(t){this.handleError(t,"connecting controller")}},t.prototype.disconnect=function(){try{this.controller.disconnect()}catch(t){this.handleError(t,"disconnecting controller")}this.inlineActionObserver.stop(),this.actions.stop()},Object.defineProperty(t.prototype,"application",{get:function(){return this.module.application},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.module.identifier},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"schema",{get:function(){return this.application.schema},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentElement",{get:function(){return this.element.parentElement},enumerable:!0,configurable:!0}),t.prototype.inlineActionConnected=function(t){this.actions.add(t)},t.prototype.inlineActionDisconnected=function(t){this.actions.delete(t)},t.prototype.handleError=function(t,e,n){void 0===n&&(n={});var r=this,o=r.identifier,i=r.controller,c=r.element;n=Object.assign({identifier:o,controller:i,element:c},n),this.application.handleError(t,"Error "+e,n)},t}(),S=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),I=function(){function t(t){function e(){var n=this&&this instanceof e?this.constructor:void 0;return Reflect.construct(t,arguments,n)}return e.prototype=Object.create(t.prototype,{constructor:{value:e}}),Reflect.setPrototypeOf(e,t),e}try{return function(){var e=function(){this.a.call(this)},n=t(e);n.prototype.a=function(){},new n}(),t}catch(t){return function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return S(e,t),e}(t)}}}(),_=function(){function t(t,e){this.application=t,this.definition=h(e),this.contextsByElement=new WeakMap,this.connectedContexts=new Set}return Object.defineProperty(t.prototype,"identifier",{get:function(){return this.definition.identifier},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"controllerConstructor",{get:function(){return this.definition.controllerConstructor},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"contexts",{get:function(){return Array.from(this.connectedContexts)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){return this.connectedContexts.size},enumerable:!0,configurable:!0}),t.prototype.connectElement=function(t){var e=this.fetchContextForElement(t);e&&!this.connectedContexts.has(e)&&(this.connectedContexts.add(e),e.connect())},t.prototype.disconnectElement=function(t){var e=this.fetchContextForElement(t);e&&this.connectedContexts.has(e)&&(this.connectedContexts.delete(e),e.disconnect())},t.prototype.getContextForElement=function(t){return this.contextsByElement.get(t)},t.prototype.fetchContextForElement=function(t){var e=this.contextsByElement.get(t);return e||(e=new C(this,t),this.contextsByElement.set(t,e)),e},t}(),K=function(){function t(t){this.application=t,this.tokenListObserver=new F(this.element,this.controllerAttribute,this),this.modulesByIdentifier=new Map}return Object.defineProperty(t.prototype,"schema",{get:function(){return this.application.schema},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this.application.element},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"controllerAttribute",{get:function(){return this.schema.controllerAttribute},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"modules",{get:function(){return Array.from(this.modulesByIdentifier.values())},enumerable:!0,configurable:!0}),t.prototype.start=function(){this.tokenListObserver.start()},t.prototype.stop=function(){this.tokenListObserver.stop()},t.prototype.loadDefinition=function(t){var e=t.identifier;this.unloadIdentifier(e);var n=new _(this.application,t);this.modulesByIdentifier.set(e,n),this.connectModule(n)},t.prototype.unloadIdentifier=function(t){var e=this.modulesByIdentifier.get(t);e&&(this.disconnectModule(e),this.modulesByIdentifier.delete(t))},t.prototype.elementMatchedTokenForAttribute=function(t,e,n){this.connectModuleForIdentifierToElement(e,t)},t.prototype.elementUnmatchedTokenForAttribute=function(t,e,n){this.disconnectModuleForIdentifierFromElement(e,t)},Object.defineProperty(t.prototype,"contexts",{get:function(){return this.modules.reduce(function(t,e){return t.concat(Array.from(e.contexts))},[])},enumerable:!0,configurable:!0}),t.prototype.getContextForElementAndIdentifier=function(t,e){var n=this.modulesByIdentifier.get(e);if(n)return n.getContextForElement(t)},t.prototype.connectModule=function(t){for(var e=this.tokenListObserver.getElementsMatchingToken(t.identifier),n=0,r=e;n<r.length;n++){var o=r[n];t.connectElement(o)}},t.prototype.disconnectModule=function(t){for(var e=t.contexts,n=0,r=e;n<r.length;n++){var o=r[n].element;t.disconnectElement(o)}},t.prototype.connectModuleForIdentifierToElement=function(t,e){var n=this.modulesByIdentifier.get(t);n&&n.connectElement(e)},t.prototype.disconnectModuleForIdentifierFromElement=function(t,e){var n=this.modulesByIdentifier.get(t);n&&n.disconnectElement(e)},t}(),D={controllerAttribute:"data-controller",actionAttribute:"data-action",targetAttribute:"data-target"},V=function(){function t(t,e){void 0===t&&(t=document.documentElement),void 0===e&&(e=D),this.element=t,this.schema=e,this.router=new K(this)}return t.start=function(e,n){var r=new t(e,n);return r.start(),r},t.prototype.start=function(){this.router.start()},t.prototype.stop=function(){this.router.stop()},t.prototype.register=function(t,e){this.load({identifier:t,controllerConstructor:e})},t.prototype.load=function(t){for(var e=this,n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];(Array.isArray(t)?t:[t].concat(n)).forEach(function(t){return e.router.loadDefinition(t)})},t.prototype.unload=function(t){for(var e=this,n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];(Array.isArray(t)?t:[t].concat(n)).forEach(function(t){return e.router.unloadIdentifier(t)})},Object.defineProperty(t.prototype,"controllers",{get:function(){return this.router.contexts.map(function(t){return t.controller})},enumerable:!0,configurable:!0}),t.prototype.getControllerForElementAndIdentifier=function(t,e){var n=this.router.getContextForElementAndIdentifier(t,e);return n?n.controller:null},t.prototype.handleError=function(t,e,n){console.error("%s\n\n%o\n\n%o",e,t,n)},t}(),L=function(){function t(t){this.context=t}return t.bless=function(){d(this)},Object.defineProperty(t.prototype,"application",{get:function(){return this.context.application},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"scope",{get:function(){return this.context.scope},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"element",{get:function(){return this.scope.element},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"identifier",{get:function(){return this.scope.identifier},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"targets",{get:function(){return this.scope.targets},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"data",{get:function(){return this.scope.data},enumerable:!0,configurable:!0}),t.prototype.initialize=function(){},t.prototype.connect=function(){},t.prototype.disconnect=function(){},t.targets=[],t}();n.d(e,"Action",function(){return E}),n.d(e,"ActionDescriptor",function(){return O}),n.d(e,"Application",function(){return V}),n.d(e,"Context",function(){return C}),n.d(e,"Controller",function(){return L}),n.d(e,"defaultSchema",function(){return D})}])});
\ No newline at end of file
+(function(global, factory) {
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define([ "exports" ], factory) : factory(global.Stimulus = {});
+})(this, function(exports) {
+ "use strict";
+ var EventListener = function() {
+ function EventListener(eventTarget, eventName) {
+ this.eventTarget = eventTarget;
+ this.eventName = eventName;
+ this.unorderedBindings = new Set();
+ }
+ EventListener.prototype.connect = function() {
+ this.eventTarget.addEventListener(this.eventName, this, false);
+ };
+ EventListener.prototype.disconnect = function() {
+ this.eventTarget.removeEventListener(this.eventName, this, false);
+ };
+ EventListener.prototype.bindingConnected = function(binding) {
+ this.unorderedBindings.add(binding);
+ };
+ EventListener.prototype.bindingDisconnected = function(binding) {
+ this.unorderedBindings.delete(binding);
+ };
+ EventListener.prototype.handleEvent = function(event) {
+ var extendedEvent = extendEvent(event);
+ for (var _i = 0, _a = this.bindings; _i < _a.length; _i++) {
+ var binding = _a[_i];
+ if (extendedEvent.immediatePropagationStopped) {
+ break;
+ } else {
+ binding.handleEvent(extendedEvent);
+ }
+ }
+ };
+ Object.defineProperty(EventListener.prototype, "bindings", {
+ get: function() {
+ return Array.from(this.unorderedBindings).sort(function(left, right) {
+ var leftIndex = left.index, rightIndex = right.index;
+ return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;
+ });
+ },
+ enumerable: true,
+ configurable: true
+ });
+ return EventListener;
+ }();
+ function extendEvent(event) {
+ if ("immediatePropagationStopped" in event) {
+ return event;
+ } else {
+ var stopImmediatePropagation_1 = event.stopImmediatePropagation;
+ return Object.assign(event, {
+ immediatePropagationStopped: false,
+ stopImmediatePropagation: function() {
+ this.immediatePropagationStopped = true;
+ stopImmediatePropagation_1.call(this);
+ }
+ });
+ }
+ }
+ var Dispatcher = function() {
+ function Dispatcher(application) {
+ this.application = application;
+ this.eventListenerMaps = new Map();
+ this.started = false;
+ }
+ Dispatcher.prototype.start = function() {
+ if (!this.started) {
+ this.started = true;
+ this.eventListeners.forEach(function(eventListener) {
+ return eventListener.connect();
+ });
+ }
+ };
+ Dispatcher.prototype.stop = function() {
+ if (this.started) {
+ this.started = false;
+ this.eventListeners.forEach(function(eventListener) {
+ return eventListener.disconnect();
+ });
+ }
+ };
+ Object.defineProperty(Dispatcher.prototype, "eventListeners", {
+ get: function() {
+ return Array.from(this.eventListenerMaps.values()).reduce(function(listeners, map) {
+ return listeners.concat(Array.from(map.values()));
+ }, []);
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Dispatcher.prototype.bindingConnected = function(binding) {
+ this.fetchEventListenerForBinding(binding).bindingConnected(binding);
+ };
+ Dispatcher.prototype.bindingDisconnected = function(binding) {
+ this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);
+ };
+ Dispatcher.prototype.handleError = function(error, message, detail) {
+ if (detail === void 0) {
+ detail = {};
+ }
+ this.application.handleError(error, "Error " + message, detail);
+ };
+ Dispatcher.prototype.fetchEventListenerForBinding = function(binding) {
+ var eventTarget = binding.eventTarget, eventName = binding.eventName;
+ return this.fetchEventListener(eventTarget, eventName);
+ };
+ Dispatcher.prototype.fetchEventListener = function(eventTarget, eventName) {
+ var eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);
+ var eventListener = eventListenerMap.get(eventName);
+ if (!eventListener) {
+ eventListener = this.createEventListener(eventTarget, eventName);
+ eventListenerMap.set(eventName, eventListener);
+ }
+ return eventListener;
+ };
+ Dispatcher.prototype.createEventListener = function(eventTarget, eventName) {
+ var eventListener = new EventListener(eventTarget, eventName);
+ if (this.started) {
+ eventListener.connect();
+ }
+ return eventListener;
+ };
+ Dispatcher.prototype.fetchEventListenerMapForEventTarget = function(eventTarget) {
+ var eventListenerMap = this.eventListenerMaps.get(eventTarget);
+ if (!eventListenerMap) {
+ eventListenerMap = new Map();
+ this.eventListenerMaps.set(eventTarget, eventListenerMap);
+ }
+ return eventListenerMap;
+ };
+ return Dispatcher;
+ }();
+ var descriptorPattern = /^((.+?)(@(window|document))?->)?(.+?)(#(.+))?$/;
+ function parseDescriptorString(descriptorString) {
+ var source = descriptorString.trim();
+ var matches = source.match(descriptorPattern) || [];
+ return {
+ eventTarget: parseEventTarget(matches[4]),
+ eventName: matches[2],
+ identifier: matches[5],
+ methodName: matches[7]
+ };
+ }
+ function parseEventTarget(eventTargetName) {
+ if (eventTargetName == "window") {
+ return window;
+ } else if (eventTargetName == "document") {
+ return document;
+ }
+ }
+ function stringifyEventTarget(eventTarget) {
+ if (eventTarget == window) {
+ return "window";
+ } else if (eventTarget == document) {
+ return "document";
+ }
+ }
+ var Action = function() {
+ function Action(element, index, descriptor) {
+ this.element = element;
+ this.index = index;
+ this.eventTarget = descriptor.eventTarget || element;
+ this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error("missing event name");
+ this.identifier = descriptor.identifier || error("missing identifier");
+ this.methodName = descriptor.methodName || error("missing method name");
+ }
+ Action.forToken = function(token) {
+ return new this(token.element, token.index, parseDescriptorString(token.content));
+ };
+ Action.prototype.toString = function() {
+ var eventNameSuffix = this.eventTargetName ? "@" + this.eventTargetName : "";
+ return "" + this.eventName + eventNameSuffix + "->" + this.identifier + "#" + this.methodName;
+ };
+ Object.defineProperty(Action.prototype, "eventTargetName", {
+ get: function() {
+ return stringifyEventTarget(this.eventTarget);
+ },
+ enumerable: true,
+ configurable: true
+ });
+ return Action;
+ }();
+ var defaultEventNames = {
+ a: function(e) {
+ return "click";
+ },
+ button: function(e) {
+ return "click";
+ },
+ form: function(e) {
+ return "submit";
+ },
+ input: function(e) {
+ return e.getAttribute("type") == "submit" ? "click" : "change";
+ },
+ select: function(e) {
+ return "change";
+ },
+ textarea: function(e) {
+ return "change";
+ }
+ };
+ function getDefaultEventNameForElement(element) {
+ var tagName = element.tagName.toLowerCase();
+ if (tagName in defaultEventNames) {
+ return defaultEventNames[tagName](element);
+ }
+ }
+ function error(message) {
+ throw new Error(message);
+ }
+ var Binding = function() {
+ function Binding(context, action) {
+ this.context = context;
+ this.action = action;
+ }
+ Object.defineProperty(Binding.prototype, "index", {
+ get: function() {
+ return this.action.index;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Binding.prototype, "eventTarget", {
+ get: function() {
+ return this.action.eventTarget;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Binding.prototype, "identifier", {
+ get: function() {
+ return this.context.identifier;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Binding.prototype.handleEvent = function(event) {
+ if (this.willBeInvokedByEvent(event)) {
+ this.invokeWithEvent(event);
+ }
+ };
+ Object.defineProperty(Binding.prototype, "eventName", {
+ get: function() {
+ return this.action.eventName;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Binding.prototype, "method", {
+ get: function() {
+ var method = this.controller[this.methodName];
+ if (typeof method == "function") {
+ return method;
+ }
+ throw new Error('Action "' + this.action + '" references undefined method "' + this.methodName + '"');
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Binding.prototype.invokeWithEvent = function(event) {
+ try {
+ this.method.call(this.controller, event);
+ } catch (error) {
+ var _a = this, identifier = _a.identifier, controller = _a.controller, element = _a.element, index = _a.index;
+ var detail = {
+ identifier: identifier,
+ controller: controller,
+ element: element,
+ index: index,
+ event: event
+ };
+ this.context.handleError(error, 'invoking action "' + this.action + '"', detail);
+ }
+ };
+ Binding.prototype.willBeInvokedByEvent = function(event) {
+ var eventTarget = event.target;
+ if (this.element === eventTarget) {
+ return true;
+ } else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {
+ return this.scope.containsElement(eventTarget);
+ } else {
+ return true;
+ }
+ };
+ Object.defineProperty(Binding.prototype, "controller", {
+ get: function() {
+ return this.context.controller;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Binding.prototype, "methodName", {
+ get: function() {
+ return this.action.methodName;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Binding.prototype, "element", {
+ get: function() {
+ return this.scope.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Binding.prototype, "scope", {
+ get: function() {
+ return this.context.scope;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ return Binding;
+ }();
+ var ElementObserver = function() {
+ function ElementObserver(element, delegate) {
+ var _this = this;
+ this.element = element;
+ this.started = false;
+ this.delegate = delegate;
+ this.elements = new Set();
+ this.mutationObserver = new MutationObserver(function(mutations) {
+ return _this.processMutations(mutations);
+ });
+ }
+ ElementObserver.prototype.start = function() {
+ if (!this.started) {
+ this.started = true;
+ this.mutationObserver.observe(this.element, {
+ attributes: true,
+ childList: true,
+ subtree: true
+ });
+ this.refresh();
+ }
+ };
+ ElementObserver.prototype.stop = function() {
+ if (this.started) {
+ this.mutationObserver.takeRecords();
+ this.mutationObserver.disconnect();
+ this.started = false;
+ }
+ };
+ ElementObserver.prototype.refresh = function() {
+ if (this.started) {
+ var matches = new Set(this.matchElementsInTree());
+ for (var _i = 0, _a = Array.from(this.elements); _i < _a.length; _i++) {
+ var element = _a[_i];
+ if (!matches.has(element)) {
+ this.removeElement(element);
+ }
+ }
+ for (var _b = 0, _c = Array.from(matches); _b < _c.length; _b++) {
+ var element = _c[_b];
+ this.addElement(element);
+ }
+ }
+ };
+ ElementObserver.prototype.processMutations = function(mutations) {
+ if (this.started) {
+ for (var _i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) {
+ var mutation = mutations_1[_i];
+ this.processMutation(mutation);
+ }
+ }
+ };
+ ElementObserver.prototype.processMutation = function(mutation) {
+ if (mutation.type == "attributes") {
+ this.processAttributeChange(mutation.target, mutation.attributeName);
+ } else if (mutation.type == "childList") {
+ this.processRemovedNodes(mutation.removedNodes);
+ this.processAddedNodes(mutation.addedNodes);
+ }
+ };
+ ElementObserver.prototype.processAttributeChange = function(node, attributeName) {
+ var element = node;
+ if (this.elements.has(element)) {
+ if (this.delegate.elementAttributeChanged && this.matchElement(element)) {
+ this.delegate.elementAttributeChanged(element, attributeName);
+ } else {
+ this.removeElement(element);
+ }
+ } else if (this.matchElement(element)) {
+ this.addElement(element);
+ }
+ };
+ ElementObserver.prototype.processRemovedNodes = function(nodes) {
+ for (var _i = 0, _a = Array.from(nodes); _i < _a.length; _i++) {
+ var node = _a[_i];
+ var element = this.elementFromNode(node);
+ if (element) {
+ this.processTree(element, this.removeElement);
+ }
+ }
+ };
+ ElementObserver.prototype.processAddedNodes = function(nodes) {
+ for (var _i = 0, _a = Array.from(nodes); _i < _a.length; _i++) {
+ var node = _a[_i];
+ var element = this.elementFromNode(node);
+ if (element && this.elementIsActive(element)) {
+ this.processTree(element, this.addElement);
+ }
+ }
+ };
+ ElementObserver.prototype.matchElement = function(element) {
+ return this.delegate.matchElement(element);
+ };
+ ElementObserver.prototype.matchElementsInTree = function(tree) {
+ if (tree === void 0) {
+ tree = this.element;
+ }
+ return this.delegate.matchElementsInTree(tree);
+ };
+ ElementObserver.prototype.processTree = function(tree, processor) {
+ for (var _i = 0, _a = this.matchElementsInTree(tree); _i < _a.length; _i++) {
+ var element = _a[_i];
+ processor.call(this, element);
+ }
+ };
+ ElementObserver.prototype.elementFromNode = function(node) {
+ if (node.nodeType == Node.ELEMENT_NODE) {
+ return node;
+ }
+ };
+ ElementObserver.prototype.elementIsActive = function(element) {
+ if (element.isConnected != this.element.isConnected) {
+ return false;
+ } else {
+ return this.element.contains(element);
+ }
+ };
+ ElementObserver.prototype.addElement = function(element) {
+ if (!this.elements.has(element)) {
+ if (this.elementIsActive(element)) {
+ this.elements.add(element);
+ if (this.delegate.elementMatched) {
+ this.delegate.elementMatched(element);
+ }
+ }
+ }
+ };
+ ElementObserver.prototype.removeElement = function(element) {
+ if (this.elements.has(element)) {
+ this.elements.delete(element);
+ if (this.delegate.elementUnmatched) {
+ this.delegate.elementUnmatched(element);
+ }
+ }
+ };
+ return ElementObserver;
+ }();
+ var AttributeObserver = function() {
+ function AttributeObserver(element, attributeName, delegate) {
+ this.attributeName = attributeName;
+ this.delegate = delegate;
+ this.elementObserver = new ElementObserver(element, this);
+ }
+ Object.defineProperty(AttributeObserver.prototype, "element", {
+ get: function() {
+ return this.elementObserver.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(AttributeObserver.prototype, "selector", {
+ get: function() {
+ return "[" + this.attributeName + "]";
+ },
+ enumerable: true,
+ configurable: true
+ });
+ AttributeObserver.prototype.start = function() {
+ this.elementObserver.start();
+ };
+ AttributeObserver.prototype.stop = function() {
+ this.elementObserver.stop();
+ };
+ AttributeObserver.prototype.refresh = function() {
+ this.elementObserver.refresh();
+ };
+ Object.defineProperty(AttributeObserver.prototype, "started", {
+ get: function() {
+ return this.elementObserver.started;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ AttributeObserver.prototype.matchElement = function(element) {
+ return element.hasAttribute(this.attributeName);
+ };
+ AttributeObserver.prototype.matchElementsInTree = function(tree) {
+ var match = this.matchElement(tree) ? [ tree ] : [];
+ var matches = Array.from(tree.querySelectorAll(this.selector));
+ return match.concat(matches);
+ };
+ AttributeObserver.prototype.elementMatched = function(element) {
+ if (this.delegate.elementMatchedAttribute) {
+ this.delegate.elementMatchedAttribute(element, this.attributeName);
+ }
+ };
+ AttributeObserver.prototype.elementUnmatched = function(element) {
+ if (this.delegate.elementUnmatchedAttribute) {
+ this.delegate.elementUnmatchedAttribute(element, this.attributeName);
+ }
+ };
+ AttributeObserver.prototype.elementAttributeChanged = function(element, attributeName) {
+ if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {
+ this.delegate.elementAttributeValueChanged(element, attributeName);
+ }
+ };
+ return AttributeObserver;
+ }();
+ function add(map, key, value) {
+ fetch(map, key).add(value);
+ }
+ function del(map, key, value) {
+ fetch(map, key).delete(value);
+ prune(map, key);
+ }
+ function fetch(map, key) {
+ var values = map.get(key);
+ if (!values) {
+ values = new Set();
+ map.set(key, values);
+ }
+ return values;
+ }
+ function prune(map, key) {
+ var values = map.get(key);
+ if (values != null && values.size == 0) {
+ map.delete(key);
+ }
+ }
+ var Multimap = function() {
+ function Multimap() {
+ this.valuesByKey = new Map();
+ }
+ Object.defineProperty(Multimap.prototype, "values", {
+ get: function() {
+ var sets = Array.from(this.valuesByKey.values());
+ return sets.reduce(function(values, set) {
+ return values.concat(Array.from(set));
+ }, []);
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Multimap.prototype, "size", {
+ get: function() {
+ var sets = Array.from(this.valuesByKey.values());
+ return sets.reduce(function(size, set) {
+ return size + set.size;
+ }, 0);
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Multimap.prototype.add = function(key, value) {
+ add(this.valuesByKey, key, value);
+ };
+ Multimap.prototype.delete = function(key, value) {
+ del(this.valuesByKey, key, value);
+ };
+ Multimap.prototype.has = function(key, value) {
+ var values = this.valuesByKey.get(key);
+ return values != null && values.has(value);
+ };
+ Multimap.prototype.hasKey = function(key) {
+ return this.valuesByKey.has(key);
+ };
+ Multimap.prototype.hasValue = function(value) {
+ var sets = Array.from(this.valuesByKey.values());
+ return sets.some(function(set) {
+ return set.has(value);
+ });
+ };
+ Multimap.prototype.getValuesForKey = function(key) {
+ var values = this.valuesByKey.get(key);
+ return values ? Array.from(values) : [];
+ };
+ Multimap.prototype.getKeysForValue = function(value) {
+ return Array.from(this.valuesByKey).filter(function(_a) {
+ var key = _a[0], values = _a[1];
+ return values.has(value);
+ }).map(function(_a) {
+ var key = _a[0], values = _a[1];
+ return key;
+ });
+ };
+ return Multimap;
+ }();
+ var __extends = undefined && undefined.__extends || function() {
+ var extendStatics = Object.setPrototypeOf || {
+ __proto__: []
+ } instanceof Array && function(d, b) {
+ d.__proto__ = b;
+ } || function(d, b) {
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+ };
+ return function(d, b) {
+ extendStatics(d, b);
+ function __() {
+ this.constructor = d;
+ }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+ }();
+ var IndexedMultimap = function(_super) {
+ __extends(IndexedMultimap, _super);
+ function IndexedMultimap() {
+ var _this = _super.call(this) || this;
+ _this.keysByValue = new Map();
+ return _this;
+ }
+ Object.defineProperty(IndexedMultimap.prototype, "values", {
+ get: function() {
+ return Array.from(this.keysByValue.keys());
+ },
+ enumerable: true,
+ configurable: true
+ });
+ IndexedMultimap.prototype.add = function(key, value) {
+ _super.prototype.add.call(this, key, value);
+ add(this.keysByValue, value, key);
+ };
+ IndexedMultimap.prototype.delete = function(key, value) {
+ _super.prototype.delete.call(this, key, value);
+ del(this.keysByValue, value, key);
+ };
+ IndexedMultimap.prototype.hasValue = function(value) {
+ return this.keysByValue.has(value);
+ };
+ IndexedMultimap.prototype.getKeysForValue = function(value) {
+ var set = this.keysByValue.get(value);
+ return set ? Array.from(set) : [];
+ };
+ return IndexedMultimap;
+ }(Multimap);
+ var TokenListObserver = function() {
+ function TokenListObserver(element, attributeName, delegate) {
+ this.attributeObserver = new AttributeObserver(element, attributeName, this);
+ this.delegate = delegate;
+ this.tokensByElement = new Multimap();
+ }
+ Object.defineProperty(TokenListObserver.prototype, "started", {
+ get: function() {
+ return this.attributeObserver.started;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ TokenListObserver.prototype.start = function() {
+ this.attributeObserver.start();
+ };
+ TokenListObserver.prototype.stop = function() {
+ this.attributeObserver.stop();
+ };
+ TokenListObserver.prototype.refresh = function() {
+ this.attributeObserver.refresh();
+ };
+ Object.defineProperty(TokenListObserver.prototype, "element", {
+ get: function() {
+ return this.attributeObserver.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(TokenListObserver.prototype, "attributeName", {
+ get: function() {
+ return this.attributeObserver.attributeName;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ TokenListObserver.prototype.elementMatchedAttribute = function(element) {
+ this.tokensMatched(this.readTokensForElement(element));
+ };
+ TokenListObserver.prototype.elementAttributeValueChanged = function(element) {
+ var _a = this.refreshTokensForElement(element), unmatchedTokens = _a[0], matchedTokens = _a[1];
+ this.tokensUnmatched(unmatchedTokens);
+ this.tokensMatched(matchedTokens);
+ };
+ TokenListObserver.prototype.elementUnmatchedAttribute = function(element) {
+ this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));
+ };
+ TokenListObserver.prototype.tokensMatched = function(tokens) {
+ var _this = this;
+ tokens.forEach(function(token) {
+ return _this.tokenMatched(token);
+ });
+ };
+ TokenListObserver.prototype.tokensUnmatched = function(tokens) {
+ var _this = this;
+ tokens.forEach(function(token) {
+ return _this.tokenUnmatched(token);
+ });
+ };
+ TokenListObserver.prototype.tokenMatched = function(token) {
+ this.delegate.tokenMatched(token);
+ this.tokensByElement.add(token.element, token);
+ };
+ TokenListObserver.prototype.tokenUnmatched = function(token) {
+ this.delegate.tokenUnmatched(token);
+ this.tokensByElement.delete(token.element, token);
+ };
+ TokenListObserver.prototype.refreshTokensForElement = function(element) {
+ var previousTokens = this.tokensByElement.getValuesForKey(element);
+ var currentTokens = this.readTokensForElement(element);
+ var firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(function(_a) {
+ var previousToken = _a[0], currentToken = _a[1];
+ return !tokensAreEqual(previousToken, currentToken);
+ });
+ if (firstDifferingIndex == -1) {
+ return [ [], [] ];
+ } else {
+ return [ previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex) ];
+ }
+ };
+ TokenListObserver.prototype.readTokensForElement = function(element) {
+ var attributeName = this.attributeName;
+ var tokenString = element.getAttribute(attributeName) || "";
+ return parseTokenString(tokenString, element, attributeName);
+ };
+ return TokenListObserver;
+ }();
+ function parseTokenString(tokenString, element, attributeName) {
+ return tokenString.trim().split(/\s+/).filter(function(content) {
+ return content.length;
+ }).map(function(content, index) {
+ return {
+ element: element,
+ attributeName: attributeName,
+ content: content,
+ index: index
+ };
+ });
+ }
+ function zip(left, right) {
+ var length = Math.max(left.length, right.length);
+ return Array.from({
+ length: length
+ }, function(_, index) {
+ return [ left[index], right[index] ];
+ });
+ }
+ function tokensAreEqual(left, right) {
+ return left && right && left.index == right.index && left.content == right.content;
+ }
+ var ValueListObserver = function() {
+ function ValueListObserver(element, attributeName, delegate) {
+ this.tokenListObserver = new TokenListObserver(element, attributeName, this);
+ this.delegate = delegate;
+ this.parseResultsByToken = new WeakMap();
+ this.valuesByTokenByElement = new WeakMap();
+ }
+ Object.defineProperty(ValueListObserver.prototype, "started", {
+ get: function() {
+ return this.tokenListObserver.started;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ ValueListObserver.prototype.start = function() {
+ this.tokenListObserver.start();
+ };
+ ValueListObserver.prototype.stop = function() {
+ this.tokenListObserver.stop();
+ };
+ ValueListObserver.prototype.refresh = function() {
+ this.tokenListObserver.refresh();
+ };
+ Object.defineProperty(ValueListObserver.prototype, "element", {
+ get: function() {
+ return this.tokenListObserver.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(ValueListObserver.prototype, "attributeName", {
+ get: function() {
+ return this.tokenListObserver.attributeName;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ ValueListObserver.prototype.tokenMatched = function(token) {
+ var element = token.element;
+ var value = this.fetchParseResultForToken(token).value;
+ if (value) {
+ this.fetchValuesByTokenForElement(element).set(token, value);
+ this.delegate.elementMatchedValue(element, value);
+ }
+ };
+ ValueListObserver.prototype.tokenUnmatched = function(token) {
+ var element = token.element;
+ var value = this.fetchParseResultForToken(token).value;
+ if (value) {
+ this.fetchValuesByTokenForElement(element).delete(token);
+ this.delegate.elementUnmatchedValue(element, value);
+ }
+ };
+ ValueListObserver.prototype.fetchParseResultForToken = function(token) {
+ var parseResult = this.parseResultsByToken.get(token);
+ if (!parseResult) {
+ parseResult = this.parseToken(token);
+ this.parseResultsByToken.set(token, parseResult);
+ }
+ return parseResult;
+ };
+ ValueListObserver.prototype.fetchValuesByTokenForElement = function(element) {
+ var valuesByToken = this.valuesByTokenByElement.get(element);
+ if (!valuesByToken) {
+ valuesByToken = new Map();
+ this.valuesByTokenByElement.set(element, valuesByToken);
+ }
+ return valuesByToken;
+ };
+ ValueListObserver.prototype.parseToken = function(token) {
+ try {
+ var value = this.delegate.parseValueForToken(token);
+ return {
+ value: value
+ };
+ } catch (error) {
+ return {
+ error: error
+ };
+ }
+ };
+ return ValueListObserver;
+ }();
+ var BindingObserver = function() {
+ function BindingObserver(context, delegate) {
+ this.context = context;
+ this.delegate = delegate;
+ this.bindingsByAction = new Map();
+ }
+ BindingObserver.prototype.start = function() {
+ if (!this.valueListObserver) {
+ this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);
+ this.valueListObserver.start();
+ }
+ };
+ BindingObserver.prototype.stop = function() {
+ if (this.valueListObserver) {
+ this.valueListObserver.stop();
+ delete this.valueListObserver;
+ this.disconnectAllActions();
+ }
+ };
+ Object.defineProperty(BindingObserver.prototype, "element", {
+ get: function() {
+ return this.context.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(BindingObserver.prototype, "identifier", {
+ get: function() {
+ return this.context.identifier;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(BindingObserver.prototype, "actionAttribute", {
+ get: function() {
+ return this.schema.actionAttribute;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(BindingObserver.prototype, "schema", {
+ get: function() {
+ return this.context.schema;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(BindingObserver.prototype, "bindings", {
+ get: function() {
+ return Array.from(this.bindingsByAction.values());
+ },
+ enumerable: true,
+ configurable: true
+ });
+ BindingObserver.prototype.connectAction = function(action) {
+ var binding = new Binding(this.context, action);
+ this.bindingsByAction.set(action, binding);
+ this.delegate.bindingConnected(binding);
+ };
+ BindingObserver.prototype.disconnectAction = function(action) {
+ var binding = this.bindingsByAction.get(action);
+ if (binding) {
+ this.bindingsByAction.delete(action);
+ this.delegate.bindingDisconnected(binding);
+ }
+ };
+ BindingObserver.prototype.disconnectAllActions = function() {
+ var _this = this;
+ this.bindings.forEach(function(binding) {
+ return _this.delegate.bindingDisconnected(binding);
+ });
+ this.bindingsByAction.clear();
+ };
+ BindingObserver.prototype.parseValueForToken = function(token) {
+ var action = Action.forToken(token);
+ if (action.identifier == this.identifier) {
+ return action;
+ }
+ };
+ BindingObserver.prototype.elementMatchedValue = function(element, action) {
+ this.connectAction(action);
+ };
+ BindingObserver.prototype.elementUnmatchedValue = function(element, action) {
+ this.disconnectAction(action);
+ };
+ return BindingObserver;
+ }();
+ var Context = function() {
+ function Context(module, scope) {
+ this.module = module;
+ this.scope = scope;
+ this.controller = new module.controllerConstructor(this);
+ this.bindingObserver = new BindingObserver(this, this.dispatcher);
+ try {
+ this.controller.initialize();
+ } catch (error) {
+ this.handleError(error, "initializing controller");
+ }
+ }
+ Context.prototype.connect = function() {
+ this.bindingObserver.start();
+ try {
+ this.controller.connect();
+ } catch (error) {
+ this.handleError(error, "connecting controller");
+ }
+ };
+ Context.prototype.disconnect = function() {
+ try {
+ this.controller.disconnect();
+ } catch (error) {
+ this.handleError(error, "disconnecting controller");
+ }
+ this.bindingObserver.stop();
+ };
+ Object.defineProperty(Context.prototype, "application", {
+ get: function() {
+ return this.module.application;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Context.prototype, "identifier", {
+ get: function() {
+ return this.module.identifier;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Context.prototype, "schema", {
+ get: function() {
+ return this.application.schema;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Context.prototype, "dispatcher", {
+ get: function() {
+ return this.application.dispatcher;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Context.prototype, "element", {
+ get: function() {
+ return this.scope.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Context.prototype, "parentElement", {
+ get: function() {
+ return this.element.parentElement;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Context.prototype.handleError = function(error, message, detail) {
+ if (detail === void 0) {
+ detail = {};
+ }
+ var _a = this, identifier = _a.identifier, controller = _a.controller, element = _a.element;
+ detail = Object.assign({
+ identifier: identifier,
+ controller: controller,
+ element: element
+ }, detail);
+ this.application.handleError(error, "Error " + message, detail);
+ };
+ return Context;
+ }();
+ var __extends$1 = undefined && undefined.__extends || function() {
+ var extendStatics = Object.setPrototypeOf || {
+ __proto__: []
+ } instanceof Array && function(d, b) {
+ d.__proto__ = b;
+ } || function(d, b) {
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+ };
+ return function(d, b) {
+ extendStatics(d, b);
+ function __() {
+ this.constructor = d;
+ }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+ }();
+ function blessDefinition(definition) {
+ return {
+ identifier: definition.identifier,
+ controllerConstructor: blessControllerConstructor(definition.controllerConstructor)
+ };
+ }
+ function blessControllerConstructor(controllerConstructor) {
+ var constructor = extend(controllerConstructor);
+ constructor.bless();
+ return constructor;
+ }
+ var extend = function() {
+ function extendWithReflect(constructor) {
+ function Controller() {
+ var _newTarget = this && this instanceof Controller ? this.constructor : void 0;
+ return Reflect.construct(constructor, arguments, _newTarget);
+ }
+ Controller.prototype = Object.create(constructor.prototype, {
+ constructor: {
+ value: Controller
+ }
+ });
+ Reflect.setPrototypeOf(Controller, constructor);
+ return Controller;
+ }
+ function testReflectExtension() {
+ var a = function() {
+ this.a.call(this);
+ };
+ var b = extendWithReflect(a);
+ b.prototype.a = function() {};
+ return new b();
+ }
+ try {
+ testReflectExtension();
+ return extendWithReflect;
+ } catch (error) {
+ return function(constructor) {
+ return function(_super) {
+ __extends$1(Controller, _super);
+ function Controller() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ return Controller;
+ }(constructor);
+ };
+ }
+ }();
+ var Module = function() {
+ function Module(application, definition) {
+ this.application = application;
+ this.definition = blessDefinition(definition);
+ this.contextsByScope = new WeakMap();
+ this.connectedContexts = new Set();
+ }
+ Object.defineProperty(Module.prototype, "identifier", {
+ get: function() {
+ return this.definition.identifier;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Module.prototype, "controllerConstructor", {
+ get: function() {
+ return this.definition.controllerConstructor;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Module.prototype, "contexts", {
+ get: function() {
+ return Array.from(this.connectedContexts);
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Module.prototype.connectContextForScope = function(scope) {
+ var context = this.fetchContextForScope(scope);
+ this.connectedContexts.add(context);
+ context.connect();
+ };
+ Module.prototype.disconnectContextForScope = function(scope) {
+ var context = this.contextsByScope.get(scope);
+ if (context) {
+ this.connectedContexts.delete(context);
+ context.disconnect();
+ }
+ };
+ Module.prototype.fetchContextForScope = function(scope) {
+ var context = this.contextsByScope.get(scope);
+ if (!context) {
+ context = new Context(this, scope);
+ this.contextsByScope.set(scope, context);
+ }
+ return context;
+ };
+ return Module;
+ }();
+ var DataMap = function() {
+ function DataMap(scope) {
+ this.scope = scope;
+ }
+ Object.defineProperty(DataMap.prototype, "element", {
+ get: function() {
+ return this.scope.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(DataMap.prototype, "identifier", {
+ get: function() {
+ return this.scope.identifier;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ DataMap.prototype.get = function(key) {
+ key = this.getFormattedKey(key);
+ return this.element.getAttribute(key);
+ };
+ DataMap.prototype.set = function(key, value) {
+ key = this.getFormattedKey(key);
+ this.element.setAttribute(key, value);
+ return this.get(key);
+ };
+ DataMap.prototype.has = function(key) {
+ key = this.getFormattedKey(key);
+ return this.element.hasAttribute(key);
+ };
+ DataMap.prototype.delete = function(key) {
+ if (this.has(key)) {
+ key = this.getFormattedKey(key);
+ this.element.removeAttribute(key);
+ return true;
+ } else {
+ return false;
+ }
+ };
+ DataMap.prototype.getFormattedKey = function(key) {
+ return "data-" + this.identifier + "-" + dasherize(key);
+ };
+ return DataMap;
+ }();
+ function dasherize(value) {
+ return value.replace(/([A-Z])/g, function(_, char) {
+ return "-" + char.toLowerCase();
+ });
+ }
+ function attributeValueContainsToken(attributeName, token) {
+ return "[" + attributeName + '~="' + token + '"]';
+ }
+ var TargetSet = function() {
+ function TargetSet(scope) {
+ this.scope = scope;
+ }
+ Object.defineProperty(TargetSet.prototype, "element", {
+ get: function() {
+ return this.scope.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(TargetSet.prototype, "identifier", {
+ get: function() {
+ return this.scope.identifier;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(TargetSet.prototype, "schema", {
+ get: function() {
+ return this.scope.schema;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ TargetSet.prototype.has = function(targetName) {
+ return this.find(targetName) != null;
+ };
+ TargetSet.prototype.find = function() {
+ var targetNames = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ targetNames[_i] = arguments[_i];
+ }
+ var selector = this.getSelectorForTargetNames(targetNames);
+ return this.scope.findElement(selector);
+ };
+ TargetSet.prototype.findAll = function() {
+ var targetNames = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ targetNames[_i] = arguments[_i];
+ }
+ var selector = this.getSelectorForTargetNames(targetNames);
+ return this.scope.findAllElements(selector);
+ };
+ TargetSet.prototype.getSelectorForTargetNames = function(targetNames) {
+ var _this = this;
+ return targetNames.map(function(targetName) {
+ return _this.getSelectorForTargetName(targetName);
+ }).join(", ");
+ };
+ TargetSet.prototype.getSelectorForTargetName = function(targetName) {
+ var targetDescriptor = this.identifier + "." + targetName;
+ return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);
+ };
+ return TargetSet;
+ }();
+ var Scope = function() {
+ function Scope(schema, identifier, element) {
+ this.schema = schema;
+ this.identifier = identifier;
+ this.element = element;
+ this.targets = new TargetSet(this);
+ this.data = new DataMap(this);
+ }
+ Scope.prototype.findElement = function(selector) {
+ return this.findAllElements(selector)[0];
+ };
+ Scope.prototype.findAllElements = function(selector) {
+ var head = this.element.matches(selector) ? [ this.element ] : [];
+ var tail = this.filterElements(Array.from(this.element.querySelectorAll(selector)));
+ return head.concat(tail);
+ };
+ Scope.prototype.filterElements = function(elements) {
+ var _this = this;
+ return elements.filter(function(element) {
+ return _this.containsElement(element);
+ });
+ };
+ Scope.prototype.containsElement = function(element) {
+ return element.closest(this.controllerSelector) === this.element;
+ };
+ Object.defineProperty(Scope.prototype, "controllerSelector", {
+ get: function() {
+ return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);
+ },
+ enumerable: true,
+ configurable: true
+ });
+ return Scope;
+ }();
+ var ScopeObserver = function() {
+ function ScopeObserver(element, schema, delegate) {
+ this.element = element;
+ this.schema = schema;
+ this.delegate = delegate;
+ this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);
+ this.scopesByIdentifierByElement = new WeakMap();
+ this.scopeReferenceCounts = new WeakMap();
+ }
+ ScopeObserver.prototype.start = function() {
+ this.valueListObserver.start();
+ };
+ ScopeObserver.prototype.stop = function() {
+ this.valueListObserver.stop();
+ };
+ Object.defineProperty(ScopeObserver.prototype, "controllerAttribute", {
+ get: function() {
+ return this.schema.controllerAttribute;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ ScopeObserver.prototype.parseValueForToken = function(token) {
+ var element = token.element, identifier = token.content;
+ var scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);
+ var scope = scopesByIdentifier.get(identifier);
+ if (!scope) {
+ scope = new Scope(this.schema, identifier, element);
+ scopesByIdentifier.set(identifier, scope);
+ }
+ return scope;
+ };
+ ScopeObserver.prototype.elementMatchedValue = function(element, value) {
+ var referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;
+ this.scopeReferenceCounts.set(value, referenceCount);
+ if (referenceCount == 1) {
+ this.delegate.scopeConnected(value);
+ }
+ };
+ ScopeObserver.prototype.elementUnmatchedValue = function(element, value) {
+ var referenceCount = this.scopeReferenceCounts.get(value);
+ if (referenceCount) {
+ this.scopeReferenceCounts.set(value, referenceCount - 1);
+ if (referenceCount == 1) {
+ this.delegate.scopeDisconnected(value);
+ }
+ }
+ };
+ ScopeObserver.prototype.fetchScopesByIdentifierForElement = function(element) {
+ var scopesByIdentifier = this.scopesByIdentifierByElement.get(element);
+ if (!scopesByIdentifier) {
+ scopesByIdentifier = new Map();
+ this.scopesByIdentifierByElement.set(element, scopesByIdentifier);
+ }
+ return scopesByIdentifier;
+ };
+ return ScopeObserver;
+ }();
+ var Router = function() {
+ function Router(application) {
+ this.application = application;
+ this.scopeObserver = new ScopeObserver(this.element, this.schema, this);
+ this.scopesByIdentifier = new Multimap();
+ this.modulesByIdentifier = new Map();
+ }
+ Object.defineProperty(Router.prototype, "element", {
+ get: function() {
+ return this.application.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Router.prototype, "schema", {
+ get: function() {
+ return this.application.schema;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Router.prototype, "controllerAttribute", {
+ get: function() {
+ return this.schema.controllerAttribute;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Router.prototype, "modules", {
+ get: function() {
+ return Array.from(this.modulesByIdentifier.values());
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Router.prototype, "contexts", {
+ get: function() {
+ return this.modules.reduce(function(contexts, module) {
+ return contexts.concat(module.contexts);
+ }, []);
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Router.prototype.start = function() {
+ this.scopeObserver.start();
+ };
+ Router.prototype.stop = function() {
+ this.scopeObserver.stop();
+ };
+ Router.prototype.loadDefinition = function(definition) {
+ this.unloadIdentifier(definition.identifier);
+ var module = new Module(this.application, definition);
+ this.connectModule(module);
+ };
+ Router.prototype.unloadIdentifier = function(identifier) {
+ var module = this.modulesByIdentifier.get(identifier);
+ if (module) {
+ this.disconnectModule(module);
+ }
+ };
+ Router.prototype.getContextForElementAndIdentifier = function(element, identifier) {
+ var module = this.modulesByIdentifier.get(identifier);
+ if (module) {
+ return module.contexts.find(function(context) {
+ return context.element == element;
+ });
+ }
+ };
+ Router.prototype.handleError = function(error, message, detail) {
+ this.application.handleError(error, message, detail);
+ };
+ Router.prototype.scopeConnected = function(scope) {
+ this.scopesByIdentifier.add(scope.identifier, scope);
+ var module = this.modulesByIdentifier.get(scope.identifier);
+ if (module) {
+ module.connectContextForScope(scope);
+ }
+ };
+ Router.prototype.scopeDisconnected = function(scope) {
+ this.scopesByIdentifier.delete(scope.identifier, scope);
+ var module = this.modulesByIdentifier.get(scope.identifier);
+ if (module) {
+ module.disconnectContextForScope(scope);
+ }
+ };
+ Router.prototype.connectModule = function(module) {
+ this.modulesByIdentifier.set(module.identifier, module);
+ var scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);
+ scopes.forEach(function(scope) {
+ return module.connectContextForScope(scope);
+ });
+ };
+ Router.prototype.disconnectModule = function(module) {
+ this.modulesByIdentifier.delete(module.identifier);
+ var scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);
+ scopes.forEach(function(scope) {
+ return module.disconnectContextForScope(scope);
+ });
+ };
+ return Router;
+ }();
+ var defaultSchema = {
+ controllerAttribute: "data-controller",
+ actionAttribute: "data-action",
+ targetAttribute: "data-target"
+ };
+ var __awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function(resolve, reject) {
+ function fulfilled(value) {
+ try {
+ step(generator.next(value));
+ } catch (e) {
+ reject(e);
+ }
+ }
+ function rejected(value) {
+ try {
+ step(generator["throw"](value));
+ } catch (e) {
+ reject(e);
+ }
+ }
+ function step(result) {
+ result.done ? resolve(result.value) : new P(function(resolve) {
+ resolve(result.value);
+ }).then(fulfilled, rejected);
+ }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+ };
+ var __generator = undefined && undefined.__generator || function(thisArg, body) {
+ var _ = {
+ label: 0,
+ sent: function() {
+ if (t[0] & 1) throw t[1];
+ return t[1];
+ },
+ trys: [],
+ ops: []
+ }, f, y, t, g;
+ return g = {
+ next: verb(0),
+ throw: verb(1),
+ return: verb(2)
+ }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
+ return this;
+ }), g;
+ function verb(n) {
+ return function(v) {
+ return step([ n, v ]);
+ };
+ }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [ 0, t.value ];
+ switch (op[0]) {
+ case 0:
+ case 1:
+ t = op;
+ break;
+
+ case 4:
+ _.label++;
+ return {
+ value: op[1],
+ done: false
+ };
+
+ case 5:
+ _.label++;
+ y = op[1];
+ op = [ 0 ];
+ continue;
+
+ case 7:
+ op = _.ops.pop();
+ _.trys.pop();
+ continue;
+
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
+ _ = 0;
+ continue;
+ }
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
+ _.label = op[1];
+ break;
+ }
+ if (op[0] === 6 && _.label < t[1]) {
+ _.label = t[1];
+ t = op;
+ break;
+ }
+ if (t && _.label < t[2]) {
+ _.label = t[2];
+ _.ops.push(op);
+ break;
+ }
+ if (t[2]) _.ops.pop();
+ _.trys.pop();
+ continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) {
+ op = [ 6, e ];
+ y = 0;
+ } finally {
+ f = t = 0;
+ }
+ if (op[0] & 5) throw op[1];
+ return {
+ value: op[0] ? op[1] : void 0,
+ done: true
+ };
+ }
+ };
+ var Application = function() {
+ function Application(element, schema) {
+ if (element === void 0) {
+ element = document.documentElement;
+ }
+ if (schema === void 0) {
+ schema = defaultSchema;
+ }
+ this.element = element;
+ this.schema = schema;
+ this.dispatcher = new Dispatcher(this);
+ this.router = new Router(this);
+ }
+ Application.start = function(element, schema) {
+ var application = new Application(element, schema);
+ application.start();
+ return application;
+ };
+ Application.prototype.start = function() {
+ return __awaiter(this, void 0, void 0, function() {
+ return __generator(this, function(_a) {
+ switch (_a.label) {
+ case 0:
+ return [ 4, domReady() ];
+
+ case 1:
+ _a.sent();
+ this.router.start();
+ this.dispatcher.start();
+ return [ 2 ];
+ }
+ });
+ });
+ };
+ Application.prototype.stop = function() {
+ this.router.stop();
+ this.dispatcher.stop();
+ };
+ Application.prototype.register = function(identifier, controllerConstructor) {
+ this.load({
+ identifier: identifier,
+ controllerConstructor: controllerConstructor
+ });
+ };
+ Application.prototype.load = function(head) {
+ var _this = this;
+ var rest = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ rest[_i - 1] = arguments[_i];
+ }
+ var definitions = Array.isArray(head) ? head : [ head ].concat(rest);
+ definitions.forEach(function(definition) {
+ return _this.router.loadDefinition(definition);
+ });
+ };
+ Application.prototype.unload = function(head) {
+ var _this = this;
+ var rest = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ rest[_i - 1] = arguments[_i];
+ }
+ var identifiers = Array.isArray(head) ? head : [ head ].concat(rest);
+ identifiers.forEach(function(identifier) {
+ return _this.router.unloadIdentifier(identifier);
+ });
+ };
+ Object.defineProperty(Application.prototype, "controllers", {
+ get: function() {
+ return this.router.contexts.map(function(context) {
+ return context.controller;
+ });
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Application.prototype.getControllerForElementAndIdentifier = function(element, identifier) {
+ var context = this.router.getContextForElementAndIdentifier(element, identifier);
+ return context ? context.controller : null;
+ };
+ Application.prototype.handleError = function(error, message, detail) {
+ console.error("%s\n\n%o\n\n%o", message, error, detail);
+ };
+ return Application;
+ }();
+ function domReady() {
+ return new Promise(function(resolve) {
+ if (document.readyState == "loading") {
+ document.addEventListener("DOMContentLoaded", resolve);
+ } else {
+ resolve();
+ }
+ });
+ }
+ function defineTargetProperties(constructor) {
+ var prototype = constructor.prototype;
+ var targetNames = getTargetNamesForConstructor(constructor);
+ targetNames.forEach(function(name) {
+ var _a;
+ return defineLinkedProperties(prototype, (_a = {}, _a[name + "Target"] = {
+ get: function() {
+ var target = this.targets.find(name);
+ if (target) {
+ return target;
+ } else {
+ throw new Error('Missing target element "' + this.identifier + "." + name + '"');
+ }
+ }
+ }, _a[name + "Targets"] = {
+ get: function() {
+ return this.targets.findAll(name);
+ }
+ }, _a["has" + capitalize(name) + "Target"] = {
+ get: function() {
+ return this.targets.has(name);
+ }
+ }, _a));
+ });
+ }
+ function getTargetNamesForConstructor(constructor) {
+ var ancestors = getAncestorsForConstructor(constructor);
+ return Array.from(ancestors.reduce(function(targetNames, constructor) {
+ getOwnTargetNamesForConstructor(constructor).forEach(function(name) {
+ return targetNames.add(name);
+ });
+ return targetNames;
+ }, new Set()));
+ }
+ function getAncestorsForConstructor(constructor) {
+ var ancestors = [];
+ while (constructor) {
+ ancestors.push(constructor);
+ constructor = Object.getPrototypeOf(constructor);
+ }
+ return ancestors;
+ }
+ function getOwnTargetNamesForConstructor(constructor) {
+ var definition = constructor["targets"];
+ return Array.isArray(definition) ? definition : [];
+ }
+ function defineLinkedProperties(object, properties) {
+ Object.keys(properties).forEach(function(name) {
+ if (!(name in object)) {
+ var descriptor = properties[name];
+ Object.defineProperty(object, name, descriptor);
+ }
+ });
+ }
+ function capitalize(name) {
+ return name.charAt(0).toUpperCase() + name.slice(1);
+ }
+ var Controller = function() {
+ function Controller(context) {
+ this.context = context;
+ }
+ Controller.bless = function() {
+ defineTargetProperties(this);
+ };
+ Object.defineProperty(Controller.prototype, "application", {
+ get: function() {
+ return this.context.application;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Controller.prototype, "scope", {
+ get: function() {
+ return this.context.scope;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Controller.prototype, "element", {
+ get: function() {
+ return this.scope.element;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Controller.prototype, "identifier", {
+ get: function() {
+ return this.scope.identifier;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Controller.prototype, "targets", {
+ get: function() {
+ return this.scope.targets;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Controller.prototype, "data", {
+ get: function() {
+ return this.scope.data;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Controller.prototype.initialize = function() {};
+ Controller.prototype.connect = function() {};
+ Controller.prototype.disconnect = function() {};
+ Controller.targets = [];
+ return Controller;
+ }();
+ exports.Application = Application;
+ exports.Context = Context;
+ exports.Controller = Controller;
+ exports.defaultSchema = defaultSchema;
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+});