Current section
8 Versions
Jump to
Current section
8 Versions
Compare versions
4
files changed
+34
additions
-14
deletions
| @@ -1,5 +1,9 @@ | |
| 1 1 | # Changelog |
| 2 2 | |
| 3 | + ## v0.3.4 |
| 4 | + |
| 5 | + - Avoid `Mix.Project.config/0` at runtime when resolving the icon manifest path in OTP releases by using configured or discovered application priv directories |
| 6 | + |
| 3 7 | ## v0.3.3 |
| 4 8 | |
| 5 9 | - Fix HEEx icon discovery with Phoenix LiveView 1.2 tag engine parser |
| @@ -1,7 +1,7 @@ | |
| 1 1 | {<<"links">>, |
| 2 2 | [{<<"GitHub">>,<<"https://github.com/elixir-volt/phoenix_iconify">>}]}. |
| 3 3 | {<<"name">>,<<"phoenix_iconify">>}. |
| 4 | - {<<"version">>,<<"0.3.3">>}. |
| 4 | + {<<"version">>,<<"0.3.4">>}. |
| 5 5 | {<<"description">>, |
| 6 6 | <<"Phoenix components for Iconify icons with compile-time discovery">>}. |
| 7 7 | {<<"elixir">>,<<"~> 1.19">>}. |
| @@ -12,19 +12,13 @@ defmodule PhoenixIconify.Manifest do | |
| 12 12 | Returns the path to the manifest file for the given application. |
| 13 13 | """ |
| 14 14 | def manifest_path(app \\ nil) do |
| 15 | - app = app || Application.get_env(:phoenix_iconify, :otp_app) || Mix.Project.config()[:app] |
| 15 | + app = app || Application.get_env(:phoenix_iconify, :otp_app) || mix_project_app() |
| 16 16 | |
| 17 | - priv_dir = |
| 18 | - if app do |
| 19 | - case :code.priv_dir(app) do |
| 20 | - {:error, :bad_name} -> "priv" |
| 21 | - path -> List.to_string(path) |
| 22 | - end |
| 23 | - else |
| 24 | - "priv" |
| 25 | - end |
| 26 | - |
| 27 | - Path.join([priv_dir, "iconify", @manifest_filename]) |
| 17 | + if app do |
| 18 | + Path.join([priv_dir(app), "iconify", @manifest_filename]) |
| 19 | + else |
| 20 | + discover_manifest_path() || Path.join(["priv", "iconify", @manifest_filename]) |
| 21 | + end |
| 28 22 | end |
| 29 23 | |
| 30 24 | @doc """ |
| @@ -107,6 +101,28 @@ defmodule PhoenixIconify.Manifest do | |
| 107 101 | get_icons() |> map_size() |
| 108 102 | end |
| 109 103 | |
| 104 | + defp priv_dir(app) do |
| 105 | + case :code.priv_dir(app) do |
| 106 | + {:error, :bad_name} -> "priv" |
| 107 | + path -> List.to_string(path) |
| 108 | + end |
| 109 | + end |
| 110 | + |
| 111 | + defp discover_manifest_path do |
| 112 | + :application.loaded_applications() |
| 113 | + |> Enum.map(fn {app, _description, _version} -> app end) |
| 114 | + |> Enum.sort() |
| 115 | + |> Enum.reject(&(&1 in [:phoenix_iconify, :iconify])) |
| 116 | + |> Enum.map(&Path.join([priv_dir(&1), "iconify", @manifest_filename])) |
| 117 | + |> Enum.find(&File.regular?/1) |
| 118 | + end |
| 119 | + |
| 120 | + defp mix_project_app do |
| 121 | + if Code.ensure_loaded?(Mix.Project) and function_exported?(Mix.Project, :config, 0) do |
| 122 | + Mix.Project.config()[:app] |
| 123 | + end |
| 124 | + end |
| 125 | + |
| 110 126 | defp decode!(json) do |
| 111 127 | _icon_defaults = struct!(Iconify.Icon, name: "", body: "") |
| 112 128 | %{version: @version, icons: icons} = Jason.decode!(json, keys: :atoms!) |
| @@ -1,7 +1,7 @@ | |
| 1 1 | defmodule PhoenixIconify.MixProject do |
| 2 2 | use Mix.Project |
| 3 3 | |
| 4 | - @version "0.3.3" |
| 4 | + @version "0.3.4" |
| 5 5 | @source_url "https://github.com/elixir-volt/phoenix_iconify" |
| 6 6 | |
| 7 7 | def project do |