Packages
tableau
0.29.0
0.30.0
0.29.0
0.28.0
0.27.1
0.27.0
0.26.1
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.1
0.17.0
0.16.0
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
Static site generator for elixir
Current section
Files
Jump to
Current section
Files
lib/tableau_dev_server/router.ex
defmodule TableauDevServer.Router do
@moduledoc false
use Plug.Router, init_mode: :runtime
use Plug.Debugger
require Logger
@base_path Path.join("/", Application.compile_env(:tableau, [:config, :base_path], ""))
@out_dir Application.compile_env(:tableau, [:config, :out_dir], "_site")
@not_found ~s'''
<!DOCTYPE html><html lang="en"><head></head><body>Not Found</body></html>
'''
plug :recompile
plug :rerender
plug TableauDevServer.IndexHtml
plug Plug.Static, at: @base_path, from: @out_dir, cache_control_for_etags: "no-cache"
plug :match
plug :dispatch
get "/ws/index.html" do
conn
|> WebSockAdapter.upgrade(TableauDevServer.Websocket, [], timeout: 60_000)
|> halt()
end
match _ do
Logger.error("File not found: #{conn.request_path}")
send_resp(conn, 404, @not_found)
end
defp recompile(conn, _) do
if conn.request_path == "/ws" do
conn
else
case WebDevUtils.CodeReloader.reload() do
{:error, errors} ->
errors = Enum.filter(errors, &(&1.severity == :error))
message =
errors
|> Enum.map_join("\n", & &1.message)
|> String.replace(~r/\x1B\[[0-9;]*m/, "")
stacktrace = List.first(errors).stacktrace
reraise CompileError, [description: message], stacktrace
_ ->
conn
end
end
end
defp rerender(conn, _) do
if conn.request_path != "/ws" do
Mix.Task.rerun("tableau.build", ["--out", @out_dir])
end
conn
end
end