stimulus_reflex 3.4.2 → 3.5.0.pre0

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +587 -495
  3. data/Gemfile.lock +120 -172
  4. data/LATEST +1 -0
  5. data/README.md +10 -10
  6. data/app/channels/stimulus_reflex/channel.rb +40 -62
  7. data/lib/generators/USAGE +1 -1
  8. data/lib/generators/stimulus_reflex/{config_generator.rb → initializer_generator.rb} +3 -3
  9. data/lib/generators/stimulus_reflex/templates/app/reflexes/%file_name%_reflex.rb.tt +3 -2
  10. data/lib/generators/stimulus_reflex/templates/app/reflexes/application_reflex.rb.tt +1 -1
  11. data/lib/generators/stimulus_reflex/templates/config/initializers/stimulus_reflex.rb +6 -1
  12. data/lib/stimulus_reflex/broadcasters/broadcaster.rb +7 -4
  13. data/lib/stimulus_reflex/broadcasters/page_broadcaster.rb +2 -2
  14. data/lib/stimulus_reflex/broadcasters/selector_broadcaster.rb +12 -5
  15. data/lib/stimulus_reflex/cable_ready_channels.rb +6 -2
  16. data/lib/stimulus_reflex/callbacks.rb +55 -5
  17. data/lib/stimulus_reflex/concern_enhancer.rb +37 -0
  18. data/lib/stimulus_reflex/configuration.rb +2 -1
  19. data/lib/stimulus_reflex/element.rb +31 -7
  20. data/lib/stimulus_reflex/policies/reflex_invocation_policy.rb +28 -0
  21. data/lib/stimulus_reflex/reflex.rb +35 -20
  22. data/lib/stimulus_reflex/reflex_data.rb +79 -0
  23. data/lib/stimulus_reflex/reflex_factory.rb +23 -54
  24. data/lib/stimulus_reflex/request_parameters.rb +19 -0
  25. data/lib/stimulus_reflex/{logger.rb → utils/logger.rb} +0 -2
  26. data/lib/stimulus_reflex/{sanity_checker.rb → utils/sanity_checker.rb} +58 -10
  27. data/lib/stimulus_reflex/version.rb +1 -1
  28. data/lib/stimulus_reflex.rb +8 -2
  29. data/lib/tasks/stimulus_reflex/install.rake +6 -4
  30. data/package.json +6 -5
  31. data/stimulus_reflex.gemspec +5 -5
  32. data/test/broadcasters/broadcaster_test_case.rb +1 -1
  33. data/test/broadcasters/nothing_broadcaster_test.rb +5 -3
  34. data/test/broadcasters/page_broadcaster_test.rb +8 -4
  35. data/test/broadcasters/selector_broadcaster_test.rb +171 -55
  36. data/test/callbacks_test.rb +652 -0
  37. data/test/concern_enhancer_test.rb +54 -0
  38. data/test/element_test.rb +181 -0
  39. data/test/reflex_test.rb +1 -1
  40. data/test/test_helper.rb +4 -34
  41. data/test/tmp/app/reflexes/application_reflex.rb +12 -0
  42. data/test/tmp/app/reflexes/user_reflex.rb +44 -0
  43. data/yarn.lock +1138 -919
  44. metadata +36 -23
  45. data/test/reflex_factory_test.rb +0 -79
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stimulus_reflex (3.4.2)
5
- cable_ready (~> 4.5)
4
+ stimulus_reflex (3.5.0.pre0)
5
+ cable_ready (= 5.0.0.pre0)
6
6
  nokogiri
7
7
  rack
8
8
  rails (>= 5.2)
@@ -11,221 +11,169 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- actioncable (7.1.3.2)
15
- actionpack (= 7.1.3.2)
16
- activesupport (= 7.1.3.2)
14
+ actioncable (6.1.3.2)
15
+ actionpack (= 6.1.3.2)
16
+ activesupport (= 6.1.3.2)
17
17
  nio4r (~> 2.0)
18
18
  websocket-driver (>= 0.6.1)
19
- zeitwerk (~> 2.6)
20
- actionmailbox (7.1.3.2)
21
- actionpack (= 7.1.3.2)
22
- activejob (= 7.1.3.2)
23
- activerecord (= 7.1.3.2)
24
- activestorage (= 7.1.3.2)
25
- activesupport (= 7.1.3.2)
19
+ actionmailbox (6.1.3.2)
20
+ actionpack (= 6.1.3.2)
21
+ activejob (= 6.1.3.2)
22
+ activerecord (= 6.1.3.2)
23
+ activestorage (= 6.1.3.2)
24
+ activesupport (= 6.1.3.2)
26
25
  mail (>= 2.7.1)
