hotwire-stimulus-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,21 @@
1
+ import { Application } from "stimulus"
2
+
3
+ const application = Application.start()
4
+
5
+ function autoload() {
6
+ Array.from(document.querySelectorAll('[data-controller]')).forEach((element) => {
7
+ const controllerNames = element.attributes["data-controller"].value.split(" ")
8
+
9
+ controllerNames.forEach((controllerName) => {
10
+ let controllerFilename = `${controllerName}_controller`
11
+
12
+ import(controllerFilename).then((controllerModule) => {
13
+ application.register(controllerName, controllerModule.default)
14
+ }).catch(error => console.log(`Failed to autoload controller: ${controllerName}`))
15
+ })
16
+ })
17
+ }
18
+
19
+ autoload()
20
+
21
+ window.addEventListener("turbo:load", autoload)
@@ -0,0 +1,20 @@
1
+ // Experimental: Not currently exposed.
2
+ import { Application } from "stimulus"
3
+
4
+ const application = Application.start()
5
+
6
+ async function preloadControllers() {
7
+ const imports = await fetch("<%= asset_path "importmap.json" %>").then(r => r.json()).then(json => json.imports)
8
+
9
+ for (const name in imports) {
10
+ if (name.startsWith("controllers/")) {
11
+ let controllerName = name.replace(/controllers\//, "").replace("_controller", "")
12
+
13
+ import(imports[name]).then((module) => {
14
+ application.register(controllerName, module.default)
15
+ }).catch(error => console.log(error))
16
+ }
17
+ }
18
+ }
19
+
20
+ preloadControllers()
@@ -0,0 +1,2 @@
1
+ //= link_directory ./libraries
2
+ //= link_directory ./loaders
@@ -0,0 +1,10 @@
1
+ module Stimulus::StimulusHelper
2
+ def stimulus_include_tags
3
+ [
4
+ javascript_include_tag("stimulus/libraries/es-module-shims", type: "module"),
5
+ tag.script(type: "importmap-shim", src: asset_path("importmap.json")),
6
+ javascript_include_tag("stimulus/libraries/stimulus", type: "module-shim"),
7
+ javascript_include_tag("stimulus/loaders/autoloader", type: "module-shim")
8
+ ].join("\n").html_safe
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ require "stimulus/version"
2
+ require "stimulus/engine"
3
+
4
+ module Stimulus
5
+ end
@@ -0,0 +1,7 @@
1
+ import { Controller } from "stimulus"
2
+
3
+ export default class extends Controller {
4
+ connect() {
5
+ this.element.textContent = "Hello World!"
6
+ }
7
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "imports": {
3
+ <%= importmap_list_with_stimulus_from "app/assets/javascripts/controllers", "app/assets/javascripts/libraries" %>
4
+ }
5
+ }
@@ -0,0 +1,16 @@
1
+ say "Copying Stimulus JavaScript"
2
+ directory "#{__dir__}/app/assets/javascripts", "app/assets/javascripts"
3
+ empty_directory "app/assets/javascripts/libraries"
4
+
5
+ say "Add app/javascripts to asset pipeline manifest"
6
+ append_to_file Rails.root.join("app/assets/config/manifest.js").to_s, "//= link_tree ../javascripts\n"
7
+
8
+ say "Add Stimulus include tags in application layout"
9
+ insert_into_file Rails.root.join("app/views/layouts/application.html.erb").to_s, "\n <%= stimulus_include_tags %>", before: /\s*<\/head>/
10
+
11
+ say "Turn off development debug mode"
12
+ comment_lines Rails.root.join("config/environments/development.rb"), /config.assets.debug = true/
13
+
14
+ say "Turn off rack-mini-profiler"
15
+ comment_lines Rails.root.join("Gemfile"), /rack-mini-profiler/
16
+ run "bin/bundle", capture: true
@@ -0,0 +1,22 @@
1
+ require "stimulus/importmap_helper"
2
+
3
+ module Stimulus
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace Stimulus
6
+ config.eager_load_namespaces << Stimulus
7
+
8
+ initializer "stimulus.assets" do
9
+ Rails.application.config.assets.precompile += %w( importmap.json stimulus/manifest )
10
+ end
11
+
12
+ initializer "stimulus.helpers" do
13
+ ActiveSupport.on_load(:action_controller_base) do
14
+ helper Stimulus::Engine.helpers
15
+ end
16
+
17
+ Rails.application.config.assets.configure do |env|
18
+ env.context_class.class_eval { include Stimulus::ImportmapHelper }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ module Stimulus::ImportmapHelper
2
+ def importmap_list_with_stimulus_from(*paths)
3
+ [ %("stimulus": "#{asset_path("stimulus/libraries/stimulus")}"), importmap_list_from(*paths) ].join(",\n")
4
+ end
5
+
6
+ def importmap_list_from(*paths)
7
+ Array(paths).flat_map do |path|
8
+ absolute_path = Rails.root.join(path)
9
+ dirname = absolute_path.basename.to_s
10
+
11
+ absolute_path.children.collect do |module_filename|
12
+ module_name = importmap_module_name_from(module_filename)
13
+ %("#{module_name}": "#{asset_path("#{dirname}/#{module_filename.basename}")}")
14
+ end
15
+ end.join(",\n")
16
+ end
17
+
18
+ private
19
+ # Strip off the extension and any versioning data for an absolute module name.
20
+ def importmap_module_name_from(filename)
21
+ filename.basename.to_s.remove(filename.extname).split("@").first
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Stimulus
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,6 @@
1
+ namespace :stimulus do
2
+ desc "Install Stimulus into the app"
3
+ task :install do
4
+ system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../install/stimulus.rb", __dir__)}"
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hotwire-stimulus-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sam Stephenson
8
+ - Javan Mahkmali
9
+ - David Heinemeier Hansson
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2020-12-22 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 6.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: 6.0.0
29
+ description:
30
+ email: david@loudthinking.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - MIT-LICENSE
36
+ - README.md
37
+ - Rakefile
38
+ - app/assets/javascripts/stimulus/libraries/es-module-shims.js
39
+ - app/assets/javascripts/stimulus/libraries/es-module-shims@0.7.1.js
40
+ - app/assets/javascripts/stimulus/libraries/stimulus.js
41
+ - app/assets/javascripts/stimulus/libraries/stimulus@2.js
42
+ - app/assets/javascripts/stimulus/loaders/autoloader.js
43
+ - app/assets/javascripts/stimulus/loaders/preloader.js.erb
44
+ - app/assets/javascripts/stimulus/manifest.js
45
+ - app/helpers/stimulus/stimulus_helper.rb
46
+ - lib/hotwire-stimulus-rails.rb
47
+ - lib/install/app/assets/javascripts/controllers/hello_controller.js
48
+ - lib/install/app/assets/javascripts/importmap.json.erb
49
+ - lib/install/stimulus.rb
50
+ - lib/stimulus/engine.rb
51
+ - lib/stimulus/importmap_helper.rb
52
+ - lib/stimulus/version.rb
53
+ - lib/tasks/stimulus_tasks.rake
54
+ homepage: https://stimulus.hotwire.dev
55
+ licenses:
56
+ - MIT
57
+ metadata:
58
+ homepage_uri: https://stimulus.hotwire.dev
59
+ source_code_uri: https://github.com/hotwired/stimulus-rails
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubygems_version: 3.1.2
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: A modest JavaScript framework for the HTML you already have.
79
+ test_files: []