diff --git a/.circleci/config.yml b/.circleci/config.yml index d242afa6f26..e0d30cbf67b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -118,7 +118,7 @@ workflows: - build: name: "Check for security vulnerabilities" execute: - - run: sudo -u lightning mix sobelow + - run: sudo -u lightning mix sobelow --threshold medium - build: name: "Check Elixir tests (codecov)" execute: diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ca4e93acebc..ddea126bf56 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,7 +9,7 @@ jobs: build-and-deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: erlef/setup-elixir@v1 with: otp-version: 26 diff --git a/.sobelow-conf b/.sobelow-conf index 3cbf95bace4..64cb059b68f 100644 --- a/.sobelow-conf +++ b/.sobelow-conf @@ -7,6 +7,6 @@ format: "txt", out: "", threshold: "low", - ignore: ["Config.CSP"], + ignore: ["Config.CSP", "Config.HTTPS"], ignore_files: [""] ] diff --git a/lib/lightning/auth_providers/oauth_http_client.ex b/lib/lightning/auth_providers/oauth_http_client.ex index 8e808a65352..f47fc4b44c1 100644 --- a/lib/lightning/auth_providers/oauth_http_client.ex +++ b/lib/lightning/auth_providers/oauth_http_client.ex @@ -6,12 +6,14 @@ defmodule Lightning.AuthProviders.OauthHTTPClient do Returns structured error responses that integrate well with the audit system. """ - use Tesla - alias LightningWeb.RouteHelpers require Logger + defp adapter do + Application.get_env(:tesla, __MODULE__, [])[:adapter] + end + @doc """ Revokes an OAuth token. @@ -77,10 +79,13 @@ defmodule Lightning.AuthProviders.OauthHTTPClient do redirect_uri: RouteHelpers.oidc_callback_url() } - Tesla.client([ - Tesla.Middleware.FormUrlencoded - ]) - |> post(client.token_endpoint, body) + Tesla.client( + [ + Tesla.Middleware.FormUrlencoded + ], + adapter() + ) + |> Tesla.post(client.token_endpoint, body) |> handle_response([200]) |> maybe_introspect(client) end @@ -114,10 +119,13 @@ defmodule Lightning.AuthProviders.OauthHTTPClient do grant_type: "refresh_token" } - Tesla.client([ - Tesla.Middleware.FormUrlencoded - ]) - |> post(client.token_endpoint, body) + Tesla.client( + [ + Tesla.Middleware.FormUrlencoded + ], + adapter() + ) + |> Tesla.post(client.token_endpoint, body) |> handle_response([200]) |> maybe_introspect(client) |> case do @@ -155,7 +163,8 @@ defmodule Lightning.AuthProviders.OauthHTTPClient do else headers = [{"Authorization", "Bearer #{access_token}"}] - get(client.userinfo_endpoint, headers: headers) + Tesla.client([{Tesla.Middleware.Headers, headers}], adapter()) + |> Tesla.get(client.userinfo_endpoint) |> handle_response([200]) end end @@ -194,10 +203,13 @@ defmodule Lightning.AuthProviders.OauthHTTPClient do client_secret: client.client_secret } - Tesla.client([ - Tesla.Middleware.FormUrlencoded - ]) - |> post(client.revocation_endpoint, body) + Tesla.client( + [ + Tesla.Middleware.FormUrlencoded + ], + adapter() + ) + |> Tesla.post(client.revocation_endpoint, body) |> handle_response([200, 204]) |> case do {:ok, _} -> @@ -240,10 +252,13 @@ defmodule Lightning.AuthProviders.OauthHTTPClient do token_type_hint: "access_token" } - Tesla.client([ - Tesla.Middleware.FormUrlencoded - ]) - |> post(client.introspection_endpoint, body) + Tesla.client( + [ + Tesla.Middleware.FormUrlencoded + ], + adapter() + ) + |> Tesla.post(client.introspection_endpoint, body) |> handle_response([200]) end diff --git a/lib/lightning/usage_tracking/client.ex b/lib/lightning/usage_tracking/client.ex index ee96a29d560..7db1b6ca36a 100644 --- a/lib/lightning/usage_tracking/client.ex +++ b/lib/lightning/usage_tracking/client.ex @@ -4,30 +4,35 @@ defmodule Lightning.UsageTracking.Client do """ - use Tesla, only: [:head, :post], docs: false - alias Lightning.UsageTracking.ResponseProcessor + defp adapter do + Application.get_env(:tesla, __MODULE__, [])[:adapter] + end + def submit_metrics(metrics, host) do response = host |> build_client() - |> post("/api/metrics", metrics) + |> Tesla.post("/api/metrics", metrics) if ResponseProcessor.successful?(response), do: :ok, else: :error end def reachable?(host) do build_head_client(host) - |> head("/") + |> Tesla.head("/") |> ResponseProcessor.successful?() end defp build_client(host) do - Tesla.client([{Tesla.Middleware.BaseUrl, host}, Tesla.Middleware.JSON]) + Tesla.client( + [{Tesla.Middleware.BaseUrl, host}, Tesla.Middleware.JSON], + adapter() + ) end defp build_head_client(host) do - Tesla.client([{Tesla.Middleware.BaseUrl, host}]) + Tesla.client([{Tesla.Middleware.BaseUrl, host}], adapter()) end end diff --git a/lib/lightning/usage_tracking/github_client.ex b/lib/lightning/usage_tracking/github_client.ex index 7ecb5a993bc..fe67ebc20ae 100644 --- a/lib/lightning/usage_tracking/github_client.ex +++ b/lib/lightning/usage_tracking/github_client.ex @@ -2,12 +2,14 @@ defmodule Lightning.UsageTracking.GithubClient do @moduledoc """ A github client to make unauthenticated HTTP requests to Github. """ - use Tesla, only: [:head], docs: false - alias Lightning.UsageTracking.ResponseProcessor @host "https://github.com/" + defp adapter do + Application.get_env(:tesla, __MODULE__, [])[:adapter] + end + def open_fn_commit?(nil = _commit_sha), do: false def open_fn_commit?("" = _commit_sha), do: false @@ -15,12 +17,12 @@ defmodule Lightning.UsageTracking.GithubClient do response = @host |> build_client() - |> head("OpenFn/lightning/commit/#{commit_sha}") + |> Tesla.head("OpenFn/lightning/commit/#{commit_sha}") ResponseProcessor.successful_200?(response) end def build_client(host) do - Tesla.client([{Tesla.Middleware.BaseUrl, host}]) + Tesla.client([{Tesla.Middleware.BaseUrl, host}], adapter()) end end diff --git a/lib/lightning/version_control/github_client.ex b/lib/lightning/version_control/github_client.ex index 6b51252523d..8344332a964 100644 --- a/lib/lightning/version_control/github_client.ex +++ b/lib/lightning/version_control/github_client.ex @@ -3,23 +3,24 @@ defmodule Lightning.VersionControl.GithubClient do Tesla github http client we use this to make any network requests to github from Lightning """ - use Tesla - alias Lightning.VersionControl.GithubError alias Lightning.VersionControl.GithubToken require Logger - plug(Tesla.Middleware.BaseUrl, "https://api.github.com") - plug(Tesla.Middleware.JSON) + defp adapter do + Application.get_env(:tesla, __MODULE__, [])[:adapter] + end def create_repo_dispatch_event(client, repo_name, body) do - client |> post("/repos/#{repo_name}/dispatches", body) |> handle_resp([204]) + client + |> Tesla.post("/repos/#{repo_name}/dispatches", body) + |> handle_resp([204]) end def create_workflow_dispatch_event(client, repo_name, workflow_id, body) do client - |> post( + |> Tesla.post( "repos/#{repo_name}/actions/workflows/#{workflow_id}/dispatches", body ) @@ -27,66 +28,72 @@ defmodule Lightning.VersionControl.GithubClient do end def get_installations(client) do - client |> get("/user/installations") |> handle_resp([200]) + client |> Tesla.get("/user/installations") |> handle_resp([200]) end def get_installation_repos(client, query \\ [page: 1, per_page: 100]) do client - |> get("/installation/repositories", query: query) + |> Tesla.get("/installation/repositories", query: query) |> handle_resp([200]) end def get_repo(client, repo_name) do - client |> get("/repos/#{repo_name}") |> handle_resp([200]) + client |> Tesla.get("/repos/#{repo_name}") |> handle_resp([200]) end def get_repo_branches(client, repo_name) do - client |> get("/repos/#{repo_name}/branches") |> handle_resp([200]) + client |> Tesla.get("/repos/#{repo_name}/branches") |> handle_resp([200]) end def get_repo_content(client, repo, path, ref) do client - |> get("/repos/#{repo}/contents/#{path}", query: [ref: ref]) + |> Tesla.get("/repos/#{repo}/contents/#{path}", query: [ref: ref]) |> handle_resp([200]) end def delete_repo_content(client, repo, path, body) do client - |> delete("/repos/#{repo}/contents/#{path}", body: body) + |> Tesla.delete("/repos/#{repo}/contents/#{path}", body: body) |> handle_resp([200]) end def create_blob(client, repo, body) do - client |> post("/repos/#{repo}/git/blobs", body) |> handle_resp([201]) + client |> Tesla.post("/repos/#{repo}/git/blobs", body) |> handle_resp([201]) end def create_tree(client, repo, body) do - client |> post("/repos/#{repo}/git/trees", body) |> handle_resp([201]) + client |> Tesla.post("/repos/#{repo}/git/trees", body) |> handle_resp([201]) end def get_commit(client, repo, ref) do - client |> get("/repos/#{repo}/commits/#{ref}") |> handle_resp([200]) + client |> Tesla.get("/repos/#{repo}/commits/#{ref}") |> handle_resp([200]) end def create_commit(client, repo, body) do - client |> post("/repos/#{repo}/git/commits", body) |> handle_resp([201]) + client + |> Tesla.post("/repos/#{repo}/git/commits", body) + |> handle_resp([201]) end def create_ref(client, repo, body) do - client |> post("/repos/#{repo}/git/refs", body) |> handle_resp([201]) + client |> Tesla.post("/repos/#{repo}/git/refs", body) |> handle_resp([201]) end def update_ref(client, repo, ref, body) do - client |> post("/repos/#{repo}/git/refs/#{ref}", body) |> handle_resp([200]) + client + |> Tesla.post("/repos/#{repo}/git/refs/#{ref}", body) + |> handle_resp([200]) end def delete_ref(client, repo, ref) do - client |> delete("/repos/#{repo}/git/refs/#{ref}") |> handle_resp([204]) + client + |> Tesla.delete("/repos/#{repo}/git/refs/#{ref}") + |> handle_resp([204]) end def delete_app_grant(client, app_client_id, token) do client - |> delete("/applications/#{app_client_id}/grant", + |> Tesla.delete("/applications/#{app_client_id}/grant", body: %{access_token: token} ) |> handle_resp([204]) @@ -94,25 +101,25 @@ defmodule Lightning.VersionControl.GithubClient do def get_repo_public_key(client, repo) do client - |> get("/repos/#{repo}/actions/secrets/public-key") + |> Tesla.get("/repos/#{repo}/actions/secrets/public-key") |> handle_resp([200]) end def get_repo_secret(client, repo, secret_name) do client - |> get("/repos/#{repo}/actions/secrets/#{secret_name}") + |> Tesla.get("/repos/#{repo}/actions/secrets/#{secret_name}") |> handle_resp([200]) end def create_repo_secret(client, repo, secret_name, body) do client - |> put("/repos/#{repo}/actions/secrets/#{secret_name}", body) + |> Tesla.put("/repos/#{repo}/actions/secrets/#{secret_name}", body) |> handle_resp([201, 204]) end def delete_repo_secret(client, repo, secret_name) do client - |> delete("/repos/#{repo}/actions/secrets/#{secret_name}") + |> Tesla.delete("/repos/#{repo}/actions/secrets/#{secret_name}") |> handle_resp([204]) end @@ -126,26 +133,30 @@ defmodule Lightning.VersionControl.GithubClient do ]} ] - {:ok, Tesla.client(middleware)} + {:ok, Tesla.client(middleware, adapter())} end def build_bearer_client(token) do middleware = [ + {Tesla.Middleware.BaseUrl, "https://api.github.com"}, + Tesla.Middleware.JSON, {Tesla.Middleware.Headers, [ {"Authorization", "Bearer #{token}"} ]} ] - {:ok, Tesla.client(middleware)} + {:ok, Tesla.client(middleware, adapter())} end def build_basic_auth_client(username, password) do middleware = [ + {Tesla.Middleware.BaseUrl, "https://api.github.com"}, + Tesla.Middleware.JSON, {Tesla.Middleware.BasicAuth, [username: username, password: password]} ] - {:ok, Tesla.client(middleware)} + {:ok, Tesla.client(middleware, adapter())} end def build_installation_client(installation_id) do @@ -155,7 +166,7 @@ defmodule Lightning.VersionControl.GithubClient do with {:ok, auth_token, _} <- GithubToken.build(cert, app_id), {:ok, client} <- build_bearer_client(auth_token) do - case post( + case Tesla.post( client, "/app/installations/#{installation_id}/access_tokens", "" diff --git a/lib/lightning_web/controllers/project_file_controller.ex b/lib/lightning_web/controllers/project_file_controller.ex index c21700e3c9a..ff7be4372d9 100644 --- a/lib/lightning_web/controllers/project_file_controller.ex +++ b/lib/lightning_web/controllers/project_file_controller.ex @@ -6,6 +6,8 @@ defmodule LightningWeb.ProjectFileController do alias Lightning.Repo alias Lightning.Storage.ProjectFileDefinition + # sobelow_skip ["Traversal.SendDownload"] + # Path is safe: generated by storage_path_for_exports/2 using system UUIDs only def download(conn, %{"id" => id}) do project_file = Repo.get!(Lightning.Projects.File, id) diff --git a/lib/lightning_web/router.ex b/lib/lightning_web/router.ex index db05dc69627..f924c32e735 100644 --- a/lib/lightning_web/router.ex +++ b/lib/lightning_web/router.ex @@ -50,6 +50,7 @@ defmodule LightningWeb.Router do pipeline :authenticated_json do plug :accepts, ["json"] plug :fetch_session + plug :protect_from_forgery plug :fetch_current_user end diff --git a/lib/mix/tasks/install_adaptor_icons.ex b/lib/mix/tasks/install_adaptor_icons.ex index 0329dcb10f2..6ac0f795bdb 100644 --- a/lib/mix/tasks/install_adaptor_icons.ex +++ b/lib/mix/tasks/install_adaptor_icons.ex @@ -3,12 +3,13 @@ defmodule Mix.Tasks.Lightning.InstallAdaptorIcons do Installs the adaptor icons """ use Mix.Task - use Tesla, except: [:post, :put, :delete] - - plug Tesla.Middleware.FollowRedirects @adaptors_tar_url "https://github.com/OpenFn/adaptors/archive/refs/heads/main.tar.gz" + defp adapter do + Application.get_env(:tesla, __MODULE__, [])[:adapter] + end + @target_dir Application.compile_env(:lightning, :adaptor_icons_path) @impl true @@ -46,10 +47,14 @@ defmodule Mix.Tasks.Lightning.InstallAdaptorIcons do end defp fetch_body!(url) do - response = get!(url) + response = Tesla.get!(build_client(), url) response.body end + defp build_client do + Tesla.client([Tesla.Middleware.FollowRedirects], adapter()) + end + defp tmp_dir! do tmp_dir = Path.join([ diff --git a/mix.exs b/mix.exs index 91475b681b6..0ed24b91b3f 100644 --- a/mix.exs +++ b/mix.exs @@ -84,8 +84,8 @@ defmodule Lightning.MixProject do {:ecto_psql_extras, "~> 0.8.2"}, {:ecto_sql, "~> 3.13"}, {:esbuild, "~> 0.9", runtime: Mix.env() == :dev}, - {:ex_doc, "~> 0.28", only: :dev, runtime: false}, - {:ex_json_schema, "~> 0.9.1"}, + {:ex_doc, "~> 0.39", only: :dev, runtime: false}, + {:ex_json_schema, "~> 0.11.2"}, {:ex_machina, "~> 2.8.0", only: :test}, {:excoveralls, "~> 0.18.5", only: [:test, :dev]}, {:floki, ">= 0.30.0", only: :test}, @@ -116,7 +116,7 @@ defmodule Lightning.MixProject do {:phoenix_live_dashboard, "~> 0.8"}, {:phoenix_live_reload, "~> 1.5", only: :dev}, {:phoenix_live_view, "~> 1.0.17"}, - {:phoenix_storybook, "~> 0.6.4", only: :dev}, + {:phoenix_storybook, "~> 0.9.2", only: :dev}, {:cors_plug, "~> 3.0"}, {:plug_cowboy, "~> 2.5"}, {:postgrex, ">= 0.0.0"}, @@ -125,15 +125,15 @@ defmodule Lightning.MixProject do {:retry, "~> 0.18"}, {:scrivener, "~> 2.7"}, {:sentry, "~> 10.9.0"}, - {:sobelow, "~> 0.14.0", only: [:test, :dev]}, + {:sobelow, "~> 0.14.1", only: [:test, :dev]}, {:sweet_xml, "~> 0.7.1", only: [:test]}, {:swoosh, "~> 1.17"}, {:gen_smtp, "~> 1.1"}, {:tailwind, "~> 0.3", runtime: Mix.env() == :dev}, {:telemetry_metrics, "~> 1.0"}, {:telemetry_poller, "~> 1.0"}, - {:tesla, "~> 1.13.0"}, - {:tidewave, "~> 0.5.0", only: :dev}, + {:tesla, "~> 1.15.3"}, + {:tidewave, "~> 0.5.4", only: :dev}, {:timex, "~> 3.7"}, {:replug, "~> 0.1.0"}, {:phoenix_swoosh, "~> 1.2.1"}, diff --git a/mix.lock b/mix.lock index 67f73f32e03..1ff96a874b5 100644 --- a/mix.lock +++ b/mix.lock @@ -9,7 +9,7 @@ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "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"}, "cachex": {:hex, :cachex, "4.1.1", "574c5cd28473db313a0a76aac8c945fe44191659538ca6a1e8946ec300b1a19f", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:ex_hash_ring, "~> 6.0", [hex: :ex_hash_ring, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "d6b7449ff98d6bb92dda58bd4fc3189cae9f99e7042054d669596f56dc503cd8"}, - "castore": {:hex, :castore, "1.0.16", "8a4f9a7c8b81cda88231a08fe69e3254f16833053b23fa63274b05cbc61d2a1e", [:mix], [], "hexpm", "33689203a0eaaf02fcd0e86eadfbcf1bd636100455350592e7e2628564022aaf"}, + "castore": {:hex, :castore, "1.0.17", "4f9770d2d45fbd91dcf6bd404cf64e7e58fed04fadda0923dc32acca0badffa2", [:mix], [], "hexpm", "12d24b9d80b910dd3953e165636d68f147a31db945d2dcb9365e441f8b5351e5"}, "certifi": {:hex, :certifi, "2.15.0", "0e6e882fcdaaa0a5a9f2b3db55b1394dba07e8d6d9bcad08318fb604c6839712", [:rebar3], [], "hexpm", "b147ed22ce71d72eafdad94f055165c1c182f61a2ff49df28bcc71d1d5b94a60"}, "chameleon": {:hex, :chameleon, "2.5.0", "102dd809f78701875efd0a203730dd64296a1f2d29c8efa6b00cc029d58ff39e", [:mix], [], "hexpm", "f3559827d8b4fe53a44e19e56ae94bedd36a355e0d33e18067b8abc37ec428db"}, "circular_buffer": {:hex, :circular_buffer, "1.0.0", "25c004da0cba7bd8bc1bdabded4f9a902d095e20600fd15faf1f2ffbaea18a07", [:mix], [], "hexpm", "c829ec31c13c7bafd1f546677263dff5bfb006e929f25635878ac3cfba8749e5"}, @@ -42,9 +42,9 @@ "esbuild": {:hex, :esbuild, "0.10.0", "b0aa3388a1c23e727c5a3e7427c932d89ee791746b0081bbe56103e9ef3d291f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "468489cda427b974a7cc9f03ace55368a83e1a7be12fba7e30969af78e5f8c70"}, "eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"}, "eventually": {:hex, :eventually, "1.1.0", "d07725b29008eaad708e1252be026530278913e7d8db39bd6b09de060b241f37", [:mix], [], "hexpm", "c66aadf8c7000aeb17b0cc3fe2b6833ae0942bb53d23b7ad7c3aab8a2286f873"}, - "ex_doc": {:hex, :ex_doc, "0.38.4", "ab48dff7a8af84226bf23baddcdda329f467255d924380a0cf0cee97bb9a9ede", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "f7b62346408a83911c2580154e35613eb314e0278aeea72ed7fedef9c1f165b2"}, + "ex_doc": {:hex, :ex_doc, "0.39.3", "519c6bc7e84a2918b737aec7ef48b96aa4698342927d080437f61395d361dcee", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "0590955cf7ad3b625780ee1c1ea627c28a78948c6c0a9b0322bd976a079996e1"}, "ex_hash_ring": {:hex, :ex_hash_ring, "6.0.4", "bef9d2d796afbbe25ab5b5a7ed746e06b99c76604f558113c273466d52fa6d6b", [:mix], [], "hexpm", "89adabf31f7d3dfaa36802ce598ce918e9b5b33bae8909ac1a4d052e1e567d18"}, - "ex_json_schema": {:hex, :ex_json_schema, "0.9.3", "fc17c50d410fd99fa6e814e1aed60122d8ff2578b869d17a9db1ce1c621382b6", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "b79962d09cefd33001706255187bdb483a0c2b4442d5edc6822eb7574a8df0a8"}, + "ex_json_schema": {:hex, :ex_json_schema, "0.11.2", "8f8200e6afa5473f37dbebd1e72bf97d8d5dd0128125123ed1532611267f0138", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "395f4aaf32ea0a14d861b16695e7bc8a1b5d841e0fd374d25aef9701bf8da825"}, "ex_machina": {:hex, :ex_machina, "2.8.0", "a0e847b5712065055ec3255840e2c78ef9366634d62390839d4880483be38abe", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "79fe1a9c64c0c1c1fab6c4fa5d871682cb90de5885320c187d117004627a7729"}, "excoveralls": {:hex, :excoveralls, "0.18.5", "e229d0a65982613332ec30f07940038fe451a2e5b29bce2a5022165f0c9b157e", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "523fe8a15603f86d64852aab2abe8ddbd78e68579c8525ae765facc5eae01562"}, "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"}, @@ -78,10 +78,10 @@ "libcluster_postgres": {:hex, :libcluster_postgres, "0.2.0", "14a5064b78f891c46935a66489454814d949a52b447fc1daff5d4a440e6f5847", [:mix], [{:libcluster, "~> 3.3", [hex: :libcluster, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "ab2e952371c5a0a0fcb263216c7eae2a2267977b3bb3236650daed3054a93edd"}, "live_debugger": {:hex, :live_debugger, "0.3.2", "b67baa8ed6a4329fe0c6aaf21a403cce4d0bac9b33d90707fe2609108614ac69", [:mix], [{:igniter, ">= 0.5.40 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: true]}, {:phoenix_live_view, "~> 0.20.4 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}], "hexpm", "5050b37af05a2b84d429e7256a41d3612283c4c802edd23e6eeb4e0b6fc2a712"}, "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, - "makeup_eex": {:hex, :makeup_eex, "0.1.2", "93a5ef3d28ed753215dba2d59cb40408b37cccb4a8205e53ef9b5319a992b700", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.16 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_html, "~> 0.1.0 or ~> 1.0", [hex: :makeup_html, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "6140eafb28215ad7182282fd21d9aa6dcffbfbe0eb876283bc6b768a6c57b0c3"}, + "makeup_eex": {:hex, :makeup_eex, "2.0.2", "88983b72aadb2e8408b06f7c9413804ce7eae2ca2a5a35cb738c6a9cb393c155", [:mix], [{:makeup, "~> 1.2.1 or ~> 1.3", [hex: :makeup, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_html, "~> 0.2.0 or ~> 1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 1.2", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "30ac121dda580298ff3378324ffaec94aad5a5b67e0cc6af177c67d5f45629b9"}, "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.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"}, - "makeup_html": {:hex, :makeup_html, "0.1.2", "19d4050c0978a4f1618ffe43054c0049f91fe5feeb9ae8d845b5dc79c6008ae5", [:mix], [{:makeup, "~> 1.2", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "b7fb9afedd617d167e6644a0430e49c1279764bfd3153da716d4d2459b0998c5"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"}, + "makeup_html": {:hex, :makeup_html, "0.2.0", "9f810da8d43d625ccd3f7ea25997e588fa541d80e0a8c6b895157ad5c7e9ca13", [:mix], [{:makeup, "~> 1.2", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "0856f7beb9a6a642ab1307e06d990fe39f0ba58690d0b8e662aa2e027ba331b2"}, "meck": {:hex, :meck, "0.9.2", "85ccbab053f1db86c7ca240e9fc718170ee5bda03810a6292b5306bf31bae5f5", [:rebar3], [], "hexpm", "81344f561357dc40a8344afa53767c32669153355b626ea9fcbc8da6b3045826"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, @@ -92,7 +92,7 @@ "mock": {:hex, :mock, "0.3.9", "10e44ad1f5962480c5c9b9fa779c6c63de9bd31997c8e04a853ec990a9d841af", [:mix], [{:meck, "~> 0.9.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "9e1b244c4ca2551bb17bb8415eed89e40ee1308e0fbaed0a4fdfe3ec8a4adbd3"}, "mox": {:hex, :mox, "1.2.0", "a2cd96b4b80a3883e3100a221e8adc1b98e4c3a332a8fc434c39526babafd5b3", [:mix], [{:nimble_ownership, "~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}], "hexpm", "c7b92b3cc69ee24a7eeeaf944cd7be22013c52fcb580c1f33f50845ec821089a"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, - "nimble_ownership": {:hex, :nimble_ownership, "1.0.1", "f69fae0cdd451b1614364013544e66e4f5d25f36a2056a9698b793305c5aa3a6", [:mix], [], "hexpm", "3825e461025464f519f3f3e4a1f9b68c47dc151369611629ad08b636b73bb22d"}, + "nimble_ownership": {:hex, :nimble_ownership, "1.0.2", "fa8a6f2d8c592ad4d79b2ca617473c6aefd5869abfa02563a77682038bf916cf", [:mix], [], "hexpm", "098af64e1f6f8609c6672127cfe9e9590a5d3fcdd82bc17a377b8692fd81a879"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "nimble_totp": {:hex, :nimble_totp, "1.0.0", "79753bae6ce59fd7cacdb21501a1dbac249e53a51c4cd22b34fa8438ee067283", [:mix], [], "hexpm", "6ce5e4c068feecdb782e85b18237f86f66541523e6bad123e02ee1adbe48eda9"}, @@ -108,14 +108,14 @@ "phoenix_html": {:hex, :phoenix_html, "4.3.0", "d3577a5df4b6954cd7890c84d955c470b5310bb49647f0a114a6eeecc850f7ad", [:mix], [], "hexpm", "3eaa290a78bab0f075f791a46a981bbe769d94bc776869f4f3063a14f30497ad"}, "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_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_reload": {:hex, :phoenix_live_reload, "1.6.2", "b18b0773a1ba77f28c52decbb0f10fd1ac4d3ae5b8632399bbf6986e3b665f62", [: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", "d1f89c18114c50d394721365ffb428cce24f1c13de0467ffa773e2ff4a30d5b9"}, "phoenix_live_view": {:hex, :phoenix_live_view, "1.0.18", "943431edd0ef8295ffe4949f0897e2cb25c47d3d7ebba2b008d7c68598b887f1", [: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 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", "724934fd0a68ecc57281cee863674454b06163fed7f5b8005b5e201ba4b23316"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.2.0", "ff3a5616e1bed6804de7773b92cbccfc0b0f473faf1f63d7daf1206c7aeaaa6f", [:mix], [], "hexpm", "adc313a5bf7136039f63cfd9668fde73bba0765e0614cba80c06ac9460ff3e96"}, - "phoenix_storybook": {:hex, :phoenix_storybook, "0.6.4", "d7bfdf6a20214251ff7453cbcb9de5f6f8a7db606f9c21846a87ba09058d8f0e", [:mix], [{:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:heroicons, "~> 0.5", [hex: :heroicons, repo: "hexpm", optional: true]}, {:jason, "~> 1.3", [hex: :jason, repo: "hexpm", optional: true]}, {:makeup_eex, "~> 0.1.0", [hex: :makeup_eex, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html_helpers, "~> 1.0", [hex: :phoenix_html_helpers, repo: "hexpm", optional: false]}, {:phoenix_live_view, "> 0.18.7", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}], "hexpm", "a63669c010e638882d287aae9c2cfd4a2c64d68e05f85403e213101283a74d3f"}, + "phoenix_storybook": {:hex, :phoenix_storybook, "0.9.2", "6bc80f89284e47c8f53a39ddf80ce19dff459d3a3490dce11349a280c6192762", [:mix], [{:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:jason, "~> 1.3", [hex: :jason, repo: "hexpm", optional: true]}, {:makeup_eex, "~> 2.0.2", [hex: :makeup_eex, repo: "hexpm", optional: false]}, {:makeup_html, "~> 0.2.0", [hex: :makeup_html, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html_helpers, "~> 1.0", [hex: :phoenix_html_helpers, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}], "hexpm", "4dbfd43e85a5d578235fb53df38f9f7ba0809156b56d55a52e7cec0b2648aba2"}, "phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.1", "b74ccaa8046fbc388a62134360ee7d9742d5a8ae74063f34eb050279de7a99e1", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "4000eeba3f9d7d1a6bf56d2bd56733d5cadf41a7f0d8ffe5bb67e7d667e204a2"}, "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"}, - "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": {:hex, :plug, "1.19.1", "09bac17ae7a001a68ae393658aa23c7e38782be5c5c00c80be82901262c394c0", [: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", "560a0017a8f6d5d30146916862aaf9300b7280063651dd7e532b8be168511e62"}, "plug_cowboy": {:hex, :plug_cowboy, "2.7.5", "261f21b67aea8162239b2d6d3b4c31efde4daa22a20d80b19c2c0f21b34b270e", [: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", "20884bf58a90ff5a5663420f5d2c368e9e15ed1ad5e911daf0916ea3c57f77ac"}, "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"}, "poison": {:hex, :poison, "4.0.1", "bcb755a16fac91cad79bfe9fc3585bb07b9331e50cfe3420a24bcc2d735709ae", [:mix], [], "hexpm", "ba8836feea4b394bb718a161fc59a288fe0109b5006d6bdf97b6badfcf6f0f25"}, @@ -133,7 +133,7 @@ "scrivener": {:hex, :scrivener, "2.7.2", "1d913c965ec352650a7f864ad7fd8d80462f76a32f33d57d1e48bc5e9d40aba2", [:mix], [], "hexpm", "7866a0ec4d40274efbee1db8bead13a995ea4926ecd8203345af8f90d2b620d9"}, "sentry": {:hex, :sentry, "10.9.0", "503575bc98ef268ad75e9792e17637ab7b270ed8036614f777a1833272409016", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_ownership, "~> 0.3.0 or ~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, "~> 0.20 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "9abf07e6a757f6650e2429b5773f546ff119f6980b9bb02067a7eb510a75c9f2"}, "sleeplocks": {:hex, :sleeplocks, "1.1.3", "96a86460cc33b435c7310dbd27ec82ca2c1f24ae38e34f8edde97f756503441a", [:rebar3], [], "hexpm", "d3b3958552e6eb16f463921e70ae7c767519ef8f5be46d7696cc1ed649421321"}, - "sobelow": {:hex, :sobelow, "0.14.0", "dd82aae8f72503f924fe9dd97ffe4ca694d2f17ec463dcfd365987c9752af6ee", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "7ecf91e298acfd9b24f5d761f19e8f6e6ac585b9387fb6301023f1f2cd5eed5f"}, + "sobelow": {:hex, :sobelow, "0.14.1", "2f81e8632f15574cba2402bcddff5497b413c01e6f094bc0ab94e83c2f74db81", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "8fac9a2bd90fdc4b15d6fca6e1608efb7f7c600fa75800813b794ee9364c87f2"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "statistex": {:hex, :statistex, "1.1.0", "7fec1eb2f580a0d2c1a05ed27396a084ab064a40cfc84246dbfb0c72a5c761e5", [:mix], [], "hexpm", "f5950ea26ad43246ba2cce54324ac394a4e7408fdcf98b8e230f503a0cba9cf5"}, "statistics": {:hex, :statistics, "0.6.3", "7fb182e7c1cab2980e392c7efef7ce326539f081f9defda4099550e9c2c7cb0f", [:mix], [], "hexpm", "a43d87726d240205e9ef47f29650a6e3132b4e4061e05512f32fa8120784a8e0"}, @@ -145,8 +145,8 @@ "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, "telemetry_metrics_prometheus_core": {:hex, :telemetry_metrics_prometheus_core, "1.2.1", "c9755987d7b959b557084e6990990cb96a50d6482c683fb9622a63837f3cd3d8", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "5e2c599da4983c4f88a33e9571f1458bf98b0cf6ba930f1dc3a6e8cf45d5afb6"}, "telemetry_poller": {:hex, :telemetry_poller, "1.3.0", "d5c46420126b5ac2d72bc6580fb4f537d35e851cc0f8dbd571acf6d6e10f5ec7", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "51f18bed7128544a50f75897db9974436ea9bfba560420b646af27a9a9b35211"}, - "tesla": {:hex, :tesla, "1.13.2", "85afa342eb2ac0fee830cf649dbd19179b6b359bec4710d02a3d5d587f016910", [: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.6", [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", "960609848f1ef654c3cdfad68453cd84a5febecb6ed9fed9416e36cd9cd724f9"}, - "tidewave": {:hex, :tidewave, "0.5.2", "f549acffe9daeed8b6b547c232c60de987770da7f827f9b3300140dfc465b102", [:mix], [{:circular_buffer, "~> 0.4 or ~> 1.0", [hex: :circular_buffer, repo: "hexpm", optional: false]}, {:igniter, "~> 0.6", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_live_reload, ">= 1.6.1", [hex: :phoenix_live_reload, repo: "hexpm", optional: true]}, {:plug, "~> 1.17", [hex: :plug, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "34ab3ffee7e402f05cd1eae68d0e77ed0e0d1925677971ef83634247553e8afd"}, + "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"}, + "tidewave": {:hex, :tidewave, "0.5.4", "b7b6db62779a6faf139e630eb54f218cf3091ec5d39600197008db8474cb6fb2", [:mix], [{:bandit, ">= 1.10.1", [hex: :bandit, repo: "hexpm", optional: true]}, {:circular_buffer, "~> 0.4 or ~> 1.0", [hex: :circular_buffer, repo: "hexpm", optional: false]}, {:igniter, "~> 0.6", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_live_reload, ">= 1.6.1", [hex: :phoenix_live_reload, repo: "hexpm", optional: true]}, {:plug, "~> 1.17", [hex: :plug, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "252c7cf4ffe81d4c5ad8ef709333e7124c5af554aa07dceab61135d0f205a898"}, "timex": {:hex, :timex, "3.7.13", "0688ce11950f5b65e154e42b47bf67b15d3bc0e0c3def62199991b8a8079a1e2", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.26", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "09588e0522669328e973b8b4fd8741246321b3f0d32735b589f78b136e6d4c54"}, "tzdata": {:hex, :tzdata, "1.1.3", "b1cef7bb6de1de90d4ddc25d33892b32830f907e7fc2fccd1e7e22778ab7dfbc", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "d4ca85575a064d29d4e94253ee95912edfb165938743dbf002acdf0dcecb0c28"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.1", "a48703a25c170eedadca83b11e88985af08d35f37c6f664d6dcfb106a97782fc", [:rebar3], [], "hexpm", "b3a917854ce3ae233619744ad1e0102e05673136776fb2fa76234f3e03b23642"}, diff --git a/storybook/_root.index.exs b/storybook/_root.index.exs index c061f69049a..edef47c744e 100644 --- a/storybook/_root.index.exs +++ b/storybook/_root.index.exs @@ -5,8 +5,10 @@ defmodule Storybook.Root do use PhoenixStorybook.Index - def folder_icon, do: {:fa, "book-open", :light, "lsb-mr-1"} def folder_name, do: "Storybook" + def folder_icon, do: {:fa, "book-open", :light, "lsb-mr-1"} + def folder_open?, do: true + def folder_index, do: 0 def entry("welcome") do [