atv-rails 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62607ef7dc7cbea06ec251592fe5fe9f0c76921573059a61c4f1bf5f1d40dac1
4
- data.tar.gz: ae1c07fdebafe198fc55a6154b9d3c23124142371490acceec49c15ad495fdb8
3
+ metadata.gz: 90eed2550de006c017a7e04a41aa89ffe9d3d0e34740c9cb6d9fc5c17c418537
4
+ data.tar.gz: d4c9e9bb798ee12cd2eda572d1300deb897fad1eee53bfb949d28cd9f341f2c9
5
5
  SHA512:
6
- metadata.gz: 0a80e9a1de4c5bbd1d9e01af0b1778adadedc7b8ddc51b6d8b8c4e900c6e4a443ef9f62edf25b03ba9ba557b6fedd4017dfbe102623d997ab3c1aad73b2d451f
7
- data.tar.gz: 159a2ad890ce7bf69260b053a5d671c24a0395a9d576109f9c744984077bdcfb2726619f633ffc987420b028d60015cd0b87c50973884aa86a2ddf3e976ab0b9
6
+ metadata.gz: 020f55905f8884bb5268f14d82a027a9c06aca7aaa71d652cf869f6d752779093183c489d0161565f575b79b08a496d44fd5a28f6142df4d8ac82ab541637714
7
+ data.tar.gz: fb0b1c821179e7f0a1588288d3be1be9ca1056c42ea65fdeacfb8e1e7617693a3a9c1183e8cfec2683fd17d90c3c0aca11408f2b8dfd7e7cc4b8022e976a36df
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # ATV::Rails
2
- Short description and motivation.
1
+ # ATV
2
+ JavaScript for Rails Curmudgeons.
3
3
 
4
4
  ## Usage
5
- How to use my plugin.
5
+ TBD
6
6
 
7
7
  ## Installation
8
8
  Add this line to your application's Gemfile:
@@ -32,7 +32,7 @@
32
32
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
33
33
  // THE SOFTWARE.
34
34
 
35
- const version = "0.1.8";
35
+ const version = "0.1.9";
36
36
 
37
37
  // To dynamically load up the ATV javascripts if needed
38
38
  function importMap() {
@@ -231,7 +231,6 @@ function attributesFor(element, type) {
231
231
  }
232
232
 
233
233
  const allControllerNames = new Set();
234
- const allEventListeners = new Map();
235
234
  const allTargets = new Map();
236
235
  let allControllers = new Map();
237
236
 
@@ -370,9 +369,15 @@ function activate(prefix = "atv") {
370
369
  ) {
371
370
  const callbacks = controllers.get(action.controller).getActions();
372
371
  const callback = callbacks[action.method];
372
+ let result;
373
373
  if (callback) {
374
- const result = callback(event.target, event, action.parameters);
374
+ try {
375
+ result = callback(event.target, event, action.parameters);
376
+ } catch (error) {
377
+ console.error(`ATV ${prefix}: ${eventName}->${name}`, error);
378
+ }
375
379
  if (result === false) {
380
+ event.stopPropagation();
376
381
  return;
377
382
  }
378
383
  }
@@ -381,14 +386,9 @@ function activate(prefix = "atv") {
381
386
  return invokeNext(event, actions.slice(1));
382
387
  }
383
388
  }
384
-
385
- const handler = (event) => invokeNext(event, list);
386
- const events = findOrInitalize(allEventListeners, prefix, element);
387
- if (events.get(eventName)) {
388
- return;
389
- }
390
- element.addEventListener(eventName, handler);
391
- events.set(eventName, handler);
389
+ element.addEventListener(eventName, (event) =>
390
+ invokeNext(event, list)
391
+ );
392
392
  });
393
393
  });
394
394
  }
@@ -532,7 +532,10 @@ function activate(prefix = "atv") {
532
532
  }
533
533
 
