Merge pull request #222 from firezone/208/fix_live_redirects

Upgrade to Phoenix 1.6, fix page title updates
This commit is contained in:
Jamil
2021-09-07 16:28:17 -07:00
committed by GitHub
24 changed files with 171 additions and 254 deletions

View File

@@ -1,4 +1,4 @@
nodejs 16.6.2
elixir 1.12.2-otp-24
erlang 24.0.5
elixir 1.12.3-otp-24
erlang 24.0.6
ruby 2.7.4

View File

@@ -7,6 +7,6 @@ defmodule FzHttpWeb.RuleController do
plug :redirect_unauthenticated
def index(conn, _params) do
render(conn, "index.html", page_heading: "Rules")
render(conn, "index.html", page_title: "Rules")
end
end

View File

@@ -0,0 +1,64 @@
<div>
<.form let={f} for={@changeset} id="account-edit" phx-target={@myself} phx-submit="save">
<div class="content">
<p>Change email or enter new password below.</p>
</div>
<div class="field">
<%= label f, :email, class: "label" %>
<div class="control">
<%= text_input f, :email, class: "input" %>
</div>
<p class="help is-danger">
<%= error_tag f, :email %>
</p>
</div>
<div class="field">
<%= label f, :password, "New password", class: "label" %>
<div class="control">
<%= password_input f, :password, class: "input password" %>
</div>
<p class="help is-danger">
<%= error_tag f, :password %>
</p>
</div>
<div class="field">
<%= label f, :password_confirmation, "New password confirmation", class: "label" %>
<div class="control">
<%= password_input f, :password_confirmation, class: "input password" %>
</div>
<p class="help is-danger">
<%= error_tag f, :password_confirmation %>
</p>
</div>
<hr>
<div class="content">
<p>Enter your current password to make these changes.</p>
</div>
<div class="field">
<%= label f, :current_password, class: "label" %>
<%= password_input f, :current_password, class: "input password" %>
<p class="help is-danger">
<%= error_tag f, :current_password %>
</p>
</div>
<div class="field">
<div class="control">
<div class="level">
<div class="level-left"></div>
<div class="level-right">
<%= submit "Save", phx_disable_with: "Saving...", class: "button is-primary" %>
</div>
</div>
</div>
</div>
</.form>
</div>

View File

@@ -1,62 +0,0 @@
<%= f = form_for @changeset, "#", [id: "account-edit", phx_target: @myself, phx_submit: "save"] %>
<div class="content">
<p>Change email or enter new password below.</p>
</div>
<div class="field">
<%= label f, :email, class: "label" %>
<div class="control">
<%= text_input f, :email, class: "input" %>
</div>
<p class="help is-danger">
<%= error_tag f, :email %>
</p>
<div>
<div class="field">
<%= label f, :password, "New password", class: "label" %>
<div class="control">
<%= password_input f, :password, class: "input password" %>
</div>
<p class="help is-danger">
<%= error_tag f, :password %>
</p>
</div>
<div class="field">
<%= label f, :password_confirmation, "New password confirmation", class: "label" %>
<div class="control">
<%= password_input f, :password_confirmation, class: "input password" %>
</div>
<p class="help is-danger">
<%= error_tag f, :password_confirmation %>
</p>
</div>
<hr>
<div class="content">
<p>Enter your current password to make these changes.</p>
</div>
<div class="field">
<%= label f, :current_password, class: "label" %>
<%= password_input f, :current_password, class: "input password" %>
<p class="help is-danger">
<%= error_tag f, :current_password %>
</p>
</div>
<div class="field">
<div class="control">
<div class="level">
<div class="level-left"></div>
<div class="level-right">
<%= submit "Save", phx_disable_with: "Saving...", class: "button is-primary" %>
</div>
</div>
</div>
</div>
</form>

View File

@@ -11,7 +11,7 @@ defmodule FzHttpWeb.AccountLive.Show do
{:ok,
socket
|> assign_defaults(params, session, &load_data/2)
|> assign(:page_heading, "Account")}
|> assign(:page_title, "Account")}
end
@impl true

View File

