turbo-rails 0.7.10 → 0.7.14

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: 41cfe42f850783258d151d4d6ed872633cbb2a7f2ba3c20ad434af326c65dd15
4
- data.tar.gz: cff176c51977f6c1ba19c31eb36d97ea1958394e7fcde6a489f0d53ec9a74b3b
3
+ metadata.gz: b6feabeb5b9eef2fcc9032b12f9c067a2ec66408b235a02683540d182276d454
4
+ data.tar.gz: 4f20ead78ccf0a8005213c864a4e3df0d82081fac933c435d367997eaf7c7d27
5
5
  SHA512:
6
- metadata.gz: 6a8c79d8a32ce7a36aa3f289cd222600d3040bdd5cebaca4836c2fb659ac6e6d847ab02299290429b434a530b7397d9580628edaaba13b088e59c641174ab994
7
- data.tar.gz: 58eea1099a495e6987a8197630b9c9e6386af8e2016d0cceb92555ca2ce5fba19e6f32eba2244a14751ef9879b92c6793fdc1e1dd6e0b639678ed4c757680a47
6
+ metadata.gz: '015978592c5ca79dfada00ab3fa9ebceeaeb77b180af317fcf50cf29263571863e753499cab48f4baec165e7a37d438acd93b44720e206a654e8bdb644f4bd63'
7
+ data.tar.gz: 2c7d3f5a342f8fd9343e494b55079628fc4e4f04e4a6728c2ef0a26e366c1c2802549da294b6025dede18827421ab1b2ac1c6f9464c0a260829a8c03c69f75b6
data/README.md CHANGED
@@ -50,7 +50,7 @@ The JavaScript for Turbo can either be run through the asset pipeline, which is
50
50
 
51
51
  Running `turbo:install` will install through NPM if Webpacker is installed in the application. Otherwise the asset pipeline version is used. To use the asset pipeline version, you must have `importmap-rails` installed first and listed higher in the Gemfile.
52
52
 
53
- If you're using Webpack and need to use the cable consumer, you can import [`cable`](https://github.com/hotwired/turbo-rails/blob/main/app/javascript/turbo/cable.js) (`import { cable } from "@hotwired/turbo-rails"`), but ensure that your application actually *uses* the members it `import`s when using this style (see [turbo-rails#48](https://github.com/hotwired/turbo-rails/issues/48)).
53
+ If you're using node and need to use the cable consumer, you can import [`cable`](https://github.com/hotwired/turbo-rails/blob/main/app/javascript/turbo/cable.js) (`import { cable } from "@hotwired/turbo-rails"`), but ensure that your application actually *uses* the members it `import`s when using this style (see [turbo-rails#48](https://github.com/hotwired/turbo-rails/issues/48)).
54
54
 
55
55
  The `Turbo` instance is automatically assigned to `window.Turbo` upon import:
56
56
 
@@ -71,10 +71,7 @@ Turbo can coexist with Rails UJS, but you need to take a series of upgrade steps
71
71
 
72
72
  ## Development
73
73
 
74
- * To run the Rails tests: `bundle exec rake`.
75
- * To install dependencies: `bundle install`
76
- * To prepare the test database: `cd test/dummy; RAILS_ENV=test ./bin/rails db:migrate`
77
- * To compile the JavaScript for the asset pipeline: `yarn build`
74
+ Run the tests with `./bin/test`.
78
75
 
79
76
 
80
77
  ## License
