Sha256: 9e2dc09f610741d439ed11dba9bc3df478591cc8af3f1563504a2f415d170e93

Contents?: true

Size: 1.11 KB

Versions: 1

Compression:

Stored size: 1.11 KB

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/main/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
      @routes_file = T.let(Rails.root.join("config/routes.rb"), Pathname)
      @mtime = T.let(nil, T.nilable(Time))
    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_mtime = routes_mtime
      unless new_mtime == @mtime
        regenerate
        @mtime = new_mtime
      end
    end

    sig { void }
    def regenerate
      JsRoutes.generate!
      JsRoutes.definitions! if JsRoutes.configuration.modern?
    end

    sig { returns(T.nilable(Time)) }
    def routes_mtime
      File.mtime(@routes_file)
    rescue Errno::ENOENT
      nil
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
js-routes-2.2.10 lib/js_routes/middleware.rb