Skip to content

chore(deps): update minor updates#203

Open
wttj-bot[bot] wants to merge 1 commit into
mainfrom
renovate/minor-updates
Open

chore(deps): update minor updates#203
wttj-bot[bot] wants to merge 1 commit into
mainfrom
renovate/minor-updates

Conversation

@wttj-bot

@wttj-bot wttj-bot Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Update Change
elixir (source) minor 1.15.2-otp-261.20.2
erlang minor 26.0.226.2.5

Release Notes

elixir-lang/elixir (elixir)

v1.20.2

Compare Source

1. Enhancements
Elixir
  • [Kernel.ParallelCompiler] Include per-module type checking times when compiler profiling is enabled with profile: :time
2. Bug fixes
Elixir
  • [Kernel] Fix binary comprehensions with sizes when options such as :uniq or :into are used
  • [Kernel] Improve compiler error messages when quote with unquote is used inside a pattern or guard
  • [Kernel] Restore the compiler optimization of Kernel.put_elem/3 to emit :erlang.setelement/3
  • [Module] Fix type checking when applying an empty function type
  • [Module] Fix type checking of bitstring patterns that reuse variables
  • [Module] Fix type information for __info__(:struct) to include the :required key
  • [Module] Fix type operations on map and optional keys during difference/intersection, including open keys and empty intersections
  • [Module] Fix typing of list types involving dynamic or empty lists
  • [Module] Include bitstrings as a possible domain key in the type system
  • [Module] Preserve file metadata from each clause in type system warnings
  • [Module] Fix type warnings for protocol implementations whose protocol module defines additional callbacks
  • [Module] Raise clearer type checking errors when an expected struct is removed or redefined during compilation
Mix
  • [mix compile] Avoid unnecessary umbrella recompilation when a path dependency's manifest is newer but unchanged
  • [mix deps.compile] Recompile fetched dependencies when their compile-time environment changes

v1.20.1

Compare Source

1. Security
Elixir
  • [Version] Limit integer components in Version to 14 decimal bytes, to avoid parsing too large integers from untrusted user input. We strongly advise developers parsing versions from user input to limit the data size given to the Version module (CVE-2026-49762, GHSA-w2h8-8x3g-278p)
2. Bug fixes
Elixir
  • [Calendar] Cap width in Calendar.strftime/2 to 1024 characters
  • [Code] Ensure Code.require_file releases the file if compilation fails
  • [Kernel] Fix documentation generation to use the correct version in search
Mix
  • [mix archive.install] Validate paths and files when extracting archives
  • [mix format] Honor --no-compile option when loading plugins

v1.20.0

Compare Source

Announcement: https://elixir-lang.org/blog/2026/06/03/elixir-v1-20-0-released/

This release requires Erlang/OTP 27+ and is compatible with Erlang/OTP 29.

Type system improvements

Elixir's type system now understands all language constructs and can infer types for your function definitions, using typing information from Elixir's standard library and your dependencies, to find verified bugs and dead code.

This has been achieved through a series of improvements, such as type refinement across clauses, occurrence typing, typing of map keys and domains, and more.

Type inference of guards

This release also performs inference of guards! Let's see some examples:

def example(x, y) when is_list(x) and is_integer(y)

The code above correctly infers x is a list and y is an integer.

def example({:ok, x} = y) when is_binary(x) or is_integer(x)

The one above infers x is a binary or an integer, and y is a two element tuple with :ok as first element and a binary or integer as second.

def example(x) when is_map_key(x, :foo)

The code above infers x is a map which has the :foo key, represented as %{..., foo: dynamic()}. Remember the leading ... indicates the map may have other keys.

def example(x) when not is_map_key(x, :foo)

And the code above infers x does not have the :foo key (hence x.foo will raise a typing violation), which has the type: %{..., foo: not_set()}.

You can also have expressions that assert on the size of data structures:

def example(x) when tuple_size(x) < 3

Elixir will correctly track the tuple has at most two elements, and therefore accessing elem(x, 3) will emit a typing violation. In other words, Elixir can look at complex guards, infer types, and use this information to find bugs in our code, without a need to introduce type signatures (yet).

Whole-body type inference

Elixir also performs inference based on the function body itself. Take the following code:

def add_foo_and_bar(data) do
  data.foo + data.bar
end

Elixir now infers that the function expects a map as first argument, and the map must have the keys .foo and .bar whose values are either integer() or float(). The return type will be either integer() or float().

Here is another example:

def sum_to_string(a, b) do
  Integer.to_string(a + b)
end

Even though the + operator works with both integers and floats, Elixir infers that a and b must be both integers, as the result of + is given to a function that expects an integer. The inferred type information is then used during type checking to find possible typing errors. The typing inferred from your dependencies are also used to help infer more precise types for your own applications.

Typing across clauses

Elixir now infers the type of a given clause based on previous clauses. Let's see an example:

case System.get_env("SOME_VAR") do
  nil -> :not_found
  value -> {:ok, String.upcase(value)}
end

System.get_env("SOME_VAR") returns either nil or a binary(). Because the first clause matches on nil, the type system knows value can no longer be nil, and therefore it must only be a binary(), which allows the second clause to also type check without violations.

This type inference across clauses also helps the type system find redundant clauses and dead code in existing codebases. Elixir v1.20 also implements occurrence typing for cond, case, and with, providing more precise types within each clause.

Typing of atom and domain keys in maps

Maps were one of the first data-structures we implemented within the Elixir type system however, up to this point, they only supported atom keys. If they had additional keys, those keys were simply marked as dynamic().

As of Elixir v1.20, we can track all possible domains as map keys. For example, the map:

%{123 => "hello", 456.0 => :ok}

will have the type:

%{integer() => binary(), float() => :ok}

It is also possible to mix domain keys, as above, with atom keys, yielding the following:

%{integer() => integer(), root: integer()}

This system is an implementation of Typing Records, Maps, and Structs, by Giuseppe Castagna (2023).

Typing of map operations

We have typed the majority of the functions in the Map module, allowing the type system to track how keys are added, updated, and removed across all possible key types.

For example, imagine we are calling the following Map functions with a variable map, which we don't know the exact shape of, and an atom key:

Map.put(map, :key, 123)

#=> returns type %{..., key: integer()}