@@ -0,0 +1,25 @@
<div>
<.form let={f} for={@changeset} id="edit-device" phx-target={@myself} phx-submit="save">
<div class="field">
<%= label f, :name, class: "label" %>
<div class="control">
<%= text_input f, :name, class: "input" %>
</div>
<p class="help is-danger">
<%= error_tag f, :name %>
</p>
</div>
<div class="field">
<div class="control">
<div class="level">
<div class="level-left"></div>
<div class="level-right">
<%= submit "Save", phx_disable_with: "Saving...", class: "button is-primary" %>
</div>
</div>
</div>
</div>
</.form>
</div>

View File

@@ -1,23 +0,0 @@
<%= f = form_for(@changeset, "#", [id: "edit-device", phx_target: @myself, phx_submit: "save"]) %>
<div class="field">
<%= label f, :name, class: "label" %>
<div class="control">
<%= text_input f, :name, class: "input" %>
</div>
<p class="help is-danger">
<%= error_tag f, :name %>
</p>
<div>
<div class="field">
<div class="control">
<div class="level">
<div class="level-left"></div>
<div class="level-right">
<%= submit "Save", phx_disable_with: "Saving...", class: "button is-primary" %>
</div>
</div>
</div>
</div>
</form>

View File

@@ -14,7 +14,7 @@
<%= for device <- @devices do %>
<tr>
<td>
<%= live_redirect(device.name, to: Routes.device_show_path(@socket, :show, device)) %>
<%= link(device.name, to: Routes.device_show_path(@socket, :show, device)) %>
</td>
<td class="code"><%= device.public_key %></td>
<td class="code"><%= device.remote_ip || "Never connected" %></td>

View File

@@ -10,7 +10,7 @@ defmodule FzHttpWeb.DeviceLive.Index do
{:ok,
socket
|> assign_defaults(params, session, &load_data/2)
|> assign(:page_heading, "Devices")}
|> assign(:page_title, "Devices")}
end
def handle_event("create_device", _params, socket) do

View File

@@ -63,10 +63,10 @@
</dl>
</div>
<div class="level">
<%= live_redirect("Back to Devices", to: Routes.device_index_path(@socket, :index), class: "button") %>
<%= link("Back to Devices", to: Routes.device_index_path(@socket, :index), class: "button") %>
<button class="button is-danger"
phx-click="delete_device"
phx-value-device_id="<%= @device.id %>"
phx-value-device_id={@device.id}
data-confirm="Are you sure? This will remove all data associated with this device.">
Delete device
</button>

View File

@@ -50,7 +50,7 @@ defmodule FzHttpWeb.DeviceLive.Show do
assign(
socket,
device: device,
page_heading: device.name,
page_title: device.name,
wireguard_endpoint_ip: Application.fetch_env!(:fz_vpn, :wireguard_endpoint_ip),
wireguard_port: Application.fetch_env!(:fz_vpn, :wireguard_port)
)

View File

@@ -8,6 +8,6 @@ defmodule FzHttpWeb.RuleLive.Index do
{:ok,
socket
|> assign_defaults(params, session)
|> assign(:page_heading, "Rules")}
|> assign(:page_title, "Rules")}
end
end

View File

@@ -0,0 +1,51 @@
<div>
<h4 class="is-4 title"><%= @title %></h4>
<hr>
<.form let={f} for={@changeset} id={"#{@action}-form"} phx-target={@myself} phx-submit="add_rule">
<%= hidden_input f, :action, value: @action %>
<div class="field has-addons">
<div class="control is-expanded">
<%= text_input f,
:destination,
class: "input",
placeholder: "IPv4/6 CIDR range or address" %>
</div>
<div class="control">
<%= submit "Add", class: "button is-primary" %>
</div>
</div>
<p class="help is-danger">
<%= error_tag f, :destination %>
</p>
</.form>
<%= if length(@rule_list) > 0 do %>
<table class="table is-striped is-fullwidth">
<thead>
<tr>
<th>Destination</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for rule <- @rule_list do %>
<tr>
<td class="has-text-left">
<dd class="code">
<%= rule.destination %>
</dd>
</td>
<td class="has-text-right">
<a href="#"
phx-click="delete_rule"
phx-value-rule_id={rule.id}
phx-target={@myself}>
Delete
</a>
</td>
</tr>
<% end %>
</tbody>
</table>
<% end %>
</div>

