diff --git a/config/config.exs b/config/config.exs index 4cdf8f8..1cf8a1d 100644 --- a/config/config.exs +++ b/config/config.exs @@ -2,9 +2,6 @@ import Config config :nodelix, version: "20.10.0", - npm: [ - args: ["_build/dev/nodejs/versions/20.10.0/bin/npm"] - ], - another: [ + test_profile: [ args: ["--version"] ] diff --git a/lib/mix/tasks/nodelix.ex b/lib/mix/tasks/nodelix.ex index c5e8312..d9a048f 100644 --- a/lib/mix/tasks/nodelix.ex +++ b/lib/mix/tasks/nodelix.ex @@ -38,6 +38,7 @@ defmodule Mix.Tasks.Nodelix do @dialyzer {:no_missing_calls, run: 1} @impl Mix.Task + @spec run([String.t()]) :: :ok def run(args) do switches = [profile: :string, runtime_config: :boolean] diff --git a/lib/mix/tasks/nodelix.install.ex b/lib/mix/tasks/nodelix.install.ex index 8e8ce3e..3b0efc0 100644 --- a/lib/mix/tasks/nodelix.install.ex +++ b/lib/mix/tasks/nodelix.install.ex @@ -12,7 +12,7 @@ defmodule Mix.Tasks.Nodelix.Install do > API _should not_ be considered stable, and using a pinned version is _recommended_. $ mix nodelix.install - $ mix nodelix.install --if-missing + $ mix nodelix.install --force By default, it installs #{VersionManager.latest_lts_version()} but you can configure it in your config files, such as: @@ -24,8 +24,7 @@ defmodule Mix.Tasks.Nodelix.Install do - `--runtime-config` - load the runtime configuration before executing command - - `--if-missing` - install only if the given version - does not exist + - `--force` - install even if the given version is already present """ @shortdoc "Installs Node.js" @@ -33,8 +32,9 @@ defmodule Mix.Tasks.Nodelix.Install do @dialyzer {:no_missing_calls, run: 1} @impl Mix.Task + @spec run([String.t()]) :: :ok def run(args) do - valid_options = [runtime_config: :boolean, if_missing: :boolean, assets: :boolean] + valid_options = [runtime_config: :boolean, force: :boolean, assets: :boolean] {opts, archive_base_url} = case OptionParser.parse_head!(args, strict: valid_options) do @@ -51,7 +51,7 @@ defmodule Mix.Tasks.Nodelix.Install do mix nodelix.install mix nodelix.install 'https://nodejs.org/dist/v$version/node-v$version-$target.$ext' mix nodelix.install --runtime-config - mix nodelix.install --if-missing + mix nodelix.install --force """) end @@ -59,7 +59,7 @@ defmodule Mix.Tasks.Nodelix.Install do configured_version = Nodelix.configured_version() - if opts[:if_missing] && VersionManager.is_installed?(configured_version) do + if VersionManager.is_installed?(configured_version) and !opts[:force] do :ok else if function_exported?(Mix, :ensure_application!, 1) do diff --git a/lib/mix/tasks/nodelix.npm.ex b/lib/mix/tasks/nodelix.npm.ex index ee302fb..85f4488 100644 --- a/lib/mix/tasks/nodelix.npm.ex +++ b/lib/mix/tasks/nodelix.npm.ex @@ -25,9 +25,9 @@ defmodule Mix.Tasks.Nodelix.Npm do alias Nodelix.VersionManager @shortdoc "Invokes npm with the provided arguments" - @dialyzer {:no_missing_calls, run: 1} @impl Mix.Task + @spec run([String.t()]) :: :ok def run(args) do npm_path = VersionManager.bin_path(:npm, Nodelix.configured_version()) diff --git a/test/nodelix_test.exs b/test/nodelix_test.exs index d5f7d76..eb24f2c 100644 --- a/test/nodelix_test.exs +++ b/test/nodelix_test.exs @@ -15,33 +15,37 @@ defmodule NodelixTest do test "run without profile" do assert ExUnit.CaptureIO.capture_io(fn -> - assert Mix.Task.run("nodelix", ["--version"]) == :ok + assert Mix.Task.rerun("nodelix", ["--version"]) == :ok end) =~ @version end test "run on another profile" do assert ExUnit.CaptureIO.capture_io(fn -> - assert Mix.Task.run("nodelix", ["--profile", "another", "--version"]) == :ok + assert Mix.Task.rerun("nodelix", ["--profile", "test_profile"]) == :ok end) =~ @version end - test "updates on install" do - Application.put_env(:nodelix, :version, "20.9.0") - Mix.Task.rerun("nodelix.install", ["--if-missing"]) + test "installs and runs multiple versions" do + Application.put_env(:nodelix, :version, "18.18.2") + Mix.Task.rerun("nodelix.install") assert ExUnit.CaptureIO.capture_io(fn -> - assert Mix.Task.run("nodelix", ["--version"]) == :ok - end) =~ "20.9.0" + assert Mix.Task.rerun("nodelix", ["--version"]) == :ok + end) =~ "18.18.2" - Application.delete_env(:nodelix, :version) - - Mix.Task.rerun("nodelix.install", ["--if-missing"]) + Application.put_env(:nodelix, :version, @version) assert ExUnit.CaptureIO.capture_io(fn -> - assert Mix.Task.run("nodelix", ["--version"]) == :ok + assert Mix.Task.rerun("nodelix", ["--version"]) == :ok end) =~ @version end + test "re-installs with force flag" do + assert ExUnit.CaptureLog.capture_log(fn -> + assert Mix.Task.rerun("nodelix.install", ["--force"]) == :ok + end) =~ "Succesfully installed Node.js v#{@version}" + end + test "installs with custom URL" do assert :ok = Mix.Task.rerun("nodelix.install", [