Map.delete(map, :key)

#=> returns type %{..., key: not_set()}

As you can see, we track when keys are set and also when they are removed.

Some operations, like Map.replace/3, only replace the key if it exists, and that is also propagated by the type system:

Map.replace(map, :key, 123)

#=> returns type %{..., key: if_set(integer())}

In other words, if the key exists, it would have been replaced by an integer value. Furthermore, whenever calling a function in the Map module and the given key is statically proven to never exist in the map, an error is emitted.

By combining full type inference with bang operations like Map.fetch!/2, Map.pop!/2, Map.replace!/3, and Map.update!/3, Elixir is able to propagate information about the desired keys. Take this module:

defmodule User do
  def name(map), do: Map.fetch!(map, :name)
end

defmodule CallsUser do
  def calls_name do
    User.name(%{})
  end
end

The code above has a type violation, which is now caught by the type system:

    warning: incompatible types given to User.name/1:

        User.name(%{})

    given types:

        %{name: not_set()}

    but expected one of:

        dynamic(%{..., name: term()})

    type warning found at:
    │
 16 │     User.name(%{})
    │         ~
    │
    └─ lib/calls_user.ex:7:5: CallsUser.calls_name/0
Acknowledgements

The type system was made possible thanks to a partnership between CNRS and Remote. The development work is currently sponsored by Fresha and Tidewave.

Compile-time improvements

Elixir's v1.20 improves compilation times once more, especially on applications with many cores.

It also introduces a new compiler option called :module_definition, which if the module definition should be :compiled (the default) or :interpreted. Note this does not affect the .beam file written to disk, only how the contents inside defmodule are executed. Using the :interpreted mode may offer better compilation times for large projects, especially on machines with high core count, however, it comes with some downsides:

  • Errors during compilation may have less precise stacktraces

  • Anonymous functions within defmodule can have only up to 20 arguments.
    If this is an issue, you can use maps or tuples to group the data.
    Note the functions themselves inside defmodule, such as the ones defined
    inside def and friends, can still have up to 255 arguments

You can enable it by setting elixirc_options: [module_definition: :interpreted] in your mix.exs.

v1.20.0 (2026-06-03)

This release requires Erlang/OTP 27+ and is compatible with Erlang/OTP 29.

1. Enhancements
EEx
  • [EEx] Optimize compiler by flattening expr list only once
Elixir
  • [Base] Optimize Base validation functions by using SWAR techniques
  • [Calendar] Optimize date_from_iso_days by using the Neri-Schneider algorithm
  • [Code] Add :dbg_callback option to eval functions
  • [Code] Add module_definition: :interpreted option to Code which allows module definitions to be evaluated instead of compiled. In some applications/architectures, this can lead to drastic improvements to compilation times. Note this does not affect the generated .beam file, which will have the same performance/behaviour as before
  • [Code] Make module purging opt-in and move temporary module deletion to the background to speed up compilation times
  • [Code.Fragment] Allow preserving sigil metadata in container_cursor_to_quoted
  • [Enum] Add Enum.min_max sorter
  • [File] Add support for [:raw] opts in File.read/2
  • [File] Skip device, named pipes, etc in File.cp_r/3 instead of erroring with reason :eio
  • [Float] Optimize Float.round/2 by avoiding big integers
  • [Inspect] Increase inspect limit to help print deeply nested data structures
  • [Inspect] Support printing Erlang records (using Erlang notation)
  • [Integer] Add Integer.ceil_div/2
  • [Integer] Add Integer.popcount/1
  • [IO] Add IO.iodata_empty?/1
  • [Kernel] Add type inference across clauses. For example, if one clause says x when is_integer(x), then the next clause may no longer be an integer
  • [Kernel] Add occurrence typing on case, cond, and with
  • [Kernel] Detect and warn on redundant clauses
  • [Kernel] Perform type inference across applications
  • [Kernel] Print intermediate results of dbg for pipes
  • [Kernel] Show undefined function errors even when missing variables (this helps debug errors caused when the developer forgets to require a macro)
  • [Kernel] Warn on unused requires
  • [List] Add List.first!/1 and List.last!/1
  • [Module] Purge and delete modules if after_compile/2 callback fails
  • [PartitionSupervisor] Support via tuples in count_children/1 and stop/3
  • [Process] Add Process.get_label/1
  • [Registry] Switch keys: {:duplicate, :key} to ordered_set with composite keys
  • [Regex] Add Regex.import/1 to import regexes defined with /E
  • [String] SWAR-optimize ASCII fast paths in String.length/1 and String.slice/3
  • Add Software Bill of Materials guide to the Documentation
ExUnit
  • [ExUnit] Show remaining runs when using --repeat-until-failure
  • [ExUnit.CaptureLog] Add :formatter option for custom log formatting
IEx
  • [IEx] Optimize autocompleting modules
  • [IEx.Helpers] Add source/1
Mix
  • [mix app.tree] Support --output option
  • [mix compile] Add module_definition: :interpreted option to Code which allows module definitions to be evaluated instead of compiled. In some applications/architectures, this can lead to drastic improvements to compilation times. Note this does not affect the generated .beam file, which will have the same performance/behaviour as before
  • [mix compile] Enforce :elixirc_paths to be a list of strings to avoid paths from being discarded (the only documented type was lists of strings)
  • [mix deps] Parallelize dep lock status checks during deps.loadpaths, improving boot times in projects with many git dependencies
  • [mix deps] Support filtering mix deps output
  • [mix deps.tree] Support --output option
  • [mix format] Support --no-compile option
  • [mix help] Support printing docs for types and callbacks
  • [mix source] Add mix source MODULE to print or open a given module/function location
  • [mix test] Add mix test --dry-run
2. Potential breaking changes
Elixir
  • [Kernel] Disallow raw CR line ending in strings, comments, and after ? for security reasons
  • [Kernel] require SomeModule no longer expands to the given module at compile-time, but it still returns the module at runtime. Note Elixir does not guarantee macros will expand to certain constructs, only what its execution result, but since this can break code relying on the previous behaviour, such as require(SomeMod).some_macro(), we are adding this note to the CHANGELOG
