Packages
live_svelte
0.18.0
0.18.0
0.18.0-rc0
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.15.0
0.15.0-rc.6
0.15.0-rc.5
0.15.0-rc.4
0.15.0-rc.3
0.15.0-rc.2
0.15.0-rc.1
0.14.1
0.14.0
0.13.3
0.13.3-rc.1
0.13.2
0.13.1
0.13.0
0.12.0
0.11.0
0.10.2
0.10.1
0.10.0
0.9.0
0.9.0-rc2
0.9.0-rc1
0.9.0-rc0
0.8.0
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.5.0-rc0
0.4.2
0.4.2-rc0
0.4.1
0.4.1-rc0
0.4.0
0.3.5
0.3.5-rc1
0.3.5-rc0
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.3.0-rc1
0.3.0-rc0
0.2.0
0.2.0-rc1
0.2.0-rc0
0.1.0
0.1.0-rc5
0.1.0-rc4
0.1.0-rc3
0.1.0-rc2
0.1.0-rc1
0.1.0-rc0
E2E reactivity for Svelte and LiveView
Current section
Files
Jump to
Current section
Files
lib/ssr.ex
defmodule LiveSvelte.SSR.NotConfigured do
@moduledoc false
defexception [:message]
end
defmodule LiveSvelte.SSR do
@moduledoc """
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.
"""
@type component_name :: String.t()
@type props :: %{optional(String.t() | atom) => any}
@type slots :: %{optional(String.t() | atom) => any}
@typedoc """
A render response which should take the shape:
%{
"css" => %{
"code" => String.t | nil,
"map" => String.t | nil
},
"head" => String.t,
"html" => String.t
}
"""
@type render_response :: %{
required(String.t()) =>
%{
required(String.t()) => String.t() | nil
}
| String.t()
}
@callback render(component_name, props, slots) :: render_response | no_return
@spec render(component_name, props, slots) :: render_response | no_return
def render(name, props, slots) do
mod = Application.get_env(:live_svelte, :ssr_module, LiveSvelte.SSR.NodeJS)
meta = %{component: name, props: props, slots: slots}
:telemetry.span([:live_svelte, :ssr], meta, fn ->
{mod.render(name, props, slots), meta}
end)
end
@deprecated "Use LiveSvelte.SSR.NodeJS.server_path/0 instead."
def server_path() do
LiveSvelte.SSR.NodeJS.server_path()
end
end