Update dependencies (#838)

* Update Elixir deps

* Update JS dependencies

* Bump Tailwind to v3

* Update Hex badge color

* Set SameSite for the session cookie
This commit is contained in:
Jonatan Kłosko 2021-12-29 22:06:19 +01:00 committed by GitHub
parent ebadc8d4bc
commit 53869371c2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 2857 additions and 3295 deletions

View file

@ -1,6 +1,6 @@
<h1><img src="https://github.com/livebook-dev/livebook/raw/main/static/images/logo-with-text.png" alt="Livebook" width="400"></h1>
[![Hex.pm](https://img.shields.io/hexpm/v/livebook)](https://hex.pm/packages/livebook)
[![Hex.pm](https://img.shields.io/hexpm/v/livebook?color=3e64ff)](https://hex.pm/packages/livebook)
Livebook is a web application for writing interactive and collaborative code notebooks for Elixir, built with [Phoenix LiveView](https://github.com/phoenixframework/phoenix_live_view). It features:

6056
assets/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -31,7 +31,7 @@
"remark-rehype": "^10.0.0",
"remixicon": "^2.5.0",
"scroll-into-view-if-needed": "^2.2.28",
"tailwindcss": "^2.1.1",
"tailwindcss": "^3.0.8",
"topbar": "^1.0.1",
"unified": "^10.1.0",
"unist-util-visit": "^4.0.0",

View file

@ -1,13 +1,11 @@
module.exports = {
mode: "jit",
purge: [
content: [
"../lib/**/*.ex",
"../lib/**/*.leex",
"../lib/**/*.heex",
"../lib/**/*.eex",
"./js/**/*.js",
],
darkMode: false,
theme: {
fontFamily: {
sans: ["Inter"],
@ -54,8 +52,5 @@ module.exports = {
},
},
},
variants: {
extend: {},
},
plugins: [],
};

View file

@ -7,7 +7,8 @@ defmodule LivebookWeb.Endpoint do
@session_options [
store: :cookie,
key: "_livebook_key",
signing_salt: "deadbook"
signing_salt: "deadbook",
same_site: "Lax"
]
socket "/live", Phoenix.LiveView.Socket,

View file

@ -13,7 +13,7 @@ defmodule LivebookWeb.ExploreHelpers do
class: "flex items-center justify-center p-6 border-2 border-gray-100 rounded-t-2xl h-[150px]" do %>
<img src={@notebook_info.details.cover_url} class="max-h-full max-w-[75%]" />
<% end %>
<div class="px-6 py-4 bg-gray-100 rounded-b-2xl flex-grow">
<div class="px-6 py-4 bg-gray-100 rounded-b-2xl grow">
<%= live_redirect @notebook_info.title,
to: Routes.explore_path(@socket, :notebook, @notebook_info.slug),
class: "text-gray-800 font-semibold cursor-pointer" %>

View file

@ -21,7 +21,7 @@ defmodule LivebookWeb.ExploreLive do
@impl true
def render(assigns) do
~H"""
<div class="flex flex-grow h-full">
<div class="flex grow h-full">
<SidebarHelpers.sidebar>
<SidebarHelpers.logo_item socket={@socket} />
<SidebarHelpers.break_item />
@ -32,7 +32,7 @@ defmodule LivebookWeb.ExploreLive do
active={false} />
<SidebarHelpers.user_item current_user={@current_user} path={Routes.explore_path(@socket, :user)} />
</SidebarHelpers.sidebar>
<div class="flex-grow px-6 py-8 overflow-y-auto">
<div class="grow px-6 py-8 overflow-y-auto">
<div class="max-w-screen-md w-full mx-auto px-4 pb-8 space-y-8">
<div>
<PageHelpers.title text="Explore" socket={@socket} />
@ -55,7 +55,7 @@ defmodule LivebookWeb.ExploreLive do
class: "button-base button-blue" %>
</div>
</div>
<div class="flex-grow hidden md:flex flex items-center justify-center">
<div class="grow hidden md:flex flex items-center justify-center">
<img src={@lead_notebook_info.details.cover_url} height="120" width="120" alt="livebook" />
</div>
</div>
@ -105,7 +105,7 @@ defmodule LivebookWeb.ExploreLive do
<div class="text-lg text-gray-400 font-semibold">
<%= number |> Integer.to_string() |> String.pad_leading(2, "0") %>
</div>
<div class="flex-grow text-lg text-gray-800 font-semibold">
<div class="grow text-lg text-gray-800 font-semibold">
<%= notebook_info.title %>
</div>
<%= live_redirect to: Routes.explore_path(@socket, :notebook, notebook_info.slug),

View file

@ -63,14 +63,14 @@ defmodule LivebookWeb.FileSelectComponent do
~H"""
<div class="h-full flex flex-col">
<div class="flex space-x-3 items-center mb-4">
<div class="flex-grow flex space-x-1">
<div class="grow flex space-x-1">
<.file_system_menu_button
file={@file}
file_systems={@file_systems}
file_system_select_disabled={@file_system_select_disabled}
socket={@socket}
myself={@myself} />
<form class="flex-grow"
<form class="grow"
phx-change="set_path"
phx-submit={if @submit_event, do: "submit"}
onsubmit={unless @submit_event, do: "return false"}
@ -111,7 +111,7 @@ defmodule LivebookWeb.FileSelectComponent do
<% end %>
<%= if @deleting_file do %>
<div class="mb-4 px-4 py-3 flex space-x-4 items-center border border-gray-200 rounded-lg">
<p class="flex-grow text-gray-700 text-sm">
<p class="grow text-gray-700 text-sm">
Are you sure you want to irreversibly delete
<span class="font-semibold"><%= @deleting_file.path %></span>?
</p>
@ -131,7 +131,7 @@ defmodule LivebookWeb.FileSelectComponent do
</div>
<% end %>
</div>
<div class="flex-grow -m-1 p-1 overflow-y-auto tiny-scrollbar" tabindex="-1">
<div class="grow -m-1 p-1 overflow-y-auto tiny-scrollbar" tabindex="-1">
<div class="hidden grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-2 border-b border-dashed border-grey-200 mb-2 pb-2"
id="new_dir_section">
<div class="flex space-x-2 items-center p-2 rounded-lg">
@ -275,11 +275,11 @@ defmodule LivebookWeb.FileSelectComponent do
</span>
<span class={"flex font-medium overflow-hidden whitespace-nowrap #{if(@file_info.is_running, do: "text-green-300", else: "text-gray-500")}"}>
<%= if @file_info.highlighted != "" do %>
<span class={"font-medium overflow-hidden overflow-ellipsis #{if(@file_info.is_running, do: "text-green-400", else: "text-gray-900")}"}>
<span class={"font-medium overflow-hidden text-ellipsis #{if(@file_info.is_running, do: "text-green-400", else: "text-gray-900")}"}>
<%= @file_info.highlighted %>
</span>
<% end %>
<span class="overflow-hidden overflow-ellipsis">
<span class="overflow-hidden text-ellipsis">
<%= @file_info.unhighlighted %>
</span>
</span>

View file

@ -28,7 +28,7 @@ defmodule LivebookWeb.HomeLive do
@impl true
def render(assigns) do
~H"""
<div class="flex flex-grow h-full">
<div class="flex grow h-full">
<SidebarHelpers.sidebar>
<SidebarHelpers.break_item />
<SidebarHelpers.link_item
@ -38,7 +38,7 @@ defmodule LivebookWeb.HomeLive do
active={false} />
<SidebarHelpers.user_item current_user={@current_user} path={Routes.home_path(@socket, :user)} />
</SidebarHelpers.sidebar>
<div class="flex-grow px-6 py-8 overflow-y-auto">
<div class="grow px-6 py-8 overflow-y-auto">
<div class="max-w-screen-lg w-full mx-auto px-4 pb-8 space-y-4">
<div class="flex flex-col space-y-2 items-center pb-4 border-b border-gray-200
sm:flex-row sm:space-y-0 sm:justify-between">

View file

@ -30,7 +30,7 @@ defmodule LivebookWeb.HomeLive.ImportComponent do
File upload
</span>
<% end %>
<div class="flex-grow tab">
<div class="grow tab">
</div>
</div>
<div>

View file

@ -64,7 +64,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
<div>
<.remix_icon icon="windy-line" class="text-gray-400 text-xl" />
</div>
<div class="flex-grow flex items-center justify-between">
<div class="grow flex items-center justify-between">
<div class="text-gray-600">
You do not have any running sessions.
<%= if @show_autosave_note? do %>
@ -87,7 +87,7 @@ defmodule LivebookWeb.HomeLive.SessionListComponent do
<%= for session <- @sessions do %>
<div class="py-4 flex items-center border-b border-gray-300"
data-test-session-id={session.id}>
<div class="flex-grow flex flex-col items-start">
<div class="grow flex flex-col items-start">
<%= live_redirect session.notebook_name,
to: Routes.session_path(@socket, :page, session.id),
class: "font-semibold text-gray-800 hover:text-gray-900" %>

View file

@ -49,7 +49,7 @@ defmodule LivebookWeb.Output.TableDynamicLive do
<h3 class="font-semibold text-gray-800">
<%= @name %>
</h3>
<div class="flex-grow"></div>
<div class="grow"></div>
<!-- Actions -->
<div class="flex space-x-2">
<%= if :refetch in @features do %>

View file

@ -72,7 +72,7 @@ defmodule LivebookWeb.SessionLive do
@impl true
def render(assigns) do
~H"""
<div class="flex flex-grow h-full"
<div class="flex grow h-full"
id={"session-#{@session.id}"}
data-element="session"
phx-hook="Session"
@ -119,7 +119,7 @@ defmodule LivebookWeb.SessionLive do
<.runtime_info data_view={@data_view} session={@session} socket={@socket} empty_default_runtime={@empty_default_runtime} />
</div>
</div>
<div class="flex-grow overflow-y-auto relative" data-element="notebook">
<div class="grow overflow-y-auto relative" data-element="notebook">
<div data-element="output-iframes" phx-update="ignore" id="output-iframes"></div>
<div class="w-full max-w-screen-lg px-16 mx-auto py-7" data-element="notebook-content">
<div class="flex items-center pb-4 mb-6 space-x-4 border-b border-gray-200"
@ -129,7 +129,7 @@ defmodule LivebookWeb.SessionLive do
phx-hook="Headline"
data-on-value-change="set_notebook_name"
data-metadata="notebook">
<h1 class="flex-grow p-1 -ml-1 text-3xl font-semibold text-gray-800 border border-transparent rounded-lg whitespace-pre-wrap"
<h1 class="grow p-1 -ml-1 text-3xl font-semibold text-gray-800 border border-transparent rounded-lg whitespace-pre-wrap"
tabindex="0"
id="notebook-heading"
data-element="heading"
@ -299,14 +299,14 @@ defmodule LivebookWeb.SessionLive do
defp sections_list(assigns) do
~H"""
<div class="flex flex-col flex-grow">
<div class="flex flex-col grow">
<h3 class="uppercase text-sm font-semibold text-gray-500">
Sections
</h3>
<div class="flex flex-col mt-4 space-y-4">
<%= for section_item <- @data_view.sections_items do %>
<div class="flex items-center">
<button class="flex-grow flex items-center text-gray-500 hover:text-gray-900 text-left"
<button class="grow flex items-center text-gray-500 hover:text-gray-900 text-left"
data-element="sections-list-item"
data-section-id={section_item.id}>
<span class="flex items-center space-x-1">
@ -335,7 +335,7 @@ defmodule LivebookWeb.SessionLive do
defp clients_list(assigns) do
~H"""
<div class="flex flex-col flex-grow">
<div class="flex flex-col grow">
<div class="flex items-center justify-between space-x-4">
<h3 class="uppercase text-sm font-semibold text-gray-500">
Users
@ -354,7 +354,7 @@ defmodule LivebookWeb.SessionLive do
<button class="flex items-center space-x-2 text-gray-500 hover:text-gray-900 disabled:pointer-events-none"
disabled={client_pid == @self}
data-element="client-link">
<.user_avatar user={user} class="flex-shrink-0 h-7 w-7" text_class="text-xs" />
<.user_avatar user={user} class="shrink-0 h-7 w-7" text_class="text-xs" />
<span><%= user.name || "Anonymous" %></span>
</button>
<%= if client_pid != @self do %>
@ -382,7 +382,7 @@ defmodule LivebookWeb.SessionLive do
defp runtime_info(assigns) do
~H"""
<div class="flex flex-col flex-grow">
<div class="flex flex-col grow">
<div class="flex items-center justify-between">
<h3 class="uppercase text-sm font-semibold text-gray-500">
Runtime

View file

@ -48,7 +48,7 @@ defmodule LivebookWeb.SessionLive.CellUploadComponent do
</div>
</label>
</div>
<div class="flex-grow">
<div class="grow">
<input class="input" name="name" value={@name} placeholder="Name" autocomplete="off" />
</div>
</div>

View file

@ -76,7 +76,7 @@ defmodule LivebookWeb.SessionLive.PersistenceLive do
[<.file_system_icon file_system={@new_attrs.file.file_system} />]
</span>
</span>
<span class="text-gray-700 whitespace-no-wrap font-medium overflow-ellipsis overflow-hidden">
<span class="text-gray-700 whitespace-no-wrap font-medium text-ellipsis overflow-hidden">
<%= @new_attrs.file.path %>
</span>
<button class="button-base button-gray button-small"

View file

@ -11,7 +11,7 @@ defmodule LivebookWeb.SessionLive.SectionComponent do
phx-hook="Headline"
data-on-value-change="set_section_name"
data-metadata={@section_view.id}>
<h2 class="flex-grow text-gray-800 font-semibold text-2xl px-1 -ml-1 rounded-lg border border-transparent whitespace-pre-wrap cursor-text"
<h2 class="grow text-gray-800 font-semibold text-2xl px-1 -ml-1 rounded-lg border border-transparent whitespace-pre-wrap cursor-text"
tabindex="0"
id={@section_view.html_id}
data-element="heading"

View file

@ -177,7 +177,7 @@ defmodule LivebookWeb.SessionLive.ShortcutsComponent do
<%= @title %>
</h3>
<div class="mt-2 flex flex-col lg:flex-row lg:space-x-4">
<div class="lg:flex-grow">
<div class="lg:grow">
<.shortcuts_section_table shortcuts={@left} platform={@platform} />
</div>
<div class="lg:w-1/2">

View file

@ -20,7 +20,7 @@ defmodule LivebookWeb.SettingsLive do
@impl true
def render(assigns) do
~H"""
<div class="flex flex-grow h-full">
<div class="flex grow h-full">
<SidebarHelpers.sidebar>
<SidebarHelpers.logo_item socket={@socket} />
<SidebarHelpers.break_item />
@ -31,7 +31,7 @@ defmodule LivebookWeb.SettingsLive do
active={false} />
<SidebarHelpers.user_item current_user={@current_user} path={Routes.settings_path(@socket, :user)} />
</SidebarHelpers.sidebar>
<div class="flex-grow px-6 py-8 overflow-y-auto">
<div class="grow px-6 py-8 overflow-y-auto">
<div class="max-w-screen-md w-full mx-auto px-4 pb-8 space-y-16">
<!-- System settings section -->
<div class="flex flex-col space-y-8">

View file

@ -56,7 +56,7 @@ defmodule LivebookWeb.SidebarHelpers do
def break_item(assigns) do
~H"""
<div class="flex-grow"></div>
<div class="grow"></div>
"""
end

View file

@ -47,7 +47,7 @@ defmodule LivebookWeb.UserComponent do
style={"background-color: #{@preview_user.hex_color}"}>
</div>
</div>
<div class="relative flex-grow">
<div class="relative grow">
<%= text_input f, :hex_color, value: @data["hex_color"], class: "input", spellcheck: "false", maxlength: 7 %>
<button
class="icon-button absolute right-2 top-1"

View file

@ -1,3 +1,3 @@
<main role="main" class="flex-grow flex flex-col h-screen">
<main role="main" class="grow flex flex-col h-screen">
<%= @inner_content %>
</main>
</main>

View file

@ -1,4 +1,4 @@
<main role="main" class="flex-grow flex flex-col h-screen">
<main role="main" class="grow flex flex-col h-screen">
<div class="fixed right-8 bottom-5 z-50 flex flex-col space-y-3 max-h-[80%] overflow-y-auto tiny-scrollbar">
<%= if live_flash(@flash, :info) do %>
<div class="shadow-custom-1 max-w-2xl flex items-center space-x-3 rounded-lg px-4 py-2 border-l-4 rounded-l-none border-blue-500 bg-white text-gray-600 hover:bg-gray-50 hover:text-gray-500 cursor-pointer" role="alert"

View file

@ -1,7 +1,7 @@
%{
"aws_signature": {:hex, :aws_signature, "0.2.0", "cc952020c8ffa2480159492844ea2493441b9b3d90f43d7015796a085a8d94d7", [:rebar3], [], "hexpm", "5e40314aa0c84a994f4f780c7184869391e8ff7a6cd2f739fd51ad9df96c9782"},
"bypass": {:hex, :bypass, "2.1.0", "909782781bf8e20ee86a9cabde36b259d44af8b9f38756173e8f5e2e1fabb9b1", [:mix], [{:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "d9b5df8fa5b7a6efa08384e9bbecfe4ce61c77d28a4282f79e02f1ef78d96b80"},
"castore": {:hex, :castore, "0.1.13", "ccf3ab251ffaebc4319f41d788ce59a6ab3f42b6c27e598ad838ffecee0b04f9", [:mix], [], "hexpm", "a14a7eecfec7e20385493dbb92b0d12c5d77ecfd6307de10102d58c94e8c49c0"},
"castore": {:hex, :castore, "0.1.14", "3f6d7c7c1574c402fef29559d3f1a7389ba3524bc6a090a5e9e6abc3af65dcca", [:mix], [], "hexpm", "b34af542eadb727e6c8b37fdf73e18b2e02eb483a4ea0b52fd500bc23f052b7b"},
"cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
"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.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
@ -9,11 +9,11 @@
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
"floki": {:hex, :floki, "0.32.0", "f915dc15258bc997d49be1f5ef7d3992f8834d6f5695270acad17b41f5bcc8e2", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "1c5a91cae1fd8931c26a4826b5e2372c284813904c8bacb468b5de39c7ececbd"},
"html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
"jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"},
"jason": {:hex, :jason, "1.3.0", "fa6b82a934feb176263ad2df0dbd91bf633d4a46ebfdffea0c8ae82953714946", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "53fc1f51255390e0ec7e50f9cb41e751c260d065dcba2bf0d08dc51a4002c2ac"},
"mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"},
"phoenix": {:hex, :phoenix, "1.6.2", "6cbd5c8ed7a797f25a919a37fafbc2fb1634c9cdb12a4448d7a5d0b26926f005", [: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", "7bbee475acae0c3abc229b7f189e210ea788e63bd168e585f60c299a4b2f9133"},
"phoenix_html": {:hex, :phoenix_html, "3.1.0", "0b499df05aad27160d697a9362f0e89fa0e24d3c7a9065c2bd9d38b4d1416c09", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "0c0a98a2cefa63433657983a2a594c7dee5927e4391e0f1bfd3a151d1def33fc"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.6.1", "fb94a33c077141f9ac7930b322a7a3b99f9b144bf3a08dd667b9f9aaf0319889", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.3", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.17.1", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "6faf1373e5846c8ab68c2cf55cfa5c196c1fbbe0c72d12a4cdfaaac6ef189948"},
"phoenix": {:hex, :phoenix, "1.6.5", "07af307b28a5820b4394f27ac7003df052e065ff651520a58abb16be1eecd519", [: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", "97dc3052ca648499280e0636471f1d0439fc623ccdce27d2d8135651421ee80c"},
"phoenix_html": {:hex, :phoenix_html, "3.2.0", "1c1219d4b6cb22ac72f12f73dc5fad6c7563104d083f711c3fcd8551a1f4ae11", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "36ec97ba56d25c0136ef1992c37957e4246b649d620958a1f9fa86165f8bc54f"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.6.2", "0769470265eb13af01b5001b29cb935f4710d6adaa1ffc18417a570a337a2f0f", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.3", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.17.1", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "5bc6c6b38a2ca8b5020b442322fcee6afd5e641637a0b1fb059d4bd89bc58e7b"},
"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.17.5", "63f52a6f9f6983f04e424586ff897c016ecc5e4f8d1e2c22c2887af1c57215d8", [: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.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c5586e6a3d4df71b8214c769d4f5eb8ece2b4001711a7ca0f97323c36958b0e3"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"},