stimulus_reflex 3.5.0.pre8 → 3.5.0.pre9

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of stimulus_reflex might be problematic. Click here for more details.

Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2 -1218
  3. data/Gemfile.lock +109 -152
  4. data/README.md +39 -5
  5. data/Rakefile +0 -8
  6. data/app/assets/javascripts/stimulus_reflex.js +969 -0
  7. data/app/assets/javascripts/stimulus_reflex.min.js +2 -0
  8. data/app/assets/javascripts/stimulus_reflex.min.js.map +1 -0
  9. data/app/assets/javascripts/stimulus_reflex.umd.js +904 -0
  10. data/app/assets/javascripts/stimulus_reflex.umd.min.js +905 -0
  11. data/app/assets/javascripts/stimulus_reflex.umd.min.js.map +1 -0
  12. data/app/channels/stimulus_reflex/channel.rb +20 -1
  13. data/lib/stimulus_reflex/engine.rb +29 -0
  14. data/lib/stimulus_reflex/importmap.rb +4 -0
  15. data/lib/stimulus_reflex/open_struct_fix.rb +29 -0
  16. data/lib/stimulus_reflex/reflex.rb +9 -2
  17. data/lib/stimulus_reflex/reflex_data.rb +4 -0
  18. data/lib/stimulus_reflex/reflex_factory.rb +2 -1
  19. data/lib/stimulus_reflex/utils/logger.rb +2 -0
  20. data/lib/stimulus_reflex/utils/sanity_checker.rb +0 -58
  21. data/lib/stimulus_reflex/version.rb +1 -1
  22. data/lib/stimulus_reflex.rb +2 -6
  23. data/package.json +67 -0
  24. data/rollup.config.js +85 -0
  25. data/stimulus_reflex.gemspec +63 -0
  26. data/test/broadcasters/broadcaster_test_case.rb +1 -1
  27. data/test/broadcasters/nothing_broadcaster_test.rb +2 -1
  28. data/test/broadcasters/page_broadcaster_test.rb +4 -2
  29. data/test/broadcasters/selector_broadcaster_test.rb +12 -6
  30. data/test/callbacks_test.rb +23 -23
  31. data/test/reflex_test.rb +2 -2
  32. data/test/tmp/app/reflexes/application_reflex.rb +3 -10
  33. data/test/tmp/app/reflexes/{demo_reflex.rb → user_reflex.rb} +10 -2
  34. data/web-test-runner.config.mjs +12 -0
  35. data/yarn-error.log +4964 -0
  36. data/yarn.lock +4520 -0
  37. metadata +107 -41
  38. data/lib/generators/USAGE +0 -14
  39. data/lib/generators/stimulus_reflex/templates/app/javascript/controllers/%file_name%_controller.js.tt +0 -101
  40. data/lib/generators/stimulus_reflex/templates/app/javascript/controllers/application_controller.js.tt +0 -60
  41. data/lib/generators/stimulus_reflex/templates/app/reflexes/%file_name%_reflex.rb.tt +0 -41
  42. data/lib/generators/stimulus_reflex/templates/app/reflexes/application_reflex.rb.tt +0 -19
  43. data/lib/tasks/stimulus_reflex/install.rake +0 -116
