diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 0e4acce..bd60241 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -6,9 +6,9 @@ env:
on:
push:
- branches: [ master ]
+ branches: [master]
pull_request:
- branches: [ master ]
+ branches: [master]
jobs:
static_analysis:
@@ -17,12 +17,12 @@ jobs:
steps:
- name: Checkout code
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
- name: Set up Elixir
uses: erlef/setup-beam@v1
with:
- elixir-version: '1.13.3'
- otp-version: '24.2'
+ elixir-version: "1.16.3"
+ otp-version: "26.2"
- name: Restore dependencies cache
uses: actions/cache@v2
with:
@@ -52,23 +52,26 @@ jobs:
strategy:
matrix:
- elixir:
- - '1.13.3'
- otp:
- - '24.2'
+ version:
+ - otp: 26.2
+ elixir: 1.15.8
+ - otp: 26.2
+ elixir: 1.16.3
+ - otp: 27.0
+ elixir: 1.17.0-rc.1
steps:
- name: Checkout code
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
- name: Set up Elixir
uses: erlef/setup-beam@v1
with:
- elixir-version: ${{ matrix.elixir }}
- otp-version: ${{ matrix.otp }}
+ elixir-version: ${{ matrix.version.elixir }}
+ otp-version: ${{ matrix.version.otp }}
- name: Set up Node
uses: actions/setup-node@v3
with:
- node-version: 15
+ node-version: 18
- name: Restore dependencies cache
uses: actions/cache@v2
with:
diff --git a/README.md b/README.md
index 9906122..b5047b9 100644
--- a/README.md
+++ b/README.md
@@ -97,9 +97,9 @@ module path):
- Hello <%= @first_name %> <%= @last_name %>!
+
+ Hello <%= @first_name %> <%= @last_name %>!
+
@@ -132,9 +132,9 @@ In conjunction with the following template:
- Hello <%= generate_full_name(@first_name, @last_name) %>!
+
+ Hello <%= generate_full_name(@first_name, @last_name) %>!
+
@@ -183,9 +183,9 @@ And the following template:
- Hello <%= generate_full_name(@first_name, @last_name) %>!
+
+ Hello <%= generate_full_name(@first_name, @last_name) %>!
+
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..d9df1bb
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+0.11.0
diff --git a/coveralls.json b/coveralls.json
index d8a1653..3d77127 100644
--- a/coveralls.json
+++ b/coveralls.json
@@ -1,3 +1,5 @@
{
- "skip_files": ["test", "lib/mjml_eex/tokenizer.ex"]
+ "skip_files": [
+ "test"
+ ]
}
diff --git a/lib/mjml_eex/tokenizer.ex b/lib/mjml_eex/tokenizer.ex
deleted file mode 100644
index d6681b0..0000000
--- a/lib/mjml_eex/tokenizer.ex
+++ /dev/null
@@ -1,266 +0,0 @@
-defmodule MjmlEEx.Tokenizer do
- # Taken from until Elixir 1.14.0 comes out: https://github.com/elixir-lang/elixir/blob/main/lib/eex/lib/eex/compiler.ex
- @moduledoc false
-
- @h_spaces [?\s, ?\t]
-
- @doc false
- def tokenize(contents, opts) when is_binary(contents) do
- tokenize(String.to_charlist(contents), opts)
- end
-
- def tokenize(contents, opts) when is_list(contents) do
- file = opts[:file] || "nofile"
- line = opts[:line] || 1
- trim = opts[:trim] || false
- indentation = opts[:indentation] || 0
- column = indentation + (opts[:column] || 1)
-
- state = %{trim: trim, indentation: indentation, file: file}
-
- {contents, line, column} = (trim && trim_init(contents, line, column, state)) || {contents, line, column}
-
- tokenize(contents, line, column, state, [{line, column}], [])
- end
-
- defp tokenize('<%%' ++ t, line, column, state, buffer, acc) do
- tokenize(t, line, column + 3, state, [?%, ?< | buffer], acc)
- end
-
- defp tokenize('<%!--' ++ t, line, column, state, buffer, acc) do
- case comment(t, line, column + 5, state, []) do
- {:error, line, column, message} ->
- {:error, message, %{line: line, column: column}}
-
- {:ok, new_line, new_column, rest, comments} ->
- token = {:comment, Enum.reverse(comments), %{line: line, column: column}}
- trim_and_tokenize(rest, new_line, new_column, state, buffer, acc, &[token | &1])
- end
- end
-
- defp tokenize('<%#' ++ t, line, column, state, buffer, acc) do
- case expr(t, line, column + 3, state, []) do
- {:error, line, column, message} ->
- {:error, message, %{line: line, column: column}}
-
- {:ok, _, new_line, new_column, rest} ->
- trim_and_tokenize(rest, new_line, new_column, state, buffer, acc, & &1)
- end
- end
-
- defp tokenize('<%' ++ t, line, column, state, buffer, acc) do
- {marker, t} = retrieve_marker(t)
-
- case expr(t, line, column + 2 + length(marker), state, []) do
- {:error, line, column, message} ->
- {:error, message, %{line: line, column: column}}
-
- {:ok, expr, new_line, new_column, rest} ->
- {key, expr} =
- case :elixir_tokenizer.tokenize(expr, 1, file: "eex", check_terminators: false) do
- {:ok, _line, _column, warnings, tokens} ->
- Enum.each(Enum.reverse(warnings), fn {location, file, msg} ->
- :elixir_errors.erl_warn(location, file, msg)
- end)
-
- token_key(tokens, expr)
-
- {:error, _, _, _, _} ->
- {:expr, expr}
- end
-
- marker =
- if key in [:middle_expr, :end_expr] and marker != '' do
- message = """
- unexpected beginning of EEx tag \"<%#{marker}\" on \"<%#{marker}#{expr}%>\", please remove \"#{marker}\"
- """
-
- :elixir_errors.erl_warn({line, column}, state.file, message)
- ''
- else
- marker
- end
-
- token = {key, marker, expr, %{line: line, column: column}}
- trim_and_tokenize(rest, new_line, new_column, state, buffer, acc, &[token | &1])
- end
- end
-
- defp tokenize('\n' ++ t, line, _column, state, buffer, acc) do
- tokenize(t, line + 1, state.indentation + 1, state, [?\n | buffer], acc)
- end
-
- defp tokenize([h | t], line, column, state, buffer, acc) do
- tokenize(t, line, column + 1, state, [h | buffer], acc)
- end
-
- defp tokenize([], line, column, _state, buffer, acc) do
- eof = {:eof, %{line: line, column: column}}
- {:ok, Enum.reverse([eof | tokenize_text(buffer, acc)])}
- end
-
- defp trim_and_tokenize(rest, line, column, state, buffer, acc, fun) do
- {rest, line, column, buffer} = trim_if_needed(rest, line, column, state, buffer)
-
- acc = tokenize_text(buffer, acc)
- tokenize(rest, line, column, state, [{line, column}], fun.(acc))
- end
-
- # Retrieve marker for <%
-
- defp retrieve_marker([marker | t]) when marker in [?=, ?/, ?|] do
- {[marker], t}
- end
-
- defp retrieve_marker(t) do
- {'', t}
- end
-
- # Tokenize a multi-line comment until we find --%>
-
- defp comment([?-, ?-, ?%, ?> | t], line, column, _state, buffer) do
- {:ok, line, column + 4, t, buffer}
- end
-
- defp comment('\n' ++ t, line, _column, state, buffer) do
- comment(t, line + 1, state.indentation + 1, state, '\n' ++ buffer)
- end
-
- defp comment([head | t], line, column, state, buffer) do
- comment(t, line, column + 1, state, [head | buffer])
- end
-
- defp comment([], line, column, _state, _buffer) do
- {:error, line, column, "missing token '--%>'"}
- end
-
- # Tokenize an expression until we find %>
-
- defp expr([?%, ?> | t], line, column, _state, buffer) do
- {:ok, Enum.reverse(buffer), line, column + 2, t}
- end
-
- defp expr('\n' ++ t, line, _column, state, buffer) do
- expr(t, line + 1, state.indentation + 1, state, [?\n | buffer])
- end
-
- defp expr([h | t], line, column, state, buffer) do
- expr(t, line, column + 1, state, [h | buffer])
- end
-
- defp expr([], line, column, _state, _buffer) do
- {:error, line, column, "missing token '%>'"}
- end
-
- # Receives tokens and check if it is a start, middle or an end token.
- defp token_key(tokens, expr) do
- case {tokens, tokens |> Enum.reverse() |> drop_eol()} do
- {[{:end, _} | _], [{:do, _} | _]} ->
- {:middle_expr, expr}
-
- {_, [{:do, _} | _]} ->
- {:start_expr, maybe_append_space(expr)}
-
- {_, [{:block_identifier, _, _} | _]} ->
- {:middle_expr, maybe_append_space(expr)}
-
- {[{:end, _} | _], [{:stab_op, _, _} | _]} ->
- {:middle_expr, expr}
-
- {_, [{:stab_op, _, _} | reverse_tokens]} ->
- fn_index = Enum.find_index(reverse_tokens, &match?({:fn, _}, &1)) || :infinity
- end_index = Enum.find_index(reverse_tokens, &match?({:end, _}, &1)) || :infinity
-
- if end_index > fn_index do
- {:start_expr, expr}
- else
- {:middle_expr, expr}
- end
-
- {tokens, _} ->
- case Enum.drop_while(tokens, &closing_bracket?/1) do
- [{:end, _} | _] -> {:end_expr, expr}
- _ -> {:expr, expr}
- end
- end
- end
-
- defp drop_eol([{:eol, _} | rest]), do: drop_eol(rest)
- defp drop_eol(rest), do: rest
-
- defp maybe_append_space([?\s]), do: [?\s]
- defp maybe_append_space([h]), do: [h, ?\s]
- defp maybe_append_space([h | t]), do: [h | maybe_append_space(t)]
-
- defp closing_bracket?({closing, _}) when closing in ~w"( [ {"a, do: true
- defp closing_bracket?(_), do: false
-
- # Tokenize the buffered text by appending
- # it to the given accumulator.
-
- defp tokenize_text([{_line, _column}], acc) do
- acc
- end
-
- defp tokenize_text(buffer, acc) do
- [{line, column} | buffer] = Enum.reverse(buffer)
- [{:text, buffer, %{line: line, column: column}} | acc]
- end
-
- ## Trim
-
- defp trim_if_needed(rest, line, column, state, buffer) do
- if state.trim do
- buffer = trim_left(buffer, 0)
- {rest, line, column} = trim_right(rest, line, column, 0, state)
- {rest, line, column, buffer}
- else
- {rest, line, column, buffer}
- end
- end
-
- defp trim_init([h | t], line, column, state) when h in @h_spaces,
- do: trim_init(t, line, column + 1, state)
-
- defp trim_init([?\r, ?\n | t], line, _column, state),
- do: trim_init(t, line + 1, state.indentation + 1, state)
-
- defp trim_init([?\n | t], line, _column, state),
- do: trim_init(t, line + 1, state.indentation + 1, state)
-
- defp trim_init([?<, ?% | _] = rest, line, column, _state),
- do: {rest, line, column}
-
- defp trim_init(_, _, _, _), do: false
-
- defp trim_left(buffer, count) do
- case trim_whitespace(buffer, 0) do
- {[?\n, ?\r | rest], _} -> trim_left(rest, count + 1)
- {[?\n | rest], _} -> trim_left(rest, count + 1)
- _ when count > 0 -> [?\n | buffer]
- _ -> buffer
- end
- end
-
- defp trim_right(rest, line, column, last_column, state) do
- case trim_whitespace(rest, column) do
- {[?\r, ?\n | rest], column} ->
- trim_right(rest, line + 1, state.indentation + 1, column + 1, state)
-
- {[?\n | rest], column} ->
- trim_right(rest, line + 1, state.indentation + 1, column, state)
-
- {[], column} ->
- {[], line, column}
-
- _ when last_column > 0 ->
- {[?\n | rest], line - 1, last_column}
-
- _ ->
- {rest, line, column}
- end
- end
-
- defp trim_whitespace([h | t], column) when h in @h_spaces, do: trim_whitespace(t, column + 1)
- defp trim_whitespace(list, column), do: {list, column}
-end
diff --git a/lib/utils.ex b/lib/utils.ex
index 2dfd267..42fa2fe 100644
--- a/lib/utils.ex
+++ b/lib/utils.ex
@@ -43,7 +43,7 @@ defmodule MjmlEEx.Utils do
"""
def escape_eex_expressions(template) do
template
- |> MjmlEEx.Tokenizer.tokenize([])
+ |> EEx.Compiler.tokenize([])
|> case do
{:ok, tokens} ->
reduce_tokens(tokens)
diff --git a/mix.exs b/mix.exs
index cc6dc12..5e8f95e 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,8 +4,8 @@ defmodule MjmlEEx.MixProject do
def project do
[
app: :mjml_eex,
- version: "0.10.0",
- elixir: ">= 1.13.0",
+ version: project_version(),
+ elixir: ">= 1.15.0",
elixirc_paths: elixirc_paths(Mix.env()),
name: "MJML EEx",
source_url: "https://github.com/akoutmos/mjml_eex",
@@ -70,11 +70,11 @@ defmodule MjmlEEx.MixProject do
{:erlexec, "~> 2.0", optional: true},
# Development deps
- {:ex_doc, "~> 0.31", only: :dev},
+ {:ex_doc, "~> 0.34", only: :dev},
{:excoveralls, "~> 0.18", only: [:test, :dev], runtime: false},
- {:doctor, "~> 0.21.0", only: :dev},
+ {:doctor, "~> 0.21", only: :dev},
{:credo, "~> 1.7", only: :dev},
- {:git_hooks, "~> 0.7.3", only: [:test, :dev], runtime: false}
+ {:git_hooks, "~> 0.7", only: [:test, :dev], runtime: false}
]
end
@@ -84,6 +84,12 @@ defmodule MjmlEEx.MixProject do
]
end
+ defp project_version do
+ "VERSION"
+ |> File.read!()
+ |> String.trim()
+ end
+
defp copy_files(_) do
# Set up directory structure
File.mkdir_p!("./doc/guides/images")
diff --git a/mix.lock b/mix.lock
index 25ec246..0b2700c 100644
--- a/mix.lock
+++ b/mix.lock
@@ -1,32 +1,24 @@
%{
"blankable": {:hex, :blankable, "1.0.0", "89ab564a63c55af117e115144e3b3b57eb53ad43ba0f15553357eb283e0ed425", [:mix], [], "hexpm", "7cf11aac0e44f4eedbee0c15c1d37d94c090cb72a8d9fddf9f7aec30f9278899"},
"bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"},
- "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"},
- "certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"},
- "credo": {:hex, :credo, "1.7.4", "68ca5cf89071511c12fd9919eb84e388d231121988f6932756596195ccf7fd35", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "9cf776d062c78bbe0f0de1ecaee183f18f2c3ec591326107989b054b7dddefc2"},
+ "castore": {:hex, :castore, "1.0.7", "b651241514e5f6956028147fe6637f7ac13802537e895a724f90bf3e36ddd1dd", [:mix], [], "hexpm", "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"},
+ "credo": {:hex, :credo, "1.7.6", "b8f14011a5443f2839b04def0b252300842ce7388f3af177157c86da18dfbeea", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "146f347fb9f8cbc5f7e39e3f22f70acbef51d441baa6d10169dd604bfbc55296"},
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
"doctor": {:hex, :doctor, "0.21.0", "20ef89355c67778e206225fe74913e96141c4d001cb04efdeba1a2a9704f1ab5", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "a227831daa79784eb24cdeedfa403c46a4cb7d0eab0e31232ec654314447e4e0"},
"earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"},
- "erlexec": {:hex, :erlexec, "2.0.3", "61d5eee44a514236e6bc779729010467a990f2dc9bda2373c4d1b2c0a11b2bc8", [:rebar3], [], "hexpm", "e6e364bd4cbed2a7862f4dcfcfa9f2a50eaf4f7937e261cf2e326ee3a9ab0f9a"},
- "ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"},
- "excoveralls": {:hex, :excoveralls, "0.18.0", "b92497e69465dc51bc37a6422226ee690ab437e4c06877e836f1c18daeb35da9", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "1109bb911f3cb583401760be49c02cbbd16aed66ea9509fc5479335d284da60b"},
+ "erlexec": {:hex, :erlexec, "2.0.6", "b7443121cfb8add8bc25e3db9c1fd79d14613bbc406984264a0bbc62f121f377", [:rebar3], [], "hexpm", "8c4ebc02449f838648d9854d1c4dc7257e57d4ea2098a7e6386348372085ab21"},
+ "ex_doc": {:hex, :ex_doc, "0.34.0", "ab95e0775db3df71d30cf8d78728dd9261c355c81382bcd4cefdc74610bef13e", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "60734fb4c1353f270c3286df4a0d51e65a2c1d9fba66af3940847cc65a8066d7"},
+ "excoveralls": {:hex, :excoveralls, "0.18.1", "a6f547570c6b24ec13f122a5634833a063aec49218f6fff27de9df693a15588c", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d65f79db146bb20399f23046015974de0079668b9abb2f5aac074d078da60b8d"},
"file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"},
"git_hooks": {:hex, :git_hooks, "0.7.3", "09489e94d88dfc767662e22aff2b6208bd7cf555a19dd0e1477cca4683ce0701", [:mix], [{:blankable, "~> 1.0.0", [hex: :blankable, repo: "hexpm", optional: false]}, {:recase, "~> 0.7.0", [hex: :recase, repo: "hexpm", optional: false]}], "hexpm", "d6ddedeb4d3a8602bc3f84e087a38f6150a86d9e790628ed8bc70e6d90681659"},
- "hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"},
- "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
- "makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"},
- "makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"},
- "makeup_erlang": {:hex, :makeup_erlang, "0.1.4", "29563475afa9b8a2add1b7a9c8fb68d06ca7737648f28398e04461f008b69521", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f4ed47ecda66de70dd817698a703f8816daa91272e7e45812469498614ae8b29"},
- "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
- "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
- "mjml": {:hex, :mjml, "3.0.0", "44334338ead5707418ee8c1f53116027f1addfde267b61a193aff24cc4d689e7", [:mix], [{:rustler, ">= 0.0.0", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7.0", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "709910481e038f1f5cd9df6a88a434ccd13b8cf5a7a16e47677667a33487287e"},
+ "makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"},
+ "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"},
+ "makeup_erlang": {:hex, :makeup_erlang, "1.0.0", "6f0eff9c9c489f26b69b61440bf1b238d95badae49adac77973cbacae87e3c2e", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "ea7a9307de9d1548d2a72d299058d1fd2339e3d398560a0e46c27dab4891e4d2"},
+ "mjml": {:hex, :mjml, "3.1.0", "549e985bc03be1af563c62a34c8e62bdb8d0baaa6b31af705a5bdf67e20f22b7", [:mix], [{:rustler, ">= 0.0.0", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7.0", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "987674d296b14b628e5e5d2d8b910e6501cdfafa0239527d8b633880dc595344"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
- "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"},
- "phoenix_html": {:hex, :phoenix_html, "4.0.0", "4857ec2edaccd0934a923c2b0ba526c44a173c86b847e8db725172e9e51d11d6", [:mix], [], "hexpm", "cee794a052f243291d92fa3ccabcb4c29bb8d236f655fb03bcbdc3a8214b8d13"},
+ "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"},
"recase": {:hex, :recase, "0.7.0", "3f2f719f0886c7a3b7fe469058ec539cb7bbe0023604ae3bce920e186305e5ae", [:mix], [], "hexpm", "36f5756a9f552f4a94b54a695870e32f4e72d5fad9c25e61bc4a3151c08a4e0c"},
"rustler_precompiled": {:hex, :rustler_precompiled, "0.7.1", "ecadf02cc59a0eccbaed6c1937303a5827fbcf60010c541595e6d3747d3d0f9f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "b9e4657b99a1483ea31502e1d58c464bedebe9028808eda45c3a429af4550c66"},
- "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"},
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
- "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
}