View File

@@ -1,57 +0,0 @@
<h4 class="is-4 title"><%= @title %></h4>
<hr>
<%= f = form_for @changeset, "#", [id: "#{@action}-form", phx_target: @myself, phx_submit: :add_rule] %>
<%= hidden_input f, :action, value: @action %>
<div class="field has-addons">
<div class="control is-expanded">
<%= text_input f,
:destination,
class: "input",
placeholder: "IPv4/6 CIDR range or address" %>
</div>
<div class="control">
<%= submit "Add", class: "button is-primary" %>
</div>
</div>
<p class="help is-danger">
<%= error_tag f, :destination %>
</p>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>
<%= aggregated_errors(@changeset) %>
</p>
</div>
<% end %>
</form>
<%= if length(@rule_list) > 0 do %>
<table class="table is-striped is-fullwidth">
<thead>
<tr>
<th>Destination</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for rule <- @rule_list do %>
<tr>
<td class="has-text-left">
<dd class="code">
<%= rule.destination %>
</dd>
</td>
<td class="has-text-right">
<a href="#"
phx-click="delete_rule"
phx-value-rule_id="<%= rule.id %>"
phx-target="<%= @myself %>">
Delete
</a>
</td>
</tr>
<% end %>
</tbody>
</table>
<% end %>

View File

@@ -1,54 +0,0 @@
<div class="columns">
<div class="column is-4 is-offset-4">
<div class="content">
<h3 class="title">Sign Up</h3>
<hr>
<%= f = form_for @changeset, "#", [id: "create-user", phx_submit: :create_user] %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>
<%= aggregated_errors(@changeset) %>
</p>
</div>
<% end %>
<div class="field">
<%= label(f, :email, class: "label") %>
<div class="control">
<%= text_input(f, :email, class: "input") %>
</div>
<p class="help is-danger">
<%= error_tag f, :email %>
</p>
</div>
<div class="field">
<%= label(f, :password, class: "label") %>
<div class="control">
<%= password_input(f, :password, class: "input") %>
</div>
<p class="help is-danger">
<%= error_tag f, :password %>
</p>
</div>
<div class="field">
<%= label(f, :password_confirmation, class: "label") %>
<div class="control">
<%= password_input(f, :password_confirmation, class: "input") %>
</div>
<p class="help is-danger">
<%= error_tag f, :password_confirmation %>
</p>
</div>
<div class="field">
<div class="control">
<%= submit "Sign Up", class: "button is-primary" %>
</div>
</div>
</form>
</div>
</div>
</div>

View File

@@ -1,28 +0,0 @@
defmodule FzHttpWeb.UserLive.New do
@moduledoc """
LiveView for user sign up.
"""
use FzHttpWeb, :live_view
alias FzHttp.Users
def mount(_params, _session, socket) do
changeset = Users.new_user()
{:ok, assign(socket, :changeset, changeset)}
end
def handle_event("create_user", %{"user" => user_params}, socket) do
case Users.create_user(user_params) do
{:ok, user} ->
{:noreply,
socket
|> redirect(to: Routes.session_path(socket, :create, user.sign_in_token))}
{:error, changeset} ->
{:noreply,
socket
|> put_flash(:error, "Error creating user.")
|> assign(:changeset, changeset)}
end
end
end

View File

@@ -18,7 +18,6 @@
<% end %>
</div>
<% end %>
<!-- foobar -->
<div>
<%= @inner_content %>
</div>

View File

@@ -6,8 +6,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<%= csrf_meta_tag() %>
<%= live_title_tag assigns[:page_title] || "FireZone" %>
<link phx-track-static rel="stylesheet" href="<%= Routes.static_path(@conn, "/css/app.css") %>"/>
<script defer phx-track-static type="text/javascript" src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
<link phx-track-static rel="stylesheet" href={Routes.static_path(@conn, "/css/app.css")} />
<script defer phx-track-static type="text/javascript" src={Routes.static_path(@conn, "/js/app.js")}></script>
<!-- Fonts -->
<link rel="dns-prefetch" href="https://fonts.gstatic.com">

