hotwire-livereload 0.1.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f8001c1b5e1ae699af050da2c601fd29ee3242cdcdd87f1487b38d18a395978
4
- data.tar.gz: 0fa2a43353fceb7e14908d1130cb7fcea7c71b59846888c3845e91922b5ac833
3
+ metadata.gz: b6e414e66bbb4fbc76eef6000651aad79952f8f51ea70f19970691c780af09c2
4
+ data.tar.gz: 76540592b6138efb0365019b43ef04751a7071037f62814babbd05e96ff5bf01
5
5
  SHA512:
6
- metadata.gz: 7202fa592b12ab9ef913d0fc62979b998a53357f9d74731df1fe1990ebe1f358a628509ae4a6010ee8dec1fbcadb60281bf9e62def1e829da728af9eeb211684
7
- data.tar.gz: 7b3b8dd4a60f103f2f2b9c673ceab137855a9ceaf583a6ed564384d1e1f617a80b06c7e751d09cdf801d583c7bea9ed60801accce6cd0c11203a1f0b9e996922
6
+ metadata.gz: bac450b366a58fe90bdadfdab8898f9592681bc97ff1d1cc2450db0be1fee0f6b32fadce34c5c66fb709266a7283932bee827413b56671ab36b72564238b6447
7
+ data.tar.gz: acd23ee5a23fce850579b5604ae2d5a2bd4c4d12134bf10bfd0a442a0dcdf96a396aa9bcbdda3aab2953f89d0d7988231cba40ace417c72ce8e37bd79045523a
data/README.md CHANGED
@@ -1,16 +1,81 @@
1
1
  # Hotwire::Livereload
2
2
 
3
- Automatically reload Hotwire Turbo when "view" files are modified.
3
+ Automatically reload Hotwire Turbo when app files are modified.
4
4
 
5
- https://user-images.githubusercontent.com/839922/131983979-afd0bcc7-86e8-4c53-9758-3bf762dbb16a.mp4
5
+ https://user-images.githubusercontent.com/839922/148676469-0acfa036-832e-4b40-aa05-1fdd945baa1f.mp4
6
6
 
7
- ## Installation
7
+ ## Gettings
8
8
 
9
- The JavaScript for Hotwire::Livereload is installed via asset pipeline, which is included with this gem.
9
+ Add `hotwire-livereload` to your Gemfile:
10
+ ```
11
+ bundle add hotwire-livereload --group development
12
+ ```
10
13
 
11
- 1. Add `hotwire-livereload` gem to your Gemfile: `gem 'hotwire-livereload'`
12
- 2. Run `./bin/bundle install`
13
- 3. Run `./bin/rails hotwire_livereload:install`
14
+ Run installer:
15
+ ```
16
+ rails livereload:install
17
+ ```
18
+
19
+ Folders listened by default:
20
+ - `app/views`
21
+ - `app/helpers`
22
+ - `app/javascript`
23
+ - `app/assets/stylesheets`
24
+ - `app/assets/javascripts`
25
+ - `app/assets/images`
26
+ - `app/components`
27
+ - `config/locales`
28
+
29
+ ## Configuration
30
+
31
+ You can watch for changes in additional folders by adding them to `listen_paths`:
32
+ ```ruby
33
+ # config/environments/development.rb
34
+
35
+ Rails.application.configure do
36
+ # ...
37
+ config.hotwire_livereload.listen_paths << Rails.root.join("app/custom_folder")
38
+ end
39
+ ```
40
+
41
+ You can disable default listen paths and fully override them:
42
+ ```ruby
43
+ # config/environments/development.rb
44
+
45
+ Rails.application.configure do
46
+ # ...
47
+ config.hotwire_livereload.disable_default_listeners = true
48
+ config.hotwire_livereload.listen_paths = [
49
+ Rails.root.join("app/assets/stylesheets"),
50
+ Rails.root.join("app/javascript")
51
+ ]
52
+ end
53
+ ```
54
+
55
+ If you don't have `data-turbo-track="reload"` attribute on your JS and CSS bundles you might need to setup force reloading. This will trigger full browser reloading for JS and CSS files only:
56
+ ```ruby
57
+ # config/environments/development.rb
58
+
59
+ Rails.application.configure do
60
+ # ...
61
+ config.hotwire_livereload.force_reload_paths << Rails.root.join("app/assets/stylesheets")
62
+ config.hotwire_livereload.force_reload_paths << Rails.root.join("app/javascript")
63
+ end
64
+ ```
65
+
66
+ ## Disable livereload
67
+
68
+ To temporarily disable livereload use:
69
+ ```bash
70
+ bin/rails livereload:disable
71
+ ```
72
+
73
+ To re-enable:
74
+ ```bash
75
+ bin/rails livereload:enable
76
+ ```
77
+
78
+ No server restart is required. Disabling is managed by `tmp/livereload-disabled.txt` file.
14
79
 
