diff --git a/.tool-versions b/.tool-versions
index abe42755..d48993b2 100644
--- a/.tool-versions
+++ b/.tool-versions
@@ -1,2 +1,2 @@
erlang 27.2.2
-elixir 1.18.2-otp-27
+elixir 1.19.4-otp-27
diff --git a/lib/mix/tasks/surface/surface.init/ex_patcher.ex b/lib/mix/tasks/surface/surface.init/ex_patcher.ex
index 014bc703..c93a118b 100644
--- a/lib/mix/tasks/surface/surface.init/ex_patcher.ex
+++ b/lib/mix/tasks/surface/surface.init/ex_patcher.ex
@@ -292,8 +292,8 @@ defmodule Mix.Tasks.Surface.Init.ExPatcher do
end
end
- def set_result(patcher, status) do
- %__MODULE__{patcher | result: status}
+ def set_result(%__MODULE__{} = patcher, status) do
+ %{patcher | result: status}
end
def append_code(patcher, text_to_append) do
@@ -391,7 +391,7 @@ defmodule Mix.Tasks.Surface.Init.ExPatcher do
patcher
end
- def patch(patcher, opts, fun) do
+ def patch(%__MODULE__{} = patcher, opts, fun) do
zipper = zipper(patcher)
patch =
@@ -406,7 +406,7 @@ defmodule Mix.Tasks.Surface.Init.ExPatcher do
updated_code = patcher |> code() |> Sourceror.patch_string([patch])
- %__MODULE__{patcher | code: updated_code, result: :patched}
+ %{patcher | code: updated_code, result: :patched}
end
def code(%__MODULE__{code: code}) do
diff --git a/lib/surface.ex b/lib/surface.ex
index 461e9097..73dcf1b2 100644
--- a/lib/surface.ex
+++ b/lib/surface.ex
@@ -172,12 +172,12 @@ defmodule Surface do
end
@doc false
- def __compile_sface__(name, file, env) do
+ def __compile_sface__(name, file, %Macro.Env{} = env) do
file
|> File.read!()
|> Surface.Compiler.compile(1, env, file)
|> Surface.Compiler.to_live_struct(
- caller: %Macro.Env{env | file: file, line: 1, function: {String.to_atom(name), 1}},
+ caller: %{env | file: file, line: 1, function: {String.to_atom(name), 1}},
annotate_content: annotate_content()
)
end
diff --git a/lib/surface/macro_component.ex b/lib/surface/macro_component.ex
index 6b70f17d..707b5408 100644
--- a/lib/surface/macro_component.ex
+++ b/lib/surface/macro_component.ex
@@ -50,10 +50,10 @@ defmodule Surface.MacroComponent do
{name, value}
end
- defp eval_value(%AST.Attribute{value: value_ast}, prop, caller) do
+ defp eval_value(%AST.Attribute{value: value_ast}, prop, %Macro.Env{} = caller) do
%AST.AttributeExpr{original: value, value: expr, meta: %{line: line, file: file}} = value_ast
- env = %Macro.Env{caller | line: line}
+ env = %{caller | line: line}
{evaluated_value, _} =
try do
diff --git a/mix.exs b/mix.exs
index 2a9de462..2cff8d84 100644
--- a/mix.exs
+++ b/mix.exs
@@ -14,7 +14,6 @@ defmodule Surface.MixProject do
start_permanent: Mix.env() == :prod,
elixirc_paths: elixirc_paths(Mix.env()),
deps: deps(),
- preferred_cli_env: [docs: :docs],
# Docs
name: "Surface",
source_url: @source_url,
@@ -32,6 +31,10 @@ defmodule Surface.MixProject do
]
end
+ def cli do
+ [preferred_envs: [docs: :docs]]
+ end
+
defp elixirc_paths(:dev), do: ["lib"] ++ catalogues()
defp elixirc_paths(:test), do: ["lib", "test/support"] ++ catalogues()
defp elixirc_paths(_), do: ["lib"]
diff --git a/test/surface/integrations/lv_change_tracking_test.exs b/test/surface/integrations/lv_change_tracking_test.exs
index 59ff40c0..2bd81228 100644
--- a/test/surface/integrations/lv_change_tracking_test.exs
+++ b/test/surface/integrations/lv_change_tracking_test.exs
@@ -28,13 +28,13 @@ defmodule Surface.LVChangeTrackingTest do
"""
end
- {socket, full_render, components} = render(comp.(assigns))
+ {full_render, fingerprints, components} = render(comp.(assigns))
assert has_dynamic_part?(full_render, "INNER WITH ARG")
assigns = Map.put(assigns, :__changed__, %{some_assign: true})
- {_, full_render, _} = render(comp.(assigns), socket.fingerprints, components)
+ {full_render, _, _} = render(comp.(assigns), fingerprints, components)
assert has_dynamic_part?(full_render, "SOME_ASSIGN")
refute has_dynamic_part?(full_render, "INNER WITH ARG")
@@ -52,13 +52,13 @@ defmodule Surface.LVChangeTrackingTest do
"""
end
- {socket, full_render, components} = render(comp.(assigns))
+ {full_render, fingerprints, components} = render(comp.(assigns))
assert has_dynamic_part?(full_render, "INNER WITH ARG")
assigns = Map.put(assigns, :__changed__, %{some_assign: true})
- {_, full_render, _} = render(comp.(assigns), socket.fingerprints, components)
+ {full_render, _, _} = render(comp.(assigns), fingerprints, components)
assert has_dynamic_part?(full_render, "SOME_ASSIGN")
refute has_dynamic_part?(full_render, "INNER WITH ARG")
@@ -76,13 +76,13 @@ defmodule Surface.LVChangeTrackingTest do
"""
end
- {socket, full_render, components} = render(comp.(assigns))
+ {full_render, fingerprints, components} = render(comp.(assigns))
assert has_dynamic_part?(full_render, "INNER WITH ARG")
assigns = Map.put(assigns, :__changed__, %{some_assign: true})
- {_, full_render, _} = render(comp.(assigns), socket.fingerprints, components)
+ {full_render, _, _} = render(comp.(assigns), fingerprints, components)
# TODO: Why "INNER WITH ARG" is resent? It shouldn't!
assert has_dynamic_part?(full_render, "INNER WITH ARG")
@@ -100,13 +100,13 @@ defmodule Surface.LVChangeTrackingTest do
"""
end
- {socket, full_render, components} = render(comp.(assigns))
+ {full_render, fingerprints, components} = render(comp.(assigns))
assert has_dynamic_part?(full_render, "INNER WITH ARG")
assigns = Map.put(assigns, :__changed__, %{some_assign: true})
- {_, full_render, _} = render(comp.(assigns), socket.fingerprints, components)
+ {full_render, _, _} = render(comp.(assigns), fingerprints, components)
# TODO: Why "INNER WITH ARG" is resent? It shouldn't!
assert has_dynamic_part?(full_render, "INNER WITH ARG")
@@ -123,13 +123,13 @@ defmodule Surface.LVChangeTrackingTest do
"""
end
- {socket, full_render, components} = render(comp.(assigns))
+ {full_render, fingerprints, components} = render(comp.(assigns))
assert has_dynamic_part?(full_render, "STATIC LABEL")
assigns = Map.put(assigns, :__changed__, %{content: true})
- {_, full_render, _} = render(comp.(assigns), socket.fingerprints, components)
+ {full_render, _, _} = render(comp.(assigns), fingerprints, components)
assert has_dynamic_part?(full_render, "DYN CONTENT")
refute has_dynamic_part?(full_render, "STATIC LABEL")
@@ -146,13 +146,13 @@ defmodule Surface.LVChangeTrackingTest do
"""
end
- {socket, full_render, components} = render(comp.(assigns))
+ {full_render, fingerprints, components} = render(comp.(assigns))
assert full_render[:s] == ["\n"]
assigns = Map.put(assigns, :__changed__, %{content: true})
- {_, full_render, _} = render(comp.(assigns), socket.fingerprints, components)
+ {full_render, _, _} = render(comp.(assigns), fingerprints, components)
assert full_render == %{0 => "DYN CONTENT"}
end
@@ -169,13 +169,13 @@ defmodule Surface.LVChangeTrackingTest do
# """
# end
- # {socket, full_render, components} = render(comp.(assigns))
+ # {full_render, fingerprints, components} = render(comp.(assigns))
# assert full_render[:s] == ["\n"]
# assigns = Map.put(assigns, :__changed__, %{content: true})
- # {_, full_render, _} = render(comp.(assigns), socket.fingerprints, components)
+ # {full_render, _, _} = render(comp.(assigns), fingerprints, components)
# assert full_render == %{0 => "DYN CONTENT"}
# end
@@ -185,8 +185,17 @@ defmodule Surface.LVChangeTrackingTest do
fingerprints \\ Diff.new_fingerprints(),
components \\ Diff.new_components()
) do
- socket = %Socket{endpoint: __MODULE__, fingerprints: fingerprints}
- Diff.render(socket, rendered, components)
+ socket = %Socket{endpoint: __MODULE__}
+
+ if Map.has_key?(socket, :fingerprints) do
+ # LV < 1.1, using Diff.render/3
+ socket = Map.put(socket, :fingerprints, fingerprints)
+ {socket, full_render, components} = apply(Diff, :render, [socket, rendered, components])
+ {full_render, socket.fingerprints, components}
+ else
+ # LV >= 1.1, using Diff.render/4
+ apply(Diff, :render, [%Socket{endpoint: __MODULE__}, rendered, fingerprints, components])
+ end
end
defp has_dynamic_part?([{_, value} | _rest], value) do
diff --git a/test/test_helper.exs b/test/test_helper.exs
index 6745d683..cac8629f 100644
--- a/test/test_helper.exs
+++ b/test/test_helper.exs
@@ -50,7 +50,7 @@ defmodule ANSIHelpers do
"""
def maybe_ansi(text) do
if IO.ANSI.enabled?() do
- "(\\e\\[\\d+m)?#{text}(\\e\\[0m)"
+ "(\\e\\[\\d+m)?#{text}(\\e\\[0m)?"
else
text
end