Sha256: bf6bfda256ca72af7bbf5aef6f5c26b6dff7f177fd57b623cf0df28a021f5034

Contents?: true

Size: 1017 Bytes

Versions: 3

Compression:

Stored size: 1017 Bytes

Contents

# typed: strict
require "js_routes/types"

module JsRoutes
  # A Rack middleware that automatically updates routes file
  # whenever routes.rb is modified
  #
  # Inspired by
  # https://github.com/fnando/i18n-js/blob/v3/lib/i18n/js/middleware.rb
  class Middleware
    include JsRoutes::Types
    include RackApp

    extend T::Sig

    sig { params(app: T.untyped).void }
    def initialize(app)
      @app = app
      @digest = T.let(nil, T.nilable(String))
    end

    sig { override.params(env: StringHash).returns(UntypedArray) }
    def call(env)
      update_js_routes
      @app.call(env)
    end

    protected

    sig { void }
    def update_js_routes
      new_digest = fetch_digest
      unless new_digest == @digest
        regenerate
        @digest = new_digest
      end
    end

    sig { void }
    def regenerate
      JsRoutes.generate!(typed: true)
    end

    sig { returns(T.nilable(String)) }
    def fetch_digest
      JsRoutes.digest
    rescue Errno::ENOENT
      nil
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
js-routes-2.3.5 lib/js_routes/middleware.rb
js-routes-2.3.4 lib/js_routes/middleware.rb
js-routes-2.3.3 lib/js_routes/middleware.rb