3. Bug fixes
Elixir
  • [Enum] Fix Enum.slice/2 for ranges with step > 1 sliced by step > 1
  • [File] Allowing preserving directory permissions in File.cp_r/3
  • [File] Fix File.cp_r/3 infinite loop with symlink cycles
  • [File] Fix File.cp_r/3 infinite loop when copying into subdirectory of source
  • [File] Fix File.Stream's Enumerable.count for files without trailing newline
  • [File] Warn when defining @type record() for Erlang/OTP 29
  • [Float] Fix Float.parse/1 inconsistent error handling for non-scientific notation overflow
  • [Integer] Fix Integer.extended_gcd/2 returning negative GCD for zero base cases
  • [Integer] Raise when negative out-of-range digits are given to Integer.undigits/2
  • [Kernel] Fix a compiler crash when importing a module with only: :sigils option when the imported module exports non-sigil symbols with sigil_ prefix
  • [Kernel] Protocols should not add compile-time dependencies on Any implementation
  • [Kernel] Preserve evaluation order when rewriting function calls from Elixir modules into Erlang ones
  • [Kernel] Reject negative Duration in to_timeout/1
  • [Keyword] Raise ArgumentError in Keyword.from_keys/2 for non-atom keys
  • [Macro] Fix generation of heredocs in Macro.to_string/1 with escaped trailing newline
  • [Path] Consistently return path as binary in Path.relative_to_cwd/2
  • [Stream] Raise in Stream.cycle/1 when enumerable reduce call yields no elements
  • [String] Support empty pattern list in String.count/2
  • [URI] Fix URI.merge leaking :+ marker when base path is empty string
ExUnit
  • [ExUnit.Diff] Avoid false positives when diffing bitstrings
IEx
  • [IEx] Ensure pry works across remote nodes
  • [IEx] Ensure warnings emitted during IEx parsing are properly displayed/printed
Logger
  • [Logger] Persist log level to app env in Logger.configure/1
Mix
  • [Mix] Use non_executable_binary_to_term on loopback pubsub
  • [mix compile] Add a build lock around protocol consolidation in umbrellas
  • [mix compile] Ensure compilation of sibling deps do not mark path deps as changed
  • [mix compile] Fix compile env change triggering full recompilation of path dependencies
  • [mix compile.elixir] Fix scenario where Elixir would tag mtimes in the future
  • [mix compile.erlang] Topsort Erlang modules before compilation for proper dependency resolution
  • [mix deps] Use config files to pass project state to avoid argv limits on Windows when using MIX_OS_DEPS_COMPILE_PARTITION_COUNT
  • [mix test] Fix --warnings-as-errors not catching misnamed test file warnings
  • [mix test] Respect --raise when mix test --warnings-as-errors passes with warnings
4. Hard deprecations
Elixir
  • [File] File.stream!(path, modes, lines_or_bytes) is deprecated in favor of File.stream!(path, lines_or_bytes, modes)
  • [Kernel] Matching on the size inside a bit pattern now requires the pin operator for consistency, such as <<x::size(^existing_var)>>
  • [Kernel.ParallelCompiler] Kernel.ParallelCompiler.async/1 is deprecated in favor of Kernel.ParallelCompiler.pmap/2, which is more performant and addresses known limitations
Logger
  • [Logger] Logger.*_backend functions are deprecated in favor of handlers. If you really want to keep on using backends, see the :logger_backends package
  • [Logger] Logger.enable/1 and Logger.disable/1 have been deprecated in favor of Logger.put_process_level/2 and Logger.delete_process_level/1
Mix
  • [mix compile.elixir] xref: [exclude: ...] in your mix.exs is deprecated in favor of elixirc_options: [no_warn_undefined: ...]

v1.19.5

Compare Source

1. Enhancements
Elixir
  • [Protocol] Optimize protocol consolidation to no longer load structs
2. Bug fixes
Elixir
  • [Kernel] Fix unnecessary recompilation when dbg_callback is modified at runtime
  • [Kernel] Fix parser crash on missing parentheses on expression following operator not in
  • [Kernel] Support fetching abstract code for modules compiled with Elixir v1.14 and earlier
  • [Protocol] Ensure protocol consolidation no longer stores outdated struct types. As a consequence, protocols types only track struct names at the moment
  • [Stream] Revert optimization which caused nested streams in Stream.flat_map/2 to crash
IEx
  • [IEx] Fix usage of #iex:break as part of multi-line prompts
Logger
  • [Logger.Backends] Do not crash on invalid metadata

v1.19.4

Compare Source

1. Enhancements
Mix
  • [mix xref] Add --min-cycle-label to help projects adapt to the more precise mix xref graph reports in Elixir v1.19. In previous versions, Elixir would break a large compilation cycle into several smaller ones, and therefore developers would check for --min-cycle-size on CI. However, the issue is not the size of the cycle (it has no implication in the amount of compiled files), but how many compile-time dependencies (aka compile labels) in a cycle. The new option allows developers to filter on the label parameter
2. Bug fixes
Elixir
  • [File] Ensure File.cp_r/3 reports non-existing destination properly (instead of source)
ExUnit
  • [ExUnit] Fix formatter crash when diffing takes too long
  • [ExUnit] Ensure parallel matches in assert propagate type information
Logger
  • [Logger] Fix regression where formatter would crash when given chardata (the crash would happen when logging non-ASCII characters)
Mix
  • [mix help] Ensure app:APP works when the project or its dependencies were not yet compiled
  • [mix escript.build] Ensure the hex application can be included in escripts

v1.19.3

Compare Source

1. Enhancements
Elixir
  • [Kernel] Support /E modifier for regular expressions in config files
Mix
  • [mix compile] Allow forcing specific compilers, such as --force-elixir, --force-app, etc
  • [mix help app:APP] Support showing helps for apps in Elixir and Erlang standard libraries
2. Bug fixes
ExUnit
  • [ExUnit.Case] Fix crash when formatting errors caused by a linked/trapped exit during setup_all
Mix
  • [mix compile.app] Ensure functions in the format &Mod.fun/arity can be written to .app files
  • [mix compile.app] Ensure strings with Unicode characters can be written to .app files

v1.19.2

Compare Source

1. Enhancements
Elixir
  • [Kernel] Measure and optimize writing of .beam files in the compiler
  • [Kernel] Optimize rare scenarios where type checking took too long