27
- net-imap
28
- net-pop
29
- net-smtp
30
- actionmailer (7.1.3.2)
31
- actionpack (= 7.1.3.2)
32
- actionview (= 7.1.3.2)
33
- activejob (= 7.1.3.2)
34
- activesupport (= 7.1.3.2)
26
+ actionmailer (6.1.3.2)
27
+ actionpack (= 6.1.3.2)
28
+ actionview (= 6.1.3.2)
29
+ activejob (= 6.1.3.2)
30
+ activesupport (= 6.1.3.2)
35
31
  mail (~> 2.5, >= 2.5.4)
36
- net-imap
37
- net-pop
38
- net-smtp
39
- rails-dom-testing (~> 2.2)
40
- actionpack (7.1.3.2)
41
- actionview (= 7.1.3.2)
42
- activesupport (= 7.1.3.2)
43
- nokogiri (>= 1.8.5)
44
- racc
45
- rack (>= 2.2.4)
46
- rack-session (>= 1.0.1)
32
+ rails-dom-testing (~> 2.0)
33
+ actionpack (6.1.3.2)
34
+ actionview (= 6.1.3.2)
35
+ activesupport (= 6.1.3.2)
36
+ rack (~> 2.0, >= 2.0.9)
47
37
  rack-test (>= 0.6.3)
48
- rails-dom-testing (~> 2.2)
49
- rails-html-sanitizer (~> 1.6)
50
- actiontext (7.1.3.2)
51
- actionpack (= 7.1.3.2)
52
- activerecord (= 7.1.3.2)
53
- activestorage (= 7.1.3.2)
54
- activesupport (= 7.1.3.2)
55
- globalid (>= 0.6.0)
38
+ rails-dom-testing (~> 2.0)
39
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
40
+ actiontext (6.1.3.2)
41
+ actionpack (= 6.1.3.2)
42
+ activerecord (= 6.1.3.2)
43
+ activestorage (= 6.1.3.2)
44
+ activesupport (= 6.1.3.2)
56
45
  nokogiri (>= 1.8.5)
57
- actionview (7.1.3.2)
58
- activesupport (= 7.1.3.2)
46
+ actionview (6.1.3.2)
47
+ activesupport (= 6.1.3.2)
59
48
  builder (~> 3.1)
60
- erubi (~> 1.11)
61
- rails-dom-testing (~> 2.2)
62
- rails-html-sanitizer (~> 1.6)
63
- activejob (7.1.3.2)
64
- activesupport (= 7.1.3.2)
49
+ erubi (~> 1.4)
50
+ rails-dom-testing (~> 2.0)
51
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
52
+ activejob (6.1.3.2)
53
+ activesupport (= 6.1.3.2)
65
54
  globalid (>= 0.3.6)
66
- activemodel (7.1.3.2)
67
- activesupport (= 7.1.3.2)
68
- activerecord (7.1.3.2)
69
- activemodel (= 7.1.3.2)
70
- activesupport (= 7.1.3.2)
71
- timeout (>= 0.4.0)
72
- activestorage (7.1.3.2)
73
- actionpack (= 7.1.3.2)
74
- activejob (= 7.1.3.2)
75
- activerecord (= 7.1.3.2)
76
- activesupport (= 7.1.3.2)
77
- marcel (~> 1.0)
78
- activesupport (7.1.3.2)
79
- base64
80
- bigdecimal
55
+ activemodel (6.1.3.2)
56
+ activesupport (= 6.1.3.2)
57
+ activerecord (6.1.3.2)
58
+ activemodel (= 6.1.3.2)
59
+ activesupport (= 6.1.3.2)
60
+ activestorage (6.1.3.2)
61
+ actionpack (= 6.1.3.2)
62
+ activejob (= 6.1.3.2)
63
+ activerecord (= 6.1.3.2)
64
+ activesupport (= 6.1.3.2)
65
+ marcel (~> 1.0.0)
66
+ mini_mime (~> 1.0.2)
67
+ activesupport (6.1.3.2)
81
68
  concurrent-ruby (~> 1.0, >= 1.0.2)
