diff --git a/lib/phoenix_kit/emails/archiver.ex b/lib/phoenix_kit/emails/archiver.ex index f0e011724..1dc58e14c 100644 --- a/lib/phoenix_kit/emails/archiver.ex +++ b/lib/phoenix_kit/emails/archiver.ex @@ -72,8 +72,8 @@ defmodule PhoenixKit.Emails.Archiver do """ require Logger - alias PhoenixKit.Settings alias PhoenixKit.Emails.{Event, Log} + alias PhoenixKit.Settings import Ecto.Query ## --- Body Compression --- diff --git a/lib/phoenix_kit/emails/rate_limiter.ex b/lib/phoenix_kit/emails/rate_limiter.ex index 8f0e24791..c3f8cd580 100644 --- a/lib/phoenix_kit/emails/rate_limiter.ex +++ b/lib/phoenix_kit/emails/rate_limiter.ex @@ -103,8 +103,8 @@ defmodule PhoenixKit.Emails.RateLimiter do - `PhoenixKit.Users.Auth` - User-based limits """ - alias PhoenixKit.Settings alias PhoenixKit.Emails.{EmailBlocklist, Log} + alias PhoenixKit.Settings import Ecto.Query ## --- Rate Limit Checks --- diff --git a/lib/phoenix_kit/storage/url_signer.ex b/lib/phoenix_kit/storage/url_signer.ex index 10f57f14a..1c8721d9e 100644 --- a/lib/phoenix_kit/storage/url_signer.ex +++ b/lib/phoenix_kit/storage/url_signer.ex @@ -1,6 +1,8 @@ defmodule PhoenixKit.Storage.URLSigner do import Bitwise + alias PhoenixKit.Utils.Routes + @moduledoc """ Token-based URL signing for secure file serving. @@ -51,7 +53,7 @@ defmodule PhoenixKit.Storage.URLSigner do def signed_url(file_id, instance_name) when is_binary(file_id) and is_binary(instance_name) do token = generate_token(file_id, instance_name) file_path = "/file/#{file_id}/#{instance_name}/#{token}" - PhoenixKit.Utils.Routes.path(file_path) + Routes.path(file_path) end @doc """ diff --git a/lib/phoenix_kit_web/components/core/language_switcher.ex b/lib/phoenix_kit_web/components/core/language_switcher.ex index 990f7def5..1d5491dad 100644 --- a/lib/phoenix_kit_web/components/core/language_switcher.ex +++ b/lib/phoenix_kit_web/components/core/language_switcher.ex @@ -27,9 +27,9 @@ defmodule PhoenixKitWeb.Components.Core.LanguageSwitcher do use Phoenix.Component + alias Phoenix.LiveView.JS alias PhoenixKit.Module.Languages alias PhoenixKitWeb.Components.Core.Icon - alias Phoenix.LiveView.JS @doc """ Renders a dropdown language switcher. @@ -328,41 +328,9 @@ defmodule PhoenixKitWeb.Components.Core.LanguageSwitcher do end # Helper function to generate language switch URL + # Current implementation returns home page with new locale + # Future enhancement: parse current path and preserve it when available via assigns defp generate_language_url(_current_locale, new_locale) do - # Get current path and replace locale if present - # This is a simple implementation - you may need to adjust based on your routing - case get_current_path_from_assigns() do - nil -> - # Fallback if path is not available - "/" - - current_path -> - # Remove PhoenixKit prefix if present - normalized_path = String.replace_prefix(current_path, "/phoenix_kit", "") - - # Remove existing locale prefix if it matches a language code - clean_path = - case String.split(normalized_path, "/", parts: 3) do - ["", potential_locale, rest] -> - if Languages.valid_language?(potential_locale) do - "/" <> rest - else - normalized_path - end - - _ -> - normalized_path - end - - # Build new URL with new locale - "/#{new_locale}#{clean_path}" - end - end - - # Helper to get current path - should be passed via socket assigns - defp get_current_path_from_assigns do - # This will be populated by the LiveView or template context - # For now, return nil - the actual path should be passed as an attribute - nil + "/#{new_locale}" end end diff --git a/lib/phoenix_kit_web/controllers/blog_controller.ex b/lib/phoenix_kit_web/controllers/blog_controller.ex index 0728c458a..0d981aeb6 100644 --- a/lib/phoenix_kit_web/controllers/blog_controller.ex +++ b/lib/phoenix_kit_web/controllers/blog_controller.ex @@ -103,7 +103,7 @@ defmodule PhoenixKitWeb.BlogController do # Returns {detected_language, adjusted_params} defp detect_language_or_blog(language_param, params) do # Check if this looks like a valid language code - if is_valid_language?(language_param) do + if valid_language?(language_param) do # It's a real language code - use as-is {language_param, params} else @@ -130,14 +130,14 @@ defmodule PhoenixKitWeb.BlogController do end end - defp is_valid_language?(code) when is_binary(code) do + defp valid_language?(code) when is_binary(code) do # Check if it's an enabled language code Languages.language_enabled?(code) rescue _ -> false end - defp is_valid_language?(_), do: false + defp valid_language?(_), do: false # ============================================================================ # Path Parsing diff --git a/lib/phoenix_kit_web/live/dashboard.ex b/lib/phoenix_kit_web/live/dashboard.ex index 45a0d0519..1499a8330 100644 --- a/lib/phoenix_kit_web/live/dashboard.ex +++ b/lib/phoenix_kit_web/live/dashboard.ex @@ -7,12 +7,12 @@ defmodule PhoenixKitWeb.Live.Dashboard do use PhoenixKitWeb, :live_view use Gettext, backend: PhoenixKitWeb.Gettext - alias PhoenixKit.Utils.IpAddress - alias PhoenixKit.Utils.Routes alias PhoenixKit.Admin.{Events, Presence} alias PhoenixKit.Settings alias PhoenixKit.Users.Auth.Scope alias PhoenixKit.Users.{Roles, Sessions} + alias PhoenixKit.Utils.IpAddress + alias PhoenixKit.Utils.Routes def mount(params, session, socket) do # Set locale for LiveView process - check params first, then socket assigns, then default diff --git a/lib/phoenix_kit_web/live/modules/blogging/blog.ex b/lib/phoenix_kit_web/live/modules/blogging/blog.ex index abcdb1b05..d50f3d3a1 100644 --- a/lib/phoenix_kit_web/live/modules/blogging/blog.ex +++ b/lib/phoenix_kit_web/live/modules/blogging/blog.ex @@ -5,6 +5,7 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging.Blog do use PhoenixKitWeb, :live_view use Gettext, backend: PhoenixKitWeb.Gettext + alias PhoenixKit.Blogging.Renderer alias PhoenixKit.Settings alias PhoenixKit.Utils.Routes alias PhoenixKitWeb.BlogHTML @@ -219,6 +220,6 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging.Blog do end # Invalidate the render cache for this post - PhoenixKit.Blogging.Renderer.invalidate_cache(blog_slug, identifier, post.language) + Renderer.invalidate_cache(blog_slug, identifier, post.language) end end diff --git a/lib/phoenix_kit_web/live/modules/blogging/blogging.ex b/lib/phoenix_kit_web/live/modules/blogging/blogging.ex index 66984d895..34d3f3c63 100644 --- a/lib/phoenix_kit_web/live/modules/blogging/blogging.ex +++ b/lib/phoenix_kit_web/live/modules/blogging/blogging.ex @@ -6,6 +6,7 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging do for creating timestamped markdown blog posts. """ + alias PhoenixKit.Module.Languages alias PhoenixKit.Users.Auth.Scope alias PhoenixKitWeb.Live.Modules.Blogging.Storage @@ -354,7 +355,7 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging do # Get all available language codes dynamically from the language module language_codes = try do - PhoenixKit.Module.Languages.get_language_codes() + Languages.get_language_codes() rescue _ -> [] end diff --git a/lib/phoenix_kit_web/live/modules/blogging/context/storage.ex b/lib/phoenix_kit_web/live/modules/blogging/context/storage.ex index 29860076c..f6c97bc7e 100644 --- a/lib/phoenix_kit_web/live/modules/blogging/context/storage.ex +++ b/lib/phoenix_kit_web/live/modules/blogging/context/storage.ex @@ -100,7 +100,7 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging.Storage do defp reserved_language_code?(slug) do language_codes = try do - PhoenixKit.Module.Languages.get_language_codes() + Languages.get_language_codes() rescue _ -> [] end @@ -135,20 +135,18 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging.Storage do slug when is_binary(slug) -> sanitized = sanitize_slug(slug) - cond do - sanitized == "" -> - {:ok, generate_slug_from_title(title)} - - true -> - # Validate the sanitized slug - case validate_slug(sanitized) do - {:ok, valid_slug} -> - {:ok, valid_slug} - - {:error, reason} -> - # Return the specific error instead of falling back - {:error, reason} - end + if sanitized == "" do + {:ok, generate_slug_from_title(title)} + else + # Validate the sanitized slug + case validate_slug(sanitized) do + {:ok, valid_slug} -> + {:ok, valid_slug} + + {:error, reason} -> + # Return the specific error instead of falling back + {:error, reason} + end end end @@ -599,25 +597,23 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging.Storage do audit_meta = Map.new(audit_meta) desired_slug = Map.get(params, "slug", post.slug) - cond do - desired_slug == post.slug -> - update_post_slug_in_place(blog_slug, post, params, audit_meta) - - true -> - # Validate slug and return specific error - case validate_slug(desired_slug) do - {:ok, _valid_slug} -> - # Check if slug already exists - if slug_exists?(blog_slug, desired_slug) do - {:error, :slug_already_exists} - else - move_post_to_new_slug(blog_slug, post, desired_slug, params, audit_meta) - end + if desired_slug == post.slug do + update_post_slug_in_place(blog_slug, post, params, audit_meta) + else + # Validate slug and return specific error + case validate_slug(desired_slug) do + {:ok, _valid_slug} -> + # Check if slug already exists + if slug_exists?(blog_slug, desired_slug) do + {:error, :slug_already_exists} + else + move_post_to_new_slug(blog_slug, post, desired_slug, params, audit_meta) + end - {:error, reason} -> - # Return specific validation error - {:error, reason} - end + {:error, reason} -> + # Return specific validation error + {:error, reason} + end end end diff --git a/lib/phoenix_kit_web/live/modules/blogging/editor.ex b/lib/phoenix_kit_web/live/modules/blogging/editor.ex index 26dc4445c..f280a07a4 100644 --- a/lib/phoenix_kit_web/live/modules/blogging/editor.ex +++ b/lib/phoenix_kit_web/live/modules/blogging/editor.ex @@ -10,6 +10,7 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging.Editor do alias PhoenixKit.Utils.Routes alias PhoenixKitWeb.BlogHTML alias PhoenixKitWeb.Live.Modules.Blogging + alias PhoenixKitWeb.Live.Modules.Blogging.Metadata alias PhoenixKitWeb.Live.Modules.Blogging.Storage @impl true @@ -200,7 +201,7 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging.Editor do new_slug = if current_slug == "" and String.trim(content) != "" do # Extract title from content and use it for slug - title = PhoenixKitWeb.Live.Modules.Blogging.Metadata.extract_title_from_content(content) + title = Metadata.extract_title_from_content(content) Storage.generate_unique_slug(socket.assigns.blog_slug, title, nil) else current_slug @@ -232,7 +233,7 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging.Editor do {new_form, slug_events} = if socket.assigns.blog_mode == "slug" && is_new_unsaved && String.trim(content) != "" do - title = PhoenixKitWeb.Live.Modules.Blogging.Metadata.extract_title_from_content(content) + title = Metadata.extract_title_from_content(content) case Storage.generate_unique_slug(socket.assigns.blog_slug, title, nil) do {:ok, new_slug} -> @@ -1039,57 +1040,6 @@ defmodule PhoenixKitWeb.Live.Modules.Blogging.Editor do } end - defp maybe_autofill_slug(params, %{assigns: %{blog_mode: "slug"} = assigns}) do - trimmed_params = normalize_slug_param(params) - slug_value = Map.get(trimmed_params, "slug") - current_slug = Map.get(assigns.form, "slug", "") - title = extract_and_normalize_title(trimmed_params, assigns) - - new_slug = determine_slug_value(slug_value, current_slug, title, assigns) - Map.put(trimmed_params, "slug", new_slug) - end - - defp maybe_autofill_slug(params, _socket) do - Map.delete(params, "slug") - end - - defp normalize_slug_param(params) do - case Map.fetch(params, "slug") do - {:ok, slug} when is_binary(slug) -> Map.put(params, "slug", String.trim(slug)) - {:ok, _} -> Map.put(params, "slug", "") - :error -> params - end - end - - defp extract_and_normalize_title(params, assigns) do - title = - Map.get(params, "title") || - Map.get(assigns.form, "title") || - "" - - String.trim(to_string(title)) - end - - defp determine_slug_value(slug_value, current_slug, title, assigns) do - cond do - # User has manually entered a slug - keep it - is_binary(slug_value) and slug_value != "" -> - slug_value - - # Current slug exists - use it - current_slug not in [nil, ""] -> - current_slug - - # No slug but have title - auto-generate - title != "" -> - Storage.generate_unique_slug(assigns.blog_slug, title, nil) - - # No slug and no title - keep empty - true -> - "" - end - end - defp slug_base_dir(post, blog_slug) do cond do Map.get(post, :mode) == :slug and Map.get(post, :slug) -> diff --git a/lib/phoenix_kit_web/live/settings.ex b/lib/phoenix_kit_web/live/settings.ex index 5c9b8741b..a788a9a09 100644 --- a/lib/phoenix_kit_web/live/settings.ex +++ b/lib/phoenix_kit_web/live/settings.ex @@ -98,94 +98,14 @@ defmodule PhoenixKitWeb.Live.Settings do def handle_event("save_settings", %{"settings" => settings_params}, socket) do socket = assign(socket, :saving, true) - - # admin_languages comes as JSON string from hidden field - # If it's present and valid, keep it; otherwise remove it from params - settings_params_to_save = - case settings_params["admin_languages"] do - json when is_binary(json) -> - if String.trim(json) != "" do - # admin_languages is already JSON encoded from the hidden field, keep it as-is - settings_params - else - # Empty string, remove it - Map.delete(settings_params, "admin_languages") - end - - _ -> - # If not present, remove it so it doesn't get saved with invalid data - Map.delete(settings_params, "admin_languages") - end + settings_params_to_save = prepare_settings_params(settings_params) case Settings.update_settings(settings_params_to_save) do {:ok, updated_settings} -> - # Reload OAuth configuration to apply new credentials immediately - OAuthConfig.configure_providers() - - # Broadcast admin languages change if it was updated - if Map.has_key?(settings_params_to_save, "admin_languages") do - admin_languages_json = updated_settings["admin_languages"] - - admin_languages = - if admin_languages_json && String.trim(admin_languages_json) != "" do - case Jason.decode(admin_languages_json) do - {:ok, codes} when is_list(codes) -> codes - _ -> ["en", "ru", "es"] - end - else - ["en", "ru", "es"] - end - - SettingsEvents.broadcast_admin_languages_changed(admin_languages) - end - - # Update socket with new settings - changeset = Settings.change_settings(updated_settings) - - # Extract the admin_languages that were just saved - saved_admin_languages = - if Map.has_key?(settings_params_to_save, "admin_languages") do - admin_languages_json = settings_params_to_save["admin_languages"] - - if admin_languages_json && String.trim(admin_languages_json) != "" do - case Jason.decode(admin_languages_json) do - {:ok, codes} when is_list(codes) -> codes - _ -> socket.assigns.admin_languages - end - else - socket.assigns.admin_languages - end - else - socket.assigns.admin_languages - end - - socket = - socket - |> assign(:settings, updated_settings) - # Update saved values - |> assign(:saved_settings, updated_settings) - |> assign(:changeset, changeset) - |> assign(:saving, false) - |> assign(:project_title, updated_settings["project_title"] || "PhoenixKit") - # Keep the admin_languages we just saved (don't reload from DB) - |> assign(:admin_languages, saved_admin_languages) - |> put_flash(:info, "Settings updated successfully") - - {:noreply, socket} + handle_settings_saved(socket, settings_params_to_save, updated_settings) {:error, errors} -> - # Debug: Log the actual error to understand the issue - require Logger - Logger.error("Settings save error: #{inspect(errors)}") - - error_msg = format_error_message(errors) - - socket = - socket - |> assign(:saving, false) - |> put_flash(:error, error_msg) - - {:noreply, socket} + handle_settings_error(socket, errors) end end @@ -347,6 +267,85 @@ defmodule PhoenixKitWeb.Live.Settings do {:noreply, socket} end + # Handle successful settings save + defp handle_settings_saved(socket, settings_params_to_save, updated_settings) do + # Reload OAuth configuration to apply new credentials immediately + OAuthConfig.configure_providers() + + # Broadcast admin languages change if it was updated + if Map.has_key?(settings_params_to_save, "admin_languages") do + admin_languages = parse_admin_languages_json(updated_settings["admin_languages"]) + SettingsEvents.broadcast_admin_languages_changed(admin_languages) + end + + # Update socket with new settings + changeset = Settings.change_settings(updated_settings) + + saved_admin_languages = + extract_saved_admin_languages(settings_params_to_save, socket.assigns.admin_languages) + + socket = + socket + |> assign(:settings, updated_settings) + |> assign(:saved_settings, updated_settings) + |> assign(:changeset, changeset) + |> assign(:saving, false) + |> assign(:project_title, updated_settings["project_title"] || "PhoenixKit") + |> assign(:admin_languages, saved_admin_languages) + |> put_flash(:info, "Settings updated successfully") + + {:noreply, socket} + end + + # Handle settings save error + defp handle_settings_error(socket, errors) do + require Logger + Logger.error("Settings save error: #{inspect(errors)}") + + error_msg = format_error_message(errors) + + socket = + socket + |> assign(:saving, false) + |> put_flash(:error, error_msg) + + {:noreply, socket} + end + + # Parse admin_languages JSON string to list + defp parse_admin_languages_json(json) when is_binary(json) do + if String.trim(json) != "" do + case Jason.decode(json) do + {:ok, codes} when is_list(codes) -> codes + _ -> ["en", "ru", "es"] + end + else + ["en", "ru", "es"] + end + end + + defp parse_admin_languages_json(_), do: ["en", "ru", "es"] + + # Prepare settings params by handling admin_languages field + defp prepare_settings_params(%{"admin_languages" => json} = params) when is_binary(json) do + if String.trim(json) != "" do + params + else + Map.delete(params, "admin_languages") + end + end + + defp prepare_settings_params(params), do: Map.delete(params, "admin_languages") + + # Extract admin_languages from saved params or use fallback + defp extract_saved_admin_languages(settings_params, fallback) do + if Map.has_key?(settings_params, "admin_languages") do + parse_admin_languages_json(settings_params["admin_languages"]) + else + fallback + end + end + # Format error messages for display defp format_error_message(%Ecto.Changeset{} = changeset) do # Extract error messages from changeset diff --git a/lib/phoenix_kit_web/live/users/live_sessions.ex b/lib/phoenix_kit_web/live/users/live_sessions.ex index af68a057f..93ebefe01 100644 --- a/lib/phoenix_kit_web/live/users/live_sessions.ex +++ b/lib/phoenix_kit_web/live/users/live_sessions.ex @@ -15,11 +15,11 @@ defmodule PhoenixKitWeb.Live.Users.LiveSessions do """ use PhoenixKitWeb, :live_view - alias PhoenixKit.Utils.IpAddress - alias PhoenixKit.Utils.Routes alias PhoenixKit.Admin.{Events, Presence} alias PhoenixKit.Settings alias PhoenixKit.Users.Auth.Scope + alias PhoenixKit.Utils.IpAddress + alias PhoenixKit.Utils.Routes # Refresh every 5 seconds @refresh_interval 5_000 diff --git a/mix.exs b/mix.exs index 1eaddcc53..35fa95809 100644 --- a/mix.exs +++ b/mix.exs @@ -113,7 +113,7 @@ defmodule PhoenixKit.MixProject do {:finch, "~> 0.18"}, # Code generation and project patching - {:igniter, "~> 0.6.30", optional: true} + {:igniter, "~> 0.7.0", optional: true} ] end diff --git a/mix.lock b/mix.lock index 539c89273..d2dc50fb3 100644 --- a/mix.lock +++ b/mix.lock @@ -6,22 +6,22 @@ "certifi": {:hex, :certifi, "2.15.0", "0e6e882fcdaaa0a5a9f2b3db55b1394dba07e8d6d9bcad08318fb604c6839712", [:rebar3], [], "hexpm", "b147ed22ce71d72eafdad94f055165c1c182f61a2ff49df28bcc71d1d5b94a60"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, "comeonin": {:hex, :comeonin, "5.5.1", "5113e5f3800799787de08a6e0db307133850e635d34e9fab23c70b6501669510", [:mix], [], "hexpm", "65aac8f19938145377cee73973f192c5645873dcf550a8a6b18187d17c13ccdb"}, - "cowboy": {:hex, :cowboy, "2.13.0", "09d770dd5f6a22cc60c071f432cd7cb87776164527f205c5a6b0f24ff6b38990", [:make, :rebar3], [{:cowlib, ">= 2.14.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "e724d3a70995025d654c1992c7b11dbfea95205c047d86ff9bf1cda92ddc5614"}, + "cowboy": {:hex, :cowboy, "2.14.2", "4008be1df6ade45e4f2a4e9e2d22b36d0b5aba4e20b0a0d7049e28d124e34847", [:make, :rebar3], [{:cowlib, ">= 2.16.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "569081da046e7b41b5df36aa359be71a0c8874e5b9cff6f747073fc57baf1ab9"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, - "cowlib": {:hex, :cowlib, "2.15.0", "3c97a318a933962d1c12b96ab7c1d728267d2c523c25a5b57b0f93392b6e9e25", [:make, :rebar3], [], "hexpm", "4f00c879a64b4fe7c8fcb42a4281925e9ffdb928820b03c3ad325a617e857532"}, - "credo": {:hex, :credo, "1.7.12", "9e3c20463de4b5f3f23721527fcaf16722ec815e70ff6c60b86412c695d426c1", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8493d45c656c5427d9c729235b99d498bd133421f3e0a683e5c1b561471291e5"}, - "db_connection": {:hex, :db_connection, "2.8.0", "64fd82cfa6d8e25ec6660cea73e92a4cbc6a18b31343910427b702838c4b33b2", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "008399dae5eee1bf5caa6e86d204dcb44242c82b1ed5e22c881f2c34da201b15"}, + "cowlib": {:hex, :cowlib, "2.16.0", "54592074ebbbb92ee4746c8a8846e5605052f29309d3a873468d76cdf932076f", [:make, :rebar3], [], "hexpm", "7f478d80d66b747344f0ea7708c187645cfcc08b11aa424632f78e25bf05db51"}, + "credo": {:hex, :credo, "1.7.13", "126a0697df6b7b71cd18c81bc92335297839a806b6f62b61d417500d1070ff4e", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "47641e6d2bbff1e241e87695b29f617f1a8f912adea34296fb10ecc3d7e9e84f"}, + "db_connection": {:hex, :db_connection, "2.8.1", "9abdc1e68c34c6163f6fb96a96532272d13ad7ca45262156ae8b7ec6d9dc4bec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61a3d489b239d76f326e03b98794fb8e45168396c925ef25feb405ed09da8fd"}, "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, - "dialyxir": {:hex, :dialyxir, "1.4.6", "7cca478334bf8307e968664343cbdb432ee95b4b68a9cba95bdabb0ad5bdfd9a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "8cf5615c5cd4c2da6c501faae642839c8405b49f8aa057ad4ae401cb808ef64d"}, + "dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"}, "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, "earmark": {:hex, :earmark, "1.4.48", "5f41e579d85ef812351211842b6e005f6e0cef111216dea7d4b9d58af4608434", [:mix], [], "hexpm", "a461a0ddfdc5432381c876af1c86c411fd78a25790c75023c7a4c035fdc858f9"}, "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, - "ecto": {:hex, :ecto, "3.13.2", "7d0c0863f3fc8d71d17fc3ad3b9424beae13f02712ad84191a826c7169484f01", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "669d9291370513ff56e7b7e7081b7af3283d02e046cf3d403053c557894a0b3e"}, + "ecto": {:hex, :ecto, "3.13.5", "9d4a69700183f33bf97208294768e561f5c7f1ecf417e0fa1006e4a91713a834", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "df9efebf70cf94142739ba357499661ef5dbb559ef902b68ea1f3c1fabce36de"}, "ecto_sql": {:hex, :ecto_sql, "3.13.2", "a07d2461d84107b3d037097c822ffdd36ed69d1cf7c0f70e12a3d1decf04e2e1", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.13.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "539274ab0ecf1a0078a6a72ef3465629e4d6018a3028095dc90f60a19c371717"}, "elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"}, - "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, + "erlex": {:hex, :erlex, "0.2.8", "cd8116f20f3c0afe376d1e8d1f0ae2452337729f68be016ea544a72f767d9c12", [:mix], [], "hexpm", "9d66ff9fedf69e49dc3fd12831e12a8a37b76f8651dd21cd45fcf5561a8a7590"}, "esbuild": {:hex, :esbuild, "0.10.0", "b0aa3388a1c23e727c5a3e7427c932d89ee791746b0081bbe56103e9ef3d291f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "468489cda427b974a7cc9f03ace55368a83e1a7be12fba7e30969af78e5f8c70"}, - "ex_aws": {:hex, :ex_aws, "2.5.11", "5646eaad701485505b78246b0cd406fde9b1619459a86e85b53398810d3d0bd3", [:mix], [{:configparser_ex, "~> 5.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7e16100ff93a118ef01c916d945969535cbe8d4ab6593fcf01d1cf854eb75345"}, + "ex_aws": {:hex, :ex_aws, "2.6.0", "346e87e35e5df0b3c016a96fb30adf6001de102981a71648dfc3ce3ad04765af", [:mix], [{:configparser_ex, "~> 5.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "30729ee9cbaacda674a4e4260d74206fa89bcd712267c4eaf42a0fc34592c0b3"}, "ex_aws_ec2": {:hex, :ex_aws_ec2, "2.0.1", "1558c9bf4044048fb2b3b1ca3d7a62c65666959432ae29ef1d584258926d8fc0", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}], "hexpm", "adb86c51c2bcf630a739261bfff9293d2bf96946bf1a2d40d4f78e56a349a52b"}, "ex_aws_s3": {:hex, :ex_aws_s3, "2.5.8", "5ee7407bc8252121ad28fba936b3b293f4ecef93753962351feb95b8a66096fa", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "84e512ca2e0ae6a6c497036dff06d4493ffb422cfe476acc811d7c337c16691c"}, "ex_aws_sns": {:hex, :ex_aws_sns, "2.3.4", "aeaafaba1f51bed82ce2a5b3dfaaefc5638c1823e7888bd74700c0a8d8afb87d", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}], "hexpm", "88cbfa163a78eed88e533d7bb2712bc4dc54db16d3bb60a4c3c7fa38babc49bd"}, @@ -41,7 +41,7 @@ "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, "httpoison": {:hex, :httpoison, "2.2.3", "a599d4b34004cc60678999445da53b5e653630651d4da3d14675fedc9dd34bd6", [:mix], [{:hackney, "~> 1.21", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "fa0f2e3646d3762fdc73edb532104c8619c7636a6997d20af4003da6cfc53e53"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, - "igniter": {:hex, :igniter, "0.6.30", "83a466369ebb8fe009e0823c7bf04314dc545122c2d48f896172fc79df33e99d", [:mix], [{:glob_ex, "~> 0.1.7", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:owl, "~> 0.11", [hex: :owl, repo: "hexpm", optional: false]}, {:phx_new, "~> 1.7", [hex: :phx_new, repo: "hexpm", optional: true]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:rewrite, ">= 1.1.1 and < 2.0.0-0", [hex: :rewrite, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.4", [hex: :sourceror, repo: "hexpm", optional: false]}, {:spitfire, ">= 0.1.3 and < 1.0.0-0", [hex: :spitfire, repo: "hexpm", optional: false]}], "hexpm", "76a14d5b7f850bb03b5243088c3649d54a2e52e34a2aa1104dee23cf50a8bae0"}, + "igniter": {:hex, :igniter, "0.7.0", "6848714fa5afa14258c82924a57af9364745316241a409435cf39cbe11e3ae80", [:mix], [{:glob_ex, "~> 0.1.7", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:owl, "~> 0.11", [hex: :owl, repo: "hexpm", optional: false]}, {:phx_new, "~> 1.7", [hex: :phx_new, repo: "hexpm", optional: true]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:rewrite, ">= 1.1.1 and < 2.0.0-0", [hex: :rewrite, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.4", [hex: :sourceror, repo: "hexpm", optional: false]}, {:spitfire, ">= 0.1.3 and < 1.0.0-0", [hex: :spitfire, repo: "hexpm", optional: false]}], "hexpm", "1e7254780dbf4b44c9eccd6d86d47aa961efc298d7f520c24acb0258c8e90ba9"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"}, "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, @@ -59,12 +59,12 @@ "owl": {:hex, :owl, "0.13.0", "26010e066d5992774268f3163506972ddac0a7e77bfe57fa42a250f24d6b876e", [:mix], [{:ucwidth, "~> 0.2", [hex: :ucwidth, repo: "hexpm", optional: true]}], "hexpm", "59bf9d11ce37a4db98f57cb68fbfd61593bf419ec4ed302852b6683d3d2f7475"}, "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, "phoenix": {:hex, :phoenix, "1.8.1", "865473a60a979551a4879db79fbfb4503e41cd809e77c85af79716578b6a456d", [:mix], [{:bandit, "~> 1.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "84d77d2b2e77c3c7e7527099bd01ef5c8560cd149c036d6b3a40745f11cd2fb2"}, - "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.5", "c4ef322acd15a574a8b1a08eff0ee0a85e73096b53ce1403b6563709f15e1cea", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "26ec3208eef407f31b748cadd044045c6fd485fbff168e35963d2f9dfff28d4b"}, - "phoenix_html": {:hex, :phoenix_html, "4.2.1", "35279e2a39140068fc03f8874408d58eef734e488fc142153f055c5454fd1c08", [:mix], [], "hexpm", "cff108100ae2715dd959ae8f2a8cef8e20b593f8dfd031c9cba92702cf23e053"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.7.0", "75c4b9dfb3efdc42aec2bd5f8bccd978aca0651dbcbc7a3f362ea5d9d43153c6", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "1d75011e4254cb4ddf823e81823a9629559a1be93b4321a6a5f11a5306fbf4cc"}, + "phoenix_html": {:hex, :phoenix_html, "4.3.0", "d3577a5df4b6954cd7890c84d955c470b5310bb49647f0a114a6eeecc850f7ad", [:mix], [], "hexpm", "3eaa290a78bab0f075f791a46a981bbe769d94bc776869f4f3063a14f30497ad"}, "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.7", "405880012cb4b706f26dd1c6349125bfc903fb9e44d1ea668adaf4e04d4884b7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "3a8625cab39ec261d48a13b7468dc619c0ede099601b084e343968309bd4d7d7"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.6.1", "05df733a09887a005ed0d69a7fc619d376aea2730bf64ce52ac51ce716cc1ef0", [:mix], [{:file_system, "~> 0.2.10 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "74273843d5a6e4fef0bbc17599f33e3ec63f08e69215623a0cd91eea4288e5a0"}, - "phoenix_live_view": {:hex, :phoenix_live_view, "1.1.12", "8b51c41e5c30cac3a6a98d928e92194ad9960feb745abf38455e2224674fa39b", [:mix], [{:igniter, ">= 0.6.16 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:lazy_html, "~> 0.1.0", [hex: :lazy_html, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0 or ~> 1.8.0-rc", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "02bc806601562e157b05e66e8146bf24c170037b5005d6614035e789ae732209"}, - "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "1.1.17", "1d782b5901cf13b137c6d8c56542ff6cb618359b2adca7e185b21df728fa0c6c", [:mix], [{:igniter, ">= 0.6.16 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:lazy_html, "~> 0.1.0", [hex: :lazy_html, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0 or ~> 1.8.0-rc", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fa82307dd9305657a8236d6b48e60ef2e8d9f742ee7ed832de4b8bcb7e0e5ed2"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.2.0", "ff3a5616e1bed6804de7773b92cbccfc0b0f473faf1f63d7daf1206c7aeaaa6f", [:mix], [], "hexpm", "adc313a5bf7136039f63cfd9668fde73bba0765e0614cba80c06ac9460ff3e96"}, "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, "plug": {:hex, :plug, "1.18.1", "5067f26f7745b7e31bc3368bc1a2b818b9779faa959b49c934c17730efc911cf", [: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", "57a57db70df2b422b564437d2d33cf8d33cd16339c1edb190cd11b1a3a546cc2"}, "plug_cowboy": {:hex, :plug_cowboy, "2.7.4", "729c752d17cf364e2b8da5bdb34fb5804f56251e88bb602aff48ae0bd8673d11", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "9b85632bd7012615bae0a5d70084deb1b25d2bcbb32cab82d1e9a1e023168aa3"}, @@ -78,8 +78,8 @@ "spitfire": {:hex, :spitfire, "0.2.1", "29e154873f05444669c7453d3d931820822cbca5170e88f0f8faa1de74a79b47", [:mix], [], "hexpm", "6eeed75054a38341b2e1814d41bb0a250564092358de2669fdb57ff88141d91b"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "sweet_xml": {:hex, :sweet_xml, "0.7.5", "803a563113981aaac202a1dbd39771562d0ad31004ddbfc9b5090bdcd5605277", [:mix], [], "hexpm", "193b28a9b12891cae351d81a0cead165ffe67df1b73fe5866d10629f4faefb12"}, - "swoosh": {:hex, :swoosh, "1.19.5", "5abd71be78302ba21be56a2b68d05c9946ff1f1bd254f949efef09d253b771ac", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c953f51ee0a8b237e0f4307c9cefd3eb1eb751c35fcdda2a8bccb991766473be"}, - "tailwind": {:hex, :tailwind, "0.4.0", "4b2606713080437e3d94a0fa26527e7425737abc001f172b484b42f43e3274c0", [:mix], [], "hexpm", "530bd35699333f8ea0e9038d7146c2f0932dfec2e3636bd4a8016380c4bc382e"}, + "swoosh": {:hex, :swoosh, "1.19.8", "0576f2ea96d1bb3a6e02cc9f79cbd7d497babc49a353eef8dce1a1f9f82d7915", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d7503c2daf0f9899afd8eba9923eeddef4b62e70816e1d3b6766e4d6c60e94ad"}, + "tailwind": {:hex, :tailwind, "0.4.1", "e7bcc222fe96a1e55f948e76d13dd84a1a7653fb051d2a167135db3b4b08d3e9", [:mix], [], "hexpm", "6249d4f9819052911120dbdbe9e532e6bd64ea23476056adb7f730aa25c220d1"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "tesla": {:hex, :tesla, "1.15.3", "3a2b5c37f09629b8dcf5d028fbafc9143c0099753559d7fe567eaabfbd9b8663", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, ">= 1.0.0", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.21", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.2", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:mox, "~> 1.0", [hex: :mox, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "98bb3d4558abc67b92fb7be4cd31bb57ca8d80792de26870d362974b58caeda7"}, "text_diff": {:hex, :text_diff, "0.1.0", "1caf3175e11a53a9a139bc9339bd607c47b9e376b073d4571c031913317fecaa", [:mix], [], "hexpm", "d1ffaaecab338e49357b6daa82e435f877e0649041ace7755583a0ea3362dbd7"}, @@ -92,10 +92,10 @@ "ueberauth_github": {:hex, :ueberauth_github, "0.8.3", "1c478629b4c1dae446c68834b69194ad5cead3b6c67c913db6fdf64f37f0328f", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.7", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "ae0ab2879c32cfa51d7287a48219b262bfdab0b7ec6629f24160564247493cc6"}, "ueberauth_google": {:hex, :ueberauth_google, "0.12.1", "90cf49743588193334f7a00da252f92d90bfd178d766c0e4291361681fafec7d", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.10.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "7f7deacd679b2b66e3bffb68ecc77aa1b5396a0cbac2941815f253128e458c38"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.1", "a48703a25c170eedadca83b11e88985af08d35f37c6f664d6dcfb106a97782fc", [:rebar3], [], "hexpm", "b3a917854ce3ae233619744ad1e0102e05673136776fb2fa76234f3e03b23642"}, - "usage_rules": {:hex, :usage_rules, "0.1.24", "3d576d0ffd3049c4d088085f7e3b77db6280a10a9c19b707ffbf57b67bc2afd4", [:mix], [{:igniter, ">= 0.6.6 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "e1cba11dfb62840bfc0a8f9e05fcf0336cea37d8540e8971aa8a12dd31b14f20"}, + "usage_rules": {:hex, :usage_rules, "0.1.26", "19d38c8b9b5c35434eae44f7e4554caeb5f08037a1d45a6b059a9782543ac22e", [:mix], [{:igniter, ">= 0.6.6 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "9f0d203aa288e1b48318929066778ec26fc423fd51f08518c5b47f58ad5caca9"}, "uuidv7": {:hex, :uuidv7, "1.0.0", "659179b2e248b98f96e7e988b882d369c055b6ae7a836237ccca52cd4d0f6988", [:mix], [{:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}], "hexpm", "0ecd337108456f7d8b1a9a54ef435443d3f8c10a5b685bd866ef9e396b444cbc"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, - "websock_adapter": {:hex, :websock_adapter, "0.5.8", "3b97dc94e407e2d1fc666b2fb9acf6be81a1798a2602294aac000260a7c4a47d", [: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", "315b9a1865552212b5f35140ad194e67ce31af45bcee443d4ecb96b5fd3f3782"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.9", "43dc3ba6d89ef5dec5b1d0a39698436a1e856d000d84bf31a3149862b01a287f", [: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", "5534d5c9adad3c18a0f58a9371220d75a803bf0b9a3d87e6fe072faaeed76a08"}, "yamerl": {:hex, :yamerl, "0.10.0", "4ff81fee2f1f6a46f1700c0d880b24d193ddb74bd14ef42cb0bcf46e81ef2f8e", [:rebar3], [], "hexpm", "346adb2963f1051dc837a2364e4acf6eb7d80097c0f53cbdc3046ec8ec4b4e6e"}, "yaml_elixir": {:hex, :yaml_elixir, "2.12.0", "30343ff5018637a64b1b7de1ed2a3ca03bc641410c1f311a4dbdc1ffbbf449c7", [:mix], [{:yamerl, "~> 0.10", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "ca6bacae7bac917a7155dca0ab6149088aa7bc800c94d0fe18c5238f53b313c6"}, }