turbo_boost-commands 0.0.18 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of turbo_boost-commands might be problematic. Click here for more details.

@@ -77,17 +77,15 @@ class TurboBoost::Commands::Command
77
77
  end
78
78
  end
79
79
 
80
- attr_reader :controller, :state_manager, :params, :turbo_streams
81
-
82
- alias_method :state, :state_manager
80
+ attr_reader :controller, :state, :params, :turbo_streams
83
81
  alias_method :streams, :turbo_streams
84
82
 
85
83
  delegate :css_id_selector, to: :"self.class"
86
84
  delegate :dom_id, to: :"controller.view_context"
87
85
 
88
- def initialize(controller, state_manager, params = {})
86
+ def initialize(controller, state, params = {})
89
87
  @controller = controller
90
- @state_manager = state_manager
88
+ @state = state
91
89
  @params = params
92
90
  @turbo_streams = Set.new
93
91
  end
@@ -1,29 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../state/manager"
4
3
  require_relative "runner"
5
4
 
6
5
  class TurboBoost::Commands::ControllerPack
7
6
  include TurboBoost::Commands::AttributeHydration
8
7
 
9
- attr_reader :controller, :state_manager, :runner, :command
10
- alias_method :state, :state_manager
8
+ attr_reader :runner, :command
11
9
 
12
10
  delegate(
13
11
  :command_aborted?,
14
12
  :command_errored?,
15
- :command_performing?,
16
13
  :command_performed?,
14
+ :command_performing?,
17
15
  :command_requested?,
18
16
  :command_succeeded?,
19
- :meta_tag,
17
+ :controller,
18
+ :state,
20
19
  to: :runner
21
20
  )
22
21
 
23
22
  def initialize(controller)
24
- @controller = controller
25
- @state_manager = TurboBoost::State::Manager.new(controller)
26
- @runner = TurboBoost::Commands::Runner.new(controller, state_manager)
23
+ @runner = TurboBoost::Commands::Runner.new(controller)
27
24
  @command = runner.command_instance
28
25
  end
29
26
  end
@@ -2,9 +2,9 @@
2
2
 
3
3
  require "turbo-rails"
4
4
  require "turbo_boost/streams"
5
+ require "universalid"
5
6
  require_relative "version"
6
7
  require_relative "http_status_codes"
7
- require_relative "../errors"
8
8
  require_relative "errors"
9
9
  require_relative "patches"
10
10
  require_relative "command"
@@ -19,13 +19,14 @@ module TurboBoost::Commands
19
19
 
20
20
  class Engine < ::Rails::Engine
21
21
  config.turbo_boost_commands = ActiveSupport::OrderedOptions.new
22
- config.turbo_boost_commands[:max_cookie_size] = ActionDispatch::Cookies::MAX_COOKIE_SIZE / 3
23
22
  config.turbo_boost_commands[:validate_client_token] = false
24
23
 
25
24
  # must opt-in to state overrides
26
25
  config.turbo_boost_commands[:apply_client_state_overrides] = false
27
26
  config.turbo_boost_commands[:apply_server_state_overrides] = false
28
27
 
28
+ config.turbo_boost_commands.precompile_assets = true
29
+
29
30
  initializer "turbo_boost_commands.configuration" do
30
31
  Mime::Type.register "text/vnd.turbo-boost.html", :turbo_boost
31
32
 
@@ -40,5 +41,13 @@ module TurboBoost::Commands
40
41
  ActionView::Helpers::TagHelper::TagBuilder.prepend TurboBoost::Commands::Patches::ActionViewHelpersTagHelperTagBuilderPatch
41
42
  end
42
43
  end
44
+
45
+ initializer "turbo_boost_commands.asset" do
46
+ config.after_initialize do |app|
47
+ if app.config.respond_to?(:assets) && app.config.turbo_boost_commands.precompile_assets
48
+ app.config.assets.precompile += %w[@turbo-boost/commands.js]
49
+ end
50
+ end
51
+ end
43
52
  end
44
53
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TurboBoost::Commands
4
+ class InvalidTokenError < StandardError; end
5
+
4
6
  class InvalidClassError < StandardError; end
5
7
 