82
- connection_pool (>= 2.2.5)
83
- drb
84
69
  i18n (>= 1.6, < 2)
85
70
  minitest (>= 5.1)
86
- mutex_m
87
71
  tzinfo (~> 2.0)
72
+ zeitwerk (~> 2.3)
88
73
  ast (2.4.2)
89
- base64 (0.2.0)
90
- bigdecimal (3.1.6)
91
74
  builder (3.2.4)
92
- cable_ready (4.5.0)
75
+ cable_ready (5.0.0.pre0)
93
76
  rails (>= 5.2)
94
77
  thread-local (>= 1.1.0)
95
78
  coderay (1.1.3)
96
- concurrent-ruby (1.2.3)
97
- connection_pool (2.4.1)
79
+ concurrent-ruby (1.1.8)
98
80
  crass (1.0.6)
99
- date (3.3.4)
100
- drb (2.2.1)
101
- erubi (1.12.0)
102
- globalid (1.2.1)
103
- activesupport (>= 6.1)
104
- i18n (1.14.4)
81
+ erubi (1.10.0)
82
+ globalid (0.4.2)
83
+ activesupport (>= 4.2.0)
84
+ i18n (1.8.10)
105
85
  concurrent-ruby (~> 1.0)
106
- io-console (0.7.2)
107
- irb (1.12.0)
108
- rdoc
109
- reline (>= 0.4.2)
110
- loofah (2.22.0)
86
+ loofah (2.9.1)
111
87
  crass (~> 1.0.2)
112
- nokogiri (>= 1.12.0)
113
- mail (2.8.1)
88
+ nokogiri (>= 1.5.9)
89
+ mail (2.7.1)
114
90
  mini_mime (>= 0.1.1)
115
- net-imap
116
- net-pop
117
- net-smtp
118
- marcel (1.0.4)
91
+ marcel (1.0.1)
119
92
  method_source (0.9.2)
120
- mini_mime (1.1.5)
121
- mini_portile2 (2.8.5)
122
- minitest (5.22.2)
123
- mutex_m (0.2.0)
124
- net-imap (0.4.10)
125
- date
126
- net-protocol
127
- net-pop (0.1.2)
128
- net-protocol
129
- net-protocol (0.2.2)
130
- timeout
131
- net-smtp (0.4.0.1)
132
- net-protocol
133
- nio4r (2.7.0)
134
- nokogiri (1.16.2)
135
- mini_portile2 (~> 2.8.2)
93
+ mini_mime (1.0.3)
94
+ minitest (5.14.4)
95
+ nio4r (2.5.7)
96
+ nokogiri (1.11.5-arm64-darwin)
136
97
  racc (~> 1.4)
137
98
  parallel (1.20.1)
138
- parser (3.0.0.0)
99
+ parser (3.0.1.1)
139
100
  ast (~> 2.4.1)
140
101
  pry (0.12.2)
141
102
  coderay (~> 1.1.0)
142
103
  method_source (~> 0.9.0)
143
104
  pry-nav (0.3.0)
144
105
  pry (>= 0.9.10, < 0.13.0)
145
- psych (5.1.2)
146
- stringio
147
- racc (1.7.3)
148
- rack (3.0.9.1)
149
- rack-session (2.0.0)
150
- rack (>= 3.0.0)
151
- rack-test (2.1.0)
152
- rack (>= 1.3)
153
- rackup (2.1.0)
154
- rack (>= 3)
155
- webrick (~> 1.8)
156
- rails (7.1.3.2)
157
- actioncable (= 7.1.3.2)
158
- actionmailbox (= 7.1.3.2)
159
- actionmailer (= 7.1.3.2)
160
- actionpack (= 7.1.3.2)
161
- actiontext (= 7.1.3.2)
162
- actionview (= 7.1.3.2)
163
- activejob (= 7.1.3.2)
164
- activemodel (= 7.1.3.2)
165
- activerecord (= 7.1.3.2)
166
- activestorage (= 7.1.3.2)
167
- activesupport (= 7.1.3.2)
106
+ racc (1.5.2)
107
+ rack (2.2.3)
108
+ rack-test (1.1.0)
109
+ rack (>= 1.0, < 3)
110
+ rails (6.1.3.2)
111
+ actioncable (= 6.1.3.2)
112
+ actionmailbox (= 6.1.3.2)
113
+ actionmailer (= 6.1.3.2)
114
+ actionpack (= 6.1.3.2)
115
+ actiontext (= 6.1.3.2)
116
+ actionview (= 6.1.3.2)
117
+ activejob (= 6.1.3.2)
118
+ activemodel (= 6.1.3.2)
119
+ activerecord (= 6.1.3.2)
120
+ activestorage (= 6.1.3.2)
121
+ activesupport (= 6.1.3.2)
168
122
  bundler (>= 1.15.0)
