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