# `LiveSvelte.SSR`
[🔗](https://github.com/woutdp/live_svelte/blob/v0.18.0/lib/ssr.ex#L7)

A behaviour for rendering Svelte components server-side.

To define a custom renderer, change the application config in `config.exs`:

    config :live_svelte, ssr_module: MyCustomSSRModule

## Telemetry

Exposes a telemetry span for each render under the key `[:live_svelte, :ssr]`.

The following events are emitted:

  * `[:live_svelte, :ssr, :start]` — fired when a render begins.
    Metadata: `%{component: name, props: props, slots: slots}`.

  * `[:live_svelte, :ssr, :stop]` — fired when a render completes successfully.
    Metadata: same. Measurements include `%{duration: duration}` in native time units
    (convert with `:erlang.convert_time_unit(duration, :native, :millisecond)`).

  * `[:live_svelte, :ssr, :exception]` — fired when the renderer raises.
    The exception is re-raised after the event is emitted.

# `component_name`

```elixir
@type component_name() :: String.t()
```

# `props`

```elixir
@type props() :: %{optional(String.t() | atom()) =&gt; any()}
```

# `render_response`

```elixir
@type render_response() :: %{
  required(String.t()) =&gt;
    %{required(String.t()) =&gt; String.t() | nil} | String.t()
}
```

A render response which should take the shape:
    %{
      "css" => %{
        "code" => String.t | nil,
        "map" => String.t | nil
      },
      "head" => String.t,
      "html" => String.t
    }

# `slots`

```elixir
@type slots() :: %{optional(String.t() | atom()) =&gt; any()}
```

# `render`

```elixir
@callback render(component_name(), props(), slots()) :: render_response() | no_return()
```

# `render`

```elixir
@spec render(component_name(), props(), slots()) :: render_response() | no_return()
```

# `server_path`

> This function is deprecated. Use LiveSvelte.SSR.NodeJS.server_path/0 instead..

---

*Consult [api-reference.md](api-reference.md) for complete listing*
