From f24878d3be051d93adf0d48ad30f3e2a8392299d Mon Sep 17 00:00:00 2001 From: Mitchell Hanberg Date: Tue, 15 Sep 2026 08:43:32 -0400 Subject: [PATCH 1/2] feat!: extract TableauDevServer The dev server (which provides `mix tableau.server`) is extracted to its own package that sites need to install separately. This allows you to only install it in the dev and test envs, so when you deploy there is less to download and compile. Luckily almost everything was designed to be extracted as is. The new dev server lives at https://github.com/elixir-tools/tableau_dev_server --- lib/mix/tasks/tableau.build.ex | 2 +- lib/mix/tasks/tableau.server.ex | 24 ------- lib/tableau.ex | 9 --- .../build_exception.ex | 2 +- lib/tableau_dev_server/application.ex | 13 ---- lib/tableau_dev_server/index_html.ex | 42 ------------ lib/tableau_dev_server/router.ex | 66 ------------------- lib/tableau_dev_server/server.ex | 9 --- lib/tableau_dev_server/server_supervisor.ex | 29 -------- lib/tableau_dev_server/websocket.ex | 31 --------- mix.exs | 6 +- mix.lock | 12 +--- 12 files changed, 4 insertions(+), 241 deletions(-) delete mode 100644 lib/mix/tasks/tableau.server.ex rename lib/{tableau_dev_server => tableau}/build_exception.ex (93%) delete mode 100644 lib/tableau_dev_server/application.ex delete mode 100644 lib/tableau_dev_server/index_html.ex delete mode 100644 lib/tableau_dev_server/router.ex delete mode 100644 lib/tableau_dev_server/server.ex delete mode 100644 lib/tableau_dev_server/server_supervisor.ex delete mode 100644 lib/tableau_dev_server/websocket.ex diff --git a/lib/mix/tasks/tableau.build.ex b/lib/mix/tasks/tableau.build.ex index cffa01b..eef830d 100644 --- a/lib/mix/tasks/tableau.build.ex +++ b/lib/mix/tasks/tableau.build.ex @@ -52,7 +52,7 @@ defmodule Mix.Tasks.Tableau.Build do Map.merge(page, %{body: content, permalink: permalink}) rescue exception -> - reraise TableauDevServer.BuildException, [page: page, exception: exception], __STACKTRACE__ + reraise Tableau.BuildException, [page: page, exception: exception], __STACKTRACE__ end end) |> Stream.map(fn diff --git a/lib/mix/tasks/tableau.server.ex b/lib/mix/tasks/tableau.server.ex deleted file mode 100644 index bdf99ea..00000000 --- a/lib/mix/tasks/tableau.server.ex +++ /dev/null @@ -1,24 +0,0 @@ -defmodule Mix.Tasks.Tableau.Server do - @shortdoc "Starts the tableau dev server" - - @moduledoc "Starts the tableau dev server" - use Mix.Task - - require Logger - - @impl Mix.Task - def run(_args) do - Application.put_env(:tableau, :server, true) - Code.put_compiler_option(:ignore_module_conflict, true) - - Logger.debug("server started on http://localhost:4999#{basepath()}") - - Mix.Task.run("app.start", ["--preload-modules"]) - - Mix.Tasks.Run.run(["--no-halt"]) - end - - defp basepath do - Path.join("/", Application.get_env(:tableau, :config)[:base_path] || "") - end -end diff --git a/lib/tableau.ex b/lib/tableau.ex index 49c2ff4..a3b0619 100644 --- a/lib/tableau.ex +++ b/lib/tableau.ex @@ -48,15 +48,6 @@ defmodule Tableau do ``` """ - @doc """ - Component to connect to the development server via websocket to broadcast that the page should reload. - - By default, connects to `'ws://' + location.host + '/ws'`. - - See `WebDevUtils.Components.live_reload/1` for configuration options. - """ - defdelegate live_reload(assigns), to: WebDevUtils.Components - @doc """ Convert markdown content to HTML using `MDEx.to_html!/2`. diff --git a/lib/tableau_dev_server/build_exception.ex b/lib/tableau/build_exception.ex similarity index 93% rename from lib/tableau_dev_server/build_exception.ex rename to lib/tableau/build_exception.ex index eb4560f..ca89cbf 100644 --- a/lib/tableau_dev_server/build_exception.ex +++ b/lib/tableau/build_exception.ex @@ -1,4 +1,4 @@ -defmodule TableauDevServer.BuildException do +defmodule Tableau.BuildException do @moduledoc false @type t :: %__MODULE__{ page: map(), diff --git a/lib/tableau_dev_server/application.ex b/lib/tableau_dev_server/application.ex deleted file mode 100644 index 63a2fa4..00000000 --- a/lib/tableau_dev_server/application.ex +++ /dev/null @@ -1,13 +0,0 @@ -defmodule TableauDevServer.Application do - @moduledoc false - - use Application - - @impl true - def start(_type, _args) do - children = [TableauDevServer.ServerSupervisor] - - opts = [strategy: :one_for_one, name: TableauDevServer.Supervisor] - Supervisor.start_link(children, opts) - end -end diff --git a/lib/tableau_dev_server/index_html.ex b/lib/tableau_dev_server/index_html.ex deleted file mode 100644 index 4a35298..00000000 --- a/lib/tableau_dev_server/index_html.ex +++ /dev/null @@ -1,42 +0,0 @@ -defmodule TableauDevServer.IndexHtml do - @moduledoc false - - @behaviour Plug - - @doc ~S""" - Initialize plug options - - - at: The request path to reach for static assets, defaults to "/" - - default_file: Filename to serve when request path is a directory, defaults to "index.html" - - ## Example - - iex> Plug.Static.IndexHtml.init(at: "/doc") - [matcher: ~r|^/doc/(.*/)?$|, default_file: "index.html"] - """ - def init(opts), do: Keyword.merge([default_file: "index.html"], opts) - - @doc """ - Invokes the plug, adding default_file to request_path and path_info for directory paths - - ## Example - - iex> opts = Plug.Static.IndexHtml.init(at: "/doc") - iex> conn = %Plug.Conn{request_path: "/doc/a/", path_info: ["doc", "a"]} - iex> Plug.Static.IndexHtml.call(conn, opts) |> Map.take([:request_path, :path_info]) - %{path_info: ["doc", "a", "index.html"], request_path: "/doc/a/index.html"} - """ - def call(conn, default_file: filename) do - case Path.extname(conn.request_path) do - "" -> - %{ - conn - | request_path: String.replace_suffix(conn.request_path, "/", "") <> "/#{filename}", - path_info: conn.path_info ++ [filename] - } - - _ -> - conn - end - end -end diff --git a/lib/tableau_dev_server/router.ex b/lib/tableau_dev_server/router.ex deleted file mode 100644 index 8e236ac..00000000 --- a/lib/tableau_dev_server/router.ex +++ /dev/null @@ -1,66 +0,0 @@ -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''' - Not Found - ''' - - 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 diff --git a/lib/tableau_dev_server/server.ex b/lib/tableau_dev_server/server.ex deleted file mode 100644 index 9da5c08..00000000 --- a/lib/tableau_dev_server/server.ex +++ /dev/null @@ -1,9 +0,0 @@ -defmodule TableauDevServer.Server do - @moduledoc false - def child_spec(_) do - Supervisor.child_spec( - {Bandit, scheme: :http, plug: TableauDevServer.Router, port: 4999}, - [] - ) - end -end diff --git a/lib/tableau_dev_server/server_supervisor.ex b/lib/tableau_dev_server/server_supervisor.ex deleted file mode 100644 index b3cf271..00000000 --- a/lib/tableau_dev_server/server_supervisor.ex +++ /dev/null @@ -1,29 +0,0 @@ -defmodule TableauDevServer.ServerSupervisor do - @moduledoc false - use Supervisor - - def start_link(init_arg) do - Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__) - end - - @impl true - def init(_init_arg) do - if Application.get_env(:tableau, :server) do - children = [ - WebDevUtils.FileSystem, - TableauDevServer.Server, - WebDevUtils.CodeReloader - ] - - Supervisor.init(children ++ asset_children(), strategy: :one_for_one) - else - :ignore - end - end - - def asset_children do - for conf <- Application.get_env(:tableau, :assets, []) do - {WebDevUtils.Assets, conf} - end - end -end diff --git a/lib/tableau_dev_server/websocket.ex b/lib/tableau_dev_server/websocket.ex deleted file mode 100644 index 2ab4555..00000000 --- a/lib/tableau_dev_server/websocket.ex +++ /dev/null @@ -1,31 +0,0 @@ -defmodule TableauDevServer.Websocket do - @moduledoc false - require Logger - - def init(_args) do - :ok = WebDevUtils.LiveReload.init() - {:ok, %{reloader: Application.get_env(:tableau, :reloader, patterns: [])}} - end - - def handle_in({"subscribe", [opcode: :text]}, state) do - {:push, {:text, "subscribed"}, state} - end - - def handle_info(:reload, state) do - {:push, {:text, "reload"}, state} - end - - def handle_info({:file_event, watcher_pid, {path, event}}, state) do - WebDevUtils.LiveReload.reload!({:file_event, watcher_pid, {Path.relative_to_cwd(path), event}}, - patterns: state.reloader[:patterns] - ) - - {:ok, state} - end - - def handle_info(message, state) do - Logger.warning("Unhandled message: #{inspect(message)}") - - {:ok, state} - end -end diff --git a/mix.exs b/mix.exs index 77b4045..a14124c 100644 --- a/mix.exs +++ b/mix.exs @@ -21,8 +21,7 @@ defmodule Tableau.MixProject do # Run "mix help compile.app" to learn about applications. def application do [ - extra_applications: [:logger, :inets], - mod: {TableauDevServer.Application, []} + extra_applications: [:logger] ] end @@ -33,7 +32,6 @@ defmodule Tableau.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ - {:bandit, "~> 1.0"}, {:date_time_parser, "~> 1.2"}, {:html_entities, "~> 0.5.2"}, {:libgraph, "~> 0.16.0"}, @@ -41,8 +39,6 @@ defmodule Tableau.MixProject do {:schematic, "~> 0.5.1"}, {:slugify, "~> 1.3"}, {:tz, "~> 0.28.1"}, - {:web_dev_utils, "~> 0.3"}, - {:websock_adapter, "~> 0.5"}, {:yaml_elixir, "~> 2.9"}, # dev diff --git a/mix.lock b/mix.lock index 7c899a1..9d2f47f 100644 --- a/mix.lock +++ b/mix.lock @@ -1,36 +1,26 @@ %{ - "bandit": {:hex, :bandit, "1.12.0", "6c5214daa2469644ac4ab0113b98abc24f75e348378e6a974c6343b3e5da22ef", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.18", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.5", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "45dac82dc86f45cf4a196dee9cc5a8b791d9c9469d996055f055e6ee36c66e20"}, "date_time_parser": {:hex, :date_time_parser, "1.3.0", "6ba16850b5ab83dd126576451023ab65349e29af2336ca5084aa1e37025b476e", [:mix], [{:kday, "~> 1.0", [hex: :kday, repo: "hexpm", optional: false]}], "hexpm", "93c8203a8ddc66b1f1531fc0e046329bf0b250c75ffa09567ef03d2c09218e8c"}, "earmark_parser": {:hex, :earmark_parser, "1.4.45", "cba8369ab2a1342e419bc2760eec731b17be828941dcf494045d44766227e1d5", [:mix], [], "hexpm", "d3ec045bf122965db20c0bdb420e19ee1415843135327124918473feb4b328e8"}, "ex_doc": {:hex, :ex_doc, "0.40.3", "4a972ffe64bc07dc605af487e98fc19b72a4185f55ca031b94c0552d6071c1d9", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "2756e357742fecd9749b489b85d67c9ce99c465f2e75728d9e6dc8d704b973de"}, - "file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"}, "floki": {:hex, :floki, "0.38.4", "10f98971e892aed2c2f1b3a0f928e488e3797e1c6dd3dfd98db40b14e9a78bcf", [:mix], [], "hexpm", "bdb34645eee8e79845c7edaca2d4099a52804ee4d4a3ecc683a69451f0244973"}, - "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, "jason": {:hex, :jason, "1.4.5", "2e3a008590b0b8d7388c20293e9dcc9cf3e5d642fd2a114e4cbbb52e595d940a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b0c823996102bcd0239b3c2444eb00409b72f6a140c1950bc8b457d836b30684"}, "kday": {:hex, :kday, "1.1.0", "64efac85279a12283eaaf3ad6f13001ca2dff943eda8c53288179775a8c057a0", [:mix], [{:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}], "hexpm", "69703055d63b8d5b260479266c78b0b3e66f7aecdd2022906cd9bf09892a266d"}, "libgraph": {:hex, :libgraph, "0.16.0", "3936f3eca6ef826e08880230f806bfea13193e49bf153f93edcf0239d4fd1d07", [:mix], [], "hexpm", "41ca92240e8a4138c30a7e06466acc709b0cbb795c643e9e17174a178982d6bf"}, - "lumis": {:hex, :lumis, "0.6.1", "2ccc82748dd2ae1d955367c3dfa2d216e311dbde732ede01688b1269a4510137", [:mix], [{:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:rustler, "~> 0.29", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.6", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "9ccb48fad46452631e57c6cbcc96d4181e5e8479b4340192478ca360380eeaa2"}, + "lumis": {:hex, :lumis, "0.6.3", "a14ea311298e45f31f3dff17d3b41b9717c0757ce1aa5275e190e46aa95ea04d", [:mix], [{:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:rustler, "~> 0.29", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.6", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "c0b3dd853f5d44a604202a732fe8c4d0575c4cca263d4e2b4a6f7794d00fab6e"}, "makeup": {:hex, :makeup, "1.2.2", "882d46dc0905e9ff7abf2aab61a7e6b3dcc555533977d8a23b06019e6c89ac94", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "9a1a24e5b343b8ae16abea0822c10a6f75da27af7fa802ada5251f7579bfccfa"}, "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, "makeup_erlang": {:hex, :makeup_erlang, "1.1.0", "835f7e60792e08824cda445639555d7bf1bbbddb1b60b306e33cb6f6db24dc74", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "1cd6780fb1dd1a03979abaed0fe82712b0625118fd5257d3ebbf73f960c73c3c"}, "mdex": {:hex, :mdex, "0.11.7", "583b35c7160c4e26deab6233f967669d51de6f8b5f7b605adc55037abf7a20d2", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:lumis, "~> 0.1", [hex: :lumis, repo: "hexpm", optional: false]}, {:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:rustler, "~> 0.32", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "6dac3deb3ecb1a0a5ac9f383c9c57e46510b0a519e6fb21883d9ead34d0e4ffd"}, "mdex_native": {:hex, :mdex_native, "0.2.4", "a74b9d799d3fc487b1f97b70ee9b04108c7af0514920d56828e173d19312c2a9", [:mix], [{:rustler, "~> 0.32", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "d71185c43c5209c6939f4b65f903f71c892512c93ea6843171227855d2d976f5"}, - "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, - "plug": {:hex, :plug, "1.20.2", "adbee2441232412e37fbb357fd5e4cd533fdd253b29f2e1992262b0f1fb01462", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b16baf55877d60891002ffc1ce0b3ff7d6f30a38a23e02e4d4293c4ac266f136"}, - "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.9.0", "3a052eda09f3d2436364645cc1f13279cf95db310eb0c17b0d8f25484b233aa0", [:mix], [{:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "471d97315bd3bf7b64623418b3693eedd8e47de3d1cb79a0ac8f9da7d770d94c"}, "schematic": {:hex, :schematic, "0.5.2", "07b666b971b780bcfbae7a5032945886dc9fb7e31834d7438c6e572ef80c2866", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cef597a88260823a806c106071213bd85670b855007cd70e21284a716fe44348"}, "slugify": {:hex, :slugify, "1.3.1", "0d3b8b7e5c1eeaa960e44dce94382bee34a39b3ea239293e457a9c5b47cc6fd3", [:mix], [], "hexpm", "cb090bbeb056b312da3125e681d98933a360a70d327820e4b7f91645c4d8be76"}, "styler": {:hex, :styler, "1.11.0", "35010d970689a23c2bcc8e97bd8bf7d20e3561d60c49be84654df5c37d051a9c", [:mix], [], "hexpm", "70f36165d0cf238a32b7a456fdef6a9c72e77e657d7ac4a0ace33aeba3f2b8c0"}, "telemetry": {:hex, :telemetry, "1.4.2", "a0cb522801dffb1c49fe6e30561badffc7b6d0e180db1300df759faa22062855", [:rebar3], [], "hexpm", "928f6495066506077862c0d1646609eed891a4326bee3126ba54b60af61febb1"}, - "thousand_island": {:hex, :thousand_island, "1.5.0", "f50a213cac97262b6d5ebb85745aa2c00fec1413191e6e66834788d45425cecb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "708923d40523e43cf99041ab37a0d4b0ec426ac6438fa3716ab23d919eaeb412"}, "tz": {:hex, :tz, "0.28.2", "6c47f3d1a8ee5c33a1d8f0ba49e5a851b0a30c408a587d907aff6e71228b3b32", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:mint, "~> 1.6", [hex: :mint, repo: "hexpm", optional: true]}], "hexpm", "a6bf7355a33f0a7511602ab4566432ac0901d8abff81e94e455bca19708a0c87"}, - "web_dev_utils": {:hex, :web_dev_utils, "0.3.0", "463f3695dcdee9a6f18dbc783ee76f0ecdd1c9a489a6482aadcf166b3e5fee12", [:mix], [{:file_system, "~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "c239d4d24bfc61110a98b7d75bb7bbbb1752a5d8fcb5a2d369c5d4f64d1d7aec"}, - "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, - "websock_adapter": {:hex, :websock_adapter, "0.6.0", "73db5ab8aaefd1a876a97ce3e6afc96562625de69ef17a4e04426e034849d0b8", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "50021a85bce8f203b086705d9e0c5415e2c7eb05d319111b0428fe71f9934617"}, "yamerl": {:hex, :yamerl, "0.10.0", "4ff81fee2f1f6a46f1700c0d880b24d193ddb74bd14ef42cb0bcf46e81ef2f8e", [:rebar3], [], "hexpm", "346adb2963f1051dc837a2364e4acf6eb7d80097c0f53cbdc3046ec8ec4b4e6e"}, "yaml_elixir": {:hex, :yaml_elixir, "2.12.2", "9dd1330fb4cd9a36a7b0f502e5b12486eff632792ee4a5f0eba52a4d4ec32c9c", [:mix], [{:yamerl, "~> 0.10", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "e7c1b10122f973e6558462d51c39026ba0e14afbc6745318e990ea82cfe9e159"}, } From 65570ceb30b091e515c50bada62d24e157894b31 Mon Sep 17 00:00:00 2001 From: Mitchell Hanberg Date: Tue, 15 Sep 2026 09:28:18 -0400 Subject: [PATCH 2/2] fixup! feat!: extract TableauDevServer --- .formatter.exs | 2 +- mix.lock | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.formatter.exs b/.formatter.exs index 8c0683e..17fe611 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -5,7 +5,7 @@ locals_without_parens = [ [ locals_without_parens: locals_without_parens, - import_deps: [:plug], + import_deps: [], plugins: [Styler], inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"], export: [locals_without_parens: locals_without_parens] diff --git a/mix.lock b/mix.lock index 9d2f47f..38c835c 100644 --- a/mix.lock +++ b/mix.lock @@ -12,7 +12,6 @@ "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, "makeup_erlang": {:hex, :makeup_erlang, "1.1.0", "835f7e60792e08824cda445639555d7bf1bbbddb1b60b306e33cb6f6db24dc74", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "1cd6780fb1dd1a03979abaed0fe82712b0625118fd5257d3ebbf73f960c73c3c"}, "mdex": {:hex, :mdex, "0.11.7", "583b35c7160c4e26deab6233f967669d51de6f8b5f7b605adc55037abf7a20d2", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:lumis, "~> 0.1", [hex: :lumis, repo: "hexpm", optional: false]}, {:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:rustler, "~> 0.32", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "6dac3deb3ecb1a0a5ac9f383c9c57e46510b0a519e6fb21883d9ead34d0e4ffd"}, - "mdex_native": {:hex, :mdex_native, "0.2.4", "a74b9d799d3fc487b1f97b70ee9b04108c7af0514920d56828e173d19312c2a9", [:mix], [{:rustler, "~> 0.32", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "d71185c43c5209c6939f4b65f903f71c892512c93ea6843171227855d2d976f5"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.9.0", "3a052eda09f3d2436364645cc1f13279cf95db310eb0c17b0d8f25484b233aa0", [:mix], [{:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "471d97315bd3bf7b64623418b3693eedd8e47de3d1cb79a0ac8f9da7d770d94c"},