View File

@@ -5,9 +5,9 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<%= csrf_meta_tag() %>
<%= live_title_tag assigns[:page_title] || "FireZone" %>
<link phx-track-static rel="stylesheet" href="<%= Routes.static_path(@conn, "/css/app.css") %>"/>
<script defer phx-track-static type="text/javascript" src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
<%= live_title_tag assigns[:page_title], prefix: "FireZone" %>
<link phx-track-static rel="stylesheet" href={Routes.static_path(@conn, "/css/app.css")} />
<script defer phx-track-static type="text/javascript" src={Routes.static_path(@conn, "/js/app.js")}></script>
<!-- Favicon -->
<link rel="apple-touch-icon-precomposed" sizes="57x57" href="/images/favicon-apple-touch-114.png">
@@ -72,7 +72,7 @@
<ul class="menu-list">
<li>
<%= link(to: Routes.device_index_path(@conn, :index), class: nav_class(@conn.request_path, :devices)) do %>
<span class="icon has-update-mark"><i class="mdi mdi-laptop-windows"></i></span>
<span class="icon"><i class="mdi mdi-laptop-windows"></i></span>
<span class="menu-item-label">Devices</span>
<% end %>
</li>
@@ -100,7 +100,7 @@
<div class="level-left">
<div class="level-item">
<h1 class="title">
<%= @page_heading %>
<%= @page_title %>
</h1>
</div>
</div>
@@ -120,7 +120,7 @@
<div class="level">
<div class="level-left">
<div class="level-item">
<a href="mailto:<%= feedback_recipient() %>">Leave us feedback!</a>
<a href="mailto:{feedback_recipient()}">Leave us feedback!</a>
</div>
<div class="level-item">
<a href="https://github.com/firezone/firezone" style="height: 20px">

View File

@@ -46,7 +46,7 @@ defmodule FzHttp.MixProject do
[
{:fz_common, in_umbrella: true},
{:decimal, "~> 2.0"},
{:phoenix, "~> 1.5.12"},
{:phoenix, "~> 1.6.0-rc.0", override: true},
{:cloak, "~> 1.1"},
{:cloak_ecto, "~> 1.2"},
{:excoveralls, "~> 0.14", only: :test},
@@ -57,13 +57,14 @@ defmodule FzHttp.MixProject do
{:ecto_sql, "~> 3.7"},
{:ecto_network, "~> 1.3"},
{:inflex, "~> 2.1"},
{:plug, "~> 1.12"},
{:postgrex, "~> 0.15"},
{:phoenix_html, "~> 3.0"},
{:plug, "~> 1.12.1"},
{:postgrex, "~> 0.15.10"},
{:phoenix_html, "~> 3.0.3"},
{:phoenix_live_reload, "~> 1.3", only: :dev},
{:phoenix_live_view, "~> 0.16"},
{:phoenix_live_view, "~> 0.16.3"},
{:gettext, "~> 0.18"},
{:jason, "~> 1.2"},
{:telemetry, "~> 0.4.3"},
{:plug_cowboy, "~> 2.5"},
{:credo, "~> 1.5", only: [:dev, :test], runtime: false}
]

View File

