From 2dce6268848f927b7634f34891164f94a27b65c9 Mon Sep 17 00:00:00 2001 From: Herman verschooten Date: Sun, 12 Oct 2025 15:07:58 +0200 Subject: [PATCH 1/2] feat: add support for SiteEncrypt.Phoenix.Endpoint detection Enhanced endpoint detection functions to support SiteEncrypt.Phoenix.Endpoint in addition to Phoenix.Endpoint. This allows Igniter to work with projects that use SiteEncrypt for automatic SSL certificate management. Changes: - Updated select_endpoint/3 to detect both Phoenix.Endpoint and SiteEncrypt.Phoenix.Endpoint - Updated endpoints_for_router/2 to detect both endpoint types - Added comprehensive tests for SiteEncrypt.Phoenix.Endpoint support --- lib/igniter/libs/phoenix.ex | 19 +++--- test/igniter/libs/phoenix_test.exs | 98 ++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 7 deletions(-) diff --git a/lib/igniter/libs/phoenix.ex b/lib/igniter/libs/phoenix.ex index 331a887..185693c 100644 --- a/lib/igniter/libs/phoenix.ex +++ b/lib/igniter/libs/phoenix.ex @@ -91,18 +91,22 @@ defmodule Igniter.Libs.Phoenix do {Igniter.t(), list(module())} def endpoints_for_router(igniter, router) do Igniter.Project.Module.find_all_matching_modules(igniter, fn _module, zipper -> - with {:ok, _} <- Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint), - {:ok, _} <- - Igniter.Code.Function.move_to_function_call_in_current_scope( + uses_endpoint? = + Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint) != :error || + Igniter.Code.Module.move_to_use(zipper, SiteEncrypt.Phoenix.Endpoint) != :error + + if uses_endpoint? do + case Igniter.Code.Function.move_to_function_call_in_current_scope( zipper, :plug, [1, 2], &Igniter.Code.Function.argument_equals?(&1, 0, router) ) do - true + {:ok, _} -> true + _ -> false + end else - _ -> - false + false end end) end @@ -130,7 +134,8 @@ defmodule Igniter.Libs.Phoenix do else {igniter, endpoints} = Igniter.Project.Module.find_all_matching_modules(igniter, fn _mod, zipper -> - Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint) != :error + Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint) != :error || + Igniter.Code.Module.move_to_use(zipper, SiteEncrypt.Phoenix.Endpoint) != :error end) case endpoints do diff --git a/test/igniter/libs/phoenix_test.exs b/test/igniter/libs/phoenix_test.exs index 230b6ab..c528489 100644 --- a/test/igniter/libs/phoenix_test.exs +++ b/test/igniter/libs/phoenix_test.exs @@ -322,6 +322,104 @@ defmodule Igniter.Libs.PhoenixTest do end end + describe "select_endpoint/3" do + test "finds endpoints using Phoenix.Endpoint" do + igniter = + assert test_project() + |> Igniter.create_new_file("lib/test_web/endpoint.ex", """ + defmodule TestWeb.Endpoint do + use Phoenix.Endpoint, otp_app: :test + end + """) + |> apply_igniter!() + + {_igniter, endpoint} = Igniter.Libs.Phoenix.select_endpoint(igniter) + assert endpoint == TestWeb.Endpoint + end + + test "finds endpoints using SiteEncrypt.Phoenix.Endpoint" do + igniter = + assert test_project() + |> Igniter.create_new_file("lib/test_web/endpoint.ex", """ + defmodule TestWeb.Endpoint do + use SiteEncrypt.Phoenix.Endpoint, otp_app: :test + end + """) + |> apply_igniter!() + + {_igniter, endpoint} = Igniter.Libs.Phoenix.select_endpoint(igniter) + assert endpoint == TestWeb.Endpoint + end + + test "finds multiple endpoints using both Phoenix.Endpoint and SiteEncrypt.Phoenix.Endpoint" do + igniter = + assert test_project() + |> Igniter.create_new_file("lib/test_web/endpoint.ex", """ + defmodule TestWeb.Endpoint do + use Phoenix.Endpoint, otp_app: :test + end + """) + |> Igniter.create_new_file("lib/admin_web/endpoint.ex", """ + defmodule AdminWeb.Endpoint do + use SiteEncrypt.Phoenix.Endpoint, otp_app: :test + end + """) + |> apply_igniter!() + + {_igniter, endpoints} = + Igniter.Project.Module.find_all_matching_modules(igniter, fn _mod, zipper -> + Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint) != :error || + Igniter.Code.Module.move_to_use(zipper, SiteEncrypt.Phoenix.Endpoint) != :error + end) + + assert TestWeb.Endpoint in endpoints + assert AdminWeb.Endpoint in endpoints + assert length(endpoints) == 2 + end + end + + describe "endpoints_for_router/2" do + test "finds Phoenix.Endpoint that uses a router" do + igniter = + assert test_project() + |> Igniter.create_new_file("lib/test_web/router.ex", """ + defmodule TestWeb.Router do + use Phoenix.Router + end + """) + |> Igniter.create_new_file("lib/test_web/endpoint.ex", """ + defmodule TestWeb.Endpoint do + use Phoenix.Endpoint, otp_app: :test + plug TestWeb.Router + end + """) + |> apply_igniter!() + + {_igniter, endpoints} = Igniter.Libs.Phoenix.endpoints_for_router(igniter, TestWeb.Router) + assert TestWeb.Endpoint in endpoints + end + + test "finds SiteEncrypt.Phoenix.Endpoint that uses a router" do + igniter = + assert test_project() + |> Igniter.create_new_file("lib/test_web/router.ex", """ + defmodule TestWeb.Router do + use Phoenix.Router + end + """) + |> Igniter.create_new_file("lib/test_web/endpoint.ex", """ + defmodule TestWeb.Endpoint do + use SiteEncrypt.Phoenix.Endpoint, otp_app: :test + plug TestWeb.Router + end + """) + |> apply_igniter!() + + {_igniter, endpoints} = Igniter.Libs.Phoenix.endpoints_for_router(igniter, TestWeb.Router) + assert TestWeb.Endpoint in endpoints + end + end + describe "append_to_scope/4" do setup do router = """ From e446cd2d8e927cf1d711ba61a66d94d85cac3685 Mon Sep 17 00:00:00 2001 From: Herman verschooten Date: Tue, 14 Oct 2025 17:29:39 +0200 Subject: [PATCH 2/2] refactor: use module attribute for endpoint types As suggested in PR review, refactored the endpoint detection to use a module attribute @endpoint_modules and Enum.find_value/2 to check for matching endpoint types. This makes it easier to add more endpoint types in the future and reduces code duplication. --- lib/igniter/libs/phoenix.ex | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/igniter/libs/phoenix.ex b/lib/igniter/libs/phoenix.ex index 185693c..ef2a266 100644 --- a/lib/igniter/libs/phoenix.ex +++ b/lib/igniter/libs/phoenix.ex @@ -1,6 +1,8 @@ defmodule Igniter.Libs.Phoenix do @moduledoc "Codemods & utilities for working with Phoenix" + @endpoint_modules [Phoenix.Endpoint, SiteEncrypt.Phoenix.Endpoint] + @doc """ Returns the web module name for the current app """ @@ -92,8 +94,9 @@ defmodule Igniter.Libs.Phoenix do def endpoints_for_router(igniter, router) do Igniter.Project.Module.find_all_matching_modules(igniter, fn _module, zipper -> uses_endpoint? = - Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint) != :error || - Igniter.Code.Module.move_to_use(zipper, SiteEncrypt.Phoenix.Endpoint) != :error + Enum.find_value(@endpoint_modules, fn endpoint_module -> + Igniter.Code.Module.move_to_use(zipper, endpoint_module) != :error + end) if uses_endpoint? do case Igniter.Code.Function.move_to_function_call_in_current_scope( @@ -134,8 +137,9 @@ defmodule Igniter.Libs.Phoenix do else {igniter, endpoints} = Igniter.Project.Module.find_all_matching_modules(igniter, fn _mod, zipper -> - Igniter.Code.Module.move_to_use(zipper, Phoenix.Endpoint) != :error || - Igniter.Code.Module.move_to_use(zipper, SiteEncrypt.Phoenix.Endpoint) != :error + Enum.find_value(@endpoint_modules, fn endpoint_module -> + Igniter.Code.Module.move_to_use(zipper, endpoint_module) != :error + end) end) case endpoints do