@@ -0,0 +1,2 @@
1
+ import{Controller as e}from"@hotwired/stimulus";import t from"cable_ready";import{createConsumer as r}from"@rails/actioncable";const l={reflexAttribute:"data-reflex",reflexPermanentAttribute:"data-reflex-permanent",reflexRootAttribute:"data-reflex-root",reflexSuppressLoggingAttribute:"data-reflex-suppress-logging",reflexDatasetAttribute:"data-reflex-dataset",reflexDatasetAllAttribute:"data-reflex-dataset-all",reflexSerializeFormAttribute:"data-reflex-serialize-form",reflexFormSelectorAttribute:"data-reflex-form-selector",reflexIncludeInnerHtmlAttribute:"data-reflex-include-inner-html",reflexIncludeTextContentAttribute:"data-reflex-include-text-content"};let n={};var o={set(e){n={...l,...e.schema};for(const e in n)Object.defineProperty(this,e.slice(0,-9),{get:()=>n[e]})}};let a=!1;var s={get enabled(){return a},get disabled(){return!a},get value(){return a},set(e){a=!!e},set debug(e){a=!!e}};const i={};var d=(e,t,r,l,n,o)=>{const a=i[e];s.disabled||a.promise.data.suppressLogging||(a.timestamp=new Date,console.log(`↑ stimulus ↑ ${t}`,{reflexId:e,args:r,controller:l,element:n,controllerElement:o}))},c=(e,t)=>{const{detail:r}=e||{},{selector:l,payload:n}=r||{},{reflexId:o,target:a,morph:d}=r.stimulusReflex||{},c=i[o];if(s.disabled||c.promise.data.suppressLogging)return;const u=c.totalOperations>1?` ${c.completedOperations}/${c.totalOperations}`:"",f=c.timestamp?`in ${new Date-c.timestamp}ms`:"CLONED",m=e.type.split(":")[1].split("-").slice(1).join("_");console.log(`↓ reflex ↓ ${a} → ${l||"∞"}${u} ${f}`,{reflexId:o,morph:d,operation:m,halted:t,payload:n})},u=e=>{const{detail:t}=e||{},{reflexId:r,target:l,payload:n}=t.stimulusReflex||{},o=i[r];if(s.disabled||o.promise.data.suppressLogging)return;const a=o.timestamp?`in ${new Date-o.timestamp}ms`:"CLONED";console.log(`↓ reflex ↓ ${l} ${a} %cERROR: ${e.detail.body}`,"color: #f00;",{reflexId:r,payload:n})};let f=!0;var m={get enabled(){return f},get disabled(){return!f},get value(){return f},set(e){f=!!e},set deprecate(e){f=!!e}};const p=()=>{const e=window.crypto||window.msCrypto;return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(t=>(t^e.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)))},x=(e,t=!0)=>"string"!=typeof e?"":(e=e.replace(/[\s_](.)/g,(e=>e.toUpperCase())).replace(/[\s_]/g,"").replace(/^(.)/,(e=>e.toLowerCase())),t&&(e=e.substr(0,1).toUpperCase()+e.substr(1)),e),h=(e,t)=>{document.dispatchEvent(new CustomEvent(e,{bubbles:!0,cancelable:!1,detail:t})),window.jQuery&&window.jQuery(document).trigger(e,t)},g=e=>{if(""!==e.id)return"//*[@id='"+e.id+"']";if(e===document.body)return"/html/body";let t=0;const r=e?.parentNode?e.parentNode.childNodes:[];for(var l=0;l<r.length;l++){const n=r[l];if(n===e){return`${g(e.parentNode)}/${e.tagName.toLowerCase()}[${t+1}]`}1===n.nodeType&&n.tagName===e.tagName&&t++}},b=e=>document.evaluate(e,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,y=(e,t=!1)=>{const r=document.evaluate(e,document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),l=[];for(let e=0;e<r.snapshotLength;e++)l.push(r.snapshotItem(e));return t?l.reverse():l},v=(e=[])=>{const t=e.filter((e=>e&&String(e).length)).map((e=>e.trim())).join(" ").trim();return t.length?t:null},E=e=>e&&e.length?e.split(" ").filter((e=>e.trim().length)):[],w=e=>{let t=Array.from(e.attributes).reduce(((e,t)=>(e[t.name]=t.value,e)),{});if(t.checked=!!e.checked,t.selected=!!e.selected,t.tag_name=e.tagName,e.tagName.match(/select/i)||(e=>!!["checkbox","radio"].includes(e.type)&&document.querySelectorAll(`input[type="${e.type}"][name="${e.name}"]`).length>1)(e)){const r=(e=>Array.from(e.querySelectorAll("option:checked")).concat(Array.from(document.querySelectorAll(`input[type="${e.type}"][name="${e.name}"]`)).filter((e=>e.checked))).map((e=>e.value)))(e);t.values=r,t.value=r.join(",")}else t.value=e.value;return t},C=(e,t)=>{if(!t||0===t.length)return[];let r=[e];const l=g(e);return t.forEach((e=>{try{switch(e){case"combined":m.enabled&&console.warn("In the next version of StimulusReflex, the 'combined' option to data-reflex-dataset will become 'ancestors'."),r=[...r,...y(`${l}/ancestor::*`,!0)];break;case"ancestors":r=[...r,...y(`${l}/ancestor::*`,!0)];break;case"parent":r=[...r,...y(`${l}/parent::*`)];break;case"siblings":r=[...r,...y(`${l}/preceding-sibling::*|${l}/following-sibling::*`)];break;case"children":r=[...r,...y(`${l}/child::*`)];break;case"descendants":r=[...r,...y(`${l}/descendant::*`)];break;default:r=[...r,...document.querySelectorAll(e)]}}catch(e){s.enabled&&console.error(e)}})),r},I=e=>{let t={};return e&&e.attributes&&Array.from(e.attributes).forEach((e=>{e.name.startsWith("data-")&&(t[e.name]=e.value)})),t};let R=!1;var S={get disabled(){return!R},set(e){R=e}};const A=(e,t,r,l,n)=>{if(!r||!r.reflexData[l])return;const o=r.reflexController[l],a=r.reflexData[l].target,s=a.split("#")[1],d=o[["before","after","finalize"].includes(e)?`${e}${x(s)}`:`${x(s,!1)}${x(e)}`],c=o[["before","after","finalize"].includes(e)?`${e}Reflex`:`reflex${x(e)}`];"function"==typeof d&&d.call(o,t,a,r.reflexError[l],l,n),"function"==typeof c&&c.call(o,t,a,r.reflexError[l],l,n),i[l]&&e===i[l].finalStage&&(Reflect.deleteProperty(r.reflexController,l),Reflect.deleteProperty(r.reflexData,l),Reflect.deleteProperty(r.reflexError,l))};document.addEventListener("stimulus-reflex:before",(e=>A("before",e.detail.element,e.detail.controller.element,e.detail.reflexId,e.detail.payload)),!0),document.addEventListener("stimulus-reflex:success",(e=>{A("success",e.detail.element,e.detail.controller.element,e.detail.reflexId,e.detail.payload),$("after",e.detail.element,e.detail.controller.element,e.detail.reflexId,e.detail.payload)}),!0),document.addEventListener("stimulus-reflex:nothing",(e=>{$("success",e.detail.element,e.detail.controller.element,e.detail.reflexId,e.detail.payload)}),!0),document.addEventListener("stimulus-reflex:error",(e=>{A("error",e.detail.element,e.detail.controller.element,e.detail.reflexId,e.detail.payload),$("after",e.detail.element,e.detail.controller.element,e.detail.reflexId,e.detail.payload)}),!0),document.addEventListener("stimulus-reflex:halted",(e=>A("halted",e.detail.element,e.detail.controller.element,e.detail.reflexId,e.detail.payload)),!0),document.addEventListener("stimulus-reflex:after",(e=>A("after",e.detail.element,e.detail.controller.element,e.detail.reflexId,e.detail.payload)),!0),document.addEventListener("stimulus-reflex:finalize",(e=>A("finalize",e.detail.element,e.detail.controller.element,e.detail.reflexId,e.detail.payload)),!0);const $=(e,t,r,l,n)=>{if(!r)return void(s.enabled&&!i[l].warned&&(console.warn(`StimulusReflex was not able execute callbacks or emit events for "${e}" or later life-cycle stages for this Reflex. The StimulusReflex Controller Element is no longer present in the DOM. Could you move the StimulusReflex Controller to an element higher in your DOM?`),i[l].warned=!0));if(!r.reflexController||r.reflexController&&!r.reflexController[l])return void(s.enabled&&!i[l].warned&&(console.warn(`StimulusReflex detected that the StimulusReflex Controller responsible for this Reflex has been replaced with a new instance. Callbacks and events for "${e}" or later life-cycle stages cannot be executed.`),i[l].warned=!0));const{target:o}=r.reflexData[l]||{},a=r.reflexController[l]||{},d=`stimulus-reflex:${e}`,c=`${d}:${o.split("#")[1]}`,u={reflex:o,controller:a,reflexId:l,element:t,payload:n},f={bubbles:!0,cancelable:!1,detail:u};r.dispatchEvent(new CustomEvent(d,f)),r.dispatchEvent(new CustomEvent(c,f)),window.jQuery&&(window.jQuery(r).trigger(d,u),window.jQuery(r).trigger(c,u))},L=(e,t)=>E(t.getAttribute(o.controller)).reduce(((r,l)=>{const n=e.getControllerForElementAndIdentifier(t,l);return n&&n.StimulusReflex&&r.push(n),r}),[]),O=e=>{if(!e.cableReady)return;if(e.version.replace(".pre","-pre")!==t.version)return void(s.enabled&&console.error(`Reflex failed due to cable_ready gem/NPM package version mismatch. Package versions must match exactly.\nNote that if you are using pre-release builds, gems use the "x.y.z.preN" version format, while NPM packages use "x.y.z-preN".\n\ncable_ready gem: ${e.version}\ncable_ready NPM: ${t.version}`));let r,l=[];for(let t=e.operations.length-1;t>=0;t--)e.operations[t].stimulusReflex&&(l.push(e.operations[t]),e.operations.splice(t,1));if(!l.some((e=>e.stimulusReflex.url!==location.href)))if(l.length&&(r=l[0].stimulusReflex,r.payload=l[0].payload),r){const{reflexId:n,payload:o}=r;if(!i[n]&&S.disabled){const e=b(r.xpathController),t=b(r.xpathElement);e.reflexController=e.reflexController||{},e.reflexData=e.reflexData||{},e.reflexError=e.reflexError||{},e.reflexController[n]=i.app.getControllerForElementAndIdentifier(e,r.reflexController),e.reflexData[n]=r,$("before",t,e,n,o),_(r)}i[n]&&(i[n].totalOperations=l.length,i[n].pendingOperations=l.length,i[n].completedOperations=0,i[n].piggybackOperations=e.operations,t.perform(l))}else e.operations.length&&i[e.operations[0].reflexId]&&t.perform(e.operations)},_=e=>{const{reflexId:t}=e;i[t]={finalStage:"finalize"};const r=new Promise(((r,l)=>{i[t].promise={resolve:r,reject:l,data:e}}));return r.reflexId=t,s.enabled&&r.catch((()=>{})),r},D=((e,t=250)=>{let r;return(...l)=>{clearTimeout(r),r=setTimeout((()=>{r=null,e(...l)}),t)}})((()=>{document.querySelectorAll(`[${o.reflex}]`).forEach((e=>{const t=E(e.getAttribute(o.controller)),r=E(e.getAttribute(o.reflex)),l=E(e.getAttribute(o.action));r.forEach((r=>{const n=((e,t)=>t.find((t=>{if(t.identifier)return(e=>{const t=e.match(/(?:.*->)?(.*?)(?:Reflex)?#/);return t?t[1]:""})(e).replace(/([a-z0–9])([A-Z])/g,"$1-$2").replace(/(::)/g,"--").toLowerCase()===t.identifier}))||t[0])(r,((e,t)=>{let r=[];for(;t;)r=r.concat(L(e,t)),t=t.parentElement;return r})(i.app,e));let o;n?(o=`${r.split("->")[0]}->${n.identifier}#__perform`,l.includes(o)||l.push(o)):(o=`${r.split("->")[0]}->stimulus-reflex#__perform`,t.includes("stimulus-reflex")||t.push("stimulus-reflex"),l.includes(o)||l.push(o))}));const n=v(t),a=v(l);n&&e.getAttribute(o.controller)!=n&&e.setAttribute(o.controller,n),a&&e.getAttribute(o.action)!=a&&e.setAttribute(o.action,a)})),h("stimulus-reflex:ready")}),20);class T{constructor(e,t,r,l,n,o,a,s,i){this.options=e,this.reflexElement=t,this.controllerElement=r,this.reflexController=l,this.permanentAttributeName=n,this.target=o,this.args=a,this.url=s,this.tabId=i}get attrs(){return this._attrs=this._attrs||this.options.attrs||w(this.reflexElement),this._attrs}get reflexId(){return this._reflexId=this._reflexId||this.options.reflexId||p(),this._reflexId}get selectors(){return this._selectors=this._selectors||this.options.selectors||(e=>{let t=[];for(;0===t.length&&e;){let r=e.getAttribute(o.reflexRoot);if(r){0===r.length&&e.id&&(r=`#${e.id}`);const l=r.split(",").filter((e=>e.trim().length));s.enabled&&0===l.length&&console.error(`No value found for ${o.reflexRoot}. Add an #id to the element or provide a value for ${o.reflexRoot}.`,e),t=t.concat(l.filter((e=>document.querySelector(e))))}e=e.parentElement?e.parentElement.closest(`[${o.reflexRoot}]`):null}return t})(this.reflexElement),"string"==typeof this._selectors?[this._selectors]:this._selectors}get resolveLate(){return this.options.resolveLate||!1}get dataset(){return this._dataset=this._dataset||(e=>{const t=e.attributes[o.reflexDataset],r=e.attributes[o.reflexDatasetAll],l=t&&t.value.split(" ")||[],n=r&&r.value.split(" ")||[],a=C(e,l),s=C(e,n),i=a.reduce(((e,t)=>({...I(t),...e})),{}),d={dataset:{...I(e),...i},datasetAll:{}};return s.forEach((e=>{const t=I(e);Object.keys(t).forEach((e=>{const r=t[e];d.datasetAll[e]&&Array.isArray(d.datasetAll[e])?d.datasetAll[e].push(r):d.datasetAll[e]=[r]}))})),d})(this.reflexElement),this._dataset}get innerHTML(){return this.includeInnerHtml?this.reflexElement.innerHTML:""}get textContent(){return this.includeTextContent?this.reflexElement.textContent:""}get xpathController(){return g(this.controllerElement)}get xpathElement(){return g(this.reflexElement)}get formSelector(){const e=this.reflexElement.attributes[o.reflexFormSelector]?this.reflexElement.attributes[o.reflexFormSelector].value:void 0;return this.options.formSelector||e}get includeInnerHtml(){const e=this.reflexElement.attributes[o.reflexIncludeInnerHtml]||!1;return!(!this.options.includeInnerHTML&&!e)&&"false"!==e.value}get includeTextContent(){const e=this.reflexElement.attributes[o.reflexIncludeTextContent]||!1;return!(!this.options.includeTextContent&&!e)&&"false"!==e.value}get suppressLogging(){return this.options.suppressLogging||this.reflexElement.attributes[o.reflexSuppressLogging]||!1}valueOf(){return{attrs:this.attrs,dataset:this.dataset,selectors:this.selectors,reflexId:this.reflexId,resolveLate:this.resolveLate,suppressLogging:this.suppressLogging,xpathController:this.xpathController,xpathElement:this.xpathElement,inner_html:this.innerHTML,text_content:this.textContent,formSelector:this.formSelector,reflexController:this.reflexController,permanentAttributeName:this.permanentAttributeName,target:this.target,args:this.args,url:this.url,tabId:this.tabId,version:"3.5.0-pre9"}}}let N,j,k;const z=()=>{k=!0,document.body.classList.replace("stimulus-reflex-disconnected","stimulus-reflex-connected"),h("stimulus-reflex:connected"),h("stimulus-reflex:action-cable:connected")},P=()=>{k=!1,document.body.classList.replace("stimulus-reflex-connected","stimulus-reflex-disconnected"),h("stimulus-reflex:rejected"),h("stimulus-reflex:action-cable:rejected"),Debug.enabled&&console.warn("Channel subscription was rejected.")},F=e=>{k=!1,document.body.classList.replace("stimulus-reflex-connected","stimulus-reflex-disconnected"),h("stimulus-reflex:disconnected",e),h("stimulus-reflex:action-cable:disconnected",e)};var M={consumer:N,params:j,get subscriptionActive(){return k},createSubscription:e=>{N=N||e.application.consumer||r();const{channel:t}=e.StimulusReflex,l={channel:t,...j},n=JSON.stringify(l);e.StimulusReflex.subscription=N.subscriptions.findAll(n)[0]||N.subscriptions.create(l,{received:O,connected:z,rejected:P,disconnected:F})},connected:z,rejected:P,disconnected:F,set(e,t){N=e,j=t}};const H=e=>{const{stimulusReflex:t,payload:r}=e.detail||{};if(!t)return;const{reflexId:l,xpathElement:n,xpathController:o}=t,a=b(o),s=b(n),d=i[l],{promise:c}=d;d.pendingOperations--,d.pendingOperations>0||(t.resolveLate||setTimeout((()=>c.resolve({element:s,event:e,data:c.data,payload:r,reflexId:l,toString:()=>""}))),setTimeout((()=>$("success",s,a,l,r))))},U=e=>{const{stimulusReflex:r,payload:l}=e.detail||{};if(!r)return;const{reflexId:n,xpathElement:o,xpathController:a}=r,s=b(a),d=b(o),u=i[n],{promise:f}=u;u.completedOperations++,c(e,!1),u.completedOperations<u.totalOperations||(r.resolveLate&&setTimeout((()=>f.resolve({element:d,event:e,data:f.data,payload:l,reflexId:n,toString:()=>""}))),setTimeout((()=>$("finalize",d,s,n,l))),u.piggybackOperations.length&&t.perform(u.piggybackOperations))},q=(e,t,r,l,n)=>{l.finalStage="after",c(e,!1),setTimeout((()=>r.resolve({data:r.data,element:n,event:e,payload:t,reflexId:r.data.reflexId,toString:()=>""})))},Q=(e,t,r,l,n)=>{l.finalStage="halted",c(e,!0),setTimeout((()=>r.resolve({data:r.data,element:n,event:e,payload:t,reflexId:r.data.reflexId,toString:()=>""})))},V=(e,t,r,l,n)=>{l.finalStage="after",u(e),setTimeout((()=>r.reject({data:r.data,element:n,event:e,payload:t,reflexId:r.data.reflexId,error:e.detail.body,toString:()=>e.detail.body})))};class X extends e{constructor(...e){super(...e),J(this)}}const Y=(e,{controller:t,consumer:r,debug:l,params:n,isolate:a,deprecate:d}={})=>{M.set(r,n),document.addEventListener("DOMContentLoaded",(()=>{document.body.classList.remove("stimulus-reflex-connected"),document.body.classList.add("stimulus-reflex-disconnected"),m.enabled&&r&&console.warn("Deprecation warning: the next version of StimulusReflex will obtain a reference to consumer via the Stimulus application object.\nPlease add 'application.consumer = consumer' to your index.js after your Stimulus application has been established, and remove the consumer key from your StimulusReflex initialize() options object."),m.enabled&&S.disabled&&console.warn("Deprecation warning: the next version of StimulusReflex will standardize isolation mode, and the isolate option will be removed.\nPlease update your applications to assume that every tab will be isolated.")}),{once:!0}),S.set(!!a),i.app=e,o.set(e),i.app.register("stimulus-reflex",t||X),s.set(!!l),void 0!==d&&m.set(d);new MutationObserver(D).observe(document.documentElement,{attributeFilter:[o.reflex,o.action],childList:!0,subtree:!0})},J=(e,t={})=>{e.StimulusReflex={...t,channel:"StimulusReflex::Channel"},M.createSubscription(e),Object.assign(e,{isActionCableConnectionOpen(){return this.StimulusReflex.subscription.consumer.connection.isOpen()},stimulate(){const e=location.href,t=Array.from(arguments),r=t.shift()||"StimulusReflex::Reflex#default_reflex",l=this.element,n=t[0]&&t[0].nodeType===Node.ELEMENT_NODE?t.shift():l;if("number"===n.type&&n.validity&&n.validity.badInput)return void(s.enabled&&console.warn("Reflex aborted: invalid numeric input"));const a={};if(t[0]&&"object"==typeof t[0]&&Object.keys(t[0]).filter((e=>["attrs","selectors","reflexId","resolveLate","serializeForm","suppressLogging","includeInnerHTML","includeTextContent"].includes(e))).length){const e=t.shift();Object.keys(e).forEach((t=>a[t]=e[t]))}const i=new T(a,n,l,this.identifier,o.reflexPermanent,r,t,e,W),c=i.reflexId;if(!this.isActionCableConnectionOpen())throw"The ActionCable connection is not open! `this.isActionCableConnectionOpen()` must return true before calling `this.stimulate()`";if(!M.subscriptionActive)throw"The ActionCable channel subscription for StimulusReflex was rejected.";l.reflexController=l.reflexController||{},l.reflexData=l.reflexData||{},l.reflexError=l.reflexError||{},l.reflexController[c]=this,l.reflexData[c]=i.valueOf(),$("before",n,l,c),setTimeout((()=>{const{params:e}=l.reflexData[c]||{},t=n.attributes[o.reflexSerializeForm];t&&(a.serializeForm="false"!==t.value);const r=n.closest(i.formSelector)||document.querySelector(i.formSelector)||n.closest("form");m.enabled&&void 0===a.serializeForm&&r&&console.warn(`Deprecation warning: the next version of StimulusReflex will not serialize forms by default.\nPlease set ${o.reflexSerializeForm}="true" on your Reflex Controller Element or pass { serializeForm: true } as an option to stimulate.`);const s=!1===a.serializeForm?"":((e,t={})=>{if(!e)return"";const r=t.w||window,{element:l}=t,n=new r.FormData(e),o=Array.from(n,(e=>e.map(encodeURIComponent).join("="))),a=e.querySelector("input[type=submit]");return l&&l.name&&"INPUT"===l.nodeName&&"submit"===l.type?o.push(`${encodeURIComponent(l.name)}=${encodeURIComponent(l.value)}`):a&&a.name&&o.push(`${encodeURIComponent(a.name)}=${encodeURIComponent(a.value)}`),Array.from(o).join("&")})(r,{element:n});l.reflexData[c]={...i.valueOf(),params:e,formData:s},this.StimulusReflex.subscription.send(l.reflexData[c])}));const u=_(i.valueOf());return d(c,r,t,this.context.scope.identifier,n,l),u},__perform(e){let t,r=e.target;for(;r&&!t;)t=r.getAttribute(o.reflex),t&&t.trim().length||(r=r.parentElement);const l=E(t).find((t=>t.split("->")[0]===e.type));l&&(e.preventDefault(),e.stopPropagation(),this.stimulate(l.split("->")[1],r))}})},W=p(),Z=(e,t={})=>{J(e,t)};document.addEventListener("cable-ready:after-dispatch-event",(e=>{const{stimulusReflex:r,payload:l,name:n,body:o}=e.detail||{},a=n.split("-")[2];if(!r||!["nothing","halted","error"].includes(a))return;const{reflexId:s,xpathElement:d,xpathController:c}=r,u=b(d),f=b(c),m=i[s],{promise:p}=m;switch(f&&(f.reflexError=f.reflexError||{},"error"===a&&(f.reflexError[s]=o)),a){case"nothing":q(e,l,p,m,u);break;case"error":V(e,l,p,m,u);break;case"halted":Q(e,l,p,m,u)}setTimeout((()=>$(a,u,f,s,l))),m.piggybackOperations.length&&t.perform(m.piggybackOperations)})),document.addEventListener("cable-ready:before-inner-html",H),document.addEventListener("cable-ready:before-morph",H),document.addEventListener("cable-ready:after-inner-html",U),document.addEventListener("cable-ready:after-morph",U),window.addEventListener("load",D);const B={...Object.freeze({__proto__:null,initialize:Y,register:J,useReflex:Z}),get debug(){return s.value},set debug(e){s.set(!!e)},get deprecate(){return m.value},set deprecate(e){m.set(!!e)}};window.StimulusReflex=B;export{B as default,Y as initialize,J as register,Z as useReflex};
2
+ //# sourceMappingURL=stimulus_reflex.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stimulus_reflex.min.js","sources":["../../../javascript/schema.js","../../../javascript/debug.js","../../../javascript/reflex_store.js","../../../javascript/log.js","../../../javascript/deprecate.js","../../../javascript/utils.js","../../../javascript/attributes.js","../../../javascript/isolation_mode.js","../../../javascript/lifecycle.js","../../../javascript/controllers.js","../../../javascript/reflexes.js","../../../javascript/reflex_data.js","../../../javascript/transports/action_cable.js","../../../javascript/callbacks.js","../../../javascript/stimulus_reflex.js","../../../javascript/index.js"],"sourcesContent":["const defaultSchema = {\n reflexAttribute: 'data-reflex',\n reflexPermanentAttribute: 'data-reflex-permanent',\n reflexRootAttribute: 'data-reflex-root',\n reflexSuppressLoggingAttribute: 'data-reflex-suppress-logging',\n reflexDatasetAttribute: 'data-reflex-dataset',\n reflexDatasetAllAttribute: 'data-reflex-dataset-all',\n reflexSerializeFormAttribute: 'data-reflex-serialize-form',\n reflexFormSelectorAttribute: 'data-reflex-form-selector',\n reflexIncludeInnerHtmlAttribute: 'data-reflex-include-inner-html',\n reflexIncludeTextContentAttribute: 'data-reflex-include-text-content'\n}\n\nlet schema = {}\n\nexport { schema, defaultSchema }\n\nexport default {\n set (application) {\n schema = { ...defaultSchema, ...application.schema }\n for (const attribute in schema) {\n Object.defineProperty(this, attribute.slice(0, -9), {\n get: () => {\n return schema[attribute]\n }\n })\n }\n }\n}\n","let debugging = false\n\nexport default {\n get enabled () {\n return debugging\n },\n get disabled () {\n return !debugging\n },\n get value () {\n return debugging\n },\n set (value) {\n debugging = !!value\n },\n set debug (value) {\n debugging = !!value\n }\n}\n","const reflexes = {}\n\nexport { reflexes }\n","import Debug from './debug'\n\nimport { reflexes } from './reflex_store'\n\nconst request = (\n reflexId,\n target,\n args,\n controller,\n element,\n controllerElement\n) => {\n const reflex = reflexes[reflexId]\n if (Debug.disabled || reflex.promise.data.suppressLogging) return\n reflex.timestamp = new Date()\n console.log(`\\u2191 stimulus \\u2191 ${target}`, {\n reflexId,\n args,\n controller,\n element,\n controllerElement\n })\n}\n\nconst success = (event, halted) => {\n const { detail } = event || {}\n const { selector, payload } = detail || {}\n const { reflexId, target, morph } = detail.stimulusReflex || {}\n const reflex = reflexes[reflexId]\n if (Debug.disabled || reflex.promise.data.suppressLogging) return\n const progress =\n reflex.totalOperations > 1\n ? ` ${reflex.completedOperations}/${reflex.totalOperations}`\n : ''\n const duration = reflex.timestamp\n ? `in ${new Date() - reflex.timestamp}ms`\n : 'CLONED'\n const operation = event.type\n .split(':')[1]\n .split('-')\n .slice(1)\n .join('_')\n console.log(\n `\\u2193 reflex \\u2193 ${target} \\u2192 ${selector ||\n '\\u221E'}${progress} ${duration}`,\n { reflexId, morph, operation, halted, payload }\n )\n}\n\nconst error = event => {\n const { detail } = event || {}\n const { reflexId, target, payload } = detail.stimulusReflex || {}\n const reflex = reflexes[reflexId]\n if (Debug.disabled || reflex.promise.data.suppressLogging) return\n const duration = reflex.timestamp\n ? `in ${new Date() - reflex.timestamp}ms`\n : 'CLONED'\n console.log(\n `\\u2193 reflex \\u2193 ${target} ${duration} %cERROR: ${event.detail.body}`,\n 'color: #f00;',\n { reflexId, payload }\n )\n}\n\nexport default { request, success, error }\n","let deprecationWarnings = true\n\nexport default {\n get enabled () {\n return deprecationWarnings\n },\n get disabled () {\n return !deprecationWarnings\n },\n get value () {\n return deprecationWarnings\n },\n set (value) {\n deprecationWarnings = !!value\n },\n set deprecate (value) {\n deprecationWarnings = !!value\n }\n}\n","// uuid4 function taken from stackoverflow\n// https://stackoverflow.com/a/2117523/554903\n\nconst uuidv4 = () => {\n const crypto = window.crypto || window.msCrypto\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>\n (\n c ^\n (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\n ).toString(16)\n )\n}\n\nconst serializeForm = (form, options = {}) => {\n if (!form) return ''\n\n const w = options.w || window\n const { element } = options\n const formData = new w.FormData(form)\n const data = Array.from(formData, e => e.map(encodeURIComponent).join('='))\n const submitButton = form.querySelector('input[type=submit]')\n if (\n element &&\n element.name &&\n element.nodeName === 'INPUT' &&\n element.type === 'submit'\n ) {\n data.push(\n `${encodeURIComponent(element.name)}=${encodeURIComponent(element.value)}`\n )\n } else if (submitButton && submitButton.name) {\n data.push(\n `${encodeURIComponent(submitButton.name)}=${encodeURIComponent(\n submitButton.value\n )}`\n )\n }\n return Array.from(data).join('&')\n}\n\nconst camelize = (value, uppercaseFirstLetter = true) => {\n if (typeof value !== 'string') return ''\n value = value\n .replace(/[\\s_](.)/g, $1 => $1.toUpperCase())\n .replace(/[\\s_]/g, '')\n .replace(/^(.)/, $1 => $1.toLowerCase())\n\n if (uppercaseFirstLetter)\n value = value.substr(0, 1).toUpperCase() + value.substr(1)\n\n return value\n}\n\nconst debounce = (callback, delay = 250) => {\n let timeoutId\n return (...args) => {\n clearTimeout(timeoutId)\n timeoutId = setTimeout(() => {\n timeoutId = null\n callback(...args)\n }, delay)\n }\n}\n\nconst extractReflexName = reflexString => {\n const match = reflexString.match(/(?:.*->)?(.*?)(?:Reflex)?#/)\n\n return match ? match[1] : ''\n}\n\nconst emitEvent = (event, detail) => {\n document.dispatchEvent(\n new CustomEvent(event, {\n bubbles: true,\n cancelable: false,\n detail\n })\n )\n if (window.jQuery) window.jQuery(document).trigger(event, detail)\n}\n\n// construct a valid xPath for an element in the DOM\nconst elementToXPath = element => {\n if (element.id !== '') return \"//*[@id='\" + element.id + \"']\"\n if (element === document.body) return '/html/body'\n\n let ix = 0\n const siblings = element?.parentNode ? element.parentNode.childNodes : []\n\n for (var i = 0; i < siblings.length; i++) {\n const sibling = siblings[i]\n if (sibling === element) {\n const computedPath = elementToXPath(element.parentNode)\n const tagName = element.tagName.toLowerCase()\n const ixInc = ix + 1\n return `${computedPath}/${tagName}[${ixInc}]`\n }\n\n if (sibling.nodeType === 1 && sibling.tagName === element.tagName) {\n ix++\n }\n }\n}\n\nconst XPathToElement = xpath => {\n return document.evaluate(\n xpath,\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n ).singleNodeValue\n}\n\nconst XPathToArray = (xpath, reverse = false) => {\n const snapshotList = document.evaluate(\n xpath,\n document,\n null,\n XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,\n null\n )\n\n const snapshots = []\n\n for (let i = 0; i < snapshotList.snapshotLength; i++) {\n snapshots.push(snapshotList.snapshotItem(i))\n }\n\n return reverse ? snapshots.reverse() : snapshots\n}\n\nexport {\n uuidv4,\n serializeForm,\n camelize,\n debounce,\n extractReflexName,\n emitEvent,\n elementToXPath,\n XPathToElement,\n XPathToArray\n}\n","import Schema from './schema'\nimport Debug from './debug'\nimport Deprecate from './deprecate'\n\nimport { elementToXPath, XPathToArray } from './utils'\n\nconst multipleInstances = element => {\n if (['checkbox', 'radio'].includes(element.type)) {\n return (\n document.querySelectorAll(\n `input[type=\"${element.type}\"][name=\"${element.name}\"]`\n ).length > 1\n )\n }\n return false\n}\nconst collectCheckedOptions = element => {\n return Array.from(element.querySelectorAll('option:checked'))\n .concat(\n Array.from(\n document.querySelectorAll(\n `input[type=\"${element.type}\"][name=\"${element.name}\"]`\n )\n ).filter(elem => elem.checked)\n )\n .map(o => o.value)\n}\n\n// Returns a string value for the passed array.\n//\n// attributeValue(['', 'one', null, 'two', 'three ']) // 'one two three'\n//\nconst attributeValue = (values = []) => {\n const value = values\n .filter(v => v && String(v).length)\n .map(v => v.trim())\n .join(' ')\n .trim()\n return value.length ? value : null\n}\n\n// Returns an array for the passed string value by splitting on whitespace.\n//\n// attributeValues('one two three ') // ['one', 'two', 'three']\n//\nconst attributeValues = value => {\n if (!value) return []\n if (!value.length) return []\n return value.split(' ').filter(v => v.trim().length)\n}\n\n// Extracts attributes from a DOM element.\n//\nconst extractElementAttributes = element => {\n let attrs = Array.from(element.attributes).reduce((memo, attr) => {\n memo[attr.name] = attr.value\n return memo\n }, {})\n\n attrs.checked = !!element.checked\n attrs.selected = !!element.selected\n attrs.tag_name = element.tagName\n\n if (element.tagName.match(/select/i) || multipleInstances(element)) {\n const collectedOptions = collectCheckedOptions(element)\n attrs.values = collectedOptions\n attrs.value = collectedOptions.join(',')\n } else {\n attrs.value = element.value\n }\n return attrs\n}\n\n// Returns an array of elements for the provided tokens.\n// Tokens is an array of space separated string coming from the `data-reflex-dataset`\n// or `data-reflex-dataset-all` attribute.\n//\nconst getElementsFromTokens = (element, tokens) => {\n if (!tokens || tokens.length === 0) return []\n\n let elements = [element]\n\n const xPath = elementToXPath(element)\n\n tokens.forEach(token => {\n try {\n switch (token) {\n case 'combined':\n if (Deprecate.enabled)\n console.warn(\n \"In the next version of StimulusReflex, the 'combined' option to data-reflex-dataset will become 'ancestors'.\"\n )\n elements = [\n ...elements,\n ...XPathToArray(`${xPath}/ancestor::*`, true)\n ]\n break\n case 'ancestors':\n elements = [\n ...elements,\n ...XPathToArray(`${xPath}/ancestor::*`, true)\n ]\n break\n case 'parent':\n elements = [...elements, ...XPathToArray(`${xPath}/parent::*`)]\n break\n case 'siblings':\n elements = [\n ...elements,\n ...XPathToArray(\n `${xPath}/preceding-sibling::*|${xPath}/following-sibling::*`\n )\n ]\n break\n case 'children':\n elements = [...elements, ...XPathToArray(`${xPath}/child::*`)]\n break\n case 'descendants':\n elements = [...elements, ...XPathToArray(`${xPath}/descendant::*`)]\n break\n default:\n elements = [...elements, ...document.querySelectorAll(token)]\n }\n } catch (error) {\n if (Debug.enabled) console.error(error)\n }\n })\n\n return elements\n}\n\n// Extracts the dataset of an element and combines it with the data attributes from all specified tokens\n//\nconst extractElementDataset = element => {\n const dataset = element.attributes[Schema.reflexDataset]\n const allDataset = element.attributes[Schema.reflexDatasetAll]\n\n const tokens = (dataset && dataset.value.split(' ')) || []\n const allTokens = (allDataset && allDataset.value.split(' ')) || []\n\n const datasetElements = getElementsFromTokens(element, tokens)\n const datasetAllElements = getElementsFromTokens(element, allTokens)\n\n const datasetAttributes = datasetElements.reduce((acc, ele) => {\n return { ...extractDataAttributes(ele), ...acc }\n }, {})\n\n const reflexElementAttributes = extractDataAttributes(element)\n\n const elementDataset = {\n dataset: { ...reflexElementAttributes, ...datasetAttributes },\n datasetAll: {}\n }\n\n datasetAllElements.forEach(element => {\n const elementAttributes = extractDataAttributes(element)\n\n Object.keys(elementAttributes).forEach(key => {\n const value = elementAttributes[key]\n\n if (\n elementDataset.datasetAll[key] &&\n Array.isArray(elementDataset.datasetAll[key])\n ) {\n elementDataset.datasetAll[key].push(value)\n } else {\n elementDataset.datasetAll[key] = [value]\n }\n })\n })\n\n return elementDataset\n}\n\n// Extracts all data attributes from a DOM element.\n//\nconst extractDataAttributes = element => {\n let attrs = {}\n\n if (element && element.attributes) {\n Array.from(element.attributes).forEach(attr => {\n if (attr.name.startsWith('data-')) {\n attrs[attr.name] = attr.value\n }\n })\n }\n\n return attrs\n}\n\nexport {\n attributeValue,\n attributeValues,\n extractElementAttributes,\n extractElementDataset,\n extractDataAttributes\n}\n","let isolationMode = false\n\nexport default {\n get disabled () {\n return !isolationMode\n },\n set (value) {\n isolationMode = value\n }\n}\n","import Debug from './debug'\n\nimport { camelize } from './utils'\nimport { reflexes } from './reflex_store'\n\n// Invokes a lifecycle method on a StimulusReflex controller.\n//\n// - stage - the lifecycle stage\n// * before\n// * success\n// * error\n// * halted\n// * after\n// * finalize\n//\n// - reflexElement - the element that triggered the Reflex (not necessarily the StimulusReflex Controller Element)\n// - controllerElement - the element holding the StimulusReflex Controller\n// - reflexId - the UUIDv4 which uniquely identifies the Reflex\n// - payload - the optional \"return value\" from the Reflex method\n//\nconst invokeLifecycleMethod = (\n stage,\n reflexElement,\n controllerElement,\n reflexId,\n payload\n) => {\n if (!controllerElement || !controllerElement.reflexData[reflexId]) return\n\n const controller = controllerElement.reflexController[reflexId]\n const reflex = controllerElement.reflexData[reflexId].target\n const reflexMethodName = reflex.split('#')[1]\n\n const specificLifecycleMethodName = ['before', 'after', 'finalize'].includes(\n stage\n )\n ? `${stage}${camelize(reflexMethodName)}`\n : `${camelize(reflexMethodName, false)}${camelize(stage)}`\n const specificLifecycleMethod = controller[specificLifecycleMethodName]\n\n const genericLifecycleMethodName = ['before', 'after', 'finalize'].includes(\n stage\n )\n ? `${stage}Reflex`\n : `reflex${camelize(stage)}`\n const genericLifecycleMethod = controller[genericLifecycleMethodName]\n\n if (typeof specificLifecycleMethod === 'function') {\n specificLifecycleMethod.call(\n controller,\n reflexElement,\n reflex,\n controllerElement.reflexError[reflexId],\n reflexId,\n payload\n )\n }\n\n if (typeof genericLifecycleMethod === 'function') {\n genericLifecycleMethod.call(\n controller,\n reflexElement,\n reflex,\n controllerElement.reflexError[reflexId],\n reflexId,\n payload\n )\n }\n\n if (reflexes[reflexId] && stage === reflexes[reflexId].finalStage) {\n Reflect.deleteProperty(controllerElement.reflexController, reflexId)\n Reflect.deleteProperty(controllerElement.reflexData, reflexId)\n Reflect.deleteProperty(controllerElement.reflexError, reflexId)\n // Removing this on a trial basis\n // 1. Prevents race condition with CR broadcasts\n // 2. Planning to remove it for v4 as part of queueing refactor\n // 3. Removing reflexes shouldn't be the responsibility of the lifecycle subsystem\n // Reflect.deleteProperty(reflexes, reflexId)\n }\n}\n\ndocument.addEventListener(\n 'stimulus-reflex:before',\n event =>\n invokeLifecycleMethod(\n 'before',\n event.detail.element,\n event.detail.controller.element,\n event.detail.reflexId,\n event.detail.payload\n ),\n true\n)\n\ndocument.addEventListener(\n 'stimulus-reflex:success',\n event => {\n invokeLifecycleMethod(\n 'success',\n event.detail.element,\n event.detail.controller.element,\n event.detail.reflexId,\n event.detail.payload\n )\n dispatchLifecycleEvent(\n 'after',\n event.detail.element,\n event.detail.controller.element,\n event.detail.reflexId,\n event.detail.payload\n )\n },\n true\n)\n\ndocument.addEventListener(\n 'stimulus-reflex:nothing',\n event => {\n dispatchLifecycleEvent(\n 'success',\n event.detail.element,\n event.detail.controller.element,\n event.detail.reflexId,\n event.detail.payload\n )\n },\n true\n)\n\ndocument.addEventListener(\n 'stimulus-reflex:error',\n event => {\n invokeLifecycleMethod(\n 'error',\n event.detail.element,\n event.detail.controller.element,\n event.detail.reflexId,\n event.detail.payload\n )\n dispatchLifecycleEvent(\n 'after',\n event.detail.element,\n event.detail.controller.element,\n event.detail.reflexId,\n event.detail.payload\n )\n },\n true\n)\n\ndocument.addEventListener(\n 'stimulus-reflex:halted',\n event =>\n invokeLifecycleMethod(\n 'halted',\n event.detail.element,\n event.detail.controller.element,\n event.detail.reflexId,\n event.detail.payload\n ),\n true\n)\n\ndocument.addEventListener(\n 'stimulus-reflex:after',\n event =>\n invokeLifecycleMethod(\n 'after',\n event.detail.element,\n event.detail.controller.element,\n event.detail.reflexId,\n event.detail.payload\n ),\n true\n)\n\ndocument.addEventListener(\n 'stimulus-reflex:finalize',\n event =>\n invokeLifecycleMethod(\n 'finalize',\n event.detail.element,\n event.detail.controller.element,\n event.detail.reflexId,\n event.detail.payload\n ),\n true\n)\n\n// Dispatches a lifecycle event on document\n//\n// - stage - the lifecycle stage\n// * before\n// * success\n// * error\n// * halted\n// * after\n// * finalize\n//\n// - reflexElement - the element that triggered the Reflex (not necessarily the StimulusReflex Controller Element)\n//\n// - controllerElement - the element holding the StimulusReflex Controller\n//\n// - reflexId - the UUIDv4 which uniquely identifies the Reflex\n//\n// - payload - optional Reflex return value\n//\nconst dispatchLifecycleEvent = (\n stage,\n reflexElement,\n controllerElement,\n reflexId,\n payload\n) => {\n if (!controllerElement) {\n if (Debug.enabled && !reflexes[reflexId].warned) {\n console.warn(\n `StimulusReflex was not able execute callbacks or emit events for \"${stage}\" or later life-cycle stages for this Reflex. The StimulusReflex Controller Element is no longer present in the DOM. Could you move the StimulusReflex Controller to an element higher in your DOM?`\n )\n reflexes[reflexId].warned = true\n }\n return\n }\n\n if (\n !controllerElement.reflexController ||\n (controllerElement.reflexController &&\n !controllerElement.reflexController[reflexId])\n ) {\n if (Debug.enabled && !reflexes[reflexId].warned) {\n console.warn(\n `StimulusReflex detected that the StimulusReflex Controller responsible for this Reflex has been replaced with a new instance. Callbacks and events for \"${stage}\" or later life-cycle stages cannot be executed.`\n )\n reflexes[reflexId].warned = true\n }\n return\n }\n\n const { target } = controllerElement.reflexData[reflexId] || {}\n const controller = controllerElement.reflexController[reflexId] || {}\n const event = `stimulus-reflex:${stage}`\n const action = `${event}:${target.split('#')[1]}`\n const detail = {\n reflex: target,\n controller,\n reflexId,\n element: reflexElement,\n payload\n }\n const options = { bubbles: true, cancelable: false, detail }\n\n controllerElement.dispatchEvent(new CustomEvent(event, options))\n controllerElement.dispatchEvent(new CustomEvent(action, options))\n\n if (window.jQuery) {\n window.jQuery(controllerElement).trigger(event, detail)\n window.jQuery(controllerElement).trigger(action, detail)\n }\n}\n\nexport { dispatchLifecycleEvent }\n","import Schema from './schema'\n\nimport { attributeValues } from './attributes'\nimport { extractReflexName } from './utils'\n\n// Returns StimulusReflex controllers local to the passed element based on the data-controller attribute.\n//\nconst localReflexControllers = (app, element) => {\n return attributeValues(element.getAttribute(Schema.controller)).reduce(\n (memo, name) => {\n const controller = app.getControllerForElementAndIdentifier(element, name)\n if (controller && controller.StimulusReflex) memo.push(controller)\n return memo\n },\n []\n )\n}\n\n// Returns all StimulusReflex controllers for the passed element.\n// Traverses DOM ancestors starting with element.\n//\nconst allReflexControllers = (app, element) => {\n let controllers = []\n while (element) {\n controllers = controllers.concat(localReflexControllers(app, element))\n element = element.parentElement\n }\n return controllers\n}\n\n// Given a reflex string such as 'click->TestReflex#create' and a list of\n// controllers. It will find the matching controller based on the controller's\n// identifier. e.g. Given these controller identifiers ['foo', 'bar', 'test'],\n// it would select the 'test' controller.\nconst findControllerByReflexName = (reflexName, controllers) => {\n const controller = controllers.find(controller => {\n if (!controller.identifier) return\n\n return (\n extractReflexName(reflexName)\n .replace(/([a-z0–9])([A-Z])/g, '$1-$2')\n .replace(/(::)/g, '--')\n .toLowerCase() === controller.identifier\n )\n })\n\n return controller || controllers[0]\n}\n\nexport { allReflexControllers, findControllerByReflexName }\n","import CableReady from 'cable_ready'\n\nimport Debug from './debug'\nimport Schema from './schema'\nimport IsolationMode from './isolation_mode'\n\nimport { reflexes } from './reflex_store'\nimport { dispatchLifecycleEvent } from './lifecycle'\nimport { XPathToElement, debounce, emitEvent } from './utils'\nimport { allReflexControllers, findControllerByReflexName } from './controllers'\nimport { attributeValue, attributeValues } from './attributes'\n\nconst received = data => {\n if (!data.cableReady) return\n\n if (data.version.replace('.pre', '-pre') !== CableReady.version) {\n if (Debug.enabled)\n console.error(\n `Reflex failed due to cable_ready gem/NPM package version mismatch. Package versions must match exactly.\\nNote that if you are using pre-release builds, gems use the \"x.y.z.preN\" version format, while NPM packages use \"x.y.z-preN\".\\n\\ncable_ready gem: ${data.version}\\ncable_ready NPM: ${CableReady.version}`\n )\n return\n }\n\n let reflexOperations = []\n\n for (let i = data.operations.length - 1; i >= 0; i--) {\n if (data.operations[i].stimulusReflex) {\n reflexOperations.push(data.operations[i])\n data.operations.splice(i, 1)\n }\n }\n\n if (\n reflexOperations.some(\n operation => operation.stimulusReflex.url !== location.href\n )\n ) {\n return\n }\n\n let reflexData\n\n if (reflexOperations.length) {\n reflexData = reflexOperations[0].stimulusReflex\n reflexData.payload = reflexOperations[0].payload\n }\n\n if (reflexData) {\n const { reflexId, payload } = reflexData\n\n if (!reflexes[reflexId] && IsolationMode.disabled) {\n const controllerElement = XPathToElement(reflexData.xpathController)\n const reflexElement = XPathToElement(reflexData.xpathElement)\n\n controllerElement.reflexController =\n controllerElement.reflexController || {}\n controllerElement.reflexData = controllerElement.reflexData || {}\n controllerElement.reflexError = controllerElement.reflexError || {}\n\n controllerElement.reflexController[\n reflexId\n ] = reflexes.app.getControllerForElementAndIdentifier(\n controllerElement,\n reflexData.reflexController\n )\n\n controllerElement.reflexData[reflexId] = reflexData\n\n dispatchLifecycleEvent(\n 'before',\n reflexElement,\n controllerElement,\n reflexId,\n payload\n )\n\n registerReflex(reflexData)\n }\n\n if (reflexes[reflexId]) {\n reflexes[reflexId].totalOperations = reflexOperations.length\n reflexes[reflexId].pendingOperations = reflexOperations.length\n reflexes[reflexId].completedOperations = 0\n reflexes[reflexId].piggybackOperations = data.operations\n CableReady.perform(reflexOperations)\n }\n } else {\n if (data.operations.length && reflexes[data.operations[0].reflexId]) {\n CableReady.perform(data.operations)\n }\n }\n}\n\nconst registerReflex = data => {\n const { reflexId } = data\n reflexes[reflexId] = { finalStage: 'finalize' }\n\n const promise = new Promise((resolve, reject) => {\n reflexes[reflexId].promise = {\n resolve,\n reject,\n data\n }\n })\n\n promise.reflexId = reflexId\n\n if (Debug.enabled) promise.catch(() => {})\n\n return promise\n}\n\n// compute the DOM element(s) which will be the morph root\n// use the data-reflex-root attribute on the reflex or the controller\n// optional value is a CSS selector(s); comma-separated list\n// order of preference is data-reflex, data-controller, document body (default)\nconst getReflexRoots = element => {\n let list = []\n while (list.length === 0 && element) {\n let reflexRoot = element.getAttribute(Schema.reflexRoot)\n if (reflexRoot) {\n if (reflexRoot.length === 0 && element.id) reflexRoot = `#${element.id}`\n const selectors = reflexRoot.split(',').filter(s => s.trim().length)\n if (Debug.enabled && selectors.length === 0) {\n console.error(\n `No value found for ${Schema.reflexRoot}. Add an #id to the element or provide a value for ${Schema.reflexRoot}.`,\n element\n )\n }\n list = list.concat(selectors.filter(s => document.querySelector(s)))\n }\n element = element.parentElement\n ? element.parentElement.closest(`[${Schema.reflexRoot}]`)\n : null\n }\n return list\n}\n\n// Sets up declarative reflex behavior.\n// Any elements that define data-reflex will automatically be wired up with the default StimulusReflexController.\n//\nconst setupDeclarativeReflexes = debounce(() => {\n document.querySelectorAll(`[${Schema.reflex}]`).forEach(element => {\n const controllers = attributeValues(element.getAttribute(Schema.controller))\n const reflexAttributeNames = attributeValues(\n element.getAttribute(Schema.reflex)\n )\n const actions = attributeValues(element.getAttribute(Schema.action))\n reflexAttributeNames.forEach(reflexName => {\n const controller = findControllerByReflexName(\n reflexName,\n allReflexControllers(reflexes.app, element)\n )\n let action\n if (controller) {\n action = `${reflexName.split('->')[0]}->${\n controller.identifier\n }#__perform`\n if (!actions.includes(action)) actions.push(action)\n } else {\n action = `${reflexName.split('->')[0]}->stimulus-reflex#__perform`\n if (!controllers.includes('stimulus-reflex')) {\n controllers.push('stimulus-reflex')\n }\n if (!actions.includes(action)) actions.push(action)\n }\n })\n const controllerValue = attributeValue(controllers)\n const actionValue = attributeValue(actions)\n if (\n controllerValue &&\n element.getAttribute(Schema.controller) != controllerValue\n ) {\n element.setAttribute(Schema.controller, controllerValue)\n }\n if (actionValue && element.getAttribute(Schema.action) != actionValue)\n element.setAttribute(Schema.action, actionValue)\n })\n emitEvent('stimulus-reflex:ready')\n}, 20)\n\nexport { received, registerReflex, getReflexRoots, setupDeclarativeReflexes }\n","import Schema from './schema'\n\nimport { extractElementAttributes, extractElementDataset } from './attributes'\nimport { getReflexRoots } from './reflexes'\nimport { uuidv4 } from './utils'\nimport { elementToXPath } from './utils'\n\nimport { version } from '../package.json'\n\nexport default class ReflexData {\n constructor (\n options,\n reflexElement,\n controllerElement,\n reflexController,\n permanentAttributeName,\n target,\n args,\n url,\n tabId\n ) {\n this.options = options\n this.reflexElement = reflexElement\n this.controllerElement = controllerElement\n this.reflexController = reflexController\n this.permanentAttributeName = permanentAttributeName\n this.target = target\n this.args = args\n this.url = url\n this.tabId = tabId\n }\n\n get attrs () {\n this._attrs =\n this._attrs ||\n this.options['attrs'] ||\n extractElementAttributes(this.reflexElement)\n\n return this._attrs\n }\n\n get reflexId () {\n this._reflexId = this._reflexId || this.options['reflexId'] || uuidv4()\n return this._reflexId\n }\n\n get selectors () {\n this._selectors =\n this._selectors ||\n this.options['selectors'] ||\n getReflexRoots(this.reflexElement)\n\n return typeof this._selectors === 'string'\n ? [this._selectors]\n : this._selectors\n }\n\n get resolveLate () {\n return this.options['resolveLate'] || false\n }\n\n get dataset () {\n this._dataset = this._dataset || extractElementDataset(this.reflexElement)\n return this._dataset\n }\n\n get innerHTML () {\n return this.includeInnerHtml ? this.reflexElement.innerHTML : ''\n }\n\n get textContent () {\n return this.includeTextContent ? this.reflexElement.textContent : ''\n }\n\n get xpathController () {\n return elementToXPath(this.controllerElement)\n }\n\n get xpathElement () {\n return elementToXPath(this.reflexElement)\n }\n\n get formSelector () {\n const attr = this.reflexElement.attributes[Schema.reflexFormSelector]\n ? this.reflexElement.attributes[Schema.reflexFormSelector].value\n : undefined\n return this.options['formSelector'] || attr\n }\n\n get includeInnerHtml () {\n const attr =\n this.reflexElement.attributes[Schema.reflexIncludeInnerHtml] || false\n return this.options['includeInnerHTML'] || attr\n ? attr.value !== 'false'\n : false\n }\n\n get includeTextContent () {\n const attr =\n this.reflexElement.attributes[Schema.reflexIncludeTextContent] || false\n return this.options['includeTextContent'] || attr\n ? attr.value !== 'false'\n : false\n }\n\n get suppressLogging () {\n return (\n this.options['suppressLogging'] ||\n this.reflexElement.attributes[Schema.reflexSuppressLogging] ||\n false\n )\n }\n\n valueOf () {\n return {\n attrs: this.attrs,\n dataset: this.dataset,\n selectors: this.selectors,\n reflexId: this.reflexId,\n resolveLate: this.resolveLate,\n suppressLogging: this.suppressLogging,\n xpathController: this.xpathController,\n xpathElement: this.xpathElement,\n inner_html: this.innerHTML,\n text_content: this.textContent,\n formSelector: this.formSelector,\n reflexController: this.reflexController,\n permanentAttributeName: this.permanentAttributeName,\n target: this.target,\n args: this.args,\n url: this.url,\n tabId: this.tabId,\n version\n }\n }\n}\n","import { createConsumer } from '@rails/actioncable'\nimport { received } from '../reflexes'\nimport { emitEvent } from '../utils'\n\nlet consumer\nlet params\nlet subscriptionActive\n\nconst createSubscription = controller => {\n consumer = consumer || controller.application.consumer || createConsumer()\n const { channel } = controller.StimulusReflex\n const subscription = { channel, ...params }\n const identifier = JSON.stringify(subscription)\n\n controller.StimulusReflex.subscription =\n consumer.subscriptions.findAll(identifier)[0] ||\n consumer.subscriptions.create(subscription, {\n received,\n connected,\n rejected,\n disconnected\n })\n}\n\nconst connected = () => {\n subscriptionActive = true\n document.body.classList.replace(\n 'stimulus-reflex-disconnected',\n 'stimulus-reflex-connected'\n )\n emitEvent('stimulus-reflex:connected')\n emitEvent('stimulus-reflex:action-cable:connected')\n}\n\nconst rejected = () => {\n subscriptionActive = false\n document.body.classList.replace(\n 'stimulus-reflex-connected',\n 'stimulus-reflex-disconnected'\n )\n emitEvent('stimulus-reflex:rejected')\n emitEvent('stimulus-reflex:action-cable:rejected')\n if (Debug.enabled) console.warn('Channel subscription was rejected.')\n}\n\nconst disconnected = willAttemptReconnect => {\n subscriptionActive = false\n document.body.classList.replace(\n 'stimulus-reflex-connected',\n 'stimulus-reflex-disconnected'\n )\n emitEvent('stimulus-reflex:disconnected', willAttemptReconnect)\n emitEvent('stimulus-reflex:action-cable:disconnected', willAttemptReconnect)\n}\n\nexport default {\n consumer,\n params,\n get subscriptionActive () {\n return subscriptionActive\n },\n createSubscription,\n connected,\n rejected,\n disconnected,\n set (consumerValue, paramsValue) {\n consumer = consumerValue\n params = paramsValue\n }\n}\n","import CableReady from 'cable_ready'\n\nimport Log from './log'\n\nimport { reflexes } from './reflex_store'\nimport { dispatchLifecycleEvent } from './lifecycle'\nimport { XPathToElement } from './utils'\n\nconst beforeDOMUpdate = event => {\n const { stimulusReflex, payload } = event.detail || {}\n if (!stimulusReflex) return\n const { reflexId, xpathElement, xpathController } = stimulusReflex\n const controllerElement = XPathToElement(xpathController)\n const reflexElement = XPathToElement(xpathElement)\n const reflex = reflexes[reflexId]\n const { promise } = reflex\n\n reflex.pendingOperations--\n\n if (reflex.pendingOperations > 0) return\n\n if (!stimulusReflex.resolveLate)\n setTimeout(() =>\n promise.resolve({\n element: reflexElement,\n event,\n data: promise.data,\n payload,\n reflexId,\n toString: () => ''\n })\n )\n\n setTimeout(() =>\n dispatchLifecycleEvent(\n 'success',\n reflexElement,\n controllerElement,\n reflexId,\n payload\n )\n )\n}\n\nconst afterDOMUpdate = event => {\n const { stimulusReflex, payload } = event.detail || {}\n if (!stimulusReflex) return\n const { reflexId, xpathElement, xpathController } = stimulusReflex\n const controllerElement = XPathToElement(xpathController)\n const reflexElement = XPathToElement(xpathElement)\n const reflex = reflexes[reflexId]\n const { promise } = reflex\n\n reflex.completedOperations++\n\n Log.success(event, false)\n\n if (reflex.completedOperations < reflex.totalOperations) return\n\n if (stimulusReflex.resolveLate)\n setTimeout(() =>\n promise.resolve({\n element: reflexElement,\n event,\n data: promise.data,\n payload,\n reflexId,\n toString: () => ''\n })\n )\n\n setTimeout(() =>\n dispatchLifecycleEvent(\n 'finalize',\n reflexElement,\n controllerElement,\n reflexId,\n payload\n )\n )\n\n if (reflex.piggybackOperations.length)\n CableReady.perform(reflex.piggybackOperations)\n}\n\nconst routeReflexEvent = event => {\n const { stimulusReflex, payload, name, body } = event.detail || {}\n const eventType = name.split('-')[2]\n if (!stimulusReflex || !['nothing', 'halted', 'error'].includes(eventType))\n return\n\n const { reflexId, xpathElement, xpathController } = stimulusReflex\n const reflexElement = XPathToElement(xpathElement)\n const controllerElement = XPathToElement(xpathController)\n const reflex = reflexes[reflexId]\n const { promise } = reflex\n\n if (controllerElement) {\n controllerElement.reflexError = controllerElement.reflexError || {}\n if (eventType === 'error') controllerElement.reflexError[reflexId] = body\n }\n\n switch (eventType) {\n case 'nothing':\n nothing(event, payload, promise, reflex, reflexElement)\n break\n case 'error':\n error(event, payload, promise, reflex, reflexElement)\n break\n case 'halted':\n halted(event, payload, promise, reflex, reflexElement)\n break\n }\n\n setTimeout(() =>\n dispatchLifecycleEvent(\n eventType,\n reflexElement,\n controllerElement,\n reflexId,\n payload\n )\n )\n\n if (reflex.piggybackOperations.length)\n CableReady.perform(reflex.piggybackOperations)\n}\n\nconst nothing = (event, payload, promise, reflex, reflexElement) => {\n reflex.finalStage = 'after'\n\n Log.success(event, false)\n\n setTimeout(() =>\n promise.resolve({\n data: promise.data,\n element: reflexElement,\n event,\n payload,\n reflexId: promise.data.reflexId,\n toString: () => ''\n })\n )\n}\n\nconst halted = (event, payload, promise, reflex, reflexElement) => {\n reflex.finalStage = 'halted'\n\n Log.success(event, true)\n\n setTimeout(() =>\n promise.resolve({\n data: promise.data,\n element: reflexElement,\n event,\n payload,\n reflexId: promise.data.reflexId,\n toString: () => ''\n })\n )\n}\n\nconst error = (event, payload, promise, reflex, reflexElement) => {\n reflex.finalStage = 'after'\n\n Log.error(event)\n\n setTimeout(() =>\n promise.reject({\n data: promise.data,\n element: reflexElement,\n event,\n payload,\n reflexId: promise.data.reflexId,\n error: event.detail.body,\n toString: () => event.detail.body\n })\n )\n}\n\nexport { beforeDOMUpdate, afterDOMUpdate, routeReflexEvent }\n","import { Controller } from '@hotwired/stimulus'\n\nimport Schema from './schema'\nimport Log from './log'\nimport Debug from './debug'\nimport Deprecate from './deprecate'\nimport ReflexData from './reflex_data'\nimport IsolationMode from './isolation_mode'\nimport ActionCableTransport from './transports/action_cable'\n\nimport { dispatchLifecycleEvent } from './lifecycle'\nimport { uuidv4, serializeForm } from './utils'\nimport { beforeDOMUpdate, afterDOMUpdate, routeReflexEvent } from './callbacks'\nimport { registerReflex, setupDeclarativeReflexes } from './reflexes'\nimport { reflexes } from './reflex_store'\nimport { attributeValues } from './attributes'\n\n// Default StimulusReflexController that is implicitly wired up as data-controller for any DOM elements\n// that have configured data-reflex. Note that this default can be overridden when initializing the application.\n// i.e. StimulusReflex.initialize(myStimulusApplication, MyCustomDefaultController);\n//\nclass StimulusReflexController extends Controller {\n constructor (...args) {\n super(...args)\n register(this)\n }\n}\n\n// Initializes StimulusReflex by registering the default Stimulus controller with the passed Stimulus application.\n//\n// - application - the Stimulus application\n// - options\n// * controller - [optional] the default StimulusReflexController\n// * consumer - [optional] the ActionCable consumer\n// * debug - [false] log all Reflexes to the console\n// * params - [{}] key/value parameters to send during channel subscription\n// * isolate - [false] restrict Reflex playback to the tab which initiated it\n// * deprecate - [true] show warnings regarding upcoming changes to the library\n//\nconst initialize = (\n application,\n { controller, consumer, debug, params, isolate, deprecate } = {}\n) => {\n ActionCableTransport.set(consumer, params)\n document.addEventListener(\n 'DOMContentLoaded',\n () => {\n document.body.classList.remove('stimulus-reflex-connected')\n document.body.classList.add('stimulus-reflex-disconnected')\n if (Deprecate.enabled && consumer)\n console.warn(\n \"Deprecation warning: the next version of StimulusReflex will obtain a reference to consumer via the Stimulus application object.\\nPlease add 'application.consumer = consumer' to your index.js after your Stimulus application has been established, and remove the consumer key from your StimulusReflex initialize() options object.\"\n )\n if (Deprecate.enabled && IsolationMode.disabled)\n console.warn(\n 'Deprecation warning: the next version of StimulusReflex will standardize isolation mode, and the isolate option will be removed.\\nPlease update your applications to assume that every tab will be isolated.'\n )\n },\n { once: true }\n )\n IsolationMode.set(!!isolate)\n reflexes.app = application\n Schema.set(application)\n reflexes.app.register(\n 'stimulus-reflex',\n controller || StimulusReflexController\n )\n Debug.set(!!debug)\n if (typeof deprecate !== 'undefined') Deprecate.set(deprecate)\n const observer = new MutationObserver(setupDeclarativeReflexes)\n observer.observe(document.documentElement, {\n attributeFilter: [Schema.reflex, Schema.action],\n childList: true,\n subtree: true\n })\n}\n\n// Registers a Stimulus controller and extends it with StimulusReflex behavior\n//\n// controller - the Stimulus controller\n// options - [optional] configuration\n//\nconst register = (controller, options = {}) => {\n const channel = 'StimulusReflex::Channel'\n controller.StimulusReflex = { ...options, channel }\n ActionCableTransport.createSubscription(controller)\n Object.assign(controller, {\n // Indicates if the ActionCable web socket connection is open.\n // The connection must be open before calling stimulate.\n //\n isActionCableConnectionOpen () {\n return this.StimulusReflex.subscription.consumer.connection.isOpen()\n },\n\n // Invokes a server side reflex method.\n //\n // - target - the reflex target (full name of the server side reflex) i.e. 'ReflexClassName#method'\n // - reflexElement - [optional] the element that triggered the reflex, defaults to this.element\n // - options - [optional] an object that contains at least one of attrs, reflexId, selectors, resolveLate, serializeForm\n // - *args - remaining arguments are forwarded to the server side reflex method\n //\n stimulate () {\n const url = location.href\n const args = Array.from(arguments)\n const target = args.shift() || 'StimulusReflex::Reflex#default_reflex'\n const controllerElement = this.element\n const reflexElement =\n args[0] && args[0].nodeType === Node.ELEMENT_NODE\n ? args.shift()\n : controllerElement\n if (\n reflexElement.type === 'number' &&\n reflexElement.validity &&\n reflexElement.validity.badInput\n ) {\n if (Debug.enabled) console.warn('Reflex aborted: invalid numeric input')\n return\n }\n const options = {}\n if (\n args[0] &&\n typeof args[0] === 'object' &&\n Object.keys(args[0]).filter(key =>\n [\n 'attrs',\n 'selectors',\n 'reflexId',\n 'resolveLate',\n 'serializeForm',\n 'suppressLogging',\n 'includeInnerHTML',\n 'includeTextContent'\n ].includes(key)\n ).length\n ) {\n const opts = args.shift()\n Object.keys(opts).forEach(o => (options[o] = opts[o]))\n }\n\n const reflexData = new ReflexData(\n options,\n reflexElement,\n controllerElement,\n this.identifier,\n Schema.reflexPermanent,\n target,\n args,\n url,\n tabId\n )\n\n const reflexId = reflexData.reflexId\n\n if (!this.isActionCableConnectionOpen())\n throw 'The ActionCable connection is not open! `this.isActionCableConnectionOpen()` must return true before calling `this.stimulate()`'\n\n if (!ActionCableTransport.subscriptionActive)\n throw 'The ActionCable channel subscription for StimulusReflex was rejected.'\n\n // lifecycle setup\n controllerElement.reflexController =\n controllerElement.reflexController || {}\n controllerElement.reflexData = controllerElement.reflexData || {}\n controllerElement.reflexError = controllerElement.reflexError || {}\n\n controllerElement.reflexController[reflexId] = this\n controllerElement.reflexData[reflexId] = reflexData.valueOf()\n\n dispatchLifecycleEvent(\n 'before',\n reflexElement,\n controllerElement,\n reflexId\n )\n\n setTimeout(() => {\n const { params } = controllerElement.reflexData[reflexId] || {}\n const check = reflexElement.attributes[Schema.reflexSerializeForm]\n if (check) {\n // not needed after v4 because this is only here for the deprecation warning\n options['serializeForm'] = check.value !== 'false'\n }\n\n const form =\n reflexElement.closest(reflexData.formSelector) ||\n document.querySelector(reflexData.formSelector) ||\n reflexElement.closest('form')\n\n if (Deprecate.enabled && options['serializeForm'] === undefined && form)\n console.warn(\n `Deprecation warning: the next version of StimulusReflex will not serialize forms by default.\\nPlease set ${Schema.reflexSerializeForm}=\\\"true\\\" on your Reflex Controller Element or pass { serializeForm: true } as an option to stimulate.`\n )\n const formData =\n options['serializeForm'] === false\n ? ''\n : serializeForm(form, {\n element: reflexElement\n })\n\n controllerElement.reflexData[reflexId] = {\n ...reflexData.valueOf(),\n params,\n formData\n }\n\n this.StimulusReflex.subscription.send(\n controllerElement.reflexData[reflexId]\n )\n })\n\n const promise = registerReflex(reflexData.valueOf())\n\n Log.request(\n reflexId,\n target,\n args,\n this.context.scope.identifier,\n reflexElement,\n controllerElement\n )\n\n return promise\n },\n\n // Wraps the call to stimulate for any data-reflex elements.\n // This is internal and should not be invoked directly.\n __perform (event) {\n let element = event.target\n let reflex\n\n while (element && !reflex) {\n reflex = element.getAttribute(Schema.reflex)\n if (!reflex || !reflex.trim().length) element = element.parentElement\n }\n\n const match = attributeValues(reflex).find(\n reflex => reflex.split('->')[0] === event.type\n )\n\n if (match) {\n event.preventDefault()\n event.stopPropagation()\n this.stimulate(match.split('->')[1], element)\n }\n }\n })\n}\n\n// Uniquely identify this browser tab in each Reflex\nconst tabId = uuidv4()\n\nconst useReflex = (controller, options = {}) => {\n register(controller, options)\n}\n\ndocument.addEventListener('cable-ready:after-dispatch-event', routeReflexEvent)\ndocument.addEventListener('cable-ready:before-inner-html', beforeDOMUpdate)\ndocument.addEventListener('cable-ready:before-morph', beforeDOMUpdate)\ndocument.addEventListener('cable-ready:after-inner-html', afterDOMUpdate)\ndocument.addEventListener('cable-ready:after-morph', afterDOMUpdate)\nwindow.addEventListener('load', setupDeclarativeReflexes)\n\nexport {\n initialize,\n register,\n useReflex\n}\n","export * from './stimulus_reflex'\n\nimport * as StimulusReflex from './stimulus_reflex'\n\nimport Debug from './debug'\nimport Deprecate from './deprecate'\n\nconst global = {\n ...StimulusReflex,\n get debug () {\n return Debug.value\n },\n set debug (value) {\n Debug.set(!!value)\n },\n get deprecate () {\n return Deprecate.value\n },\n set deprecate (value) {\n Deprecate.set(!!value)\n }\n}\n\nwindow.StimulusReflex = global\n\nexport default global\n"],"names":["defaultSchema","reflexAttribute","reflexPermanentAttribute","reflexRootAttribute","reflexSuppressLoggingAttribute","reflexDatasetAttribute","reflexDatasetAllAttribute","reflexSerializeFormAttribute","reflexFormSelectorAttribute","reflexIncludeInnerHtmlAttribute","reflexIncludeTextContentAttribute","schema","Schema","set","application","attribute","Object","defineProperty","this","slice","get","debugging","Debug$1","enabled","disabled","value","debug","reflexes","Log","reflexId","target","args","controller","element","controllerElement","reflex","Debug","promise","data","suppressLogging","timestamp","Date","console","log","event","halted","detail","selector","payload","morph","stimulusReflex","progress","totalOperations","completedOperations","duration","operation","type","split","join","body","deprecationWarnings","Deprecate","deprecate","uuidv4","crypto","window","msCrypto","replace","c","getRandomValues","Uint8Array","toString","camelize","uppercaseFirstLetter","$1","toUpperCase","toLowerCase","substr","emitEvent","document","dispatchEvent","CustomEvent","bubbles","cancelable","jQuery","trigger","elementToXPath","id","ix","siblings","parentNode","childNodes","i","length","sibling","tagName","nodeType","XPathToElement","xpath","evaluate","XPathResult","FIRST_ORDERED_NODE_TYPE","singleNodeValue","XPathToArray","reverse","snapshotList","ORDERED_NODE_SNAPSHOT_TYPE","snapshots","snapshotLength","push","snapshotItem","attributeValue","values","filter","v","String","map","trim","attributeValues","extractElementAttributes","attrs","Array","from","attributes","reduce","memo","attr","name","checked","selected","tag_name","match","includes","querySelectorAll","multipleInstances","collectedOptions","concat","elem","o","collectCheckedOptions","getElementsFromTokens","tokens","elements","xPath","forEach","token","warn","error","extractDataAttributes","startsWith","isolationMode","IsolationMode","invokeLifecycleMethod","stage","reflexElement","reflexData","reflexController","reflexMethodName","specificLifecycleMethod","genericLifecycleMethod","call","reflexError","finalStage","Reflect","deleteProperty","addEventListener","dispatchLifecycleEvent","warned","action","options","localReflexControllers","app","getAttribute","getControllerForElementAndIdentifier","StimulusReflex","received","cableReady","version","CableReady","reflexOperations","operations","splice","some","url","location","href","xpathController","xpathElement","registerReflex","pendingOperations","piggybackOperations","perform","Promise","resolve","reject","catch","setupDeclarativeReflexes","callback","delay","timeoutId","clearTimeout","setTimeout","debounce","controllers","reflexAttributeNames","actions","reflexName","find","identifier","reflexString","extractReflexName","findControllerByReflexName","parentElement","allReflexControllers","controllerValue","actionValue","setAttribute","ReflexData","constructor","permanentAttributeName","tabId","_attrs","_reflexId","selectors","_selectors","list","reflexRoot","s","querySelector","closest","getReflexRoots","resolveLate","dataset","_dataset","reflexDataset","allDataset","reflexDatasetAll","allTokens","datasetElements","datasetAllElements","datasetAttributes","acc","ele","elementDataset","datasetAll","elementAttributes","keys","key","isArray","extractElementDataset","innerHTML","includeInnerHtml","textContent","includeTextContent","formSelector","reflexFormSelector","undefined","reflexIncludeInnerHtml","reflexIncludeTextContent","reflexSuppressLogging","valueOf","inner_html","text_content","consumer","params","subscriptionActive","connected","classList","rejected","disconnected","willAttemptReconnect","ActionCableTransport","createSubscription","createConsumer","channel","subscription","JSON","stringify","subscriptions","findAll","create","consumerValue","paramsValue","beforeDOMUpdate","afterDOMUpdate","nothing","StimulusReflexController","Controller","super","register","initialize","isolate","remove","add","once","MutationObserver","observe","documentElement","attributeFilter","childList","subtree","assign","isActionCableConnectionOpen","connection","isOpen","stimulate","arguments","shift","Node","ELEMENT_NODE","validity","badInput","opts","reflexPermanent","check","reflexSerializeForm","form","formData","w","FormData","e","encodeURIComponent","submitButton","nodeName","serializeForm","send","context","scope","__perform","preventDefault","stopPropagation","useReflex","eventType","global"],"mappings":"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"}