@@ -31,6 +31,7 @@ function clickCaptured(event) {
31
31
 
32
32
  (function() {
33
33
  if ("SubmitEvent" in window) return;
34
+ if ("submitter" in Event.prototype) return;
34
35
  addEventListener("click", clickCaptured, true);
35
36
  Object.defineProperty(Event.prototype, "submitter", {
36
37
  get() {
@@ -226,11 +227,11 @@ class FetchResponse {
226
227
  return this.header("Content-Type");
227
228
  }
228
229
  get responseText() {
229
- return this.response.text();
230
+ return this.response.clone().text();
230
231
  }
231
232
  get responseHTML() {
232
233
  if (this.isHTML) {
233
- return this.response.text();
234
+ return this.response.clone().text();
234
235
  } else {
235
236
  return Promise.resolve(undefined);
236
237
  }
@@ -326,7 +327,7 @@ function fetchMethodFromString(method) {
326
327
  }
327
328
 
328
329
  class FetchRequest {
329
- constructor(delegate, method, location, body = new URLSearchParams) {
330
+ constructor(delegate, method, location, body = new URLSearchParams, target = null) {
330
331
  this.abortController = new AbortController;
331
332
  this.resolveRequestPromise = value => {};
332
333
  this.delegate = delegate;
@@ -338,6 +339,7 @@ class FetchRequest {
338
339
  this.body = body;
339
340
  this.url = location;
340
341
  }
342
+ this.target = target;
341
343
  }
342
344
  get location() {
343
345
  return this.url;
@@ -375,7 +377,8 @@ class FetchRequest {
375
377
  cancelable: true,
376
378
  detail: {
377
379
  fetchResponse: fetchResponse
378
- }
380
+ },
381
+ target: this.target
379
382
  });
380
383
  if (event.defaultPrevented) {
381
384
  this.delegate.requestPreventedHandlingResponse(this, fetchResponse);
@@ -417,7 +420,8 @@ class FetchRequest {
417
420
  fetchOptions: fetchOptions,
418
421
  url: this.url.href,
419
422
  resume: this.resolveRequestPromise
420
- }
423
+ },
424
+ target: this.target
421
425
  });
422
426
  if (event.defaultPrevented) await requestInterception;
423
427
  }
@@ -538,7 +542,7 @@ class FormSubmission {
538
542
  this.formElement = formElement;
539
543
  this.submitter = submitter;
540
544
  this.formData = buildFormData(formElement, submitter);
541
- this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body);
545
+ this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body, this.formElement);
542
546
  this.mustRedirect = mustRedirect;
543
547
  }
544
548
  get method() {
@@ -1173,7 +1177,7 @@ ProgressBar.animationDuration = 300;
1173
1177
  class HeadSnapshot extends Snapshot {
1174
1178
  constructor() {
1175
1179
  super(...arguments);
1176
- this.detailsByOuterHTML = this.children.filter((element => !elementIsNoscript(element))).reduce(((result, element) => {
1180
+ this.detailsByOuterHTML = this.children.filter((element => !elementIsNoscript(element))).map((element => elementWithoutNonce(element))).reduce(((result, element) => {
1177
1181
  const {outerHTML: outerHTML} = element;
1178
1182
  const details = outerHTML in result ? result[outerHTML] : {
1179
1183
  type: elementType(element),
@@ -1255,6 +1259,13 @@ function elementIsMetaElementWithName(element, name) {
1255
1259
  return tagName == "meta" && element.getAttribute("name") == name;
1256
1260
  }
1257
1261
 
1262
+ function elementWithoutNonce(element) {
1263
+ if (element.hasAttribute("nonce")) {
1264
+ element.setAttribute("nonce", "");
1265
+ }
1266
+ return element;
1267
+ }
1268
+
1258
1269
  class PageSnapshot extends Snapshot {
1259
1270
  constructor(element, headSnapshot) {
1260
1271
  super(element);
@@ -1805,18 +1816,18 @@ class FrameRedirector {
1805
1816
  return this.shouldRedirect(element, submitter);
1806
1817
  }
1807
1818
  formSubmissionIntercepted(element, submitter) {
1808
- const frame = this.findFrameElement(element);
1819
+ const frame = this.findFrameElement(element, submitter);
1809
1820
  if (frame) {
1810
1821
  frame.removeAttribute("reloadable");
1811
1822
  frame.delegate.formSubmissionIntercepted(element, submitter);
1812
1823
  }
1813
1824
  }
1814
1825
  shouldRedirect(element, submitter) {
1815
- const frame = this.findFrameElement(element);
1826
+ const frame = this.findFrameElement(element, submitter);
1816
1827
  return frame ? frame != element.closest("turbo-frame") : false;
1817
1828
  }
1818
- findFrameElement(element) {
1819
- const id = element.getAttribute("data-turbo-frame");
1829
+ findFrameElement(element, submitter) {
1830
+ const id = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("data-turbo-frame")) || element.getAttribute("data-turbo-frame");
1820
1831
  if (id && id != "_top") {
1821
1832
  const frame = this.element.querySelector(`#${id}:not([disabled])`);
1822
1833
  if (frame instanceof FrameElement) {
@@ -2539,12 +2550,13 @@ class Session {
2539
2550
  });
2540
2551
  }
2541
2552
  convertLinkWithMethodClickToFormSubmission(link) {
2553
+ var _a;
2542
2554
  const linkMethod = link.getAttribute("data-turbo-method");
2543
2555
  if (linkMethod) {
2544
2556
  const form = document.createElement("form");
2545
2557
  form.method = linkMethod;
2546
2558
  form.action = link.getAttribute("href") || "undefined";
2547
- document.body.appendChild(form);
2559
+ (_a = link.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(form, link);
2548
2560
  return dispatch("submit", {
2549
2561
  cancelable: true,
2550
2562
  target: form
@@ -2896,7 +2908,7 @@ class FrameController {
2896
2908
  this.reloadable = false;
2897
2909
  this.formSubmission = new FormSubmission(this, element, submitter);
2898
2910
  if (this.formSubmission.fetchRequest.isIdempotent) {
2899
- this.navigateFrame(element, this.formSubmission.fetchRequest.url.href);
2911
+ this.navigateFrame(element, this.formSubmission.fetchRequest.url.href, submitter);
2900
2912
  } else {
2901
2913
  const {fetchRequest: fetchRequest} = this.formSubmission;
2902
2914
  this.prepareHeadersForRequest(fetchRequest.headers, fetchRequest);
@@ -2932,7 +2944,7 @@ class FrameController {
2932
2944
  frame.setAttribute("busy", "");
2933
2945
  }
2934
2946
  formSubmissionSucceededWithResponse(formSubmission, response) {
2935
- const frame = this.findFrameElement(formSubmission.formElement);
2947
+ const frame = this.findFrameElement(formSubmission.formElement, formSubmission.submitter);
2936
2948
  frame.delegate.loadResponse(response);
2937
2949
  }
2938
2950
  formSubmissionFailedWithResponse(formSubmission, fetchResponse) {
@@ -2951,7 +2963,7 @@ class FrameController {
2951
2963
  viewRenderedSnapshot(snapshot, isPreview) {}
2952
2964
  viewInvalidated() {}
2953
2965
  async visit(url) {
2954
- const request = new FetchRequest(this, FetchMethod.get, expandURL(url));
2966
+ const request = new FetchRequest(this, FetchMethod.get, expandURL(url), undefined, this.element);
2955
2967
  return new Promise((resolve => {
2956
2968
  this.resolveVisitPromise = () => {
2957
2969
  this.resolveVisitPromise = () => {};
@@ -2960,13 +2972,14 @@ class FrameController {
2960
2972
  request.perform();
2961
2973
  }));
2962
2974
  }
2963
- navigateFrame(element, url) {
2964
- const frame = this.findFrameElement(element);
2975
+ navigateFrame(element, url, submitter) {
2976
+ const frame = this.findFrameElement(element, submitter);
2977
+ frame.setAttribute("reloadable", "");
2965
2978
  frame.src = url;
2966
2979
  }
2967
- findFrameElement(element) {
2980
+ findFrameElement(element, submitter) {
2968
2981
  var _a;
2969
- const id = element.getAttribute("data-turbo-frame") || this.element.getAttribute("target");
2982
+ const id = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("data-turbo-frame")) || element.getAttribute("data-turbo-frame") || this.element.getAttribute("target");
2970
2983
  return (_a = getFrameElementById(id)) !== null && _a !== void 0 ? _a : this.element;
2971
2984
  }
2972
2985
  async extractForeignFrameElement(container) {
@@ -2987,7 +3000,7 @@ class FrameController {
2987
3000
  return new FrameElement;
2988
3001
  }
2989
3002
  shouldInterceptNavigation(element, submitter) {
2990
- const id = element.getAttribute("data-turbo-frame") || this.element.getAttribute("target");
3003
+ const id = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute("data-turbo-frame")) || element.getAttribute("data-turbo-frame") || this.element.getAttribute("target");
2991
3004
  if (!this.enabled || id == "_top") {
2992
3005
  return false;
2993
3006
  }
@@ -6,61 +6,61 @@ module Turbo::Streams::Broadcasts
6
6
  include Turbo::Streams::ActionHelper
7
7
 
8
8
  def broadcast_remove_to(*streamables, **opts)
9
- broadcast_action_to *streamables, action: :remove, **opts
9
+ broadcast_action_to(*streamables, action: :remove, **opts)
10
10
  end
11
11
 
12
12
  def broadcast_replace_to(*streamables, **opts)
13
- broadcast_action_to *streamables, action: :replace, **opts
13
+ broadcast_action_to(*streamables, action: :replace, **opts)
14
14
  end
15
15
 
16
16
  def broadcast_update_to(*streamables, **opts)
17
- broadcast_action_to *streamables, action: :update, **opts
17
+ broadcast_action_to(*streamables, action: :update, **opts)
18
18
  end
19
19
 
20
20
  def broadcast_before_to(*streamables, **opts)
21
- broadcast_action_to *streamables, action: :before, **opts
21
+ broadcast_action_to(*streamables, action: :before, **opts)
22
22
  end
23
23
 
24
24
  def broadcast_after_to(*streamables, **opts)
25
- broadcast_action_to *streamables, action: :after, **opts
25
+ broadcast_action_to(*streamables, action: :after, **opts)
26
26
  end
27
27
 
28
28
  def broadcast_append_to(*streamables, **opts)
29
- broadcast_action_to *streamables, action: :append, **opts
29
+ broadcast_action_to(*streamables, action: :append, **opts)
30
30
  end
31
31
 
32
32
  def broadcast_prepend_to(*streamables, **opts)
33
- broadcast_action_to *streamables, action: :prepend, **opts
33
+ broadcast_action_to(*streamables, action: :prepend, **opts)
34
34
  end
35
35
 
36
36
  def broadcast_action_to(*streamables, action:, target: nil, targets: nil, **rendering)
37
- broadcast_stream_to *streamables, content: turbo_stream_action_tag(action, target: target, targets: targets, template:
37
+ broadcast_stream_to(*streamables, content: turbo_stream_action_tag(action, target: target, targets: targets, template:
38
38
  rendering.delete(:content) || (rendering.any? ? render_format(:html, **rendering) : nil)
39
- )
39
+ ))
40
40
  end
41
41
 
42
42
  def broadcast_replace_later_to(*streamables, **opts)
43
- broadcast_action_later_to *streamables, action: :replace, **opts
43
+ broadcast_action_later_to(*streamables, action: :replace, **opts)
44
44
  end
45
45
 
46
46
  def broadcast_update_later_to(*streamables, **opts)
47
- broadcast_action_later_to *streamables, action: :update, **opts
47
+ broadcast_action_later_to(*streamables, action: :update, **opts)
48
48
  end
49
49
 
50
50
  def broadcast_before_later_to(*streamables, **opts)
51
- broadcast_action_later_to *streamables, action: :before, **opts
51
+ broadcast_action_later_to(*streamables, action: :before, **opts)
52
52
  end
53
53
 
54
54
  def broadcast_after_later_to(*streamables, **opts)
55
- broadcast_action_later_to *streamables, action: :after, **opts
55
+ broadcast_action_later_to(*streamables, action: :after, **opts)
56
56
  end
57
57
 
58
58
  def broadcast_append_later_to(*streamables, **opts)
59
- broadcast_action_later_to *streamables, action: :append, **opts
59
+ broadcast_action_later_to(*streamables, action: :append, **opts)
60
60
  end
61
61
 
62
62
  def broadcast_prepend_later_to(*streamables, **opts)
63
- broadcast_action_later_to *streamables, action: :prepend, **opts
63
+ broadcast_action_later_to(*streamables, action: :prepend, **opts)
64
64
  end
65
65
 
66
66
  def broadcast_action_later_to(*streamables, action:, target: nil, targets: nil, **rendering)
@@ -69,7 +69,7 @@ module Turbo::Streams::Broadcasts
69
69
  end
70
70
 
71
71
  def broadcast_render_to(*streamables, **rendering)
72
- broadcast_stream_to *streamables, content: render_format(:turbo_stream, **rendering)
72
+ broadcast_stream_to(*streamables, content: render_format(:turbo_stream, **rendering))
73
73
  end
74
74
 
75
75
  def broadcast_render_later_to(*streamables, **rendering)
@@ -14,7 +14,7 @@ module Turbo::Streams::ActionHelper
14
14
 
15
15
  if target = convert_to_turbo_stream_dom_id(target)
16
16
  %(<turbo-stream action="#{action}" target="#{target}">#{template}</turbo-stream>).html_safe
17
- elsif targets = convert_to_turbo_stream_dom_id(targets)
17
+ elsif targets = convert_to_turbo_stream_dom_id(targets, include_selector: true)
18
18
  %(<turbo-stream action="#{action}" targets="#{targets}">#{template}</turbo-stream>).html_safe
19
19
  else
20
20
  raise ArgumentError, "target or targets must be supplied"
@@ -22,7 +22,11 @@ module Turbo::Streams::ActionHelper
22
22
  end
23
23
 
24
24
  private
25
- def convert_to_turbo_stream_dom_id(target)
26
- target.respond_to?(:to_key) ? ActionView::RecordIdentifier.dom_id(target) : target
25
+ def convert_to_turbo_stream_dom_id(target, include_selector: false)
26
+ if target.respond_to?(:to_key)
27
+ [ ("#" if include_selector), ActionView::RecordIdentifier.dom_id(target) ].compact.join
28
+ else
29
+ target
30
+ end
27
31
  end
28
32
  end
@@ -76,7 +76,7 @@ module Turbo::Broadcastable
76
76
  # # Sends <turbo-stream action="remove" target="clearance_5"></turbo-stream> to the stream named "identity:2:clearances"
77
77
  # clearance.broadcast_remove_to examiner.identity, :clearances
78
78
  def broadcast_remove_to(*streamables, target: self)
79
- Turbo::StreamsChannel.broadcast_remove_to *streamables, target: target
79
+ Turbo::StreamsChannel.broadcast_remove_to(*streamables, target: target)
80
80
  end
81
81
 
82
82
  # Same as <tt>#broadcast_remove_to</tt>, but the designated stream is automatically set to the current model.
@@ -95,7 +95,7 @@ module Turbo::Broadcastable
95
95
  # # to the stream named "identity:2:clearances"
96
96
  # clearance.broadcast_replace_to examiner.identity, :clearances, partial: "clearances/other_partial", locals: { a: 1 }
97
97
  def broadcast_replace_to(*streamables, **rendering)
98
- Turbo::StreamsChannel.broadcast_replace_to *streamables, target: self, **broadcast_rendering_with_defaults(rendering)
98
+ Turbo::StreamsChannel.broadcast_replace_to(*streamables, target: self, **broadcast_rendering_with_defaults(rendering))
99
99
  end
100
100
 
101
101
  # Same as <tt>#broadcast_replace_to</tt>, but the designated stream is automatically set to the current model.
@@ -114,7 +114,7 @@ module Turbo::Broadcastable
114
114
  # # to the stream named "identity:2:clearances"
115
115
  # clearance.broadcast_update_to examiner.identity, :clearances, partial: "clearances/other_partial", locals: { a: 1 }
116
116
  def broadcast_update_to(*streamables, **rendering)
117
- Turbo::StreamsChannel.broadcast_update_to *streamables, target: self, **broadcast_rendering_with_defaults(rendering)
117
+ Turbo::StreamsChannel.broadcast_update_to(*streamables, target: self, **broadcast_rendering_with_defaults(rendering))
118
118
  end
119
119
 
120
120
  # Same as <tt>#broadcast_update_to</tt>, but the designated stream is automatically set to the current model.
@@ -135,7 +135,7 @@ module Turbo::Broadcastable
135
135
  # clearance.broadcast_before_to examiner.identity, :clearances, target: "clearance_5",
136
136
  # partial: "clearances/other_partial", locals: { a: 1 }
137
137
  def broadcast_before_to(*streamables, target:, **rendering)
138
- Turbo::StreamsChannel.broadcast_before_to *streamables, target: target, **broadcast_rendering_with_defaults(rendering)
138
+ Turbo::StreamsChannel.broadcast_before_to(*streamables, target: target, **broadcast_rendering_with_defaults(rendering))
139
139
  end
140
140
 
141
141
  # Insert a rendering of this broadcastable model after the target identified by it's dom id passed as <tt>target</tt>
@@ -151,7 +151,7 @@ module Turbo::Broadcastable
151
151
  # clearance.broadcast_after_to examiner.identity, :clearances, target: "clearance_5",
152
152
  # partial: "clearances/other_partial", locals: { a: 1 }
153
153
  def broadcast_after_to(*streamables, target:, **rendering)
154
- Turbo::StreamsChannel.broadcast_after_to *streamables, target: target, **broadcast_rendering_with_defaults(rendering)
154
+ Turbo::StreamsChannel.broadcast_after_to(*streamables, target: target, **broadcast_rendering_with_defaults(rendering))
155
155
  end
156
156
 
157
157
  # Append a rendering of this broadcastable model to the target identified by it's dom id passed as <tt>target</tt>
@@ -167,7 +167,7 @@ module Turbo::Broadcastable
167
167
  # clearance.broadcast_append_to examiner.identity, :clearances, target: "clearances",
168
168
  # partial: "clearances/other_partial", locals: { a: 1 }
169
169
  def broadcast_append_to(*streamables, target: broadcast_target_default, **rendering)
170
- Turbo::StreamsChannel.broadcast_append_to *streamables, target: target, **broadcast_rendering_with_defaults(rendering)
170
+ Turbo::StreamsChannel.broadcast_append_to(*streamables, target: target, **broadcast_rendering_with_defaults(rendering))
171
171
  end
172
172
 
173
173
  # Same as <tt>#broadcast_append_to</tt>, but the designated stream is automatically set to the current model.
@@ -188,7 +188,7 @@ module Turbo::Broadcastable
188
188
  # clearance.broadcast_prepend_to examiner.identity, :clearances, target: "clearances",
189
189
  # partial: "clearances/other_partial", locals: { a: 1 }
190
190
  def broadcast_prepend_to(*streamables, target: broadcast_target_default, **rendering)
191
- Turbo::StreamsChannel.broadcast_prepend_to *streamables, target: target, **broadcast_rendering_with_defaults(rendering)
191
+ Turbo::StreamsChannel.broadcast_prepend_to(*streamables, target: target, **broadcast_rendering_with_defaults(rendering))
192
192
  end
193
193
 
194
194
  # Same as <tt>#broadcast_prepend_to</tt>, but the designated stream is automatically set to the current model.
@@ -213,7 +213,7 @@ module Turbo::Broadcastable
213
213
 
214
214
  # Same as <tt>broadcast_replace_to</tt> but run asynchronously via a <tt>Turbo::Streams::BroadcastJob</tt>.
215
215
  def broadcast_replace_later_to(*streamables, **rendering)
216
- Turbo::StreamsChannel.broadcast_replace_later_to *streamables, target: self, **broadcast_rendering_with_defaults(rendering)
216
+ Turbo::StreamsChannel.broadcast_replace_later_to(*streamables, target: self, **broadcast_rendering_with_defaults(rendering))
217
217
  end
218
218
 
219
219
  # Same as <tt>#broadcast_replace_later_to</tt>, but the designated stream is automatically set to the current model.
@@ -223,7 +223,7 @@ module Turbo::Broadcastable
223
223
 
224
224
  # Same as <tt>broadcast_update_to</tt> but run asynchronously via a <tt>Turbo::Streams::BroadcastJob</tt>.
225
225
  def broadcast_update_later_to(*streamables, **rendering)
226
- Turbo::StreamsChannel.broadcast_update_later_to *streamables, target: self, **broadcast_rendering_with_defaults(rendering)
226
+ Turbo::StreamsChannel.broadcast_update_later_to(*streamables, target: self, **broadcast_rendering_with_defaults(rendering))
227
227
  end
228
228
 
229
229
  # Same as <tt>#broadcast_update_later_to</tt>, but the designated stream is automatically set to the current model.
@@ -233,7 +233,7 @@ module Turbo::Broadcastable
233
233
 
234
234
  # Same as <tt>broadcast_append_to</tt> but run asynchronously via a <tt>Turbo::Streams::BroadcastJob</tt>.
235
235
  def broadcast_append_later_to(*streamables, target: broadcast_target_default, **rendering)
236
- Turbo::StreamsChannel.broadcast_append_later_to *streamables, target: target, **broadcast_rendering_with_defaults(rendering)
236
+ Turbo::StreamsChannel.broadcast_append_later_to(*streamables, target: target, **broadcast_rendering_with_defaults(rendering))
237
237
  end
238
238
 
239
239
  # Same as <tt>#broadcast_append_later_to</tt>, but the designated stream is automatically set to the current model.
@@ -243,7 +243,7 @@ module Turbo::Broadcastable
243
243
 
244
244
  # Same as <tt>broadcast_prepend_to</tt> but run asynchronously via a <tt>Turbo::Streams::BroadcastJob</tt>.
245
245
  def broadcast_prepend_later_to(*streamables, target: broadcast_target_default, **rendering)
246
- Turbo::StreamsChannel.broadcast_prepend_later_to *streamables, target: target, **broadcast_rendering_with_defaults(rendering)
246
+ Turbo::StreamsChannel.broadcast_prepend_later_to(*streamables, target: target, **broadcast_rendering_with_defaults(rendering))
247
247
  end
248
248
 
249
249
  # Same as <tt>#broadcast_prepend_later_to</tt>, but the designated stream is automatically set to the current model.
@@ -283,7 +283,7 @@ module Turbo::Broadcastable
283
283
  # Same as <tt>broadcast_render_later</tt> but run with the added option of naming the stream using the passed
284
284
  # <tt>streamables</tt>.
285
285
  def broadcast_render_later_to(*streamables, **rendering)
286
- Turbo::StreamsChannel.broadcast_render_later_to *streamables, **broadcast_rendering_with_defaults(rendering)
286
+ Turbo::StreamsChannel.broadcast_render_later_to(*streamables, **broadcast_rendering_with_defaults(rendering))
287
287
  end
288
288
 
289
289
 
@@ -1,6 +1,6 @@
1
1
  if (cable_config_path = Rails.root.join("config/cable.yml")).exist?
2
2
  say "Enable redis in bundle"
3
- uncomment_lines "Gemfile", %(gem 'redis')
3
+ uncomment_lines "Gemfile", /gem ['"]redis['"]/
4
4
 
5
5
  say "Switch development cable to use redis"
6
6
  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,5 @@
1
+ say "Import Turbo"
2
+ append_to_file "app/javascript/application.js", %(import "@hotwired/turbo-rails"\n)
3
+
4
+ say "Pin Turbo"
5
+ append_to_file "config/importmap.rb", %(pin "@hotwired/turbo-rails", to: "turbo.js"\n)
@@ -0,0 +1,9 @@
1
+ if (js_entrypoint_path = Rails.root.join("app/javascript/application.js")).exist?
2
+ say "Import Turbo"
3
+ append_to_file "app/javascript/application.js", %(import "@hotwired/turbo-rails"\n)
4
+ else
5
+ say "You must import @hotwired/turbo-rails in your JavaScript entrypoint file", :red
6
+ end
7
+
8
+ say "Install Turbo"
9
+ run "yarn add @hotwired/turbo-rails"
@@ -17,23 +17,25 @@ end
17
17
  namespace :turbo do
18
18
  desc "Install Turbo into the app"
19
19
  task :install do
20
- if defined?(Webpacker::Engine)
21
- Rake::Task["turbo:install:webpacker"].invoke
20
+ if Rails.root.join("config/importmap.rb").exist?
21
+ Rake::Task["turbo:install:importmap"].invoke
22
+ elsif Rails.root.join("package.json").exist?
23
+ Rake::Task["turbo:install:node"].invoke
22
24
  else
23
- Rake::Task["turbo:install:asset_pipeline"].invoke
25
+ puts "You must either be running with node (package.json) or importmap-rails (config/importmap.rb) to use this gem."
24
26
  end
25
27
  end
26
28
 
27
29
  namespace :install do
28
30
  desc "Install Turbo into the app with asset pipeline"
29
- task :asset_pipeline do
30
- run_turbo_install_template "turbo_with_asset_pipeline"
31
+ task :importmap do
32
+ run_turbo_install_template "turbo_with_importmap"
31
33
  switch_on_redis_if_available
32
34
  end
33
35
 
34
36
  desc "Install Turbo into the app with webpacker"
35
- task :webpacker do
36
- run_turbo_install_template "turbo_with_webpacker"
37
+ task :node do
38
+ run_turbo_install_template "turbo_with_node"
37
39
  switch_on_redis_if_available
38
40
  end
39
41
 
data/lib/turbo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Turbo
2
- VERSION = "0.7.10"
2
+ VERSION = "0.7.14"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turbo-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.10
4
+ version: 0.7.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Stephenson
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-09-01 00:00:00.000000000 Z
13
+ date: 2021-09-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -57,8 +57,8 @@ files:
57
57
  - app/models/turbo/streams/tag_builder.rb
58
58
  - config/routes.rb
59
59
  - lib/install/turbo_needs_redis.rb
60
- - lib/install/turbo_with_asset_pipeline.rb
61
- - lib/install/turbo_with_webpacker.rb
60
+ - lib/install/turbo_with_importmap.rb
61
+ - lib/install/turbo_with_node.rb
62
62
  - lib/tasks/turbo_tasks.rake
63
63
  - lib/turbo-rails.rb
64
64
  - lib/turbo/engine.rb
@@ -1,18 +0,0 @@
1
- if (app_js_path = Rails.root.join("app/javascript/application.js")).exist?
2
- say "Import turbo-rails in existing app/javascript/application.js"
3
- append_to_file app_js_path, %(import "@hotwired/turbo-rails"\n)
4
- else
5
- say <<~INSTRUCTIONS, :red
6
- You must import @hotwired/turbo-rails in your application.js.
7
- INSTRUCTIONS
8
- end
9
-
10
- if (importmap_path = Rails.root.join("config/importmap.rb")).exist?
11
- say "Pin @hotwired/turbo-rails in config/importmap.rb"
12
- append_to_file importmap_path.to_s, %(pin "@hotwired/turbo-rails", to: "turbo.js"\n)
13
- else
14
- say <<~INSTRUCTIONS, :red
15
- You must add @hotwired/turbo-rails to your importmap to reference them via ESM.
16
- Example: pin "@hotwired/turbo-rails", to: "turbo.js"
17
- INSTRUCTIONS
18
- end
@@ -1,5 +0,0 @@
1
- say "Appending Turbo setup code to #{Webpacker.config.source_entry_path}/application.js"
2
- append_to_file "#{Webpacker.config.source_entry_path}/application.js", %(\nimport "@hotwired/turbo-rails"\n)
3
-
4
- say "Install Turbo"
5
- run "yarn add @hotwired/turbo-rails"