hotwire-livereload 1.3.0 → 1.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -0
- data/app/assets/javascripts/hotwire-livereload-turbo-stream.js +28 -0
- data/app/assets/javascripts/hotwire-livereload.js +30 -36
- data/app/javascript/hotwire-livereload.js +4 -18
- data/app/javascript/lib/hotwire-livereload-received.js +3 -0
- data/app/javascript/lib/hotwire-livereload-scroll-position.js +9 -6
- data/lib/hotwire/livereload/engine.rb +2 -1
- data/lib/hotwire/livereload/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44376128ac37b1619d34c7ee8dee64eb1901804cc170dd0bd5c2114973e98225
|
4
|
+
data.tar.gz: 9053700099d671c33b11fa0483100ec5f921016a7e2f1315113072c5c1bba587
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5677a61e971bfa24bb8c8ea76970420e370e03003f07970632bf07b22c187cc6dfc3289963509c8597f7b12c08e112d8db56f308fa85008023c3160a9f700846
|
7
|
+
data.tar.gz: 4e91a4a01f3e5b8d54e18b2344351c17bef3e1ac09568adc3b1802dc6a8f95eaa4abc6c972e93c8edd7eafa61a944e2b390e339697b1bc802cc7a8e85176b6ff
|
data/README.md
CHANGED
@@ -34,6 +34,8 @@ The gem detects if you use [`jsbundling-rails`](https://github.com/rails/jsbundl
|
|
34
34
|
|
35
35
|
## Configuration
|
36
36
|
|
37
|
+
### Listen paths
|
38
|
+
|
37
39
|
You can watch for changes in additional folders by adding them to `listen_paths`:
|
38
40
|
```ruby
|
39
41
|
# config/environments/development.rb
|
@@ -58,6 +60,8 @@ Rails.application.configure do
|
|
58
60
|
end
|
59
61
|
```
|
60
62
|
|
63
|
+
### Force reload
|
64
|
+
|
61
65
|
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:
|
62
66
|
```ruby
|
63
67
|
# config/environments/development.rb
|
@@ -69,6 +73,8 @@ Rails.application.configure do
|
|
69
73
|
end
|
70
74
|
```
|
71
75
|
|
76
|
+
### Reload method
|
77
|
+
|
72
78
|
Instead of a direct ActionCable websocket connection, you can reuse the existing TurboStream websocket connection and send updates using standard turbo-streams:
|
73
79
|
```ruby
|
74
80
|
# config/environments/development.rb
|
@@ -90,6 +96,22 @@ In that case you need to place `hotwire_livereload_tags` helper in your layout *
|
|
90
96
|
</head>
|
91
97
|
```
|
92
98
|
|
99
|
+
### Listen options
|
100
|
+
|
101
|
+
[Listen gem](https://github.com/guard/listen), which is used for file system monitoring, accepts [options](https://github.com/guard/listen?tab=readme-ov-file#options) like enabling a fallback mechanism called "polling" to detect file changes.
|
102
|
+
|
103
|
+
By default, Listen uses a more efficient mechanism called "native" which relies on the operating system's file system events to detect changes. However, in some cases, such as when working with network-mounted file systems or in certain virtualized environments, the native mechanism may not work reliably. In such cases, enabling force_polling ensures that file changes are still detected, albeit with a slightly higher resource usage.
|
104
|
+
|
105
|
+
You may use listen_options to pass these options like:
|
106
|
+
```ruby
|
107
|
+
# config/environments/development.rb
|
108
|
+
|
109
|
+
Rails.application.configure do
|
110
|
+
# ...
|
111
|
+
config.hotwire_livereload.listen_options[:force_polling] = true
|
112
|
+
end
|
113
|
+
```
|
114
|
+
|
93
115
|
## Disable livereload
|
94
116
|
|
95
117
|
To temporarily disable livereload use:
|
@@ -81,6 +81,32 @@
|
|
81
81
|
|
82
82
|
// app/javascript/lib/hotwire-livereload-received.js
|
83
83
|
var import_debounce = __toESM(require_debounce());
|
84
|
+
|
85
|
+
// app/javascript/lib/hotwire-livereload-scroll-position.js
|
86
|
+
var KEY = "hotwire-livereload-scrollPosition";
|
87
|
+
function read() {
|
88
|
+
const value = localStorage.getItem(KEY);
|
89
|
+
if (!value)
|
90
|
+
return;
|
91
|
+
return parseInt(value);
|
92
|
+
}
|
93
|
+
function save() {
|
94
|
+
const pos = window.scrollY;
|
95
|
+
localStorage.setItem(KEY, pos.toString());
|
96
|
+
}
|
97
|
+
function remove() {
|
98
|
+
localStorage.removeItem(KEY);
|
99
|
+
}
|
100
|
+
function restore() {
|
101
|
+
const value = read();
|
102
|
+
if (value) {
|
103
|
+
console.log("[Hotwire::Livereload] Restoring scroll position to", value);
|
104
|
+
window.scrollTo(0, value);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
var hotwire_livereload_scroll_position_default = { read, save, restore, remove };
|
108
|
+
|
109
|
+
// app/javascript/lib/hotwire-livereload-received.js
|
84
110
|
var hotwire_livereload_received_default = (0, import_debounce.default)(({ force_reload }) => {
|
85
111
|
const onErrorPage = document.title === "Action Controller: Exception caught";
|
86
112
|
if (onErrorPage || force_reload) {
|
@@ -88,6 +114,8 @@
|
|
88
114
|
document.location.reload();
|
89
115
|
} else {
|
90
116
|
console.log("[Hotwire::Livereload] Files changed. Reloading..");
|
117
|
+
hotwire_livereload_scroll_position_default.save();
|
118
|
+
Turbo.cache.clear();
|
91
119
|
Turbo.visit(window.location.href, { action: "replace" });
|
92
120
|
}
|
93
121
|
}, 300);
|
@@ -453,7 +453,7 @@
|
|
453
453
|
this.subscribe(subscription);
|
454
454
|
return subscription;
|
455
455
|
};
|
456
|
-
Subscriptions2.prototype.remove = function
|
456
|
+
Subscriptions2.prototype.remove = function remove2(subscription) {
|
457
457
|
this.forget(subscription);
|
458
458
|
if (!this.findAll(subscription.identifier).length) {
|
459
459
|
this.sendCommand(subscription, "unsubscribe");
|
@@ -607,7 +607,7 @@
|
|
607
607
|
// node_modules/debounce/index.js
|
608
608
|
var require_debounce = __commonJS({
|
609
609
|
"node_modules/debounce/index.js"(exports, module) {
|
610
|
-
function
|
610
|
+
function debounce2(func, wait, immediate) {
|
611
611
|
var timeout, args, context, timestamp, result;
|
612
612
|
if (null == wait)
|
613
613
|
wait = 100;
|
@@ -653,8 +653,8 @@
|
|
653
653
|
};
|
654
654
|
return debounced;
|
655
655
|
}
|
656
|
-
|
657
|
-
module.exports =
|
656
|
+
debounce2.debounce = debounce2;
|
657
|
+
module.exports = debounce2;
|
658
658
|
}
|
659
659
|
});
|
660
660
|
|
@@ -663,41 +663,46 @@
|
|
663
663
|
|
664
664
|
// app/javascript/lib/hotwire-livereload-received.js
|
665
665
|
var import_debounce = __toESM(require_debounce());
|
666
|
-
var hotwire_livereload_received_default = (0, import_debounce.default)(({ force_reload }) => {
|
667
|
-
const onErrorPage = document.title === "Action Controller: Exception caught";
|
668
|
-
if (onErrorPage || force_reload) {
|
669
|
-
console.log("[Hotwire::Livereload] Files changed. Force reloading..");
|
670
|
-
document.location.reload();
|
671
|
-
} else {
|
672
|
-
console.log("[Hotwire::Livereload] Files changed. Reloading..");
|
673
|
-
Turbo.visit(window.location.href, { action: "replace" });
|
674
|
-
}
|
675
|
-
}, 300);
|
676
666
|
|
677
667
|
// app/javascript/lib/hotwire-livereload-scroll-position.js
|
678
668
|
var KEY = "hotwire-livereload-scrollPosition";
|
679
669
|
function read() {
|
680
670
|
const value = localStorage.getItem(KEY);
|
681
671
|
if (!value)
|
682
|
-
return
|
672
|
+
return;
|
683
673
|
return parseInt(value);
|
684
674
|
}
|
685
675
|
function save() {
|
686
676
|
const pos = window.scrollY;
|
687
677
|
localStorage.setItem(KEY, pos.toString());
|
688
678
|
}
|
689
|
-
function
|
690
|
-
localStorage.
|
679
|
+
function remove() {
|
680
|
+
localStorage.removeItem(KEY);
|
691
681
|
}
|
692
682
|
function restore() {
|
693
683
|
const value = read();
|
694
|
-
|
695
|
-
|
684
|
+
if (value) {
|
685
|
+
console.log("[Hotwire::Livereload] Restoring scroll position to", value);
|
686
|
+
window.scrollTo(0, value);
|
687
|
+
}
|
696
688
|
}
|
697
|
-
var hotwire_livereload_scroll_position_default = { read, save, restore,
|
689
|
+
var hotwire_livereload_scroll_position_default = { read, save, restore, remove };
|
690
|
+
|
691
|
+
// app/javascript/lib/hotwire-livereload-received.js
|
692
|
+
var hotwire_livereload_received_default = (0, import_debounce.default)(({ force_reload }) => {
|
693
|
+
const onErrorPage = document.title === "Action Controller: Exception caught";
|
694
|
+
if (onErrorPage || force_reload) {
|
695
|
+
console.log("[Hotwire::Livereload] Files changed. Force reloading..");
|
696
|
+
document.location.reload();
|
697
|
+
} else {
|
698
|
+
console.log("[Hotwire::Livereload] Files changed. Reloading..");
|
699
|
+
hotwire_livereload_scroll_position_default.save();
|
700
|
+
Turbo.cache.clear();
|
701
|
+
Turbo.visit(window.location.href, { action: "replace" });
|
702
|
+
}
|
703
|
+
}, 300);
|
698
704
|
|
699
705
|
// app/javascript/hotwire-livereload.js
|
700
|
-
var import_debounce2 = __toESM(require_debounce());
|
701
706
|
var consumer = (0, import_actioncable.createConsumer)();
|
702
707
|
consumer.subscriptions.create("Hotwire::Livereload::ReloadChannel", {
|
703
708
|
received: hotwire_livereload_received_default,
|
@@ -708,19 +713,8 @@
|
|
708
713
|
console.log("[Hotwire::Livereload] Websocket disconnected");
|
709
714
|
}
|
710
715
|
});
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
if (window.scrollY !== 0)
|
716
|
-
return;
|
717
|
-
hotwire_livereload_scroll_position_default.save();
|
718
|
-
}, 1e3);
|
719
|
-
}, 100);
|
720
|
-
window.addEventListener("scroll", debouncedScroll);
|
721
|
-
document.addEventListener("turbo:click", hotwire_livereload_scroll_position_default.reset);
|
722
|
-
document.addEventListener("turbo:before-visit", hotwire_livereload_scroll_position_default.restore);
|
723
|
-
document.addEventListener("turbo:load", hotwire_livereload_scroll_position_default.restore);
|
724
|
-
document.addEventListener("DOMContentLoaded", hotwire_livereload_scroll_position_default.restore);
|
725
|
-
document.addEventListener("turbo:frame-load", hotwire_livereload_scroll_position_default.restore);
|
716
|
+
document.addEventListener("turbo:load", () => {
|
717
|
+
hotwire_livereload_scroll_position_default.restore();
|
718
|
+
hotwire_livereload_scroll_position_default.remove();
|
719
|
+
});
|
726
720
|
})();
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import { createConsumer } from "@rails/actioncable"
|
2
2
|
import received from "./lib/hotwire-livereload-received"
|
3
3
|
import scrollPosition from "./lib/hotwire-livereload-scroll-position"
|
4
|
-
import debounce from "debounce"
|
5
4
|
|
6
5
|
const consumer = createConsumer()
|
7
6
|
consumer.subscriptions.create("Hotwire::Livereload::ReloadChannel", {
|
@@ -16,21 +15,8 @@ consumer.subscriptions.create("Hotwire::Livereload::ReloadChannel", {
|
|
16
15
|
},
|
17
16
|
})
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
// So we wait a bit and if the page is still is at the top, it was likely on purpose.
|
24
|
-
setTimeout(() => {
|
25
|
-
if (window.scrollY !== 0) return;
|
26
|
-
scrollPosition.save();
|
27
|
-
}, 1000);
|
28
|
-
}, 100)
|
29
|
-
window.addEventListener("scroll", debouncedScroll)
|
30
|
-
|
31
|
-
document.addEventListener("turbo:click", scrollPosition.reset)
|
32
|
-
document.addEventListener("turbo:before-visit", scrollPosition.restore)
|
33
|
-
document.addEventListener("turbo:load", scrollPosition.restore)
|
34
|
-
document.addEventListener("DOMContentLoaded", scrollPosition.restore)
|
35
|
-
document.addEventListener("turbo:frame-load", scrollPosition.restore)
|
18
|
+
document.addEventListener("turbo:load", () => {
|
19
|
+
scrollPosition.restore()
|
20
|
+
scrollPosition.remove()
|
21
|
+
})
|
36
22
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import debounce from "debounce"
|
2
|
+
import scrollPosition from "./hotwire-livereload-scroll-position"
|
2
3
|
|
3
4
|
export default debounce(({force_reload}) => {
|
4
5
|
const onErrorPage = document.title === "Action Controller: Exception caught"
|
@@ -8,6 +9,8 @@ export default debounce(({force_reload}) => {
|
|
8
9
|
document.location.reload()
|
9
10
|
} else {
|
10
11
|
console.log("[Hotwire::Livereload] Files changed. Reloading..")
|
12
|
+
scrollPosition.save()
|
13
|
+
Turbo.cache.clear()
|
11
14
|
Turbo.visit(window.location.href, { action: 'replace' })
|
12
15
|
}
|
13
16
|
}, 300)
|
@@ -2,7 +2,7 @@ const KEY = "hotwire-livereload-scrollPosition"
|
|
2
2
|
|
3
3
|
export function read() {
|
4
4
|
const value = localStorage.getItem(KEY)
|
5
|
-
if (!value) return
|
5
|
+
if (!value) return
|
6
6
|
return parseInt(value)
|
7
7
|
}
|
8
8
|
|
@@ -11,14 +11,17 @@ export function save() {
|
|
11
11
|
localStorage.setItem(KEY, pos.toString())
|
12
12
|
}
|
13
13
|
|
14
|
-
export function
|
15
|
-
localStorage.
|
14
|
+
export function remove() {
|
15
|
+
localStorage.removeItem(KEY)
|
16
16
|
}
|
17
17
|
|
18
18
|
export function restore() {
|
19
19
|
const value = read()
|
20
|
-
|
21
|
-
|
20
|
+
if (value) {
|
21
|
+
console.log("[Hotwire::Livereload] Restoring scroll position to", value)
|
22
|
+
window.scrollTo(0, value)
|
23
|
+
}
|
24
|
+
|
22
25
|
}
|
23
26
|
|
24
|
-
export default { read, save, restore,
|
27
|
+
export default { read, save, restore, remove }
|
@@ -15,6 +15,7 @@ module Hotwire
|
|
15
15
|
#{root}/app/channels
|
16
16
|
#{root}/app/helpers
|
17
17
|
]
|
18
|
+
config.hotwire_livereload.listen_options ||= {}
|
18
19
|
|
19
20
|
initializer "hotwire_livereload.assets" do
|
20
21
|
if Rails.application.config.respond_to?(:assets)
|
@@ -63,7 +64,7 @@ module Hotwire
|
|
63
64
|
listen_paths = options.listen_paths.map(&:to_s).uniq
|
64
65
|
force_reload_paths = options.force_reload_paths.map(&:to_s).uniq.join("|")
|
65
66
|
|
66
|
-
@listener = Listen.to(*listen_paths) do |modified, added, removed|
|
67
|
+
@listener = Listen.to(*listen_paths, **config.hotwire_livereload.listen_options) do |modified, added, removed|
|
67
68
|
unless File.exist?(DISABLE_FILE)
|
68
69
|
changed = [modified, removed, added].flatten.uniq
|
69
70
|
next unless changed.any?
|
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: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kirill Platonov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|