Soundcheck.Check.Warning.AssignSetOnlyWhenConnected (soundcheck v0.1.0)

Copy Markdown View Source

Basics

This check is disabled by default.

Learn how to enable it via .credo.exs.

This check has a base priority of high and works with any version of Elixir.

Explanation

Flags template reads of assigns that mount/3 sets only when connected?(socket) is true. LiveView renders every page twice: first over HTTP, disconnected, then over the websocket. The disconnected render raises KeyError on the missing assign, so the page never loads.

Before:

def mount(_params, _session, socket) do
  if connected?(socket),
    do: {:ok, assign(socket, :stats, Stats.load())},
    else: {:ok, socket}
end

def render(assigns), do: ~H"<p>{@stats.total}</p>"

After:

def mount(_params, _session, socket) do
  stats = if connected?(socket), do: Stats.load(), else: nil
  {:ok, assign(socket, :stats, stats)}
end

The check interprets mount/3 once per context, following if connected?(socket) and its negations. Keys that handle_params/3 or an on_mount hook assigns are never reported, because both run on the disconnected render too. When the disconnected path passes the socket to a function soundcheck does not model, the check makes no claim. When handle_params/3 does, or an on_mount hook cannot be read, findings are unverifiable.

Confidence: high. Tier: semantic (run mix compile before mix credo).

Check-Specific Parameters

Use the following parameters to configure this check:

:excluded_paths

Paths to skip (atoms, binaries as path segments, or regexes).

This parameter defaults to [~r/\/test\//, "test"].

:strict

Report unverifiable findings too.

This parameter defaults to false.

General Parameters

Like with all checks, general params can be applied.

Parameters can be configured via the .credo.exs config file.