From c0ef2038e7ac6466c5e7974f03b72ad35fcf3562 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Tue, 27 May 2025 14:49:24 +0100 Subject: [PATCH] Add tasks to update esbuild version --- lib/mix/tasks/esbuild/check_version.ex | 28 ++++++++++++++++++++++++ lib/mix/tasks/esbuild/release.ex | 27 +++++++++++++++++++++++ lib/mix/tasks/esbuild/update_version.ex | 29 +++++++++++++++++++++++++ mise.toml | 20 ++++++++++++++++- 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 lib/mix/tasks/esbuild/check_version.ex create mode 100644 lib/mix/tasks/esbuild/release.ex create mode 100644 lib/mix/tasks/esbuild/update_version.ex diff --git a/lib/mix/tasks/esbuild/check_version.ex b/lib/mix/tasks/esbuild/check_version.ex new file mode 100644 index 00000000..452e7d6d --- /dev/null +++ b/lib/mix/tasks/esbuild/check_version.ex @@ -0,0 +1,28 @@ +defmodule Mix.Tasks.Esbuild.CheckVersion do + use Mix.Task + + @shortdoc "Checks the the current Esbuild version is the latest" + @moduledoc """ + Checks the the current esbuild version is the latest. + + Exits with 0 if versions match, 1 if the esbuild needs to be updated. + """ + + alias Mix.Tasks.Esbuild.Release + + @impl Mix.Task + def run(_args) do + current_version = Release.fetch_current_version() + latest_version = Release.fetch_latest_version!() + + if current_version !== latest_version do + Mix.Shell.IO.info( + "A new esbuild version is available: #{current_version} ==> #{latest_version}" + ) + + System.halt(1) + else + Mix.Shell.IO.info("The esbuild version is up to date (#{current_version})") + end + end +end diff --git a/lib/mix/tasks/esbuild/release.ex b/lib/mix/tasks/esbuild/release.ex new file mode 100644 index 00000000..7fe3b67b --- /dev/null +++ b/lib/mix/tasks/esbuild/release.ex @@ -0,0 +1,27 @@ +defmodule Mix.Tasks.Esbuild.Release do + @latest_version_url "https://api.github.com/repos/evanw/esbuild/releases/latest" + + def fetch_latest_version! do + Application.ensure_all_started(:req) + + Req.get!(@latest_version_url).body["tag_name"] + |> String.replace_prefix("v", "") + end + + def fetch_current_version do + Application.get_env(:esbuild, :version) + end + + def update_config_file!(config_file, current_version, latest_version) do + config_contents = File.read!(config_file) + + new_config_contents = + String.replace( + config_contents, + ~s(version: "#{current_version}"), + "version: \"#{latest_version}\"" + ) + + File.write!(config_file, new_config_contents) + end +end diff --git a/lib/mix/tasks/esbuild/update_version.ex b/lib/mix/tasks/esbuild/update_version.ex new file mode 100644 index 00000000..dc4ab124 --- /dev/null +++ b/lib/mix/tasks/esbuild/update_version.ex @@ -0,0 +1,29 @@ +defmodule Mix.Tasks.Esbuild.UpdateVersion do + use Mix.Task + + @shortdoc "Update the configured esbuild versino to latest." + @moduledoc """ + Update the configured esbuild versino to latest. + """ + + alias Mix.Tasks.Esbuild.Release + + @impl Mix.Task + def run(_args) do + current_version = Release.fetch_current_version() + latest_version = Release.fetch_latest_version!() + + if current_version !== latest_version do + Mix.Shell.IO.info( + "Updating esbuild configuration from #{current_version} to #{latest_version}" + ) + + config_file = + Path.expand("config/config.exs", File.cwd!()) + + Release.update_config_file!(config_file, current_version, latest_version) + else + Mix.Shell.IO.info("esbuild configuration is up to date (#{current_version})") + end + end +end diff --git a/mise.toml b/mise.toml index bab12fe5..f6873fed 100644 --- a/mise.toml +++ b/mise.toml @@ -42,6 +42,18 @@ description = 'Checks that the Tailwind version is up to date' run = 'mix tailwind.check_version' hide = true +# ESBUILD DEP + +[tasks.esbuild-update] +description = 'Update the esbuild version configured in the project' +run = 'mix esbuild.update_version' +hide = true + +[tasks.esbuild-outdated] +description = 'Checks that the esbuild version is up to date' +run = 'mix esbuild.check_version' +hide = true + # MIX DEPS [tasks.mix-update] @@ -71,13 +83,19 @@ hide = true # DEPENDENCIES [tasks."deps:outdated"] -depends = ['npm-outdated', 'tailwind-outdated', 'mix-outdated'] +depends = [ + 'npm-outdated', + 'tailwind-outdated', + 'esbuild-outdated', + 'mix-outdated', +] description = 'Show outdated dependencies' [tasks."deps:update"] depends = [ 'npm-update', 'tailwind-update', + 'esbuild-update', 'mix-update', 'gh-markdown-preview-extension-update', ]