15
80
  ## Development
16
81
 
@@ -601,9 +601,15 @@
601
601
  var import_actioncable = __toModule(require_action_cable());
602
602
  var import_debounce = __toModule(require_debounce());
603
603
  var consumer = (0, import_actioncable.createConsumer)();
604
- var received = (0, import_debounce.default)(() => {
605
- console.log("[Hotwire::Livereload] Files changed");
606
- Turbo.visit(window.location.href);
604
+ var received = (0, import_debounce.default)(({ force_reload }) => {
605
+ const onErrorPage = document.title === "Action Controller: Exception caught";
606
+ if (onErrorPage || force_reload) {
607
+ console.log("[Hotwire::Livereload] Files changed. Force reloading..");
608
+ document.location.reload();
609
+ } else {
610
+ console.log("[Hotwire::Livereload] Files changed. Reloading..");
611
+ Turbo.visit(window.location.href);
612
+ }
607
613
  }, 300);
608
614
  consumer.subscriptions.create("Hotwire::Livereload::ReloadChannel", {
609
615
  received,
@@ -2,9 +2,16 @@ import { createConsumer } from "@rails/actioncable"
2
2
  import debounce from "debounce"
3
3
 
4
4
  const consumer = createConsumer()
5
- const received = debounce(() => {
6
- console.log("[Hotwire::Livereload] Files changed")
7
- Turbo.visit(window.location.href)
5
+ const received = debounce(({force_reload}) => {
6
+ const onErrorPage = document.title === "Action Controller: Exception caught"
7
+
8
+ if (onErrorPage || force_reload) {
9
+ console.log("[Hotwire::Livereload] Files changed. Force reloading..")
10
+ document.location.reload()
11
+ } else {
12
+ console.log("[Hotwire::Livereload] Files changed. Reloading..")
13
+ Turbo.visit(window.location.href)
14
+ }
8
15
  }, 300)
9
16
 
10
17
  consumer.subscriptions.create("Hotwire::Livereload::ReloadChannel", {
@@ -8,6 +8,8 @@ module Hotwire
8
8
  isolate_namespace Hotwire::Livereload
9
9
  config.hotwire_livereload = ActiveSupport::OrderedOptions.new
10
10
  config.hotwire_livereload.listen_paths ||= []
11
+ config.hotwire_livereload.force_reload_paths ||= []
12
+ config.hotwire_livereload.disable_default_listeners = false
11
13
  config.autoload_once_paths = %W(
12
14
  #{root}/app/channels
13
15
  #{root}/app/helpers
@@ -27,20 +29,41 @@ module Hotwire
27
29
 
28
30
  initializer "hotwire_livereload.set_configs" do |app|
29
31
  options = app.config.hotwire_livereload
30
- options.listen_paths = options.listen_paths.map(&:to_s)
31
- options.listen_paths << Rails.root.join("app/views")
32
- options.listen_paths << Rails.root.join("app/helpers")
33
- if Dir.exist?(Rails.root.join("app/javascript"))
34
- options.listen_paths << Rails.root.join("app/javascript")
32
+
33
+ unless options.disable_default_listeners
34
+ default_listen_paths = %w[
35
+ app/views
36
+ app/helpers
37
+ app/javascript
38
+ app/assets/stylesheets
39
+ app/assets/javascripts
40
+ app/assets/images
41
+ app/components
42
+ config/locales
43
+ ].map { |p| Rails.root.join(p) }
44
+ options.listen_paths += default_listen_paths.select { |p| Dir.exist?(p) }
35
45
  end
36
46
  end
37
47
 
38
48
  config.after_initialize do |app|
39
- if Rails.env.development?
40
- @listener = Listen.to(*app.config.hotwire_livereload.listen_paths) do |modified, added, removed|
41
- if modified.any? || removed.any? || added.any?
42
- content = { modified: modified, removed: removed, added: added }
43
- ActionCable.server.broadcast("hotwire-reload", content)
49
+ if Rails.env.development? && defined?(Rails::Server)
50
+ options = app.config.hotwire_livereload
51
+ listen_paths = options.listen_paths.map(&:to_s).uniq
52
+ force_reload_paths = options.force_reload_paths.map(&:to_s).uniq.join("|")
53
+
54
+ @listener = Listen.to(*listen_paths) do |modified, added, removed|
55
+ unless File.exists?(DISABLE_FILE)
56
+ changed = [modified, removed, added].flatten.uniq
57
+ return unless changed.any?
58
+
59
+ force_reload = force_reload_paths.present? && changed.any? do |path|
60
+ path.match(%r{#{force_reload_paths}})
61
+ end
62
+
63
+ ActionCable.server.broadcast("hotwire-reload", {
64
+ changed: changed,
65
+ force_reload: force_reload
66
+ })
44
67
  end
45
68
  end
46
69
  @listener.start
@@ -1,5 +1,5 @@
1
1
  module Hotwire
2
2
  module Livereload
3
- VERSION = "0.1.4"
3
+ VERSION = "1.1.0"
4
4
  end
5
5
  end
@@ -2,5 +2,6 @@ require "hotwire/livereload/engine"
2
2
 
3
3
  module Hotwire
4
4
  module Livereload
5
+ DISABLE_FILE = "tmp/livereload-disabled.txt"
5
6
  end
6
7
  end
@@ -3,18 +3,26 @@ CABLE_CONFIG_PATH = Rails.root.join("config/cable.yml")
3
3
 
4
4
  if APP_LAYOUT_PATH.exist?
5
5
  say "Add Hotwire Livereload tag in application layout"
6
- insert_into_file APP_LAYOUT_PATH, before: /\s*<\/head>/ do <<-HTML
7
- \n <%= hotwire_livereload_tags %>
6
+ content = <<-HTML
7
+ \n <% if Rails.env.development? %>
8
+ <%= javascript_include_tag "hotwire-livereload", defer: true %>
9
+ <% end %>
8
10
  HTML
9
- end
11
+ insert_into_file APP_LAYOUT_PATH, content.chop, before: /\s*<\/head>/
10
12
  else
11
13
  say "Default application.html.erb is missing!", :red
12
14
  say %( Add <%= hotwire_livereload_tags %> within the <head> tag in your custom layout.)
13
15
  end
14
16
 
15
17
  if CABLE_CONFIG_PATH.exist?
16
- say "Enable redis in bundle"
17
- uncomment_lines "Gemfile", %(gem 'redis')
18
+ gemfile = File.read(Rails.root.join("Gemfile"))
19
+ if gemfile.include?("redis")
20
+ say "Uncomment redis in Gemfile"
21
+ uncomment_lines "Gemfile", %(gem "redis")
22
+ else
23
+ say "Add redis to Gemfile"
24
+ gem "redis"
25
+ end
18
26
 
19
27
  say "Switch development cable to use redis"
20
28
  gsub_file CABLE_CONFIG_PATH.to_s, /development:\n\s+adapter: async/, "development:\n adapter: redis\n url: redis://localhost:6379/1"
@@ -0,0 +1,21 @@
1
+ namespace :livereload do
2
+ desc "Install Hotwire::Livereload into the app"
3
+ task :install do
4
+ system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../install/install.rb", __dir__)}"
5
+ end
6
+
7
+ desc "Disable Hotwire::Livereload"
8
+ task :disable do
9
+ FileUtils.mkdir_p("tmp")
10
+ FileUtils.touch Hotwire::Livereload::DISABLE_FILE
11
+ puts "Livereload disabled."
12
+ end
13
+
14
+ desc "Enable Hotwire::Livereload"
15
+ task :enable do
16
+ if File.exist?(Hotwire::Livereload::DISABLE_FILE)
17
+ File.delete Hotwire::Livereload::DISABLE_FILE
18
+ end
19
+ puts "Livereload enabled."
20
+ end
21
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hotwire-livereload
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kirill Platonov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-08 00:00:00.000000000 Z
11
+ date: 2022-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -55,7 +55,7 @@ files:
55
55
  - lib/hotwire/livereload/engine.rb
56
56
  - lib/hotwire/livereload/version.rb
57
57
  - lib/install/install.rb
58
- - lib/tasks/hotwire/livereload/install.rake
58
+ - lib/tasks/livereload_tasks.rake
59
59
  homepage: https://github.com/kirillplatonov/hotwire-livereload
60
60
  licenses:
61
61
  - MIT
@@ -75,8 +75,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  requirements: []
78
- rubygems_version: 3.2.22
78
+ rubygems_version: 3.2.32
79
79
  signing_key:
80
80
  specification_version: 4
81
- summary: Automatically reload Hotwire Turbo when 'view' files are modified.
81
+ summary: Automatically reload Hotwire Turbo when app files are modified.
82
82
  test_files: []
@@ -1,6 +0,0 @@
1
- namespace :hotwire_livereload do
2
- desc "Setup Hotwire Livereload"
3
- task :install do
4
- system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{File.expand_path("../../../install/install.rb", __dir__)}"
5
- end
6
- end