@@ -32,16 +32,17 @@
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
"mime": {:hex, :mime, "2.0.1", "0de4c81303fe07806ebc2494d5321ce8fb4df106e34dd5f9d787b637ebadc256", [:mix], [], "hexpm", "7a86b920d2aedce5fb6280ac8261ac1a739ae6c1a1ad38f5eadf910063008942"},
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
"mix_test_watch": {:hex, :mix_test_watch, "1.0.3", "63d5b21e9278abf519f359e6d59aed704ed3c72ec38be6ab22306ae5dc9a2e06", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "7352e91952d9748fb4f8aebe0a60357cdaf4bd6d6c42b5139c78fbcda6a0d7a2"},
"mix_test_watch": {:hex, :mix_test_watch, "1.1.0", "330bb91c8ed271fe408c42d07e0773340a7938d8a0d281d57a14243eae9dc8c3", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "52b6b1c476cbb70fd899ca5394506482f12e5f6b0d6acff9df95c7f1e0812ec3"},
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
"phoenix": {:hex, :phoenix, "1.5.12", "75fddb14c720388eea93d33886166a690416a7ff8633fbd93f364355b6fe1166", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8f0ae6734fcc18bbaa646c161e2febc46fb899eae43f82679b92530983324113"},
"phoenix": {:hex, :phoenix, "1.6.0-rc.0", "87dc1bb400588019a878ecf32c2d229c7d7f31a520c574860a059934663ffa70", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2a0d344d2a2f654a9300b2b09dbf9c3821762e1364e26fce12d76fcd498b92c0"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
"phoenix_html": {:hex, :phoenix_html, "3.0.2", "0d71bd7dfa5fad2103142206e25e16accd64f41bcbd0002af3f0da17e530968d", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "d6c6e85d9bef8d52a5a66fcccd15529651f379eaccbf10500343a17f6f814f82"},
"phoenix_html": {:hex, :phoenix_html, "3.0.3", "32812d70841c7e975e01edb591989b2b002b69797db1005b8d0adc1fe717be30", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "e8152ae9e8c60705659761edb8d8c4bb7e29130a9b0803ec1854fe137ec62dde"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.3", "3a53772a6118d5679bf50fc1670505a290e32a1d195df9e069d8c53ab040c054", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "766796676e5f558dbae5d1bdb066849673e956005e3730dfd5affd7a6da4abac"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.16.0", "913d5a51b72fb6035762a4b443f22b515b4047b9872f82cb9afe44df850ee968", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.5.9 or ~> 1.6.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.0.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "eed6ba0aae9dd3936b72b46444e580896d740c0dc1d4c42049fb95ea5009db3c"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.16.3", "f6f597c74cfc8b00919eb717852b9b750fc326f815ef6b8d6ae503c7d9d09871", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.5.9 or ~> 1.6.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "42bac6b82fd182f10b0b3b39d57aaf2fbe5eab423f8216afeeea9c6b1bd14554"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"},
"plug": {:hex, :plug, "1.12.0", "39dc7f1ef8c46bb1bf6dd8f6a49f526c45b4b92ce553687fd885b559a46d0230", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5282c76e89efdf43f2e04bd268ca99d738039f9518137f02ff468cee3ba78096"},
"plug_cowboy": {:hex, :plug_cowboy, "2.5.0", "51c998f788c4e68fc9f947a5eba8c215fbb1d63a520f7604134cab0270ea6513", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5b2c8925a5e2587446f33810a58c01e66b3c345652eeec809b76ba007acde71a"},
"phoenix_view": {:hex, :phoenix_view, "1.0.0", "fea71ecaaed71178b26dd65c401607de5ec22e2e9ef141389c721b3f3d4d8011", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "82be3e2516f5633220246e2e58181282c71640dab7afc04f70ad94253025db0c"},
"plug": {:hex, :plug, "1.12.1", "645678c800601d8d9f27ad1aebba1fdb9ce5b2623ddb961a074da0b96c35187d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d57e799a777bc20494b784966dc5fbda91eb4a09f571f76545b72a634ce0d30b"},
"plug_cowboy": {:hex, :plug_cowboy, "2.5.2", "62894ccd601cf9597e2c23911ff12798a8a18d237e9739f58a6b04e4988899fe", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ea6e87f774c8608d60c8d34022a7d073bd7680a0a013f049fc62bf35efea1044"},
"plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"},
"postgrex": {:hex, :postgrex, "0.15.10", "2809dee1b1d76f7cbabe570b2a9285c2e7b41be60cf792f5f2804a54b838a067", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {: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]}], "hexpm", "1560ca427542f6b213f8e281633ae1a3b31cdbcd84ebd7f50628765b8f6132be"},
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},