Mix
  • [mix compile] Add flag --no-check-cwd to skip compiler check to aid debugging
2. Bug fixes
Elixir
  • [IO] Fix dialyzer warning on IO.inspect :label
  • [Kernel] Ensure we warn on deprecated ~~~ unary operator
Logger
  • [Logger] Reset ansi escapes before newlines in Logger
Mix
  • [mix compile] Warn if elixirc_paths is not a list of string paths
  • [mix compile] Address regression where umbrella children were compiled too early and without respecting compilation flags
  • [mix deps.compile] Improve reliability of MIX_OS_DEPS_COMPILE_PARTITION_COUNT across mix escript.install, mix archive.install, and others

v1.19.1

Compare Source

1. Bug fixes
EEx
  • [EEx] Address Dialyzer warnings when invoking EEx.compile_string
Elixir
  • [Kernel] Optimize how types are computed for pretty printing
  • [Kernel] Optimize how differences are computed in the type system
  • [Macro] Do not escape options given to dbg/2
  • [Protocol] Improve protocol violation warnings
Mix
  • [mix compile] Do not attempt to touch deleted files when compilation fails and then resumed with missing files
  • [mix deps.compile] Do not spawn partitions when all dependencies are local and already compiled

v1.18.4

Compare Source

This release includes initial support for Erlang/OTP 28, for those who want to try it out. In such cases, you may use Elixir v1.18.4 precompiled for Erlang/OTP 27, as it is binary compatible with Erlang/OTP 28. Note, however, that Erlang/OTP 28 no longer allows regexes to be defined in the module body and interpolated into an attribute. If you do this:

@&#8203;some_attribute ~r/foo/
def some_fun, do: @&#8203;some_attribute

You must rewrite it to:

def some_fun, do: ~r/foo/
1. Enhancements
IEx
  • [IEx.Helpers] Add IEx.Helpers.process_info/1 which prints process information
Mix
  • [mix compile] Support the --no-listeners option
  • [mix local] Retry HTTP requests with disabled middlebox comp mode depending on the failure reason
  • [mix local.hex] Install Hex per OTP release
  • [mix local.rebar] Install Hex per OTP release
  • [mix run] Support the --no-listeners option
2. Bug fixes
Elixir
  • [Kernel] Emit trace events for @on_definition callbacks
  • [Kernel] Emit trace events for @on_load callbacks
  • [Kernel] Emit trace events for super calls
  • [Kernel] Emit trace events for imported function calls
  • [Kernel] Optimize map unions to avoid building long lists
  • [Kernel] Do not crash when type checking nested bitstrings in patterns
  • [Kernel] Do not crash when non-binary bitstring is given as struct default value
  • [Kernel] Recompile regexes when escaped from module attributes for Erlang/OTP 28 compatibility
  • [Kernel] Preserve backwards compatibility in elixir_erl
Mix
  • [mix deps.get] Ensure git checkout works when there are untracked files in the dependency
  • [mix loadpaths] Do not run listeners when not checking the deps

v1.18.3

Compare Source

1. Enhancements
Elixir
  • [JSON] Encode any JSON key to string
  • [Kernel] Allow <<_::3*8>> in typespecs
Mix
  • [mix loadpaths] Support --no-listeners option
2. Bug fixes
Elixir
  • [CLI] Fix --no-color not setting :ansi_enabled to false
  • [Protocol] Return correct implementation for an invalid struct pointing to nil
  • [Stream] Do not raise when Stream.cycle/1 is explicitly halted
ExUnit
  • [ExUnit.Diff] Fix regression when diffing nested improper lists
IEx
  • [IEx.Autocomplete] Fix autocomplete crash when expanding struct with __MODULE__
  • [IEx.Helpers] Do not purge on recompile if IEx is not running

v1.18.2

Compare Source

1. Enhancements
Elixir
  • [CLI] Add --color/--no-color for enabling and disabling of ANSI colors
  • [Code.Fragment] Provide more AST context when invoking container_cursor_to_quoted with trailing fragments
  • [Regex] Ensure compatibility with Erlang/OTP 28+ new Regex engine
Mix
  • [mix] Print compilation lock waiting message to stderr
  • [mix] Add an environment variable to optionally disable compilation locking
2. Bug fixes
Elixir
  • [CLI] Temporarily remove PowerShell scripts for elixir, elixirc, and mix on Windows, as they leave the shell broken after quitting Erlang
ExUnit
  • [ExUnit] Fix crash when diffing bitstring specifiers
IEx
  • [IEx.Autocomplete] Fix crashing whhen autocompleting structs with runtime values
Mix
  • [mix] Track compilation locks per user to avoid permission errors
  • [mix deps.update] Ensure Git dependencies can be upgraded by doing so against the origin

v1.18.1

Compare Source

1. Enhancements
  • [Kernel] Do not emit type violation warnings when comparing or matching against literals
  • [Kernel] Do not validate clauses of private overridable functions
2. Bug fixes
Elixir
  • [Code.Fragment] Ensure Code.Fragment.container_cursor_to_quoted/2 with :trailing_fragment parses expressions that were supported in previous versions
  • [Kernel] Do not crash when typing violation is detected on dynamic dispatch
  • [Kernel] Properly annotate the source for warnings emitted by the compiler with the @file annotation
  • [Kernel] Properly annotate the source for warnings emitted by the type system with the @file annotation
  • [Kernel] Remove :no_parens metadata when using capture with arity on all cases
  • [Kernel] Ensure diagnostic traces are kept backwards compatible
ExUnit
  • [ExUnit.Case] Ensure async groups do not run concurrenly while the test suite is still loading
  • [ExUnit.Case] Ensure --repeat-until-failure can be combined with groups
Mix
  • [mix compile.elixir] Store compilation results if compilation fails due to --warnings-as-errors
  • [mix deps.loadpaths] Add build lock
  • [mix escript.build] Ensure build succeeds when protocol consolidation is disabled
  • [Mix.Shell] Ensure encoding is properly respected on Windows and Unix systems

v1.18.0

Compare Source

Official announcement: https://elixir-lang.org/blog/2024/12/19/elixir-v1-18-0-released/

