diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a64f89d2..7b0d20aa3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ## Unreleased +## 0.3.3 (2024-12-13) + +### Fixes + + - Support LiveView v1.0.1 + - Fix variant roll changing when fetching assets + ## 0.3.2 (2024-12-11) ### Fixes diff --git a/assets/package-lock.json b/assets/package-lock.json index 3c82d017f..6d96eca18 100644 --- a/assets/package-lock.json +++ b/assets/package-lock.json @@ -1,12 +1,12 @@ { "name": "beacon", - "version": "0.3.2", + "version": "0.3.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "beacon", - "version": "0.3.2", + "version": "0.3.3", "license": "MIT", "dependencies": { "@tailwindcss/forms": "^0.5", diff --git a/assets/package.json b/assets/package.json index 1f8fee198..f52fc5a47 100644 --- a/assets/package.json +++ b/assets/package.json @@ -1,6 +1,6 @@ { "name": "beacon", - "version": "0.3.2", + "version": "0.3.3", "license": "MIT", "repository": {}, "scripts": { diff --git a/lib/beacon/plug.ex b/lib/beacon/plug.ex index f0c59c5ac..ea57cd550 100644 --- a/lib/beacon/plug.ex +++ b/lib/beacon/plug.ex @@ -17,9 +17,32 @@ defmodule Beacon.Plug do """ @behaviour Plug + @private_routes [ + "__beacon_check__", + "__beacon_assets__", + "__beacon_media__" + ] + @impl Plug def init(_opts), do: [] @impl Plug - def call(conn, _opts), do: Plug.Conn.put_session(conn, :beacon_variant_roll, Enum.random(1..100)) + def call(conn, _opts) do + if Enum.any?(@private_routes, &(&1 in conn.path_info)) do + conn + else + put_roll(conn) + end + end + + defp put_roll(conn) do + path_list = conn.path_params["path"] + + with %{private: %{phoenix_live_view: {_, _, %{extra: %{session: %{"beacon_site" => site}}}}}} <- conn, + {_, _} <- Beacon.RouterServer.lookup_path(site, path_list, 1) do + Plug.Conn.put_session(conn, "beacon_variant_roll", Enum.random(1..100)) + else + _ -> conn + end + end end diff --git a/lib/beacon/private.ex b/lib/beacon/private.ex index 00cb8f3f2..673194b7a 100644 --- a/lib/beacon/private.ex +++ b/lib/beacon/private.ex @@ -6,6 +6,8 @@ defmodule Beacon.Private do # Should be avoided as much as possible. + @phoenix_live_view_version to_string(Application.spec(:phoenix_live_view)[:vsn]) + @doc """ On page navigation, the request might actually hit a different site than the one defined by the current session. @@ -20,7 +22,7 @@ defmodule Beacon.Private do We use the private function `Phoenix.LiveView.Route.live_link_info/3` in order to keep the same behavior as LV. """ def site_from_session(endpoint, router, url, view) do - case Phoenix.LiveView.Route.live_link_info(endpoint, router, url) do + case live_link_info(endpoint, router, url) do {_, %{ view: ^view, @@ -36,4 +38,14 @@ defmodule Beacon.Private do nil end end + + if Version.compare(@phoenix_live_view_version, "1.0.0") == :gt do + defp live_link_info(endpoint, router, url) do + Phoenix.LiveView.Route.live_link_info_without_checks(endpoint, router, url) + end + else + defp live_link_info(endpoint, router, url) do + Phoenix.LiveView.Route.live_link_info(endpoint, router, url) + end + end end diff --git a/lib/beacon/router.ex b/lib/beacon/router.ex index debb1224f..9bbfbc69d 100644 --- a/lib/beacon/router.ex +++ b/lib/beacon/router.ex @@ -250,6 +250,8 @@ defmodule Beacon.Router do end) end + def path_params(_page_path, _path_info), do: %{} + @doc false # Tells if a `beacon_site` is reachable in the current environment. # diff --git a/lib/beacon/template.ex b/lib/beacon/template.ex index ea7e58ffa..36df6805e 100644 --- a/lib/beacon/template.ex +++ b/lib/beacon/template.ex @@ -27,8 +27,8 @@ defmodule Beacon.Template do page -> page_module = Beacon.Loader.fetch_page_module(page.site, page.id) - live_data = Beacon.Web.DataSource.live_data(site, path_info) - beacon_assigns = BeaconAssigns.new(site, page, live_data, path_info, query_params, :beacon) + live_data = Beacon.Web.DataSource.live_data(site, path_info, query_params) + beacon_assigns = BeaconAssigns.new(page, path_info: path_info, query_params: query_params) assigns = Map.put(live_data, :beacon, beacon_assigns) env = Beacon.Web.PageLive.make_env(site) diff --git a/lib/beacon/web/beacon_assigns.ex b/lib/beacon/web/beacon_assigns.ex index dfad25d9c..454a0b646 100644 --- a/lib/beacon/web/beacon_assigns.ex +++ b/lib/beacon/web/beacon_assigns.ex @@ -33,8 +33,8 @@ defmodule Beacon.Web.BeaconAssigns do } defstruct site: nil, - path_params: %{}, - query_params: %{}, + path_params: nil, + query_params: nil, page: %{path: nil, title: nil}, private: %{ page_module: nil, @@ -53,31 +53,18 @@ defmodule Beacon.Web.BeaconAssigns do end @doc false - def new(site, %Beacon.Content.Page{} = page, variant_roll) do - components_module = Beacon.Loader.Components.module_name(site) - page_module = Beacon.Loader.Page.module_name(site, page.id) + def new(%Beacon.Content.Page{} = page, metadata \\ []) do + path_info = Keyword.get(metadata, :path_info, []) + query_params = Keyword.get(metadata, :query_params, %{}) + variant_roll = Keyword.get(metadata, :variant_roll, nil) - %__MODULE__{ - site: site, - private: %{ - components_module: components_module, - page_module: page_module, - variant_roll: variant_roll - } - } - end - - @doc false - def new(site, %Beacon.Content.Page{} = page, live_data, path_info, query_params, source, variant_roll \\ nil) - when is_atom(site) and is_map(live_data) and is_list(path_info) and is_map(query_params) and source in [:beacon, :admin] do - %{site: ^site} = page - page_module = Beacon.Loader.Page.module_name(site, page.id) - live_data = Beacon.Web.DataSource.live_data(site, path_info, Map.drop(query_params, ["path"])) + page_module = Beacon.Loader.Page.module_name(page.site, page.id) + live_data = Beacon.Web.DataSource.live_data(page.site, path_info, Map.drop(query_params, ["path"])) path_params = Beacon.Router.path_params(page.path, path_info) - page_title = Beacon.Web.DataSource.page_title(site, page.id, live_data, source) - components_module = Beacon.Loader.Components.module_name(site) - info_handlers_module = Beacon.Loader.InfoHandlers.module_name(site) - event_handlers_module = Beacon.Loader.EventHandlers.module_name(site) + page_title = Beacon.Web.DataSource.page_title(page, live_data) + components_module = Beacon.Loader.Components.module_name(page.site) + info_handlers_module = Beacon.Loader.InfoHandlers.module_name(page.site) + event_handlers_module = Beacon.Loader.EventHandlers.module_name(page.site) %__MODULE__{ site: page.site, @@ -95,23 +82,4 @@ defmodule Beacon.Web.BeaconAssigns do } } end - - @doc false - def update(_socket_or_assigns, _key, _value) - - def update(%{assigns: %{beacon: _beacon}} = socket, key, value) do - do_update_socket_or_assigns(socket, key, value) - end - - def update(%{beacon: _beacon} = assigns, key, value) do - do_update_socket_or_assigns(assigns, key, value) - end - - def update(_socket_or_assigns, _key, _value), do: raise("expected :beacon assign in socket but none found") - - defp do_update_socket_or_assigns(socket_or_assigns, key, value) do - Phoenix.Component.update(socket_or_assigns, :beacon, fn beacon -> - Map.put(beacon, key, value) - end) - end end diff --git a/lib/beacon/web/controllers/api/page_json.ex b/lib/beacon/web/controllers/api/page_json.ex index 0ecc11572..cd4a651e3 100644 --- a/lib/beacon/web/controllers/api/page_json.ex +++ b/lib/beacon/web/controllers/api/page_json.ex @@ -23,7 +23,7 @@ defmodule Beacon.Web.API.PageJSON do defp data(%Page{} = page) do path_info = for segment <- String.split(page.path, "/"), segment != "", do: segment live_data = Beacon.Web.DataSource.live_data(page.site, path_info, %{}) - beacon_assigns = BeaconAssigns.new(page.site, page, live_data, path_info, %{}, :admin) + beacon_assigns = BeaconAssigns.new(page, path_info: path_info) assigns = live_data diff --git a/lib/beacon/web/data_source.ex b/lib/beacon/web/data_source.ex index 840172c2f..8b3f4e96e 100644 --- a/lib/beacon/web/data_source.ex +++ b/lib/beacon/web/data_source.ex @@ -3,12 +3,14 @@ defmodule Beacon.Web.DataSource do require Logger - def live_data(site, path_info, params \\ %{}) when is_atom(site) and is_list(path_info) and is_map(params) do - Beacon.apply_mfa(site, Beacon.Loader.fetch_live_data_module(site), :live_data, [path_info, params]) + def live_data(site, path_info, query_params) when is_atom(site) and is_list(path_info) and is_map(query_params) do + Beacon.apply_mfa(site, Beacon.Loader.fetch_live_data_module(site), :live_data, [path_info, query_params]) end - def page_title(site, page_id, live_data, source) do - %{path: path, title: title} = page_assigns = page_assigns(site, page_id, source) + def live_data(_site, _path_info, _query_params), do: %{} + + def page_title(%Beacon.Content.Page{} = page, live_data) do + %{path: path, title: title} = page_assigns = page_assigns(page) with {:ok, page_title} <- Beacon.Content.render_snippet(title, %{page: page_assigns, live_data: live_data}) do page_title @@ -19,7 +21,7 @@ defmodule Beacon.Web.DataSource do will return the original unmodified page title - site: #{site} + site: #{page.site} title: #{title} page path: #{path} @@ -36,13 +38,14 @@ defmodule Beacon.Web.DataSource do # TODO: revisit this logic to evaluate meta_tags for unpublished pages def meta_tags(assigns) do %{beacon: %{site: site, private: %{page_module: page_module, live_data_keys: live_data_keys}}} = assigns - %{site: ^site, id: page_id} = Beacon.apply_mfa(site, page_module, :page_assigns, [[:site, :id]]) + %{site: ^site} = page_assigns = Beacon.apply_mfa(site, page_module, :page_assigns, []) + live_data = Map.take(assigns, live_data_keys) assigns |> Beacon.Web.Layouts.meta_tags() |> List.wrap() - |> Enum.map(&interpolate_meta_tag(&1, %{page: page_assigns(site, page_id, :beacon), live_data: live_data})) + |> Enum.map(&interpolate_meta_tag(&1, %{page: page_assigns, live_data: live_data})) end defp interpolate_meta_tag(meta_tag, values) when is_map(meta_tag) do @@ -57,15 +60,21 @@ defmodule Beacon.Web.DataSource do end end - # only published pages will have the title evaluated for beacon - defp page_assigns(site, page_id, :beacon) do - Beacon.apply_mfa(site, Beacon.Loader.fetch_page_module(site, page_id), :page_assigns, []) + # return the page assigns from unpublished page assigns, + # either saved in the database or page in-memory (for new pages) + # this fallback is here mostly to support beacon_live_admin visual editor, + # which makes use of the `@beacon` assign when creating or editing pages + defp page_assigns(%Beacon.Content.Page{id: nil} = page) do + unpublished_page_assigns(page) end - # beacon_live_admin needs the title for unpublished pages also - defp page_assigns(site, page_id, :admin) do - page = Beacon.Content.get_page(site, page_id) + defp page_assigns(%Beacon.Content.Page{} = page) do + Beacon.apply_mfa(page.site, Beacon.Loader.fetch_page_module(page.site, page.id), :page_assigns, []) + rescue + _ -> unpublished_page_assigns(page) + end + defp unpublished_page_assigns(page) do %{ id: page.id, site: page.site, diff --git a/lib/beacon/web/live/page_live.ex b/lib/beacon/web/live/page_live.ex index de0466b34..159dab726 100644 --- a/lib/beacon/web/live/page_live.ex +++ b/lib/beacon/web/live/page_live.ex @@ -39,7 +39,7 @@ defmodule Beacon.Web.PageLive do end page = RouterServer.lookup_page!(site, path) - socket = Component.assign(socket, beacon: BeaconAssigns.new(site, page, variant_roll)) + socket = Component.assign(socket, beacon: BeaconAssigns.new(page, variant_roll: variant_roll)) {:ok, socket, layout: {Beacon.Web.Layouts, :dynamic}} end @@ -130,16 +130,14 @@ defmodule Beacon.Web.PageLive do site -> %{"path" => path_info} = params - if socket.assigns.beacon.site != site do - if Beacon.Config.fetch!(site).mode == :live do - Beacon.PubSub.unsubscribe_to_page(socket.assigns.beacon.site, path_info) - Beacon.PubSub.subscribe_to_page(site, path_info) - end + if socket.assigns.beacon.site != site && Beacon.Config.fetch!(site).mode == :live do + Beacon.PubSub.unsubscribe_to_page(socket.assigns.beacon.site, path_info) + Beacon.PubSub.subscribe_to_page(site, path_info) end page = RouterServer.lookup_page!(site, path_info) live_data = Beacon.Web.DataSource.live_data(site, path_info, Map.drop(params, ["path"])) - beacon_assigns = BeaconAssigns.new(site, page, live_data, path_info, params, :beacon, socket.assigns.beacon.private.variant_roll) + beacon_assigns = BeaconAssigns.new(page, path_info: path_info, query_params: params, variant_roll: socket.assigns.beacon.private.variant_roll) socket = socket @@ -151,7 +149,7 @@ defmodule Beacon.Web.PageLive do # TODO: remove deprecated @beacon_query_params |> Component.assign(:beacon_query_params, beacon_assigns.query_params) |> Component.assign(:beacon, beacon_assigns) - |> Component.assign(:page_title, Beacon.Web.DataSource.page_title(site, page.id, live_data, :beacon)) + |> Component.assign(:page_title, beacon_assigns.page.title) {:noreply, push_event(socket, "beacon:page-updated", %{meta_tags: Beacon.Web.DataSource.meta_tags(socket.assigns)})} end diff --git a/mix.exs b/mix.exs index 20756acf3..5f27d2748 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Beacon.MixProject do use Mix.Project - @version "0.3.2" + @version "0.3.3" @source_url "https://github.com/BeaconCMS/beacon" @homepage_url "https://beaconcms.org" @@ -70,7 +70,7 @@ defmodule Beacon.MixProject do {:image, "~> 0.40"}, {:vix, "<= 0.30.0 or >= 0.31.1"}, {:jason, "~> 1.0"}, - {:oembed, "~> 0.4.1"}, + {:oembed, "~> 0.4"}, {:phoenix_ecto, "~> 4.4"}, {:phoenix_html, "~> 4.0"}, {:phoenix_html_helpers, "~> 1.0"}, diff --git a/mix.lock b/mix.lock index dc2d24e0a..817584c2b 100644 --- a/mix.lock +++ b/mix.lock @@ -11,7 +11,7 @@ "cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"}, "credo": {:hex, :credo, "1.7.10", "6e64fe59be8da5e30a1b96273b247b5cf1cc9e336b5fd66302a64b25749ad44d", [: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", "71fbc9a6b8be21d993deca85bf151df023a3097b01e09a2809d460348561d8cd"}, "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, - "decimal": {:hex, :decimal, "2.2.0", "df3d06bb9517e302b1bd265c1e7f16cda51547ad9d99892049340841f3e15836", [:mix], [], "hexpm", "af8daf87384b51b7e611fb1a1f2c4d4876b65ef968fa8bd3adf44cff401c7f21"}, + "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, "earmark_parser": {:hex, :earmark_parser, "1.4.41", "ab34711c9dc6212dda44fcd20ecb87ac3f3fce6f0ca2f28d4a00e4154f8cd599", [:mix], [], "hexpm", "a81a04c7e34b6617c2792e291b5a2e57ab316365c2644ddc553bb9ed863ebefa"}, "ecto": {:hex, :ecto, "3.12.5", "4a312960ce612e17337e7cefcf9be45b95a3be6b36b6f94dfb3d8c361d631866", [: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", "6eb18e80bef8bb57e17f5a7f068a1719fbda384d40fc37acb8eb8aeca493b6ea"}, "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [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", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, @@ -24,6 +24,7 @@ "exconstructor": {:hex, :exconstructor, "1.2.13", "7021eed1450202dcbcd1ef021d6aacf7351854ff9d7964f166931567f9dfa9fb", [:mix], [], "hexpm", "69d3f0251a07bb7c5ef85bde22a1eee577dfbb49852d77fb7ad7b937035aeef2"}, "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"}, "file_system": {:hex, :file_system, "1.0.1", "79e8ceaddb0416f8b8cd02a0127bdbababe7bf4a23d2a395b983c1f8b3f73edd", [:mix], [], "hexpm", "4414d1f38863ddf9120720cd976fce5bdde8e91d8283353f0e31850fa89feb9e"}, + "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, "floki": {:hex, :floki, "0.37.0", "b83e0280bbc6372f2a403b2848013650b16640cd2470aea6701f0632223d719e", [:mix], [], "hexpm", "516a0c15a69f78c47dc8e0b9b3724b29608aa6619379f91b1ffa47109b5d0dd3"}, "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"}, "glob_ex": {:hex, :glob_ex, "0.1.11", "cb50d3f1ef53f6ca04d6252c7fde09fd7a1cf63387714fe96f340a1349e62c93", [:mix], [], "hexpm", "342729363056e3145e61766b416769984c329e4378f1d558b63e341020525de4"}, @@ -35,32 +36,37 @@ "image": {:hex, :image, "0.55.2", "f21b5341ee05dfe2e0f649c34c6335cbce44be55e3ce3ced404ac008bef6c335", [:mix], [{:bumblebee, "~> 0.3", [hex: :bumblebee, repo: "hexpm", optional: true]}, {:evision, "~> 0.1.33 or ~> 0.2", [hex: :evision, repo: "hexpm", optional: true]}, {:exla, "~> 0.5", [hex: :exla, repo: "hexpm", optional: true]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}, {:kino, "~> 0.13", [hex: :kino, repo: "hexpm", optional: true]}, {:nx, "~> 0.7", [hex: :nx, repo: "hexpm", optional: true]}, {:nx_image, "~> 0.1", [hex: :nx_image, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.1 or ~> 3.2 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.13", [hex: :plug, repo: "hexpm", optional: true]}, {:req, "~> 0.4", [hex: :req, repo: "hexpm", optional: true]}, {:rustler, "> 0.0.0", [hex: :rustler, repo: "hexpm", optional: true]}, {:scholar, "~> 0.3", [hex: :scholar, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: false]}, {:vix, "~> 0.23", [hex: :vix, repo: "hexpm", optional: false]}], "hexpm", "aa126e45b514810d1af89eded505ed3e523acefbb005f6220f8fbc1955904607"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, - "makeup_elixir": {:hex, :makeup_elixir, "1.0.0", "74bb8348c9b3a51d5c589bf5aebb0466a84b33274150e3b6ece1da45584afc82", [: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", "49159b7d7d999e836bedaf09dcf35ca18b312230cf901b725a64f3f42e407983"}, + "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.0.1", "c7f58c120b2b5aa5fd80d540a89fdf866ed42f1f3994e4fe189abebeab610839", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "8a89a1eeccc2d798d6ea15496a6e4870b75e014d1af514b1b71fa33134f57814"}, - "mdex": {:hex, :mdex, "0.2.0", "af93e03bc964f2628c3940d22ba03435b119e070bd423fd62d31772d428a7e6c", [:mix], [{:rustler, "~> 0.32", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "d8d21d3d6ecb0b2a10f88b539f3a61df974f9570226bf6bd24404c9e361c8089"}, + "mdex": {:hex, :mdex, "0.3.0", "aa40e05465f789e74cd33ea34b02829ad271dd15a3b4cc07b21c487b32af8a08", [:mix], [{:rustler, "~> 0.32", [hex: :rustler, repo: "hexpm", optional: false]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "fe792d522778871df0493303306014b97c53b3ce72681de3175eda94d7f68dfc"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, "mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"}, + "mint": {:hex, :mint, "1.6.2", "af6d97a4051eee4f05b5500671d47c3a67dac7386045d87a904126fd4bbcea2e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5ee441dffc1892f1ae59127f74afe8fd82fda6587794278d924e4d90ea3d63f9"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, - "oembed": {:hex, :oembed, "0.4.1", "adda787e9fd5ad6ec17d1cb262ef21ec2095f222862766263a5ef89642a18f5d", [:mix], [{:exconstructor, ">= 1.0.0", [hex: :exconstructor, repo: "hexpm", optional: false]}, {:floki, ">= 0.24.0", [hex: :floki, repo: "hexpm", optional: false]}, {:httpoison, ">= 0.9.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:poison, ">= 1.5.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "eeaed4e5d73b24611f5a00c01cb93a3da381b0cab34e22b92eda4dcc6a6fb3b3"}, + "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, + "oembed": {:hex, :oembed, "0.5.0", "6fa2b54966771f1b9f8007d0b96c425de05db761161e794ed36d7a5f6e47713b", [:mix], [{:exconstructor, ">= 1.0.0", [hex: :exconstructor, repo: "hexpm", optional: false]}, {:floki, ">= 0.24.0", [hex: :floki, repo: "hexpm", optional: false]}, {:httpoison, ">= 0.9.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:poison, ">= 1.5.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "c4006bc27d957ca39fa1378817bb8af28f992526300d35d444416d13151cef32"}, "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, - "phoenix": {:hex, :phoenix, "1.7.17", "2fcdceecc6fb90bec26fab008f96abbd0fd93bc9956ec7985e5892cf545152ca", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {: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", "50e8ad537f3f7b0efb1509b2f75b5c918f697be6a45d48e49a30d3b7c0e464c9"}, + "phoenix": {:hex, :phoenix, "1.7.18", "5310c21443514be44ed93c422e15870aef254cf1b3619e4f91538e7529d2b2e4", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {: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", "1797fcc82108442a66f2c77a643a62980f342bfeb63d6c9a515ab8294870004e"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.6.3", "f686701b0499a07f2e3b122d84d52ff8a31f5def386e03706c916f6feddf69ef", [: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", "909502956916a657a197f94cc1206d9a65247538de8a5e186f7537c895d95764"}, "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, "phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"}, - "phoenix_live_view": {:hex, :phoenix_live_view, "1.0.0", "3a10dfce8f87b2ad4dc65de0732fc2a11e670b2779a19e8d3281f4619a85bce4", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [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", "254caef0028765965ca6bd104cc7d68dcc7d57cc42912bef92f6b03047251d99"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "1.0.1", "5389a30658176c0de816636ce276567478bffd063c082515a6e8368b8fc9a0db", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [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", "c0f517e6f290f10dbb94343ac22e0109437fb1fa6f0696e7c73967b789c1c285"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "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"}, "phoenix_view": {:hex, :phoenix_view, "2.0.4", "b45c9d9cf15b3a1af5fb555c674b525391b6a1fe975f040fb4d913397b31abf4", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "4e992022ce14f31fe57335db27a28154afcc94e9983266835bb3040243eb620b"}, - "phx_new": {:hex, :phx_new, "1.7.17", "3097014f87f3eb4c9a03c8e7418b24fe3e95711df8585084ad1aadcae174adc1", [:mix], [], "hexpm", "715876e496e296a3037eb5acc386824495c611ebfb007ddebfb6a8d241710c66"}, + "phx_new": {:hex, :phx_new, "1.7.18", "b3654da56a2db9ea69cb41186838a884df52463e2c5629e379ffa8a00356f16e", [:mix], [], "hexpm", "447ae02ab7c64a09942ca5370fce3c866a674f610517d06b46d65b905e81e6b5"}, "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [: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", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, "plug_cowboy": {:hex, :plug_cowboy, "2.7.2", "fdadb973799ae691bf9ecad99125b16625b1c6039999da5fe544d99218e662e4", [: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", "245d8a11ee2306094840c000e8816f0cbed69a23fc0ac2bcf8d7835ae019bb2f"}, "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, "poison": {:hex, :poison, "6.0.0", "9bbe86722355e36ffb62c51a552719534257ba53f3271dacd20fbbd6621a583a", [:mix], [{:decimal, "~> 2.1", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "bb9064632b94775a3964642d6a78281c07b7be1319e0016e1643790704e739a2"}, "postgrex": {:hex, :postgrex, "0.19.3", "a0bda6e3bc75ec07fca5b0a89bffd242ca209a4822a9533e7d3e84ee80707e19", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "d31c28053655b78f47f948c85bb1cf86a9c1f8ead346ba1aa0d0df017fa05b61"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, + "req": {:hex, :req, "0.5.8", "50d8d65279d6e343a5e46980ac2a70e97136182950833a1968b371e753f6a662", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "d7fc5898a566477e174f26887821a3c5082b243885520ee4b45555f5d53f40ef"}, "rewrite": {:hex, :rewrite, "1.1.1", "0e6674eb5f8cb11aabe5ad6207151b4156bf173aa9b43133a68f8cc882364570", [:mix], [{:glob_ex, "~> 0.1", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.0", [hex: :sourceror, repo: "hexpm", optional: false]}, {:text_diff, "~> 0.1", [hex: :text_diff, repo: "hexpm", optional: false]}], "hexpm", "fcd688b3ca543c3a1f1f4615ccc054ec37cfcde91133a27a683ec09b35ae1496"}, + "rustler": {:hex, :rustler, "0.35.0", "1e2e379e1150fab9982454973c74ac9899bd0377b3882166ee04127ea613b2d9", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:toml, "~> 0.6", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm", "a176bea1bb6711474f9dfad282066f2b7392e246459bf4e29dfff6d828779fdf"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.8.2", "5f25cbe220a8fac3e7ad62e6f950fcdca5a5a5f8501835d2823e8c74bf4268d5", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "63d1bd5f8e23096d1ff851839923162096364bac8656a4a3c00d1fff8e83ee0a"}, "safe_code": {:hex, :safe_code, "0.2.3", "c37329a03d4ac847ccd437344abdbb6d8a8ff6a46f1b6e5ad976bf9a86a5227f", [:mix], [{:jason, "~> 1.3", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_live_view, ">= 0.18.17", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}], "hexpm", "de5f3ad37d0f7804281f42be8dac32ee52f7b5f7c5c4c851eba34e42bffd4aef"}, "solid": {:hex, :solid, "0.16.0", "1fc244acc47eeb5f19c761b7d19d5c6e00fa77b03d6456873b635cc638bc3fc9", [:mix], [{:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "90dc45d410e0be7cc9cd1017f4665967a6ae29eeb3c5ee2b297903f04249345e"}, @@ -72,6 +78,7 @@ "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "text_diff": {:hex, :text_diff, "0.1.0", "1caf3175e11a53a9a139bc9339bd607c47b9e376b073d4571c031913317fecaa", [:mix], [], "hexpm", "d1ffaaecab338e49357b6daa82e435f877e0649041ace7755583a0ea3362dbd7"}, "thousand_island": {:hex, :thousand_island, "1.3.7", "1da7598c0f4f5f50562c097a3f8af308ded48cd35139f0e6f17d9443e4d0c9c5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "0139335079953de41d381a6134d8b618d53d084f558c734f2662d1a72818dd12"}, + "toml": {:hex, :toml, "0.7.0", "fbcd773caa937d0c7a02c301a1feea25612720ac3fa1ccb8bfd9d30d822911de", [:mix], [], "hexpm", "0690246a2478c1defd100b0c9b89b4ea280a22be9a7b313a8a058a2408a2fa70"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, "vix": {:hex, :vix, "0.31.1", "2b1d379393060ee8e4e1f1c9a621811c4091d8f063221c1ff24a41a4f0c97edc", [:make, :mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:cc_precompiler, "~> 0.1.4 or ~> 0.2", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.7.3 or ~> 0.8", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:kino, "~> 0.7", [hex: :kino, repo: "hexpm", optional: true]}], "hexpm", "766856b52bec222cb5fd301f645a7a9869b61e0ec6e87dc0789ae9657356a8ea"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, diff --git a/test/beacon/template/markdown_test.exs b/test/beacon/template/markdown_test.exs deleted file mode 100644 index c821976f3..000000000 --- a/test/beacon/template/markdown_test.exs +++ /dev/null @@ -1,35 +0,0 @@ -defmodule Beacon.Template.MarkdownTest do - use ExUnit.Case, async: true - - alias Beacon.Template.Markdown - - test "convert to html" do - expected = """ -
Paragraph
-defmodule MyApp do
- @moduledoc "Test"
-
- def foo, do: :bar
- end
-
- """
-
- assert Markdown.convert_to_html(
- """
- # Test
-
- Paragraph
-
- ```elixir
- defmodule MyApp do
- @moduledoc "Test"
-
- def foo, do: :bar
- end
- ```
- """,
- %{}
- ) == {:cont, expected}
- end
-end
diff --git a/test/beacon_web/beacon_assigns_test.exs b/test/beacon_web/beacon_assigns_test.exs
index c62664f94..38acdb3ee 100644
--- a/test/beacon_web/beacon_assigns_test.exs
+++ b/test/beacon_web/beacon_assigns_test.exs
@@ -14,12 +14,7 @@ defmodule Beacon.Web.BeaconAssignsTest do
Process.put(:__beacon_site__, site)
Process.flag(:error_handler, Beacon.ErrorHandler)
- [
- socket: %Phoenix.LiveView.Socket{
- assigns: %{__changed__: %{beacon: true}, beacon: %BeaconAssigns{}}
- },
- site: site
- ]
+ [site: site]
end
test "build with site", %{site: site} do
@@ -29,10 +24,10 @@ defmodule Beacon.Web.BeaconAssignsTest do
} = BeaconAssigns.new(site)
end
- test "build with published page resolves page title", %{site: site} do
+ test "build with published page resolves page title" do
page = beacon_published_page_fixture(path: "/blog", title: "blog index")
- assigns = BeaconAssigns.new(site, page, %{}, ["blog"], %{}, :beacon)
+ assigns = BeaconAssigns.new(page, path_info: ["blog"])
assert %BeaconAssigns{
site: @site,
@@ -43,10 +38,38 @@ defmodule Beacon.Web.BeaconAssignsTest do
} = assigns
end
- test "build with path info and query params", %{site: site} do
+ test "build with unpublished page stored in the database" do
+ page = beacon_page_fixture(path: "/blog", title: "blog index")
+
+ assigns = BeaconAssigns.new(page, path_info: ["blog"])
+
+ assert %BeaconAssigns{
+ site: @site,
+ page: %{path: "/blog", title: "blog index"},
+ private: %{
+ live_path: ["blog"]
+ }
+ } = assigns
+ end
+
+ test "build with new in-memory page " do
+ page = %Beacon.Content.Page{site: @site, path: "/blog", title: "blog index"}
+
+ assigns = BeaconAssigns.new(page, path_info: ["blog"])
+
+ assert %BeaconAssigns{
+ site: @site,
+ page: %{path: "/blog", title: "blog index"},
+ private: %{
+ live_path: ["blog"]
+ }
+ } = assigns
+ end
+
+ test "build with path info and query params" do
page = beacon_published_page_fixture(path: "/blog")
- assigns = BeaconAssigns.new(site, page, %{}, ["blog"], %{source: "search"}, :beacon)
+ assigns = BeaconAssigns.new(page, path_info: ["blog"], query_params: %{source: "search"})
assert %BeaconAssigns{
site: @site,
@@ -57,10 +80,10 @@ defmodule Beacon.Web.BeaconAssignsTest do
} = assigns
end
- test "build with path params", %{site: site} do
+ test "build with path params" do
page = beacon_published_page_fixture(path: "/blog/:post")
- assigns = BeaconAssigns.new(site, page, %{}, ["blog", "hello"], %{}, :beacon)
+ assigns = BeaconAssigns.new(page, path_info: ["blog", "hello"])
assert %BeaconAssigns{
site: @site,
@@ -68,13 +91,13 @@ defmodule Beacon.Web.BeaconAssignsTest do
} = assigns
end
- test "build with live data", %{site: site} do
+ test "build with live data" do
page = beacon_published_page_fixture(path: "/blog")
live_data = beacon_live_data_fixture(path: "/blog")
beacon_live_data_assign_fixture(live_data: live_data, format: :text, key: "customer_id", value: "123")
- assigns = BeaconAssigns.new(site, page, live_data, ["blog"], %{}, :beacon)
+ assigns = BeaconAssigns.new(page, path_info: ["blog"])
assert %BeaconAssigns{
site: @site,
@@ -83,9 +106,4 @@ defmodule Beacon.Web.BeaconAssignsTest do
}
} = assigns
end
-
- test "update/3", %{socket: socket} do
- assert %{assigns: %{beacon: %BeaconAssigns{site: "one"}}} = BeaconAssigns.update(socket, :site, "one")
- assert %{assigns: %{beacon: %BeaconAssigns{site: "two"}}} = BeaconAssigns.update(socket, :site, "two")
- end
end
diff --git a/test/beacon_web/data_source_test.exs b/test/beacon_web/data_source_test.exs
index 53f5a05e2..f35eaffd0 100644
--- a/test/beacon_web/data_source_test.exs
+++ b/test/beacon_web/data_source_test.exs
@@ -24,12 +24,12 @@ defmodule Beacon.Web.DataSourceTest do
describe "page_title" do
test "renders static content", %{site: site} do
page = beacon_published_page_fixture(site: site, title: "my title")
- assert DataSource.page_title(page.site, page.id, %{}, :beacon) == "my title"
+ assert DataSource.page_title(page, %{}) == "my title"
end
test "renders snippet", %{site: site} do
page = beacon_published_page_fixture(site: site, title: "{{ page.path | upcase }}")
- assert DataSource.page_title(page.site, page.id, %{}, :beacon) == "/HOME"
+ assert DataSource.page_title(page, %{}) == "/HOME"
end
end
end