534
534
  function updateControllers(root) {
535
- let initialCount = Number(allControllers.get(prefix)?.size);
535
+ let initialCount = 0;
536
+ if (allControllers?.has(prefix)) {
537
+ initialCount = Number(allControllers.get(prefix).size);
538
+ }
536
539
  const elements = new Set();
537
540
  if (root.matches(controllersSelector)) {
538
541
  elements.add(root);
@@ -542,11 +545,13 @@ function activate(prefix = "atv") {
542
545
  .forEach((element) => elements.add(element));
543
546
  elements.forEach(registerControllers);
544
547
 
545
- report(
546
- allControllers.get(prefix).size - initialCount,
547
- "controllers",
548
- "found"
549
- );
548
+ if (allControllers.has(prefix)) {
549
+ report(
550
+ allControllers.get(prefix).size - initialCount,
551
+ "controllers",
552
+ "found"
553
+ );
554
+ }
550
555
  }
551
556
 
552
557
  updateControllers(root);
@@ -656,4 +661,4 @@ function activate(prefix = "atv") {
656
661
  observer.observe(document, config);
657
662
  }
658
663
 
659
- export { activate, version };
664
+ export { activate, version };
@@ -0,0 +1,4 @@
1
+ // @sbrew.com/atv@0.1.9 downloaded from https://ga.jspm.io/npm:@sbrew.com/atv@0.1.9/atv.js
2
+
3
+ const t="0.1.9";function importMap(){return JSON.parse(document.querySelector("script[type='importmap']").innerText).imports}const e=/[\-_]/;function pascalize(t){return t.split(e).map((t=>t.charAt(0).toUpperCase()+t.slice(1))).join("")}function dasherize(t){return t.replace(/_/g,"-")}const n=/,[\s+]/;function allVariants(...t){const e=t.filter((t=>Boolean(t)));return e.length===0?[]:dashVariants(...e).flatMap((t=>[t,`${t}s`]))}function dashVariants(t,...n){function dashOrUnderscore(t){const n=t||"";return e.test(n)?[dasherize(n),n.replace(/-/g,"_")]:[n]}const r=dashOrUnderscore(t);return n.length<1?r:dashVariants(...n).flatMap((t=>r.flatMap((e=>[`${e}-${t}`,`${e}_${t}`]))))}function variantSelectors(t,...e){return allVariants("data",...e).flatMap((e=>Array.from(t.querySelectorAll(`[${e}]`)).map((t=>[t,e]))))}function errorReport(t){t?.message?.includes("JSON")||console.error(`ATV: ${t}`)}function actionsFor(t,e,r=null){let o=[];const c=/[()]/;function parseAction(t,e){let i;let a=[];let[s,l]=t.split(/[\s]*[\-=]>[\s]*/);if(l){let[t,n]=l.split("#");n?e=t:n=t;i=n}else i=s;const[f,u]=i.split(c);if(u){i=f;a=u.split(n);try{a=JSON.parse(`[${u}]`)}catch(t){errorReport(t)}s=s.split("(")[0]}if(!r||s===r){if(!e){e=i;i=s}o.push({controller:dasherize(e),event:s,method:i,parameters:a})}}function actionSplit(t,e){let n=0;let r=[];Array.from(t).forEach((function(t){if(t!==","||n!==0){r.push(t);t==="("?n+=1:t===")"&&(n-=1)}else{e(r.join("").trim());r=[]}}));const o=r.join("").trim();n!==0&&console.error(`badly formed parameters: ${t}`);o&&e(o)}e.getAttributeNames().forEach((function(n){const r=new RegExp(`^data[_-]${t}[_-]?action[s]?`);const o=new RegExp(`^data[_-]${t}[_-]?(.*[^-_])[_-]?action[s]?`);let c;let i=n.match(o);if(i)c=i[1];else{c=null;i=n.match(r)}if(!i)return;let a=e.getAttribute(n);if(a){try{a=JSON.parse(a).join(",")}catch(t){errorReport(t)}actionSplit(a,(t=>parseAction(t,c)))}}));return o}function attributeKeysFor(t,e){if(!t||!t.getAttributeNames)return[];const n=new RegExp(`${e}s?$`,"i");return t.getAttributeNames().filter((t=>n.test(t)))}function attributesFor(t,e){return attributeKeysFor(t,e).map((e=>t.getAttribute(e)))}const r=new Set;const o=new Map;let c=new Map;function findOrInitalize(t,e,n,r=null){t.has(e)||t.set(e,new Map);t.get(e).has(n)||t.get(e).set(n,r??new Map);return t.get(e).get(n)}function withModule(t,e){let n=`${t}_atv`;const r=importMap();Object.keys(r).forEach((function(e){dasherize(e).includes(`/${t}-atv`)&&(n=r[e])}));import(n).then((function(t){e(t)})).catch((function(t){console.error(`Loading ${n} failed:`,t)}))}function activate(e="atv"){if(c.has(e))return;const i=document.body;const a=allVariants("data",e,"controller").map((t=>`[${t}]`)).join(",");function outOfScope(t,e,r){if(!t||t.nodeType==="BODY")return true;const o=t.closest(a);if(!o)return true;let c=false;attributesFor(o,"controller").forEach((function(t){const i=t.split(n).map((t=>dasherize(t)));c=i.includes(r)?!(o===e):outOfScope(o.parentNode,e,r)}));return c}const s=!document.querySelector(`[data-${e}-report="true"]`);function report(n,r,o){s||n<1||console.log([["ATV:",`(${e})`,r,`[${Number(c.get(e)?.size)}]`].join(" "),`${o}: ${n}`,`v${t}`].join(" / "))}function createController(t,i){let a;let s={};let l={};r.add(i);function getActions(){return a}function registerActions(t){const n=findOrInitalize(c,e,t);let r=new Set;function collectElements(t){const[e]=t;r.add(e)}variantSelectors(t,e,i,"action").forEach(collectElements);variantSelectors(t,e,"action").forEach(collectElements);Array.from(r).forEach((function(r){const o=actionsFor(e,r);const c=new Set(o.map((t=>t.event)));c.forEach((function(c){const a=o.find((t=>t.event===c));a?.controller===i&&r.addEventListener(c,(t=>invokeNext(t,o)));function invokeNext(o,a){if(a.length<1)return;const s=a[0];if(s.event===c&&!outOfScope(r,t,s.controller)){const t=n.get(s.controller).getActions();const r=t[s.method];let a;if(r){try{a=r(o.target,o,s.parameters)}catch(t){console.error(`ATV ${e}: ${c}->${i}`,t)}if(a===false){o.stopPropagation();return}}}return a.length>1?invokeNext(o,a.slice(1)):void 0}}))}))}function refresh(){function refreshTargets(t,r){const c={};function collectionKeys(t){return[`all${pascalize(t)}`,`${t}s`]}variantSelectors(t.parentNode,e,i,"target").forEach((function(e){const[r,o]=e;r.getAttribute(o).split(n).forEach((function(e){const[n,o]=collectionKeys(e);if(!(s[e]===r||s[n]&&s[n].includes(r)||outOfScope(r,t,i))){if(s[n]){s[n].push(r);s[o].push(r)}else if(s[e]){s[n]=[s[e],r];s[o]=[s[e],r]}else s[e]=r;c[e]||(c[e]=[]);c[e].push(r)}}))}));r();Object.keys(c).forEach((function(t){const n=a[`${t}TargetConnected`];n&&c[t].forEach(n);const r=a[`${t}TargetDisconnected`];r&&c[t].forEach((function(n){findOrInitalize(o,e,n,[]).push((function(){const[e,o]=collectionKeys(t);let c=s[e]?.indexOf(n);c&&s[e].splice(c,1);c=s[o]?.indexOf(n);c&&s[o].splice(c,1);s[t]===n&&(s[e]?s[t]=s[e][0]:delete s[e]);r(n)}))}))}))}function refreshValues(t){allVariants("data",e,i,"value").forEach((function(e){const n=t.getAttribute(e);n&&[n,`{${n}}`].forEach((function(t){try{Object.assign(l,JSON.parse(t))}catch(t){errorReport(t)}}))}))}withModule(i,(function(e){refreshTargets(t,(function(){refreshValues(t);const n=e.connect(s,l,t,controllerBySelectorAndName);a=typeof n==="function"?n():n;registerActions(t)}))}))}const f=Object.freeze({getActions:getActions,refresh:refresh});return f}function registerControllers(t){findOrInitalize(c,e,t);attributesFor(t,"controller").forEach((function(r){r.split(n).forEach((function(n){const r=dasherize(n);const o=c.get(e).get(t).get(r)||createController(t,r);o.refresh();c.get(e).get(t).set(r,o)}))}))}function updateControllers(t){let n=0;c?.has(e)&&(n=Number(c.get(e).size));const r=new Set;t.matches(a)&&r.add(t);t.querySelectorAll(a).forEach((t=>r.add(t)));r.forEach(registerControllers);c.has(e)&&report(c.get(e).size-n,"controllers","found")}updateControllers(i);const l=new MutationObserver(domWatcher);function controllerBySelectorAndName(t,n,r){document.querySelectorAll(t).forEach((function(t){let o=findOrInitalize(c,e,t)?.get(n);o&&r({actions:o.getActions()})}))}function domWatcher(t,n){function cleanup(t){if(t.nodeName!=="BODY"&&t.nodeName!=="HTML"&&t.nodeName!=="#document"){cleanTargets(t);t.querySelectorAll(a).forEach(cleanActions);cleanActions(t)}else{n.disconnect();c=new Map}function cleanTargets(t){t&&t.children.length>0&&Array.from(t.children).forEach(cleanTargets);const n=o.get(e)?.get(t);if(n){n.forEach((t=>t()));n.splice(0,n.length)}}function cleanActions(t){const n=findOrInitalize(c,e,t);if(n){n.forEach((function(t){const e=t.getActions().disconnect;e&&e()}));c.get(e).delete(t)}}}function controllerFor(t,n){if(t&&t!==document.body)return findOrInitalize(c,e,t)?.get(n)||controllerFor(t.parentNode,n)}function updateTargets(t){Array.from(r).forEach((function(n){controllerFor(t,n)?.refresh();variantSelectors(t,e,n,"target").forEach((function(t){controllerFor(t[0],n)?.refresh()}))}))}function HTMLElements(t){return Boolean(t.classList)}t.forEach((function(t){t.type==="childList"&&Array.from(t.removedNodes).filter(HTMLElements).forEach((t=>cleanup(t)))}));t.forEach((function(t){t.type==="childList"&&Array.from(t.addedNodes).filter(HTMLElements).forEach((function(t){updateTargets(t);updateControllers(t)}))}))}const f={childList:true,subtree:true};l.observe(document,f)}export{activate,t as version};
4
+
data/lib/atv/engine.rb ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ATV
4
+ class Engine < ::Rails::Engine
5
+ JAVASCRIPTS = %w[atv.js atv.min.js].freeze
6
+
7
+ initializer "ATV.configure_rails_initialization" do
8
+ if Rails.application.config.respond_to?(:assets)
9
+ Rails.application.config.assets.precompile += JAVASCRIPTS
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module ATV
2
+ VERSION = "0.0.4"
3
+ end
data/lib/atv-rails.rb ADDED
@@ -0,0 +1,5 @@
1
+ module ATV
2
+ end
3
+
4
+ require "atv/version"
5
+ require "atv/engine"
@@ -0,0 +1,14 @@
1
+ Description:
2
+ ============
3
+ Generates a new ATV controller at the passed path.
4
+
5
+ Examples:
6
+ =========
7
+ bin/rails generate atv chat
8
+
9
+ creates: app/javascript/controllers/chat_atv.js
10
+
11
+
12
+ bin/rails generate stimulus nested/chat
13
+
14
+ creates: app/javascript/controllers/nested/chat_atv.js
@@ -0,0 +1,19 @@
1
+ require "rails/generators/named_base"
2
+
3
+ class AtvGenerator < Rails::Generators::NamedBase # :nodoc:
4
+ source_root File.expand_path("templates", __dir__)
5
+
6
+ def copy_view_files
7
+ @attribute = attribute_value(controller_name)
8
+ template "controller.js", "app/javascript/controllers/#{controller_name}_atv.js"
9
+ end
10
+
11
+ private
12
+ def controller_name
13
+ name.underscore.gsub(/_atv$/, "")
14
+ end
15
+
16
+ def attribute_value(controller_name)
17
+ controller_name.gsub(/\//, "--").gsub("_", "-")
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ function connect(targets, values, element, controllers) {
2
+ return (function() {
3
+ // Object contains named methods plus disconnect, and target backs.
4
+ return {
5
+ click: function(actor, event, params) {
6
+ },
7
+ disconnect: function() {
8
+ }
9
+ }
10
+ });
11
+ };
12
+
13
+ export { connect };
@@ -0,0 +1,37 @@
1
+ namespace :atv do
2
+ desc "Install ATV into this rails app"
3
+ task :install do
4
+ importmap_file = "config/importmap.rb"
5
+ pin_command = %(pin "@sbrew.com/atv", to: "atv.min.js")
6
+ installed = false
7
+
8
+ # Add importmap
9
+ if File.exist?(importmap_file)
10
+ if File.read(importmap_file).include?(pin_command)
11
+ puts "Importmap already pinned, no change"
12
+ installed = true
13
+ end
14
+ end
15
+ unless installed
16
+ File.open(importmap_file, "a") do |file|
17
+ file.puts(pin_command)
18
+ end
19
+ end
20
+
21
+ # Add to application.js
22
+ application_js_file = "app/javascript/application.js"
23
+ included = false
24
+
25
+ if File.exist?(application_js_file)
26
+ if File.read(application_js_file).match?(/import.*activate.*sbrew.*atv/)
27
+ puts "Javascript already included, no change"
28
+ included = true
29
+ end
30
+ end
31
+ unless included
32
+ File.open(application_js_file, "a") do |file|
33
+ file.puts %[import { activate } from "@sbrew.com/atv"; activate("atv");]
34
+ end
35
+ end
36
+ end
37
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atv-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Timothy Breitkreutz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-23 00:00:00.000000000 Z
11
+ date: 2025-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -16,14 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 6.0.1
19
+ version: 7.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 6.0.1
26
+ version: 7.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: stimulus-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: importmap-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 2.0.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.0
27
55
  description:
28
56
  email:
29
57
  - tim@sbrew.com
@@ -34,13 +62,15 @@ files:
34
62
  - MIT-LICENSE
35
63
  - README.md
36
64
  - Rakefile
37
- - app/assets/atv-min.js
38
65
  - app/assets/javascripts/atv.js
39
- - lib/atv/rails.rb
40
- - lib/atv/rails/railtie.rb
41
- - lib/atv/rails/version.rb
42
- - lib/install/importmap.rb
43
- - lib/tasks/atv/rails_tasks.rake
66
+ - app/assets/javascripts/atv.min.js
67
+ - lib/atv-rails.rb
68
+ - lib/atv/engine.rb
69
+ - lib/atv/version.rb
70
+ - lib/generators/atv/USAGE
71
+ - lib/generators/atv/atv_generator.rb
72
+ - lib/generators/atv/templates/controller.js.tt
73
+ - lib/tasks/atv.rake
44
74
  homepage: https://www.sbrew.com/atv
45
75
  licenses:
46
76
  - MIT
@@ -1 +0,0 @@
1
- const t="0.1.8";function importMap(){return JSON.parse(document.querySelector("script[type='importmap']").innerText).imports}const e=/[\-_]/;function pascalize(t){return t.split(e).map((t=>t.charAt(0).toUpperCase()+t.slice(1))).join("")}function dasherize(t){return t.replace(/_/g,"-")}const n=/,[\s+]/;function allVariants(...t){const e=t.filter((t=>Boolean(t)));return e.length===0?[]:dashVariants(...e).flatMap((t=>[t,`${t}s`]))}function dashVariants(t,...n){function dashOrUnderscore(t){const n=t||"";return e.test(n)?[dasherize(n),n.replace(/-/g,"_")]:[n]}const r=dashOrUnderscore(t);return n.length<1?r:dashVariants(...n).flatMap((t=>r.flatMap((e=>[`${e}-${t}`,`${e}_${t}`]))))}function variantSelectors(t,...e){return allVariants("data",...e).flatMap((e=>Array.from(t.querySelectorAll(`[${e}]`)).map((t=>[t,e]))))}function errorReport(t){t?.message?.includes("JSON")||console.error(`ATV: ${t}`)}function actionsFor(t,e,r=null){let o=[];const c=/[()]/;function parseAction(t,e){let i;let a=[];let[s,l]=t.split(/[\s]*[\-=]>[\s]*/);if(l){let[t,n]=l.split("#");n?e=t:n=t;i=n}else i=s;const[f,u]=i.split(c);if(u){i=f;a=u.split(n);try{a=JSON.parse(`[${u}]`)}catch(t){errorReport(t)}s=s.split("(")[0]}if(!r||s===r){if(!e){e=i;i=s}o.push({controller:dasherize(e),event:s,method:i,parameters:a})}}function actionSplit(t,e){let n=0;let r=[];Array.from(t).forEach((function(t){if(t!==","||n!==0){r.push(t);t==="("?n+=1:t===")"&&(n-=1)}else{e(r.join("").trim());r=[]}}));const o=r.join("").trim();n!==0&&console.error(`badly formed parameters: ${t}`);o&&e(o)}e.getAttributeNames().forEach((function(n){const r=new RegExp(`^data[_-]${t}[_-]?action[s]?`);const o=new RegExp(`^data[_-]${t}[_-]?(.*[^-_])[_-]?action[s]?`);let c;let i=n.match(o);if(i)c=i[1];else{c=null;i=n.match(r)}if(!i)return;let a=e.getAttribute(n);if(a){try{a=JSON.parse(a).join(",")}catch(t){errorReport(t)}actionSplit(a,(t=>parseAction(t,c)))}}));return o}function attributeKeysFor(t,e){if(!t||!t.getAttributeNames)return[];const n=new RegExp(`${e}s?$`,"i");return t.getAttributeNames().filter((t=>n.test(t)))}function attributesFor(t,e){return attributeKeysFor(t,e).map((e=>t.getAttribute(e)))}const r=new Set;const o=new Map;const c=new Map;let i=new Map;function findOrInitalize(t,e,n,r=null){t.has(e)||t.set(e,new Map);t.get(e).has(n)||t.get(e).set(n,r??new Map);return t.get(e).get(n)}function withModule(t,e){let n=`${t}_atv`;const r=importMap();Object.keys(r).forEach((function(e){dasherize(e).includes(`/${t}-atv`)&&(n=r[e])}));import(n).then((function(t){e(t)})).catch((function(t){console.error(`Loading ${n} failed:`,t)}))}function activate(e="atv"){if(i.has(e))return;const a=document.body;const s=allVariants("data",e,"controller").map((t=>`[${t}]`)).join(",");function outOfScope(t,e,r){if(!t||t.nodeType==="BODY")return true;const o=t.closest(s);if(!o)return true;let c=false;attributesFor(o,"controller").forEach((function(t){const i=t.split(n).map((t=>dasherize(t)));c=i.includes(r)?!(o===e):outOfScope(o.parentNode,e,r)}));return c}const l=!document.querySelector(`[data-${e}-report="true"]`);function report(n,r,o){l||n<1||console.log([["ATV:",`(${e})`,r,`[${Number(i.get(e)?.size)}]`].join(" "),`${o}: ${n}`,`v${t}`].join(" / "))}function createController(t,a){let s;let l={};let f={};r.add(a);function getActions(){return s}function registerActions(t){const n=findOrInitalize(i,e,t);let r=new Set;function collectElements(t){const[e]=t;r.add(e)}variantSelectors(t,e,a,"action").forEach(collectElements);variantSelectors(t,e,"action").forEach(collectElements);Array.from(r).forEach((function(r){const c=actionsFor(e,r);const i=new Set(c.map((t=>t.event)));i.forEach((function(i){const s=c.find((t=>t.event===i));if(s?.controller!==a)return;function invokeNext(e,o){if(o.length<1)return;const c=o[0];if(c.event===i&&!outOfScope(r,t,c.controller)){const t=n.get(c.controller).getActions();const r=t[c.method];if(r){const t=r(e.target,e,c.parameters);if(t===false)return}}return o.length>1?invokeNext(e,o.slice(1)):void 0}const handler=t=>invokeNext(t,c);const l=findOrInitalize(o,e,r);if(!l.get(i)){r.addEventListener(i,handler);l.set(i,handler)}}))}))}function refresh(){function refreshTargets(t,r){const o={};function collectionKeys(t){return[`all${pascalize(t)}`,`${t}s`]}variantSelectors(t.parentNode,e,a,"target").forEach((function(e){const[r,c]=e;r.getAttribute(c).split(n).forEach((function(e){const[n,c]=collectionKeys(e);if(!(l[e]===r||l[n]&&l[n].includes(r)||outOfScope(r,t,a))){if(l[n]){l[n].push(r);l[c].push(r)}else if(l[e]){l[n]=[l[e],r];l[c]=[l[e],r]}else l[e]=r;o[e]||(o[e]=[]);o[e].push(r)}}))}));r();Object.keys(o).forEach((function(t){const n=s[`${t}TargetConnected`];n&&o[t].forEach(n);const r=s[`${t}TargetDisconnected`];r&&o[t].forEach((function(n){findOrInitalize(c,e,n,[]).push((function(){const[e,o]=collectionKeys(t);let c=l[e]?.indexOf(n);c&&l[e].splice(c,1);c=l[o]?.indexOf(n);c&&l[o].splice(c,1);l[t]===n&&(l[e]?l[t]=l[e][0]:delete l[e]);r(n)}))}))}))}function refreshValues(t){allVariants("data",e,a,"value").forEach((function(e){const n=t.getAttribute(e);n&&[n,`{${n}}`].forEach((function(t){try{Object.assign(f,JSON.parse(t))}catch(t){errorReport(t)}}))}))}withModule(a,(function(e){refreshTargets(t,(function(){refreshValues(t);const n=e.connect(l,f,t,controllerBySelectorAndName);s=typeof n==="function"?n():n;registerActions(t)}))}))}const u=Object.freeze({getActions:getActions,refresh:refresh});return u}function registerControllers(t){findOrInitalize(i,e,t);attributesFor(t,"controller").forEach((function(r){r.split(n).forEach((function(n){const r=dasherize(n);const o=i.get(e).get(t).get(r)||createController(t,r);o.refresh();i.get(e).get(t).set(r,o)}))}))}function updateControllers(t){let n=Number(i.get(e)?.size);const r=new Set;t.matches(s)&&r.add(t);t.querySelectorAll(s).forEach((t=>r.add(t)));r.forEach(registerControllers);report(i.get(e).size-n,"controllers","found")}updateControllers(a);const f=new MutationObserver(domWatcher);function controllerBySelectorAndName(t,n,r){document.querySelectorAll(t).forEach((function(t){let o=findOrInitalize(i,e,t)?.get(n);o&&r({actions:o.getActions()})}))}function domWatcher(t,n){function cleanup(t){if(t.nodeName!=="BODY"&&t.nodeName!=="HTML"&&t.nodeName!=="#document"){cleanTargets(t);t.querySelectorAll(s).forEach(cleanActions);cleanActions(t)}else{n.disconnect();i=new Map}function cleanTargets(t){t&&t.children.length>0&&Array.from(t.children).forEach(cleanTargets);const n=c.get(e)?.get(t);if(n){n.forEach((t=>t()));n.splice(0,n.length)}}function cleanActions(t){const n=findOrInitalize(i,e,t);if(n){n.forEach((function(t){const e=t.getActions().disconnect;e&&e()}));i.get(e).delete(t)}}}function controllerFor(t,n){if(t&&t!==document.body)return findOrInitalize(i,e,t)?.get(n)||controllerFor(t.parentNode,n)}function updateTargets(t){Array.from(r).forEach((function(n){controllerFor(t,n)?.refresh();variantSelectors(t,e,n,"target").forEach((function(t){controllerFor(t[0],n)?.refresh()}))}))}function HTMLElements(t){return Boolean(t.classList)}t.forEach((function(t){t.type==="childList"&&Array.from(t.removedNodes).filter(HTMLElements).forEach((t=>cleanup(t)))}));t.forEach((function(t){t.type==="childList"&&Array.from(t.addedNodes).filter(HTMLElements).forEach((function(t){updateTargets(t);updateControllers(t)}))}))}const u={childList:true,subtree:true};f.observe(document,u)}export{activate,t as version};
@@ -1,6 +0,0 @@
1
- module ATV
2
- module Rails
3
- class Railtie < ::Rails::Railtie
4
- end
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module ATV
2
- module Rails
3
- VERSION = "0.0.3"
4
- end
5
- end
data/lib/atv/rails.rb DELETED
@@ -1,8 +0,0 @@
1
- require "atv/rails/version"
2
- require "atv/rails/railtie"
3
-
4
- module ATV
5
- module Rails
6
- # Your code goes here...
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- # Assumes stimulus is already installed
2
-
3
- say "Copying ATV Rails JavaScript"
4
- copy_file "#{__dir__}/app/javascript/controllers/atv-rails.js", "app/javascript/controllers/atv-rails.js"
5
-
6
- say "Pin ATV"
7
- say %(Appending: pin "@sbrew.com/atv")
8
- append_to_file "config/importmap.rb", %(pin "atv", to: "@sbrew.com--atv.js"\n)
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :atv_rails do
3
- # # Task goes here
4
- # end