1. Enhancements
Elixir
  • [CLI] Add experimental PowerShell scripts for elixir, elixirc, and mix on Windows. Those provide a safer entry point for running Elixir from other platforms
  • [Calendar] Add Duration.to_string/1
  • [Code] Support several migration options in Code.format_string!/2
  • [Code] Add parenthesis around -- and --- in Code.format_string!/2 to make precedence clearer
  • [Code] Include more metadata in Code.string_to_quoted/2 when token_metadata: true to help compute ranges from the AST
  • [Code.Fragment] Have :capture_arg as its own entry in Code.Fragment.surround_context/2
  • [Config] Add Config.read_config/1
  • [Enumerable] Add Enum.product_by/2 and Enum.sum_by/2
  • [Exception] Add MissingApplicationsError exception to denote missing applications
  • [JSON] Add a new JSON module with encoding and decoding functionality
  • [JSON] Implement JSON.Encoder for all Calendar types
  • [Kernel] Update source code parsing to match UTS #​55 latest recommendations. In particular, mixed script is allowed in identifiers as long as they are separate by underscores (_), such as http_сервер. Previously allowed highly restrictive identifiers, which mixed Latin and other scripts, such as the japanese word for t-shirt, Tシャツ, now require the underscore as well
  • [Kernel] Warn on bidirectional confusability in identifiers
  • [Kernel] Verify the type of the binary generators
  • [Kernel] Track the type of tuples in patterns and inside elem/2
  • [Kernel] Perform validation of root AST nodes in unquote and unquote_splicing to catch bugs earlier
  • [Kernel] Add source, behaviour, and record information to Docs chunk metadata
  • [Kernel] Support deterministic builds in tandem with Erlang by setting ERL_COMPILER_OPTIONS=deterministic. Keep in mind deterministic builds strip source and other compile time information, which may be relevant for programs
  • [Kernel] Allow aliases and imports to be enabled conditionally in module body
  • [List] Add List.ends_with?/2
  • [Macro] Improve dbg handling of if/2, with/1 and of code blocks
  • [Macro] Add Macro.struct_info!/2 to return struct information mirroring mod.__info__(:struct)
  • [Registry] Add Registry.lock/3 for local locking
  • [PartitionSupervisor] Add PartitionSupervisor.resize!/2 to resize the number of partitions in a supervisor (up to the limit it was started with)
  • [Process] Handle arbitrarily high integer values in Process.sleep/1
  • [Protocol] Add @undefined_impl_description to customize error message when an implementation is undefined
  • [Protocol] Add __deriving__/1 as optional macro callback to Protocol, no longer requiring empty implementations
  • [String] Inspect special whitespace and zero-width characters using their Unicode representation
  • [String] Update Unicode to 16.0
ExUnit
  • [ExUnit] Support parameterized tests on ExUnit.Case
  • [ExUnit] Support test groups: tests in the same group never run concurrently
  • [ExUnit.Case] Add test_pid as a tag
IEx
  • [IEx] Add IEx.configure(auto_reload: true) to automatically pick up modules recompiled from other operating system processes
  • [IEx] Add :dot_iex support to IEx.configure/1
  • [IEx] Add report for normal/shutdown exits in IEx
Mix
  • [mix compile] Ensure only a single operating system process can compile at a given time
  • [mix deps.get] Ensure only a single operating system process can fetch deps at a given time
  • [mix format] Add mix format --migrate to migrate from deprecated functionality
  • [mix format] Add new options and metadata to improve formatting applying by editors and other environments
  • [mix test] Taint failure manifest if requiring or compiling tests fail
  • [Mix.Project] Add a :listeners configuration to listen to compilation events from the current and other operating system processes
  • [Mix.Task.Compiler] Add API for fetching all persisted compiler diagnostics
  • [Mix.Task.Compiler] Add API for fetching all compiler tasks
2. Bug fixes
Elixir
  • [Code] Fix delimiter metadata for single quoted atoms and remote calls in Code.string_to_quoted/2
  • [Code.Formatter] Fix formatter adding extra escapes to quoted remote calls
  • [Code.Fragment] Properly handle keyword keys as their own entry
  • [Inspect.Algebra] Ensure next_break_fits respects line_length
  • [Kernel] Validate AST on unquote and unquote_splicing to provide better error reports instead of failing too late inside the compiler
  • [Kernel] Avoid crashes when emitting diagnostics on code using \t for indentation
  • [Module] Include module attribute line and name when tracing its aliases
  • [Stream] Do not halt streams twice in Stream.transform/5
  • [URI] Fix a bug when a schemaless URI is given to URI.merge/2
ExUnit
  • [ExUnit.Assertions] Raise if guards are used in assert/1 with =
  • [ExUnit.Assertions] Format inserted/deleted maps in list assertions
IEx
  • [IEx.Helpers] IEx.Helpers.recompile/0 will reload modules changed by other operating system processes
Mix
  • [mix compile] Ensure warnings from external resources are emitted with --all-warnings when files do not change
  • [mix deps.compile] Fix escaping issues when invoking rebar3 in some cases
  • [mix escript] Fix escript layout and support storing priv directories
  • [mix release] Make .app files deterministic in releases
  • [Mix.Shell] Fix Mix.Shell on Windows when outputting non UTF-8 characters
3. Soft deprecations (no warnings emitted)
Elixir
  • [Inspect.Algebra] color/3 is deprecated in favor of color_doc/3
  • [Inspect.Algebra] fold_doc/2 is deprecated in favor of fold/2
  • [Kernel] Deprecate unless in favor of if. Use mix format --migrate to automate the migration
  • [Macro] Macro.struct!/2 is deprecated in favor of Macro.struct_info!/2
  • [Protocol] Defining __deriving__/3 inside the Any implementation is deprecated, derive it inside the protocol definition itself
4. Hard deprecations
EEx
  • [EEx] <%# is deprecated in favor of <%!-- or <% #
  • [EEx] c:EEx.handle_text/2 is deprecated in favor of c:EEx.handle_text/3
