turbo-rails 0.5.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.
Files changed (119) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +24 -0
  3. data/.gitignore +2 -0
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +147 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +66 -0
  8. data/Rakefile +11 -0
  9. data/app/assets/javascripts/turbo.js +3161 -0
  10. data/app/channels/turbo/streams/broadcasts.rb +66 -0
  11. data/app/channels/turbo/streams/stream_name.rb +24 -0
  12. data/app/channels/turbo/streams_channel.rb +17 -0
  13. data/app/controllers/turbo/frames/frame_request.rb +24 -0
  14. data/app/controllers/turbo/native/navigation.rb +49 -0
  15. data/app/controllers/turbo/native/navigation_controller.rb +13 -0
  16. data/app/controllers/turbo/streams/turbo_streams_tag_builder.rb +22 -0
  17. data/app/helpers/turbo/drive_helper.rb +16 -0
  18. data/app/helpers/turbo/frames_helper.rb +23 -0
  19. data/app/helpers/turbo/includes_helper.rb +5 -0
  20. data/app/helpers/turbo/streams/action_helper.rb +25 -0
  21. data/app/helpers/turbo/streams_helper.rb +22 -0
  22. data/app/javascript/turbo/cable.js +16 -0
  23. data/app/javascript/turbo/cable_stream_source_element.js +27 -0
  24. data/app/javascript/turbo/index.js +3 -0
  25. data/app/jobs/turbo/streams/action_broadcast_job.rb +6 -0
  26. data/app/jobs/turbo/streams/broadcast_job.rb +7 -0
  27. data/app/models/concerns/turbo/broadcastable.rb +236 -0
  28. data/app/models/turbo/streams/tag_builder.rb +127 -0
  29. data/config/routes.rb +6 -0
  30. data/lib/install/turbo.rb +11 -0
  31. data/lib/tasks/turbo_tasks.rake +6 -0
  32. data/lib/turbo-rails.rb +17 -0
  33. data/lib/turbo/engine.rb +65 -0
  34. data/lib/turbo/test_assertions.rb +22 -0
  35. data/lib/turbo/version.rb +3 -0
  36. data/package.json +42 -0
  37. data/rollup.config.js +23 -0
  38. data/test/drive/drive_helper_test.rb +8 -0
  39. data/test/dummy/.babelrc +18 -0
  40. data/test/dummy/.gitignore +3 -0
  41. data/test/dummy/.postcssrc.yml +3 -0
  42. data/test/dummy/Rakefile +6 -0
  43. data/test/dummy/app/assets/config/manifest.js +2 -0
  44. data/test/dummy/app/assets/images/.keep +0 -0
  45. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  46. data/test/dummy/app/assets/stylesheets/scaffold.css +80 -0
  47. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  48. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  49. data/test/dummy/app/controllers/application_controller.rb +2 -0
  50. data/test/dummy/app/controllers/concerns/.keep +0 -0
  51. data/test/dummy/app/controllers/messages_controller.rb +12 -0
  52. data/test/dummy/app/controllers/trays_controller.rb +17 -0
  53. data/test/dummy/app/helpers/application_helper.rb +2 -0
  54. data/test/dummy/app/javascript/packs/application.js +0 -0
  55. data/test/dummy/app/jobs/application_job.rb +2 -0
  56. data/test/dummy/app/mailboxes/application_mailbox.rb +2 -0
  57. data/test/dummy/app/mailboxes/messages_mailbox.rb +4 -0
  58. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  59. data/test/dummy/app/models/application_record.rb +3 -0
  60. data/test/dummy/app/models/concerns/.keep +0 -0
  61. data/test/dummy/app/models/message.rb +29 -0
  62. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  63. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  64. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  65. data/test/dummy/app/views/messages/_message.html.erb +1 -0
  66. data/test/dummy/app/views/messages/_message.turbo_stream.erb +1 -0
  67. data/test/dummy/app/views/messages/show.turbo_stream.erb +9 -0
  68. data/test/dummy/app/views/trays/index.html.erb +3 -0
  69. data/test/dummy/app/views/trays/show.html.erb +3 -0
  70. data/test/dummy/bin/bundle +3 -0
  71. data/test/dummy/bin/rails +4 -0
  72. data/test/dummy/bin/rake +4 -0
  73. data/test/dummy/bin/setup +36 -0
  74. data/test/dummy/bin/update +31 -0
  75. data/test/dummy/bin/yarn +11 -0
  76. data/test/dummy/config.ru +5 -0
  77. data/test/dummy/config/application.rb +22 -0
  78. data/test/dummy/config/boot.rb +5 -0
  79. data/test/dummy/config/cable.yml +10 -0
  80. data/test/dummy/config/environment.rb +5 -0
  81. data/test/dummy/config/environments/development.rb +34 -0
  82. data/test/dummy/config/environments/production.rb +96 -0
  83. data/test/dummy/config/environments/test.rb +38 -0
  84. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  85. data/test/dummy/config/initializers/assets.rb +14 -0
  86. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  87. data/test/dummy/config/initializers/content_security_policy.rb +22 -0
  88. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  89. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  90. data/test/dummy/config/initializers/inflections.rb +16 -0
  91. data/test/dummy/config/initializers/mime_types.rb +4 -0
  92. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  93. data/test/dummy/config/locales/en.yml +33 -0
  94. data/test/dummy/config/puma.rb +34 -0
  95. data/test/dummy/config/routes.rb +4 -0
  96. data/test/dummy/config/spring.rb +6 -0
  97. data/test/dummy/config/webpack/development.js +3 -0
  98. data/test/dummy/config/webpack/environment.js +3 -0
  99. data/test/dummy/config/webpack/production.js +3 -0
  100. data/test/dummy/config/webpack/test.js +3 -0
  101. data/test/dummy/config/webpacker.yml +65 -0
  102. data/test/dummy/lib/assets/.keep +0 -0
  103. data/test/dummy/log/.keep +0 -0
  104. data/test/dummy/public/404.html +67 -0
  105. data/test/dummy/public/422.html +67 -0
  106. data/test/dummy/public/500.html +66 -0
  107. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  108. data/test/dummy/public/apple-touch-icon.png +0 -0
  109. data/test/dummy/public/favicon.ico +0 -0
  110. data/test/frames/frame_request_controller_test.rb +21 -0
  111. data/test/frames/frames_helper_test.rb +15 -0
  112. data/test/native/navigation_controller_test.rb +42 -0
  113. data/test/streams/broadcastable_test.rb +80 -0
  114. data/test/streams/streams_channel_test.rb +105 -0
  115. data/test/streams/streams_controller_test.rb +29 -0
  116. data/test/turbo_test.rb +10 -0
  117. data/turbo-rails.gemspec +16 -0
  118. data/yarn.lock +282 -0
  119. metadata +254 -0
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ .rails-default-error-page {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ .rails-default-error-page div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ .rails-default-error-page div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ .rails-default-error-page h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ .rails-default-error-page div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body class="rails-default-error-page">
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
File without changes
@@ -0,0 +1,21 @@
1
+ require "turbo_test"
2
+
3
+ class Turbo::FrameRequestControllerTest < ActionDispatch::IntegrationTest
4
+ test "frame requests are rendered without a layout" do
5
+ get tray_path(id: 1)
6
+ assert_select "title", count: 1
7
+
8
+ get tray_path(id: 1), headers: { "Turbo-Frame" => "true" }
9
+ assert_select "title", count: 0
10
+ end
11
+
12
+ test "frame requests get a unique etag" do
13
+ get tray_path(id: 1)
14
+ etag_without_frame = @response.headers["ETag"]
15
+
16
+ get tray_path(id: 1), headers: { "Turbo-Frame" => "true" }
17
+ etag_with_frame = @response.headers["ETag"]
18
+
19
+ assert_not_equal etag_with_frame, etag_without_frame
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ require "turbo_test"
2
+
3
+ class Turbo::FramesHelperTest < ActionView::TestCase
4
+ test "frame with src" do
5
+ assert_dom_equal %(<turbo-frame src="/trays/1" id="tray"></turbo-frame>), turbo_frame_tag("tray", src: "/trays/1")
6
+ end
7
+
8
+ test "frame with src and target" do
9
+ assert_dom_equal %(<turbo-frame src="/trays/1" id="tray" target="_top"></turbo-frame>), turbo_frame_tag("tray", src: "/trays/1", target: "_top")
10
+ end
11
+
12
+ test "block style" do
13
+ assert_dom_equal(%(<turbo-frame id="tray"><p>tray!</p></turbo-frame>), turbo_frame_tag("tray") { tag.p("tray!") })
14
+ end
15
+ end
@@ -0,0 +1,42 @@
1
+ require "turbo_test"
2
+
3
+ class Turbo::Native::NavigationControllerTest < ActionDispatch::IntegrationTest
4
+ test "recede, resume, or refresh when native or redirect when not" do
5
+ %w[ recede resume refresh ].each do |action|
6
+ post trays_path, params: { return_to: "#{action}_or_redirect" }
7
+ assert_redirected_to tray_path(id: 1)
8
+
9
+ post trays_path, params: { return_to: "#{action}_or_redirect" }, headers: header_for_turbo_native_app
10
+ assert_redirected_to send("turbo_#{action}_historical_location_url")
11
+ end
12
+ end
13
+
14
+ test "recede, resume, or refresh when native or redirect back when not" do
15
+ %w[ recede resume refresh ].each do |action|
16
+ post trays_path, params: { return_to: "#{action}_or_redirect_back" }
17
+ assert_redirected_to tray_path(id: 5)
18
+
19
+ post trays_path, params: { return_to: "#{action}_or_redirect_back" }, headers: header_for_referer
20
+ assert_redirected_to "/past_place"
21
+
22
+ post trays_path, params: { return_to: "#{action}_or_redirect_back" }, headers: header_for_turbo_native_app.merge(header_for_referer)
23
+ assert_redirected_to send("turbo_#{action}_historical_location_url")
24
+ end
25
+ end
26
+
27
+ test "historical location url sends text/html" do
28
+ get turbo_refresh_historical_location_url
29
+
30
+ assert_response :ok
31
+ assert_equal "text/html; charset=utf-8", response.content_type
32
+ end
33
+
34
+ private
35
+ def header_for_turbo_native_app
36
+ { "HTTP_USER_AGENT" => "MyApp iOS/3.0 Turbo Native (build 13; iPad Air 2); iOS 9.3" }
37
+ end
38
+
39
+ def header_for_referer
40
+ { "HTTP_REFERER" => "/past_place" }
41
+ end
42
+ end
@@ -0,0 +1,80 @@
1
+ require "turbo_test"
2
+ require "action_cable"
3
+
4
+ class Turbo::BroadcastableTest < ActionCable::Channel::TestCase
5
+ include ActiveJob::TestHelper, Turbo::Streams::ActionHelper
6
+
7
+ setup { @message = Message.new(record_id: 1, content: "Hello!") }
8
+
9
+ test "broadcasting remove to stream now" do
10
+ assert_broadcast_on "stream", turbo_stream_action_tag("remove", target: "message_1") do
11
+ @message.broadcast_remove_to "stream"
12
+ end
13
+ end
14
+
15
+ test "broadcasting remove now" do
16
+ assert_broadcast_on @message.to_param, turbo_stream_action_tag("remove", target: "message_1") do
17
+ @message.broadcast_remove
18
+ end
19
+ end
20
+
21
+ test "broadcasting replace to stream now" do
22
+ assert_broadcast_on "stream", turbo_stream_action_tag("replace", target: "message_1", template: "<p>Hello!</p>") do
23
+ @message.broadcast_replace_to "stream"
24
+ end
25
+ end
26
+
27
+ test "broadcasting replace now" do
28
+ assert_broadcast_on @message.to_param, turbo_stream_action_tag("replace", target: "message_1", template: "<p>Hello!</p>") do
29
+ @message.broadcast_replace
30
+ end
31
+ end
32
+
33
+ test "broadcasting append to stream now" do
34
+ assert_broadcast_on "stream", turbo_stream_action_tag("append", target: "messages", template: "<p>Hello!</p>") do
35
+ @message.broadcast_append_to "stream"
36
+ end
37
+ end
38
+
39
+ test "broadcasting append to stream with custom target now" do
40
+ assert_broadcast_on "stream", turbo_stream_action_tag("append", target: "board_messages", template: "<p>Hello!</p>") do
41
+ @message.broadcast_append_to "stream", target: "board_messages"
42
+ end
43
+ end
44
+
45
+ test "broadcasting append now" do
46
+ assert_broadcast_on @message.to_param, turbo_stream_action_tag("append", target: "messages", template: "<p>Hello!</p>") do
47
+ @message.broadcast_append
48
+ end
49
+ end
50
+
51
+ test "broadcasting prepend to stream now" do
52
+ assert_broadcast_on "stream", turbo_stream_action_tag("prepend", target: "messages", template: "<p>Hello!</p>") do
53
+ @message.broadcast_prepend_to "stream"
54
+ end
55
+ end
56
+
57
+ test "broadcasting prepend to stream with custom target now" do
58
+ assert_broadcast_on "stream", turbo_stream_action_tag("prepend", target: "board_messages", template: "<p>Hello!</p>") do
59
+ @message.broadcast_prepend_to "stream", target: "board_messages"
60
+ end
61
+ end
62
+
63
+ test "broadcasting prepend now" do
64
+ assert_broadcast_on @message.to_param, turbo_stream_action_tag("prepend", target: "messages", template: "<p>Hello!</p>") do
65
+ @message.broadcast_prepend
66
+ end
67
+ end
68
+
69
+ test "broadcasting action to stream now" do
70
+ assert_broadcast_on "stream", turbo_stream_action_tag("prepend", target: "messages", template: "<p>Hello!</p>") do
71
+ @message.broadcast_action_to "stream", action: "prepend"
72
+ end
73
+ end
74
+
75
+ test "broadcasting action now" do
76
+ assert_broadcast_on @message.to_param, turbo_stream_action_tag("prepend", target: "messages", template: "<p>Hello!</p>") do
77
+ @message.broadcast_action "prepend"
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,105 @@
1
+ require "turbo_test"
2
+ require "action_cable"
3
+
4
+ class Turbo::StreamsChannelTest < ActionCable::Channel::TestCase
5
+ include ActiveJob::TestHelper, Turbo::Streams::ActionHelper
6
+
7
+ test "verified stream name" do
8
+ assert_equal "stream", Turbo::StreamsChannel.verified_stream_name(Turbo::StreamsChannel.signed_stream_name("stream"))
9
+ end
10
+
11
+
12
+ test "broadcasting remove now" do
13
+ assert_broadcast_on "stream", turbo_stream_action_tag("remove", target: "message_1") do
14
+ Turbo::StreamsChannel.broadcast_remove_to "stream", target: "message_1"
15
+ end
16
+ end
17
+
18
+ test "broadcasting remove now with record" do
19
+ assert_broadcast_on "stream", turbo_stream_action_tag("remove", target: "message_1") do
20
+ Turbo::StreamsChannel.broadcast_remove_to "stream", target: Message.new(record_id: 1, content: "hello!")
21
+ end
22
+ end
23
+
24
+ test "broadcasting replace now" do
25
+ assert_broadcast_on "stream", turbo_stream_action_tag("replace", target: "message_1", template: "<p>hello!</p>") do
26
+ Turbo::StreamsChannel.broadcast_replace_to "stream", target: "message_1", partial: "messages/message", locals: { message: "hello!" }
27
+ end
28
+ end
29
+
30
+ test "broadcasting append now" do
31
+ assert_broadcast_on "stream", turbo_stream_action_tag("append", target: "messages", template: "<p>hello!</p>") do
32
+ Turbo::StreamsChannel.broadcast_append_to "stream", target: "messages", partial: "messages/message", locals: { message: "hello!" }
33
+ end
34
+ end
35
+
36
+ test "broadcasting prepend now" do
37
+ assert_broadcast_on "stream", turbo_stream_action_tag("prepend", target: "messages", template: "<p>hello!</p>") do
38
+ Turbo::StreamsChannel.broadcast_prepend_to "stream", target: "messages", partial: "messages/message", locals: { message: "hello!" }
39
+ end
40
+ end
41
+
42
+ test "broadcasting action now" do
43
+ assert_broadcast_on "stream", turbo_stream_action_tag("prepend", target: "messages", template: "<p>hello!</p>") do
44
+ Turbo::StreamsChannel.broadcast_action_to "stream", action: "prepend", target: "messages", partial: "messages/message", locals: { message: "hello!" }
45
+ end
46
+ end
47
+
48
+
49
+ test "broadcasting replace later" do
50
+ assert_broadcast_on "stream", turbo_stream_action_tag("replace", target: "message_1", template: "<p>hello!</p>") do
51
+ perform_enqueued_jobs do
52
+ Turbo::StreamsChannel.broadcast_replace_later_to \
53
+ "stream", target: "message_1", partial: "messages/message", locals: { message: "hello!" }
54
+ end
55
+ end
56
+ end
57
+
58
+ test "broadcasting append later" do
59
+ assert_broadcast_on "stream", turbo_stream_action_tag("append", target: "messages", template: "<p>hello!</p>") do
60
+ perform_enqueued_jobs do
61
+ Turbo::StreamsChannel.broadcast_append_later_to \
62
+ "stream", target: "messages", partial: "messages/message", locals: { message: "hello!" }
63
+ end
64
+ end
65
+ end
66
+
67
+ test "broadcasting prepend later" do
68
+ assert_broadcast_on "stream", turbo_stream_action_tag("prepend", target: "messages", template: "<p>hello!</p>") do
69
+ perform_enqueued_jobs do
70
+ Turbo::StreamsChannel.broadcast_prepend_later_to \
71
+ "stream", target: "messages", partial: "messages/message", locals: { message: "hello!" }
72
+ end
73
+ end
74
+ end
75
+
76
+ test "broadcasting action later" do
77
+ assert_broadcast_on "stream", turbo_stream_action_tag("prepend", target: "messages", template: "<p>hello!</p>") do
78
+ perform_enqueued_jobs do
79
+ Turbo::StreamsChannel.broadcast_action_later_to \
80
+ "stream", action: "prepend", target: "messages", partial: "messages/message", locals: { message: "hello!" }
81
+ end
82
+ end
83
+ end
84
+
85
+
86
+ test "broadcasting render now" do
87
+ assert_broadcast_on "stream", turbo_stream_action_tag("replace", target: "message_1", template: "Goodbye!") do
88
+ Turbo::StreamsChannel.broadcast_render_to "stream", partial: "messages/message"
89
+ end
90
+ end
91
+
92
+ test "broadcasting render later" do
93
+ assert_broadcast_on "stream", turbo_stream_action_tag("replace", target: "message_1", template: "Goodbye!") do
94
+ perform_enqueued_jobs do
95
+ Turbo::StreamsChannel.broadcast_render_later_to "stream", partial: "messages/message"
96
+ end
97
+ end
98
+ end
99
+
100
+ test "broadcasting update now" do
101
+ assert_broadcast_on "stream", %(direct) do
102
+ Turbo::StreamsChannel.broadcast_stream_to "stream", content: "direct"
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,29 @@
1
+ require "turbo_test"
2
+
3
+ class Turbo::StreamsControllerTest < ActionDispatch::IntegrationTest
4
+ test "create with respond to" do
5
+ post messages_path
6
+ assert_redirected_to message_path(id: 1)
7
+
8
+ post messages_path, as: :turbo_stream
9
+ assert_response :ok
10
+ assert_turbo_stream action: :append, target: "messages" do |selected|
11
+ assert_equal "<template>message_1</template>", selected.children.to_html
12
+ end
13
+ end
14
+
15
+ test "show all turbo actions" do
16
+ get message_path(id: 1), as: :turbo_stream
17
+ assert_equal <<-STREAM, @response.body
18
+ <turbo-stream action="remove" target="message_1"></turbo-stream>
19
+ <turbo-stream action="replace" target="message_1"><template><p>My message</p></template></turbo-stream>
20
+ <turbo-stream action="replace" target="message_1"><template>Something else</template></turbo-stream>
21
+ <turbo-stream action="replace" target="message_5"><template>Something fifth</template></turbo-stream>
22
+ <turbo-stream action="replace" target="message_5"><template><p>OLLA!</p></template></turbo-stream>
23
+ <turbo-stream action="append" target="messages"><template><p>My message</p></template></turbo-stream>
24
+ <turbo-stream action="append" target="messages"><template><p>OLLA!</p></template></turbo-stream>
25
+ <turbo-stream action="prepend" target="messages"><template><p>My message</p></template></turbo-stream>
26
+ <turbo-stream action="prepend" target="messages"><template><p>OLLA!</p></template></turbo-stream>
27
+ STREAM
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+
3
+ require "minitest/autorun"
4
+ require "rails"
5
+ require "rails/test_help"
6
+ require "byebug"
7
+
8
+ require_relative "dummy/config/environment"
9
+
10
+ ActionCable.server.config.logger = Logger.new(STDOUT) if ENV["VERBOSE"]
@@ -0,0 +1,16 @@
1
+ require_relative "lib/turbo/version"
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "turbo-rails"
5
+ s.version = Turbo::VERSION
6
+ s.authors = [ "Sam Stephenson", "Javan Mahkmali", "David Heinemeier Hansson" ]
7
+ s.email = "david@loudthinking.com"
8
+ s.summary = "The speed of a single-page web application without having to write any JavaScript."
9
+ s.homepage = "https://github.com/hotwired/turbo-rails"
10
+ s.license = "MIT"
11
+
12
+ s.add_dependency "rails", ">= 6.0.0"
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- test/*`.split("\n")
16
+ end
@@ -0,0 +1,282 @@
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ "@babel/code-frame@^7.10.4":
6
+ version "7.12.11"
7
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
8
+ integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
9
+ dependencies:
10
+ "@babel/highlight" "^7.10.4"
11
+
12
+ "@babel/helper-validator-identifier@^7.10.4":
13
+ version "7.12.11"
14
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
15
+ integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
16
+
17
+ "@babel/highlight@^7.10.4":
18
+ version "7.10.4"
19
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
20
+ integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
21
+ dependencies:
22
+ "@babel/helper-validator-identifier" "^7.10.4"
23
+ chalk "^2.0.0"
24
+ js-tokens "^4.0.0"
25
+
26
+ "@hotwired/turbo@git+ssh://git@github.com:hotwired/turbo#dev-builds/99d8a70":
27
+ version "7.0.0-beta.1"
28
+ resolved "git+ssh://git@github.com:hotwired/turbo#947298e9e053b4f355469a3df40e915e536dce5a"
29
+
30
+ "@rails/actioncable@^6.1.0":
31
+ version "6.1.0"
32
+ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.1.0.tgz#f336f25450b1bc43b99bc60557a70b6e6bb1d3d2"
33
+ integrity sha512-eDgy+vcKN9RIzxmMBfSAe77rTj2cp6kJALiVQyKrW2O9EK2MdostOmP+99At/Dit3ur5+77NVnruxD7y14ZYFA==
34
+
35
+ "@rollup/plugin-node-resolve@^11.0.1":
36
+ version "11.0.1"
37
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.0.1.tgz#d3765eec4bccf960801439a999382aed2dca959b"
38
+ integrity sha512-ltlsj/4Bhwwhb+Nb5xCz/6vieuEj2/BAkkqVIKmZwC7pIdl8srmgmglE4S0jFlZa32K4qvdQ6NHdmpRKD/LwoQ==
39
+ dependencies:
40
+ "@rollup/pluginutils" "^3.1.0"
41
+ "@types/resolve" "1.17.1"
42
+ builtin-modules "^3.1.0"
43
+ deepmerge "^4.2.2"
44
+ is-module "^1.0.0"
45
+ resolve "^1.19.0"
46
+
47
+ "@rollup/pluginutils@^3.1.0":
48
+ version "3.1.0"
49
+ resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
50
+ integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
51
+ dependencies:
52
+ "@types/estree" "0.0.39"
53
+ estree-walker "^1.0.1"
54
+ picomatch "^2.2.2"
55
+
56
+ "@types/estree@0.0.39":
57
+ version "0.0.39"
58
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
59
+ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
60
+
61
+ "@types/node@*":
62
+ version "14.14.14"
63
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz#f7fd5f3cc8521301119f63910f0fb965c7d761ae"
64
+ integrity sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==
65
+
66
+ "@types/resolve@1.17.1":
67
+ version "1.17.1"
68
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
69
+ integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==
70
+ dependencies:
71
+ "@types/node" "*"
72
+
73
+ ansi-styles@^3.2.1:
74
+ version "3.2.1"
75
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
76
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
77
+ dependencies:
78
+ color-convert "^1.9.0"
79
+
80
+ buffer-from@^1.0.0:
81
+ version "1.1.1"
82
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
83
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
84
+
85
+ builtin-modules@^3.1.0:
86
+ version "3.1.0"
87
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
88
+ integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
89
+
90
+ chalk@^2.0.0:
91
+ version "2.4.2"
92
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
93
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
94
+ dependencies:
95
+ ansi-styles "^3.2.1"
96
+ escape-string-regexp "^1.0.5"
97
+ supports-color "^5.3.0"
98
+
99
+ color-convert@^1.9.0:
100
+ version "1.9.3"
101
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
102
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
103
+ dependencies:
104
+ color-name "1.1.3"
105
+
106
+ color-name@1.1.3:
107
+ version "1.1.3"
108
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
109
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
110
+
111
+ commander@^2.20.0:
112
+ version "2.20.3"
113
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
114
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
115
+
116
+ deepmerge@^4.2.2:
117
+ version "4.2.2"
118
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
119
+ integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
120
+
121
+ escape-string-regexp@^1.0.5:
122
+ version "1.0.5"
123
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
124
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
125
+
126
+ estree-walker@^1.0.1:
127
+ version "1.0.1"
128
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
129
+ integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
130
+
131
+ fsevents@~2.1.2:
132
+ version "2.1.3"
133
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
134
+ integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
135
+
136
+ function-bind@^1.1.1:
137
+ version "1.1.1"
138
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
139
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
140
+
141
+ has-flag@^3.0.0:
142
+ version "3.0.0"
143
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
144
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
145
+
146
+ has-flag@^4.0.0:
147
+ version "4.0.0"
148
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
149
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
150
+
151
+ has@^1.0.3:
152
+ version "1.0.3"
153
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
154
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
155
+ dependencies:
156
+ function-bind "^1.1.1"
157
+
158
+ is-core-module@^2.1.0:
159
+ version "2.2.0"
160
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a"
161
+ integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==
162
+ dependencies:
163
+ has "^1.0.3"
164
+
165
+ is-module@^1.0.0:
166
+ version "1.0.0"
167
+ resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
168
+ integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
169
+
170
+ jest-worker@^26.2.1:
171
+ version "26.6.2"
172
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
173
+ integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
174
+ dependencies:
175
+ "@types/node" "*"
176
+ merge-stream "^2.0.0"
177
+ supports-color "^7.0.0"
178
+
179
+ js-tokens@^4.0.0:
180
+ version "4.0.0"
181
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
182
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
183
+
184
+ merge-stream@^2.0.0:
185
+ version "2.0.0"
186
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
187
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
188
+
189
+ path-parse@^1.0.6:
190
+ version "1.0.6"
191
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
192
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
193
+
194
+ picomatch@^2.2.2:
195
+ version "2.2.2"
196
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
197
+ integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
198
+
199
+ randombytes@^2.1.0:
200
+ version "2.1.0"
201
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
202
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
203
+ dependencies:
204
+ safe-buffer "^5.1.0"
205
+
206
+ resolve@^1.19.0:
207
+ version "1.19.0"
208
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c"
209
+ integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==
210
+ dependencies:
211
+ is-core-module "^2.1.0"
212
+ path-parse "^1.0.6"
213
+
214
+ rollup-plugin-terser@^7.0.2:
215
+ version "7.0.2"
216
+ resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d"
217
+ integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==
218
+ dependencies:
219
+ "@babel/code-frame" "^7.10.4"
220
+ jest-worker "^26.2.1"
221
+ serialize-javascript "^4.0.0"
222
+ terser "^5.0.0"
223
+
224
+ rollup@^2.35.1:
225
+ version "2.35.1"
226
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.35.1.tgz#e6bc8d10893556a638066f89e8c97f422d03968c"
227
+ integrity sha512-q5KxEyWpprAIcainhVy6HfRttD9kutQpHbeqDTWnqAFNJotiojetK6uqmcydNMymBEtC4I8bCYR+J3mTMqeaUA==
228
+ optionalDependencies:
229
+ fsevents "~2.1.2"
230
+
231
+ safe-buffer@^5.1.0:
232
+ version "5.2.1"
233
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
234
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
235
+
236
+ serialize-javascript@^4.0.0:
237
+ version "4.0.0"
238
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
239
+ integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
240
+ dependencies:
241
+ randombytes "^2.1.0"
242
+
243
+ source-map-support@~0.5.19:
244
+ version "0.5.19"
245
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
246
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
247
+ dependencies:
248
+ buffer-from "^1.0.0"
249
+ source-map "^0.6.0"
250
+
251
+ source-map@^0.6.0:
252
+ version "0.6.1"
253
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
254
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
255
+
256
+ source-map@~0.7.2:
257
+ version "0.7.3"
258
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
259
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
260
+
261
+ supports-color@^5.3.0:
262
+ version "5.5.0"
263
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
264
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
265
+ dependencies:
266
+ has-flag "^3.0.0"
267
+
268
+ supports-color@^7.0.0:
269
+ version "7.2.0"
270
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
271
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
272
+ dependencies:
273
+ has-flag "^4.0.0"
274
+
275
+ terser@^5.0.0:
276
+ version "5.5.1"
277
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289"
278
+ integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==
279
+ dependencies:
280
+ commander "^2.20.0"
281
+ source-map "~0.7.2"
282
+ source-map-support "~0.5.19"