169
- railties (= 7.1.3.2)
170
- rails-dom-testing (2.2.0)
171
- activesupport (>= 5.0.0)
172
- minitest
123
+ railties (= 6.1.3.2)
124
+ sprockets-rails (>= 2.0.0)
125
+ rails-dom-testing (2.0.3)
126
+ activesupport (>= 4.2.0)
173
127
  nokogiri (>= 1.6)
174
- rails-html-sanitizer (1.6.0)
175
- loofah (~> 2.21)
176
- nokogiri (~> 1.14)
177
- railties (7.1.3.2)
178
- actionpack (= 7.1.3.2)
179
- activesupport (= 7.1.3.2)
180
- irb
181
- rackup (>= 1.0.0)
182
- rake (>= 12.2)
183
- thor (~> 1.0, >= 1.2.2)
184
- zeitwerk (~> 2.6)
128
+ rails-html-sanitizer (1.3.0)
129
+ loofah (~> 2.3)
130
+ railties (6.1.3.2)
131
+ actionpack (= 6.1.3.2)
132
+ activesupport (= 6.1.3.2)
133
+ method_source
134
+ rake (>= 0.8.7)
135
+ thor (~> 1.0)
185
136
  rainbow (3.0.0)
186
137
  rake (13.0.3)
187
- rdoc (6.6.2)
188
- psych (>= 4.0.0)
189
- redis (5.1.0)
190
- redis-client (>= 0.17.0)
191
- redis-client (0.21.0)
192
- connection_pool
193
- regexp_parser (2.0.3)
194
- reline (0.4.3)
195
- io-console (~> 0.5)
196
- rexml (3.2.4)
197
- rubocop (1.7.0)
138
+ redis (4.2.5)
139
+ regexp_parser (2.1.1)
140
+ rexml (3.2.5)
141
+ rubocop (1.14.0)
198
142
  parallel (~> 1.10)
199
- parser (>= 2.7.1.5)
143
+ parser (>= 3.0.0.0)
200
144
  rainbow (>= 2.2.2, < 4.0)
201
145
  regexp_parser (>= 1.8, < 3.0)
202
146
  rexml
203
- rubocop-ast (>= 1.2.0, < 2.0)
147
+ rubocop-ast (>= 1.5.0, < 2.0)
204
148
  ruby-progressbar (~> 1.7)
205
- unicode-display_width (>= 1.4.0, < 2.0)
206
- rubocop-ast (1.4.1)
207
- parser (>= 2.7.1.5)
208
- rubocop-performance (1.9.2)
209
- rubocop (>= 0.90.0, < 2.0)
149
+ unicode-display_width (>= 1.4.0, < 3.0)
150
+ rubocop-ast (1.5.0)
151
+ parser (>= 3.0.1.1)
152
+ rubocop-performance (1.11.2)
153
+ rubocop (>= 1.7.0, < 2.0)
210
154
  rubocop-ast (>= 0.4.0)
211
155
  ruby-progressbar (1.11.0)
212
- standard (0.11.0)
213
- rubocop (= 1.7.0)
214
- rubocop-performance (= 1.9.2)
156
+ sprockets (4.0.2)
157
+ concurrent-ruby (~> 1.0)
158
+ rack (> 1, < 3)
159
+ sprockets-rails (3.2.2)
160
+ actionpack (>= 4.0)
161
+ activesupport (>= 4.0)
162
+ sprockets (>= 3.0.0)
163
+ standard (1.1.1)
164
+ rubocop (= 1.14.0)
165
+ rubocop-performance (= 1.11.2)
215
166
  standardrb (1.0.0)
216
167
  standard
217
- stringio (3.1.0)
218
- thor (1.3.1)
168
+ thor (1.1.0)
219
169
  thread-local (1.1.0)
220
- timeout (0.4.1)
221
- tzinfo (2.0.6)
170
+ tzinfo (2.0.4)
222
171
  concurrent-ruby (~> 1.0)