Elixir
  • [Code] Setting :warnings_as_errors is deprecated via Code.put_compiler_option/2. This must not affect developers, as the :warnings_as_errors option is managed by Mix tasks, and not directly used via the Code module
  • [Enumerable] Deprecate returning a two-arity function in Enumerable.slice/1
  • [List] List.zip/1 is deprecated in favor of Enum.zip/1
  • [Module] Deprecate Module.eval_quoted/3 in favor of Code.eval_quoted/3
  • [Range] Deprecate inferring negative ranges on Range.new/2
  • [Tuple] Tuple.append/2 is deprecated, use Tuple.insert_at/3 instead
Mix
  • [mix cmd] Deprecate mix cmd --app APP in favor of mix do --app APP
  • [mix compile] :warnings_as_errors configuration in :elixirc_options is deprecated. Instead pass the --warnings-as-errors flag to mix compile. Alternatively, you might alias the task: aliases: [compile: "compile --warnings-as-errors"]
  • [mix test] :warnings_as_errors configuration in :test_elixirc_options is deprecated. Instead pass the --warnings-as-errors flag to mix test. Alternatively, you might alias the task: aliases: [test: "test --warnings-as-errors"]
  • [Mix.Tasks.Compile] Deprecate compilers/0 in favor of Mix.Task.Compiler.compilers/0

v1.17

The CHANGELOG for v1.17 releases can be found in the v1.17 branch.

v1.17.3

Compare Source

1. Bug fixes
Elixir
  • [Duration] Fix parsing of fractional durations with non-positive seconds
  • [Kernel] Do not attempt to group module warnings when they have a large context
IEx
  • [IEx.Helpers] Properly reconsolidate protocols on recompile
Mix
  • [mix compile.elixir] Do not verify modules twice
  • [mix xref] Respect the --label option on stats and cycles

v1.17.2

Compare Source

1. Bug fixes
Logger
  • [Logger.Translator] Fix logger crash when :gen_statem's format_status/2 returns non-tuple
Mix
  • [mix deps.get] Fix regression when fetching a git repository with a :ref
  • [mix release] Validate RELEASE_MODE and set ERRORLEVEL on .bat scripts
  • [mix release] Fix invalid example in code comment inside the generated vm.args.eex

v1.17.1

Compare Source

1. Enhancements
Mix
  • [mix compile.elixir] Do not run fixpoint computation on runtime dependencies. This should considerably improve compilation times for large projects when changing only one or two files
2. Bug fixes
EEx
  • [EEx] Do not warn for assignment with blocks in EEx
Elixir
  • [Kernel] Fix bug when using pinned variables inside with's else patterns
  • [Kernel] Fix Dialyzer error when with else clause is calling a no_return function
ExUnit
  • [ExUnit] Do not alternative sync/async suites on --repeat-until-failure

v1.17.0

Compare Source

Official announcement: https://elixir-lang.org/blog/2024/06/12/elixir-v1-17-0-released/

1. Enhancements
Elixir
  • [Access] Add Access.find/1 that mirrors Enum.find/2
  • [Code] Support cursor inside fn/rescue/catch/else/after inside Code.Fragment.container_cursor_to_quoted/2
  • [Date] Add Date.shift/2 to shift dates with duration and calendar-specific semantics
  • [Date] Allow Date to accept years outside of -9999..9999 range
  • [DateTime] Add DateTime.shift/2 to shift datetimes with duration and calendar-specific semantics
  • [Duration] Add a new Duration data type
  • [GenServer] Add c:GenServer.format_status/1 callback
  • [Kernel] Add Kernel.get_in/1 with safe nil-handling for access and structs
  • [Kernel] Add Kernel.is_non_struct_map/1 guard
  • [Kernel] Add Kernel.to_timeout/1
  • [Kernel] Emit warnings for undefined functions from modules defined within the same context as the caller code
  • [Kernel] Support integers in uppercase sigils
  • [Keyword] Add Keyword.intersect/2-3 to mirror the Map API
  • [Macro] Add Macro.Env.define_alias/4, Macro.Env.define_import/4, Macro.Env.define_require/4, Macro.Env.expand_alias/4, Macro.Env.expand_import/5, and Macro.Env.expand_require/6 to aid the implementation of language servers and embedded languages
  • [NaiveDateTime] Add NaiveDateTime.shift/2 to shift naive datetimes with duration and calendar-specific semantics
  • [Process] Add Process.set_label/1
  • [String] Add String.byte_slice/3 to slice a string to a maximum number of bytes while keeping it UTF-8 encoded
  • [System] Support use_stdio: false in System.cmd/3 and System.shell/2
  • [Time] Add Time.shift/2 to shift times with duration and calendar-specific semantics
ExUnit
  • [ExUnit] Propagate the test process itself as a caller in start_supervised
  • [ExUnit] Include max cases in ExUnit reports
IEx
  • [IEx.Helpers] Warns if recompile was called and the current working directory changed
  • [IEx.Helpers] Add c/0 as an alias to continue/0
  • [IEx.Pry] Add IEx.Pry.annotate_quoted/3 to annotate a quoted expression with pry breakpoints
Logger
  • [Logger] Format :gen_statem reports using Elixir data structures
  • [Logger] Include process label in logger events
Mix
  • [mix deps] Add :depth option to Mix.SCM.Git, thus supporting shallow clones of Git dependencies
  • [mix deps] Warn if :optional is used in combination with :in_umbrella
  • [mix deps.get] Do not add optional dependency requirements if its parent dep was skipped
  • [mix deps.tree] Add --umbrella-only to mix deps.tree
  • [mix profile.tprof] Add a new profiler, available on Erlang/OTP 27+, which can measure count, time, and heap usage
  • [mix test] Add mix test --breakpoints that sets up a breakpoint before each test that will run
  • [mix test] Add mix test --repeat-until-failure to rerun tests until a failure occurs
  • [mix test] Add mix test --slowest-modules to print slowest modules based on all of the tests they hold
  • [mix test] Generate cover HTML files in parallel
2. Bug fixes
Elixir
  • [bin/elixir.bat] Improve handling of quotes and exclamation marks in flags
  • [Code] Address a bug where AST nodes for (a -> b) were not wrapped as part of the literal encoder
  • [Kernel] Resolve inconsistencies of how .. and ... are handled at the AST level
  • [Kernel] Fix parsing precedence of ambiguous operators followed by containers
  • [Kernel] Do not expand code in quote bind_quoted: ... twice
  • [Kernel] Respect :line property when :file is given as option to quote
  • [Kernel] Do not crash on Macro.escape/2 when passing a quote triplet without valid meta
  • [Kernel] Avoid double tracing events when capturing a function
  • [Kernel] Fix a bug where captured arguments would conflict when a capture included a macro that also used captures
  • [Module] Return default value in Module.get_attribute/3 for persisted attributes which have not yet been written to
