Module: Sinatra::Inertia

Defined in:
lib/sinatra/inertia.rb,
lib/sinatra/inertia/errors.rb,
lib/sinatra/inertia/helpers.rb,
lib/sinatra/inertia/version.rb,
lib/sinatra/inertia/deferred.rb,
lib/sinatra/inertia/response.rb,
lib/sinatra/inertia/middleware.rb,
lib/sinatra/inertia/csrf_middleware.rb

Overview

Inertia.js v2 protocol adapter for Sinatra.

class App < Sinatra::Base
  register Sinatra::Inertia

  set :inertia_version, -> { ASSETS_VERSION }
  set :inertia_layout,  :layout

  inertia_share do
    { auth: { user: current_user }, flash: flash_payload }
  end

  get '/' do
    inertia 'Todos/Index', props: { todos: -> { Todo.all } }
  end
end

See README.md for the full feature matrix.

Defined Under Namespace

Modules: Helpers Classes: AlwaysProp, CSRFMiddleware, DeferredProp, LazyProp, MergeProp, Middleware, OptionalProp, Prop, Response

Constant Summary collapse

Error =
Class.new(StandardError)
InvalidProtocol =
Class.new(Error)
VERSION =
'0.1.2'

Class Method Summary collapse

Class Method Details

.always(value = nil, &block) ⇒ Object



76
# File 'lib/sinatra/inertia/deferred.rb', line 76

def always(value = nil, &block) = AlwaysProp.new(block: block, value: value)

.defer(group: 'default', &block) ⇒ Object



77
# File 'lib/sinatra/inertia/deferred.rb', line 77

def defer(group: 'default', &block) = DeferredProp.new(block: block, group: group)

.lazy(&block) ⇒ Object



79
# File 'lib/sinatra/inertia/deferred.rb', line 79

def lazy(&block) = LazyProp.new(block: block)

.merge(value = nil, &block) ⇒ Object



80
# File 'lib/sinatra/inertia/deferred.rb', line 80

def merge(value = nil, &block) = MergeProp.new(block: block, value: value)

.optional(&block) ⇒ Object



78
# File 'lib/sinatra/inertia/deferred.rb', line 78

def optional(&block) = OptionalProp.new(block: block)

.registered(app) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/sinatra/inertia.rb', line 33

def self.registered(app)
  # Default settings — consumers override with `set :inertia_*` in app.
  app.set :inertia_version, '1' unless app.respond_to?(:inertia_version)
  app.set :inertia_layout,  :layout unless app.respond_to?(:inertia_layout)
  app.set :inertia_encrypt_history, false unless app.respond_to?(:inertia_encrypt_history)
  app.set :inertia_csrf_protection, true unless app.respond_to?(:inertia_csrf_protection)
  app.set :inertia_share_blocks, []

  # Mount CSRF middleware (double-submit XSRF-TOKEN cookie that
  # @inertiajs/* clients honour). Opt-out via
  # `set :inertia_csrf_protection, false` when the consumer ships
  # its own (e.g. Rack::Protection::AuthenticityToken).
  if app.settings.inertia_csrf_protection
    app.use Sinatra::Inertia::CSRFMiddleware
  end

  # Mount protocol middleware (version mismatch + 303 redirect promotion).
  app.use Sinatra::Inertia::Middleware, version: -> { app.settings.inertia_version }

  # Class-level DSL: `inertia_share { ... }` registers a block whose
  # return value is merged into every page's `props.shared` payload.
  app.define_singleton_method(:inertia_share) do |&block|
    raise ArgumentError, 'inertia_share requires a block' unless block
    settings.inertia_share_blocks = settings.inertia_share_blocks + [block]
  end

  app.helpers Sinatra::Inertia::Helpers
end