6
8
  class InvalidMethodError < StandardError; end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "sanitizer"
4
+ require_relative "state"
4
5
 
5
6
  class TurboBoost::Commands::Runner
6
7
  SUPPORTED_MEDIA_TYPES = {
@@ -9,22 +10,18 @@ class TurboBoost::Commands::Runner
9
10
  "text/vnd.turbo-stream.html" => true
10
11
  }.freeze
11
12
 
12
- attr_reader :controller, :state_manager
13
+ attr_reader :controller
13
14
 
14
- def initialize(controller, state_manager)
15
+ def initialize(controller)
15
16
  @controller = controller
16
- @state_manager = state_manager
17
17
  end
18
18
 
19
- def meta_tag
20
- masked_token = message_verifier.generate(new_token)
21
- options = {
22
- id: "turbo-boost",
23
- name: "turbo-boost",
24
- content: masked_token,
25
- data: {busy: false, state: state_manager.payload}
26
- }
27
- controller.view_context.tag("meta", options).html_safe
19
+ def state
20
+ @state ||= begin
21
+ sgid = command_params[:signed_state]
22
+ value = TurboBoost::Commands::State.from_sgid_param(sgid) if sgid
23
+ value || TurboBoost::Commands::State.new
24
+ end
28
25
  end
29
26
 
30
27
  def command_requested?
@@ -48,15 +45,15 @@ class TurboBoost::Commands::Runner
48
45
 
49
46
  # validate csrf token
50
47
  unless valid_client_token?
51
- raise TurboBoost::InvalidTokenError,
52
- "CSRF token mismatch! The request header `TurboBoost-Token: #{client_token}` does not match the expected value of `#{server_token}`."
48
+ raise TurboBoost::Commands::InvalidTokenError,
49
+ "Token mismatch! The token: #{client_token}` does not match the expected value of `#{server_token}`."
53
50
  end
54
51
 
55
52
  true
56
53
  end
57
54
 
58
55
  def command_params
59
- return ActionController::Parameters.new if controller.params[:turbo_boost_command].nil?
56
+ return ActionController::Parameters.new if controller.params.keys.none?(/\A(tbc|turbo_boost_command)\z/o)
60
57
  @command_params ||= begin
61
58
  payload = parsed_command_params.deep_transform_keys(&:underscore)
62
59
  ActionController::Parameters.new(payload).permit!
@@ -86,7 +83,7 @@ class TurboBoost::Commands::Runner
86
83
  end
87
84
 
88
85
  def command_instance
89
- @command_instance ||= command_class&.new(controller, state_manager, command_params).tap do |instance|
86
+ @command_instance ||= command_class&.new(controller, state, command_params).tap do |instance|
90
87
  instance&.add_observer self, :handle_command_event
91
88
  end
92
89
  end
@@ -126,6 +123,7 @@ class TurboBoost::Commands::Runner
126
123
  return if command_errored?
127
124
  return if command_performing?
128
125
  return if command_performed?
126
+ state.resolve command_params[:client_state]
129
127
  command_instance.perform_with_callbacks command_method_name
130
128
  end
131
129
 
@@ -148,8 +146,8 @@ class TurboBoost::Commands::Runner
148
146
  append_error_to_response error
149
147
  end
150
148
 
151
- append_meta_tag_to_response_body # called before `write_cookie` so all state is emitted to the DOM
152
- state_manager.write_cookie # truncates state to stay within cookie size limits (4k)
149
+ append_command_token_to_response_body
150
+ append_command_state_to_response_body
153
151
  end
154
152
 
155
153
  def update_response
@@ -159,8 +157,8 @@ class TurboBoost::Commands::Runner
159
157
  return if controller_action_prevented?
160
158
 
161
159
  append_to_response_headers
162
- append_meta_tag_to_response_body # called before `write_cookie` so all state is emitted to the DOM
163
- state_manager.write_cookie # truncates state to stay within cookie size limits (4k)
160
+ append_command_token_to_response_body
161
+ append_command_state_to_response_body
164
162
  append_success_to_response if command_succeeded?
165
163
  rescue => error
166
164
  Rails.logger.error "TurboBoost::Commands::Runner failed to update the response! #{error.message}"