IEx
  • [IEx.Helpers] Update the history size whenever history is pruned
Mix
  • [mix deps] Fix error message for diverged SCM definition in sibling
3. Soft deprecations (no warnings emitted)
Elixir
  • [GenServer] Deprecate c:GenServer.format_status/2 callback to align with Erlang/OTP 25+
Mix
  • [mix profile.cprof] Deprecated in favor of the new mix profile.tprof
  • [mix profile.eprof] Deprecated in favor of the new mix profile.tprof
4. Hard deprecations
Elixir
  • [IO] Passing :all to IO.read/2 and IO.binread/2 is deprecated, pass :eof instead
  • [Kernel] Single-quote charlists are deprecated, use ~c instead
  • [Kernel] Deprecate escaping closing delimiter in uppercase sigils
  • [Range] left..right without explicit steps inside patterns and guards is deprecated, write left..right//step instead
  • [Range] Decreasing ranges, such as 10..1 without an explicit step is deprecated, write 10..1//-1 instead
ExUnit
  • [ExUnit.Case] register_test/4 is deprecated in favor of register_test/6 for performance reasons

v1.16.3

Compare Source

1. Bug fixes
Elixir
  • [bin/elixir] Properly handle the --dbg flag in Elixir's CLI
  • [Code.Formatter] Add brackets around keyword lists when formatting the left-hand side of when
  • [Kernel] Only infer size in pinned variable in binary strings when needed
  • [System] Add a note that arguments are unsafe when invoking .bat/.com scripts on Windows via System.cmd/3
  • [Port] Add a note that arguments are unsafe when invoking .bat/.com scripts on Windows
  • [URI] Ensure :undefined fields are properly converted to nil when invoking Erlang's API
Logger
  • [Logger] Ensure translators are persisted across logger restarts
Mix
  • [mix compile] Ensure compile paths are accessible during compilation

v1.16.2

Compare Source

1. Enhancements
Elixir
  • [Code] Emit :defmodule tracing event on module definition
Mix
  • [Mix] Add Mix.install_project_dir/0
  • [Mix] Add environment variable for reusing Mix.install/2 installation
  • [Mix.SCM] Add Mix.SCM.delete/1
2. Bug fixes
Elixir
  • [Code] Fix charlist formatting issue when a single-quoted charlist escapes a double-quote character
  • [Path] Fix regression on how Path.relative_to/2 dealt with "." as input
IEx
  • [IEx.Helpers] Discard mermaid fenced blocks from ansi docs
ExUnit
  • [ExUnit] Properly compared pinned values when building diffs

v1.16.1

Compare Source

1. Bug fixes
Elixir
  • [Code] Fix Code.quoted_to_algebra/2 for operator with :do key as operand
  • [Kernel.ParallelCompiler] Do not crash parallel compiler when it receives diagnostics from additional code evaluation
  • [Kernel.ParallelCompiler] Always log errors at the end of compilation
  • [String] Fix String.capitalize/1 with a single codepoint
IEx
  • [IEx] Fix autocompletion of function signatures on Erlang/OTP 26
  • [IEx] Do not assume $HOME is set
Mix
  • [mix deps.compile] Handle compilation of rebar3 dependencies when rebar3 is on a path with spaces on Unix
  • [mix test] Properly resolve relative paths when running tests from individual files
  • [mix test] Properly resolve Windows paths when running tests from individual files

v1.16.0

Compare Source

Official announcement: https://elixir-lang.org/blog/2023/12/22/elixir-v1-16-0-released/

1. Enhancements
EEx
  • [EEx] Include relative file information in diagnostics
Elixir
  • [Code] Add :emit_warnings for Code.string_to_quoted/2
  • [Code] Automatically include columns in parsing options
  • [Code] Introduce MismatchedDelimiterError for handling mismatched delimiter exceptions
  • [Code.Fragment] Handle anonymous calls in fragments
  • [Code.Formatter] Trim trailing whitespace on heredocs with \r\n
  • [File] Add :offset option to File.stream!/2
  • [Kernel] Auto infer size of matched variable in bitstrings
  • [Kernel] Preserve column information when translating typespecs
  • [Kernel] Suggest module names based on suffix and casing errors when the module does not exist in UndefinedFunctionError
  • [Kernel.ParallelCompiler] Introduce Kernel.ParallelCompiler.pmap/2 to compile multiple additional entries in parallel
  • [Kernel.SpecialForms] Warn if True/False/Nil are used as aliases and there is no such alias
  • [Macro] Add Macro.compile_apply/4
  • [Module] Add support for @nifs annotation from Erlang/OTP 25
  • [Module] Add support for missing @dialyzer configuration
  • [String] Update to Unicode 15.1.0
  • [String] Add String.replace_invalid/2
  • [Task] Add :limit option to Task.yield_many/2
Logger
  • [Logger] Add Logger.levels/0
Mix
  • [mix] Add MIX_PROFILE to profile a list of comma separated tasks
  • [mix archive.install] Support --sparse option
  • [mix compile.app] Warn if both :applications and :extra_applications are used
  • [mix compile.elixir] Pass original exception down to diagnostic :details when possible
  • [mix compile.elixir] Optimize scenario where there are thousands of files in lib/ and one of them is changed
  • [mix deps.clean] Emit a warning instead of crashing when a dependency cannot be removed
  • [mix escript.install] Support --sparse option
  • [mix release] Include include/ directory in releases
  • [mix test] Allow testing multiple file:line at once, such as mix test test/foo_test.exs:13 test/bar_test.exs:27