223
- unicode-display_width (1.7.0)
224
- webrick (1.8.1)
225
- websocket-driver (0.7.6)
172
+ unicode-display_width (2.0.0)
173
+ websocket-driver (0.7.3)
226
174
  websocket-extensions (>= 0.1.0)
227
175
  websocket-extensions (0.1.5)
228
- zeitwerk (2.6.13)
176
+ zeitwerk (2.4.2)
229
177
 
230
178
  PLATFORMS
231
179
  ruby
@@ -235,8 +183,8 @@ DEPENDENCIES
235
183
  pry
236
184
  pry-nav
237
185
  rake
238
- standardrb
186
+ standardrb (~> 1.0)
239
187
  stimulus_reflex!
240
188
 
241
189
  BUNDLED WITH
242
- 2.2.33
190
+ 2.2.4
data/LATEST ADDED
@@ -0,0 +1 @@
1
+ 3.4.1
data/README.md CHANGED
@@ -7,11 +7,11 @@
7
7
  <a href="https://www.npmjs.com/package/stimulus_reflex">
8
8
  <img alt="downloads" src="https://img.shields.io/npm/dm/stimulus_reflex.svg?color=blue" target="_blank" />
9
9
  </a>
10
- <a href="https://github.com/hopsoft/stimulus_reflex/blob/master/LICENSE">
10
+ <a href="https://github.com/stimulusreflex/stimulus_reflex/blob/master/LICENSE">
11
11
  <img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-brightgreen.svg" target="_blank" />
12
12
  </a>
13
13
  <a href="http://blog.codinghorror.com/the-best-code-is-no-code-at-all/" target="_blank">
14
- <img alt="Lines of Code" src="https://img.shields.io/badge/lines_of_code-1726-brightgreen.svg?style=flat" />
14
+ <img alt="Lines of Code" src="https://img.shields.io/badge/lines_of_code-2190-brightgreen.svg?style=flat" />
15
15
  </a>
16
16
  <a href="https://docs.stimulusreflex.com/" target="_blank">
17
17
  <img alt="Documentation" src="https://img.shields.io/badge/documentation-yes-brightgreen.svg" />
@@ -30,14 +30,14 @@
30
30
  <a href="https://www.codacy.com/manual/hopsoft/stimulus_reflex/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=hopsoft/stimulus_reflex&amp;utm_campaign=Badge_Grade" target="_blank">
31
31
  <img alt="Code Quality" src="https://app.codacy.com/project/badge/Grade/d1d72a7060f5467b8696884351cf477f"/>
32
32
  </a>
33
- <a target="_blank" rel="noopener noreferrer" href="https://github.com/hopsoft/stimulus_reflex/workflows/Prettier-Standard/badge.svg">
34
- <img src="https://github.com/hopsoft/stimulus_reflex/workflows/Prettier-Standard/badge.svg" alt="Prettier-Standard" style="max-width:100%;">
33
+ <a target="_blank" rel="noopener noreferrer" href="https://github.com/stimulusreflex/stimulus_reflex/workflows/Prettier-Standard/badge.svg">
34
+ <img src="https://github.com/stimulusreflex/stimulus_reflex/workflows/Prettier-Standard/badge.svg" alt="Prettier-Standard" style="max-width:100%;">
35
35
  </a>
36
- <a target="_blank" rel="noopener noreferrer" href="https://github.com/hopsoft/stimulus_reflex/workflows/StandardRB/badge.svg">
37
- <img src="https://github.com/hopsoft/stimulus_reflex/workflows/StandardRB/badge.svg" alt="StandardRB" style="max-width:100%;">
36
+ <a target="_blank" rel="noopener noreferrer" href="https://github.com/stimulusreflex/stimulus_reflex/workflows/StandardRB/badge.svg">
37
+ <img src="https://github.com/stimulusreflex/stimulus_reflex/workflows/StandardRB/badge.svg" alt="StandardRB" style="max-width:100%;">
38
38
  </a>
39
- <a target="_blank" rel="noopener noreferrer" href="https://github.com/hopsoft/stimulus_reflex/workflows/Tests/badge.svg">
40
- <img src="https://github.com/hopsoft/stimulus_reflex/workflows/Tests/badge.svg" alt="Tests">
39
+ <a target="_blank" rel="noopener noreferrer" href="https://github.com/stimulusreflex/stimulus_reflex/workflows/Tests/badge.svg">
40
+ <img src="https://github.com/stimulusreflex/stimulus_reflex/workflows/Tests/badge.svg" alt="Tests">
41
41
  </a>