@@ -181,11 +179,6 @@ class TurboBoost::Commands::Runner
181
179
  ActiveSupport::MessageVerifier.new Rails.application.secret_key_base, digest: "SHA256"
182
180
  end
183
181
 
184
- # Same implementation as ActionController::Base but with public visibility
185
- def cookies
186
- controller.request.cookie_jar
187
- end
188
-
189
182
  def handle_command_event(*args)
190
183
  event = args.shift
191
184
  options = args.extract_options!
@@ -198,31 +191,36 @@ class TurboBoost::Commands::Runner
198
191
  private
199
192
 
200
193
  def parsed_command_params
201
- @parsed_command_params ||= JSON.parse(controller.params[:turbo_boost_command])
194
+ @parsed_command_params ||= JSON.parse(controller.params[:tbc] || controller.params[:turbo_boost_command])
202
195
  end
203
196
 
204
197
  def content_sanitizer
205
198
  TurboBoost::Commands::Sanitizer.instance
206
199
  end
207
200
 
201
+ # TODO: revisit command token validation
208
202
  def new_token
209
- @new_token ||= SecureRandom.urlsafe_base64(12)
203
+ @new_token ||= SecureRandom.alphanumeric(13)
210
204
  end
211
205
 
206
+ # TODO: revisit command token validation
212
207
  def server_token
213
- cookies.encrypted["turbo_boost.token"]
208
+ nil
214
209
  end
215
210
 
211
+ # TODO: revisit command token validation
216
212
  def client_token
217
- (controller.request.headers["TurboBoost-Token"] || command_params[:token]).to_s
213
+ command_params[:token].to_s
218
214
  end
219
215
 
216
+ # TODO: revisit command token validation
220
217
  def valid_client_token?
221
- return true unless Rails.configuration.turbo_boost_commands.validate_client_token
222
- return false unless client_token.present?
223
- return false unless message_verifier.valid_message?(client_token)
224
- unmasked_client_token = message_verifier.verify(client_token)
225
- unmasked_client_token == server_token
218
+ # return true unless Rails.configuration.turbo_boost_commands.validate_client_token
219
+ # return false unless client_token.present?
220
+ # return false unless message_verifier.valid_message?(client_token)
221
+ # unmasked_client_token = message_verifier.verify(client_token)
222
+ # unmasked_client_token == server_token
223
+ true
226
224
  end
227
225
 
228
226
  def should_redirect?
@@ -258,11 +256,16 @@ class TurboBoost::Commands::Runner
258
256
  command_instance.turbo_streams.each { |stream| append_to_response_body stream }
259
257
  end
260
258
 
261
- def append_meta_tag_to_response_body
262
- cookies.encrypted["turbo_boost.token"] = {value: new_token, path: "/"}
263
- append_to_response_body turbo_stream.invoke("morph", args: [meta_tag], selector: "#turbo-boost")
259
+ def append_command_token_to_response_body
260
+ append_to_response_body turbo_stream.invoke("TurboBoost.Commands.token=", args: [new_token], camelize: false)
261
+ rescue => error
262
+ Rails.logger.error "TurboBoost::Commands::Runner failed to append the Command token to the response! #{error.message}"
263
+ end
264
+
265
+ def append_command_state_to_response_body
266
+ append_to_response_body turbo_stream.invoke("TurboBoost.State.initialize", args: [state.to_json, state.to_sgid_param], camelize: false)
264
267
  rescue => error
265
- Rails.logger.error "TurboBoost::Commands::Runner failed to append the meta tag to the response! #{error.message}"
268
+ Rails.logger.error "TurboBoost::Commands::Runner failed to append the Command state to the response! #{error.message}"
266
269
  end
267
270
 
268
271
  def append_success_event_to_response_body
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ class TurboBoost::Commands::State
4
+ include Enumerable
5
+
6
+ class << self
7
+ def from_sgid_param(sgid)
8
+ new URI::UID.from_sgid(sgid, for: name)&.decode
9
+ end
10
+
11
+ attr_reader :resolver
12
+
13
+ def assign_resolver(&block)
14
+ @resolver = block
15
+ end
16
+ end
17
+
18
+ def initialize(store = nil, provisional: false)
19
+ @store = store || ActiveSupport::Cache::MemoryStore.new(expires_in: 1.day, size: 2.kilobytes)
20
+ @store.cleanup
21
+ @provisional = provisional
22
+ end
23
+
24
+ delegate :to_json, to: :to_h
25
+ delegate_missing_to :store
26
+
27
+ def each
28
+ data.keys.each do |key|
29
+ yield key, self[key]
30
+ end
31
+ end
32
+
33
+ # Provisional state is for the current request/response and is exposed as `State#now`
34
+ # Standard state is preserved across multiple requests
35
+ def provisional?
36
+ !!@provisional
37
+ end
38
+
39
+ # TODO: implement state resolution
40
+ def resolve(client_state)
41
+ # return unless self.class.resolver
42
+ # self.class.resolver.call self, client_state
43
+ end
44
+
45
+ def now
46
+ return nil if provisional? # provisional state cannot hold child provisional state
47
+ @now ||= self.class.new(provisional: true)
48
+ end
49
+
50
+ def cache_key
51
+ "TurboBoost::Commands::State/#{Digest::SHA2.base64digest(to_json)}"
52
+ end
53
+
54
+ def read(...)
55
+ now&.read(...) || store.read(...)
56
+ end
57
+
58
+ def [](...)
59
+ read(...)
60
+ end
61
+
62
+ def []=(...)
63
+ write(...)
64
+ end
65
+
66
+ def to_sgid_param
67
+ store.cleanup
68
+ URI::UID.build(store, include_blank: false).to_sgid_param for: self.class.name, expires_in: 1.week
69
+ end
70
+
71
+ private
72
+
73
+ attr_reader :store
74
+
75
+ def data
76
+ store.instance_variable_get(:@data) || {}
77
+ end
78
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module TurboBoost
4
4
  module Commands
5
- VERSION = "0.0.18"
5
+ VERSION = "0.1.1"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turbo_boost-commands
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.18
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nate Hopkins (hopsoft)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-03 00:00:00.000000000 Z
11
+ date: 2024-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -44,14 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.0.8
47
+ version: 0.1.8
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 0.0.8
54
+ version: 0.1.8
55
+ - !ruby/object:Gem::Dependency
56
+ name: universalid
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.7
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.7
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: capybara
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -344,7 +358,6 @@ files:
344
358
  - README.md
345
359
  - app/assets/builds/@turbo-boost/commands.js
346
360
  - app/assets/builds/@turbo-boost/commands.js.map
347
- - app/assets/builds/@turbo-boost/commands.metafile.json
348
361
  - app/assets/images/apple-touch-icon.png
349
362
  - app/assets/images/favicon-16x16.png
350
363
  - app/assets/images/favicon-32x32.png
@@ -369,7 +382,6 @@ files:
369
382
  - app/javascript/index.js
370
383
  - app/javascript/lifecycle.js
371
384
  - app/javascript/logger.js
372
- - app/javascript/meta.js
373
385
  - app/javascript/renderer.js
374
386
  - app/javascript/schema.js
375
387
  - app/javascript/state/index.js
@@ -377,6 +389,7 @@ files:
377
389
  - app/javascript/turbo.js
378
390
  - app/javascript/urls.js
379
391
  - app/javascript/uuids.js
392
+ - app/javascript/version.js
380
393
  - lib/turbo_boost/commands.rb
381
394
  - lib/turbo_boost/commands/attribute_hydration.rb
382
395
  - lib/turbo_boost/commands/attribute_set.rb
@@ -390,12 +403,8 @@ files:
390
403
  - lib/turbo_boost/commands/patches/action_view_helpers_tag_helper_tag_builder_patch.rb
391
404
  - lib/turbo_boost/commands/runner.rb
392
405
  - lib/turbo_boost/commands/sanitizer.rb
406
+ - lib/turbo_boost/commands/state.rb
393
407
  - lib/turbo_boost/commands/version.rb
394
- - lib/turbo_boost/errors.rb
395
- - lib/turbo_boost/state.rb
396
- - lib/turbo_boost/state/errors.rb
397
- - lib/turbo_boost/state/manager.rb
398
- - lib/turbo_boost/state/provisional_state.rb
399
408
  homepage: https://github.com/hopsoft/turbo_boost-commands
400
409
  licenses:
401
410
  - MIT
@@ -411,7 +420,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
411
420
  requirements:
412
421
  - - ">="
413
422
  - !ruby/object:Gem::Version
414
- version: 2.7.5
423
+ version: '3.0'
415
424
  required_rubygems_version: !ruby/object:Gem::Requirement
416
425
  requirements:
417
426
  - - ">="
@@ -1 +0,0 @@
1
- {"inputs":{"app/javascript/meta.js":{"bytes":337,"imports":[],"format":"esm"},"app/javascript/events.js":{"bytes":783,"imports":[{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"app/javascript/state/observable.js":{"bytes":920,"imports":[{"path":"app/javascript/meta.js","kind":"import-statement","original":"../meta"},{"path":"app/javascript/events.js","kind":"import-statement","original":"../events"}],"format":"esm"},"app/javascript/state/index.js":{"bytes":1835,"imports":[{"path":"app/javascript/meta.js","kind":"import-statement","original":"../meta"},{"path":"app/javascript/state/observable.js","kind":"import-statement","original":"./observable"},{"path":"app/javascript/events.js","kind":"import-statement","original":"../events"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"app/javascript/renderer.js":{"bytes":475,"imports":[],"format":"esm"},"app/javascript/activity.js":{"bytes":279,"imports":[],"format":"esm"},"app/javascript/lifecycle.js":{"bytes":610,"imports":[{"path":"app/javascript/activity.js","kind":"import-statement","original":"./activity"},{"path":"app/javascript/events.js","kind":"import-statement","original":"./events"}],"format":"esm"},"app/javascript/turbo.js":{"bytes":1952,"imports":[{"path":"app/javascript/meta.js","kind":"import-statement","original":"./meta"},{"path":"app/javascript/state/index.js","kind":"import-statement","original":"./state"},{"path":"app/javascript/renderer.js","kind":"import-statement","original":"./renderer"},{"path":"app/javascript/events.js","kind":"import-statement","original":"./events"},{"path":"app/javascript/lifecycle.js","kind":"import-statement","original":"./lifecycle"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"app/javascript/schema.js":{"bytes":226,"imports":[{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"app/javascript/confirmation.js":{"bytes":947,"imports":[{"path":"app/javascript/events.js","kind":"import-statement","original":"./events"},{"path":"app/javascript/schema.js","kind":"import-statement","original":"./schema"}],"format":"esm"},"app/javascript/delegates.js":{"bytes":923,"imports":[{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"app/javascript/elements.js":{"bytes":1451,"imports":[{"path":"app/javascript/schema.js","kind":"import-statement","original":"./schema"},{"path":"app/javascript/lifecycle.js","kind":"import-statement","original":"./lifecycle"}],"format":"esm"},"app/javascript/drivers/form.js":{"bytes":384,"imports":[{"path":"app/javascript/meta.js","kind":"import-statement","original":"../meta"}],"format":"esm"},"app/javascript/urls.js":{"bytes":240,"imports":[],"format":"esm"},"app/javascript/drivers/frame.js":{"bytes":218,"imports":[{"path":"app/javascript/urls.js","kind":"import-statement","original":"../urls"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"app/javascript/drivers/method.js":{"bytes":265,"imports":[{"path":"app/javascript/urls.js","kind":"import-statement","original":"../urls"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"app/javascript/drivers/window.js":{"bytes":2033,"imports":[{"path":"app/javascript/meta.js","kind":"import-statement","original":"../meta"},{"path":"app/javascript/state/index.js","kind":"import-statement","original":"../state"},{"path":"app/javascript/events.js","kind":"import-statement","original":"../events"},{"path":"app/javascript/lifecycle.js","kind":"import-statement","original":"../lifecycle"},{"path":"app/javascript/urls.js","kind":"import-statement","original":"../urls"},{"path":"app/javascript/renderer.js","kind":"import-statement","original":"../renderer"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"app/javascript/drivers/index.js":{"bytes":2044,"imports":[{"path":"app/javascript/elements.js","kind":"import-statement","original":"../elements"},{"path":"app/javascript/drivers/form.js","kind":"import-statement","original":"./form"},{"path":"app/javascript/drivers/frame.js","kind":"import-statement","original":"./frame"},{"path":"app/javascript/drivers/method.js","kind":"import-statement","original":"./method"},{"path":"app/javascript/drivers/window.js","kind":"import-statement","original":"./window"}],"format":"esm"},"app/javascript/logger.js":{"bytes":729,"imports":[{"path":"app/javascript/events.js","kind":"import-statement","original":"./events"}],"format":"esm"},"app/javascript/uuids.js":{"bytes":202,"imports":[],"format":"esm"},"app/javascript/index.js":{"bytes":3558,"imports":[{"path":"app/javascript/turbo.js","kind":"import-statement","original":"./turbo"},{"path":"app/javascript/schema.js","kind":"import-statement","original":"./schema"},{"path":"app/javascript/events.js","kind":"import-statement","original":"./events"},{"path":"app/javascript/activity.js","kind":"import-statement","original":"./activity"},{"path":"app/javascript/confirmation.js","kind":"import-statement","original":"./confirmation"},{"path":"app/javascript/delegates.js","kind":"import-statement","original":"./delegates"},{"path":"app/javascript/drivers/index.js","kind":"import-statement","original":"./drivers"},{"path":"app/javascript/meta.js","kind":"import-statement","original":"./meta"},{"path":"app/javascript/elements.js","kind":"import-statement","original":"./elements"},{"path":"app/javascript/lifecycle.js","kind":"import-statement","original":"./lifecycle"},{"path":"app/javascript/logger.js","kind":"import-statement","original":"./logger"},{"path":"app/javascript/state/index.js","kind":"import-statement","original":"./state"},{"path":"app/javascript/urls.js","kind":"import-statement","original":"./urls"},{"path":"app/javascript/uuids.js","kind":"import-statement","original":"./uuids"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"app/assets/builds/@turbo-boost/commands.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":37542},"app/assets/builds/@turbo-boost/commands.js":{"imports":[],"exports":["default"],"entryPoint":"app/javascript/index.js","inputs":{"app/javascript/meta.js":{"bytesInOutput":252},"app/javascript/events.js":{"bytesInOutput":500},"app/javascript/state/observable.js":{"bytesInOutput":405},"app/javascript/state/index.js":{"bytesInOutput":762},"app/javascript/renderer.js":{"bytesInOutput":263},"app/javascript/activity.js":{"bytesInOutput":173},"app/javascript/lifecycle.js":{"bytesInOutput":294},"app/javascript/turbo.js":{"bytesInOutput":1024},"app/javascript/schema.js":{"bytesInOutput":166},"app/javascript/confirmation.js":{"bytesInOutput":424},"app/javascript/delegates.js":{"bytesInOutput":473},"app/javascript/elements.js":{"bytesInOutput":782},"app/javascript/drivers/form.js":{"bytesInOutput":246},"app/javascript/urls.js":{"bytesInOutput":166},"app/javascript/drivers/frame.js":{"bytesInOutput":96},"app/javascript/drivers/method.js":{"bytesInOutput":130},"app/javascript/drivers/window.js":{"bytesInOutput":1298},"app/javascript/drivers/index.js":{"bytesInOutput":991},"app/javascript/logger.js":{"bytesInOutput":399},"app/javascript/uuids.js":{"bytesInOutput":159},"app/javascript/index.js":{"bytesInOutput":1686}},"bytes":11186}}}
@@ -1,19 +0,0 @@
1
- class Meta {
2
- get element() {
3
- return document.querySelector('meta[name="turbo-boost"]')
4
- }
5
-
6
- get token() {
7
- return this.element.getAttribute('content')
8
- }
9
-
10
- get busy() {
11
- return this.element.dataset.busy === 'true'
12
- }
13
-
14
- set busy(value) {
15
- return (this.element.dataset.busy = !!value)
16
- }
17
- }
18
-
19
- export default new Meta()
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module TurboBoost
4
- class InvalidTokenError < StandardError
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class TurboBoost::State
4
- class DeserializationError < StandardError
5
- end
6
- end