Packages

phoenix_kit

1.7.200
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib phoenix_kit install endpoint_integration.ex
Raw

lib/phoenix_kit/install/endpoint_integration.ex

defmodule PhoenixKit.Install.EndpointIntegration do
@moduledoc """
Endpoint integration for PhoenixKit installation.
Previously, this module added the `phoenix_kit_socket()` macro to the parent app's
endpoint. This is no longer needed as the Sync websocket is now handled automatically
via `phoenix_kit_routes()` in the router.
This module now removes any existing deprecated `phoenix_kit_socket()` calls from
endpoints during installation/updates.
"""
use PhoenixKit.Install.IgniterCompat
alias Igniter.Code.{Common, Function}
alias Igniter.Project.Application
alias Igniter.Project.Deps
alias Igniter.Project.Module, as: IgniterModule
alias PhoenixKit.Install.IgniterHelpers
# PDF.js viewer assets are vendored in phoenix_kit_catalogue's
# `priv/static/pdfjs/` and the host endpoint must serve them at
# `/_pdfjs/` for the catalogue PDF viewer to load. Mounted only when the
# catalogue module is a dependency.
@pdfjs_static_mount """
plug Plug.Static,
at: "/_pdfjs",
from: {:phoenix_kit_catalogue, "priv/static/pdfjs"},
gzip: false\
"""
@doc """
Removes deprecated `phoenix_kit_socket()` and its import from the endpoint.
The `phoenix_kit_socket()` macro is deprecated. Sync websocket is now handled
automatically via `phoenix_kit_routes()` in the router.
## Parameters
- `igniter` - The igniter context
## Returns
Updated igniter with deprecated socket code and import removed.
"""
def add_endpoint_integration(igniter) do
igniter =
case find_endpoint(igniter) do
{igniter, nil} ->
# No endpoint found, nothing to clean up
igniter
{igniter, endpoint_module} ->
igniter
|> remove_deprecated_socket(endpoint_module)
|> remove_deprecated_import(endpoint_module)
end
add_pdfjs_static_mount(igniter)
end
@doc """
Ensures the host endpoint serves phoenix_kit_catalogue's vendored PDF.js
viewer at `/_pdfjs/` via a `Plug.Static` mount.
Only added when `:phoenix_kit_catalogue` is a dependency (the mount
references that app's `priv`, so adding it without the dep would break
boot). Idempotent — skips when an `at: "/_pdfjs"` mount already exists.
Called by both `mix phoenix_kit.install` and `mix phoenix_kit.update`.
"""
def add_pdfjs_static_mount(igniter) do
with true <- Deps.has_dep?(igniter, :phoenix_kit_catalogue),
{igniter, endpoint_module} when not is_nil(endpoint_module) <- find_endpoint(igniter),
{igniter, source, _zipper} <- IgniterModule.find_module!(igniter, endpoint_module),
false <- source |> Rewrite.Source.get(:content) |> String.contains?(~s(at: "/_pdfjs")) do
IgniterModule.find_and_update_module!(igniter, endpoint_module, fn zipper ->
case move_to_endpoint_use(zipper) do
{:ok, use_zipper} ->
{:ok, Common.add_code(use_zipper, @pdfjs_static_mount, placement: :after)}
:error ->
{:ok, zipper}
end
end)
else
# No catalogue dep, no endpoint, or mount already present.
_ -> igniter
end
end
# Locate `use Phoenix.Endpoint, otp_app: ...` so the static mount can be
# inserted right after it (early in the plug pipeline).
defp move_to_endpoint_use(zipper) do
Function.move_to_function_call(zipper, :use, 2, fn call_zipper ->
case Function.move_to_nth_argument(call_zipper, 0) do
{:ok, arg_zipper} -> Common.nodes_equal?(arg_zipper, Phoenix.Endpoint)
:error -> false
end
end)
end
# Find endpoint module
defp find_endpoint(igniter) do
case Application.app_name(igniter) do
:phoenix_kit ->
{igniter, nil}
_app_name ->
endpoint_module = IgniterHelpers.get_parent_app_module_web_endpoint(igniter)
case IgniterModule.module_exists(igniter, endpoint_module) do
{true, igniter} ->
{igniter, endpoint_module}
{false, igniter} ->
{igniter, nil}
end
end
end
# Remove phoenix_kit_socket() if it exists
defp remove_deprecated_socket(igniter, endpoint_module) do
IgniterModule.find_and_update_module!(igniter, endpoint_module, fn zipper ->
case Function.move_to_function_call(zipper, :phoenix_kit_socket, 0) do
{:ok, socket_zipper} ->
# Remove the deprecated phoenix_kit_socket() call
zipper_after_removal = Sourceror.Zipper.remove(socket_zipper)
{:ok, zipper_after_removal}
:error ->
# phoenix_kit_socket() not found, nothing to remove
{:ok, zipper}
end
end)
end
# Remove import PhoenixKitWeb.Integration if it exists
defp remove_deprecated_import(igniter, endpoint_module) do
IgniterModule.find_and_update_module!(igniter, endpoint_module, fn zipper ->
case find_integration_import(zipper) do
{:ok, import_zipper} ->
# Remove the deprecated import
zipper_after_removal = Sourceror.Zipper.remove(import_zipper)
{:ok, zipper_after_removal}
:error ->
# Import not found, nothing to remove
{:ok, zipper}
end
end)
end
# Find import PhoenixKitWeb.Integration
defp find_integration_import(zipper) do
Function.move_to_function_call(zipper, :import, 1, fn call_zipper ->
case Function.move_to_nth_argument(call_zipper, 0) do
{:ok, arg_zipper} -> Common.nodes_equal?(arg_zipper, PhoenixKitWeb.Integration)
:error -> false
end
end)
end
end