42
42
  </p>
43
43
  </p>
@@ -75,7 +75,7 @@ This project strives to live up to the vision outlined in [The Rails Doctrine](h
75
75
 
76
76
  ## 👩‍👩‍👧 Discord Community
77
77
 
78
- Please join over 1000 of us on [Discord](https://discord.gg/XveN625) for support getting started, as well as active discussions around Rails, StimulusJS and CableReady.
78
+ Please join over 1000 of us on [Discord](https://discord.gg/stimulus-reflex) for support getting started, as well as active discussions around Rails, StimulusJS and CableReady.
79
79
 
80
80
  ![](https://img.shields.io/discord/629472241427415060)
81
81
 
@@ -104,7 +104,7 @@ and [Prettier-Standard](https://github.com/sheerun/prettier-standard) for JavaSc
104
104
 
105
105
  Please run `./bin/standardize` prior to submitting pull requests.
106
106
 
107
- View the [wiki](https://github.com/hopsoft/stimulus_reflex/wiki/Editor-Configuration) to see recommendations for configuring your editor to work best with the project.
107
+ View the [wiki](https://github.com/stimulusreflex/stimulus_reflex/wiki/Editor-Configuration) to see recommendations for configuring your editor to work best with the project.
108
108
 
109
109
  ## 📦 Releasing
110
110
 
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class StimulusReflex::Channel < StimulusReflex.configuration.parent_channel.constantize
4
+ attr_reader :reflex_data
5
+
4
6
  def stream_name
5
7
  ids = connection.identifiers.map { |identifier| send(identifier).try(:id) || send(identifier) }
6
8
  [
@@ -11,49 +13,25 @@ class StimulusReflex::Channel < StimulusReflex.configuration.parent_channel.cons
11
13
 
12
14
  def subscribed
13
15
  super
14
- fix_environment!
15
16
  stream_from stream_name
16
17
  end
17
18
 
18
19
  def receive(data)
19
- url = data["url"].to_s
20
- selectors = (data["selectors"] || []).select(&:present?)
21
- selectors = data["selectors"] = ["body"] if selectors.blank?
22
- target = data["target"].to_s
23
- factory = StimulusReflex::ReflexFactory.new(target)
24
- reflex_class = factory.call
25
- method_name = factory.method_name
26
- arguments = (data["args"] || []).map { |arg| object_with_indifferent_access arg }
27
- element = StimulusReflex::Element.new(data)
28
- permanent_attribute_name = data["permanentAttributeName"]
29
- form_data = Rack::Utils.parse_nested_query(data["formData"])
30
- params = form_data.deep_merge(data["params"] || {})
31
-
20
+ @reflex_data = StimulusReflex::ReflexData.new(data)
32
21
  begin
33
22
  begin
34
- reflex = reflex_class.new(self,
35
- url: url,
36
- element: element,
37
- selectors: selectors,
38
- method_name: method_name,
39
- params: params,
40
- client_attributes: {
41
- reflex_id: data["reflexId"],
42
- xpath_controller: data["xpathController"],
43
- xpath_element: data["xpathElement"],
44
- reflex_controller: data["reflexController"],
45
- permanent_attribute_name: permanent_attribute_name
46
- })
47
- delegate_call_to_reflex reflex, method_name, arguments
48
- rescue => invoke_error
49
- message = exception_message_with_backtrace(invoke_error)
50
- body = "Reflex #{target} failed: #{message} [#{url}]"
23
+ reflex = StimulusReflex::ReflexFactory.create_reflex_from_data(self, @reflex_data)
24
+ delegate_call_to_reflex reflex
25
+ rescue => exception
26
+ error = exception_with_backtrace(exception)
27
+ error_message = "\e[31mReflex #{reflex_data.target} failed: #{error[:message]} [#{reflex_data.url}]\e[0m\n#{error[:stack]}"
51
28
 
52
29
  if reflex
53
- reflex.rescue_with_handler(invoke_error)
54
- reflex.broadcast_message subject: "error", body: body, data: data, error: invoke_error
30
+ reflex.rescue_with_handler(exception)
31
+ puts error_message
32
+ reflex.broadcast_message subject: "error", data: data, error: exception
55
33
  else
56
- puts "\e[31m#{body}\e[0m"
34
+ puts error_message
57
35
 
58
36
  if body.to_s.include? "No route matches"
59
37
  initializer_path = Rails.root.join("config", "initializers", "stimulus_reflex.rb")
@@ -83,39 +61,35 @@ class StimulusReflex::Channel < StimulusReflex.configuration.parent_channel.cons
83
61
  reflex.broadcast_message subject: "halted", data: data
84
62
  else
85
63
  begin
86
- reflex.broadcast(selectors, data)
87
- rescue => render_error
88
- reflex.rescue_with_handler(render_error)
89
- message = exception_message_with_backtrace(render_error)
90
- body = "Reflex failed to re-render: #{message} [#{url}]"
91
- reflex.broadcast_message subject: "error", body: body, data: data, error: render_error
92
- puts "\e[31m#{body}\e[0m"
64
+ reflex.broadcast(reflex_data.selectors, data)
65
+ rescue => exception
66
+ reflex.rescue_with_handler(exception)
67
+ error = exception_with_backtrace(exception)
68
+ reflex.broadcast_message subject: "error", data: data, error: exception
69
+ puts "\e[31mReflex failed to re-render: #{error[:message]} [#{reflex_data.url}]\e[0m\n#{error[:stack]}"
93
70
  end
94
71
  end
95
72
  ensure
96
73
  if reflex
97
74
  commit_session(reflex)
98
- reflex.logger.print
75
+ report_failed_basic_auth(reflex) if reflex.controller?
76
+ reflex.logger&.print
99
77
  end
100
78
  end
101
79
  end
102
80
 
103
81
  private
104
82
 
105
- def object_with_indifferent_access(object)
106
- return object.with_indifferent_access if object.respond_to?(:with_indifferent_access)
107
- object.map! { |obj| object_with_indifferent_access obj } if object.is_a?(Array)
108
- object
109
- end
110
-
111
- def delegate_call_to_reflex(reflex, method_name, arguments = [])
83
+ def delegate_call_to_reflex(reflex)
84
+ method_name = reflex_data.method_name
85
+ arguments = reflex_data.arguments
112
86
  method = reflex.method(method_name)
113
- required_params = method.parameters.select { |(kind, _)| kind == :req }
114
- optional_params = method.parameters.select { |(kind, _)| kind == :opt }
115
87
 
116
- if arguments.size == 0 && required_params.size == 0
88
+ policy = StimulusReflex::ReflexMethodInvocationPolicy.new(method, arguments)
89
+
90
+ if policy.no_arguments?
117
91
  reflex.process(method_name)
118
- elsif arguments.size >= required_params.size && arguments.size <= required_params.size + optional_params.size
92
+ elsif policy.arguments?
119
93
  reflex.process(method_name, *arguments)
120
94
  else
121
95
  raise ArgumentError.new("wrong number of arguments (given #{arguments.inspect}, expected #{required_params.inspect}, optional #{optional_params.inspect})")
@@ -125,18 +99,22 @@ class StimulusReflex::Channel < StimulusReflex.configuration.parent_channel.cons
125
99
  def commit_session(reflex)
126
100
  store = reflex.request.session.instance_variable_get("@by")
127
101
  store.commit_session reflex.request, reflex.controller.response
128
- rescue => e
129
- message = "Failed to commit session! #{exception_message_with_backtrace(e)}"
130
- puts "\e[31m#{message}\e[0m"
102
+ rescue => exception
103
+ error = exception_with_backtrace(exception)
104
+ puts "\e[31mFailed to commit session! #{error[:message]}\e[0m\n#{error[:backtrace]}"
131
105
  end
132
106
 
133
- def exception_message_with_backtrace(exception)
134
- "#{exception}\n#{exception.backtrace.first}"
107
+ def report_failed_basic_auth(reflex)
108
+ if reflex.controller.response.status == 401
109
+ puts "\e[31mReflex failed to process controller action \"#{reflex.controller.class}##{reflex.controller.action_name}\" due to HTTP basic auth. Consider adding \"unless: -> { @stimulus_reflex }\" to the before_action or method responible for authentication.\e[0m"
110
+ end
135
111
  end
136
112
 
137
- def fix_environment!
138
- ([ApplicationController] + ApplicationController.descendants).each do |controller|
139
- controller.renderer.instance_variable_set(:@env, connection.env.merge(controller.renderer.instance_variable_get(:@env)))
140
- end
113
+ def exception_with_backtrace(exception)
114
+ {
115
+ message: exception.to_s,
116
+ backtrace: exception.backtrace.first,
117
+ stack: exception.backtrace.join("\n")
118
+ }
141
119
  end
142
120
  end
data/lib/generators/USAGE CHANGED
@@ -11,4 +11,4 @@ Example:
11
11
  app/reflexes/application_reflex.rb
12
12
  app/reflexes/user_reflex.rb
13
13
 
14
- Don't forget to setup the application: https://docs.stimulusreflex.com/setup
14
+ Don't forget to setup the application: https://docs.stimulusreflex.com/hello-world/setup
@@ -3,11 +3,11 @@
3
3
  require "rails/generators"
4
4
 
5
5
  module StimulusReflex
6
- class ConfigGenerator < Rails::Generators::Base
7
- desc "Creates an StimulusReflex configuration file in config/initializers"
6
+ class InitializerGenerator < Rails::Generators::Base
7
+ desc "Creates a StimulusReflex initializer in config/initializers"
8
8
  source_root File.expand_path("templates", __dir__)
9
9
 
10
- def copy_config_file
10
+ def copy_initializer_file
11
11
  copy_file "config/initializers/stimulus_reflex.rb"
12
12
  end
13
13
  end
@@ -17,12 +17,13 @@ class <%= class_name %>Reflex < ApplicationReflex
17
17
  # - unsigned - use an unsigned Global ID to map dataset attribute to a model eg. element.unsigned[:foo]
18
18
  # - cable_ready - a special cable_ready that can broadcast to the current visitor (no brackets needed)
19
19
  # - reflex_id - a UUIDv4 that uniquely identies each Reflex
20
+ # - tab_id - a UUIDv4 that uniquely identifies the browser tab
20
21
  #
21
22
  # Example:
22
23
  #
23
24
  # before_reflex do
24
25
  # # throw :abort # this will prevent the Reflex from continuing
25
- # # learn more about callbacks at https://docs.stimulusreflex.com/lifecycle
26
+ # # learn more about callbacks at https://docs.stimulusreflex.com/rtfm/lifecycle
26
27
  # end
27
28
  #
28
29
  # def example(argument=true)
@@ -30,7 +31,7 @@ class <%= class_name %>Reflex < ApplicationReflex
30
31
  # # Any declared instance variables will be made available to the Rails controller and view.
31
32
  # end
32
33
  #
33
- # Learn more at: https://docs.stimulusreflex.com/reflexes#reflex-classes
34
+ # Learn more at: https://docs.stimulusreflex.com/rtfm/reflex-classes
34
35
 
35
36
  <% actions.each do |action| -%>
36
37
  def <%= action %>
@@ -8,5 +8,5 @@ class ApplicationReflex < StimulusReflex::Reflex
8
8
  # # If your ActionCable connection is: `identified_by :current_user`
9
9
  # delegate :current_user, to: :connection
10
10
  #
11
- # Learn more at: https://docs.stimulusreflex.com/reflexes#reflex-classes
11
+ # Learn more at: https://docs.stimulusreflex.com/rtfm/reflex-classes
12
12
  end
@@ -6,6 +6,11 @@ StimulusReflex.configure do |config|
6
6
 
7
7
  # config.on_failed_sanity_checks = :exit
8
8
 
9
+ # Enable/disable exiting / warning when there's a new StimulusReflex release
10
+ # `:exit` or `:warn` or `:ignore`
11
+
12
+ # config.on_new_version_available = :ignore
13
+
9
14
  # Override the parent class that the StimulusReflex ActionCable channel inherits from
10
15
 
11
16
  # config.parent_channel = "ApplicationCable::Channel"
@@ -15,7 +20,7 @@ StimulusReflex.configure do |config|
15
20
  # Available colors: red, green, yellow, blue, magenta, cyan, white
16
21
  # You can also use attributes from your ActionCable Connection's identifiers that resolve to valid ActiveRecord models
17
22
  # eg. if your connection is `identified_by :current_user` and your User model has an email attribute, you can access r.email (it will display `-` if the user isn't logged in)
18
- # Learn more at: https://docs.stimulusreflex.com/troubleshooting#stimulusreflex-logging
23
+ # Learn more at: https://docs.stimulusreflex.com/appendices/troubleshooting#stimulusreflex-logging
19
24
 
20
25
  # config.logging = proc { "[#{session_id}] #{operation_counter.magenta} #{reflex_info.green} -> #{selector.cyan} via #{mode} Morph (#{operation.yellow})" }
21
26