2. Bug fixes
Elixir
  • [Code] Keep quotes for atom keys in formatter
  • [Code.Fragment] Fix crash in Code.Fragment.surround_context/2 when matching on ->
  • [IO] Raise when using IO.binwrite/2 on terminated device (mirroring IO.write/2)
  • [Kernel] Do not expand aliases recursively (the alias stored in Macro.Env is already expanded)
  • [Kernel] Ensure dbg module is a compile-time dependency
  • [Kernel] Warn when a private function or macro uses unquote/1 and the function/macro itself is unused
  • [Kernel] Re-enabled compiler optimizations for top level functions in scripts (disabled in v1.14.0 but shouldn't impact most programs)
  • [Kernel] Do not define an alias for nested modules starting with Elixir. in their definition
  • [Kernel.ParallelCompiler] Consider a module has been defined in @after_compile callbacks to avoid deadlocks
  • [Macro] Address exception on Macro.to_string/1 for certain ASTs
  • [Path] Lazily evaluate File.cwd!/0 in Path.expand/1 and Path.absname/1
  • [Path] Ensure Path.relative_to/2 returns a relative path when the given argument does not share a common prefix with cwd
ExUnit
  • [ExUnit] Raise on incorrectly dedented doctests
IEx
  • [IEx.Pry] Fix prying functions with only literals in their body
Mix
  • [mix archive.install] Restore code paths after mix archive.install
  • [mix compile] Ensure files with duplicate modules are recompiled whenever any of the files change
  • [mix compile] Update Mix compiler diagnostics documentation and typespecs to match the Elixir compiler behaviour where both lines and columns start from one (before it inaccurately said that columns started from zero)
  • [mix escript.install] Restore code paths after mix escript.install
3. Soft deprecations (no warnings emitted)
Elixir
  • [File] Deprecate File.stream!(file, options, line_or_bytes) in favor of keeping the options as last argument, as in File.stream!(file, line_or_bytes, options)
  • [Kernel.ParallelCompiler] Deprecate Kernel.ParallelCompiler.async/1 in favor of Kernel.ParallelCompiler.pmap/2
  • [Path] Deprecate Path.safe_relative_to/2 in favor of Path.safe_relative/2
Mix
  • [mix compile] Returning a four-element tuple as a position in Mix.Task.Compiler.Diagnostic
4. Hard deprecations
Elixir
  • [Date] Deprecate inferring a range with negative step, call Date.range/3 with a negative step instead
  • [Enum] Deprecate passing a range with negative step on Enum.slice/2, give first..last//1 instead
  • [Kernel] ~R/.../ is deprecated in favor of ~r/.../. This is because ~R/.../ still allowed escape codes, which did not fit the definition of uppercase sigils
  • [String] Deprecate passing a range with negative step on String.slice/2, give first..last//1 instead
ExUnit
  • [ExUnit.Formatter] Deprecate format_time/2, use format_times/1 instead
Mix
  • [mix compile.leex] Require :leex to be added as a compiler to run the leex compiler
  • [mix compile.yecc] Require :yecc to be added as a compiler to run the yecc compiler

v1.15.8

Compare Source

1. Bug fixes
Elixir
  • [bin/elixir] Properly handle the --dbg flag in Elixir's CLI
  • [System] Add a note that arguments are unsafe when invoking .bat/.com scripts on Windows via System.cmd/3
  • [Port] Add a note that arguments are unsafe when invoking .bat/.com scripts on Windows
  • [URI] Ensure :undefined fields are properly converted to nil when invoking Erlang's API
Logger
  • [Logger] Ensure translators are persisted across logger restarts
Mix
  • [mix compile] Ensure compile paths are accessible during compilation

v1.15.7

Compare Source

1. Enhancements
Elixir
  • [Elixir] Allow code evaluation across Elixir versions
2. Bug fixes
EEx
  • [EEx] Do not emit duplicate warnings from tokenizer
Mix
  • [mix format] Correctly match file to subdirectory in Mix.Tasks.Format.formatter_for_file/2

v1.15.6

Compare Source

This release also includes fixes to the Windows installer.

1. Bug fixes
EEx
  • [EEx] Do not crash when printing tokenizer warnings
Elixir
  • [Code] Fix formatter for nested * in bitstrings
  • [Code] Improve feedback when an invalid block is given Code.quoted_to_algebra/2
  • [Kernel] Trace functions before they are inlined
Mix
  • [mix compile] Ensure :extra_applications declare in umbrella projects are loaded
  • [mix deps.get] Do not check for invalid applications before deps.get
  • [mix deps.update] Do not check for invalid applications before deps.update
  • [mix format] Load plugins when invoking the formatter from an IDE

v1.15.5

Compare Source

1. Enhancements
IEx
  • [IEx.Autocomplete] Speed up loading of struct suggestions
2. Bug fixes
Elixir
  • [Code.Fragment] Fix Code.Fragment.surround_context/2 for aliases and submodules of non-aliases
  • [Kernel] Ensure stacktrace is included when necessary when rescuing multiple exceptions in the same branch
  • [Kernel] Fix index in error message for unused optional arguments
ExUnit
  • [ExUnit.Diff] Fix scenario where diff would not show up due to a timed-out loop
IEx
  • [IEx] Force group leader to run as a binary and unicode in IEx
Mix
  • [mix compile] Do not assume blake is always available
  • [mix format] Load and compile plugins if specified in subdirectories

v1.15.4

Compare Source

1. Bug fixes
Mix
  • [mix archive.build] Disable protocol consolidation when building archiveson archive.install
  • [mix compile] Track removed files per local dependency (this addresses a bug where files depending on modules from path dependencies always recompiled)
  • [mix release] Do not strip relevant chunks from Erlang/OTP 26

v1.15.3

Compare Source

1. Enhancements
Elixir
  • [Kernel] Improve better stacktraces when executing unnested Elixir code in a file
Mix
  • [Mix] Allow to opt out of starting apps in Mix.install/2
2. Bug fixes
Elixir
  • [Code] Ensure with_diagnostics propagate warnings from inner Erlang passes
IEx
  • [IEx] Fix --remsh on Erlang/OTP 25 and earlier
Mix
  • [mix compile.elixir] Ensure __mix_recompile__? callbacks are properly invoked

v1.15.2

Compare Source

1. Bug fixes
IEx
  • [IEx] Fix CLI being unable to boot on Windows
erlang/otp (erlang)

v26.2.5: OTP 26.

Note

PR body was truncated to here.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate.

@wttj-bot wttj-bot Bot requested a review from a team as a code owner July 2, 2026 16:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants